????

Your IP : 3.138.141.138


Current Path : C:/Program Files/Google/Drive File Stream/107.0.3.0/html/
Upload File :
Current File : C:/Program Files/Google/Drive File Stream/107.0.3.0/html/material.min.js.map

{"version":3,"sources":["material.js","mdlComponentHandler.js","tabs.js","layout.js","rAF.js","button.js","checkbox.js","icon-toggle.js","menu.js","progress.js","radio.js","slider.js","snackbar.js","spinner.js","switch.js","textfield.js","tooltip.js","data-table.js","ripple.js"],"names":["MaterialTab","tab","ctx","element_","classList","contains","CssClasses_","MDL_JS_RIPPLE_EFFECT","rippleContainer","document","createElement","add","MDL_RIPPLE_CONTAINER","ripple","MDL_RIPPLE","appendChild","addEventListener","e","preventDefault","href","split","panel","querySelector","resetTabState_","resetPanelState_","ACTIVE_CLASS","MaterialLayoutTab","tabs","panels","layout","selectTab","content_","IS_ACTIVE","tabBar_","JS_RIPPLE_EFFECT","RIPPLE_CONTAINER","RIPPLE","getAttribute","charAt","show","componentHandler","upgradeDom","optJsClass","optCssClass","upgradeElement","element","upgradeElements","elements","upgradeAllRegistered","registerUpgradedCallback","jsClass","callback","register","config","downgradeElements","nodes","findRegisteredClass_","name","optReplace","i","registeredComponents_","length","className","getUpgradedListOfElement_","dataUpgraded","isElementUpgraded_","upgradedList","indexOf","upgradeDomInternal","cssClass","registeredClass","querySelectorAll","n","upgradeElementInternal","Element","Error","classesToUpgrade","push","forEach","component","setAttribute","join","instance","classConstructor","componentConfigProperty_","createdComponents_","j","m","callbacks","widget","ev","window","CustomEvent","Event","bubbles","cancelable","createEvent","initEvent","dispatchEvent","upgradeElementsInternal","Array","isArray","item","prototype","slice","call","HTMLElement","children","registerInternal","widgetMissing","newConfig","constructor","classAsString","hasOwnProperty","found","registerUpgradedCallbackInternal","regClass","upgradeAllRegisteredInternal","deconstructComponentInternal","componentIndex","splice","upgrades","componentPlace","downgradeNodesInternal","downgradeNode","node","filter","NodeList","Node","ComponentConfigPublic","ComponentConfig","Component","documentElement","Date","now","getTime","vendors","requestAnimationFrame","vp","cancelAnimationFrame","test","navigator","userAgent","lastTime","nextTime","Math","max","setTimeout","clearTimeout","MaterialButton","this","init","Constant_","RIPPLE_EFFECT","blurHandler_","event","blur","disable","disabled","enable","rippleElement_","boundRippleBlurHandler","bind","boundButtonBlurHandler","MaterialCheckbox","TINY_TIMEOUT","INPUT","BOX_OUTLINE","FOCUS_HELPER","TICK_OUTLINE","RIPPLE_IGNORE_EVENTS","RIPPLE_CENTER","IS_FOCUSED","IS_DISABLED","IS_CHECKED","IS_UPGRADED","onChange_","updateClasses_","onFocus_","onBlur_","remove","onMouseUp_","blur_","checkDisabled","checkToggleState","inputElement_","checked","check","uncheck","boxOutline","tickContainer","tickOutline","rippleContainerElement_","boundRippleMouseUp","boundInputOnChange","boundInputOnFocus","boundInputOnBlur","boundElementMouseUp","MaterialIconToggle","boundElementOnMouseUp","MaterialMenu","TRANSITION_DURATION_SECONDS","TRANSITION_DURATION_FRACTION","CLOSE_TIMEOUT","Keycodes_","ENTER","ESCAPE","SPACE","UP_ARROW","DOWN_ARROW","CONTAINER","OUTLINE","ITEM","ITEM_RIPPLE_CONTAINER","IS_VISIBLE","IS_ANIMATING","BOTTOM_LEFT","BOTTOM_RIGHT","TOP_LEFT","TOP_RIGHT","UNALIGNED","container","parentElement","insertBefore","removeChild","container_","outline","outline_","forElId","forEl","getElementById","forElement_","handleForClick_","handleForKeyboardEvent_","items","boundItemKeydown_","handleItemKeyboardEvent_","boundItemClick_","handleItemClick_","tabIndex","evt","rect","getBoundingClientRect","forRect","style","right","top","offsetTop","offsetHeight","left","offsetLeft","bottom","toggle","keyCode","focus","currentIndex","target","MouseEvent","click","hide","hasAttribute","stopPropagation","closing_","applyClip_","height","width","clip","removeAnimationEndListener_","addAnimationEndListener_","transitionDuration","itemDelay","transitionDelay","parentNode","removeEventListener","removeProperty","MaterialProgress","INDETERMINATE_CLASS","setProgress","p","progressbar_","setBuffer","bufferbar_","auxbar_","el","MaterialRadio","JS_RADIO","RADIO_BTN","RADIO_OUTER_CIRCLE","RADIO_INNER_CIRCLE","radios","getElementsByClassName","button","btnElement_","onMouseup_","boundChangeHandler_","boundFocusHandler_","boundBlurHandler_","boundMouseUpHandler_","outerCircle","innerCircle","MaterialSlider","isIE_","msPointerEnabled","IE_CONTAINER","SLIDER_CONTAINER","BACKGROUND_FLEX","BACKGROUND_LOWER","BACKGROUND_UPPER","IS_LOWEST_VALUE","onInput_","updateValueStyles_","onContainerMouseDown_","newEvent","buttons","clientX","clientY","y","fraction","value","min","backgroundLower_","flex","webkitFlex","backgroundUpper_","change","containerIE","backgroundFlex","boundInputHandler","boundChangeHandler","boundMouseUpHandler","boundContainerMouseDownHandler","MaterialSnackbar","textElement_","cssClasses_","MESSAGE","actionElement_","ACTION","active","actionHandler_","undefined","message_","actionText_","queuedNotifications_","setActionHidden_","ANIMATION_LENGTH","SNACKBAR","ACTIVE","displaySnackbar_","textContent","cleanup_","timeout_","showSnackbar","data","checkQueue_","shift","Boolean","removeAttribute","MaterialSpinner","MDL_SPINNER_LAYER_COUNT","MDL_SPINNER_LAYER","MDL_SPINNER_CIRCLE_CLIPPER","MDL_SPINNER_CIRCLE","MDL_SPINNER_GAP_PATCH","MDL_SPINNER_LEFT","MDL_SPINNER_RIGHT","createLayer","index","layer","leftClipper","gapPatch","rightClipper","circleOwners","circle","stop","start","MaterialSwitch","TRACK","THUMB","on","off","track","thumb","focusHelper","boundFocusHandler","boundBlurHandler","MaterialTabs","TAB_CLASS","PANEL_CLASS","UPGRADED_CLASS","MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS","initTabs_","tabs_","panels_","k","MaterialTextfield","maxRows","NO_MAX_ROWS","MAX_ROWS_ATTRIBUTE","LABEL","IS_DIRTY","IS_INVALID","HAS_PLACEHOLDER","onKeyDown_","currentRowCount","onReset_","checkValidity","checkDirty","checkFocus","input_","validity","valid","label_","parseInt","isNaN","boundUpdateClassesHandler","boundResetHandler","boundKeyDownHandler","invalid","MaterialTooltip","BOTTOM","LEFT","RIGHT","TOP","handleMouseEnter_","props","marginLeft","offsetWidth","marginTop","handleMouseLeave_","boundMouseEnterHandler","boundMouseLeaveHandler","MaterialLayout","MAX_WIDTH","TAB_SCROLL_PIXELS","RESIZE_TIMEOUT","MENU_ICON","CHEVRON_LEFT","CHEVRON_RIGHT","Mode_","STANDARD","SEAMED","WATERFALL","SCROLL","HEADER","DRAWER","CONTENT","DRAWER_BTN","ICON","HEADER_SEAMED","HEADER_WATERFALL","HEADER_SCROLL","FIXED_HEADER","OBFUSCATOR","TAB_BAR","TAB_CONTAINER","TAB","TAB_BAR_BUTTON","TAB_BAR_LEFT_BUTTON","TAB_BAR_RIGHT_BUTTON","PANEL","HAS_DRAWER","HAS_TABS","HAS_SCROLLING_HEADER","CASTING_SHADOW","IS_COMPACT","IS_SMALL_SCREEN","IS_DRAWER_OPEN","ON_LARGE_SCREEN","ON_SMALL_SCREEN","contentScrollHandler_","header_","headerVisible","scrollTop","keyboardEventHandler_","drawer_","toggleDrawer","screenSizeHandler_","screenSizeMediaQuery_","matches","obfuscator_","drawerToggleHandler_","type","headerTransitionEndHandler_","headerClickHandler_","tabBar","drawerButton","focusedElement","directChildren","childNodes","numChildren","c","child","persisted","overflowY","mode","drawerButtonIcon","innerHTML","firstChild","obfuscator","matchMedia","addListener","tabContainer","leftButton","leftButtonIcon","scrollLeft","rightButton","rightButtonIcon","tabUpdateHandler","scrollWidth","windowResizeHandler","resizeTimeoutId_","MaterialDataTable","DATA_TABLE","SELECTABLE","SELECT_ELEMENT","IS_SELECTED","selectRow_","checkbox","row","opt_rows","createCheckbox_","label","labelClasses","firstHeader","bodyRows","footRows","rows","concat","th","headerCheckbox","firstCell","td","nodeName","toUpperCase","rowCheckbox","MaterialRipple","INITIAL_SCALE","INITIAL_SIZE","INITIAL_OPACITY","FINAL_OPACITY","FINAL_SCALE","RIPPLE_EFFECT_IGNORE_EVENTS","downHandler_","boundHeight","boundWidth","rippleSize_","sqrt","ignoringMouseDown_","frameCount","getFrameCount","setFrameCount","x","bound","currentTarget","round","touches","setRippleXY","setRippleStyles","animFrameHandler","upHandler_","detail","recentering","frameCount_","x_","y_","boundDownHandler","boundUpHandler","fC","getRippleElement","newX","newY","transformString","scale","size","offset","webkitTransform","msTransform","transform"],"mappings":"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","file":"material.min.js","sourcesContent":[";(function() {\n\"use strict\";\n\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 * A component handler interface using the revealing module design pattern.\n * More details on this design pattern here:\n * https://github.com/jasonmayes/mdl-component-design-pattern\n *\n * @author Jason Mayes.\n */\n/* exported componentHandler */\n\n// Pre-defining the componentHandler interface, for closure documentation and\n// static verification.\nvar componentHandler = {\n  /**\n   * Searches existing DOM for elements of our component type and upgrades them\n   * if they have not already been upgraded.\n   *\n   * @param {string=} optJsClass the programatic name of the element class we\n   * need to create a new instance of.\n   * @param {string=} optCssClass the name of the CSS class elements of this\n   * type will have.\n   */\n  upgradeDom: function(optJsClass, optCssClass) {},\n  /**\n   * Upgrades a specific element rather than all in the DOM.\n   *\n   * @param {!Element} element The element we wish to upgrade.\n   * @param {string=} optJsClass Optional name of the class we want to upgrade\n   * the element to.\n   */\n  upgradeElement: function(element, optJsClass) {},\n  /**\n   * Upgrades a specific list of elements rather than all in the DOM.\n   *\n   * @param {!Element|!Array<!Element>|!NodeList|!HTMLCollection} elements\n   * The elements we wish to upgrade.\n   */\n  upgradeElements: function(elements) {},\n  /**\n   * Upgrades all registered components found in the current DOM. This is\n   * automatically called on window load.\n   */\n  upgradeAllRegistered: function() {},\n  /**\n   * Allows user to be alerted to any upgrades that are performed for a given\n   * component type\n   *\n   * @param {string} jsClass The class name of the MDL component we wish\n   * to hook into for any upgrades performed.\n   * @param {function(!HTMLElement)} callback The function to call upon an\n   * upgrade. This function should expect 1 parameter - the HTMLElement which\n   * got upgraded.\n   */\n  registerUpgradedCallback: function(jsClass, callback) {},\n  /**\n   * Registers a class for future use and attempts to upgrade existing DOM.\n   *\n   * @param {componentHandler.ComponentConfigPublic} config the registration configuration\n   */\n  register: function(config) {},\n  /**\n   * Downgrade either a given node, an array of nodes, or a NodeList.\n   *\n   * @param {!Node|!Array<!Node>|!NodeList} nodes\n   */\n  downgradeElements: function(nodes) {}\n};\n\ncomponentHandler = (function() {\n  'use strict';\n\n  /** @type {!Array<componentHandler.ComponentConfig>} */\n  var registeredComponents_ = [];\n\n  /** @type {!Array<componentHandler.Component>} */\n  var createdComponents_ = [];\n\n  var componentConfigProperty_ = 'mdlComponentConfigInternal_';\n\n  /**\n   * Searches registered components for a class we are interested in using.\n   * Optionally replaces a match with passed object if specified.\n   *\n   * @param {string} name The name of a class we want to use.\n   * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.\n   * @return {!Object|boolean}\n   * @private\n   */\n  function findRegisteredClass_(name, optReplace) {\n    for (var i = 0; i < registeredComponents_.length; i++) {\n      if (registeredComponents_[i].className === name) {\n        if (typeof optReplace !== 'undefined') {\n          registeredComponents_[i] = optReplace;\n        }\n        return registeredComponents_[i];\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Returns an array of the classNames of the upgraded classes on the element.\n   *\n   * @param {!Element} element The element to fetch data from.\n   * @return {!Array<string>}\n   * @private\n   */\n  function getUpgradedListOfElement_(element) {\n    var dataUpgraded = element.getAttribute('data-upgraded');\n    // Use `['']` as default value to conform the `,name,name...` style.\n    return dataUpgraded === null ? [''] : dataUpgraded.split(',');\n  }\n\n  /**\n   * Returns true if the given element has already been upgraded for the given\n   * class.\n   *\n   * @param {!Element} element The element we want to check.\n   * @param {string} jsClass The class to check for.\n   * @returns {boolean}\n   * @private\n   */\n  function isElementUpgraded_(element, jsClass) {\n    var upgradedList = getUpgradedListOfElement_(element);\n    return upgradedList.indexOf(jsClass) !== -1;\n  }\n\n  /**\n   * Searches existing DOM for elements of our component type and upgrades them\n   * if they have not already been upgraded.\n   *\n   * @param {string=} optJsClass the programatic name of the element class we\n   * need to create a new instance of.\n   * @param {string=} optCssClass the name of the CSS class elements of this\n   * type will have.\n   */\n  function upgradeDomInternal(optJsClass, optCssClass) {\n    if (typeof optJsClass === 'undefined' &&\n        typeof optCssClass === 'undefined') {\n      for (var i = 0; i < registeredComponents_.length; i++) {\n        upgradeDomInternal(registeredComponents_[i].className,\n            registeredComponents_[i].cssClass);\n      }\n    } else {\n      var jsClass = /** @type {string} */ (optJsClass);\n      if (typeof optCssClass === 'undefined') {\n        var registeredClass = findRegisteredClass_(jsClass);\n        if (registeredClass) {\n          optCssClass = registeredClass.cssClass;\n        }\n      }\n\n      var elements = document.querySelectorAll('.' + optCssClass);\n      for (var n = 0; n < elements.length; n++) {\n        upgradeElementInternal(elements[n], jsClass);\n      }\n    }\n  }\n\n  /**\n   * Upgrades a specific element rather than all in the DOM.\n   *\n   * @param {!Element} element The element we wish to upgrade.\n   * @param {string=} optJsClass Optional name of the class we want to upgrade\n   * the element to.\n   */\n  function upgradeElementInternal(element, optJsClass) {\n    // Verify argument type.\n    if (!(typeof element === 'object' && element instanceof Element)) {\n      throw new Error('Invalid argument provided to upgrade MDL element.');\n    }\n    var upgradedList = getUpgradedListOfElement_(element);\n    var classesToUpgrade = [];\n    // If jsClass is not provided scan the registered components to find the\n    // ones matching the element's CSS classList.\n    if (!optJsClass) {\n      var classList = element.classList;\n      registeredComponents_.forEach(function(component) {\n        // Match CSS & Not to be upgraded & Not upgraded.\n        if (classList.contains(component.cssClass) &&\n            classesToUpgrade.indexOf(component) === -1 &&\n            !isElementUpgraded_(element, component.className)) {\n          classesToUpgrade.push(component);\n        }\n      });\n    } else if (!isElementUpgraded_(element, optJsClass)) {\n      classesToUpgrade.push(findRegisteredClass_(optJsClass));\n    }\n\n    // Upgrade the element for each classes.\n    for (var i = 0, n = classesToUpgrade.length, registeredClass; i < n; i++) {\n      registeredClass = classesToUpgrade[i];\n      if (registeredClass) {\n        // Mark element as upgraded.\n        upgradedList.push(registeredClass.className);\n        element.setAttribute('data-upgraded', upgradedList.join(','));\n        var instance = new registeredClass.classConstructor(element);\n        instance[componentConfigProperty_] = registeredClass;\n        createdComponents_.push(instance);\n        // Call any callbacks the user has registered with this component type.\n        for (var j = 0, m = registeredClass.callbacks.length; j < m; j++) {\n          registeredClass.callbacks[j](element);\n        }\n\n        if (registeredClass.widget) {\n          // Assign per element instance for control over API\n          element[registeredClass.className] = instance;\n        }\n      } else {\n        throw new Error(\n          'Unable to find a registered component for the given class.');\n      }\n\n      var ev;\n      if ('CustomEvent' in window && typeof window.CustomEvent === 'function') {\n        ev = new Event('mdl-componentupgraded', {\n          'bubbles': true, 'cancelable': false\n        });\n      } else {\n        ev = document.createEvent('Events');\n        ev.initEvent('mdl-componentupgraded', true, true);\n      }\n      element.dispatchEvent(ev);\n    }\n  }\n\n  /**\n   * Upgrades a specific list of elements rather than all in the DOM.\n   *\n   * @param {!Element|!Array<!Element>|!NodeList|!HTMLCollection} elements\n   * The elements we wish to upgrade.\n   */\n  function upgradeElementsInternal(elements) {\n    if (!Array.isArray(elements)) {\n      if (typeof elements.item === 'function') {\n        elements = Array.prototype.slice.call(/** @type {Array} */ (elements));\n      } else {\n        elements = [elements];\n      }\n    }\n    for (var i = 0, n = elements.length, element; i < n; i++) {\n      element = elements[i];\n      if (element instanceof HTMLElement) {\n        upgradeElementInternal(element);\n        if (element.children.length > 0) {\n          upgradeElementsInternal(element.children);\n        }\n      }\n    }\n  }\n\n  /**\n   * Registers a class for future use and attempts to upgrade existing DOM.\n   *\n   * @param {componentHandler.ComponentConfigPublic} config\n   */\n  function registerInternal(config) {\n    // In order to support both Closure-compiled and uncompiled code accessing\n    // this method, we need to allow for both the dot and array syntax for\n    // property access. You'll therefore see the `foo.bar || foo['bar']`\n    // pattern repeated across this method.\n    var widgetMissing = (typeof config.widget === 'undefined' &&\n        typeof config['widget'] === 'undefined');\n    var widget = true;\n\n    if (!widgetMissing) {\n      widget = config.widget || config['widget'];\n    }\n\n    var newConfig = /** @type {componentHandler.ComponentConfig} */ ({\n      classConstructor: config.constructor || config['constructor'],\n      className: config.classAsString || config['classAsString'],\n      cssClass: config.cssClass || config['cssClass'],\n      widget: widget,\n      callbacks: []\n    });\n\n    registeredComponents_.forEach(function(item) {\n      if (item.cssClass === newConfig.cssClass) {\n        throw new Error('The provided cssClass has already been registered: ' + item.cssClass);\n      }\n      if (item.className === newConfig.className) {\n        throw new Error('The provided className has already been registered');\n      }\n    });\n\n    if (config.constructor.prototype\n        .hasOwnProperty(componentConfigProperty_)) {\n      throw new Error(\n          'MDL component classes must not have ' + componentConfigProperty_ +\n          ' defined as a property.');\n    }\n\n    var found = findRegisteredClass_(config.classAsString, newConfig);\n\n    if (!found) {\n      registeredComponents_.push(newConfig);\n    }\n  }\n\n  /**\n   * Allows user to be alerted to any upgrades that are performed for a given\n   * component type\n   *\n   * @param {string} jsClass The class name of the MDL component we wish\n   * to hook into for any upgrades performed.\n   * @param {function(!HTMLElement)} callback The function to call upon an\n   * upgrade. This function should expect 1 parameter - the HTMLElement which\n   * got upgraded.\n   */\n  function registerUpgradedCallbackInternal(jsClass, callback) {\n    var regClass = findRegisteredClass_(jsClass);\n    if (regClass) {\n      regClass.callbacks.push(callback);\n    }\n  }\n\n  /**\n   * Upgrades all registered components found in the current DOM. This is\n   * automatically called on window load.\n   */\n  function upgradeAllRegisteredInternal() {\n    for (var n = 0; n < registeredComponents_.length; n++) {\n      upgradeDomInternal(registeredComponents_[n].className);\n    }\n  }\n\n  /**\n   * Check the component for the downgrade method.\n   * Execute if found.\n   * Remove component from createdComponents list.\n   *\n   * @param {?componentHandler.Component} component\n   */\n  function deconstructComponentInternal(component) {\n    if (component) {\n      var componentIndex = createdComponents_.indexOf(component);\n      createdComponents_.splice(componentIndex, 1);\n\n      var upgrades = component.element_.getAttribute('data-upgraded').split(',');\n      var componentPlace = upgrades.indexOf(component[componentConfigProperty_].classAsString);\n      upgrades.splice(componentPlace, 1);\n      component.element_.setAttribute('data-upgraded', upgrades.join(','));\n\n      var ev;\n      if ('CustomEvent' in window && typeof window.CustomEvent === 'function') {\n        ev = new Event('mdl-componentdowngraded', {\n          'bubbles': true, 'cancelable': false\n        });\n      } else {\n        ev = document.createEvent('Events');\n        ev.initEvent('mdl-componentdowngraded', true, true);\n      }\n    }\n  }\n\n  /**\n   * Downgrade either a given node, an array of nodes, or a NodeList.\n   *\n   * @param {!Node|!Array<!Node>|!NodeList} nodes\n   */\n  function downgradeNodesInternal(nodes) {\n    /**\n     * Auxiliary function to downgrade a single node.\n     * @param  {!Node} node the node to be downgraded\n     */\n    var downgradeNode = function(node) {\n      createdComponents_.filter(function(item) {\n        return item.element_ === node;\n      }).forEach(deconstructComponentInternal);\n    };\n    if (nodes instanceof Array || nodes instanceof NodeList) {\n      for (var n = 0; n < nodes.length; n++) {\n        downgradeNode(nodes[n]);\n      }\n    } else if (nodes instanceof Node) {\n      downgradeNode(nodes);\n    } else {\n      throw new Error('Invalid argument provided to downgrade MDL nodes.');\n    }\n  }\n\n  // Now return the functions that should be made public with their publicly\n  // facing names...\n  return {\n    upgradeDom: upgradeDomInternal,\n    upgradeElement: upgradeElementInternal,\n    upgradeElements: upgradeElementsInternal,\n    upgradeAllRegistered: upgradeAllRegisteredInternal,\n    registerUpgradedCallback: registerUpgradedCallbackInternal,\n    register: registerInternal,\n    downgradeElements: downgradeNodesInternal\n  };\n})();\n\n/**\n * Describes the type of a registered component type managed by\n * componentHandler. Provided for benefit of the Closure compiler.\n *\n * @typedef {{\n *   constructor: Function,\n *   classAsString: string,\n *   cssClass: string,\n *   widget: (string|boolean|undefined)\n * }}\n */\ncomponentHandler.ComponentConfigPublic;  // jshint ignore:line\n\n/**\n * Describes the type of a registered component type managed by\n * componentHandler. Provided for benefit of the Closure compiler.\n *\n * @typedef {{\n *   constructor: !Function,\n *   className: string,\n *   cssClass: string,\n *   widget: (string|boolean),\n *   callbacks: !Array<function(!HTMLElement)>\n * }}\n */\ncomponentHandler.ComponentConfig;  // jshint ignore:line\n\n/**\n * Created component (i.e., upgraded element) type as managed by\n * componentHandler. Provided for benefit of the Closure compiler.\n *\n * @typedef {{\n *   element_: !HTMLElement,\n *   className: string,\n *   classAsString: string,\n *   cssClass: string,\n *   widget: string\n * }}\n */\ncomponentHandler.Component;  // jshint ignore:line\n\n// Export all symbols, for the benefit of Closure compiler.\n// No effect on uncompiled code.\ncomponentHandler['upgradeDom'] = componentHandler.upgradeDom;\ncomponentHandler['upgradeElement'] = componentHandler.upgradeElement;\ncomponentHandler['upgradeElements'] = componentHandler.upgradeElements;\ncomponentHandler['upgradeAllRegistered'] =\n    componentHandler.upgradeAllRegistered;\ncomponentHandler['registerUpgradedCallback'] =\n    componentHandler.registerUpgradedCallback;\ncomponentHandler['register'] = componentHandler.register;\ncomponentHandler['downgradeElements'] = componentHandler.downgradeElements;\nwindow.componentHandler = componentHandler;\nwindow['componentHandler'] = componentHandler;\n\nwindow.addEventListener('load', function() {\n  'use strict';\n\n  /**\n   * Performs a \"Cutting the mustard\" test. If the browser supports the features\n   * tested, adds a mdl-js class to the <html> element. It then upgrades all MDL\n   * components requiring JavaScript.\n   */\n  if ('classList' in document.createElement('div') &&\n      'querySelector' in document &&\n      'addEventListener' in window && Array.prototype.forEach) {\n    document.documentElement.classList.add('mdl-js');\n    componentHandler.upgradeAllRegistered();\n  } else {\n    /**\n     * Dummy function to avoid JS errors.\n     */\n    componentHandler.upgradeElement = function() {};\n    /**\n     * Dummy function to avoid JS errors.\n     */\n    componentHandler.register = function() {};\n  }\n});\n\n// Source: https://github.com/darius/requestAnimationFrame/blob/master/requestAnimationFrame.js\n// Adapted from https://gist.github.com/paulirish/1579671 which derived from\n// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n// requestAnimationFrame polyfill by Erik Möller.\n// Fixes from Paul Irish, Tino Zijdel, Andrew Mao, Klemen Slavič, Darius Bacon\n// MIT license\nif (!Date.now) {\n    /**\n   * Date.now polyfill.\n   * @return {number} the current Date\n   */\n    Date.now = function () {\n        return new Date().getTime();\n    };\n    Date['now'] = Date.now;\n}\nvar vendors = [\n    'webkit',\n    'moz'\n];\nfor (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {\n    var vp = vendors[i];\n    window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];\n    window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];\n    window['requestAnimationFrame'] = window.requestAnimationFrame;\n    window['cancelAnimationFrame'] = window.cancelAnimationFrame;\n}\nif (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {\n    var lastTime = 0;\n    /**\n   * requestAnimationFrame polyfill.\n   * @param  {!Function} callback the callback function.\n   */\n    window.requestAnimationFrame = function (callback) {\n        var now = Date.now();\n        var nextTime = Math.max(lastTime + 16, now);\n        return setTimeout(function () {\n            callback(lastTime = nextTime);\n        }, nextTime - now);\n    };\n    window.cancelAnimationFrame = clearTimeout;\n    window['requestAnimationFrame'] = window.requestAnimationFrame;\n    window['cancelAnimationFrame'] = window.cancelAnimationFrame;\n}\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Button MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialButton = function MaterialButton(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialButton'] = MaterialButton;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialButton.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialButton.prototype.CssClasses_ = {\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_CONTAINER: 'mdl-button__ripple-container',\n    RIPPLE: 'mdl-ripple'\n};\n/**\n   * Handle blur of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialButton.prototype.blurHandler_ = function (event) {\n    if (event) {\n        this.element_.blur();\n    }\n};\n// Public methods.\n/**\n   * Disable button.\n   *\n   * @public\n   */\nMaterialButton.prototype.disable = function () {\n    this.element_.disabled = true;\n};\nMaterialButton.prototype['disable'] = MaterialButton.prototype.disable;\n/**\n   * Enable button.\n   *\n   * @public\n   */\nMaterialButton.prototype.enable = function () {\n    this.element_.disabled = false;\n};\nMaterialButton.prototype['enable'] = MaterialButton.prototype.enable;\n/**\n   * Initialize element.\n   */\nMaterialButton.prototype.init = function () {\n    if (this.element_) {\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            var rippleContainer = document.createElement('span');\n            rippleContainer.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            this.rippleElement_ = document.createElement('span');\n            this.rippleElement_.classList.add(this.CssClasses_.RIPPLE);\n            rippleContainer.appendChild(this.rippleElement_);\n            this.boundRippleBlurHandler = this.blurHandler_.bind(this);\n            this.rippleElement_.addEventListener('mouseup', this.boundRippleBlurHandler);\n            this.element_.appendChild(rippleContainer);\n        }\n        this.boundButtonBlurHandler = this.blurHandler_.bind(this);\n        this.element_.addEventListener('mouseup', this.boundButtonBlurHandler);\n        this.element_.addEventListener('mouseleave', this.boundButtonBlurHandler);\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialButton,\n    classAsString: 'MaterialButton',\n    cssClass: 'mdl-js-button',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Checkbox MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialCheckbox = function MaterialCheckbox(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialCheckbox'] = MaterialCheckbox;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialCheckbox.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialCheckbox.prototype.CssClasses_ = {\n    INPUT: 'mdl-checkbox__input',\n    BOX_OUTLINE: 'mdl-checkbox__box-outline',\n    FOCUS_HELPER: 'mdl-checkbox__focus-helper',\n    TICK_OUTLINE: 'mdl-checkbox__tick-outline',\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE_CONTAINER: 'mdl-checkbox__ripple-container',\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE: 'mdl-ripple',\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_CHECKED: 'is-checked',\n    IS_UPGRADED: 'is-upgraded'\n};\n/**\n   * Handle change of state.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialCheckbox.prototype.onChange_ = function (event) {\n    this.updateClasses_();\n};\n/**\n   * Handle focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialCheckbox.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialCheckbox.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle mouseup.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialCheckbox.prototype.onMouseUp_ = function (event) {\n    this.blur_();\n};\n/**\n   * Handle class updates.\n   *\n   * @private\n   */\nMaterialCheckbox.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkToggleState();\n};\n/**\n   * Add blur.\n   *\n   * @private\n   */\nMaterialCheckbox.prototype.blur_ = function () {\n    // TODO: figure out why there's a focus event being fired after our blur,\n    // so that we can avoid this hack.\n    window.setTimeout(function () {\n        this.inputElement_.blur();\n    }.bind(this), this.Constant_.TINY_TIMEOUT);\n};\n// Public methods.\n/**\n   * Check the inputs toggle state and update display.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.checkToggleState = function () {\n    if (this.inputElement_.checked) {\n        this.element_.classList.add(this.CssClasses_.IS_CHECKED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_CHECKED);\n    }\n};\nMaterialCheckbox.prototype['checkToggleState'] = MaterialCheckbox.prototype.checkToggleState;\n/**\n   * Check the inputs disabled state and update display.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.checkDisabled = function () {\n    if (this.inputElement_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialCheckbox.prototype['checkDisabled'] = MaterialCheckbox.prototype.checkDisabled;\n/**\n   * Disable checkbox.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.disable = function () {\n    this.inputElement_.disabled = true;\n    this.updateClasses_();\n};\nMaterialCheckbox.prototype['disable'] = MaterialCheckbox.prototype.disable;\n/**\n   * Enable checkbox.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.enable = function () {\n    this.inputElement_.disabled = false;\n    this.updateClasses_();\n};\nMaterialCheckbox.prototype['enable'] = MaterialCheckbox.prototype.enable;\n/**\n   * Check checkbox.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.check = function () {\n    this.inputElement_.checked = true;\n    this.updateClasses_();\n};\nMaterialCheckbox.prototype['check'] = MaterialCheckbox.prototype.check;\n/**\n   * Uncheck checkbox.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.uncheck = function () {\n    this.inputElement_.checked = false;\n    this.updateClasses_();\n};\nMaterialCheckbox.prototype['uncheck'] = MaterialCheckbox.prototype.uncheck;\n/**\n   * Initialize element.\n   */\nMaterialCheckbox.prototype.init = function () {\n    if (this.element_) {\n        this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);\n        var boxOutline = document.createElement('span');\n        boxOutline.classList.add(this.CssClasses_.BOX_OUTLINE);\n        var tickContainer = document.createElement('span');\n        tickContainer.classList.add(this.CssClasses_.FOCUS_HELPER);\n        var tickOutline = document.createElement('span');\n        tickOutline.classList.add(this.CssClasses_.TICK_OUTLINE);\n        boxOutline.appendChild(tickOutline);\n        this.element_.appendChild(tickContainer);\n        this.element_.appendChild(boxOutline);\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            this.rippleContainerElement_ = document.createElement('span');\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_EFFECT);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);\n            this.boundRippleMouseUp = this.onMouseUp_.bind(this);\n            this.rippleContainerElement_.addEventListener('mouseup', this.boundRippleMouseUp);\n            var ripple = document.createElement('span');\n            ripple.classList.add(this.CssClasses_.RIPPLE);\n            this.rippleContainerElement_.appendChild(ripple);\n            this.element_.appendChild(this.rippleContainerElement_);\n        }\n        this.boundInputOnChange = this.onChange_.bind(this);\n        this.boundInputOnFocus = this.onFocus_.bind(this);\n        this.boundInputOnBlur = this.onBlur_.bind(this);\n        this.boundElementMouseUp = this.onMouseUp_.bind(this);\n        this.inputElement_.addEventListener('change', this.boundInputOnChange);\n        this.inputElement_.addEventListener('focus', this.boundInputOnFocus);\n        this.inputElement_.addEventListener('blur', this.boundInputOnBlur);\n        this.element_.addEventListener('mouseup', this.boundElementMouseUp);\n        this.updateClasses_();\n        this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialCheckbox,\n    classAsString: 'MaterialCheckbox',\n    cssClass: 'mdl-js-checkbox',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for icon toggle MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialIconToggle = function MaterialIconToggle(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialIconToggle'] = MaterialIconToggle;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialIconToggle.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialIconToggle.prototype.CssClasses_ = {\n    INPUT: 'mdl-icon-toggle__input',\n    JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE_CONTAINER: 'mdl-icon-toggle__ripple-container',\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE: 'mdl-ripple',\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_CHECKED: 'is-checked'\n};\n/**\n   * Handle change of state.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialIconToggle.prototype.onChange_ = function (event) {\n    this.updateClasses_();\n};\n/**\n   * Handle focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialIconToggle.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialIconToggle.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle mouseup.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialIconToggle.prototype.onMouseUp_ = function (event) {\n    this.blur_();\n};\n/**\n   * Handle class updates.\n   *\n   * @private\n   */\nMaterialIconToggle.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkToggleState();\n};\n/**\n   * Add blur.\n   *\n   * @private\n   */\nMaterialIconToggle.prototype.blur_ = function () {\n    // TODO: figure out why there's a focus event being fired after our blur,\n    // so that we can avoid this hack.\n    window.setTimeout(function () {\n        this.inputElement_.blur();\n    }.bind(this), this.Constant_.TINY_TIMEOUT);\n};\n// Public methods.\n/**\n   * Check the inputs toggle state and update display.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.checkToggleState = function () {\n    if (this.inputElement_.checked) {\n        this.element_.classList.add(this.CssClasses_.IS_CHECKED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_CHECKED);\n    }\n};\nMaterialIconToggle.prototype['checkToggleState'] = MaterialIconToggle.prototype.checkToggleState;\n/**\n   * Check the inputs disabled state and update display.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.checkDisabled = function () {\n    if (this.inputElement_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialIconToggle.prototype['checkDisabled'] = MaterialIconToggle.prototype.checkDisabled;\n/**\n   * Disable icon toggle.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.disable = function () {\n    this.inputElement_.disabled = true;\n    this.updateClasses_();\n};\nMaterialIconToggle.prototype['disable'] = MaterialIconToggle.prototype.disable;\n/**\n   * Enable icon toggle.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.enable = function () {\n    this.inputElement_.disabled = false;\n    this.updateClasses_();\n};\nMaterialIconToggle.prototype['enable'] = MaterialIconToggle.prototype.enable;\n/**\n   * Check icon toggle.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.check = function () {\n    this.inputElement_.checked = true;\n    this.updateClasses_();\n};\nMaterialIconToggle.prototype['check'] = MaterialIconToggle.prototype.check;\n/**\n   * Uncheck icon toggle.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.uncheck = function () {\n    this.inputElement_.checked = false;\n    this.updateClasses_();\n};\nMaterialIconToggle.prototype['uncheck'] = MaterialIconToggle.prototype.uncheck;\n/**\n   * Initialize element.\n   */\nMaterialIconToggle.prototype.init = function () {\n    if (this.element_) {\n        this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);\n        if (this.element_.classList.contains(this.CssClasses_.JS_RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            this.rippleContainerElement_ = document.createElement('span');\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.JS_RIPPLE_EFFECT);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);\n            this.boundRippleMouseUp = this.onMouseUp_.bind(this);\n            this.rippleContainerElement_.addEventListener('mouseup', this.boundRippleMouseUp);\n            var ripple = document.createElement('span');\n            ripple.classList.add(this.CssClasses_.RIPPLE);\n            this.rippleContainerElement_.appendChild(ripple);\n            this.element_.appendChild(this.rippleContainerElement_);\n        }\n        this.boundInputOnChange = this.onChange_.bind(this);\n        this.boundInputOnFocus = this.onFocus_.bind(this);\n        this.boundInputOnBlur = this.onBlur_.bind(this);\n        this.boundElementOnMouseUp = this.onMouseUp_.bind(this);\n        this.inputElement_.addEventListener('change', this.boundInputOnChange);\n        this.inputElement_.addEventListener('focus', this.boundInputOnFocus);\n        this.inputElement_.addEventListener('blur', this.boundInputOnBlur);\n        this.element_.addEventListener('mouseup', this.boundElementOnMouseUp);\n        this.updateClasses_();\n        this.element_.classList.add('is-upgraded');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialIconToggle,\n    classAsString: 'MaterialIconToggle',\n    cssClass: 'mdl-js-icon-toggle',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for dropdown MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialMenu = function MaterialMenu(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialMenu'] = MaterialMenu;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialMenu.prototype.Constant_ = {\n    // Total duration of the menu animation.\n    TRANSITION_DURATION_SECONDS: 0.3,\n    // The fraction of the total duration we want to use for menu item animations.\n    TRANSITION_DURATION_FRACTION: 0.8,\n    // How long the menu stays open after choosing an option (so the user can see\n    // the ripple).\n    CLOSE_TIMEOUT: 150\n};\n/**\n   * Keycodes, for code readability.\n   *\n   * @enum {number}\n   * @private\n   */\nMaterialMenu.prototype.Keycodes_ = {\n    ENTER: 13,\n    ESCAPE: 27,\n    SPACE: 32,\n    UP_ARROW: 38,\n    DOWN_ARROW: 40\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialMenu.prototype.CssClasses_ = {\n    CONTAINER: 'mdl-menu__container',\n    OUTLINE: 'mdl-menu__outline',\n    ITEM: 'mdl-menu__item',\n    ITEM_RIPPLE_CONTAINER: 'mdl-menu__item-ripple-container',\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE: 'mdl-ripple',\n    // Statuses\n    IS_UPGRADED: 'is-upgraded',\n    IS_VISIBLE: 'is-visible',\n    IS_ANIMATING: 'is-animating',\n    // Alignment options\n    BOTTOM_LEFT: 'mdl-menu--bottom-left',\n    // This is the default.\n    BOTTOM_RIGHT: 'mdl-menu--bottom-right',\n    TOP_LEFT: 'mdl-menu--top-left',\n    TOP_RIGHT: 'mdl-menu--top-right',\n    UNALIGNED: 'mdl-menu--unaligned'\n};\n/**\n   * Initialize element.\n   */\nMaterialMenu.prototype.init = function () {\n    if (this.element_) {\n        // Create container for the menu.\n        var container = document.createElement('div');\n        container.classList.add(this.CssClasses_.CONTAINER);\n        this.element_.parentElement.insertBefore(container, this.element_);\n        this.element_.parentElement.removeChild(this.element_);\n        container.appendChild(this.element_);\n        this.container_ = container;\n        // Create outline for the menu (shadow and background).\n        var outline = document.createElement('div');\n        outline.classList.add(this.CssClasses_.OUTLINE);\n        this.outline_ = outline;\n        container.insertBefore(outline, this.element_);\n        // Find the \"for\" element and bind events to it.\n        var forElId = this.element_.getAttribute('for') || this.element_.getAttribute('data-mdl-for');\n        var forEl = null;\n        if (forElId) {\n            forEl = document.getElementById(forElId);\n            if (forEl) {\n                this.forElement_ = forEl;\n                forEl.addEventListener('click', this.handleForClick_.bind(this));\n                forEl.addEventListener('keydown', this.handleForKeyboardEvent_.bind(this));\n            }\n        }\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);\n        this.boundItemKeydown_ = this.handleItemKeyboardEvent_.bind(this);\n        this.boundItemClick_ = this.handleItemClick_.bind(this);\n        for (var i = 0; i < items.length; i++) {\n            // Add a listener to each menu item.\n            items[i].addEventListener('click', this.boundItemClick_);\n            // Add a tab index to each menu item.\n            items[i].tabIndex = '-1';\n            // Add a keyboard listener to each menu item.\n            items[i].addEventListener('keydown', this.boundItemKeydown_);\n        }\n        // Add ripple classes to each item, if the user has enabled ripples.\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            for (i = 0; i < items.length; i++) {\n                var item = items[i];\n                var rippleContainer = document.createElement('span');\n                rippleContainer.classList.add(this.CssClasses_.ITEM_RIPPLE_CONTAINER);\n                var ripple = document.createElement('span');\n                ripple.classList.add(this.CssClasses_.RIPPLE);\n                rippleContainer.appendChild(ripple);\n                item.appendChild(rippleContainer);\n                item.classList.add(this.CssClasses_.RIPPLE_EFFECT);\n            }\n        }\n        // Copy alignment classes to the container, so the outline can use them.\n        if (this.element_.classList.contains(this.CssClasses_.BOTTOM_LEFT)) {\n            this.outline_.classList.add(this.CssClasses_.BOTTOM_LEFT);\n        }\n        if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {\n            this.outline_.classList.add(this.CssClasses_.BOTTOM_RIGHT);\n        }\n        if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {\n            this.outline_.classList.add(this.CssClasses_.TOP_LEFT);\n        }\n        if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {\n            this.outline_.classList.add(this.CssClasses_.TOP_RIGHT);\n        }\n        if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {\n            this.outline_.classList.add(this.CssClasses_.UNALIGNED);\n        }\n        container.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n/**\n   * Handles a click on the \"for\" element, by positioning the menu and then\n   * toggling it.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialMenu.prototype.handleForClick_ = function (evt) {\n    if (this.element_ && this.forElement_) {\n        var rect = this.forElement_.getBoundingClientRect();\n        var forRect = this.forElement_.parentElement.getBoundingClientRect();\n        if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {\n        } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {\n            // Position below the \"for\" element, aligned to its right.\n            this.container_.style.right = forRect.right - rect.right + 'px';\n            this.container_.style.top = this.forElement_.offsetTop + this.forElement_.offsetHeight + 'px';\n        } else if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {\n            // Position above the \"for\" element, aligned to its left.\n            this.container_.style.left = this.forElement_.offsetLeft + 'px';\n            this.container_.style.bottom = forRect.bottom - rect.top + 'px';\n        } else if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {\n            // Position above the \"for\" element, aligned to its right.\n            this.container_.style.right = forRect.right - rect.right + 'px';\n            this.container_.style.bottom = forRect.bottom - rect.top + 'px';\n        } else {\n            // Default: position below the \"for\" element, aligned to its left.\n            this.container_.style.left = this.forElement_.offsetLeft + 'px';\n            this.container_.style.top = this.forElement_.offsetTop + this.forElement_.offsetHeight + 'px';\n        }\n    }\n    this.toggle(evt);\n};\n/**\n   * Handles a keyboard event on the \"for\" element.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialMenu.prototype.handleForKeyboardEvent_ = function (evt) {\n    if (this.element_ && this.container_ && this.forElement_) {\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM + ':not([disabled])');\n        if (items && items.length > 0 && this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {\n            if (evt.keyCode === this.Keycodes_.UP_ARROW) {\n                evt.preventDefault();\n                items[items.length - 1].focus();\n            } else if (evt.keyCode === this.Keycodes_.DOWN_ARROW) {\n                evt.preventDefault();\n                items[0].focus();\n            }\n        }\n    }\n};\n/**\n   * Handles a keyboard event on an item.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialMenu.prototype.handleItemKeyboardEvent_ = function (evt) {\n    if (this.element_ && this.container_) {\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM + ':not([disabled])');\n        if (items && items.length > 0 && this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {\n            var currentIndex = Array.prototype.slice.call(items).indexOf(evt.target);\n            if (evt.keyCode === this.Keycodes_.UP_ARROW) {\n                evt.preventDefault();\n                if (currentIndex > 0) {\n                    items[currentIndex - 1].focus();\n                } else {\n                    items[items.length - 1].focus();\n                }\n            } else if (evt.keyCode === this.Keycodes_.DOWN_ARROW) {\n                evt.preventDefault();\n                if (items.length > currentIndex + 1) {\n                    items[currentIndex + 1].focus();\n                } else {\n                    items[0].focus();\n                }\n            } else if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {\n                evt.preventDefault();\n                // Send mousedown and mouseup to trigger ripple.\n                var e = new MouseEvent('mousedown');\n                evt.target.dispatchEvent(e);\n                e = new MouseEvent('mouseup');\n                evt.target.dispatchEvent(e);\n                // Send click.\n                evt.target.click();\n            } else if (evt.keyCode === this.Keycodes_.ESCAPE) {\n                evt.preventDefault();\n                this.hide();\n            }\n        }\n    }\n};\n/**\n   * Handles a click event on an item.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialMenu.prototype.handleItemClick_ = function (evt) {\n    if (evt.target.hasAttribute('disabled')) {\n        evt.stopPropagation();\n    } else {\n        // Wait some time before closing menu, so the user can see the ripple.\n        this.closing_ = true;\n        window.setTimeout(function (evt) {\n            this.hide();\n            this.closing_ = false;\n        }.bind(this), this.Constant_.CLOSE_TIMEOUT);\n    }\n};\n/**\n   * Calculates the initial clip (for opening the menu) or final clip (for closing\n   * it), and applies it. This allows us to animate from or to the correct point,\n   * that is, the point it's aligned to in the \"for\" element.\n   *\n   * @param {number} height Height of the clip rectangle\n   * @param {number} width Width of the clip rectangle\n   * @private\n   */\nMaterialMenu.prototype.applyClip_ = function (height, width) {\n    if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {\n        // Do not clip.\n        this.element_.style.clip = '';\n    } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {\n        // Clip to the top right corner of the menu.\n        this.element_.style.clip = 'rect(0 ' + width + 'px ' + '0 ' + width + 'px)';\n    } else if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {\n        // Clip to the bottom left corner of the menu.\n        this.element_.style.clip = 'rect(' + height + 'px 0 ' + height + 'px 0)';\n    } else if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {\n        // Clip to the bottom right corner of the menu.\n        this.element_.style.clip = 'rect(' + height + 'px ' + width + 'px ' + height + 'px ' + width + 'px)';\n    } else {\n        // Default: do not clip (same as clipping to the top left corner).\n        this.element_.style.clip = '';\n    }\n};\n/**\n   * Cleanup function to remove animation listeners.\n   *\n   * @param {Event} evt\n   * @private\n   */\nMaterialMenu.prototype.removeAnimationEndListener_ = function (evt) {\n    evt.target.classList.remove(MaterialMenu.prototype.CssClasses_.IS_ANIMATING);\n};\n/**\n   * Adds an event listener to clean up after the animation ends.\n   *\n   * @private\n   */\nMaterialMenu.prototype.addAnimationEndListener_ = function () {\n    this.element_.addEventListener('transitionend', this.removeAnimationEndListener_);\n    this.element_.addEventListener('webkitTransitionEnd', this.removeAnimationEndListener_);\n};\n/**\n   * Displays the menu.\n   *\n   * @public\n   */\nMaterialMenu.prototype.show = function (evt) {\n    if (this.element_ && this.container_ && this.outline_) {\n        // Measure the inner element.\n        var height = this.element_.getBoundingClientRect().height;\n        var width = this.element_.getBoundingClientRect().width;\n        // Apply the inner element's size to the container and outline.\n        this.container_.style.width = width + 'px';\n        this.container_.style.height = height + 'px';\n        this.outline_.style.width = width + 'px';\n        this.outline_.style.height = height + 'px';\n        var transitionDuration = this.Constant_.TRANSITION_DURATION_SECONDS * this.Constant_.TRANSITION_DURATION_FRACTION;\n        // Calculate transition delays for individual menu items, so that they fade\n        // in one at a time.\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);\n        for (var i = 0; i < items.length; i++) {\n            var itemDelay = null;\n            if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT) || this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {\n                itemDelay = (height - items[i].offsetTop - items[i].offsetHeight) / height * transitionDuration + 's';\n            } else {\n                itemDelay = items[i].offsetTop / height * transitionDuration + 's';\n            }\n            items[i].style.transitionDelay = itemDelay;\n        }\n        // Apply the initial clip to the text before we start animating.\n        this.applyClip_(height, width);\n        // Wait for the next frame, turn on animation, and apply the final clip.\n        // Also make it visible. This triggers the transitions.\n        window.requestAnimationFrame(function () {\n            this.element_.classList.add(this.CssClasses_.IS_ANIMATING);\n            this.element_.style.clip = 'rect(0 ' + width + 'px ' + height + 'px 0)';\n            this.container_.classList.add(this.CssClasses_.IS_VISIBLE);\n        }.bind(this));\n        // Clean up after the animation is complete.\n        this.addAnimationEndListener_();\n        // Add a click listener to the document, to close the menu.\n        var callback = function (e) {\n            // Check to see if the document is processing the same event that\n            // displayed the menu in the first place. If so, do nothing.\n            // Also check to see if the menu is in the process of closing itself, and\n            // do nothing in that case.\n            // Also check if the clicked element is a menu item\n            // if so, do nothing.\n            if (e !== evt && !this.closing_ && e.target.parentNode !== this.element_) {\n                document.removeEventListener('click', callback);\n                this.hide();\n            }\n        }.bind(this);\n        document.addEventListener('click', callback);\n    }\n};\nMaterialMenu.prototype['show'] = MaterialMenu.prototype.show;\n/**\n   * Hides the menu.\n   *\n   * @public\n   */\nMaterialMenu.prototype.hide = function () {\n    if (this.element_ && this.container_ && this.outline_) {\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);\n        // Remove all transition delays; menu items fade out concurrently.\n        for (var i = 0; i < items.length; i++) {\n            items[i].style.removeProperty('transition-delay');\n        }\n        // Measure the inner element.\n        var rect = this.element_.getBoundingClientRect();\n        var height = rect.height;\n        var width = rect.width;\n        // Turn on animation, and apply the final clip. Also make invisible.\n        // This triggers the transitions.\n        this.element_.classList.add(this.CssClasses_.IS_ANIMATING);\n        this.applyClip_(height, width);\n        this.container_.classList.remove(this.CssClasses_.IS_VISIBLE);\n        // Clean up after the animation is complete.\n        this.addAnimationEndListener_();\n    }\n};\nMaterialMenu.prototype['hide'] = MaterialMenu.prototype.hide;\n/**\n   * Displays or hides the menu, depending on current state.\n   *\n   * @public\n   */\nMaterialMenu.prototype.toggle = function (evt) {\n    if (this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {\n        this.hide();\n    } else {\n        this.show(evt);\n    }\n};\nMaterialMenu.prototype['toggle'] = MaterialMenu.prototype.toggle;\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialMenu,\n    classAsString: 'MaterialMenu',\n    cssClass: 'mdl-js-menu',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Progress MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialProgress = function MaterialProgress(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialProgress'] = MaterialProgress;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialProgress.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialProgress.prototype.CssClasses_ = { INDETERMINATE_CLASS: 'mdl-progress__indeterminate' };\n/**\n   * Set the current progress of the progressbar.\n   *\n   * @param {number} p Percentage of the progress (0-100)\n   * @public\n   */\nMaterialProgress.prototype.setProgress = function (p) {\n    if (this.element_.classList.contains(this.CssClasses_.INDETERMINATE_CLASS)) {\n        return;\n    }\n    this.progressbar_.style.width = p + '%';\n};\nMaterialProgress.prototype['setProgress'] = MaterialProgress.prototype.setProgress;\n/**\n   * Set the current progress of the buffer.\n   *\n   * @param {number} p Percentage of the buffer (0-100)\n   * @public\n   */\nMaterialProgress.prototype.setBuffer = function (p) {\n    this.bufferbar_.style.width = p + '%';\n    this.auxbar_.style.width = 100 - p + '%';\n};\nMaterialProgress.prototype['setBuffer'] = MaterialProgress.prototype.setBuffer;\n/**\n   * Initialize element.\n   */\nMaterialProgress.prototype.init = function () {\n    if (this.element_) {\n        var el = document.createElement('div');\n        el.className = 'progressbar bar bar1';\n        this.element_.appendChild(el);\n        this.progressbar_ = el;\n        el = document.createElement('div');\n        el.className = 'bufferbar bar bar2';\n        this.element_.appendChild(el);\n        this.bufferbar_ = el;\n        el = document.createElement('div');\n        el.className = 'auxbar bar bar3';\n        this.element_.appendChild(el);\n        this.auxbar_ = el;\n        this.progressbar_.style.width = '0%';\n        this.bufferbar_.style.width = '100%';\n        this.auxbar_.style.width = '0%';\n        this.element_.classList.add('is-upgraded');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialProgress,\n    classAsString: 'MaterialProgress',\n    cssClass: 'mdl-js-progress',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Radio MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialRadio = function MaterialRadio(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialRadio'] = MaterialRadio;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialRadio.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialRadio.prototype.CssClasses_ = {\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_CHECKED: 'is-checked',\n    IS_UPGRADED: 'is-upgraded',\n    JS_RADIO: 'mdl-js-radio',\n    RADIO_BTN: 'mdl-radio__button',\n    RADIO_OUTER_CIRCLE: 'mdl-radio__outer-circle',\n    RADIO_INNER_CIRCLE: 'mdl-radio__inner-circle',\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE_CONTAINER: 'mdl-radio__ripple-container',\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE: 'mdl-ripple'\n};\n/**\n   * Handle change of state.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRadio.prototype.onChange_ = function (event) {\n    // Since other radio buttons don't get change events, we need to look for\n    // them to update their classes.\n    var radios = document.getElementsByClassName(this.CssClasses_.JS_RADIO);\n    for (var i = 0; i < radios.length; i++) {\n        var button = radios[i].querySelector('.' + this.CssClasses_.RADIO_BTN);\n        // Different name == different group, so no point updating those.\n        if (button.getAttribute('name') === this.btnElement_.getAttribute('name')) {\n            radios[i]['MaterialRadio'].updateClasses_();\n        }\n    }\n};\n/**\n   * Handle focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRadio.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRadio.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle mouseup.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRadio.prototype.onMouseup_ = function (event) {\n    this.blur_();\n};\n/**\n   * Update classes.\n   *\n   * @private\n   */\nMaterialRadio.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkToggleState();\n};\n/**\n   * Add blur.\n   *\n   * @private\n   */\nMaterialRadio.prototype.blur_ = function () {\n    // TODO: figure out why there's a focus event being fired after our blur,\n    // so that we can avoid this hack.\n    window.setTimeout(function () {\n        this.btnElement_.blur();\n    }.bind(this), this.Constant_.TINY_TIMEOUT);\n};\n// Public methods.\n/**\n   * Check the components disabled state.\n   *\n   * @public\n   */\nMaterialRadio.prototype.checkDisabled = function () {\n    if (this.btnElement_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialRadio.prototype['checkDisabled'] = MaterialRadio.prototype.checkDisabled;\n/**\n   * Check the components toggled state.\n   *\n   * @public\n   */\nMaterialRadio.prototype.checkToggleState = function () {\n    if (this.btnElement_.checked) {\n        this.element_.classList.add(this.CssClasses_.IS_CHECKED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_CHECKED);\n    }\n};\nMaterialRadio.prototype['checkToggleState'] = MaterialRadio.prototype.checkToggleState;\n/**\n   * Disable radio.\n   *\n   * @public\n   */\nMaterialRadio.prototype.disable = function () {\n    this.btnElement_.disabled = true;\n    this.updateClasses_();\n};\nMaterialRadio.prototype['disable'] = MaterialRadio.prototype.disable;\n/**\n   * Enable radio.\n   *\n   * @public\n   */\nMaterialRadio.prototype.enable = function () {\n    this.btnElement_.disabled = false;\n    this.updateClasses_();\n};\nMaterialRadio.prototype['enable'] = MaterialRadio.prototype.enable;\n/**\n   * Check radio.\n   *\n   * @public\n   */\nMaterialRadio.prototype.check = function () {\n    this.btnElement_.checked = true;\n    this.updateClasses_();\n};\nMaterialRadio.prototype['check'] = MaterialRadio.prototype.check;\n/**\n   * Uncheck radio.\n   *\n   * @public\n   */\nMaterialRadio.prototype.uncheck = function () {\n    this.btnElement_.checked = false;\n    this.updateClasses_();\n};\nMaterialRadio.prototype['uncheck'] = MaterialRadio.prototype.uncheck;\n/**\n   * Initialize element.\n   */\nMaterialRadio.prototype.init = function () {\n    if (this.element_) {\n        this.btnElement_ = this.element_.querySelector('.' + this.CssClasses_.RADIO_BTN);\n        this.boundChangeHandler_ = this.onChange_.bind(this);\n        this.boundFocusHandler_ = this.onChange_.bind(this);\n        this.boundBlurHandler_ = this.onBlur_.bind(this);\n        this.boundMouseUpHandler_ = this.onMouseup_.bind(this);\n        var outerCircle = document.createElement('span');\n        outerCircle.classList.add(this.CssClasses_.RADIO_OUTER_CIRCLE);\n        var innerCircle = document.createElement('span');\n        innerCircle.classList.add(this.CssClasses_.RADIO_INNER_CIRCLE);\n        this.element_.appendChild(outerCircle);\n        this.element_.appendChild(innerCircle);\n        var rippleContainer;\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            rippleContainer = document.createElement('span');\n            rippleContainer.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            rippleContainer.classList.add(this.CssClasses_.RIPPLE_EFFECT);\n            rippleContainer.classList.add(this.CssClasses_.RIPPLE_CENTER);\n            rippleContainer.addEventListener('mouseup', this.boundMouseUpHandler_);\n            var ripple = document.createElement('span');\n            ripple.classList.add(this.CssClasses_.RIPPLE);\n            rippleContainer.appendChild(ripple);\n            this.element_.appendChild(rippleContainer);\n        }\n        this.btnElement_.addEventListener('change', this.boundChangeHandler_);\n        this.btnElement_.addEventListener('focus', this.boundFocusHandler_);\n        this.btnElement_.addEventListener('blur', this.boundBlurHandler_);\n        this.element_.addEventListener('mouseup', this.boundMouseUpHandler_);\n        this.updateClasses_();\n        this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialRadio,\n    classAsString: 'MaterialRadio',\n    cssClass: 'mdl-js-radio',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Slider MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialSlider = function MaterialSlider(element) {\n    this.element_ = element;\n    // Browser feature detection.\n    this.isIE_ = window.navigator.msPointerEnabled;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialSlider'] = MaterialSlider;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialSlider.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialSlider.prototype.CssClasses_ = {\n    IE_CONTAINER: 'mdl-slider__ie-container',\n    SLIDER_CONTAINER: 'mdl-slider__container',\n    BACKGROUND_FLEX: 'mdl-slider__background-flex',\n    BACKGROUND_LOWER: 'mdl-slider__background-lower',\n    BACKGROUND_UPPER: 'mdl-slider__background-upper',\n    IS_LOWEST_VALUE: 'is-lowest-value',\n    IS_UPGRADED: 'is-upgraded'\n};\n/**\n   * Handle input on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSlider.prototype.onInput_ = function (event) {\n    this.updateValueStyles_();\n};\n/**\n   * Handle change on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSlider.prototype.onChange_ = function (event) {\n    this.updateValueStyles_();\n};\n/**\n   * Handle mouseup on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSlider.prototype.onMouseUp_ = function (event) {\n    event.target.blur();\n};\n/**\n   * Handle mousedown on container element.\n   * This handler is purpose is to not require the use to click\n   * exactly on the 2px slider element, as FireFox seems to be very\n   * strict about this.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   * @suppress {missingProperties}\n   */\nMaterialSlider.prototype.onContainerMouseDown_ = function (event) {\n    // If this click is not on the parent element (but rather some child)\n    // ignore. It may still bubble up.\n    if (event.target !== this.element_.parentElement) {\n        return;\n    }\n    // Discard the original event and create a new event that\n    // is on the slider element.\n    event.preventDefault();\n    var newEvent = new MouseEvent('mousedown', {\n        target: event.target,\n        buttons: event.buttons,\n        clientX: event.clientX,\n        clientY: this.element_.getBoundingClientRect().y\n    });\n    this.element_.dispatchEvent(newEvent);\n};\n/**\n   * Handle updating of values.\n   *\n   * @private\n   */\nMaterialSlider.prototype.updateValueStyles_ = function () {\n    // Calculate and apply percentages to div structure behind slider.\n    var fraction = (this.element_.value - this.element_.min) / (this.element_.max - this.element_.min);\n    if (fraction === 0) {\n        this.element_.classList.add(this.CssClasses_.IS_LOWEST_VALUE);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_LOWEST_VALUE);\n    }\n    if (!this.isIE_) {\n        this.backgroundLower_.style.flex = fraction;\n        this.backgroundLower_.style.webkitFlex = fraction;\n        this.backgroundUpper_.style.flex = 1 - fraction;\n        this.backgroundUpper_.style.webkitFlex = 1 - fraction;\n    }\n};\n// Public methods.\n/**\n   * Disable slider.\n   *\n   * @public\n   */\nMaterialSlider.prototype.disable = function () {\n    this.element_.disabled = true;\n};\nMaterialSlider.prototype['disable'] = MaterialSlider.prototype.disable;\n/**\n   * Enable slider.\n   *\n   * @public\n   */\nMaterialSlider.prototype.enable = function () {\n    this.element_.disabled = false;\n};\nMaterialSlider.prototype['enable'] = MaterialSlider.prototype.enable;\n/**\n   * Update slider value.\n   *\n   * @param {number} value The value to which to set the control (optional).\n   * @public\n   */\nMaterialSlider.prototype.change = function (value) {\n    if (typeof value !== 'undefined') {\n        this.element_.value = value;\n    }\n    this.updateValueStyles_();\n};\nMaterialSlider.prototype['change'] = MaterialSlider.prototype.change;\n/**\n   * Initialize element.\n   */\nMaterialSlider.prototype.init = function () {\n    if (this.element_) {\n        if (this.isIE_) {\n            // Since we need to specify a very large height in IE due to\n            // implementation limitations, we add a parent here that trims it down to\n            // a reasonable size.\n            var containerIE = document.createElement('div');\n            containerIE.classList.add(this.CssClasses_.IE_CONTAINER);\n            this.element_.parentElement.insertBefore(containerIE, this.element_);\n            this.element_.parentElement.removeChild(this.element_);\n            containerIE.appendChild(this.element_);\n        } else {\n            // For non-IE browsers, we need a div structure that sits behind the\n            // slider and allows us to style the left and right sides of it with\n            // different colors.\n            var container = document.createElement('div');\n            container.classList.add(this.CssClasses_.SLIDER_CONTAINER);\n            this.element_.parentElement.insertBefore(container, this.element_);\n            this.element_.parentElement.removeChild(this.element_);\n            container.appendChild(this.element_);\n            var backgroundFlex = document.createElement('div');\n            backgroundFlex.classList.add(this.CssClasses_.BACKGROUND_FLEX);\n            container.appendChild(backgroundFlex);\n            this.backgroundLower_ = document.createElement('div');\n            this.backgroundLower_.classList.add(this.CssClasses_.BACKGROUND_LOWER);\n            backgroundFlex.appendChild(this.backgroundLower_);\n            this.backgroundUpper_ = document.createElement('div');\n            this.backgroundUpper_.classList.add(this.CssClasses_.BACKGROUND_UPPER);\n            backgroundFlex.appendChild(this.backgroundUpper_);\n        }\n        this.boundInputHandler = this.onInput_.bind(this);\n        this.boundChangeHandler = this.onChange_.bind(this);\n        this.boundMouseUpHandler = this.onMouseUp_.bind(this);\n        this.boundContainerMouseDownHandler = this.onContainerMouseDown_.bind(this);\n        this.element_.addEventListener('input', this.boundInputHandler);\n        this.element_.addEventListener('change', this.boundChangeHandler);\n        this.element_.addEventListener('mouseup', this.boundMouseUpHandler);\n        this.element_.parentElement.addEventListener('mousedown', this.boundContainerMouseDownHandler);\n        this.updateValueStyles_();\n        this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialSlider,\n    classAsString: 'MaterialSlider',\n    cssClass: 'mdl-js-slider',\n    widget: true\n});\n/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Snackbar MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialSnackbar = function MaterialSnackbar(element) {\n    this.element_ = element;\n    this.textElement_ = this.element_.querySelector('.' + this.cssClasses_.MESSAGE);\n    this.actionElement_ = this.element_.querySelector('.' + this.cssClasses_.ACTION);\n    if (!this.textElement_) {\n        throw new Error('There must be a message element for a snackbar.');\n    }\n    if (!this.actionElement_) {\n        throw new Error('There must be an action element for a snackbar.');\n    }\n    this.active = false;\n    this.actionHandler_ = undefined;\n    this.message_ = undefined;\n    this.actionText_ = undefined;\n    this.queuedNotifications_ = [];\n    this.setActionHidden_(true);\n};\nwindow['MaterialSnackbar'] = MaterialSnackbar;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialSnackbar.prototype.Constant_ = {\n    // The duration of the snackbar show/hide animation, in ms.\n    ANIMATION_LENGTH: 250\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialSnackbar.prototype.cssClasses_ = {\n    SNACKBAR: 'mdl-snackbar',\n    MESSAGE: 'mdl-snackbar__text',\n    ACTION: 'mdl-snackbar__action',\n    ACTIVE: 'mdl-snackbar--active'\n};\n/**\n   * Display the snackbar.\n   *\n   * @private\n   */\nMaterialSnackbar.prototype.displaySnackbar_ = function () {\n    this.element_.setAttribute('aria-hidden', 'true');\n    if (this.actionHandler_) {\n        this.actionElement_.textContent = this.actionText_;\n        this.actionElement_.addEventListener('click', this.actionHandler_);\n        this.setActionHidden_(false);\n    }\n    this.textElement_.textContent = this.message_;\n    this.element_.classList.add(this.cssClasses_.ACTIVE);\n    this.element_.setAttribute('aria-hidden', 'false');\n    setTimeout(this.cleanup_.bind(this), this.timeout_);\n};\n/**\n   * Show the snackbar.\n   *\n   * @param {Object} data The data for the notification.\n   * @public\n   */\nMaterialSnackbar.prototype.showSnackbar = function (data) {\n    if (data === undefined) {\n        throw new Error('Please provide a data object with at least a message to display.');\n    }\n    if (data['message'] === undefined) {\n        throw new Error('Please provide a message to be displayed.');\n    }\n    if (data['actionHandler'] && !data['actionText']) {\n        throw new Error('Please provide action text with the handler.');\n    }\n    if (this.active) {\n        this.queuedNotifications_.push(data);\n    } else {\n        this.active = true;\n        this.message_ = data['message'];\n        if (data['timeout']) {\n            this.timeout_ = data['timeout'];\n        } else {\n            this.timeout_ = 2750;\n        }\n        if (data['actionHandler']) {\n            this.actionHandler_ = data['actionHandler'];\n        }\n        if (data['actionText']) {\n            this.actionText_ = data['actionText'];\n        }\n        this.displaySnackbar_();\n    }\n};\nMaterialSnackbar.prototype['showSnackbar'] = MaterialSnackbar.prototype.showSnackbar;\n/**\n   * Check if the queue has items within it.\n   * If it does, display the next entry.\n   *\n   * @private\n   */\nMaterialSnackbar.prototype.checkQueue_ = function () {\n    if (this.queuedNotifications_.length > 0) {\n        this.showSnackbar(this.queuedNotifications_.shift());\n    }\n};\n/**\n   * Cleanup the snackbar event listeners and accessiblity attributes.\n   *\n   * @private\n   */\nMaterialSnackbar.prototype.cleanup_ = function () {\n    this.element_.classList.remove(this.cssClasses_.ACTIVE);\n    setTimeout(function () {\n        this.element_.setAttribute('aria-hidden', 'true');\n        this.textElement_.textContent = '';\n        if (!Boolean(this.actionElement_.getAttribute('aria-hidden'))) {\n            this.setActionHidden_(true);\n            this.actionElement_.textContent = '';\n            this.actionElement_.removeEventListener('click', this.actionHandler_);\n        }\n        this.actionHandler_ = undefined;\n        this.message_ = undefined;\n        this.actionText_ = undefined;\n        this.active = false;\n        this.checkQueue_();\n    }.bind(this), this.Constant_.ANIMATION_LENGTH);\n};\n/**\n   * Set the action handler hidden state.\n   *\n   * @param {boolean} value\n   * @private\n   */\nMaterialSnackbar.prototype.setActionHidden_ = function (value) {\n    if (value) {\n        this.actionElement_.setAttribute('aria-hidden', 'true');\n    } else {\n        this.actionElement_.removeAttribute('aria-hidden');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialSnackbar,\n    classAsString: 'MaterialSnackbar',\n    cssClass: 'mdl-js-snackbar',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Spinner MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @param {HTMLElement} element The element that will be upgraded.\n   * @constructor\n   */\nvar MaterialSpinner = function MaterialSpinner(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialSpinner'] = MaterialSpinner;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialSpinner.prototype.Constant_ = { MDL_SPINNER_LAYER_COUNT: 4 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialSpinner.prototype.CssClasses_ = {\n    MDL_SPINNER_LAYER: 'mdl-spinner__layer',\n    MDL_SPINNER_CIRCLE_CLIPPER: 'mdl-spinner__circle-clipper',\n    MDL_SPINNER_CIRCLE: 'mdl-spinner__circle',\n    MDL_SPINNER_GAP_PATCH: 'mdl-spinner__gap-patch',\n    MDL_SPINNER_LEFT: 'mdl-spinner__left',\n    MDL_SPINNER_RIGHT: 'mdl-spinner__right'\n};\n/**\n   * Auxiliary method to create a spinner layer.\n   *\n   * @param {number} index Index of the layer to be created.\n   * @public\n   */\nMaterialSpinner.prototype.createLayer = function (index) {\n    var layer = document.createElement('div');\n    layer.classList.add(this.CssClasses_.MDL_SPINNER_LAYER);\n    layer.classList.add(this.CssClasses_.MDL_SPINNER_LAYER + '-' + index);\n    var leftClipper = document.createElement('div');\n    leftClipper.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER);\n    leftClipper.classList.add(this.CssClasses_.MDL_SPINNER_LEFT);\n    var gapPatch = document.createElement('div');\n    gapPatch.classList.add(this.CssClasses_.MDL_SPINNER_GAP_PATCH);\n    var rightClipper = document.createElement('div');\n    rightClipper.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER);\n    rightClipper.classList.add(this.CssClasses_.MDL_SPINNER_RIGHT);\n    var circleOwners = [\n        leftClipper,\n        gapPatch,\n        rightClipper\n    ];\n    for (var i = 0; i < circleOwners.length; i++) {\n        var circle = document.createElement('div');\n        circle.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE);\n        circleOwners[i].appendChild(circle);\n    }\n    layer.appendChild(leftClipper);\n    layer.appendChild(gapPatch);\n    layer.appendChild(rightClipper);\n    this.element_.appendChild(layer);\n};\nMaterialSpinner.prototype['createLayer'] = MaterialSpinner.prototype.createLayer;\n/**\n   * Stops the spinner animation.\n   * Public method for users who need to stop the spinner for any reason.\n   *\n   * @public\n   */\nMaterialSpinner.prototype.stop = function () {\n    this.element_.classList.remove('is-active');\n};\nMaterialSpinner.prototype['stop'] = MaterialSpinner.prototype.stop;\n/**\n   * Starts the spinner animation.\n   * Public method for users who need to manually start the spinner for any reason\n   * (instead of just adding the 'is-active' class to their markup).\n   *\n   * @public\n   */\nMaterialSpinner.prototype.start = function () {\n    this.element_.classList.add('is-active');\n};\nMaterialSpinner.prototype['start'] = MaterialSpinner.prototype.start;\n/**\n   * Initialize element.\n   */\nMaterialSpinner.prototype.init = function () {\n    if (this.element_) {\n        for (var i = 1; i <= this.Constant_.MDL_SPINNER_LAYER_COUNT; i++) {\n            this.createLayer(i);\n        }\n        this.element_.classList.add('is-upgraded');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialSpinner,\n    classAsString: 'MaterialSpinner',\n    cssClass: 'mdl-js-spinner',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Checkbox MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialSwitch = function MaterialSwitch(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialSwitch'] = MaterialSwitch;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialSwitch.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialSwitch.prototype.CssClasses_ = {\n    INPUT: 'mdl-switch__input',\n    TRACK: 'mdl-switch__track',\n    THUMB: 'mdl-switch__thumb',\n    FOCUS_HELPER: 'mdl-switch__focus-helper',\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE_CONTAINER: 'mdl-switch__ripple-container',\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE: 'mdl-ripple',\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_CHECKED: 'is-checked'\n};\n/**\n   * Handle change of state.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSwitch.prototype.onChange_ = function (event) {\n    this.updateClasses_();\n};\n/**\n   * Handle focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSwitch.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSwitch.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle mouseup.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSwitch.prototype.onMouseUp_ = function (event) {\n    this.blur_();\n};\n/**\n   * Handle class updates.\n   *\n   * @private\n   */\nMaterialSwitch.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkToggleState();\n};\n/**\n   * Add blur.\n   *\n   * @private\n   */\nMaterialSwitch.prototype.blur_ = function () {\n    // TODO: figure out why there's a focus event being fired after our blur,\n    // so that we can avoid this hack.\n    window.setTimeout(function () {\n        this.inputElement_.blur();\n    }.bind(this), this.Constant_.TINY_TIMEOUT);\n};\n// Public methods.\n/**\n   * Check the components disabled state.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.checkDisabled = function () {\n    if (this.inputElement_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialSwitch.prototype['checkDisabled'] = MaterialSwitch.prototype.checkDisabled;\n/**\n   * Check the components toggled state.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.checkToggleState = function () {\n    if (this.inputElement_.checked) {\n        this.element_.classList.add(this.CssClasses_.IS_CHECKED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_CHECKED);\n    }\n};\nMaterialSwitch.prototype['checkToggleState'] = MaterialSwitch.prototype.checkToggleState;\n/**\n   * Disable switch.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.disable = function () {\n    this.inputElement_.disabled = true;\n    this.updateClasses_();\n};\nMaterialSwitch.prototype['disable'] = MaterialSwitch.prototype.disable;\n/**\n   * Enable switch.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.enable = function () {\n    this.inputElement_.disabled = false;\n    this.updateClasses_();\n};\nMaterialSwitch.prototype['enable'] = MaterialSwitch.prototype.enable;\n/**\n   * Activate switch.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.on = function () {\n    this.inputElement_.checked = true;\n    this.updateClasses_();\n};\nMaterialSwitch.prototype['on'] = MaterialSwitch.prototype.on;\n/**\n   * Deactivate switch.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.off = function () {\n    this.inputElement_.checked = false;\n    this.updateClasses_();\n};\nMaterialSwitch.prototype['off'] = MaterialSwitch.prototype.off;\n/**\n   * Initialize element.\n   */\nMaterialSwitch.prototype.init = function () {\n    if (this.element_) {\n        this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);\n        var track = document.createElement('div');\n        track.classList.add(this.CssClasses_.TRACK);\n        var thumb = document.createElement('div');\n        thumb.classList.add(this.CssClasses_.THUMB);\n        var focusHelper = document.createElement('span');\n        focusHelper.classList.add(this.CssClasses_.FOCUS_HELPER);\n        thumb.appendChild(focusHelper);\n        this.element_.appendChild(track);\n        this.element_.appendChild(thumb);\n        this.boundMouseUpHandler = this.onMouseUp_.bind(this);\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            this.rippleContainerElement_ = document.createElement('span');\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_EFFECT);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);\n            this.rippleContainerElement_.addEventListener('mouseup', this.boundMouseUpHandler);\n            var ripple = document.createElement('span');\n            ripple.classList.add(this.CssClasses_.RIPPLE);\n            this.rippleContainerElement_.appendChild(ripple);\n            this.element_.appendChild(this.rippleContainerElement_);\n        }\n        this.boundChangeHandler = this.onChange_.bind(this);\n        this.boundFocusHandler = this.onFocus_.bind(this);\n        this.boundBlurHandler = this.onBlur_.bind(this);\n        this.inputElement_.addEventListener('change', this.boundChangeHandler);\n        this.inputElement_.addEventListener('focus', this.boundFocusHandler);\n        this.inputElement_.addEventListener('blur', this.boundBlurHandler);\n        this.element_.addEventListener('mouseup', this.boundMouseUpHandler);\n        this.updateClasses_();\n        this.element_.classList.add('is-upgraded');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialSwitch,\n    classAsString: 'MaterialSwitch',\n    cssClass: 'mdl-js-switch',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Tabs MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\nvar MaterialTabs = function MaterialTabs(element) {\n    // Stores the HTML element.\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialTabs'] = MaterialTabs;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialTabs.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialTabs.prototype.CssClasses_ = {\n    TAB_CLASS: 'mdl-tabs__tab',\n    PANEL_CLASS: 'mdl-tabs__panel',\n    ACTIVE_CLASS: 'is-active',\n    UPGRADED_CLASS: 'is-upgraded',\n    MDL_JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    MDL_RIPPLE_CONTAINER: 'mdl-tabs__ripple-container',\n    MDL_RIPPLE: 'mdl-ripple',\n    MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events'\n};\n/**\n   * Handle clicks to a tabs component\n   *\n   * @private\n   */\nMaterialTabs.prototype.initTabs_ = function () {\n    if (this.element_.classList.contains(this.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {\n        this.element_.classList.add(this.CssClasses_.MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS);\n    }\n    // Select element tabs, document panels\n    this.tabs_ = this.element_.querySelectorAll('.' + this.CssClasses_.TAB_CLASS);\n    this.panels_ = this.element_.querySelectorAll('.' + this.CssClasses_.PANEL_CLASS);\n    // Create new tabs for each tab element\n    for (var i = 0; i < this.tabs_.length; i++) {\n        new MaterialTab(this.tabs_[i], this);\n    }\n    this.element_.classList.add(this.CssClasses_.UPGRADED_CLASS);\n};\n/**\n   * Reset tab state, dropping active classes\n   *\n   * @private\n   */\nMaterialTabs.prototype.resetTabState_ = function () {\n    for (var k = 0; k < this.tabs_.length; k++) {\n        this.tabs_[k].classList.remove(this.CssClasses_.ACTIVE_CLASS);\n    }\n};\n/**\n   * Reset panel state, droping active classes\n   *\n   * @private\n   */\nMaterialTabs.prototype.resetPanelState_ = function () {\n    for (var j = 0; j < this.panels_.length; j++) {\n        this.panels_[j].classList.remove(this.CssClasses_.ACTIVE_CLASS);\n    }\n};\n/**\n   * Initialize element.\n   */\nMaterialTabs.prototype.init = function () {\n    if (this.element_) {\n        this.initTabs_();\n    }\n};\n/**\n   * Constructor for an individual tab.\n   *\n   * @constructor\n   * @param {Element} tab The HTML element for the tab.\n   * @param {MaterialTabs} ctx The MaterialTabs object that owns the tab.\n   */\nfunction MaterialTab(tab, ctx) {\n    if (tab) {\n        if (ctx.element_.classList.contains(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {\n            var rippleContainer = document.createElement('span');\n            rippleContainer.classList.add(ctx.CssClasses_.MDL_RIPPLE_CONTAINER);\n            rippleContainer.classList.add(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT);\n            var ripple = document.createElement('span');\n            ripple.classList.add(ctx.CssClasses_.MDL_RIPPLE);\n            rippleContainer.appendChild(ripple);\n            tab.appendChild(rippleContainer);\n        }\n        tab.addEventListener('click', function (e) {\n            e.preventDefault();\n            var href = tab.href.split('#')[1];\n            var panel = ctx.element_.querySelector('#' + href);\n            ctx.resetTabState_();\n            ctx.resetPanelState_();\n            tab.classList.add(ctx.CssClasses_.ACTIVE_CLASS);\n            panel.classList.add(ctx.CssClasses_.ACTIVE_CLASS);\n        });\n    }\n}\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialTabs,\n    classAsString: 'MaterialTabs',\n    cssClass: 'mdl-js-tabs'\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Textfield MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialTextfield = function MaterialTextfield(element) {\n    this.element_ = element;\n    this.maxRows = this.Constant_.NO_MAX_ROWS;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialTextfield'] = MaterialTextfield;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialTextfield.prototype.Constant_ = {\n    NO_MAX_ROWS: -1,\n    MAX_ROWS_ATTRIBUTE: 'maxrows'\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialTextfield.prototype.CssClasses_ = {\n    LABEL: 'mdl-textfield__label',\n    INPUT: 'mdl-textfield__input',\n    IS_DIRTY: 'is-dirty',\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_INVALID: 'is-invalid',\n    IS_UPGRADED: 'is-upgraded',\n    HAS_PLACEHOLDER: 'has-placeholder'\n};\n/**\n   * Handle input being entered.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTextfield.prototype.onKeyDown_ = function (event) {\n    var currentRowCount = event.target.value.split('\\n').length;\n    if (event.keyCode === 13) {\n        if (currentRowCount >= this.maxRows) {\n            event.preventDefault();\n        }\n    }\n};\n/**\n   * Handle focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTextfield.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTextfield.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle reset event from out side.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTextfield.prototype.onReset_ = function (event) {\n    this.updateClasses_();\n};\n/**\n   * Handle class updates.\n   *\n   * @private\n   */\nMaterialTextfield.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkValidity();\n    this.checkDirty();\n    this.checkFocus();\n};\n// Public methods.\n/**\n   * Check the disabled state and update field accordingly.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.checkDisabled = function () {\n    if (this.input_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialTextfield.prototype['checkDisabled'] = MaterialTextfield.prototype.checkDisabled;\n/**\n  * Check the focus state and update field accordingly.\n  *\n  * @public\n  */\nMaterialTextfield.prototype.checkFocus = function () {\n    if (Boolean(this.element_.querySelector(':focus'))) {\n        this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n    }\n};\nMaterialTextfield.prototype['checkFocus'] = MaterialTextfield.prototype.checkFocus;\n/**\n   * Check the validity state and update field accordingly.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.checkValidity = function () {\n    if (this.input_.validity) {\n        if (this.input_.validity.valid) {\n            this.element_.classList.remove(this.CssClasses_.IS_INVALID);\n        } else {\n            this.element_.classList.add(this.CssClasses_.IS_INVALID);\n        }\n    }\n};\nMaterialTextfield.prototype['checkValidity'] = MaterialTextfield.prototype.checkValidity;\n/**\n   * Check the dirty state and update field accordingly.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.checkDirty = function () {\n    if (this.input_.value && this.input_.value.length > 0) {\n        this.element_.classList.add(this.CssClasses_.IS_DIRTY);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DIRTY);\n    }\n};\nMaterialTextfield.prototype['checkDirty'] = MaterialTextfield.prototype.checkDirty;\n/**\n   * Disable text field.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.disable = function () {\n    this.input_.disabled = true;\n    this.updateClasses_();\n};\nMaterialTextfield.prototype['disable'] = MaterialTextfield.prototype.disable;\n/**\n   * Enable text field.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.enable = function () {\n    this.input_.disabled = false;\n    this.updateClasses_();\n};\nMaterialTextfield.prototype['enable'] = MaterialTextfield.prototype.enable;\n/**\n   * Update text field value.\n   *\n   * @param {string} value The value to which to set the control (optional).\n   * @public\n   */\nMaterialTextfield.prototype.change = function (value) {\n    this.input_.value = value || '';\n    this.updateClasses_();\n};\nMaterialTextfield.prototype['change'] = MaterialTextfield.prototype.change;\n/**\n   * Initialize element.\n   */\nMaterialTextfield.prototype.init = function () {\n    if (this.element_) {\n        this.label_ = this.element_.querySelector('.' + this.CssClasses_.LABEL);\n        this.input_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);\n        if (this.input_) {\n            if (this.input_.hasAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE)) {\n                this.maxRows = parseInt(this.input_.getAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE), 10);\n                if (isNaN(this.maxRows)) {\n                    this.maxRows = this.Constant_.NO_MAX_ROWS;\n                }\n            }\n            if (this.input_.hasAttribute('placeholder')) {\n                this.element_.classList.add(this.CssClasses_.HAS_PLACEHOLDER);\n            }\n            this.boundUpdateClassesHandler = this.updateClasses_.bind(this);\n            this.boundFocusHandler = this.onFocus_.bind(this);\n            this.boundBlurHandler = this.onBlur_.bind(this);\n            this.boundResetHandler = this.onReset_.bind(this);\n            this.input_.addEventListener('input', this.boundUpdateClassesHandler);\n            this.input_.addEventListener('focus', this.boundFocusHandler);\n            this.input_.addEventListener('blur', this.boundBlurHandler);\n            this.input_.addEventListener('reset', this.boundResetHandler);\n            if (this.maxRows !== this.Constant_.NO_MAX_ROWS) {\n                // TODO: This should handle pasting multi line text.\n                // Currently doesn't.\n                this.boundKeyDownHandler = this.onKeyDown_.bind(this);\n                this.input_.addEventListener('keydown', this.boundKeyDownHandler);\n            }\n            var invalid = this.element_.classList.contains(this.CssClasses_.IS_INVALID);\n            this.updateClasses_();\n            this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n            if (invalid) {\n                this.element_.classList.add(this.CssClasses_.IS_INVALID);\n            }\n            if (this.input_.hasAttribute('autofocus')) {\n                this.element_.focus();\n                this.checkFocus();\n            }\n        }\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialTextfield,\n    classAsString: 'MaterialTextfield',\n    cssClass: 'mdl-js-textfield',\n    widget: true\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Tooltip MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialTooltip = function MaterialTooltip(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialTooltip'] = MaterialTooltip;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialTooltip.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialTooltip.prototype.CssClasses_ = {\n    IS_ACTIVE: 'is-active',\n    BOTTOM: 'mdl-tooltip--bottom',\n    LEFT: 'mdl-tooltip--left',\n    RIGHT: 'mdl-tooltip--right',\n    TOP: 'mdl-tooltip--top'\n};\n/**\n   * Handle mouseenter for tooltip.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTooltip.prototype.handleMouseEnter_ = function (event) {\n    var props = event.target.getBoundingClientRect();\n    var left = props.left + props.width / 2;\n    var top = props.top + props.height / 2;\n    var marginLeft = -1 * (this.element_.offsetWidth / 2);\n    var marginTop = -1 * (this.element_.offsetHeight / 2);\n    if (this.element_.classList.contains(this.CssClasses_.LEFT) || this.element_.classList.contains(this.CssClasses_.RIGHT)) {\n        left = props.width / 2;\n        if (top + marginTop < 0) {\n            this.element_.style.top = 0;\n            this.element_.style.marginTop = 0;\n        } else {\n            this.element_.style.top = top + 'px';\n            this.element_.style.marginTop = marginTop + 'px';\n        }\n    } else {\n        if (left + marginLeft < 0) {\n            this.element_.style.left = 0;\n            this.element_.style.marginLeft = 0;\n        } else {\n            this.element_.style.left = left + 'px';\n            this.element_.style.marginLeft = marginLeft + 'px';\n        }\n    }\n    if (this.element_.classList.contains(this.CssClasses_.TOP)) {\n        this.element_.style.top = props.top - this.element_.offsetHeight - 10 + 'px';\n    } else if (this.element_.classList.contains(this.CssClasses_.RIGHT)) {\n        this.element_.style.left = props.left + props.width + 10 + 'px';\n    } else if (this.element_.classList.contains(this.CssClasses_.LEFT)) {\n        this.element_.style.left = props.left - this.element_.offsetWidth - 10 + 'px';\n    } else {\n        this.element_.style.top = props.top + props.height + 10 + 'px';\n    }\n    this.element_.classList.add(this.CssClasses_.IS_ACTIVE);\n};\n/**\n   * Handle mouseleave for tooltip.\n   *\n   * @private\n   */\nMaterialTooltip.prototype.handleMouseLeave_ = function () {\n    this.element_.classList.remove(this.CssClasses_.IS_ACTIVE);\n};\n/**\n   * Initialize element.\n   */\nMaterialTooltip.prototype.init = function () {\n    if (this.element_) {\n        var forElId = this.element_.getAttribute('for');\n        if (forElId) {\n            this.forElement_ = document.getElementById(forElId);\n        }\n        if (this.forElement_) {\n            // It's left here because it prevents accidental text selection on Android\n            if (!this.forElement_.hasAttribute('tabindex')) {\n                this.forElement_.setAttribute('tabindex', '0');\n            }\n            this.boundMouseEnterHandler = this.handleMouseEnter_.bind(this);\n            this.boundMouseLeaveHandler = this.handleMouseLeave_.bind(this);\n            this.forElement_.addEventListener('mouseenter', this.boundMouseEnterHandler, false);\n            this.forElement_.addEventListener('touchend', this.boundMouseEnterHandler, false);\n            this.forElement_.addEventListener('mouseleave', this.boundMouseLeaveHandler, false);\n            window.addEventListener('touchstart', this.boundMouseLeaveHandler);\n        }\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialTooltip,\n    classAsString: 'MaterialTooltip',\n    cssClass: 'mdl-tooltip'\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Layout MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialLayout = function MaterialLayout(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialLayout'] = MaterialLayout;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialLayout.prototype.Constant_ = {\n    MAX_WIDTH: '(max-width: 1024px)',\n    TAB_SCROLL_PIXELS: 100,\n    RESIZE_TIMEOUT: 100,\n    MENU_ICON: '&#xE5D2;',\n    CHEVRON_LEFT: 'chevron_left',\n    CHEVRON_RIGHT: 'chevron_right'\n};\n/**\n   * Keycodes, for code readability.\n   *\n   * @enum {number}\n   * @private\n   */\nMaterialLayout.prototype.Keycodes_ = {\n    ENTER: 13,\n    ESCAPE: 27,\n    SPACE: 32\n};\n/**\n   * Modes.\n   *\n   * @enum {number}\n   * @private\n   */\nMaterialLayout.prototype.Mode_ = {\n    STANDARD: 0,\n    SEAMED: 1,\n    WATERFALL: 2,\n    SCROLL: 3\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialLayout.prototype.CssClasses_ = {\n    CONTAINER: 'mdl-layout__container',\n    HEADER: 'mdl-layout__header',\n    DRAWER: 'mdl-layout__drawer',\n    CONTENT: 'mdl-layout__content',\n    DRAWER_BTN: 'mdl-layout__drawer-button',\n    ICON: 'material-icons',\n    JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_CONTAINER: 'mdl-layout__tab-ripple-container',\n    RIPPLE: 'mdl-ripple',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    HEADER_SEAMED: 'mdl-layout__header--seamed',\n    HEADER_WATERFALL: 'mdl-layout__header--waterfall',\n    HEADER_SCROLL: 'mdl-layout__header--scroll',\n    FIXED_HEADER: 'mdl-layout--fixed-header',\n    OBFUSCATOR: 'mdl-layout__obfuscator',\n    TAB_BAR: 'mdl-layout__tab-bar',\n    TAB_CONTAINER: 'mdl-layout__tab-bar-container',\n    TAB: 'mdl-layout__tab',\n    TAB_BAR_BUTTON: 'mdl-layout__tab-bar-button',\n    TAB_BAR_LEFT_BUTTON: 'mdl-layout__tab-bar-left-button',\n    TAB_BAR_RIGHT_BUTTON: 'mdl-layout__tab-bar-right-button',\n    PANEL: 'mdl-layout__tab-panel',\n    HAS_DRAWER: 'has-drawer',\n    HAS_TABS: 'has-tabs',\n    HAS_SCROLLING_HEADER: 'has-scrolling-header',\n    CASTING_SHADOW: 'is-casting-shadow',\n    IS_COMPACT: 'is-compact',\n    IS_SMALL_SCREEN: 'is-small-screen',\n    IS_DRAWER_OPEN: 'is-visible',\n    IS_ACTIVE: 'is-active',\n    IS_UPGRADED: 'is-upgraded',\n    IS_ANIMATING: 'is-animating',\n    ON_LARGE_SCREEN: 'mdl-layout--large-screen-only',\n    ON_SMALL_SCREEN: 'mdl-layout--small-screen-only'\n};\n/**\n   * Handles scrolling on the content.\n   *\n   * @private\n   */\nMaterialLayout.prototype.contentScrollHandler_ = function () {\n    if (this.header_.classList.contains(this.CssClasses_.IS_ANIMATING)) {\n        return;\n    }\n    var headerVisible = !this.element_.classList.contains(this.CssClasses_.IS_SMALL_SCREEN) || this.element_.classList.contains(this.CssClasses_.FIXED_HEADER);\n    if (this.content_.scrollTop > 0 && !this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {\n        this.header_.classList.add(this.CssClasses_.CASTING_SHADOW);\n        this.header_.classList.add(this.CssClasses_.IS_COMPACT);\n        if (headerVisible) {\n            this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\n        }\n    } else if (this.content_.scrollTop <= 0 && this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {\n        this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW);\n        this.header_.classList.remove(this.CssClasses_.IS_COMPACT);\n        if (headerVisible) {\n            this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\n        }\n    }\n};\n/**\n   * Handles a keyboard event on the drawer.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialLayout.prototype.keyboardEventHandler_ = function (evt) {\n    // Only react when the drawer is open.\n    if (evt.keyCode === this.Keycodes_.ESCAPE && this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {\n        this.toggleDrawer();\n    }\n};\n/**\n   * Handles changes in screen size.\n   *\n   * @private\n   */\nMaterialLayout.prototype.screenSizeHandler_ = function () {\n    if (this.screenSizeMediaQuery_.matches) {\n        this.element_.classList.add(this.CssClasses_.IS_SMALL_SCREEN);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_SMALL_SCREEN);\n        // Collapse drawer (if any) when moving to a large screen size.\n        if (this.drawer_) {\n            this.drawer_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN);\n            this.obfuscator_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN);\n        }\n    }\n};\n/**\n   * Handles events of drawer button.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialLayout.prototype.drawerToggleHandler_ = function (evt) {\n    if (evt && evt.type === 'keydown') {\n        if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {\n            // prevent scrolling in drawer nav\n            evt.preventDefault();\n        } else {\n            // prevent other keys\n            return;\n        }\n    }\n    this.toggleDrawer();\n};\n/**\n   * Handles (un)setting the `is-animating` class\n   *\n   * @private\n   */\nMaterialLayout.prototype.headerTransitionEndHandler_ = function () {\n    this.header_.classList.remove(this.CssClasses_.IS_ANIMATING);\n};\n/**\n   * Handles expanding the header on click\n   *\n   * @private\n   */\nMaterialLayout.prototype.headerClickHandler_ = function () {\n    if (this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {\n        this.header_.classList.remove(this.CssClasses_.IS_COMPACT);\n        this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\n    }\n};\n/**\n   * Reset tab state, dropping active classes\n   *\n   * @private\n   */\nMaterialLayout.prototype.resetTabState_ = function (tabBar) {\n    for (var k = 0; k < tabBar.length; k++) {\n        tabBar[k].classList.remove(this.CssClasses_.IS_ACTIVE);\n    }\n};\n/**\n   * Reset panel state, droping active classes\n   *\n   * @private\n   */\nMaterialLayout.prototype.resetPanelState_ = function (panels) {\n    for (var j = 0; j < panels.length; j++) {\n        panels[j].classList.remove(this.CssClasses_.IS_ACTIVE);\n    }\n};\n/**\n  * Toggle drawer state\n  *\n  * @public\n  */\nMaterialLayout.prototype.toggleDrawer = function () {\n    var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);\n    this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);\n    this.obfuscator_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);\n    // Set accessibility properties.\n    if (this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {\n        this.drawer_.setAttribute('aria-hidden', 'false');\n        drawerButton.setAttribute('aria-expanded', 'true');\n    } else {\n        this.drawer_.setAttribute('aria-hidden', 'true');\n        drawerButton.setAttribute('aria-expanded', 'false');\n    }\n};\nMaterialLayout.prototype['toggleDrawer'] = MaterialLayout.prototype.toggleDrawer;\n/**\n   * Initialize element.\n   */\nMaterialLayout.prototype.init = function () {\n    if (this.element_) {\n        var container = document.createElement('div');\n        container.classList.add(this.CssClasses_.CONTAINER);\n        var focusedElement = this.element_.querySelector(':focus');\n        this.element_.parentElement.insertBefore(container, this.element_);\n        this.element_.parentElement.removeChild(this.element_);\n        container.appendChild(this.element_);\n        if (focusedElement) {\n            focusedElement.focus();\n        }\n        var directChildren = this.element_.childNodes;\n        var numChildren = directChildren.length;\n        for (var c = 0; c < numChildren; c++) {\n            var child = directChildren[c];\n            if (child.classList && child.classList.contains(this.CssClasses_.HEADER)) {\n                this.header_ = child;\n            }\n            if (child.classList && child.classList.contains(this.CssClasses_.DRAWER)) {\n                this.drawer_ = child;\n            }\n            if (child.classList && child.classList.contains(this.CssClasses_.CONTENT)) {\n                this.content_ = child;\n            }\n        }\n        window.addEventListener('pageshow', function (e) {\n            if (e.persisted) {\n                // when page is loaded from back/forward cache\n                // trigger repaint to let layout scroll in safari\n                this.element_.style.overflowY = 'hidden';\n                requestAnimationFrame(function () {\n                    this.element_.style.overflowY = '';\n                }.bind(this));\n            }\n        }.bind(this), false);\n        if (this.header_) {\n            this.tabBar_ = this.header_.querySelector('.' + this.CssClasses_.TAB_BAR);\n        }\n        var mode = this.Mode_.STANDARD;\n        if (this.header_) {\n            if (this.header_.classList.contains(this.CssClasses_.HEADER_SEAMED)) {\n                mode = this.Mode_.SEAMED;\n            } else if (this.header_.classList.contains(this.CssClasses_.HEADER_WATERFALL)) {\n                mode = this.Mode_.WATERFALL;\n                this.header_.addEventListener('transitionend', this.headerTransitionEndHandler_.bind(this));\n                this.header_.addEventListener('click', this.headerClickHandler_.bind(this));\n            } else if (this.header_.classList.contains(this.CssClasses_.HEADER_SCROLL)) {\n                mode = this.Mode_.SCROLL;\n                container.classList.add(this.CssClasses_.HAS_SCROLLING_HEADER);\n            }\n            if (mode === this.Mode_.STANDARD) {\n                this.header_.classList.add(this.CssClasses_.CASTING_SHADOW);\n                if (this.tabBar_) {\n                    this.tabBar_.classList.add(this.CssClasses_.CASTING_SHADOW);\n                }\n            } else if (mode === this.Mode_.SEAMED || mode === this.Mode_.SCROLL) {\n                this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW);\n                if (this.tabBar_) {\n                    this.tabBar_.classList.remove(this.CssClasses_.CASTING_SHADOW);\n                }\n            } else if (mode === this.Mode_.WATERFALL) {\n                // Add and remove shadows depending on scroll position.\n                // Also add/remove auxiliary class for styling of the compact version of\n                // the header.\n                this.content_.addEventListener('scroll', this.contentScrollHandler_.bind(this));\n                this.contentScrollHandler_();\n            }\n        }\n        // Add drawer toggling button to our layout, if we have an openable drawer.\n        if (this.drawer_) {\n            var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);\n            if (!drawerButton) {\n                drawerButton = document.createElement('div');\n                drawerButton.setAttribute('aria-expanded', 'false');\n                drawerButton.setAttribute('role', 'button');\n                drawerButton.setAttribute('tabindex', '0');\n                drawerButton.classList.add(this.CssClasses_.DRAWER_BTN);\n                var drawerButtonIcon = document.createElement('i');\n                drawerButtonIcon.classList.add(this.CssClasses_.ICON);\n                drawerButtonIcon.innerHTML = this.Constant_.MENU_ICON;\n                drawerButton.appendChild(drawerButtonIcon);\n            }\n            if (this.drawer_.classList.contains(this.CssClasses_.ON_LARGE_SCREEN)) {\n                //If drawer has ON_LARGE_SCREEN class then add it to the drawer toggle button as well.\n                drawerButton.classList.add(this.CssClasses_.ON_LARGE_SCREEN);\n            } else if (this.drawer_.classList.contains(this.CssClasses_.ON_SMALL_SCREEN)) {\n                //If drawer has ON_SMALL_SCREEN class then add it to the drawer toggle button as well.\n                drawerButton.classList.add(this.CssClasses_.ON_SMALL_SCREEN);\n            }\n            drawerButton.addEventListener('click', this.drawerToggleHandler_.bind(this));\n            drawerButton.addEventListener('keydown', this.drawerToggleHandler_.bind(this));\n            // Add a class if the layout has a drawer, for altering the left padding.\n            // Adds the HAS_DRAWER to the elements since this.header_ may or may\n            // not be present.\n            this.element_.classList.add(this.CssClasses_.HAS_DRAWER);\n            // If we have a fixed header, add the button to the header rather than\n            // the layout.\n            if (this.element_.classList.contains(this.CssClasses_.FIXED_HEADER)) {\n                this.header_.insertBefore(drawerButton, this.header_.firstChild);\n            } else {\n                this.element_.insertBefore(drawerButton, this.content_);\n            }\n            var obfuscator = document.createElement('div');\n            obfuscator.classList.add(this.CssClasses_.OBFUSCATOR);\n            this.element_.appendChild(obfuscator);\n            obfuscator.addEventListener('click', this.drawerToggleHandler_.bind(this));\n            this.obfuscator_ = obfuscator;\n            this.drawer_.addEventListener('keydown', this.keyboardEventHandler_.bind(this));\n            this.drawer_.setAttribute('aria-hidden', 'true');\n        }\n        // Keep an eye on screen size, and add/remove auxiliary class for styling\n        // of small screens.\n        this.screenSizeMediaQuery_ = window.matchMedia(this.Constant_.MAX_WIDTH);\n        this.screenSizeMediaQuery_.addListener(this.screenSizeHandler_.bind(this));\n        this.screenSizeHandler_();\n        // Initialize tabs, if any.\n        if (this.header_ && this.tabBar_) {\n            this.element_.classList.add(this.CssClasses_.HAS_TABS);\n            var tabContainer = document.createElement('div');\n            tabContainer.classList.add(this.CssClasses_.TAB_CONTAINER);\n            this.header_.insertBefore(tabContainer, this.tabBar_);\n            this.header_.removeChild(this.tabBar_);\n            var leftButton = document.createElement('div');\n            leftButton.classList.add(this.CssClasses_.TAB_BAR_BUTTON);\n            leftButton.classList.add(this.CssClasses_.TAB_BAR_LEFT_BUTTON);\n            var leftButtonIcon = document.createElement('i');\n            leftButtonIcon.classList.add(this.CssClasses_.ICON);\n            leftButtonIcon.textContent = this.Constant_.CHEVRON_LEFT;\n            leftButton.appendChild(leftButtonIcon);\n            leftButton.addEventListener('click', function () {\n                this.tabBar_.scrollLeft -= this.Constant_.TAB_SCROLL_PIXELS;\n            }.bind(this));\n            var rightButton = document.createElement('div');\n            rightButton.classList.add(this.CssClasses_.TAB_BAR_BUTTON);\n            rightButton.classList.add(this.CssClasses_.TAB_BAR_RIGHT_BUTTON);\n            var rightButtonIcon = document.createElement('i');\n            rightButtonIcon.classList.add(this.CssClasses_.ICON);\n            rightButtonIcon.textContent = this.Constant_.CHEVRON_RIGHT;\n            rightButton.appendChild(rightButtonIcon);\n            rightButton.addEventListener('click', function () {\n                this.tabBar_.scrollLeft += this.Constant_.TAB_SCROLL_PIXELS;\n            }.bind(this));\n            tabContainer.appendChild(leftButton);\n            tabContainer.appendChild(this.tabBar_);\n            tabContainer.appendChild(rightButton);\n            // Add and remove tab buttons depending on scroll position and total\n            // window size.\n            var tabUpdateHandler = function () {\n                if (this.tabBar_.scrollLeft > 0) {\n                    leftButton.classList.add(this.CssClasses_.IS_ACTIVE);\n                } else {\n                    leftButton.classList.remove(this.CssClasses_.IS_ACTIVE);\n                }\n                if (this.tabBar_.scrollLeft < this.tabBar_.scrollWidth - this.tabBar_.offsetWidth) {\n                    rightButton.classList.add(this.CssClasses_.IS_ACTIVE);\n                } else {\n                    rightButton.classList.remove(this.CssClasses_.IS_ACTIVE);\n                }\n            }.bind(this);\n            this.tabBar_.addEventListener('scroll', tabUpdateHandler);\n            tabUpdateHandler();\n            // Update tabs when the window resizes.\n            var windowResizeHandler = function () {\n                // Use timeouts to make sure it doesn't happen too often.\n                if (this.resizeTimeoutId_) {\n                    clearTimeout(this.resizeTimeoutId_);\n                }\n                this.resizeTimeoutId_ = setTimeout(function () {\n                    tabUpdateHandler();\n                    this.resizeTimeoutId_ = null;\n                }.bind(this), this.Constant_.RESIZE_TIMEOUT);\n            }.bind(this);\n            window.addEventListener('resize', windowResizeHandler);\n            if (this.tabBar_.classList.contains(this.CssClasses_.JS_RIPPLE_EFFECT)) {\n                this.tabBar_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            }\n            // Select element tabs, document panels\n            var tabs = this.tabBar_.querySelectorAll('.' + this.CssClasses_.TAB);\n            var panels = this.content_.querySelectorAll('.' + this.CssClasses_.PANEL);\n            // Create new tabs for each tab element\n            for (var i = 0; i < tabs.length; i++) {\n                new MaterialLayoutTab(tabs[i], tabs, panels, this);\n            }\n        }\n        this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n/**\n   * Constructor for an individual tab.\n   *\n   * @constructor\n   * @param {HTMLElement} tab The HTML element for the tab.\n   * @param {!Array<HTMLElement>} tabs Array with HTML elements for all tabs.\n   * @param {!Array<HTMLElement>} panels Array with HTML elements for all panels.\n   * @param {MaterialLayout} layout The MaterialLayout object that owns the tab.\n   */\nfunction MaterialLayoutTab(tab, tabs, panels, layout) {\n    /**\n     * Auxiliary method to programmatically select a tab in the UI.\n     */\n    function selectTab() {\n        var href = tab.href.split('#')[1];\n        var panel = layout.content_.querySelector('#' + href);\n        layout.resetTabState_(tabs);\n        layout.resetPanelState_(panels);\n        tab.classList.add(layout.CssClasses_.IS_ACTIVE);\n        panel.classList.add(layout.CssClasses_.IS_ACTIVE);\n    }\n    if (layout.tabBar_.classList.contains(layout.CssClasses_.JS_RIPPLE_EFFECT)) {\n        var rippleContainer = document.createElement('span');\n        rippleContainer.classList.add(layout.CssClasses_.RIPPLE_CONTAINER);\n        rippleContainer.classList.add(layout.CssClasses_.JS_RIPPLE_EFFECT);\n        var ripple = document.createElement('span');\n        ripple.classList.add(layout.CssClasses_.RIPPLE);\n        rippleContainer.appendChild(ripple);\n        tab.appendChild(rippleContainer);\n    }\n    tab.addEventListener('click', function (e) {\n        if (tab.getAttribute('href').charAt(0) === '#') {\n            e.preventDefault();\n            selectTab();\n        }\n    });\n    tab.show = selectTab;\n}\nwindow['MaterialLayoutTab'] = MaterialLayoutTab;\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialLayout,\n    classAsString: 'MaterialLayout',\n    cssClass: 'mdl-js-layout'\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Data Table Card MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\nvar MaterialDataTable = function MaterialDataTable(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialDataTable'] = MaterialDataTable;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialDataTable.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialDataTable.prototype.CssClasses_ = {\n    DATA_TABLE: 'mdl-data-table',\n    SELECTABLE: 'mdl-data-table--selectable',\n    SELECT_ELEMENT: 'mdl-data-table__select',\n    IS_SELECTED: 'is-selected',\n    IS_UPGRADED: 'is-upgraded'\n};\n/**\n   * Generates and returns a function that toggles the selection state of a\n   * single row (or multiple rows).\n   *\n   * @param {Element} checkbox Checkbox that toggles the selection state.\n   * @param {Element} row Row to toggle when checkbox changes.\n   * @param {(Array<Object>|NodeList)=} opt_rows Rows to toggle when checkbox changes.\n   * @private\n   */\nMaterialDataTable.prototype.selectRow_ = function (checkbox, row, opt_rows) {\n    if (row) {\n        return function () {\n            if (checkbox.checked) {\n                row.classList.add(this.CssClasses_.IS_SELECTED);\n            } else {\n                row.classList.remove(this.CssClasses_.IS_SELECTED);\n            }\n        }.bind(this);\n    }\n    if (opt_rows) {\n        return function () {\n            var i;\n            var el;\n            if (checkbox.checked) {\n                for (i = 0; i < opt_rows.length; i++) {\n                    el = opt_rows[i].querySelector('td').querySelector('.mdl-checkbox');\n                    el['MaterialCheckbox'].check();\n                    opt_rows[i].classList.add(this.CssClasses_.IS_SELECTED);\n                }\n            } else {\n                for (i = 0; i < opt_rows.length; i++) {\n                    el = opt_rows[i].querySelector('td').querySelector('.mdl-checkbox');\n                    el['MaterialCheckbox'].uncheck();\n                    opt_rows[i].classList.remove(this.CssClasses_.IS_SELECTED);\n                }\n            }\n        }.bind(this);\n    }\n};\n/**\n   * Creates a checkbox for a single or or multiple rows and hooks up the\n   * event handling.\n   *\n   * @param {Element} row Row to toggle when checkbox changes.\n   * @param {(Array<Object>|NodeList)=} opt_rows Rows to toggle when checkbox changes.\n   * @private\n   */\nMaterialDataTable.prototype.createCheckbox_ = function (row, opt_rows) {\n    var label = document.createElement('label');\n    var labelClasses = [\n        'mdl-checkbox',\n        'mdl-js-checkbox',\n        'mdl-js-ripple-effect',\n        this.CssClasses_.SELECT_ELEMENT\n    ];\n    label.className = labelClasses.join(' ');\n    var checkbox = document.createElement('input');\n    checkbox.type = 'checkbox';\n    checkbox.classList.add('mdl-checkbox__input');\n    if (row) {\n        checkbox.checked = row.classList.contains(this.CssClasses_.IS_SELECTED);\n        checkbox.addEventListener('change', this.selectRow_(checkbox, row));\n    } else if (opt_rows) {\n        checkbox.addEventListener('change', this.selectRow_(checkbox, null, opt_rows));\n    }\n    label.appendChild(checkbox);\n    componentHandler.upgradeElement(label, 'MaterialCheckbox');\n    return label;\n};\n/**\n   * Initialize element.\n   */\nMaterialDataTable.prototype.init = function () {\n    if (this.element_) {\n        var firstHeader = this.element_.querySelector('th');\n        var bodyRows = Array.prototype.slice.call(this.element_.querySelectorAll('tbody tr'));\n        var footRows = Array.prototype.slice.call(this.element_.querySelectorAll('tfoot tr'));\n        var rows = bodyRows.concat(footRows);\n        if (this.element_.classList.contains(this.CssClasses_.SELECTABLE)) {\n            var th = document.createElement('th');\n            var headerCheckbox = this.createCheckbox_(null, rows);\n            th.appendChild(headerCheckbox);\n            firstHeader.parentElement.insertBefore(th, firstHeader);\n            for (var i = 0; i < rows.length; i++) {\n                var firstCell = rows[i].querySelector('td');\n                if (firstCell) {\n                    var td = document.createElement('td');\n                    if (rows[i].parentNode.nodeName.toUpperCase() === 'TBODY') {\n                        var rowCheckbox = this.createCheckbox_(rows[i]);\n                        td.appendChild(rowCheckbox);\n                    }\n                    rows[i].insertBefore(td, firstCell);\n                }\n            }\n            this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n        }\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialDataTable,\n    classAsString: 'MaterialDataTable',\n    cssClass: 'mdl-js-data-table'\n});\n/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Ripple MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialRipple = function MaterialRipple(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialRipple'] = MaterialRipple;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialRipple.prototype.Constant_ = {\n    INITIAL_SCALE: 'scale(0.0001, 0.0001)',\n    INITIAL_SIZE: '1px',\n    INITIAL_OPACITY: '0.4',\n    FINAL_OPACITY: '0',\n    FINAL_SCALE: ''\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialRipple.prototype.CssClasses_ = {\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE_EFFECT_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE: 'mdl-ripple',\n    IS_ANIMATING: 'is-animating',\n    IS_VISIBLE: 'is-visible'\n};\n/**\n   * Handle mouse / finger down on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRipple.prototype.downHandler_ = function (event) {\n    if (!this.rippleElement_.style.width && !this.rippleElement_.style.height) {\n        var rect = this.element_.getBoundingClientRect();\n        this.boundHeight = rect.height;\n        this.boundWidth = rect.width;\n        this.rippleSize_ = Math.sqrt(rect.width * rect.width + rect.height * rect.height) * 2 + 2;\n        this.rippleElement_.style.width = this.rippleSize_ + 'px';\n        this.rippleElement_.style.height = this.rippleSize_ + 'px';\n    }\n    this.rippleElement_.classList.add(this.CssClasses_.IS_VISIBLE);\n    if (event.type === 'mousedown' && this.ignoringMouseDown_) {\n        this.ignoringMouseDown_ = false;\n    } else {\n        if (event.type === 'touchstart') {\n            this.ignoringMouseDown_ = true;\n        }\n        var frameCount = this.getFrameCount();\n        if (frameCount > 0) {\n            return;\n        }\n        this.setFrameCount(1);\n        var bound = event.currentTarget.getBoundingClientRect();\n        var x;\n        var y;\n        // Check if we are handling a keyboard click.\n        if (event.clientX === 0 && event.clientY === 0) {\n            x = Math.round(bound.width / 2);\n            y = Math.round(bound.height / 2);\n        } else {\n            var clientX = event.clientX ? event.clientX : event.touches[0].clientX;\n            var clientY = event.clientY ? event.clientY : event.touches[0].clientY;\n            x = Math.round(clientX - bound.left);\n            y = Math.round(clientY - bound.top);\n        }\n        this.setRippleXY(x, y);\n        this.setRippleStyles(true);\n        window.requestAnimationFrame(this.animFrameHandler.bind(this));\n    }\n};\n/**\n   * Handle mouse / finger up on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRipple.prototype.upHandler_ = function (event) {\n    // Don't fire for the artificial \"mouseup\" generated by a double-click.\n    if (event && event.detail !== 2) {\n        // Allow a repaint to occur before removing this class, so the animation\n        // shows for tap events, which seem to trigger a mouseup too soon after\n        // mousedown.\n        window.setTimeout(function () {\n            this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE);\n        }.bind(this), 0);\n    }\n};\n/**\n   * Initialize element.\n   */\nMaterialRipple.prototype.init = function () {\n    if (this.element_) {\n        var recentering = this.element_.classList.contains(this.CssClasses_.RIPPLE_CENTER);\n        if (!this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT_IGNORE_EVENTS)) {\n            this.rippleElement_ = this.element_.querySelector('.' + this.CssClasses_.RIPPLE);\n            this.frameCount_ = 0;\n            this.rippleSize_ = 0;\n            this.x_ = 0;\n            this.y_ = 0;\n            // Touch start produces a compat mouse down event, which would cause a\n            // second ripples. To avoid that, we use this property to ignore the first\n            // mouse down after a touch start.\n            this.ignoringMouseDown_ = false;\n            this.boundDownHandler = this.downHandler_.bind(this);\n            this.element_.addEventListener('mousedown', this.boundDownHandler);\n            this.element_.addEventListener('touchstart', this.boundDownHandler);\n            this.boundUpHandler = this.upHandler_.bind(this);\n            this.element_.addEventListener('mouseup', this.boundUpHandler);\n            this.element_.addEventListener('mouseleave', this.boundUpHandler);\n            this.element_.addEventListener('touchend', this.boundUpHandler);\n            this.element_.addEventListener('blur', this.boundUpHandler);\n            /**\n         * Getter for frameCount_.\n         * @return {number} the frame count.\n         */\n            this.getFrameCount = function () {\n                return this.frameCount_;\n            };\n            /**\n         * Setter for frameCount_.\n         * @param {number} fC the frame count.\n         */\n            this.setFrameCount = function (fC) {\n                this.frameCount_ = fC;\n            };\n            /**\n         * Getter for rippleElement_.\n         * @return {Element} the ripple element.\n         */\n            this.getRippleElement = function () {\n                return this.rippleElement_;\n            };\n            /**\n         * Sets the ripple X and Y coordinates.\n         * @param  {number} newX the new X coordinate\n         * @param  {number} newY the new Y coordinate\n         */\n            this.setRippleXY = function (newX, newY) {\n                this.x_ = newX;\n                this.y_ = newY;\n            };\n            /**\n         * Sets the ripple styles.\n         * @param  {boolean} start whether or not this is the start frame.\n         */\n            this.setRippleStyles = function (start) {\n                if (this.rippleElement_ !== null) {\n                    var transformString;\n                    var scale;\n                    var size;\n                    var offset = 'translate(' + this.x_ + 'px, ' + this.y_ + 'px)';\n                    if (start) {\n                        scale = this.Constant_.INITIAL_SCALE;\n                        size = this.Constant_.INITIAL_SIZE;\n                    } else {\n                        scale = this.Constant_.FINAL_SCALE;\n                        size = this.rippleSize_ + 'px';\n                        if (recentering) {\n                            offset = 'translate(' + this.boundWidth / 2 + 'px, ' + this.boundHeight / 2 + 'px)';\n                        }\n                    }\n                    transformString = 'translate(-50%, -50%) ' + offset + scale;\n                    this.rippleElement_.style.webkitTransform = transformString;\n                    this.rippleElement_.style.msTransform = transformString;\n                    this.rippleElement_.style.transform = transformString;\n                    if (start) {\n                        this.rippleElement_.classList.remove(this.CssClasses_.IS_ANIMATING);\n                    } else {\n                        this.rippleElement_.classList.add(this.CssClasses_.IS_ANIMATING);\n                    }\n                }\n            };\n            /**\n         * Handles an animation frame.\n         */\n            this.animFrameHandler = function () {\n                if (this.frameCount_-- > 0) {\n                    window.requestAnimationFrame(this.animFrameHandler.bind(this));\n                } else {\n                    this.setRippleStyles(false);\n                }\n            };\n        }\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialRipple,\n    classAsString: 'MaterialRipple',\n    cssClass: 'mdl-js-ripple-effect',\n    widget: false\n});\n}());\n","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 * A component handler interface using the revealing module design pattern.\n * More details on this design pattern here:\n * https://github.com/jasonmayes/mdl-component-design-pattern\n *\n * @author Jason Mayes.\n */\n/* exported componentHandler */\n\n// Pre-defining the componentHandler interface, for closure documentation and\n// static verification.\nvar componentHandler = {\n  /**\n   * Searches existing DOM for elements of our component type and upgrades them\n   * if they have not already been upgraded.\n   *\n   * @param {string=} optJsClass the programatic name of the element class we\n   * need to create a new instance of.\n   * @param {string=} optCssClass the name of the CSS class elements of this\n   * type will have.\n   */\n  upgradeDom: function(optJsClass, optCssClass) {},\n  /**\n   * Upgrades a specific element rather than all in the DOM.\n   *\n   * @param {!Element} element The element we wish to upgrade.\n   * @param {string=} optJsClass Optional name of the class we want to upgrade\n   * the element to.\n   */\n  upgradeElement: function(element, optJsClass) {},\n  /**\n   * Upgrades a specific list of elements rather than all in the DOM.\n   *\n   * @param {!Element|!Array<!Element>|!NodeList|!HTMLCollection} elements\n   * The elements we wish to upgrade.\n   */\n  upgradeElements: function(elements) {},\n  /**\n   * Upgrades all registered components found in the current DOM. This is\n   * automatically called on window load.\n   */\n  upgradeAllRegistered: function() {},\n  /**\n   * Allows user to be alerted to any upgrades that are performed for a given\n   * component type\n   *\n   * @param {string} jsClass The class name of the MDL component we wish\n   * to hook into for any upgrades performed.\n   * @param {function(!HTMLElement)} callback The function to call upon an\n   * upgrade. This function should expect 1 parameter - the HTMLElement which\n   * got upgraded.\n   */\n  registerUpgradedCallback: function(jsClass, callback) {},\n  /**\n   * Registers a class for future use and attempts to upgrade existing DOM.\n   *\n   * @param {componentHandler.ComponentConfigPublic} config the registration configuration\n   */\n  register: function(config) {},\n  /**\n   * Downgrade either a given node, an array of nodes, or a NodeList.\n   *\n   * @param {!Node|!Array<!Node>|!NodeList} nodes\n   */\n  downgradeElements: function(nodes) {}\n};\n\ncomponentHandler = (function() {\n  'use strict';\n\n  /** @type {!Array<componentHandler.ComponentConfig>} */\n  var registeredComponents_ = [];\n\n  /** @type {!Array<componentHandler.Component>} */\n  var createdComponents_ = [];\n\n  var componentConfigProperty_ = 'mdlComponentConfigInternal_';\n\n  /**\n   * Searches registered components for a class we are interested in using.\n   * Optionally replaces a match with passed object if specified.\n   *\n   * @param {string} name The name of a class we want to use.\n   * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.\n   * @return {!Object|boolean}\n   * @private\n   */\n  function findRegisteredClass_(name, optReplace) {\n    for (var i = 0; i < registeredComponents_.length; i++) {\n      if (registeredComponents_[i].className === name) {\n        if (typeof optReplace !== 'undefined') {\n          registeredComponents_[i] = optReplace;\n        }\n        return registeredComponents_[i];\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Returns an array of the classNames of the upgraded classes on the element.\n   *\n   * @param {!Element} element The element to fetch data from.\n   * @return {!Array<string>}\n   * @private\n   */\n  function getUpgradedListOfElement_(element) {\n    var dataUpgraded = element.getAttribute('data-upgraded');\n    // Use `['']` as default value to conform the `,name,name...` style.\n    return dataUpgraded === null ? [''] : dataUpgraded.split(',');\n  }\n\n  /**\n   * Returns true if the given element has already been upgraded for the given\n   * class.\n   *\n   * @param {!Element} element The element we want to check.\n   * @param {string} jsClass The class to check for.\n   * @returns {boolean}\n   * @private\n   */\n  function isElementUpgraded_(element, jsClass) {\n    var upgradedList = getUpgradedListOfElement_(element);\n    return upgradedList.indexOf(jsClass) !== -1;\n  }\n\n  /**\n   * Searches existing DOM for elements of our component type and upgrades them\n   * if they have not already been upgraded.\n   *\n   * @param {string=} optJsClass the programatic name of the element class we\n   * need to create a new instance of.\n   * @param {string=} optCssClass the name of the CSS class elements of this\n   * type will have.\n   */\n  function upgradeDomInternal(optJsClass, optCssClass) {\n    if (typeof optJsClass === 'undefined' &&\n        typeof optCssClass === 'undefined') {\n      for (var i = 0; i < registeredComponents_.length; i++) {\n        upgradeDomInternal(registeredComponents_[i].className,\n            registeredComponents_[i].cssClass);\n      }\n    } else {\n      var jsClass = /** @type {string} */ (optJsClass);\n      if (typeof optCssClass === 'undefined') {\n        var registeredClass = findRegisteredClass_(jsClass);\n        if (registeredClass) {\n          optCssClass = registeredClass.cssClass;\n        }\n      }\n\n      var elements = document.querySelectorAll('.' + optCssClass);\n      for (var n = 0; n < elements.length; n++) {\n        upgradeElementInternal(elements[n], jsClass);\n      }\n    }\n  }\n\n  /**\n   * Upgrades a specific element rather than all in the DOM.\n   *\n   * @param {!Element} element The element we wish to upgrade.\n   * @param {string=} optJsClass Optional name of the class we want to upgrade\n   * the element to.\n   */\n  function upgradeElementInternal(element, optJsClass) {\n    // Verify argument type.\n    if (!(typeof element === 'object' && element instanceof Element)) {\n      throw new Error('Invalid argument provided to upgrade MDL element.');\n    }\n    var upgradedList = getUpgradedListOfElement_(element);\n    var classesToUpgrade = [];\n    // If jsClass is not provided scan the registered components to find the\n    // ones matching the element's CSS classList.\n    if (!optJsClass) {\n      var classList = element.classList;\n      registeredComponents_.forEach(function(component) {\n        // Match CSS & Not to be upgraded & Not upgraded.\n        if (classList.contains(component.cssClass) &&\n            classesToUpgrade.indexOf(component) === -1 &&\n            !isElementUpgraded_(element, component.className)) {\n          classesToUpgrade.push(component);\n        }\n      });\n    } else if (!isElementUpgraded_(element, optJsClass)) {\n      classesToUpgrade.push(findRegisteredClass_(optJsClass));\n    }\n\n    // Upgrade the element for each classes.\n    for (var i = 0, n = classesToUpgrade.length, registeredClass; i < n; i++) {\n      registeredClass = classesToUpgrade[i];\n      if (registeredClass) {\n        // Mark element as upgraded.\n        upgradedList.push(registeredClass.className);\n        element.setAttribute('data-upgraded', upgradedList.join(','));\n        var instance = new registeredClass.classConstructor(element);\n        instance[componentConfigProperty_] = registeredClass;\n        createdComponents_.push(instance);\n        // Call any callbacks the user has registered with this component type.\n        for (var j = 0, m = registeredClass.callbacks.length; j < m; j++) {\n          registeredClass.callbacks[j](element);\n        }\n\n        if (registeredClass.widget) {\n          // Assign per element instance for control over API\n          element[registeredClass.className] = instance;\n        }\n      } else {\n        throw new Error(\n          'Unable to find a registered component for the given class.');\n      }\n\n      var ev;\n      if ('CustomEvent' in window && typeof window.CustomEvent === 'function') {\n        ev = new Event('mdl-componentupgraded', {\n          'bubbles': true, 'cancelable': false\n        });\n      } else {\n        ev = document.createEvent('Events');\n        ev.initEvent('mdl-componentupgraded', true, true);\n      }\n      element.dispatchEvent(ev);\n    }\n  }\n\n  /**\n   * Upgrades a specific list of elements rather than all in the DOM.\n   *\n   * @param {!Element|!Array<!Element>|!NodeList|!HTMLCollection} elements\n   * The elements we wish to upgrade.\n   */\n  function upgradeElementsInternal(elements) {\n    if (!Array.isArray(elements)) {\n      if (typeof elements.item === 'function') {\n        elements = Array.prototype.slice.call(/** @type {Array} */ (elements));\n      } else {\n        elements = [elements];\n      }\n    }\n    for (var i = 0, n = elements.length, element; i < n; i++) {\n      element = elements[i];\n      if (element instanceof HTMLElement) {\n        upgradeElementInternal(element);\n        if (element.children.length > 0) {\n          upgradeElementsInternal(element.children);\n        }\n      }\n    }\n  }\n\n  /**\n   * Registers a class for future use and attempts to upgrade existing DOM.\n   *\n   * @param {componentHandler.ComponentConfigPublic} config\n   */\n  function registerInternal(config) {\n    // In order to support both Closure-compiled and uncompiled code accessing\n    // this method, we need to allow for both the dot and array syntax for\n    // property access. You'll therefore see the `foo.bar || foo['bar']`\n    // pattern repeated across this method.\n    var widgetMissing = (typeof config.widget === 'undefined' &&\n        typeof config['widget'] === 'undefined');\n    var widget = true;\n\n    if (!widgetMissing) {\n      widget = config.widget || config['widget'];\n    }\n\n    var newConfig = /** @type {componentHandler.ComponentConfig} */ ({\n      classConstructor: config.constructor || config['constructor'],\n      className: config.classAsString || config['classAsString'],\n      cssClass: config.cssClass || config['cssClass'],\n      widget: widget,\n      callbacks: []\n    });\n\n    registeredComponents_.forEach(function(item) {\n      if (item.cssClass === newConfig.cssClass) {\n        throw new Error('The provided cssClass has already been registered: ' + item.cssClass);\n      }\n      if (item.className === newConfig.className) {\n        throw new Error('The provided className has already been registered');\n      }\n    });\n\n    if (config.constructor.prototype\n        .hasOwnProperty(componentConfigProperty_)) {\n      throw new Error(\n          'MDL component classes must not have ' + componentConfigProperty_ +\n          ' defined as a property.');\n    }\n\n    var found = findRegisteredClass_(config.classAsString, newConfig);\n\n    if (!found) {\n      registeredComponents_.push(newConfig);\n    }\n  }\n\n  /**\n   * Allows user to be alerted to any upgrades that are performed for a given\n   * component type\n   *\n   * @param {string} jsClass The class name of the MDL component we wish\n   * to hook into for any upgrades performed.\n   * @param {function(!HTMLElement)} callback The function to call upon an\n   * upgrade. This function should expect 1 parameter - the HTMLElement which\n   * got upgraded.\n   */\n  function registerUpgradedCallbackInternal(jsClass, callback) {\n    var regClass = findRegisteredClass_(jsClass);\n    if (regClass) {\n      regClass.callbacks.push(callback);\n    }\n  }\n\n  /**\n   * Upgrades all registered components found in the current DOM. This is\n   * automatically called on window load.\n   */\n  function upgradeAllRegisteredInternal() {\n    for (var n = 0; n < registeredComponents_.length; n++) {\n      upgradeDomInternal(registeredComponents_[n].className);\n    }\n  }\n\n  /**\n   * Check the component for the downgrade method.\n   * Execute if found.\n   * Remove component from createdComponents list.\n   *\n   * @param {?componentHandler.Component} component\n   */\n  function deconstructComponentInternal(component) {\n    if (component) {\n      var componentIndex = createdComponents_.indexOf(component);\n      createdComponents_.splice(componentIndex, 1);\n\n      var upgrades = component.element_.getAttribute('data-upgraded').split(',');\n      var componentPlace = upgrades.indexOf(component[componentConfigProperty_].classAsString);\n      upgrades.splice(componentPlace, 1);\n      component.element_.setAttribute('data-upgraded', upgrades.join(','));\n\n      var ev;\n      if ('CustomEvent' in window && typeof window.CustomEvent === 'function') {\n        ev = new Event('mdl-componentdowngraded', {\n          'bubbles': true, 'cancelable': false\n        });\n      } else {\n        ev = document.createEvent('Events');\n        ev.initEvent('mdl-componentdowngraded', true, true);\n      }\n    }\n  }\n\n  /**\n   * Downgrade either a given node, an array of nodes, or a NodeList.\n   *\n   * @param {!Node|!Array<!Node>|!NodeList} nodes\n   */\n  function downgradeNodesInternal(nodes) {\n    /**\n     * Auxiliary function to downgrade a single node.\n     * @param  {!Node} node the node to be downgraded\n     */\n    var downgradeNode = function(node) {\n      createdComponents_.filter(function(item) {\n        return item.element_ === node;\n      }).forEach(deconstructComponentInternal);\n    };\n    if (nodes instanceof Array || nodes instanceof NodeList) {\n      for (var n = 0; n < nodes.length; n++) {\n        downgradeNode(nodes[n]);\n      }\n    } else if (nodes instanceof Node) {\n      downgradeNode(nodes);\n    } else {\n      throw new Error('Invalid argument provided to downgrade MDL nodes.');\n    }\n  }\n\n  // Now return the functions that should be made public with their publicly\n  // facing names...\n  return {\n    upgradeDom: upgradeDomInternal,\n    upgradeElement: upgradeElementInternal,\n    upgradeElements: upgradeElementsInternal,\n    upgradeAllRegistered: upgradeAllRegisteredInternal,\n    registerUpgradedCallback: registerUpgradedCallbackInternal,\n    register: registerInternal,\n    downgradeElements: downgradeNodesInternal\n  };\n})();\n\n/**\n * Describes the type of a registered component type managed by\n * componentHandler. Provided for benefit of the Closure compiler.\n *\n * @typedef {{\n *   constructor: Function,\n *   classAsString: string,\n *   cssClass: string,\n *   widget: (string|boolean|undefined)\n * }}\n */\ncomponentHandler.ComponentConfigPublic;  // jshint ignore:line\n\n/**\n * Describes the type of a registered component type managed by\n * componentHandler. Provided for benefit of the Closure compiler.\n *\n * @typedef {{\n *   constructor: !Function,\n *   className: string,\n *   cssClass: string,\n *   widget: (string|boolean),\n *   callbacks: !Array<function(!HTMLElement)>\n * }}\n */\ncomponentHandler.ComponentConfig;  // jshint ignore:line\n\n/**\n * Created component (i.e., upgraded element) type as managed by\n * componentHandler. Provided for benefit of the Closure compiler.\n *\n * @typedef {{\n *   element_: !HTMLElement,\n *   className: string,\n *   classAsString: string,\n *   cssClass: string,\n *   widget: string\n * }}\n */\ncomponentHandler.Component;  // jshint ignore:line\n\n// Export all symbols, for the benefit of Closure compiler.\n// No effect on uncompiled code.\ncomponentHandler['upgradeDom'] = componentHandler.upgradeDom;\ncomponentHandler['upgradeElement'] = componentHandler.upgradeElement;\ncomponentHandler['upgradeElements'] = componentHandler.upgradeElements;\ncomponentHandler['upgradeAllRegistered'] =\n    componentHandler.upgradeAllRegistered;\ncomponentHandler['registerUpgradedCallback'] =\n    componentHandler.registerUpgradedCallback;\ncomponentHandler['register'] = componentHandler.register;\ncomponentHandler['downgradeElements'] = componentHandler.downgradeElements;\nwindow.componentHandler = componentHandler;\nwindow['componentHandler'] = componentHandler;\n\nwindow.addEventListener('load', function() {\n  'use strict';\n\n  /**\n   * Performs a \"Cutting the mustard\" test. If the browser supports the features\n   * tested, adds a mdl-js class to the <html> element. It then upgrades all MDL\n   * components requiring JavaScript.\n   */\n  if ('classList' in document.createElement('div') &&\n      'querySelector' in document &&\n      'addEventListener' in window && Array.prototype.forEach) {\n    document.documentElement.classList.add('mdl-js');\n    componentHandler.upgradeAllRegistered();\n  } else {\n    /**\n     * Dummy function to avoid JS errors.\n     */\n    componentHandler.upgradeElement = function() {};\n    /**\n     * Dummy function to avoid JS errors.\n     */\n    componentHandler.register = function() {};\n  }\n});\n","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Tabs MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\nvar MaterialTabs = function MaterialTabs(element) {\n    // Stores the HTML element.\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialTabs'] = MaterialTabs;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialTabs.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialTabs.prototype.CssClasses_ = {\n    TAB_CLASS: 'mdl-tabs__tab',\n    PANEL_CLASS: 'mdl-tabs__panel',\n    ACTIVE_CLASS: 'is-active',\n    UPGRADED_CLASS: 'is-upgraded',\n    MDL_JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    MDL_RIPPLE_CONTAINER: 'mdl-tabs__ripple-container',\n    MDL_RIPPLE: 'mdl-ripple',\n    MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events'\n};\n/**\n   * Handle clicks to a tabs component\n   *\n   * @private\n   */\nMaterialTabs.prototype.initTabs_ = function () {\n    if (this.element_.classList.contains(this.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {\n        this.element_.classList.add(this.CssClasses_.MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS);\n    }\n    // Select element tabs, document panels\n    this.tabs_ = this.element_.querySelectorAll('.' + this.CssClasses_.TAB_CLASS);\n    this.panels_ = this.element_.querySelectorAll('.' + this.CssClasses_.PANEL_CLASS);\n    // Create new tabs for each tab element\n    for (var i = 0; i < this.tabs_.length; i++) {\n        new MaterialTab(this.tabs_[i], this);\n    }\n    this.element_.classList.add(this.CssClasses_.UPGRADED_CLASS);\n};\n/**\n   * Reset tab state, dropping active classes\n   *\n   * @private\n   */\nMaterialTabs.prototype.resetTabState_ = function () {\n    for (var k = 0; k < this.tabs_.length; k++) {\n        this.tabs_[k].classList.remove(this.CssClasses_.ACTIVE_CLASS);\n    }\n};\n/**\n   * Reset panel state, droping active classes\n   *\n   * @private\n   */\nMaterialTabs.prototype.resetPanelState_ = function () {\n    for (var j = 0; j < this.panels_.length; j++) {\n        this.panels_[j].classList.remove(this.CssClasses_.ACTIVE_CLASS);\n    }\n};\n/**\n   * Initialize element.\n   */\nMaterialTabs.prototype.init = function () {\n    if (this.element_) {\n        this.initTabs_();\n    }\n};\n/**\n   * Constructor for an individual tab.\n   *\n   * @constructor\n   * @param {Element} tab The HTML element for the tab.\n   * @param {MaterialTabs} ctx The MaterialTabs object that owns the tab.\n   */\nfunction MaterialTab(tab, ctx) {\n    if (tab) {\n        if (ctx.element_.classList.contains(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {\n            var rippleContainer = document.createElement('span');\n            rippleContainer.classList.add(ctx.CssClasses_.MDL_RIPPLE_CONTAINER);\n            rippleContainer.classList.add(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT);\n            var ripple = document.createElement('span');\n            ripple.classList.add(ctx.CssClasses_.MDL_RIPPLE);\n            rippleContainer.appendChild(ripple);\n            tab.appendChild(rippleContainer);\n        }\n        tab.addEventListener('click', function (e) {\n            e.preventDefault();\n            var href = tab.href.split('#')[1];\n            var panel = ctx.element_.querySelector('#' + href);\n            ctx.resetTabState_();\n            ctx.resetPanelState_();\n            tab.classList.add(ctx.CssClasses_.ACTIVE_CLASS);\n            panel.classList.add(ctx.CssClasses_.ACTIVE_CLASS);\n        });\n    }\n}\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialTabs,\n    classAsString: 'MaterialTabs',\n    cssClass: 'mdl-js-tabs'\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Layout MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialLayout = function MaterialLayout(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialLayout'] = MaterialLayout;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialLayout.prototype.Constant_ = {\n    MAX_WIDTH: '(max-width: 1024px)',\n    TAB_SCROLL_PIXELS: 100,\n    RESIZE_TIMEOUT: 100,\n    MENU_ICON: '&#xE5D2;',\n    CHEVRON_LEFT: 'chevron_left',\n    CHEVRON_RIGHT: 'chevron_right'\n};\n/**\n   * Keycodes, for code readability.\n   *\n   * @enum {number}\n   * @private\n   */\nMaterialLayout.prototype.Keycodes_ = {\n    ENTER: 13,\n    ESCAPE: 27,\n    SPACE: 32\n};\n/**\n   * Modes.\n   *\n   * @enum {number}\n   * @private\n   */\nMaterialLayout.prototype.Mode_ = {\n    STANDARD: 0,\n    SEAMED: 1,\n    WATERFALL: 2,\n    SCROLL: 3\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialLayout.prototype.CssClasses_ = {\n    CONTAINER: 'mdl-layout__container',\n    HEADER: 'mdl-layout__header',\n    DRAWER: 'mdl-layout__drawer',\n    CONTENT: 'mdl-layout__content',\n    DRAWER_BTN: 'mdl-layout__drawer-button',\n    ICON: 'material-icons',\n    JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_CONTAINER: 'mdl-layout__tab-ripple-container',\n    RIPPLE: 'mdl-ripple',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    HEADER_SEAMED: 'mdl-layout__header--seamed',\n    HEADER_WATERFALL: 'mdl-layout__header--waterfall',\n    HEADER_SCROLL: 'mdl-layout__header--scroll',\n    FIXED_HEADER: 'mdl-layout--fixed-header',\n    OBFUSCATOR: 'mdl-layout__obfuscator',\n    TAB_BAR: 'mdl-layout__tab-bar',\n    TAB_CONTAINER: 'mdl-layout__tab-bar-container',\n    TAB: 'mdl-layout__tab',\n    TAB_BAR_BUTTON: 'mdl-layout__tab-bar-button',\n    TAB_BAR_LEFT_BUTTON: 'mdl-layout__tab-bar-left-button',\n    TAB_BAR_RIGHT_BUTTON: 'mdl-layout__tab-bar-right-button',\n    PANEL: 'mdl-layout__tab-panel',\n    HAS_DRAWER: 'has-drawer',\n    HAS_TABS: 'has-tabs',\n    HAS_SCROLLING_HEADER: 'has-scrolling-header',\n    CASTING_SHADOW: 'is-casting-shadow',\n    IS_COMPACT: 'is-compact',\n    IS_SMALL_SCREEN: 'is-small-screen',\n    IS_DRAWER_OPEN: 'is-visible',\n    IS_ACTIVE: 'is-active',\n    IS_UPGRADED: 'is-upgraded',\n    IS_ANIMATING: 'is-animating',\n    ON_LARGE_SCREEN: 'mdl-layout--large-screen-only',\n    ON_SMALL_SCREEN: 'mdl-layout--small-screen-only'\n};\n/**\n   * Handles scrolling on the content.\n   *\n   * @private\n   */\nMaterialLayout.prototype.contentScrollHandler_ = function () {\n    if (this.header_.classList.contains(this.CssClasses_.IS_ANIMATING)) {\n        return;\n    }\n    var headerVisible = !this.element_.classList.contains(this.CssClasses_.IS_SMALL_SCREEN) || this.element_.classList.contains(this.CssClasses_.FIXED_HEADER);\n    if (this.content_.scrollTop > 0 && !this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {\n        this.header_.classList.add(this.CssClasses_.CASTING_SHADOW);\n        this.header_.classList.add(this.CssClasses_.IS_COMPACT);\n        if (headerVisible) {\n            this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\n        }\n    } else if (this.content_.scrollTop <= 0 && this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {\n        this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW);\n        this.header_.classList.remove(this.CssClasses_.IS_COMPACT);\n        if (headerVisible) {\n            this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\n        }\n    }\n};\n/**\n   * Handles a keyboard event on the drawer.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialLayout.prototype.keyboardEventHandler_ = function (evt) {\n    // Only react when the drawer is open.\n    if (evt.keyCode === this.Keycodes_.ESCAPE && this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {\n        this.toggleDrawer();\n    }\n};\n/**\n   * Handles changes in screen size.\n   *\n   * @private\n   */\nMaterialLayout.prototype.screenSizeHandler_ = function () {\n    if (this.screenSizeMediaQuery_.matches) {\n        this.element_.classList.add(this.CssClasses_.IS_SMALL_SCREEN);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_SMALL_SCREEN);\n        // Collapse drawer (if any) when moving to a large screen size.\n        if (this.drawer_) {\n            this.drawer_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN);\n            this.obfuscator_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN);\n        }\n    }\n};\n/**\n   * Handles events of drawer button.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialLayout.prototype.drawerToggleHandler_ = function (evt) {\n    if (evt && evt.type === 'keydown') {\n        if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {\n            // prevent scrolling in drawer nav\n            evt.preventDefault();\n        } else {\n            // prevent other keys\n            return;\n        }\n    }\n    this.toggleDrawer();\n};\n/**\n   * Handles (un)setting the `is-animating` class\n   *\n   * @private\n   */\nMaterialLayout.prototype.headerTransitionEndHandler_ = function () {\n    this.header_.classList.remove(this.CssClasses_.IS_ANIMATING);\n};\n/**\n   * Handles expanding the header on click\n   *\n   * @private\n   */\nMaterialLayout.prototype.headerClickHandler_ = function () {\n    if (this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {\n        this.header_.classList.remove(this.CssClasses_.IS_COMPACT);\n        this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\n    }\n};\n/**\n   * Reset tab state, dropping active classes\n   *\n   * @private\n   */\nMaterialLayout.prototype.resetTabState_ = function (tabBar) {\n    for (var k = 0; k < tabBar.length; k++) {\n        tabBar[k].classList.remove(this.CssClasses_.IS_ACTIVE);\n    }\n};\n/**\n   * Reset panel state, droping active classes\n   *\n   * @private\n   */\nMaterialLayout.prototype.resetPanelState_ = function (panels) {\n    for (var j = 0; j < panels.length; j++) {\n        panels[j].classList.remove(this.CssClasses_.IS_ACTIVE);\n    }\n};\n/**\n  * Toggle drawer state\n  *\n  * @public\n  */\nMaterialLayout.prototype.toggleDrawer = function () {\n    var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);\n    this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);\n    this.obfuscator_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);\n    // Set accessibility properties.\n    if (this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {\n        this.drawer_.setAttribute('aria-hidden', 'false');\n        drawerButton.setAttribute('aria-expanded', 'true');\n    } else {\n        this.drawer_.setAttribute('aria-hidden', 'true');\n        drawerButton.setAttribute('aria-expanded', 'false');\n    }\n};\nMaterialLayout.prototype['toggleDrawer'] = MaterialLayout.prototype.toggleDrawer;\n/**\n   * Initialize element.\n   */\nMaterialLayout.prototype.init = function () {\n    if (this.element_) {\n        var container = document.createElement('div');\n        container.classList.add(this.CssClasses_.CONTAINER);\n        var focusedElement = this.element_.querySelector(':focus');\n        this.element_.parentElement.insertBefore(container, this.element_);\n        this.element_.parentElement.removeChild(this.element_);\n        container.appendChild(this.element_);\n        if (focusedElement) {\n            focusedElement.focus();\n        }\n        var directChildren = this.element_.childNodes;\n        var numChildren = directChildren.length;\n        for (var c = 0; c < numChildren; c++) {\n            var child = directChildren[c];\n            if (child.classList && child.classList.contains(this.CssClasses_.HEADER)) {\n                this.header_ = child;\n            }\n            if (child.classList && child.classList.contains(this.CssClasses_.DRAWER)) {\n                this.drawer_ = child;\n            }\n            if (child.classList && child.classList.contains(this.CssClasses_.CONTENT)) {\n                this.content_ = child;\n            }\n        }\n        window.addEventListener('pageshow', function (e) {\n            if (e.persisted) {\n                // when page is loaded from back/forward cache\n                // trigger repaint to let layout scroll in safari\n                this.element_.style.overflowY = 'hidden';\n                requestAnimationFrame(function () {\n                    this.element_.style.overflowY = '';\n                }.bind(this));\n            }\n        }.bind(this), false);\n        if (this.header_) {\n            this.tabBar_ = this.header_.querySelector('.' + this.CssClasses_.TAB_BAR);\n        }\n        var mode = this.Mode_.STANDARD;\n        if (this.header_) {\n            if (this.header_.classList.contains(this.CssClasses_.HEADER_SEAMED)) {\n                mode = this.Mode_.SEAMED;\n            } else if (this.header_.classList.contains(this.CssClasses_.HEADER_WATERFALL)) {\n                mode = this.Mode_.WATERFALL;\n                this.header_.addEventListener('transitionend', this.headerTransitionEndHandler_.bind(this));\n                this.header_.addEventListener('click', this.headerClickHandler_.bind(this));\n            } else if (this.header_.classList.contains(this.CssClasses_.HEADER_SCROLL)) {\n                mode = this.Mode_.SCROLL;\n                container.classList.add(this.CssClasses_.HAS_SCROLLING_HEADER);\n            }\n            if (mode === this.Mode_.STANDARD) {\n                this.header_.classList.add(this.CssClasses_.CASTING_SHADOW);\n                if (this.tabBar_) {\n                    this.tabBar_.classList.add(this.CssClasses_.CASTING_SHADOW);\n                }\n            } else if (mode === this.Mode_.SEAMED || mode === this.Mode_.SCROLL) {\n                this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW);\n                if (this.tabBar_) {\n                    this.tabBar_.classList.remove(this.CssClasses_.CASTING_SHADOW);\n                }\n            } else if (mode === this.Mode_.WATERFALL) {\n                // Add and remove shadows depending on scroll position.\n                // Also add/remove auxiliary class for styling of the compact version of\n                // the header.\n                this.content_.addEventListener('scroll', this.contentScrollHandler_.bind(this));\n                this.contentScrollHandler_();\n            }\n        }\n        // Add drawer toggling button to our layout, if we have an openable drawer.\n        if (this.drawer_) {\n            var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);\n            if (!drawerButton) {\n                drawerButton = document.createElement('div');\n                drawerButton.setAttribute('aria-expanded', 'false');\n                drawerButton.setAttribute('role', 'button');\n                drawerButton.setAttribute('tabindex', '0');\n                drawerButton.classList.add(this.CssClasses_.DRAWER_BTN);\n                var drawerButtonIcon = document.createElement('i');\n                drawerButtonIcon.classList.add(this.CssClasses_.ICON);\n                drawerButtonIcon.innerHTML = this.Constant_.MENU_ICON;\n                drawerButton.appendChild(drawerButtonIcon);\n            }\n            if (this.drawer_.classList.contains(this.CssClasses_.ON_LARGE_SCREEN)) {\n                //If drawer has ON_LARGE_SCREEN class then add it to the drawer toggle button as well.\n                drawerButton.classList.add(this.CssClasses_.ON_LARGE_SCREEN);\n            } else if (this.drawer_.classList.contains(this.CssClasses_.ON_SMALL_SCREEN)) {\n                //If drawer has ON_SMALL_SCREEN class then add it to the drawer toggle button as well.\n                drawerButton.classList.add(this.CssClasses_.ON_SMALL_SCREEN);\n            }\n            drawerButton.addEventListener('click', this.drawerToggleHandler_.bind(this));\n            drawerButton.addEventListener('keydown', this.drawerToggleHandler_.bind(this));\n            // Add a class if the layout has a drawer, for altering the left padding.\n            // Adds the HAS_DRAWER to the elements since this.header_ may or may\n            // not be present.\n            this.element_.classList.add(this.CssClasses_.HAS_DRAWER);\n            // If we have a fixed header, add the button to the header rather than\n            // the layout.\n            if (this.element_.classList.contains(this.CssClasses_.FIXED_HEADER)) {\n                this.header_.insertBefore(drawerButton, this.header_.firstChild);\n            } else {\n                this.element_.insertBefore(drawerButton, this.content_);\n            }\n            var obfuscator = document.createElement('div');\n            obfuscator.classList.add(this.CssClasses_.OBFUSCATOR);\n            this.element_.appendChild(obfuscator);\n            obfuscator.addEventListener('click', this.drawerToggleHandler_.bind(this));\n            this.obfuscator_ = obfuscator;\n            this.drawer_.addEventListener('keydown', this.keyboardEventHandler_.bind(this));\n            this.drawer_.setAttribute('aria-hidden', 'true');\n        }\n        // Keep an eye on screen size, and add/remove auxiliary class for styling\n        // of small screens.\n        this.screenSizeMediaQuery_ = window.matchMedia(this.Constant_.MAX_WIDTH);\n        this.screenSizeMediaQuery_.addListener(this.screenSizeHandler_.bind(this));\n        this.screenSizeHandler_();\n        // Initialize tabs, if any.\n        if (this.header_ && this.tabBar_) {\n            this.element_.classList.add(this.CssClasses_.HAS_TABS);\n            var tabContainer = document.createElement('div');\n            tabContainer.classList.add(this.CssClasses_.TAB_CONTAINER);\n            this.header_.insertBefore(tabContainer, this.tabBar_);\n            this.header_.removeChild(this.tabBar_);\n            var leftButton = document.createElement('div');\n            leftButton.classList.add(this.CssClasses_.TAB_BAR_BUTTON);\n            leftButton.classList.add(this.CssClasses_.TAB_BAR_LEFT_BUTTON);\n            var leftButtonIcon = document.createElement('i');\n            leftButtonIcon.classList.add(this.CssClasses_.ICON);\n            leftButtonIcon.textContent = this.Constant_.CHEVRON_LEFT;\n            leftButton.appendChild(leftButtonIcon);\n            leftButton.addEventListener('click', function () {\n                this.tabBar_.scrollLeft -= this.Constant_.TAB_SCROLL_PIXELS;\n            }.bind(this));\n            var rightButton = document.createElement('div');\n            rightButton.classList.add(this.CssClasses_.TAB_BAR_BUTTON);\n            rightButton.classList.add(this.CssClasses_.TAB_BAR_RIGHT_BUTTON);\n            var rightButtonIcon = document.createElement('i');\n            rightButtonIcon.classList.add(this.CssClasses_.ICON);\n            rightButtonIcon.textContent = this.Constant_.CHEVRON_RIGHT;\n            rightButton.appendChild(rightButtonIcon);\n            rightButton.addEventListener('click', function () {\n                this.tabBar_.scrollLeft += this.Constant_.TAB_SCROLL_PIXELS;\n            }.bind(this));\n            tabContainer.appendChild(leftButton);\n            tabContainer.appendChild(this.tabBar_);\n            tabContainer.appendChild(rightButton);\n            // Add and remove tab buttons depending on scroll position and total\n            // window size.\n            var tabUpdateHandler = function () {\n                if (this.tabBar_.scrollLeft > 0) {\n                    leftButton.classList.add(this.CssClasses_.IS_ACTIVE);\n                } else {\n                    leftButton.classList.remove(this.CssClasses_.IS_ACTIVE);\n                }\n                if (this.tabBar_.scrollLeft < this.tabBar_.scrollWidth - this.tabBar_.offsetWidth) {\n                    rightButton.classList.add(this.CssClasses_.IS_ACTIVE);\n                } else {\n                    rightButton.classList.remove(this.CssClasses_.IS_ACTIVE);\n                }\n            }.bind(this);\n            this.tabBar_.addEventListener('scroll', tabUpdateHandler);\n            tabUpdateHandler();\n            // Update tabs when the window resizes.\n            var windowResizeHandler = function () {\n                // Use timeouts to make sure it doesn't happen too often.\n                if (this.resizeTimeoutId_) {\n                    clearTimeout(this.resizeTimeoutId_);\n                }\n                this.resizeTimeoutId_ = setTimeout(function () {\n                    tabUpdateHandler();\n                    this.resizeTimeoutId_ = null;\n                }.bind(this), this.Constant_.RESIZE_TIMEOUT);\n            }.bind(this);\n            window.addEventListener('resize', windowResizeHandler);\n            if (this.tabBar_.classList.contains(this.CssClasses_.JS_RIPPLE_EFFECT)) {\n                this.tabBar_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            }\n            // Select element tabs, document panels\n            var tabs = this.tabBar_.querySelectorAll('.' + this.CssClasses_.TAB);\n            var panels = this.content_.querySelectorAll('.' + this.CssClasses_.PANEL);\n            // Create new tabs for each tab element\n            for (var i = 0; i < tabs.length; i++) {\n                new MaterialLayoutTab(tabs[i], tabs, panels, this);\n            }\n        }\n        this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n/**\n   * Constructor for an individual tab.\n   *\n   * @constructor\n   * @param {HTMLElement} tab The HTML element for the tab.\n   * @param {!Array<HTMLElement>} tabs Array with HTML elements for all tabs.\n   * @param {!Array<HTMLElement>} panels Array with HTML elements for all panels.\n   * @param {MaterialLayout} layout The MaterialLayout object that owns the tab.\n   */\nfunction MaterialLayoutTab(tab, tabs, panels, layout) {\n    /**\n     * Auxiliary method to programmatically select a tab in the UI.\n     */\n    function selectTab() {\n        var href = tab.href.split('#')[1];\n        var panel = layout.content_.querySelector('#' + href);\n        layout.resetTabState_(tabs);\n        layout.resetPanelState_(panels);\n        tab.classList.add(layout.CssClasses_.IS_ACTIVE);\n        panel.classList.add(layout.CssClasses_.IS_ACTIVE);\n    }\n    if (layout.tabBar_.classList.contains(layout.CssClasses_.JS_RIPPLE_EFFECT)) {\n        var rippleContainer = document.createElement('span');\n        rippleContainer.classList.add(layout.CssClasses_.RIPPLE_CONTAINER);\n        rippleContainer.classList.add(layout.CssClasses_.JS_RIPPLE_EFFECT);\n        var ripple = document.createElement('span');\n        ripple.classList.add(layout.CssClasses_.RIPPLE);\n        rippleContainer.appendChild(ripple);\n        tab.appendChild(rippleContainer);\n    }\n    tab.addEventListener('click', function (e) {\n        if (tab.getAttribute('href').charAt(0) === '#') {\n            e.preventDefault();\n            selectTab();\n        }\n    });\n    tab.show = selectTab;\n}\nwindow['MaterialLayoutTab'] = MaterialLayoutTab;\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialLayout,\n    classAsString: 'MaterialLayout',\n    cssClass: 'mdl-js-layout'\n});","// Source: https://github.com/darius/requestAnimationFrame/blob/master/requestAnimationFrame.js\n// Adapted from https://gist.github.com/paulirish/1579671 which derived from\n// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n// requestAnimationFrame polyfill by Erik Möller.\n// Fixes from Paul Irish, Tino Zijdel, Andrew Mao, Klemen Slavič, Darius Bacon\n// MIT license\nif (!Date.now) {\n    /**\n   * Date.now polyfill.\n   * @return {number} the current Date\n   */\n    Date.now = function () {\n        return new Date().getTime();\n    };\n    Date['now'] = Date.now;\n}\nvar vendors = [\n    'webkit',\n    'moz'\n];\nfor (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {\n    var vp = vendors[i];\n    window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];\n    window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];\n    window['requestAnimationFrame'] = window.requestAnimationFrame;\n    window['cancelAnimationFrame'] = window.cancelAnimationFrame;\n}\nif (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {\n    var lastTime = 0;\n    /**\n   * requestAnimationFrame polyfill.\n   * @param  {!Function} callback the callback function.\n   */\n    window.requestAnimationFrame = function (callback) {\n        var now = Date.now();\n        var nextTime = Math.max(lastTime + 16, now);\n        return setTimeout(function () {\n            callback(lastTime = nextTime);\n        }, nextTime - now);\n    };\n    window.cancelAnimationFrame = clearTimeout;\n    window['requestAnimationFrame'] = window.requestAnimationFrame;\n    window['cancelAnimationFrame'] = window.cancelAnimationFrame;\n}","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Button MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialButton = function MaterialButton(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialButton'] = MaterialButton;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialButton.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialButton.prototype.CssClasses_ = {\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_CONTAINER: 'mdl-button__ripple-container',\n    RIPPLE: 'mdl-ripple'\n};\n/**\n   * Handle blur of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialButton.prototype.blurHandler_ = function (event) {\n    if (event) {\n        this.element_.blur();\n    }\n};\n// Public methods.\n/**\n   * Disable button.\n   *\n   * @public\n   */\nMaterialButton.prototype.disable = function () {\n    this.element_.disabled = true;\n};\nMaterialButton.prototype['disable'] = MaterialButton.prototype.disable;\n/**\n   * Enable button.\n   *\n   * @public\n   */\nMaterialButton.prototype.enable = function () {\n    this.element_.disabled = false;\n};\nMaterialButton.prototype['enable'] = MaterialButton.prototype.enable;\n/**\n   * Initialize element.\n   */\nMaterialButton.prototype.init = function () {\n    if (this.element_) {\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            var rippleContainer = document.createElement('span');\n            rippleContainer.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            this.rippleElement_ = document.createElement('span');\n            this.rippleElement_.classList.add(this.CssClasses_.RIPPLE);\n            rippleContainer.appendChild(this.rippleElement_);\n            this.boundRippleBlurHandler = this.blurHandler_.bind(this);\n            this.rippleElement_.addEventListener('mouseup', this.boundRippleBlurHandler);\n            this.element_.appendChild(rippleContainer);\n        }\n        this.boundButtonBlurHandler = this.blurHandler_.bind(this);\n        this.element_.addEventListener('mouseup', this.boundButtonBlurHandler);\n        this.element_.addEventListener('mouseleave', this.boundButtonBlurHandler);\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialButton,\n    classAsString: 'MaterialButton',\n    cssClass: 'mdl-js-button',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Checkbox MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialCheckbox = function MaterialCheckbox(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialCheckbox'] = MaterialCheckbox;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialCheckbox.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialCheckbox.prototype.CssClasses_ = {\n    INPUT: 'mdl-checkbox__input',\n    BOX_OUTLINE: 'mdl-checkbox__box-outline',\n    FOCUS_HELPER: 'mdl-checkbox__focus-helper',\n    TICK_OUTLINE: 'mdl-checkbox__tick-outline',\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE_CONTAINER: 'mdl-checkbox__ripple-container',\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE: 'mdl-ripple',\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_CHECKED: 'is-checked',\n    IS_UPGRADED: 'is-upgraded'\n};\n/**\n   * Handle change of state.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialCheckbox.prototype.onChange_ = function (event) {\n    this.updateClasses_();\n};\n/**\n   * Handle focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialCheckbox.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialCheckbox.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle mouseup.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialCheckbox.prototype.onMouseUp_ = function (event) {\n    this.blur_();\n};\n/**\n   * Handle class updates.\n   *\n   * @private\n   */\nMaterialCheckbox.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkToggleState();\n};\n/**\n   * Add blur.\n   *\n   * @private\n   */\nMaterialCheckbox.prototype.blur_ = function () {\n    // TODO: figure out why there's a focus event being fired after our blur,\n    // so that we can avoid this hack.\n    window.setTimeout(function () {\n        this.inputElement_.blur();\n    }.bind(this), this.Constant_.TINY_TIMEOUT);\n};\n// Public methods.\n/**\n   * Check the inputs toggle state and update display.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.checkToggleState = function () {\n    if (this.inputElement_.checked) {\n        this.element_.classList.add(this.CssClasses_.IS_CHECKED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_CHECKED);\n    }\n};\nMaterialCheckbox.prototype['checkToggleState'] = MaterialCheckbox.prototype.checkToggleState;\n/**\n   * Check the inputs disabled state and update display.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.checkDisabled = function () {\n    if (this.inputElement_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialCheckbox.prototype['checkDisabled'] = MaterialCheckbox.prototype.checkDisabled;\n/**\n   * Disable checkbox.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.disable = function () {\n    this.inputElement_.disabled = true;\n    this.updateClasses_();\n};\nMaterialCheckbox.prototype['disable'] = MaterialCheckbox.prototype.disable;\n/**\n   * Enable checkbox.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.enable = function () {\n    this.inputElement_.disabled = false;\n    this.updateClasses_();\n};\nMaterialCheckbox.prototype['enable'] = MaterialCheckbox.prototype.enable;\n/**\n   * Check checkbox.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.check = function () {\n    this.inputElement_.checked = true;\n    this.updateClasses_();\n};\nMaterialCheckbox.prototype['check'] = MaterialCheckbox.prototype.check;\n/**\n   * Uncheck checkbox.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.uncheck = function () {\n    this.inputElement_.checked = false;\n    this.updateClasses_();\n};\nMaterialCheckbox.prototype['uncheck'] = MaterialCheckbox.prototype.uncheck;\n/**\n   * Initialize element.\n   */\nMaterialCheckbox.prototype.init = function () {\n    if (this.element_) {\n        this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);\n        var boxOutline = document.createElement('span');\n        boxOutline.classList.add(this.CssClasses_.BOX_OUTLINE);\n        var tickContainer = document.createElement('span');\n        tickContainer.classList.add(this.CssClasses_.FOCUS_HELPER);\n        var tickOutline = document.createElement('span');\n        tickOutline.classList.add(this.CssClasses_.TICK_OUTLINE);\n        boxOutline.appendChild(tickOutline);\n        this.element_.appendChild(tickContainer);\n        this.element_.appendChild(boxOutline);\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            this.rippleContainerElement_ = document.createElement('span');\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_EFFECT);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);\n            this.boundRippleMouseUp = this.onMouseUp_.bind(this);\n            this.rippleContainerElement_.addEventListener('mouseup', this.boundRippleMouseUp);\n            var ripple = document.createElement('span');\n            ripple.classList.add(this.CssClasses_.RIPPLE);\n            this.rippleContainerElement_.appendChild(ripple);\n            this.element_.appendChild(this.rippleContainerElement_);\n        }\n        this.boundInputOnChange = this.onChange_.bind(this);\n        this.boundInputOnFocus = this.onFocus_.bind(this);\n        this.boundInputOnBlur = this.onBlur_.bind(this);\n        this.boundElementMouseUp = this.onMouseUp_.bind(this);\n        this.inputElement_.addEventListener('change', this.boundInputOnChange);\n        this.inputElement_.addEventListener('focus', this.boundInputOnFocus);\n        this.inputElement_.addEventListener('blur', this.boundInputOnBlur);\n        this.element_.addEventListener('mouseup', this.boundElementMouseUp);\n        this.updateClasses_();\n        this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialCheckbox,\n    classAsString: 'MaterialCheckbox',\n    cssClass: 'mdl-js-checkbox',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for icon toggle MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialIconToggle = function MaterialIconToggle(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialIconToggle'] = MaterialIconToggle;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialIconToggle.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialIconToggle.prototype.CssClasses_ = {\n    INPUT: 'mdl-icon-toggle__input',\n    JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE_CONTAINER: 'mdl-icon-toggle__ripple-container',\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE: 'mdl-ripple',\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_CHECKED: 'is-checked'\n};\n/**\n   * Handle change of state.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialIconToggle.prototype.onChange_ = function (event) {\n    this.updateClasses_();\n};\n/**\n   * Handle focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialIconToggle.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialIconToggle.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle mouseup.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialIconToggle.prototype.onMouseUp_ = function (event) {\n    this.blur_();\n};\n/**\n   * Handle class updates.\n   *\n   * @private\n   */\nMaterialIconToggle.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkToggleState();\n};\n/**\n   * Add blur.\n   *\n   * @private\n   */\nMaterialIconToggle.prototype.blur_ = function () {\n    // TODO: figure out why there's a focus event being fired after our blur,\n    // so that we can avoid this hack.\n    window.setTimeout(function () {\n        this.inputElement_.blur();\n    }.bind(this), this.Constant_.TINY_TIMEOUT);\n};\n// Public methods.\n/**\n   * Check the inputs toggle state and update display.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.checkToggleState = function () {\n    if (this.inputElement_.checked) {\n        this.element_.classList.add(this.CssClasses_.IS_CHECKED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_CHECKED);\n    }\n};\nMaterialIconToggle.prototype['checkToggleState'] = MaterialIconToggle.prototype.checkToggleState;\n/**\n   * Check the inputs disabled state and update display.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.checkDisabled = function () {\n    if (this.inputElement_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialIconToggle.prototype['checkDisabled'] = MaterialIconToggle.prototype.checkDisabled;\n/**\n   * Disable icon toggle.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.disable = function () {\n    this.inputElement_.disabled = true;\n    this.updateClasses_();\n};\nMaterialIconToggle.prototype['disable'] = MaterialIconToggle.prototype.disable;\n/**\n   * Enable icon toggle.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.enable = function () {\n    this.inputElement_.disabled = false;\n    this.updateClasses_();\n};\nMaterialIconToggle.prototype['enable'] = MaterialIconToggle.prototype.enable;\n/**\n   * Check icon toggle.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.check = function () {\n    this.inputElement_.checked = true;\n    this.updateClasses_();\n};\nMaterialIconToggle.prototype['check'] = MaterialIconToggle.prototype.check;\n/**\n   * Uncheck icon toggle.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.uncheck = function () {\n    this.inputElement_.checked = false;\n    this.updateClasses_();\n};\nMaterialIconToggle.prototype['uncheck'] = MaterialIconToggle.prototype.uncheck;\n/**\n   * Initialize element.\n   */\nMaterialIconToggle.prototype.init = function () {\n    if (this.element_) {\n        this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);\n        if (this.element_.classList.contains(this.CssClasses_.JS_RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            this.rippleContainerElement_ = document.createElement('span');\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.JS_RIPPLE_EFFECT);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);\n            this.boundRippleMouseUp = this.onMouseUp_.bind(this);\n            this.rippleContainerElement_.addEventListener('mouseup', this.boundRippleMouseUp);\n            var ripple = document.createElement('span');\n            ripple.classList.add(this.CssClasses_.RIPPLE);\n            this.rippleContainerElement_.appendChild(ripple);\n            this.element_.appendChild(this.rippleContainerElement_);\n        }\n        this.boundInputOnChange = this.onChange_.bind(this);\n        this.boundInputOnFocus = this.onFocus_.bind(this);\n        this.boundInputOnBlur = this.onBlur_.bind(this);\n        this.boundElementOnMouseUp = this.onMouseUp_.bind(this);\n        this.inputElement_.addEventListener('change', this.boundInputOnChange);\n        this.inputElement_.addEventListener('focus', this.boundInputOnFocus);\n        this.inputElement_.addEventListener('blur', this.boundInputOnBlur);\n        this.element_.addEventListener('mouseup', this.boundElementOnMouseUp);\n        this.updateClasses_();\n        this.element_.classList.add('is-upgraded');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialIconToggle,\n    classAsString: 'MaterialIconToggle',\n    cssClass: 'mdl-js-icon-toggle',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for dropdown MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialMenu = function MaterialMenu(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialMenu'] = MaterialMenu;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialMenu.prototype.Constant_ = {\n    // Total duration of the menu animation.\n    TRANSITION_DURATION_SECONDS: 0.3,\n    // The fraction of the total duration we want to use for menu item animations.\n    TRANSITION_DURATION_FRACTION: 0.8,\n    // How long the menu stays open after choosing an option (so the user can see\n    // the ripple).\n    CLOSE_TIMEOUT: 150\n};\n/**\n   * Keycodes, for code readability.\n   *\n   * @enum {number}\n   * @private\n   */\nMaterialMenu.prototype.Keycodes_ = {\n    ENTER: 13,\n    ESCAPE: 27,\n    SPACE: 32,\n    UP_ARROW: 38,\n    DOWN_ARROW: 40\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialMenu.prototype.CssClasses_ = {\n    CONTAINER: 'mdl-menu__container',\n    OUTLINE: 'mdl-menu__outline',\n    ITEM: 'mdl-menu__item',\n    ITEM_RIPPLE_CONTAINER: 'mdl-menu__item-ripple-container',\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE: 'mdl-ripple',\n    // Statuses\n    IS_UPGRADED: 'is-upgraded',\n    IS_VISIBLE: 'is-visible',\n    IS_ANIMATING: 'is-animating',\n    // Alignment options\n    BOTTOM_LEFT: 'mdl-menu--bottom-left',\n    // This is the default.\n    BOTTOM_RIGHT: 'mdl-menu--bottom-right',\n    TOP_LEFT: 'mdl-menu--top-left',\n    TOP_RIGHT: 'mdl-menu--top-right',\n    UNALIGNED: 'mdl-menu--unaligned'\n};\n/**\n   * Initialize element.\n   */\nMaterialMenu.prototype.init = function () {\n    if (this.element_) {\n        // Create container for the menu.\n        var container = document.createElement('div');\n        container.classList.add(this.CssClasses_.CONTAINER);\n        this.element_.parentElement.insertBefore(container, this.element_);\n        this.element_.parentElement.removeChild(this.element_);\n        container.appendChild(this.element_);\n        this.container_ = container;\n        // Create outline for the menu (shadow and background).\n        var outline = document.createElement('div');\n        outline.classList.add(this.CssClasses_.OUTLINE);\n        this.outline_ = outline;\n        container.insertBefore(outline, this.element_);\n        // Find the \"for\" element and bind events to it.\n        var forElId = this.element_.getAttribute('for') || this.element_.getAttribute('data-mdl-for');\n        var forEl = null;\n        if (forElId) {\n            forEl = document.getElementById(forElId);\n            if (forEl) {\n                this.forElement_ = forEl;\n                forEl.addEventListener('click', this.handleForClick_.bind(this));\n                forEl.addEventListener('keydown', this.handleForKeyboardEvent_.bind(this));\n            }\n        }\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);\n        this.boundItemKeydown_ = this.handleItemKeyboardEvent_.bind(this);\n        this.boundItemClick_ = this.handleItemClick_.bind(this);\n        for (var i = 0; i < items.length; i++) {\n            // Add a listener to each menu item.\n            items[i].addEventListener('click', this.boundItemClick_);\n            // Add a tab index to each menu item.\n            items[i].tabIndex = '-1';\n            // Add a keyboard listener to each menu item.\n            items[i].addEventListener('keydown', this.boundItemKeydown_);\n        }\n        // Add ripple classes to each item, if the user has enabled ripples.\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            for (i = 0; i < items.length; i++) {\n                var item = items[i];\n                var rippleContainer = document.createElement('span');\n                rippleContainer.classList.add(this.CssClasses_.ITEM_RIPPLE_CONTAINER);\n                var ripple = document.createElement('span');\n                ripple.classList.add(this.CssClasses_.RIPPLE);\n                rippleContainer.appendChild(ripple);\n                item.appendChild(rippleContainer);\n                item.classList.add(this.CssClasses_.RIPPLE_EFFECT);\n            }\n        }\n        // Copy alignment classes to the container, so the outline can use them.\n        if (this.element_.classList.contains(this.CssClasses_.BOTTOM_LEFT)) {\n            this.outline_.classList.add(this.CssClasses_.BOTTOM_LEFT);\n        }\n        if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {\n            this.outline_.classList.add(this.CssClasses_.BOTTOM_RIGHT);\n        }\n        if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {\n            this.outline_.classList.add(this.CssClasses_.TOP_LEFT);\n        }\n        if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {\n            this.outline_.classList.add(this.CssClasses_.TOP_RIGHT);\n        }\n        if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {\n            this.outline_.classList.add(this.CssClasses_.UNALIGNED);\n        }\n        container.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n/**\n   * Handles a click on the \"for\" element, by positioning the menu and then\n   * toggling it.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialMenu.prototype.handleForClick_ = function (evt) {\n    if (this.element_ && this.forElement_) {\n        var rect = this.forElement_.getBoundingClientRect();\n        var forRect = this.forElement_.parentElement.getBoundingClientRect();\n        if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {\n        } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {\n            // Position below the \"for\" element, aligned to its right.\n            this.container_.style.right = forRect.right - rect.right + 'px';\n            this.container_.style.top = this.forElement_.offsetTop + this.forElement_.offsetHeight + 'px';\n        } else if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {\n            // Position above the \"for\" element, aligned to its left.\n            this.container_.style.left = this.forElement_.offsetLeft + 'px';\n            this.container_.style.bottom = forRect.bottom - rect.top + 'px';\n        } else if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {\n            // Position above the \"for\" element, aligned to its right.\n            this.container_.style.right = forRect.right - rect.right + 'px';\n            this.container_.style.bottom = forRect.bottom - rect.top + 'px';\n        } else {\n            // Default: position below the \"for\" element, aligned to its left.\n            this.container_.style.left = this.forElement_.offsetLeft + 'px';\n            this.container_.style.top = this.forElement_.offsetTop + this.forElement_.offsetHeight + 'px';\n        }\n    }\n    this.toggle(evt);\n};\n/**\n   * Handles a keyboard event on the \"for\" element.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialMenu.prototype.handleForKeyboardEvent_ = function (evt) {\n    if (this.element_ && this.container_ && this.forElement_) {\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM + ':not([disabled])');\n        if (items && items.length > 0 && this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {\n            if (evt.keyCode === this.Keycodes_.UP_ARROW) {\n                evt.preventDefault();\n                items[items.length - 1].focus();\n            } else if (evt.keyCode === this.Keycodes_.DOWN_ARROW) {\n                evt.preventDefault();\n                items[0].focus();\n            }\n        }\n    }\n};\n/**\n   * Handles a keyboard event on an item.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialMenu.prototype.handleItemKeyboardEvent_ = function (evt) {\n    if (this.element_ && this.container_) {\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM + ':not([disabled])');\n        if (items && items.length > 0 && this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {\n            var currentIndex = Array.prototype.slice.call(items).indexOf(evt.target);\n            if (evt.keyCode === this.Keycodes_.UP_ARROW) {\n                evt.preventDefault();\n                if (currentIndex > 0) {\n                    items[currentIndex - 1].focus();\n                } else {\n                    items[items.length - 1].focus();\n                }\n            } else if (evt.keyCode === this.Keycodes_.DOWN_ARROW) {\n                evt.preventDefault();\n                if (items.length > currentIndex + 1) {\n                    items[currentIndex + 1].focus();\n                } else {\n                    items[0].focus();\n                }\n            } else if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {\n                evt.preventDefault();\n                // Send mousedown and mouseup to trigger ripple.\n                var e = new MouseEvent('mousedown');\n                evt.target.dispatchEvent(e);\n                e = new MouseEvent('mouseup');\n                evt.target.dispatchEvent(e);\n                // Send click.\n                evt.target.click();\n            } else if (evt.keyCode === this.Keycodes_.ESCAPE) {\n                evt.preventDefault();\n                this.hide();\n            }\n        }\n    }\n};\n/**\n   * Handles a click event on an item.\n   *\n   * @param {Event} evt The event that fired.\n   * @private\n   */\nMaterialMenu.prototype.handleItemClick_ = function (evt) {\n    if (evt.target.hasAttribute('disabled')) {\n        evt.stopPropagation();\n    } else {\n        // Wait some time before closing menu, so the user can see the ripple.\n        this.closing_ = true;\n        window.setTimeout(function (evt) {\n            this.hide();\n            this.closing_ = false;\n        }.bind(this), this.Constant_.CLOSE_TIMEOUT);\n    }\n};\n/**\n   * Calculates the initial clip (for opening the menu) or final clip (for closing\n   * it), and applies it. This allows us to animate from or to the correct point,\n   * that is, the point it's aligned to in the \"for\" element.\n   *\n   * @param {number} height Height of the clip rectangle\n   * @param {number} width Width of the clip rectangle\n   * @private\n   */\nMaterialMenu.prototype.applyClip_ = function (height, width) {\n    if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {\n        // Do not clip.\n        this.element_.style.clip = '';\n    } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {\n        // Clip to the top right corner of the menu.\n        this.element_.style.clip = 'rect(0 ' + width + 'px ' + '0 ' + width + 'px)';\n    } else if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {\n        // Clip to the bottom left corner of the menu.\n        this.element_.style.clip = 'rect(' + height + 'px 0 ' + height + 'px 0)';\n    } else if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {\n        // Clip to the bottom right corner of the menu.\n        this.element_.style.clip = 'rect(' + height + 'px ' + width + 'px ' + height + 'px ' + width + 'px)';\n    } else {\n        // Default: do not clip (same as clipping to the top left corner).\n        this.element_.style.clip = '';\n    }\n};\n/**\n   * Cleanup function to remove animation listeners.\n   *\n   * @param {Event} evt\n   * @private\n   */\nMaterialMenu.prototype.removeAnimationEndListener_ = function (evt) {\n    evt.target.classList.remove(MaterialMenu.prototype.CssClasses_.IS_ANIMATING);\n};\n/**\n   * Adds an event listener to clean up after the animation ends.\n   *\n   * @private\n   */\nMaterialMenu.prototype.addAnimationEndListener_ = function () {\n    this.element_.addEventListener('transitionend', this.removeAnimationEndListener_);\n    this.element_.addEventListener('webkitTransitionEnd', this.removeAnimationEndListener_);\n};\n/**\n   * Displays the menu.\n   *\n   * @public\n   */\nMaterialMenu.prototype.show = function (evt) {\n    if (this.element_ && this.container_ && this.outline_) {\n        // Measure the inner element.\n        var height = this.element_.getBoundingClientRect().height;\n        var width = this.element_.getBoundingClientRect().width;\n        // Apply the inner element's size to the container and outline.\n        this.container_.style.width = width + 'px';\n        this.container_.style.height = height + 'px';\n        this.outline_.style.width = width + 'px';\n        this.outline_.style.height = height + 'px';\n        var transitionDuration = this.Constant_.TRANSITION_DURATION_SECONDS * this.Constant_.TRANSITION_DURATION_FRACTION;\n        // Calculate transition delays for individual menu items, so that they fade\n        // in one at a time.\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);\n        for (var i = 0; i < items.length; i++) {\n            var itemDelay = null;\n            if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT) || this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {\n                itemDelay = (height - items[i].offsetTop - items[i].offsetHeight) / height * transitionDuration + 's';\n            } else {\n                itemDelay = items[i].offsetTop / height * transitionDuration + 's';\n            }\n            items[i].style.transitionDelay = itemDelay;\n        }\n        // Apply the initial clip to the text before we start animating.\n        this.applyClip_(height, width);\n        // Wait for the next frame, turn on animation, and apply the final clip.\n        // Also make it visible. This triggers the transitions.\n        window.requestAnimationFrame(function () {\n            this.element_.classList.add(this.CssClasses_.IS_ANIMATING);\n            this.element_.style.clip = 'rect(0 ' + width + 'px ' + height + 'px 0)';\n            this.container_.classList.add(this.CssClasses_.IS_VISIBLE);\n        }.bind(this));\n        // Clean up after the animation is complete.\n        this.addAnimationEndListener_();\n        // Add a click listener to the document, to close the menu.\n        var callback = function (e) {\n            // Check to see if the document is processing the same event that\n            // displayed the menu in the first place. If so, do nothing.\n            // Also check to see if the menu is in the process of closing itself, and\n            // do nothing in that case.\n            // Also check if the clicked element is a menu item\n            // if so, do nothing.\n            if (e !== evt && !this.closing_ && e.target.parentNode !== this.element_) {\n                document.removeEventListener('click', callback);\n                this.hide();\n            }\n        }.bind(this);\n        document.addEventListener('click', callback);\n    }\n};\nMaterialMenu.prototype['show'] = MaterialMenu.prototype.show;\n/**\n   * Hides the menu.\n   *\n   * @public\n   */\nMaterialMenu.prototype.hide = function () {\n    if (this.element_ && this.container_ && this.outline_) {\n        var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);\n        // Remove all transition delays; menu items fade out concurrently.\n        for (var i = 0; i < items.length; i++) {\n            items[i].style.removeProperty('transition-delay');\n        }\n        // Measure the inner element.\n        var rect = this.element_.getBoundingClientRect();\n        var height = rect.height;\n        var width = rect.width;\n        // Turn on animation, and apply the final clip. Also make invisible.\n        // This triggers the transitions.\n        this.element_.classList.add(this.CssClasses_.IS_ANIMATING);\n        this.applyClip_(height, width);\n        this.container_.classList.remove(this.CssClasses_.IS_VISIBLE);\n        // Clean up after the animation is complete.\n        this.addAnimationEndListener_();\n    }\n};\nMaterialMenu.prototype['hide'] = MaterialMenu.prototype.hide;\n/**\n   * Displays or hides the menu, depending on current state.\n   *\n   * @public\n   */\nMaterialMenu.prototype.toggle = function (evt) {\n    if (this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {\n        this.hide();\n    } else {\n        this.show(evt);\n    }\n};\nMaterialMenu.prototype['toggle'] = MaterialMenu.prototype.toggle;\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialMenu,\n    classAsString: 'MaterialMenu',\n    cssClass: 'mdl-js-menu',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Progress MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialProgress = function MaterialProgress(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialProgress'] = MaterialProgress;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialProgress.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialProgress.prototype.CssClasses_ = { INDETERMINATE_CLASS: 'mdl-progress__indeterminate' };\n/**\n   * Set the current progress of the progressbar.\n   *\n   * @param {number} p Percentage of the progress (0-100)\n   * @public\n   */\nMaterialProgress.prototype.setProgress = function (p) {\n    if (this.element_.classList.contains(this.CssClasses_.INDETERMINATE_CLASS)) {\n        return;\n    }\n    this.progressbar_.style.width = p + '%';\n};\nMaterialProgress.prototype['setProgress'] = MaterialProgress.prototype.setProgress;\n/**\n   * Set the current progress of the buffer.\n   *\n   * @param {number} p Percentage of the buffer (0-100)\n   * @public\n   */\nMaterialProgress.prototype.setBuffer = function (p) {\n    this.bufferbar_.style.width = p + '%';\n    this.auxbar_.style.width = 100 - p + '%';\n};\nMaterialProgress.prototype['setBuffer'] = MaterialProgress.prototype.setBuffer;\n/**\n   * Initialize element.\n   */\nMaterialProgress.prototype.init = function () {\n    if (this.element_) {\n        var el = document.createElement('div');\n        el.className = 'progressbar bar bar1';\n        this.element_.appendChild(el);\n        this.progressbar_ = el;\n        el = document.createElement('div');\n        el.className = 'bufferbar bar bar2';\n        this.element_.appendChild(el);\n        this.bufferbar_ = el;\n        el = document.createElement('div');\n        el.className = 'auxbar bar bar3';\n        this.element_.appendChild(el);\n        this.auxbar_ = el;\n        this.progressbar_.style.width = '0%';\n        this.bufferbar_.style.width = '100%';\n        this.auxbar_.style.width = '0%';\n        this.element_.classList.add('is-upgraded');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialProgress,\n    classAsString: 'MaterialProgress',\n    cssClass: 'mdl-js-progress',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Radio MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialRadio = function MaterialRadio(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialRadio'] = MaterialRadio;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialRadio.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialRadio.prototype.CssClasses_ = {\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_CHECKED: 'is-checked',\n    IS_UPGRADED: 'is-upgraded',\n    JS_RADIO: 'mdl-js-radio',\n    RADIO_BTN: 'mdl-radio__button',\n    RADIO_OUTER_CIRCLE: 'mdl-radio__outer-circle',\n    RADIO_INNER_CIRCLE: 'mdl-radio__inner-circle',\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE_CONTAINER: 'mdl-radio__ripple-container',\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE: 'mdl-ripple'\n};\n/**\n   * Handle change of state.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRadio.prototype.onChange_ = function (event) {\n    // Since other radio buttons don't get change events, we need to look for\n    // them to update their classes.\n    var radios = document.getElementsByClassName(this.CssClasses_.JS_RADIO);\n    for (var i = 0; i < radios.length; i++) {\n        var button = radios[i].querySelector('.' + this.CssClasses_.RADIO_BTN);\n        // Different name == different group, so no point updating those.\n        if (button.getAttribute('name') === this.btnElement_.getAttribute('name')) {\n            radios[i]['MaterialRadio'].updateClasses_();\n        }\n    }\n};\n/**\n   * Handle focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRadio.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRadio.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle mouseup.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRadio.prototype.onMouseup_ = function (event) {\n    this.blur_();\n};\n/**\n   * Update classes.\n   *\n   * @private\n   */\nMaterialRadio.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkToggleState();\n};\n/**\n   * Add blur.\n   *\n   * @private\n   */\nMaterialRadio.prototype.blur_ = function () {\n    // TODO: figure out why there's a focus event being fired after our blur,\n    // so that we can avoid this hack.\n    window.setTimeout(function () {\n        this.btnElement_.blur();\n    }.bind(this), this.Constant_.TINY_TIMEOUT);\n};\n// Public methods.\n/**\n   * Check the components disabled state.\n   *\n   * @public\n   */\nMaterialRadio.prototype.checkDisabled = function () {\n    if (this.btnElement_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialRadio.prototype['checkDisabled'] = MaterialRadio.prototype.checkDisabled;\n/**\n   * Check the components toggled state.\n   *\n   * @public\n   */\nMaterialRadio.prototype.checkToggleState = function () {\n    if (this.btnElement_.checked) {\n        this.element_.classList.add(this.CssClasses_.IS_CHECKED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_CHECKED);\n    }\n};\nMaterialRadio.prototype['checkToggleState'] = MaterialRadio.prototype.checkToggleState;\n/**\n   * Disable radio.\n   *\n   * @public\n   */\nMaterialRadio.prototype.disable = function () {\n    this.btnElement_.disabled = true;\n    this.updateClasses_();\n};\nMaterialRadio.prototype['disable'] = MaterialRadio.prototype.disable;\n/**\n   * Enable radio.\n   *\n   * @public\n   */\nMaterialRadio.prototype.enable = function () {\n    this.btnElement_.disabled = false;\n    this.updateClasses_();\n};\nMaterialRadio.prototype['enable'] = MaterialRadio.prototype.enable;\n/**\n   * Check radio.\n   *\n   * @public\n   */\nMaterialRadio.prototype.check = function () {\n    this.btnElement_.checked = true;\n    this.updateClasses_();\n};\nMaterialRadio.prototype['check'] = MaterialRadio.prototype.check;\n/**\n   * Uncheck radio.\n   *\n   * @public\n   */\nMaterialRadio.prototype.uncheck = function () {\n    this.btnElement_.checked = false;\n    this.updateClasses_();\n};\nMaterialRadio.prototype['uncheck'] = MaterialRadio.prototype.uncheck;\n/**\n   * Initialize element.\n   */\nMaterialRadio.prototype.init = function () {\n    if (this.element_) {\n        this.btnElement_ = this.element_.querySelector('.' + this.CssClasses_.RADIO_BTN);\n        this.boundChangeHandler_ = this.onChange_.bind(this);\n        this.boundFocusHandler_ = this.onChange_.bind(this);\n        this.boundBlurHandler_ = this.onBlur_.bind(this);\n        this.boundMouseUpHandler_ = this.onMouseup_.bind(this);\n        var outerCircle = document.createElement('span');\n        outerCircle.classList.add(this.CssClasses_.RADIO_OUTER_CIRCLE);\n        var innerCircle = document.createElement('span');\n        innerCircle.classList.add(this.CssClasses_.RADIO_INNER_CIRCLE);\n        this.element_.appendChild(outerCircle);\n        this.element_.appendChild(innerCircle);\n        var rippleContainer;\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            rippleContainer = document.createElement('span');\n            rippleContainer.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            rippleContainer.classList.add(this.CssClasses_.RIPPLE_EFFECT);\n            rippleContainer.classList.add(this.CssClasses_.RIPPLE_CENTER);\n            rippleContainer.addEventListener('mouseup', this.boundMouseUpHandler_);\n            var ripple = document.createElement('span');\n            ripple.classList.add(this.CssClasses_.RIPPLE);\n            rippleContainer.appendChild(ripple);\n            this.element_.appendChild(rippleContainer);\n        }\n        this.btnElement_.addEventListener('change', this.boundChangeHandler_);\n        this.btnElement_.addEventListener('focus', this.boundFocusHandler_);\n        this.btnElement_.addEventListener('blur', this.boundBlurHandler_);\n        this.element_.addEventListener('mouseup', this.boundMouseUpHandler_);\n        this.updateClasses_();\n        this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialRadio,\n    classAsString: 'MaterialRadio',\n    cssClass: 'mdl-js-radio',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Slider MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialSlider = function MaterialSlider(element) {\n    this.element_ = element;\n    // Browser feature detection.\n    this.isIE_ = window.navigator.msPointerEnabled;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialSlider'] = MaterialSlider;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialSlider.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialSlider.prototype.CssClasses_ = {\n    IE_CONTAINER: 'mdl-slider__ie-container',\n    SLIDER_CONTAINER: 'mdl-slider__container',\n    BACKGROUND_FLEX: 'mdl-slider__background-flex',\n    BACKGROUND_LOWER: 'mdl-slider__background-lower',\n    BACKGROUND_UPPER: 'mdl-slider__background-upper',\n    IS_LOWEST_VALUE: 'is-lowest-value',\n    IS_UPGRADED: 'is-upgraded'\n};\n/**\n   * Handle input on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSlider.prototype.onInput_ = function (event) {\n    this.updateValueStyles_();\n};\n/**\n   * Handle change on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSlider.prototype.onChange_ = function (event) {\n    this.updateValueStyles_();\n};\n/**\n   * Handle mouseup on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSlider.prototype.onMouseUp_ = function (event) {\n    event.target.blur();\n};\n/**\n   * Handle mousedown on container element.\n   * This handler is purpose is to not require the use to click\n   * exactly on the 2px slider element, as FireFox seems to be very\n   * strict about this.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   * @suppress {missingProperties}\n   */\nMaterialSlider.prototype.onContainerMouseDown_ = function (event) {\n    // If this click is not on the parent element (but rather some child)\n    // ignore. It may still bubble up.\n    if (event.target !== this.element_.parentElement) {\n        return;\n    }\n    // Discard the original event and create a new event that\n    // is on the slider element.\n    event.preventDefault();\n    var newEvent = new MouseEvent('mousedown', {\n        target: event.target,\n        buttons: event.buttons,\n        clientX: event.clientX,\n        clientY: this.element_.getBoundingClientRect().y\n    });\n    this.element_.dispatchEvent(newEvent);\n};\n/**\n   * Handle updating of values.\n   *\n   * @private\n   */\nMaterialSlider.prototype.updateValueStyles_ = function () {\n    // Calculate and apply percentages to div structure behind slider.\n    var fraction = (this.element_.value - this.element_.min) / (this.element_.max - this.element_.min);\n    if (fraction === 0) {\n        this.element_.classList.add(this.CssClasses_.IS_LOWEST_VALUE);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_LOWEST_VALUE);\n    }\n    if (!this.isIE_) {\n        this.backgroundLower_.style.flex = fraction;\n        this.backgroundLower_.style.webkitFlex = fraction;\n        this.backgroundUpper_.style.flex = 1 - fraction;\n        this.backgroundUpper_.style.webkitFlex = 1 - fraction;\n    }\n};\n// Public methods.\n/**\n   * Disable slider.\n   *\n   * @public\n   */\nMaterialSlider.prototype.disable = function () {\n    this.element_.disabled = true;\n};\nMaterialSlider.prototype['disable'] = MaterialSlider.prototype.disable;\n/**\n   * Enable slider.\n   *\n   * @public\n   */\nMaterialSlider.prototype.enable = function () {\n    this.element_.disabled = false;\n};\nMaterialSlider.prototype['enable'] = MaterialSlider.prototype.enable;\n/**\n   * Update slider value.\n   *\n   * @param {number} value The value to which to set the control (optional).\n   * @public\n   */\nMaterialSlider.prototype.change = function (value) {\n    if (typeof value !== 'undefined') {\n        this.element_.value = value;\n    }\n    this.updateValueStyles_();\n};\nMaterialSlider.prototype['change'] = MaterialSlider.prototype.change;\n/**\n   * Initialize element.\n   */\nMaterialSlider.prototype.init = function () {\n    if (this.element_) {\n        if (this.isIE_) {\n            // Since we need to specify a very large height in IE due to\n            // implementation limitations, we add a parent here that trims it down to\n            // a reasonable size.\n            var containerIE = document.createElement('div');\n            containerIE.classList.add(this.CssClasses_.IE_CONTAINER);\n            this.element_.parentElement.insertBefore(containerIE, this.element_);\n            this.element_.parentElement.removeChild(this.element_);\n            containerIE.appendChild(this.element_);\n        } else {\n            // For non-IE browsers, we need a div structure that sits behind the\n            // slider and allows us to style the left and right sides of it with\n            // different colors.\n            var container = document.createElement('div');\n            container.classList.add(this.CssClasses_.SLIDER_CONTAINER);\n            this.element_.parentElement.insertBefore(container, this.element_);\n            this.element_.parentElement.removeChild(this.element_);\n            container.appendChild(this.element_);\n            var backgroundFlex = document.createElement('div');\n            backgroundFlex.classList.add(this.CssClasses_.BACKGROUND_FLEX);\n            container.appendChild(backgroundFlex);\n            this.backgroundLower_ = document.createElement('div');\n            this.backgroundLower_.classList.add(this.CssClasses_.BACKGROUND_LOWER);\n            backgroundFlex.appendChild(this.backgroundLower_);\n            this.backgroundUpper_ = document.createElement('div');\n            this.backgroundUpper_.classList.add(this.CssClasses_.BACKGROUND_UPPER);\n            backgroundFlex.appendChild(this.backgroundUpper_);\n        }\n        this.boundInputHandler = this.onInput_.bind(this);\n        this.boundChangeHandler = this.onChange_.bind(this);\n        this.boundMouseUpHandler = this.onMouseUp_.bind(this);\n        this.boundContainerMouseDownHandler = this.onContainerMouseDown_.bind(this);\n        this.element_.addEventListener('input', this.boundInputHandler);\n        this.element_.addEventListener('change', this.boundChangeHandler);\n        this.element_.addEventListener('mouseup', this.boundMouseUpHandler);\n        this.element_.parentElement.addEventListener('mousedown', this.boundContainerMouseDownHandler);\n        this.updateValueStyles_();\n        this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialSlider,\n    classAsString: 'MaterialSlider',\n    cssClass: 'mdl-js-slider',\n    widget: true\n});","/**\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Snackbar MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialSnackbar = function MaterialSnackbar(element) {\n    this.element_ = element;\n    this.textElement_ = this.element_.querySelector('.' + this.cssClasses_.MESSAGE);\n    this.actionElement_ = this.element_.querySelector('.' + this.cssClasses_.ACTION);\n    if (!this.textElement_) {\n        throw new Error('There must be a message element for a snackbar.');\n    }\n    if (!this.actionElement_) {\n        throw new Error('There must be an action element for a snackbar.');\n    }\n    this.active = false;\n    this.actionHandler_ = undefined;\n    this.message_ = undefined;\n    this.actionText_ = undefined;\n    this.queuedNotifications_ = [];\n    this.setActionHidden_(true);\n};\nwindow['MaterialSnackbar'] = MaterialSnackbar;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialSnackbar.prototype.Constant_ = {\n    // The duration of the snackbar show/hide animation, in ms.\n    ANIMATION_LENGTH: 250\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialSnackbar.prototype.cssClasses_ = {\n    SNACKBAR: 'mdl-snackbar',\n    MESSAGE: 'mdl-snackbar__text',\n    ACTION: 'mdl-snackbar__action',\n    ACTIVE: 'mdl-snackbar--active'\n};\n/**\n   * Display the snackbar.\n   *\n   * @private\n   */\nMaterialSnackbar.prototype.displaySnackbar_ = function () {\n    this.element_.setAttribute('aria-hidden', 'true');\n    if (this.actionHandler_) {\n        this.actionElement_.textContent = this.actionText_;\n        this.actionElement_.addEventListener('click', this.actionHandler_);\n        this.setActionHidden_(false);\n    }\n    this.textElement_.textContent = this.message_;\n    this.element_.classList.add(this.cssClasses_.ACTIVE);\n    this.element_.setAttribute('aria-hidden', 'false');\n    setTimeout(this.cleanup_.bind(this), this.timeout_);\n};\n/**\n   * Show the snackbar.\n   *\n   * @param {Object} data The data for the notification.\n   * @public\n   */\nMaterialSnackbar.prototype.showSnackbar = function (data) {\n    if (data === undefined) {\n        throw new Error('Please provide a data object with at least a message to display.');\n    }\n    if (data['message'] === undefined) {\n        throw new Error('Please provide a message to be displayed.');\n    }\n    if (data['actionHandler'] && !data['actionText']) {\n        throw new Error('Please provide action text with the handler.');\n    }\n    if (this.active) {\n        this.queuedNotifications_.push(data);\n    } else {\n        this.active = true;\n        this.message_ = data['message'];\n        if (data['timeout']) {\n            this.timeout_ = data['timeout'];\n        } else {\n            this.timeout_ = 2750;\n        }\n        if (data['actionHandler']) {\n            this.actionHandler_ = data['actionHandler'];\n        }\n        if (data['actionText']) {\n            this.actionText_ = data['actionText'];\n        }\n        this.displaySnackbar_();\n    }\n};\nMaterialSnackbar.prototype['showSnackbar'] = MaterialSnackbar.prototype.showSnackbar;\n/**\n   * Check if the queue has items within it.\n   * If it does, display the next entry.\n   *\n   * @private\n   */\nMaterialSnackbar.prototype.checkQueue_ = function () {\n    if (this.queuedNotifications_.length > 0) {\n        this.showSnackbar(this.queuedNotifications_.shift());\n    }\n};\n/**\n   * Cleanup the snackbar event listeners and accessiblity attributes.\n   *\n   * @private\n   */\nMaterialSnackbar.prototype.cleanup_ = function () {\n    this.element_.classList.remove(this.cssClasses_.ACTIVE);\n    setTimeout(function () {\n        this.element_.setAttribute('aria-hidden', 'true');\n        this.textElement_.textContent = '';\n        if (!Boolean(this.actionElement_.getAttribute('aria-hidden'))) {\n            this.setActionHidden_(true);\n            this.actionElement_.textContent = '';\n            this.actionElement_.removeEventListener('click', this.actionHandler_);\n        }\n        this.actionHandler_ = undefined;\n        this.message_ = undefined;\n        this.actionText_ = undefined;\n        this.active = false;\n        this.checkQueue_();\n    }.bind(this), this.Constant_.ANIMATION_LENGTH);\n};\n/**\n   * Set the action handler hidden state.\n   *\n   * @param {boolean} value\n   * @private\n   */\nMaterialSnackbar.prototype.setActionHidden_ = function (value) {\n    if (value) {\n        this.actionElement_.setAttribute('aria-hidden', 'true');\n    } else {\n        this.actionElement_.removeAttribute('aria-hidden');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialSnackbar,\n    classAsString: 'MaterialSnackbar',\n    cssClass: 'mdl-js-snackbar',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Spinner MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @param {HTMLElement} element The element that will be upgraded.\n   * @constructor\n   */\nvar MaterialSpinner = function MaterialSpinner(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialSpinner'] = MaterialSpinner;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialSpinner.prototype.Constant_ = { MDL_SPINNER_LAYER_COUNT: 4 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialSpinner.prototype.CssClasses_ = {\n    MDL_SPINNER_LAYER: 'mdl-spinner__layer',\n    MDL_SPINNER_CIRCLE_CLIPPER: 'mdl-spinner__circle-clipper',\n    MDL_SPINNER_CIRCLE: 'mdl-spinner__circle',\n    MDL_SPINNER_GAP_PATCH: 'mdl-spinner__gap-patch',\n    MDL_SPINNER_LEFT: 'mdl-spinner__left',\n    MDL_SPINNER_RIGHT: 'mdl-spinner__right'\n};\n/**\n   * Auxiliary method to create a spinner layer.\n   *\n   * @param {number} index Index of the layer to be created.\n   * @public\n   */\nMaterialSpinner.prototype.createLayer = function (index) {\n    var layer = document.createElement('div');\n    layer.classList.add(this.CssClasses_.MDL_SPINNER_LAYER);\n    layer.classList.add(this.CssClasses_.MDL_SPINNER_LAYER + '-' + index);\n    var leftClipper = document.createElement('div');\n    leftClipper.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER);\n    leftClipper.classList.add(this.CssClasses_.MDL_SPINNER_LEFT);\n    var gapPatch = document.createElement('div');\n    gapPatch.classList.add(this.CssClasses_.MDL_SPINNER_GAP_PATCH);\n    var rightClipper = document.createElement('div');\n    rightClipper.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER);\n    rightClipper.classList.add(this.CssClasses_.MDL_SPINNER_RIGHT);\n    var circleOwners = [\n        leftClipper,\n        gapPatch,\n        rightClipper\n    ];\n    for (var i = 0; i < circleOwners.length; i++) {\n        var circle = document.createElement('div');\n        circle.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE);\n        circleOwners[i].appendChild(circle);\n    }\n    layer.appendChild(leftClipper);\n    layer.appendChild(gapPatch);\n    layer.appendChild(rightClipper);\n    this.element_.appendChild(layer);\n};\nMaterialSpinner.prototype['createLayer'] = MaterialSpinner.prototype.createLayer;\n/**\n   * Stops the spinner animation.\n   * Public method for users who need to stop the spinner for any reason.\n   *\n   * @public\n   */\nMaterialSpinner.prototype.stop = function () {\n    this.element_.classList.remove('is-active');\n};\nMaterialSpinner.prototype['stop'] = MaterialSpinner.prototype.stop;\n/**\n   * Starts the spinner animation.\n   * Public method for users who need to manually start the spinner for any reason\n   * (instead of just adding the 'is-active' class to their markup).\n   *\n   * @public\n   */\nMaterialSpinner.prototype.start = function () {\n    this.element_.classList.add('is-active');\n};\nMaterialSpinner.prototype['start'] = MaterialSpinner.prototype.start;\n/**\n   * Initialize element.\n   */\nMaterialSpinner.prototype.init = function () {\n    if (this.element_) {\n        for (var i = 1; i <= this.Constant_.MDL_SPINNER_LAYER_COUNT; i++) {\n            this.createLayer(i);\n        }\n        this.element_.classList.add('is-upgraded');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialSpinner,\n    classAsString: 'MaterialSpinner',\n    cssClass: 'mdl-js-spinner',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Checkbox MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialSwitch = function MaterialSwitch(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialSwitch'] = MaterialSwitch;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialSwitch.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialSwitch.prototype.CssClasses_ = {\n    INPUT: 'mdl-switch__input',\n    TRACK: 'mdl-switch__track',\n    THUMB: 'mdl-switch__thumb',\n    FOCUS_HELPER: 'mdl-switch__focus-helper',\n    RIPPLE_EFFECT: 'mdl-js-ripple-effect',\n    RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE_CONTAINER: 'mdl-switch__ripple-container',\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE: 'mdl-ripple',\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_CHECKED: 'is-checked'\n};\n/**\n   * Handle change of state.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSwitch.prototype.onChange_ = function (event) {\n    this.updateClasses_();\n};\n/**\n   * Handle focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSwitch.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus of element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSwitch.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle mouseup.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialSwitch.prototype.onMouseUp_ = function (event) {\n    this.blur_();\n};\n/**\n   * Handle class updates.\n   *\n   * @private\n   */\nMaterialSwitch.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkToggleState();\n};\n/**\n   * Add blur.\n   *\n   * @private\n   */\nMaterialSwitch.prototype.blur_ = function () {\n    // TODO: figure out why there's a focus event being fired after our blur,\n    // so that we can avoid this hack.\n    window.setTimeout(function () {\n        this.inputElement_.blur();\n    }.bind(this), this.Constant_.TINY_TIMEOUT);\n};\n// Public methods.\n/**\n   * Check the components disabled state.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.checkDisabled = function () {\n    if (this.inputElement_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialSwitch.prototype['checkDisabled'] = MaterialSwitch.prototype.checkDisabled;\n/**\n   * Check the components toggled state.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.checkToggleState = function () {\n    if (this.inputElement_.checked) {\n        this.element_.classList.add(this.CssClasses_.IS_CHECKED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_CHECKED);\n    }\n};\nMaterialSwitch.prototype['checkToggleState'] = MaterialSwitch.prototype.checkToggleState;\n/**\n   * Disable switch.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.disable = function () {\n    this.inputElement_.disabled = true;\n    this.updateClasses_();\n};\nMaterialSwitch.prototype['disable'] = MaterialSwitch.prototype.disable;\n/**\n   * Enable switch.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.enable = function () {\n    this.inputElement_.disabled = false;\n    this.updateClasses_();\n};\nMaterialSwitch.prototype['enable'] = MaterialSwitch.prototype.enable;\n/**\n   * Activate switch.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.on = function () {\n    this.inputElement_.checked = true;\n    this.updateClasses_();\n};\nMaterialSwitch.prototype['on'] = MaterialSwitch.prototype.on;\n/**\n   * Deactivate switch.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.off = function () {\n    this.inputElement_.checked = false;\n    this.updateClasses_();\n};\nMaterialSwitch.prototype['off'] = MaterialSwitch.prototype.off;\n/**\n   * Initialize element.\n   */\nMaterialSwitch.prototype.init = function () {\n    if (this.element_) {\n        this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);\n        var track = document.createElement('div');\n        track.classList.add(this.CssClasses_.TRACK);\n        var thumb = document.createElement('div');\n        thumb.classList.add(this.CssClasses_.THUMB);\n        var focusHelper = document.createElement('span');\n        focusHelper.classList.add(this.CssClasses_.FOCUS_HELPER);\n        thumb.appendChild(focusHelper);\n        this.element_.appendChild(track);\n        this.element_.appendChild(thumb);\n        this.boundMouseUpHandler = this.onMouseUp_.bind(this);\n        if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {\n            this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);\n            this.rippleContainerElement_ = document.createElement('span');\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_EFFECT);\n            this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);\n            this.rippleContainerElement_.addEventListener('mouseup', this.boundMouseUpHandler);\n            var ripple = document.createElement('span');\n            ripple.classList.add(this.CssClasses_.RIPPLE);\n            this.rippleContainerElement_.appendChild(ripple);\n            this.element_.appendChild(this.rippleContainerElement_);\n        }\n        this.boundChangeHandler = this.onChange_.bind(this);\n        this.boundFocusHandler = this.onFocus_.bind(this);\n        this.boundBlurHandler = this.onBlur_.bind(this);\n        this.inputElement_.addEventListener('change', this.boundChangeHandler);\n        this.inputElement_.addEventListener('focus', this.boundFocusHandler);\n        this.inputElement_.addEventListener('blur', this.boundBlurHandler);\n        this.element_.addEventListener('mouseup', this.boundMouseUpHandler);\n        this.updateClasses_();\n        this.element_.classList.add('is-upgraded');\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialSwitch,\n    classAsString: 'MaterialSwitch',\n    cssClass: 'mdl-js-switch',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Textfield MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialTextfield = function MaterialTextfield(element) {\n    this.element_ = element;\n    this.maxRows = this.Constant_.NO_MAX_ROWS;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialTextfield'] = MaterialTextfield;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialTextfield.prototype.Constant_ = {\n    NO_MAX_ROWS: -1,\n    MAX_ROWS_ATTRIBUTE: 'maxrows'\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialTextfield.prototype.CssClasses_ = {\n    LABEL: 'mdl-textfield__label',\n    INPUT: 'mdl-textfield__input',\n    IS_DIRTY: 'is-dirty',\n    IS_FOCUSED: 'is-focused',\n    IS_DISABLED: 'is-disabled',\n    IS_INVALID: 'is-invalid',\n    IS_UPGRADED: 'is-upgraded',\n    HAS_PLACEHOLDER: 'has-placeholder'\n};\n/**\n   * Handle input being entered.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTextfield.prototype.onKeyDown_ = function (event) {\n    var currentRowCount = event.target.value.split('\\n').length;\n    if (event.keyCode === 13) {\n        if (currentRowCount >= this.maxRows) {\n            event.preventDefault();\n        }\n    }\n};\n/**\n   * Handle focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTextfield.prototype.onFocus_ = function (event) {\n    this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle lost focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTextfield.prototype.onBlur_ = function (event) {\n    this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n};\n/**\n   * Handle reset event from out side.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTextfield.prototype.onReset_ = function (event) {\n    this.updateClasses_();\n};\n/**\n   * Handle class updates.\n   *\n   * @private\n   */\nMaterialTextfield.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkValidity();\n    this.checkDirty();\n    this.checkFocus();\n};\n// Public methods.\n/**\n   * Check the disabled state and update field accordingly.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.checkDisabled = function () {\n    if (this.input_.disabled) {\n        this.element_.classList.add(this.CssClasses_.IS_DISABLED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DISABLED);\n    }\n};\nMaterialTextfield.prototype['checkDisabled'] = MaterialTextfield.prototype.checkDisabled;\n/**\n  * Check the focus state and update field accordingly.\n  *\n  * @public\n  */\nMaterialTextfield.prototype.checkFocus = function () {\n    if (Boolean(this.element_.querySelector(':focus'))) {\n        this.element_.classList.add(this.CssClasses_.IS_FOCUSED);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);\n    }\n};\nMaterialTextfield.prototype['checkFocus'] = MaterialTextfield.prototype.checkFocus;\n/**\n   * Check the validity state and update field accordingly.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.checkValidity = function () {\n    if (this.input_.validity) {\n        if (this.input_.validity.valid) {\n            this.element_.classList.remove(this.CssClasses_.IS_INVALID);\n        } else {\n            this.element_.classList.add(this.CssClasses_.IS_INVALID);\n        }\n    }\n};\nMaterialTextfield.prototype['checkValidity'] = MaterialTextfield.prototype.checkValidity;\n/**\n   * Check the dirty state and update field accordingly.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.checkDirty = function () {\n    if (this.input_.value && this.input_.value.length > 0) {\n        this.element_.classList.add(this.CssClasses_.IS_DIRTY);\n    } else {\n        this.element_.classList.remove(this.CssClasses_.IS_DIRTY);\n    }\n};\nMaterialTextfield.prototype['checkDirty'] = MaterialTextfield.prototype.checkDirty;\n/**\n   * Disable text field.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.disable = function () {\n    this.input_.disabled = true;\n    this.updateClasses_();\n};\nMaterialTextfield.prototype['disable'] = MaterialTextfield.prototype.disable;\n/**\n   * Enable text field.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.enable = function () {\n    this.input_.disabled = false;\n    this.updateClasses_();\n};\nMaterialTextfield.prototype['enable'] = MaterialTextfield.prototype.enable;\n/**\n   * Update text field value.\n   *\n   * @param {string} value The value to which to set the control (optional).\n   * @public\n   */\nMaterialTextfield.prototype.change = function (value) {\n    this.input_.value = value || '';\n    this.updateClasses_();\n};\nMaterialTextfield.prototype['change'] = MaterialTextfield.prototype.change;\n/**\n   * Initialize element.\n   */\nMaterialTextfield.prototype.init = function () {\n    if (this.element_) {\n        this.label_ = this.element_.querySelector('.' + this.CssClasses_.LABEL);\n        this.input_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);\n        if (this.input_) {\n            if (this.input_.hasAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE)) {\n                this.maxRows = parseInt(this.input_.getAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE), 10);\n                if (isNaN(this.maxRows)) {\n                    this.maxRows = this.Constant_.NO_MAX_ROWS;\n                }\n            }\n            if (this.input_.hasAttribute('placeholder')) {\n                this.element_.classList.add(this.CssClasses_.HAS_PLACEHOLDER);\n            }\n            this.boundUpdateClassesHandler = this.updateClasses_.bind(this);\n            this.boundFocusHandler = this.onFocus_.bind(this);\n            this.boundBlurHandler = this.onBlur_.bind(this);\n            this.boundResetHandler = this.onReset_.bind(this);\n            this.input_.addEventListener('input', this.boundUpdateClassesHandler);\n            this.input_.addEventListener('focus', this.boundFocusHandler);\n            this.input_.addEventListener('blur', this.boundBlurHandler);\n            this.input_.addEventListener('reset', this.boundResetHandler);\n            if (this.maxRows !== this.Constant_.NO_MAX_ROWS) {\n                // TODO: This should handle pasting multi line text.\n                // Currently doesn't.\n                this.boundKeyDownHandler = this.onKeyDown_.bind(this);\n                this.input_.addEventListener('keydown', this.boundKeyDownHandler);\n            }\n            var invalid = this.element_.classList.contains(this.CssClasses_.IS_INVALID);\n            this.updateClasses_();\n            this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n            if (invalid) {\n                this.element_.classList.add(this.CssClasses_.IS_INVALID);\n            }\n            if (this.input_.hasAttribute('autofocus')) {\n                this.element_.focus();\n                this.checkFocus();\n            }\n        }\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialTextfield,\n    classAsString: 'MaterialTextfield',\n    cssClass: 'mdl-js-textfield',\n    widget: true\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Tooltip MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialTooltip = function MaterialTooltip(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialTooltip'] = MaterialTooltip;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialTooltip.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialTooltip.prototype.CssClasses_ = {\n    IS_ACTIVE: 'is-active',\n    BOTTOM: 'mdl-tooltip--bottom',\n    LEFT: 'mdl-tooltip--left',\n    RIGHT: 'mdl-tooltip--right',\n    TOP: 'mdl-tooltip--top'\n};\n/**\n   * Handle mouseenter for tooltip.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTooltip.prototype.handleMouseEnter_ = function (event) {\n    var props = event.target.getBoundingClientRect();\n    var left = props.left + props.width / 2;\n    var top = props.top + props.height / 2;\n    var marginLeft = -1 * (this.element_.offsetWidth / 2);\n    var marginTop = -1 * (this.element_.offsetHeight / 2);\n    if (this.element_.classList.contains(this.CssClasses_.LEFT) || this.element_.classList.contains(this.CssClasses_.RIGHT)) {\n        left = props.width / 2;\n        if (top + marginTop < 0) {\n            this.element_.style.top = 0;\n            this.element_.style.marginTop = 0;\n        } else {\n            this.element_.style.top = top + 'px';\n            this.element_.style.marginTop = marginTop + 'px';\n        }\n    } else {\n        if (left + marginLeft < 0) {\n            this.element_.style.left = 0;\n            this.element_.style.marginLeft = 0;\n        } else {\n            this.element_.style.left = left + 'px';\n            this.element_.style.marginLeft = marginLeft + 'px';\n        }\n    }\n    if (this.element_.classList.contains(this.CssClasses_.TOP)) {\n        this.element_.style.top = props.top - this.element_.offsetHeight - 10 + 'px';\n    } else if (this.element_.classList.contains(this.CssClasses_.RIGHT)) {\n        this.element_.style.left = props.left + props.width + 10 + 'px';\n    } else if (this.element_.classList.contains(this.CssClasses_.LEFT)) {\n        this.element_.style.left = props.left - this.element_.offsetWidth - 10 + 'px';\n    } else {\n        this.element_.style.top = props.top + props.height + 10 + 'px';\n    }\n    this.element_.classList.add(this.CssClasses_.IS_ACTIVE);\n};\n/**\n   * Handle mouseleave for tooltip.\n   *\n   * @private\n   */\nMaterialTooltip.prototype.handleMouseLeave_ = function () {\n    this.element_.classList.remove(this.CssClasses_.IS_ACTIVE);\n};\n/**\n   * Initialize element.\n   */\nMaterialTooltip.prototype.init = function () {\n    if (this.element_) {\n        var forElId = this.element_.getAttribute('for');\n        if (forElId) {\n            this.forElement_ = document.getElementById(forElId);\n        }\n        if (this.forElement_) {\n            // It's left here because it prevents accidental text selection on Android\n            if (!this.forElement_.hasAttribute('tabindex')) {\n                this.forElement_.setAttribute('tabindex', '0');\n            }\n            this.boundMouseEnterHandler = this.handleMouseEnter_.bind(this);\n            this.boundMouseLeaveHandler = this.handleMouseLeave_.bind(this);\n            this.forElement_.addEventListener('mouseenter', this.boundMouseEnterHandler, false);\n            this.forElement_.addEventListener('touchend', this.boundMouseEnterHandler, false);\n            this.forElement_.addEventListener('mouseleave', this.boundMouseLeaveHandler, false);\n            window.addEventListener('touchstart', this.boundMouseLeaveHandler);\n        }\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialTooltip,\n    classAsString: 'MaterialTooltip',\n    cssClass: 'mdl-tooltip'\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Data Table Card MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\nvar MaterialDataTable = function MaterialDataTable(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialDataTable'] = MaterialDataTable;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialDataTable.prototype.Constant_ = {};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialDataTable.prototype.CssClasses_ = {\n    DATA_TABLE: 'mdl-data-table',\n    SELECTABLE: 'mdl-data-table--selectable',\n    SELECT_ELEMENT: 'mdl-data-table__select',\n    IS_SELECTED: 'is-selected',\n    IS_UPGRADED: 'is-upgraded'\n};\n/**\n   * Generates and returns a function that toggles the selection state of a\n   * single row (or multiple rows).\n   *\n   * @param {Element} checkbox Checkbox that toggles the selection state.\n   * @param {Element} row Row to toggle when checkbox changes.\n   * @param {(Array<Object>|NodeList)=} opt_rows Rows to toggle when checkbox changes.\n   * @private\n   */\nMaterialDataTable.prototype.selectRow_ = function (checkbox, row, opt_rows) {\n    if (row) {\n        return function () {\n            if (checkbox.checked) {\n                row.classList.add(this.CssClasses_.IS_SELECTED);\n            } else {\n                row.classList.remove(this.CssClasses_.IS_SELECTED);\n            }\n        }.bind(this);\n    }\n    if (opt_rows) {\n        return function () {\n            var i;\n            var el;\n            if (checkbox.checked) {\n                for (i = 0; i < opt_rows.length; i++) {\n                    el = opt_rows[i].querySelector('td').querySelector('.mdl-checkbox');\n                    el['MaterialCheckbox'].check();\n                    opt_rows[i].classList.add(this.CssClasses_.IS_SELECTED);\n                }\n            } else {\n                for (i = 0; i < opt_rows.length; i++) {\n                    el = opt_rows[i].querySelector('td').querySelector('.mdl-checkbox');\n                    el['MaterialCheckbox'].uncheck();\n                    opt_rows[i].classList.remove(this.CssClasses_.IS_SELECTED);\n                }\n            }\n        }.bind(this);\n    }\n};\n/**\n   * Creates a checkbox for a single or or multiple rows and hooks up the\n   * event handling.\n   *\n   * @param {Element} row Row to toggle when checkbox changes.\n   * @param {(Array<Object>|NodeList)=} opt_rows Rows to toggle when checkbox changes.\n   * @private\n   */\nMaterialDataTable.prototype.createCheckbox_ = function (row, opt_rows) {\n    var label = document.createElement('label');\n    var labelClasses = [\n        'mdl-checkbox',\n        'mdl-js-checkbox',\n        'mdl-js-ripple-effect',\n        this.CssClasses_.SELECT_ELEMENT\n    ];\n    label.className = labelClasses.join(' ');\n    var checkbox = document.createElement('input');\n    checkbox.type = 'checkbox';\n    checkbox.classList.add('mdl-checkbox__input');\n    if (row) {\n        checkbox.checked = row.classList.contains(this.CssClasses_.IS_SELECTED);\n        checkbox.addEventListener('change', this.selectRow_(checkbox, row));\n    } else if (opt_rows) {\n        checkbox.addEventListener('change', this.selectRow_(checkbox, null, opt_rows));\n    }\n    label.appendChild(checkbox);\n    componentHandler.upgradeElement(label, 'MaterialCheckbox');\n    return label;\n};\n/**\n   * Initialize element.\n   */\nMaterialDataTable.prototype.init = function () {\n    if (this.element_) {\n        var firstHeader = this.element_.querySelector('th');\n        var bodyRows = Array.prototype.slice.call(this.element_.querySelectorAll('tbody tr'));\n        var footRows = Array.prototype.slice.call(this.element_.querySelectorAll('tfoot tr'));\n        var rows = bodyRows.concat(footRows);\n        if (this.element_.classList.contains(this.CssClasses_.SELECTABLE)) {\n            var th = document.createElement('th');\n            var headerCheckbox = this.createCheckbox_(null, rows);\n            th.appendChild(headerCheckbox);\n            firstHeader.parentElement.insertBefore(th, firstHeader);\n            for (var i = 0; i < rows.length; i++) {\n                var firstCell = rows[i].querySelector('td');\n                if (firstCell) {\n                    var td = document.createElement('td');\n                    if (rows[i].parentNode.nodeName.toUpperCase() === 'TBODY') {\n                        var rowCheckbox = this.createCheckbox_(rows[i]);\n                        td.appendChild(rowCheckbox);\n                    }\n                    rows[i].insertBefore(td, firstCell);\n                }\n            }\n            this.element_.classList.add(this.CssClasses_.IS_UPGRADED);\n        }\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialDataTable,\n    classAsString: 'MaterialDataTable',\n    cssClass: 'mdl-js-data-table'\n});","/**\n * @license\n * Copyright 2015 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n   * Class constructor for Ripple MDL component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\nvar MaterialRipple = function MaterialRipple(element) {\n    this.element_ = element;\n    // Initialize instance.\n    this.init();\n};\nwindow['MaterialRipple'] = MaterialRipple;\n/**\n   * Store constants in one place so they can be updated easily.\n   *\n   * @enum {string | number}\n   * @private\n   */\nMaterialRipple.prototype.Constant_ = {\n    INITIAL_SCALE: 'scale(0.0001, 0.0001)',\n    INITIAL_SIZE: '1px',\n    INITIAL_OPACITY: '0.4',\n    FINAL_OPACITY: '0',\n    FINAL_SCALE: ''\n};\n/**\n   * Store strings for class names defined by this component that are used in\n   * JavaScript. This allows us to simply change it in one place should we\n   * decide to modify at a later date.\n   *\n   * @enum {string}\n   * @private\n   */\nMaterialRipple.prototype.CssClasses_ = {\n    RIPPLE_CENTER: 'mdl-ripple--center',\n    RIPPLE_EFFECT_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',\n    RIPPLE: 'mdl-ripple',\n    IS_ANIMATING: 'is-animating',\n    IS_VISIBLE: 'is-visible'\n};\n/**\n   * Handle mouse / finger down on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRipple.prototype.downHandler_ = function (event) {\n    if (!this.rippleElement_.style.width && !this.rippleElement_.style.height) {\n        var rect = this.element_.getBoundingClientRect();\n        this.boundHeight = rect.height;\n        this.boundWidth = rect.width;\n        this.rippleSize_ = Math.sqrt(rect.width * rect.width + rect.height * rect.height) * 2 + 2;\n        this.rippleElement_.style.width = this.rippleSize_ + 'px';\n        this.rippleElement_.style.height = this.rippleSize_ + 'px';\n    }\n    this.rippleElement_.classList.add(this.CssClasses_.IS_VISIBLE);\n    if (event.type === 'mousedown' && this.ignoringMouseDown_) {\n        this.ignoringMouseDown_ = false;\n    } else {\n        if (event.type === 'touchstart') {\n            this.ignoringMouseDown_ = true;\n        }\n        var frameCount = this.getFrameCount();\n        if (frameCount > 0) {\n            return;\n        }\n        this.setFrameCount(1);\n        var bound = event.currentTarget.getBoundingClientRect();\n        var x;\n        var y;\n        // Check if we are handling a keyboard click.\n        if (event.clientX === 0 && event.clientY === 0) {\n            x = Math.round(bound.width / 2);\n            y = Math.round(bound.height / 2);\n        } else {\n            var clientX = event.clientX ? event.clientX : event.touches[0].clientX;\n            var clientY = event.clientY ? event.clientY : event.touches[0].clientY;\n            x = Math.round(clientX - bound.left);\n            y = Math.round(clientY - bound.top);\n        }\n        this.setRippleXY(x, y);\n        this.setRippleStyles(true);\n        window.requestAnimationFrame(this.animFrameHandler.bind(this));\n    }\n};\n/**\n   * Handle mouse / finger up on element.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialRipple.prototype.upHandler_ = function (event) {\n    // Don't fire for the artificial \"mouseup\" generated by a double-click.\n    if (event && event.detail !== 2) {\n        // Allow a repaint to occur before removing this class, so the animation\n        // shows for tap events, which seem to trigger a mouseup too soon after\n        // mousedown.\n        window.setTimeout(function () {\n            this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE);\n        }.bind(this), 0);\n    }\n};\n/**\n   * Initialize element.\n   */\nMaterialRipple.prototype.init = function () {\n    if (this.element_) {\n        var recentering = this.element_.classList.contains(this.CssClasses_.RIPPLE_CENTER);\n        if (!this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT_IGNORE_EVENTS)) {\n            this.rippleElement_ = this.element_.querySelector('.' + this.CssClasses_.RIPPLE);\n            this.frameCount_ = 0;\n            this.rippleSize_ = 0;\n            this.x_ = 0;\n            this.y_ = 0;\n            // Touch start produces a compat mouse down event, which would cause a\n            // second ripples. To avoid that, we use this property to ignore the first\n            // mouse down after a touch start.\n            this.ignoringMouseDown_ = false;\n            this.boundDownHandler = this.downHandler_.bind(this);\n            this.element_.addEventListener('mousedown', this.boundDownHandler);\n            this.element_.addEventListener('touchstart', this.boundDownHandler);\n            this.boundUpHandler = this.upHandler_.bind(this);\n            this.element_.addEventListener('mouseup', this.boundUpHandler);\n            this.element_.addEventListener('mouseleave', this.boundUpHandler);\n            this.element_.addEventListener('touchend', this.boundUpHandler);\n            this.element_.addEventListener('blur', this.boundUpHandler);\n            /**\n         * Getter for frameCount_.\n         * @return {number} the frame count.\n         */\n            this.getFrameCount = function () {\n                return this.frameCount_;\n            };\n            /**\n         * Setter for frameCount_.\n         * @param {number} fC the frame count.\n         */\n            this.setFrameCount = function (fC) {\n                this.frameCount_ = fC;\n            };\n            /**\n         * Getter for rippleElement_.\n         * @return {Element} the ripple element.\n         */\n            this.getRippleElement = function () {\n                return this.rippleElement_;\n            };\n            /**\n         * Sets the ripple X and Y coordinates.\n         * @param  {number} newX the new X coordinate\n         * @param  {number} newY the new Y coordinate\n         */\n            this.setRippleXY = function (newX, newY) {\n                this.x_ = newX;\n                this.y_ = newY;\n            };\n            /**\n         * Sets the ripple styles.\n         * @param  {boolean} start whether or not this is the start frame.\n         */\n            this.setRippleStyles = function (start) {\n                if (this.rippleElement_ !== null) {\n                    var transformString;\n                    var scale;\n                    var size;\n                    var offset = 'translate(' + this.x_ + 'px, ' + this.y_ + 'px)';\n                    if (start) {\n                        scale = this.Constant_.INITIAL_SCALE;\n                        size = this.Constant_.INITIAL_SIZE;\n                    } else {\n                        scale = this.Constant_.FINAL_SCALE;\n                        size = this.rippleSize_ + 'px';\n                        if (recentering) {\n                            offset = 'translate(' + this.boundWidth / 2 + 'px, ' + this.boundHeight / 2 + 'px)';\n                        }\n                    }\n                    transformString = 'translate(-50%, -50%) ' + offset + scale;\n                    this.rippleElement_.style.webkitTransform = transformString;\n                    this.rippleElement_.style.msTransform = transformString;\n                    this.rippleElement_.style.transform = transformString;\n                    if (start) {\n                        this.rippleElement_.classList.remove(this.CssClasses_.IS_ANIMATING);\n                    } else {\n                        this.rippleElement_.classList.add(this.CssClasses_.IS_ANIMATING);\n                    }\n                }\n            };\n            /**\n         * Handles an animation frame.\n         */\n            this.animFrameHandler = function () {\n                if (this.frameCount_-- > 0) {\n                    window.requestAnimationFrame(this.animFrameHandler.bind(this));\n                } else {\n                    this.setRippleStyles(false);\n                }\n            };\n        }\n    }\n};\n// The component registers itself. It can assume componentHandler is available\n// in the global scope.\ncomponentHandler.register({\n    constructor: MaterialRipple,\n    classAsString: 'MaterialRipple',\n    cssClass: 'mdl-js-ripple-effect',\n    widget: false\n});"],"sourceRoot":"/source/"}