{"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","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","tabBar_","JS_RIPPLE_EFFECT","RIPPLE_CONTAINER","RIPPLE","content_","IS_ACTIVE","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","getAttribute","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","createEvent","initEvent","dispatchEvent","upgradeElementsInternal","Array","isArray","item","prototype","slice","call","HTMLElement","children","registerInternal","widgetMissing","newConfig","constructor","classAsString","hasOwnProperty","found","registerUpgradedCallbackInternal","regClass","upgradeAllRegisteredInternal","findCreatedComponentByNodeInternal","node","deconstructComponentInternal","downgradeMethod_","componentIndex","splice","upgrades","componentPlace","downgradeNodesInternal","downgradeNode","NodeList","Node","ComponentConfigPublic","ComponentConfig","Component","window","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","mdlDowngrade_","removeEventListener","mdlDowngrade","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","addAnimationEndListener_","cleanup","show","transitionDuration","itemDelay","transitionDelay","parentNode","MaterialProgress","INDETERMINATE_CLASS","setProgress","p","progressbar_","setBuffer","bufferbar_","auxbar_","el","firstChild","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","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","onKeyDown_","currentRowCount","checkValidity","checkDirty","input_","validity","valid","label_","parseInt","isNaN","boundUpdateClassesHandler","boundKeyDownHandler","invalid","MaterialTooltip","handleMouseEnter_","props","marginLeft","offsetWidth","boundMouseLeaveHandler","handleMouseLeave_","boundMouseEnterHandler","MaterialLayout","MAX_WIDTH","TAB_SCROLL_PIXELS","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_","scrollTop","screenSizeHandler_","screenSizeMediaQuery_","matches","drawer_","obfuscator_","drawerToggleHandler_","headerTransitionEndHandler_","headerClickHandler_","tabBar","directChildren","childNodes","numChildren","c","child","mode","drawerButton","drawerButtonIcon","textContent","obfuscator","matchMedia","addListener","tabContainer","leftButton","leftButtonIcon","scrollLeft","rightButton","rightButtonIcon","tabScrollHandler","scrollWidth","MaterialDataTable","DATA_TABLE","SELECTABLE","SELECT_ELEMENT","IS_SELECTED","selectRow_","checkbox","row","opt_rows","createCheckbox_","label","labelClasses","type","firstHeader","rows","th","headerCheckbox","firstCell","td","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 downgradeMethod_ = 'mdlDowngrade';\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 = document.createEvent('Events');\n      ev.initEvent('mdl-componentupgraded', true, true);\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   * Finds a created component by a given DOM node.\n   *\n   * @param {!Node} node\n   * @return {*}\n   */\n  function findCreatedComponentByNodeInternal(node) {\n    for (var n = 0; n < createdComponents_.length; n++) {\n      var component = createdComponents_[n];\n      if (component.element_ === node) {\n        return component;\n      }\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 {*} component\n   */\n  function deconstructComponentInternal(component) {\n    if (component &&\n        component[componentConfigProperty_]\n          .classConstructor.prototype\n          .hasOwnProperty(downgradeMethod_)) {\n      component[downgradeMethod_]();\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(\n          component[componentConfigProperty_].classAsString);\n      upgrades.splice(componentPlace, 1);\n      component.element_.setAttribute('data-upgraded', upgrades.join(','));\n\n      var ev = document.createEvent('Events');\n      ev.initEvent('mdl-componentdowngraded', true, true);\n      component.element_.dispatchEvent(ev);\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      deconstructComponentInternal(findCreatedComponentByNodeInternal(node));\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/**\n   * Downgrade the element.\n   *\n   * @private\n   */\nMaterialButton.prototype.mdlDowngrade_ = function () {\n    if (this.rippleElement_) {\n        this.rippleElement_.removeEventListener('mouseup', this.boundRippleBlurHandler);\n    }\n    this.element_.removeEventListener('mouseup', this.boundButtonBlurHandler);\n    this.element_.removeEventListener('mouseleave', this.boundButtonBlurHandler);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialButton.prototype.mdlDowngrade = MaterialButton.prototype.mdlDowngrade_;\nMaterialButton.prototype['mdlDowngrade'] = MaterialButton.prototype.mdlDowngrade;\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/**\n   * Downgrade the component.\n   *\n   * @private\n   */\nMaterialCheckbox.prototype.mdlDowngrade_ = function () {\n    if (this.rippleContainerElement_) {\n        this.rippleContainerElement_.removeEventListener('mouseup', this.boundRippleMouseUp);\n    }\n    this.inputElement_.removeEventListener('change', this.boundInputOnChange);\n    this.inputElement_.removeEventListener('focus', this.boundInputOnFocus);\n    this.inputElement_.removeEventListener('blur', this.boundInputOnBlur);\n    this.element_.removeEventListener('mouseup', this.boundElementMouseUp);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.mdlDowngrade = MaterialCheckbox.prototype.mdlDowngrade_;\nMaterialCheckbox.prototype['mdlDowngrade'] = MaterialCheckbox.prototype.mdlDowngrade;\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/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialIconToggle.prototype.mdlDowngrade_ = function () {\n    if (this.rippleContainerElement_) {\n        this.rippleContainerElement_.removeEventListener('mouseup', this.boundRippleMouseUp);\n    }\n    this.inputElement_.removeEventListener('change', this.boundInputOnChange);\n    this.inputElement_.removeEventListener('focus', this.boundInputOnFocus);\n    this.inputElement_.removeEventListener('blur', this.boundInputOnBlur);\n    this.element_.removeEventListener('mouseup', this.boundElementOnMouseUp);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.mdlDowngrade = MaterialIconToggle.prototype.mdlDowngrade_;\nMaterialIconToggle.prototype['mdlDowngrade'] = MaterialIconToggle.prototype.mdlDowngrade;\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');\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   * Adds an event listener to clean up after the animation ends.\n   *\n   * @private\n   */\nMaterialMenu.prototype.addAnimationEndListener_ = function () {\n    var cleanup = function () {\n        this.element_.removeEventListener('transitionend', cleanup);\n        this.element_.removeEventListener('webkitTransitionEnd', cleanup);\n        this.element_.classList.remove(this.CssClasses_.IS_ANIMATING);\n    }.bind(this);\n    // Remove animation class once the transition is done.\n    this.element_.addEventListener('transitionend', cleanup);\n    this.element_.addEventListener('webkitTransitionEnd', cleanup);\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.transitionDelay = null;\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/**\n   * Downgrade the component.\n   *\n   * @private\n   */\nMaterialMenu.prototype.mdlDowngrade_ = function () {\n    var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);\n    for (var i = 0; i < items.length; i++) {\n        items[i].removeEventListener('click', this.boundItemClick_);\n        items[i].removeEventListener('keydown', this.boundItemKeydown_);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialMenu.prototype.mdlDowngrade = MaterialMenu.prototype.mdlDowngrade_;\nMaterialMenu.prototype['mdlDowngrade'] = MaterialMenu.prototype.mdlDowngrade;\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/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialProgress.prototype.mdlDowngrade_ = function () {\n    while (this.element_.firstChild) {\n        this.element_.removeChild(this.element_.firstChild);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialProgress.prototype.mdlDowngrade = MaterialProgress.prototype.mdlDowngrade_;\nMaterialProgress.prototype['mdlDowngrade'] = MaterialProgress.prototype.mdlDowngrade;\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/**\n   * Downgrade the element.\n   *\n   * @private\n   */\nMaterialRadio.prototype.mdlDowngrade_ = function () {\n    var rippleContainer = this.element_.querySelector('.' + this.CssClasses_.RIPPLE_CONTAINER);\n    this.btnElement_.removeEventListener('change', this.boundChangeHandler_);\n    this.btnElement_.removeEventListener('focus', this.boundFocusHandler_);\n    this.btnElement_.removeEventListener('blur', this.boundBlurHandler_);\n    this.element_.removeEventListener('mouseup', this.boundMouseUpHandler_);\n    if (rippleContainer) {\n        rippleContainer.removeEventListener('mouseup', this.boundMouseUpHandler_);\n        this.element_.removeChild(rippleContainer);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialRadio.prototype.mdlDowngrade = MaterialRadio.prototype.mdlDowngrade_;\nMaterialRadio.prototype['mdlDowngrade'] = MaterialRadio.prototype.mdlDowngrade;\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/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialSlider.prototype.mdlDowngrade_ = function () {\n    this.element_.removeEventListener('input', this.boundInputHandler);\n    this.element_.removeEventListener('change', this.boundChangeHandler);\n    this.element_.removeEventListener('mouseup', this.boundMouseUpHandler);\n    this.element_.parentElement.removeEventListener('mousedown', this.boundContainerMouseDownHandler);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialSlider.prototype.mdlDowngrade = MaterialSlider.prototype.mdlDowngrade_;\nMaterialSlider.prototype['mdlDowngrade'] = MaterialSlider.prototype.mdlDowngrade;\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 * @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/**\n   * Downgrade the component.\n   *\n   * @private\n   */\nMaterialSwitch.prototype.mdlDowngrade_ = function () {\n    if (this.rippleContainerElement_) {\n        this.rippleContainerElement_.removeEventListener('mouseup', this.boundMouseUpHandler);\n    }\n    this.inputElement_.removeEventListener('change', this.boundChangeHandler);\n    this.inputElement_.removeEventListener('focus', this.boundFocusHandler);\n    this.inputElement_.removeEventListener('blur', this.boundBlurHandler);\n    this.element_.removeEventListener('mouseup', this.boundMouseUpHandler);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.mdlDowngrade = MaterialSwitch.prototype.mdlDowngrade_;\nMaterialSwitch.prototype['mdlDowngrade'] = MaterialSwitch.prototype.mdlDowngrade;\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 {HTMLElement} 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 {HTMLElement} 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};\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 class updates.\n   *\n   * @private\n   */\nMaterialTextfield.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkValidity();\n    this.checkDirty();\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 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            this.boundUpdateClassesHandler = this.updateClasses_.bind(this);\n            this.boundFocusHandler = this.onFocus_.bind(this);\n            this.boundBlurHandler = this.onBlur_.bind(this);\n            this.input_.addEventListener('input', this.boundUpdateClassesHandler);\n            this.input_.addEventListener('focus', this.boundFocusHandler);\n            this.input_.addEventListener('blur', this.boundBlurHandler);\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        }\n    }\n};\n/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialTextfield.prototype.mdlDowngrade_ = function () {\n    this.input_.removeEventListener('input', this.boundUpdateClassesHandler);\n    this.input_.removeEventListener('focus', this.boundFocusHandler);\n    this.input_.removeEventListener('blur', this.boundBlurHandler);\n    if (this.boundKeyDownHandler) {\n        this.input_.removeEventListener('keydown', this.boundKeyDownHandler);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.mdlDowngrade = MaterialTextfield.prototype.mdlDowngrade_;\nMaterialTextfield.prototype['mdlDowngrade'] = MaterialTextfield.prototype.mdlDowngrade;\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_ = { IS_ACTIVE: 'is-active' };\n/**\n   * Handle mouseenter for tooltip.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTooltip.prototype.handleMouseEnter_ = function (event) {\n    event.stopPropagation();\n    var props = event.target.getBoundingClientRect();\n    var left = props.left + props.width / 2;\n    var marginLeft = -1 * (this.element_.offsetWidth / 2);\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    this.element_.style.top = props.top + props.height + 10 + 'px';\n    this.element_.classList.add(this.CssClasses_.IS_ACTIVE);\n    window.addEventListener('scroll', this.boundMouseLeaveHandler, false);\n    window.addEventListener('touchmove', this.boundMouseLeaveHandler, false);\n};\n/**\n   * Handle mouseleave for tooltip.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTooltip.prototype.handleMouseLeave_ = function (event) {\n    event.stopPropagation();\n    this.element_.classList.remove(this.CssClasses_.IS_ACTIVE);\n    window.removeEventListener('scroll', this.boundMouseLeaveHandler);\n    window.removeEventListener('touchmove', this.boundMouseLeaveHandler, false);\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            // Tabindex needs to be set for `blur` events to be emitted\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('click', this.boundMouseEnterHandler, false);\n            this.forElement_.addEventListener('blur', this.boundMouseLeaveHandler);\n            this.forElement_.addEventListener('touchstart', this.boundMouseEnterHandler, false);\n            this.forElement_.addEventListener('mouseleave', this.boundMouseLeaveHandler);\n        }\n    }\n};\n/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialTooltip.prototype.mdlDowngrade_ = function () {\n    if (this.forElement_) {\n        this.forElement_.removeEventListener('mouseenter', this.boundMouseEnterHandler, false);\n        this.forElement_.removeEventListener('click', this.boundMouseEnterHandler, false);\n        this.forElement_.removeEventListener('touchstart', this.boundMouseEnterHandler, false);\n        this.forElement_.removeEventListener('mouseleave', this.boundMouseLeaveHandler);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialTooltip.prototype.mdlDowngrade = MaterialTooltip.prototype.mdlDowngrade_;\nMaterialTooltip.prototype['mdlDowngrade'] = MaterialTooltip.prototype.mdlDowngrade;\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    MENU_ICON: 'menu',\n    CHEVRON_LEFT: 'chevron_left',\n    CHEVRON_RIGHT: 'chevron_right'\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    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        this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\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        this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\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 toggling of the drawer.\n   *\n   * @private\n   */\nMaterialLayout.prototype.drawerToggleHandler_ = function () {\n    this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);\n    this.obfuscator_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);\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   * 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        this.element_.parentElement.insertBefore(container, this.element_);\n        this.element_.parentElement.removeChild(this.element_);\n        container.appendChild(this.element_);\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        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.classList.add(this.CssClasses_.DRAWER_BTN);\n                var drawerButtonIcon = document.createElement('i');\n                drawerButtonIcon.classList.add(this.CssClasses_.ICON);\n                drawerButtonIcon.textContent = 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            // 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        }\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 buttons depending on scroll position.\n            var tabScrollHandler = 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', tabScrollHandler);\n            tabScrollHandler();\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    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        e.preventDefault();\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}\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 {HTMLElement} 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 {HTMLElement} 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 {HTMLElement} 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    checkbox.addEventListener('change', this.selectRow_(checkbox, row, opt_rows));\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 rows = this.element_.querySelector('tbody').querySelectorAll('tr');\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                    var rowCheckbox = this.createCheckbox_(rows[i]);\n                    td.appendChild(rowCheckbox);\n                    rows[i].insertBefore(td, firstCell);\n                }\n            }\n        }\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: 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        this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE);\n    }\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   * 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/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialRipple.prototype.mdlDowngrade_ = function () {\n    this.element_.removeEventListener('mousedown', this.boundDownHandler);\n    this.element_.removeEventListener('touchstart', this.boundDownHandler);\n    this.element_.removeEventListener('mouseup', this.boundUpHandler);\n    this.element_.removeEventListener('mouseleave', this.boundUpHandler);\n    this.element_.removeEventListener('touchend', this.boundUpHandler);\n    this.element_.removeEventListener('blur', this.boundUpHandler);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialRipple.prototype.mdlDowngrade = MaterialRipple.prototype.mdlDowngrade_;\nMaterialRipple.prototype['mdlDowngrade'] = MaterialRipple.prototype.mdlDowngrade;\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 downgradeMethod_ = 'mdlDowngrade';\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 = document.createEvent('Events');\n      ev.initEvent('mdl-componentupgraded', true, true);\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   * Finds a created component by a given DOM node.\n   *\n   * @param {!Node} node\n   * @return {*}\n   */\n  function findCreatedComponentByNodeInternal(node) {\n    for (var n = 0; n < createdComponents_.length; n++) {\n      var component = createdComponents_[n];\n      if (component.element_ === node) {\n        return component;\n      }\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 {*} component\n   */\n  function deconstructComponentInternal(component) {\n    if (component &&\n        component[componentConfigProperty_]\n          .classConstructor.prototype\n          .hasOwnProperty(downgradeMethod_)) {\n      component[downgradeMethod_]();\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(\n          component[componentConfigProperty_].classAsString);\n      upgrades.splice(componentPlace, 1);\n      component.element_.setAttribute('data-upgraded', upgrades.join(','));\n\n      var ev = document.createEvent('Events');\n      ev.initEvent('mdl-componentdowngraded', true, true);\n      component.element_.dispatchEvent(ev);\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      deconstructComponentInternal(findCreatedComponentByNodeInternal(node));\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 {HTMLElement} 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 {HTMLElement} 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    MENU_ICON: 'menu',\n    CHEVRON_LEFT: 'chevron_left',\n    CHEVRON_RIGHT: 'chevron_right'\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    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        this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\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        this.header_.classList.add(this.CssClasses_.IS_ANIMATING);\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 toggling of the drawer.\n   *\n   * @private\n   */\nMaterialLayout.prototype.drawerToggleHandler_ = function () {\n    this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);\n    this.obfuscator_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);\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   * 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        this.element_.parentElement.insertBefore(container, this.element_);\n        this.element_.parentElement.removeChild(this.element_);\n        container.appendChild(this.element_);\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        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.classList.add(this.CssClasses_.DRAWER_BTN);\n                var drawerButtonIcon = document.createElement('i');\n                drawerButtonIcon.classList.add(this.CssClasses_.ICON);\n                drawerButtonIcon.textContent = 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            // 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        }\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 buttons depending on scroll position.\n            var tabScrollHandler = 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', tabScrollHandler);\n            tabScrollHandler();\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    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        e.preventDefault();\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}\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/**\n   * Downgrade the element.\n   *\n   * @private\n   */\nMaterialButton.prototype.mdlDowngrade_ = function () {\n    if (this.rippleElement_) {\n        this.rippleElement_.removeEventListener('mouseup', this.boundRippleBlurHandler);\n    }\n    this.element_.removeEventListener('mouseup', this.boundButtonBlurHandler);\n    this.element_.removeEventListener('mouseleave', this.boundButtonBlurHandler);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialButton.prototype.mdlDowngrade = MaterialButton.prototype.mdlDowngrade_;\nMaterialButton.prototype['mdlDowngrade'] = MaterialButton.prototype.mdlDowngrade;\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/**\n   * Downgrade the component.\n   *\n   * @private\n   */\nMaterialCheckbox.prototype.mdlDowngrade_ = function () {\n    if (this.rippleContainerElement_) {\n        this.rippleContainerElement_.removeEventListener('mouseup', this.boundRippleMouseUp);\n    }\n    this.inputElement_.removeEventListener('change', this.boundInputOnChange);\n    this.inputElement_.removeEventListener('focus', this.boundInputOnFocus);\n    this.inputElement_.removeEventListener('blur', this.boundInputOnBlur);\n    this.element_.removeEventListener('mouseup', this.boundElementMouseUp);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialCheckbox.prototype.mdlDowngrade = MaterialCheckbox.prototype.mdlDowngrade_;\nMaterialCheckbox.prototype['mdlDowngrade'] = MaterialCheckbox.prototype.mdlDowngrade;\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/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialIconToggle.prototype.mdlDowngrade_ = function () {\n    if (this.rippleContainerElement_) {\n        this.rippleContainerElement_.removeEventListener('mouseup', this.boundRippleMouseUp);\n    }\n    this.inputElement_.removeEventListener('change', this.boundInputOnChange);\n    this.inputElement_.removeEventListener('focus', this.boundInputOnFocus);\n    this.inputElement_.removeEventListener('blur', this.boundInputOnBlur);\n    this.element_.removeEventListener('mouseup', this.boundElementOnMouseUp);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialIconToggle.prototype.mdlDowngrade = MaterialIconToggle.prototype.mdlDowngrade_;\nMaterialIconToggle.prototype['mdlDowngrade'] = MaterialIconToggle.prototype.mdlDowngrade;\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');\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   * Adds an event listener to clean up after the animation ends.\n   *\n   * @private\n   */\nMaterialMenu.prototype.addAnimationEndListener_ = function () {\n    var cleanup = function () {\n        this.element_.removeEventListener('transitionend', cleanup);\n        this.element_.removeEventListener('webkitTransitionEnd', cleanup);\n        this.element_.classList.remove(this.CssClasses_.IS_ANIMATING);\n    }.bind(this);\n    // Remove animation class once the transition is done.\n    this.element_.addEventListener('transitionend', cleanup);\n    this.element_.addEventListener('webkitTransitionEnd', cleanup);\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.transitionDelay = null;\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/**\n   * Downgrade the component.\n   *\n   * @private\n   */\nMaterialMenu.prototype.mdlDowngrade_ = function () {\n    var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);\n    for (var i = 0; i < items.length; i++) {\n        items[i].removeEventListener('click', this.boundItemClick_);\n        items[i].removeEventListener('keydown', this.boundItemKeydown_);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialMenu.prototype.mdlDowngrade = MaterialMenu.prototype.mdlDowngrade_;\nMaterialMenu.prototype['mdlDowngrade'] = MaterialMenu.prototype.mdlDowngrade;\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/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialProgress.prototype.mdlDowngrade_ = function () {\n    while (this.element_.firstChild) {\n        this.element_.removeChild(this.element_.firstChild);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialProgress.prototype.mdlDowngrade = MaterialProgress.prototype.mdlDowngrade_;\nMaterialProgress.prototype['mdlDowngrade'] = MaterialProgress.prototype.mdlDowngrade;\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/**\n   * Downgrade the element.\n   *\n   * @private\n   */\nMaterialRadio.prototype.mdlDowngrade_ = function () {\n    var rippleContainer = this.element_.querySelector('.' + this.CssClasses_.RIPPLE_CONTAINER);\n    this.btnElement_.removeEventListener('change', this.boundChangeHandler_);\n    this.btnElement_.removeEventListener('focus', this.boundFocusHandler_);\n    this.btnElement_.removeEventListener('blur', this.boundBlurHandler_);\n    this.element_.removeEventListener('mouseup', this.boundMouseUpHandler_);\n    if (rippleContainer) {\n        rippleContainer.removeEventListener('mouseup', this.boundMouseUpHandler_);\n        this.element_.removeChild(rippleContainer);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialRadio.prototype.mdlDowngrade = MaterialRadio.prototype.mdlDowngrade_;\nMaterialRadio.prototype['mdlDowngrade'] = MaterialRadio.prototype.mdlDowngrade;\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/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialSlider.prototype.mdlDowngrade_ = function () {\n    this.element_.removeEventListener('input', this.boundInputHandler);\n    this.element_.removeEventListener('change', this.boundChangeHandler);\n    this.element_.removeEventListener('mouseup', this.boundMouseUpHandler);\n    this.element_.parentElement.removeEventListener('mousedown', this.boundContainerMouseDownHandler);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialSlider.prototype.mdlDowngrade = MaterialSlider.prototype.mdlDowngrade_;\nMaterialSlider.prototype['mdlDowngrade'] = MaterialSlider.prototype.mdlDowngrade;\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 * @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/**\n   * Downgrade the component.\n   *\n   * @private\n   */\nMaterialSwitch.prototype.mdlDowngrade_ = function () {\n    if (this.rippleContainerElement_) {\n        this.rippleContainerElement_.removeEventListener('mouseup', this.boundMouseUpHandler);\n    }\n    this.inputElement_.removeEventListener('change', this.boundChangeHandler);\n    this.inputElement_.removeEventListener('focus', this.boundFocusHandler);\n    this.inputElement_.removeEventListener('blur', this.boundBlurHandler);\n    this.element_.removeEventListener('mouseup', this.boundMouseUpHandler);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialSwitch.prototype.mdlDowngrade = MaterialSwitch.prototype.mdlDowngrade_;\nMaterialSwitch.prototype['mdlDowngrade'] = MaterialSwitch.prototype.mdlDowngrade;\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};\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 class updates.\n   *\n   * @private\n   */\nMaterialTextfield.prototype.updateClasses_ = function () {\n    this.checkDisabled();\n    this.checkValidity();\n    this.checkDirty();\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 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            this.boundUpdateClassesHandler = this.updateClasses_.bind(this);\n            this.boundFocusHandler = this.onFocus_.bind(this);\n            this.boundBlurHandler = this.onBlur_.bind(this);\n            this.input_.addEventListener('input', this.boundUpdateClassesHandler);\n            this.input_.addEventListener('focus', this.boundFocusHandler);\n            this.input_.addEventListener('blur', this.boundBlurHandler);\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        }\n    }\n};\n/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialTextfield.prototype.mdlDowngrade_ = function () {\n    this.input_.removeEventListener('input', this.boundUpdateClassesHandler);\n    this.input_.removeEventListener('focus', this.boundFocusHandler);\n    this.input_.removeEventListener('blur', this.boundBlurHandler);\n    if (this.boundKeyDownHandler) {\n        this.input_.removeEventListener('keydown', this.boundKeyDownHandler);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialTextfield.prototype.mdlDowngrade = MaterialTextfield.prototype.mdlDowngrade_;\nMaterialTextfield.prototype['mdlDowngrade'] = MaterialTextfield.prototype.mdlDowngrade;\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_ = { IS_ACTIVE: 'is-active' };\n/**\n   * Handle mouseenter for tooltip.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTooltip.prototype.handleMouseEnter_ = function (event) {\n    event.stopPropagation();\n    var props = event.target.getBoundingClientRect();\n    var left = props.left + props.width / 2;\n    var marginLeft = -1 * (this.element_.offsetWidth / 2);\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    this.element_.style.top = props.top + props.height + 10 + 'px';\n    this.element_.classList.add(this.CssClasses_.IS_ACTIVE);\n    window.addEventListener('scroll', this.boundMouseLeaveHandler, false);\n    window.addEventListener('touchmove', this.boundMouseLeaveHandler, false);\n};\n/**\n   * Handle mouseleave for tooltip.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\nMaterialTooltip.prototype.handleMouseLeave_ = function (event) {\n    event.stopPropagation();\n    this.element_.classList.remove(this.CssClasses_.IS_ACTIVE);\n    window.removeEventListener('scroll', this.boundMouseLeaveHandler);\n    window.removeEventListener('touchmove', this.boundMouseLeaveHandler, false);\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            // Tabindex needs to be set for `blur` events to be emitted\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('click', this.boundMouseEnterHandler, false);\n            this.forElement_.addEventListener('blur', this.boundMouseLeaveHandler);\n            this.forElement_.addEventListener('touchstart', this.boundMouseEnterHandler, false);\n            this.forElement_.addEventListener('mouseleave', this.boundMouseLeaveHandler);\n        }\n    }\n};\n/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialTooltip.prototype.mdlDowngrade_ = function () {\n    if (this.forElement_) {\n        this.forElement_.removeEventListener('mouseenter', this.boundMouseEnterHandler, false);\n        this.forElement_.removeEventListener('click', this.boundMouseEnterHandler, false);\n        this.forElement_.removeEventListener('touchstart', this.boundMouseEnterHandler, false);\n        this.forElement_.removeEventListener('mouseleave', this.boundMouseLeaveHandler);\n    }\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialTooltip.prototype.mdlDowngrade = MaterialTooltip.prototype.mdlDowngrade_;\nMaterialTooltip.prototype['mdlDowngrade'] = MaterialTooltip.prototype.mdlDowngrade;\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 {HTMLElement} 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 {HTMLElement} 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 {HTMLElement} 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    checkbox.addEventListener('change', this.selectRow_(checkbox, row, opt_rows));\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 rows = this.element_.querySelector('tbody').querySelectorAll('tr');\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                    var rowCheckbox = this.createCheckbox_(rows[i]);\n                    td.appendChild(rowCheckbox);\n                    rows[i].insertBefore(td, firstCell);\n                }\n            }\n        }\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: 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        this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE);\n    }\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   * 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/**\n   * Downgrade the component\n   *\n   * @private\n   */\nMaterialRipple.prototype.mdlDowngrade_ = function () {\n    this.element_.removeEventListener('mousedown', this.boundDownHandler);\n    this.element_.removeEventListener('touchstart', this.boundDownHandler);\n    this.element_.removeEventListener('mouseup', this.boundUpHandler);\n    this.element_.removeEventListener('mouseleave', this.boundUpHandler);\n    this.element_.removeEventListener('touchend', this.boundUpHandler);\n    this.element_.removeEventListener('blur', this.boundUpHandler);\n};\n/**\n   * Public alias for the downgrade method.\n   *\n   * @public\n   */\nMaterialRipple.prototype.mdlDowngrade = MaterialRipple.prototype.mdlDowngrade_;\nMaterialRipple.prototype['mdlDowngrade'] = MaterialRipple.prototype.mdlDowngrade;\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/"}