{"version":3,"sources":["webpack:///app.13b113c04f0f4e78b976.js","webpack:///./client/app/app.js","webpack:///./client/app/app.js?49b0","webpack:///./~/angular-material/index.js","webpack:///./~/angular-material/angular-material.js","webpack:///./client/app/app.config.js","webpack:///./client/app/app.config.js?fdf3","webpack:///./client/app/main/main.component.js","webpack:///./client/app/main/main.component.js?2017","webpack:///./client/app/main/main.routes.js","webpack:///./client/app/main/main.routes.js?be36","webpack:///./client/app/main/main.html","webpack:///./client/app/results/results.component.js","webpack:///./client/app/results/results.component.js?ba55","webpack:///./client/app/results/results.routes.js","webpack:///./client/app/results/results.routes.js?c5e6","webpack:///./client/app/results/results.html","webpack:///./client/app/app.constants.js","webpack:///./client/app/app.constants.js?84c2","webpack:///./server/config/environment/shared.js","webpack:///./client/components/util/util.module.js","webpack:///./client/components/util/util.module.js?4ebe","webpack:///./client/components/util/util.service.js","webpack:///./client/components/util/util.service.js?45be","webpack:///./client/components/header/hpe-header.component.js","webpack:///./client/components/header/hpe-header.component.js?22bb","webpack:///./client/components/header/hpe-header.html","webpack:///./client/components/footer/footer.component.js","webpack:///./client/components/footer/footer.component.js?1fdf","webpack:///./client/components/footer/footer.html","webpack:///./client/components/question/question.component.js","webpack:///./client/components/question/question.component.js?152a","webpack:///./client/components/question/question.html","webpack:///./client/components/stepper/stepper.component.js","webpack:///./client/components/stepper/stepper.component.js?58c4","webpack:///./client/components/stepper/stepper.html","webpack:///./client/components/stepper/step/step.component.js","webpack:///./client/components/stepper/step/step.component.js?d92e","webpack:///./client/components/stepper/step/step.html","webpack:///./client/components/horizontal-stepper/horizontal-stepper.component.js","webpack:///./client/components/horizontal-stepper/horizontal-stepper.component.js?1051","webpack:///./client/components/horizontal-stepper/horizontal-stepper.html","webpack:///./client/components/horizontal-stepper/horizontal-step/horizontal-step.component.js","webpack:///./client/components/horizontal-stepper/horizontal-step/horizontal-step.component.js?d235","webpack:///./client/components/horizontal-stepper/horizontal-step/horizontal-step.html","webpack:///./client/app/app.scss?0cf0","webpack:///./client/app/app.scss","webpack:///./~/css-loader/lib/css-base.js","webpack:///./client/assets/fonts/font-awesome/fontawesome-webfont.eot","webpack:///./client/assets/fonts/font-awesome/fontawesome-webfont.woff2","webpack:///./client/assets/fonts/font-awesome/fontawesome-webfont.woff","webpack:///./client/assets/fonts/font-awesome/fontawesome-webfont.ttf","webpack:///./client/assets/fonts/font-awesome/fontawesome-webfont.svg","webpack:///./~/style-loader/addStyles.js"],"names":["webpackJsonp","module","exports","__webpack_require__","_interopRequireDefault","obj","__esModule","default","_angular","_angular2","_angularAnimate","_angularAnimate2","_angularCookies","_angularCookies2","_angularResource","_angularResource2","_angularSanitize","_angularSanitize2","_angularUiRouter","_angularUiRouter2","_angularMaterial","_angularMaterial2","_app","_main","_main2","_results","_results2","_app2","_app3","_util","_util2","_hpeHeader","_hpeHeader2","_footer","_footer2","_question","_question2","_stepper","_stepper2","_step","_step2","_horizontalStepper","_horizontalStepper2","_horizontalStep","_horizontalStep2","config","routeConfig","run","mainstayConfig","element","document","ready","bootstrap","strictDi","window","angular","undefined","DetectNgTouch","$log","$injector","has","msg","warn","MdCoreConfigure","$provide","$mdThemingProvider","decorator","rAFDecorator","qDecorator","theme","primaryPalette","accentPalette","warnPalette","backgroundPalette","$delegate","throttle","cb","queuedArgs","alreadyQueued","queueCb","context","arguments","this","apply","Array","prototype","slice","call","resolve","when","$inject","MdAutofocusDirective","$parse","preLink","scope","attr","updateExpression","value","isUndefined","toggleClass","attrExp","mdAutoFocus","mdAutofocus","mdSidenavFocus","$watch","restrict","link","pre","directive","ColorUtilFactory","hexToRgba","color","hex","substr","dig","length","red","green","blue","parseInt","rgbaToHex","match","toString","toUpperCase","rgbToRgba","replace","rgbaToRgb","factory","MdConstantFactory","vendorProperty","name","prefixedName","vendorPrefix","ucPrefix","camelCase","lcPrefix","charAt","toLowerCase","substring","hasStyleProperty","prefixTestEl","testElement","property","isDefined","style","input","SPECIAL_CHARS_REGEXP","matches","separator","letter","offset","getVendorPrefix","prop","vendorRegex","exec","createElement","isWebkit","test","self","isInputKey","e","keyCode","isNumPadKey","location","isMetaKey","isFnLockKey","isNavigationKey","kc","KEY_CODE","NAVIGATION_KEYS","SPACE","ENTER","UP_ARROW","DOWN_ARROW","indexOf","hasModifierKey","ctrlKey","metaKey","altKey","ELEMENT_MAX_PIXELS","BEFORE_NG_ARIA","COMMA","SEMICOLON","ESCAPE","PAGE_UP","PAGE_DOWN","END","HOME","LEFT_ARROW","RIGHT_ARROW","TAB","BACKSPACE","DELETE","CSS","TRANSITIONEND","ANIMATIONEND","TRANSFORM","TRANSFORM_ORIGIN","TRANSITION","TRANSITION_DURATION","ANIMATION_PLAY_STATE","ANIMATION_DURATION","ANIMATION_NAME","ANIMATION_TIMING","ANIMATION_DIRECTION","MEDIA","xs","gt-xs","sm","gt-sm","md","gt-md","lg","gt-lg","xl","landscape","portrait","print","MEDIA_PRIORITY","MdIterator","items","reloop","getItems","concat","_items","count","inRange","index","hasNext","item","hasPrevious","itemAt","findBy","key","val","filter","add","isNumber","splice","remove","contains","first","last","findSubsequentItem","backwards","validate","limit","trueFn","curIndex","nextIndex","foundItem","isArray","next","bind","previous","iterator","mdMediaFactory","$mdConstant","$rootScope","$window","$mdMedia","query","validated","queries","result","results","mqls","matchMedia","addListener","onQueryChange","media","$evalAsync","getQuery","getResponsiveAttribute","attrs","attrName","i","mediaName","normalizedName","getNormalizedName","watchResponsiveAttributes","attrNames","watchFn","unwatchFns","forEach","push","$observe","fn","normalizeCache","$normalize","MdPrefixer","initialAttributes","buildSelector","_buildList","attributes","PREFIXES","prefix","_buildSelector","map","join","_hasAttribute","attribute","_getNativeElement","prefixedAttrs","hasAttribute","_removeAttribute","prefixedAttribute","removeAttribute","nodeType","buildList","prefixer","UtilFactory","$document","$timeout","$compile","$$mdAnimate","$interpolate","$rootElement","$$rAF","validateCssValue","hasPx","hasPercent","String","getNode","el","startSymbol","endSymbol","usesStandardSymbols","hasComputedStyle","target","expectedVal","hasValue","computedStyles","getComputedStyle","$mdUtil","dom","now","performance","Date","getTime","getModelOption","ngModelCtrl","optionName","$options","getOption","bidi","lValue","rValue","ltr","dir","body","elem","css","bidiProperty","lProperty","rProperty","clientRect","offsetParent","isOffsetRect","node","nodeRect","getBoundingClientRect","offsetRect","left","top","width","height","nodesToArray","nodes","getViewportTop","scrollY","pageYOffset","findFocusTarget","containerEl","attributeVal","scanForFocusable","selector","elFound","querySelectorAll","it","isFocusable","hasClass","elToFocus","AUTO_FOCUS","disableScrollAround","parent","options","disableElementScroll","preventDefault","scrollMask","disableScrollMask","append","on","off","parentNode","removeChild","disableBodyScroll","documentElement","prevDocumentStyle","cssText","prevBodyStyle","viewportTop","clientWidth","hasVerticalScrollbar","scrollHeight","clientHeight","position","overflow","overflowY","scrollTop","_count","Math","max","_restoreScroll","restoreBody","restoreElement","enableScrolling","restoreFn","floatingScrollbars","cached","tempNode","z-index","overflow-y","children","appendChild","offsetWidth","childNodes","forceFocus","addEventListener","focusOnClick","ev","$focus","focus","stopImmediatePropagation","removeEventListener","newEvent","createEvent","initMouseEvent","$material","dispatchEvent","createBackdrop","addClass","supplant","template","values","pattern","a","b","p","split","r","s","hasOwnProperty","fakeNgModel","$fake","$setTouched","noop","$setViewValue","$viewValue","$render","$viewChangeListeners","$isEmpty","$parsers","$formatters","debounce","func","wait","invokeApply","timer","args","cancel","delay","recent","time","start","valueOnUse","getter","params","Object","defineProperty","get","nextUid","nextUniqueId","disconnectScope","$root","$$destroyed","$parent","$$disconnected","$$childHead","$$nextSibling","$$childTail","$$prevSibling","reconnectScope","child","getClosest","validateWith","onlyParent","isString","tagName","nodeName","elementContains","hasContains","Node","findFn","arg","compareDocumentPosition","extractElementByName","scanDeep","warnNotFound","scanTree","scanLevel","scanChildren","len","found","j","numChild","outerHTML","initOptionalProperties","defaults","$$isolateBindings","binding","optional","attrIsDefined","nextTick","callback","digest","processQueue","queue","timeout","queueItem","skip","$digest","processTemplate","getParentWithPointerEvents","getNearestContentElement","current","checkStickySupport","stickyProp","testEl","stickyProps","parseAttributeBoolean","negatedCheck","isParentFormSubmitted","form","controller","$submitted","animateScrollTo","scrollEnd","duration","scrollChunk","newPosition","calculateNewPosition","scrollingDown","easeDuration","currentTime","startTime","ease","scrollStart","scrollChange","change","ts","tc","uniq","array","animator","blur","MdCompilerService","$q","$templateRequest","$controller","service","compile","contentElement","_prepareContentElement","_compileTemplate","_fetchContentElement","cleanup","restore","locals","templateUrl","extend","transformTemplate","identity","invoke","$$ngTemplate","all","then","html","trim","contents","_compileElement","linkFn","$scope","injectLocals","$element","invokeCtrl","controllerAs","bindToController","instance","ctrl","data","compileData","ngLinkFn","createRestoreFn","nextSibling","nextElementSibling","insertBefore","contentEl","querySelector","MdAriaProvider","disableWarnings","showWarnings","$get","MdAriaService","expect","defaultValue","getAttribute","childHasAttribute","expectAsync","defaultValueGetter","expectWithText","content","getText","hasBinding","expectWithoutText","isAriaHiddenNode","walker","createTreeWalker","NodeFilter","SHOW_TEXT","text","nextNode","textContent","isHidden","currentStyle","display","hasChildren","hasChildNodes","hasAttr","hasAriaLabel","parentHasAriaLabel","level","performCheck","provider","MdInteractionService","bodyElement","isBuffering","bufferTimeout","lastInteractionType","lastInteractionTime","inputEventMap","keydown","mousedown","mouseenter","touchstart","pointerdown","MSPointerDown","iePointerMap","2","3","4","initializeEvents","pointerEvent","onInputEvent","onBufferInputEvent","event","type","pointerType","getLastInteractionType","isUserInvoked","checkDelay","MdGestureProvider","MdGesture","$$MdGestureHandler","checkDistanceAndEmit","eventName","pointer","distance","state","maxDistance","register","handlerName","handler","HANDLERS","Error","keys","registerElement","addHandler","definition","getTouchAction","vendorPrefixes","userAgent","navigator","vendor","opera","isIos","isAndroid","touchActionProperty","hasJQuery","jQuery","isHijackingClicks","forceSkipClickHijack","maxClickDistance","onEnd","canFocus","focusableElements","isContentEditable","onStart","onCancel","registeredParent","pos","x","y","onMove","dx","dy","sqrt","minDistance","horizontal","cancelMultiplier","onSetup","oldTouchAction","onCleanup","shouldStartDrag","shouldCancel","dragPointer","dispatchDragMove","abs","distanceX","distanceY","makeStartPointer","updatePointerState","isRunning","minVelocity","eventType","velocityX","directionX","velocityY","directionY","GestureHandler","MdGestureHandler","jQueryDispatchEvent","srcEvent","eventPointer","eventObj","Event","clientX","clientY","screenX","screenY","pageX","pageY","shiftKey","trigger","nativeDispatchEvent","detail","button","relatedTarget","initCustomEvent","parentTarget","getNearestParent","parentTargetOptions","$mdGesture","move","end","onDestroy","attachToDocument","mouseInputHijacker","isKeyClick","isIonicTap","isInputEventFromLabelClick","stopPropagation","clickHijacker","isSubmitEvent","lastLabelClickPos","runHandlers","handlerEvent","gestureStart","lastPointer","typesMatch","endTime","gestureMove","gestureEnd","isInitialized","START_EVENTS","MOVE_EVENTS","END_EVENTS","point","getEventPoint","startPointer","startX","startY","originalEvent","touches","changedTouches","skipClickHijack","InterimElementProvider","createInterimElementProvider","interimFactoryName","setDefaults","providerConfig","optionsFactory","methods","EXPOSED_METHODS","addMethod","customMethods","addPreset","presets","argOption","$$interimElement","showInterimElement","opts","_options","interimElementService","show","defaultOptions","destroyInterimElement","destroy","invokeFactory","defaultVal","publicService","defaultMethods","hide","Preset","presetDefaults","presetMethods","$type","methodName","isObject","InterimElementFactory","$animate","$mdCompiler","$mdTheming","$exceptionHandler","interimElement","InterimElement","hideAction","multiple","showPromises","promiseArray","hidePromises","showingInterims","showAction","catch","reason","finally","deferred","promise","fault","closeElement","interim","closeAll","reverse","closeTo","pop","cancelAction","waitForInterim","callbackFn","fnArguments","targetEl","shift","parentEl","filtered","entry","SHOW_CANCELLED","$destroy","createAndTransitionIn","reject","rejectAll","onCompiling","compileElement","compiledData","linkElement","cleanupElement","showElement","transitionOutAndRemove","response","isCancelled","resolveAll","cancelAutoHide","triggerHandler","hideElement","configureScopeAndTransitions","preserveScope","$new","isolateScope","onShow","enter","onRemove","leave","compiled","skipCompile","findParent","themable","isFunction","startAutoHide","autoHideTimer","hideDelay","notifyShowing","onShowing","notifyComplete","onComplete","message","announceRemoving","onRemoving","action","defer","$injector_","registerLayoutAPI","directiveNormalize","PREFIX_REGEXP","_","BREAKPOINTS","API_WITH_VALUES","API_NO_VALUES","mqb","fullName","attributeWithObserve","attributeWithoutValue","validateAttributeValue","validateAttributeUsage","disableLayouts","isDisabled","enabled","disableLayoutDirective","buildCloakInterceptor","warnAttrNotSupported","detectDisabledLayouts","priority","className","removeClass","translateWithValueToCssClass","updateFn","updateClassWithValue","unwatch","getNormalizedAttrValue","$on","_$mdUtil_","_$interpolate_","_$log_","buildUpdateFn","translateToCssClass","lastClass","newValue","WHITESPACE","parts","usage","url","SUFFIXES","origValue","needsInterpolation","findIn","LAYOUT_OPTIONS","FLEX_OPTIONS","isNaN","axis","extractAlignAxis","fallback","normalizedAttr","list","replaceWith","attrValue","main","cross","ALIGNMENT_MAIN_AXIS","ALIGNMENT_CROSS_AXIS","breakpoints","MdLiveAnnouncer","_$timeout","_liveElement","_createLiveElement","_announceTimeout","announce","politeness","setAttribute","liveEl","classList","mapExistingElement","metaElements","getElementsByName","setMeta","newMeta","head","getMeta","ComponentRegistry","isValidID","handle","instances","pendings","notFoundError","msgContext","error","getInstances","$$mdHandle","deregister","resolveWhen","dfd","MdButtonInkRipple","$mdInkRipple","optionsForElement","isMenuItem","fitRipple","center","dimBackground","attach","MdCheckboxInkRipple","MdListInkRipple","outline","rippleSize","InkRippleDirective","$mdButtonInkRipple","$mdCheckboxInkRipple","InkRippleProvider","disableInkRipple","isDisabledGlobally","instantiate","InkRippleCtrl","rippleOptions","$mdColorUtil","ripples","lastRipple","createContainer","createRipple","setColor","bindEvents","autoCleanup","cleanupFn","attrNoDirective","DURATION","getElementColor","colorElement","_color","_parseColor","inkRipple","calculateColor","multiplier","colorUtil","handleMousedown","handleMouseup","handleTouchmove","container","srcElement","layerRect","layerX","layerY","offsetX","offsetY","clearRipples","deleteRipples","fadeInComplete","clearTimeout","isRippleAllowed","getSize","fit","pow","ripple","size","background","backgroundColor","borderColor","removeRipple","fadeOutComplete","MdTabInkRipple","constant","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastDarkColors","contrastStrongLightColors","pink","purple","deep-purple","indigo","light-blue","contrastLightColors","cyan","teal","light-green","lime","yellow","amber","orange","deep-orange","brown","grey","blue-grey","detectDisabledThemes","disableTheming","ThemingProvider","$mdColorPalette","$$mdMetaProvider","definePalette","PALETTES","checkPaletteValid","themingProvider","extendPalette","missingColors","VALID_HUE_VALUES","field","registerTheme","inheritFrom","THEMES","parentTheme","Theme","colors","colorType","hues","setDark","isDark","foregroundPalette","LIGHT_FOREGROUND","DARK_FOREGROUND","foregroundShadow","DARK_SHADOW","LIGHT_SHADOW","newDefaultHues","DARK_DEFAULT_HUES","LIGHT_DEFAULT_HUES","oldDefaultHues","newDefaults","oldDefaults","hueName","dark","THEME_COLOR_TYPES","defaultHues","paletteName","hueValue","console","ThemingService","registered","themeName","applyTheme","inheritTheme","lookupThemeName","$mdTheme","defaultTheme","updateThemeClass","oldTheme","watchTheme","alwaysWatchTheme","$shouldWatch","registerChanges","inherit","generateTheme","themeConfig","nonce","defineTheme","primary","accent","setBrowserColor","enableBrowserColor","removeChrome","removeWindows","hue","palette","configuration","registeredStyles","registerStyles","styles","setNonce","nonceValue","generateThemesOnDemand","onDemand","generateOnDemand","setDefaultTheme","alwaysWatch","_LIGHT_DEFAULT_HUES","_DARK_DEFAULT_HUES","_PALETTES","_THEMES","_parseRules","parseRules","_rgba","rgba","ThemingDirective","registeredCallbacks","mdTheme","hasInterpolation","lastIndexOf","oneTimeOperator","oneTimeBind","$setTheme","ALWAYS_WATCH","getTheme","interpolation","setParsedTheme","disableThemesDirective","ThemableDirective","rules","checkValidPalette","generatedRules","themeNameRegex","RegExp","hueRegex","simpleVariableRegex","opacity","contrast","newRule","hueType","themeRuleRegex","generateAllThemes","sanitizePalette","defaultContrast","lightColors","strongLightColors","darkColors","getContrastColor","DARK_CONTRAST_COLOR","STRONG_LIGHT_CONTRAST_COLOR","LIGHT_CONTRAST_COLOR","rgbValue","colorToRgbaArray","firstChild","firstElementChild","themeCss","rule","ruleMatchRegex","rulesByType","DEFAULT_COLOR_TYPE","GENERATED","styleStrings","styleContent","createTextNode","clr","parseFloat","grn","blu","rgbArray","copy","1","hue-1","hue-2","hue-3","defaultDefaultHues","AnimateDomUtils","$animateCss","translate3d","from","to","reverseTranslate","newFrom","transitionOutClass","transitionInClass","waitTransitionEnd","TIMEOUT","finished","noTransitionFound","transitionDuration","transition","transitionProperty","cachedTransitionStyles","calculateTransformValues","originator","currentBounds","cntr","origin","bounds","originBnds","copyRect","dialogRect","dialogCenterPt","centerPointFor","originCenterPt","centerX","centerY","scaleX","round","min","scaleY","calculateZoomToOrigin","zoomTemplate","buildZoom","calculateSlideToOrigin","slideTemplate","buildSlide","toCss","raw","convertToVendor","lookups","toTransformCss","transform","addTransition","source","destination","right","bottom","isPositiveSizeClientRect","rect","targetRect","version","minor","str","WEBKIT","WebkitAppearance","PREFIX","TRANSITION_EVENTS","ANIMATION_EVENTS","$$ForceReflowFactory","$$rAFMutexFactory","passed","$$AnimateRunnerFactory","$$rAFMutex","AnimateRunner","host","setHost","_doneCallbacks","_runInAnimationFrame","_state","INITIAL_STATE","DONE_PENDING_STATE","DONE_COMPLETE_STATE","done","progress","getPromise","status","resolveHandler","rejectHandler","pause","resume","_resolve","complete","runners","onProgress","runner","$$AnimateRunner","$$forceReflow","$$jqLite","init","temporaryStyles","getDomNode","areAnimationsAllowed","hasCompleteStyles","hasCompleteClasses","transitionStyle","keyframeStyle","blockTransition","hasCompleteAnimation","applyAnimationFromStyles","events","eventFn","animationClosed","close","applyClasses","applyAnimationStyles","waitUntilQuiet","timings","computeTimings","moreStyles","easing","animationDuration","animationDelay","maxDelay","maxDelayTime","maxDuration","maxDurationTime","timeStamp","elapsedTime","toFixed","applyAnimationToStyles","cs","tdr","parseMaxTime","adr","tdy","ady","transitionDelay","maxValue","cancelLastRAFRequest","rafWaitQueue","pageWidth","bool","postLink","resize","viewportHeight","bodyStyles","pin","resizeHandler","ERROR_CSS_POSITION","MdBottomSheetDirective","$mdBottomSheet","MdBottomSheetProvider","$$interimElementProvider","bottomSheetDefaults","disableBackdrop","backdrop","tabIndex","clickOutsideToClose","bottomSheet","BottomSheet","disableParentScroll","restoreScroll","focusable","escapeToClose","rootElementKeyupCallback","onDragStart","onDrag","PADDING","onDragEnd","CLOSING_VELOCITY","distanceRemaining","MdAnchorDirective","MdButtonDirective","$mdAria","$mdInteraction","isAnchor","href","ngHref","ngLink","uiSref","getTemplate","btnType","ngDisabled","disabled","transclude","mdCardDirective","MdCheckboxDirective","inputDirective","tElement","tAttrs","ctrls","$$watchExpr","expr","htmlAttr","valueOpts","keypressHandler","which","listener","skipToggle","$apply","viewValue","ngChecked","ngClick","checked","render","isIndeterminate","setIndeterminateState","containerCtrl","formCtrl","isErrorGetter","$invalid","$touched","setInvalid","mdIndeterminate","$eval","true","false","tabindex","0","$set","post","require","MdColorsService","applyThemeColors","colorExpression","interpolateColors","getThemeColor","expression","extractColorOptions","parseColor","rgbValues","themeColors","rgbColors","hasColorProperty","hasBackground","hasTheme","extractPalette","extractHue","isTwoWord","colorPalettes","scheme","hueNumber","availableThemes","usedTheme","MdColorsDirective","$mdColors","tElem","shouldColorsWatch","rawColorExpression","mdColors","bindOnce","isStatic","STATIC_COLOR_EXPRESSION","hasWatchAttr","mdColorsWatch","shouldWatch","mdThemeController","lastColors","parseColors","cleanElement","equals","unregisterChanges","mdContentDirective","ContentController","$broadcast","iosScrollFix","$materialScrollFixed","offsetHeight","MdDialogDirective","$mdDialog","addOverflowClass","images","getElementsByTagName","MdDialogProvider","advancedDialogOptions","isPrompt","initialValue","abort","keypress","$event","dialogDefaultOptions","beforeCompile","detectTheming","beforeShow","mdHtmlContent","htmlContent","mdTextContent","warnDeprecatedActions","focusOnOpen","findCloseButton","dialogElement","find","captureParentAndFromToElements","configureAria","showBackdrop","activateListeners","dialogPopIn","lockScreenReader","animateRemoval","dialogPopOut","detachAndClean","reverseContainerStretch","originInteraction","deactivateListeners","unlockScreenReader","hideBackdrop","topFocusTrap","bottomFocusTrap","targetEvent","themeCtrl","themeWatch","newTheme","orig","hasFn","getDomElement","defaultElement","openFrom","onWindowResize","stretchDialogContainerToViewport","removeListeners","smartClose","closeFn","keyHandlerFn","sourceElem","mousedownHandler","mouseupHandler","removeFn","hasBackdrop","role","dialogContent","existingDialogId","dialogContentId","ariaLabel","words","cloneNode","focusHandler","after","walkDOM","isNodeOneOf","isFixed","ceil","previousStyles","parentTop","dialogEl","buildTranslateToOrigin","translateOptions","fullscreen","animateReversal","reverseAnimate","clearAnimate","nodeTypeArray","autoWrap","validatedTemplate","MdDividerDirective","MdFabActionsDirective","hasNgRepeat","wrap","MdFabController","setupDefaults","vm","direction","isOpen","resetActionIndex","setupListeners","eventTypes","parseEvents","disableKeyboard","handleItemClick","closeTimeout","currentActionIndex","setupWatchers","newDir","oldDir","actions","getTriggerElement","getActionsElement","enableKeyboard","toAdd","toRemove","setClass","fireInitialAnimations","initialAnimationAttempts","keyPressed","checkForOutsideClick","closestTrigger","closestActions","doKeyLeft","doKeyUp","doKeyRight","doKeyDown","doActionPrev","focusAction","doActionNext","resetActionTabIndexes","focusElement","isTrigger","isAction","toggle","open","$onInit","major","MdFabSpeedDialDirective","FabSpeedDialLink","prepend","MdFabSpeedDialFlingAnimation","delayDone","cssAnimationDuration","runAnimation","triggerElement","variablesElement","startZIndex","zIndex","webkitTransform","triggerItemHeightOffset","triggerItemWidthOffset","scrollWidth","newTranslate","MdFabSpeedDialScaleAnimation","offsetDelay","animation","MdFabToolbarDirective","MdFabToolbarAnimation","backgroundElement","toolbarElement","iconElement","getPropertyValue","scale","borderRadius","pointerEvents","GridListDirective","$mdGridLayout","watchMedia","invalidateLayout","layoutIfMediaMatch","unwatchMedia","layoutDelegate","unwatchAttrs","removeListener","tilesInvalidated","tiles","getTileElements","props","tileSpans","getTileSpans","colCount","getColumnCount","rowMode","getRowMode","rowHeight","getRowHeight","gutter","getGutter","lastLayoutProps","tilePositions","rowCount","grid","getGridStyle","ps","getTileStyle","spans","reflow","mdOnLayout","exprStr","hShare","hGutterShare","hUnit","UNIT","share","gutterShare","POSITION","unit","col","DIMENSION","span","paddingTop","marginTop","row","vShare","vUnit","vGutterShare","paddingBottom","ele","$$mdDestroyed","tileElements","$attrs","applyDefaultUnit","whRatio","GridListController","layoutInvalidated","$timeout_","GridLayoutFactory","GridLayout","layoutInfo","gridStyles","layoutTime","mapTime","reflowTime","calculateGridFor","info","positioning","animatorFn","defaultAnimator","tileCount","totalTime","GridTileAnimator","t","reserveSpace","curCol","nextRow","spaceTracker","findEnd","adjustRow","curRow","cols","by","newSpaceTracker","tracker","animateWith","customAnimator","GridTileDirective","gridCtrl","invalidateTiles","$index","newIdx","oldIdx","GridTileCaptionDirective","layout","mdInputContainerDirective","leftIcon","LEFT_SELECTORS","rightIcon","RIGHT_SELECTORS","ContainerCtrl","mdIsError","delegateClick","setFocused","isFocused","setHasValue","setHasPlaceholder","hasPlaceholder","isInvalid","label","hasLabelAndInput","INPUT_TAGS","reduce","selectors","isel","labelDirective","mdNoFloat","inputTextareaDirective","ngModelPipelineCheckValue","setupAttributeWatchers","mdNoAsterisk","inputCheckValue","validity","badInput","setupTextarea","growTextarea","getHeight","lineHeight","originalPadding","padding","minRows","maxRows","maxHeight","removeAttr","line","formattersListener","disableAutogrow","isAutogrowing","scopeResizeListener","hasNgModel","listenerIndex","attachResizeHandle","onMouseDown","isDragging","dragStart","startHeight","dragGestureHandler","rows","NaN","handleHiddenChange","wasHidden","parentForm","isReadonly","readonly","errorsSpacer","placeholder","step","ngValue","mdMaxlengthDirective","renderCharCount","charCountEl","maxlength","mdMaxlength","$validators","modelValue","placeholderDirective","inputContainer","noFloat","newLabel","mdSelectOnFocusDirective","onFocus","preventMouseUp","select","onMouseUp","ngMessagesDirective","mdAutoHide","hasVisibiltyDirective","visibilityDirectives","some","ngMessageDirective","isInsideFragment","DOCUMENT_FRAGMENT_NODE","isInsideInputContainer","initMessageElement","mdInputInvalidMessagesAnimation","saveSharedServices","showInputMessages","ngMessagesAnimation","hideInputMessages","ngMessageAnimation","showMessage","hideMessage","animators","messages","getMessagesElement","topMargin","getInputElement","alreadyVisible","structural","margin-top","_$$AnimateRunner_","_$animateCss_","inputModule","_mdMocksIncluded","getElement","mdListDirective","tEl","mdListItemDirective","proxiedTypes","setupToggleAria","toggleType","toggleTypes","setupProxiedMenu","menuEl","proxyElement","isEndAligned","xAxisPosition","menuOpenButton","eq","hasClickEvent","wrapIn","itemContainer","buttonWrap","copyAttributes","wrapSecondaryItems","secondaryItemsWrapper","secondaryItems","secondaryItem","wrapSecondaryItem","isButton","buttonWrapper","isProxiedElement","extraAttrs","copiedAttrs","$attr","computeProxies","firstElement","hasClick","noProxies","proxies","computeClickable","attachRipple","isEventFromControl","forbiddenControls","path","maxPath","isButtonWrap","clickChild","proxy","mouseActive","proxyOnBlur","clickChildKeypressListener","click","parentButton","hasProxiedElement","ngDblclick","ngAttrUiSref","MdListController","$mdListInkRipple","MdNavBar","MdNavBarController","mdSelectedNavItem","mdNoInkBar","navBarAriaLabel","_$scope","_$mdConstant","_navBarEl","_inkbar","deregisterTabWatch","newLength","_initTabs","MdNavItem","MdNavItemController","navigationAttribute","navigationOptions","buttonTemplate","hasNavClick","mdNavClick","hasNavHref","mdNavHref","hasNavSref","mdNavSref","hasSrefOpts","srefOpts","controllers","mdNavItem","mdNavBar","navButton","_$element","_selected","_focused","_updateTabs","oldValue","tabs","_getTabs","oldIndex","newIndex","newTab","_getTabByName","oldTab","setSelected","_updateInkBarStyles","tab","tabEl","getButtonEl","offsetLeft","_findTab","getName","_getSelectedTab","isSelected","getFocusedTab","hasFocus","_moveFocus","onKeydown","keyCodes","focusedTab","focusedTabIndex","getNgClassMap","md-active","md-primary","md-unselected","md-focused","MdPanelProvider","definePreset","getAllPresets","clearPresets","$getProvider","preset","_presets","id","MdPanelService","_defaultConfigOptions","propagateContainerEvents","_wrapTemplate","trapFocus","MD_PANEL_Z_INDEX","_config","_$rootElement","_$rootScope","_$injector","_$window","_$mdUtil","_trackedPanels","_groups","create","MdPanelAnimation","xPosition","MdPanelPosition","yPosition","interceptorTypes","MdPanelRef","closeReasons","absPosition","_$q","_$mdCompiler","_$mdTheming","_$animate","_$mdPanel","_$log","_$$rAF","panelContainer","panelEl","isAttached","_removeListeners","_topFocusTrap","_bottomFocusTrap","_backdropRef","_interceptors","_compilerCleanup","_restoreCache","classes","_isRTL","_absolute","_relativeToEl","_top","_bottom","_left","_right","_translateX","_translateY","_positions","_actualPosition","_openFrom","_closeTo","_animationClass","_openDuration","_closeDuration","_rawDuration","queryResult","getComputedTranslations","openIndex","closeIndex","output","parsedValues","MD_PANEL_HIDDEN","FOCUS_TRAP_TEMPLATE","_getPresetByName","trackedPanel","attachTo","panelRef","groupName","group","addToGroup","detach","newPanelPosition","newPanelAnimation","newPanelGroup","panels","openPanels","maxOpen","Infinity","setGroupMaxOpen","_openCountExceedsMaxOpen","_closeFirstOpenedPanel","origTemplate","_wrapContentElement","wrapper","CLOSE","_done","_simpleBind","checkGroupMaxOpen","closeReason","_callInterceptors","onCloseSuccess","onDomAdded","addListeners","_addEventListeners","_createBackdrop","_createPanel","onDomRemoved","detachFn","_removeEventListeners","removeFromGroup","animatePromise","_animateOpen","onOpenComplete","addToGroupOpen","_focusOnOpen","hidePanel","removeFromGroupOpen","focusOnOrigin","_animateClose","newClass","toElement","oldClass","fromElement","onElement","_compile","mdPanelRef","_configureTrapFocus","_addStyles","hideAndResolve","_setTheming","positionConfig","_updatePosition","updatePosition","_setPanelPosition","TOP","getTop","BOTTOM","getBottom","LEFT","getLeft","RIGHT","getRight","backdropAnimation","withAnimation","backdropConfig","panelClass","_configureEscapeToClose","_configureClickOutsideToClose","_configureScrollListener","sourceEl","CLICK_OUTSIDE","debouncedUpdatePosition","onScroll","clone","updateAnimation","animationConfig","warnAndOpen","animateOpen","warnAndClose","animateClose","registerInterceptor","interceptors","removeInterceptor","removeAllInterceptors","reduceRight","interceptor","isPromiseLike","CENTER","ALIGN_START","ALIGN_END","OFFSET_START","OFFSET_END","ALIGN_TOPS","ALIGN_BOTTOMS","ABOVE","BELOW","viewportMargin","absolute","_setPosition","positions","centerHorizontally","centerVertically","relativeTo","addPanelPosition","_validateXPosition","_validateYPosition","positionKeys","positionValues","withOffsetX","withOffsetY","getTransform","translateX","_reduceTranslateValues","translateY","_setTransform","_isOnscreen","prefixedTransform","offsets","innerHeight","innerWidth","getActualPosition","translateFn","translation","translationValue","_calculatePanelPosition","_constrainToViewport","margin","initialTop","initialLeft","viewportWidth","_reverseXPosition","_bidi","panelBounds","panelWidth","panelHeight","targetBounds","targetLeft","targetRight","targetWidth","targetTop","targetBottom","targetHeight","SLIDE","SCALE","FADE","_getPanelAnimationTarget","toSeconds","_getBoundingClientRect","cssClass","_fixBounds","animationOptions","panelTransform","openTo","openSlide","openScale","reverseAnimationOptions","closeFrom","closeSlide","closeScale","MdProgressLinearDirective","watchAttributes","percentValue","clamp","mode","MODE_QUERY","animateIndicator","bar2","bar1","DISABLED_CLASS","lastMode","MODE_BUFFER","MODE_DETERMINATE","MODE_INDETERMINATE","validateMode","mdMode","toVendorCSS","mdRadioGroupDirective","linkRadioGroup","setFocus","keydownListener","currentTarget","rgCtrl","selectPrevious","selectNext","RadioGroupController","_radioButtonRenderFns","createRadioGroupControllerProto","_ngModelCtrl","rbRender","setViewValue","getViewValue","changeSelectedButton","setActiveDescendant","radioId","increment","buttons","selected","mdRadioButtonDirective","initialize","lastChecked","CHECKED_CSS","aria-checked","createDirective","targetValue","multiElement","unregister","ELEMENT_NODE","SidenavService","$mdComponentRegistry","addLegacyAPI","falseFn","rejectFn","errorMsg","isLockedOpen","onClose","waitForInstance","findInstance","shouldWait","waitFor","enableWait","SidenavFocusDirective","sidenavCtrl","SidenavDirective","updateIsLocked","isLocked","updateIsOpen","focusEl","onKeyDown","restorePositioning","updateContainerPositions","triggeringElement","activeElement","triggeringInteractionType","ngWindow","willOpen","drawerEl","previousContainerStyles","positionStyle","lastParentOverFlow","disableScrollTarget","toggleOpen","onCloseCb","isEscape","isLockedOpenParsed","mdIsLockedOpen","$media","mdDisableScrollTarget","$toggleOpen","SidenavController","rawId","mdComponentId","hasDataBinding","componentId","SelectDirective","$mdSelect","$sce","valueEl","mdOnOpen","autofillClone","aria-hidden","newEl","innerHTML","ngModel","isMultiple","multipleContent","selectTemplate","empty","initAriaLabel","labelText","ariaLabelBase","syncLabelText","selectContainer","selectMenuCtrl","mdSelectCtrl","setLabelText","selectedLabels","syncAriaLabel","ariaLabels","findSelectContainer","selectScope","mdContainerClass","handleKeypress","openSelect","shouldHandleKey","optNodeForKeyboardSearch","optionCtrl","deselect","hashKey","refreshViewValue","_mdSelectIsOpen","selectCtrl","preserveElement","loadingAsync","untouched","disableAsterisk","hasModelValue","$modelValue","$setPristine","originalRender","setIsPlaceholder","isSelectLabelFromUser","mdSelectedText","mdSelectedHtml","tmpPlaceholder","getTrustedHtml","isPlaceholder","triggerClose","mdOnClose","$$postDigest","deregisterWatcher","parser","prevVal","setMultiple","aria-disabled","ariaAttrs","aria-expanded","aria-multiselectable","ngMultiple","containerId","SelectMenuDirective","keyListener","clickListener","option","optionHashKey","hashGetter","SelectMenuController","renderMultiple","newSelectedValues","oldSelected","newSelectedHashes","deselected","hash","renderSingular","$watchCollection","deregisterCollectionWatch","defaultIsEmpty","validateArray","modelBinding","clearSearchTimeout","optNodes","optText","searchStr","CLEAR_SEARCH_AFTER","setTimeout","fromCharCode","search","trackByOption","trackByLocals","trackByParsed","valueScope","$value","$$mdSelectId","selectNextId","selectedOptionEls","mapFn","rippleContainer","checkboxContainer","hashedValue","addOption","$validate","removeOption","usingTrackBy","newVal","OptionDirective","hasDefinedValue","setOptionValue","prevAttempt","oldHashKey","newHashKey","aria-selected","CHECKBOX_SELECTION_INDICATOR","OptionController","OptgroupDirective","hasSelectHeader","setupLabelElement","labelElement","SelectHeaderDirective","SelectProvider","selectDefaultOptions","announceClosed","restoreFocus","cleanupInteraction","cleanupResizing","showDropDown","positionAndFocusMenu","isRemoved","calculateMenuPositions","dropDown","autoFocus","focusedNode","sanitizeAndConfigure","selectEl","ERROR_TARGET_EXPECTED","optionNodes","activateResizing","debouncedOnResize","updates","watchAsyncLoad","$$loadingAsyncDone","activateInteraction","onBackdropClick","onMenuKeyDown","focusPrevOption","focusNextOption","checkCloseMenu","optNode","focusOption","newOption","optionsArray","mouseOnScrollbar","clickOnScrollbar","hasScrollbar","relPosX","alreadyOpen","mdSelect","menuController","centeredNode","containerNode","targetNode","selectNode","contentNode","parentRect","shouldOpenAroundTarget","SELECT_EDGE_MARGIN","spaceAvailable","maxWidth","selectedNode","optgroupNodes","isScrollable","calculateScrollable","loading","selectMenuRect","centeredRect","getOffsetRect","centeredStyle","paddingLeft","paddingRight","scrollBuffer","transformOrigin","minWidth","fontSize","floor","containerRect","min-width","font-size","n","offsetTop","oldDisplay","char","isNonUsefulKey","SliderContainerDirective","slider","vertical","setDisable","stopDisabledWatch","initialMaxWidth","fitInputWidthToTextLength","computedStyle","newMaxWidth","SliderDirective","getElementsByClassName","updateAll","refreshSliderDimensions","ngModelRender","updateMin","updateMax","updateStep","updateRound","minMaxValidator","updateAriaDisabled","redrawTicks","discrete","numSteps","tickCanvas","tickContainer","tickCtx","getContext","dimensions","getSliderDimensions","sliderDimensions","trackTicksStyle","fillStyle","fillRect","clearTicks","clearRect","trackContainer","throttledRefreshDimensions","changeAmount","invert","setModelValue","mouseDownListener","focusListener","blurListener","stepValidator","percent","valueToPercent","setSliderPercent","thumbText","minValue","formattedValue","thumbPosition","activeTrackPercent","thumbContainer","activeTrack","onPressDown","exactVal","percentToValue","positionToPercent","closestVal","onPressUp","setSliderFromEvent","adjustThumbPosition","doSlide","calc","adjustedPercent","thumb","DEFAULT_ROUND","mdVertical","mdDiscrete","mdInvert","debouncedUpdateAll","MdSticky","setupSticky","contentCtrl","stickyClone","debouncedRefreshElements","refreshElements","refreshPosition","sort","currentScrollTop","setCurrentItem","isScrollingDown","prevScrollTop","translate","prev","setStickyState","amount","setupAugmentedScrollEvents","loopScrollEvent","lastScrollTime","SCROLL_END_DELAY","isScrolling","browserStickySupport","$$sticky","cloneElement","MdSubheaderDirective","$mdSticky","getContent","MdSwitch","mdCheckboxDirective","mdSwitchCompile","checkboxLink","checkboxDirective","disabledGetter","drag","isChanged","applyModelValue","switchContainer","labelContainer","isInverted","getDirective","DirectiveFactory","directiveName","$applyAsync","MdToastDirective","$mdToast","MdToastProvider","updateTextContent","newContent","activeToastContent","toastDefaultOptions","isSmScreen","onSwipe","gesture","swipe","openClass","toastOpenClass","toastClass","SWIPE_EVENTS","shouldAddWrapper","templateRoot","ACTION_RESOLVE","highlightAction","highlightClasses","highlightClass","mdToolbarDirective","setupScrollShrink","onChangeScrollShrink","shrinkWithScroll","closestContent","onMdContentLoad","disableScrollShrink","enableScrollShrink","newContentEl","debouncedContentScroll","onContentScroll","debouncedUpdateHeight","toolbarHeight","shrinkSpeedFactor","hasWhiteFrame","updateToolbarHeight","margin-bottom","mdShrinkSpeedFactor","ngShow","ngHide","mdScrollShrink","MdTooltipDirective","$mdPanel","$$mdTooltipRegistry","linkFunc","mdZIndex","TOOLTIP_DEFAULT_Z_INDEX","mdDelay","TOOLTIP_DEFAULT_SHOW_DELAY","TOOLTIP_DIRECTIONS","mdDirection","TOOLTIP_DEFAULT_DIRECTION","addAriaLabel","interpolatedText","tooltipId","panelPosition","isDisabledMutation","mutations","mutation","attributeName","windowScrollEventHandler","setVisible","windowBlurEventHandler","elementFocusedOnWindowBlur","enterEventHandler","mdVisible","LEAVE_EVENTS","leaveEventHandler","one","autohide","mdAutohide","showTimeout","queued","mousedownEventHandler","ENTER_EVENTS","attributeObserver","disconnect","MutationObserver","observe","configureWatchers","onElementDestroy","visibleWatcher","onVisibleChanged","isVisible","showTooltip","hideTooltip","panelAnimation","panelConfig","MdTooltipRegistry","globalEventHandler","listeners","currentHandler","useCapture","handlers","MdTruncateDirective","MdTruncateController","VirtualRepeatContainerDirective","VirtualRepeatContainerController","virtualRepeatContainerTemplate","scrollSize","scrollOffset","repeater","autoShrink","autoShrinkMin","mdAutoShrinkMin","originalSize","offsetSize","mdOffsetSize","oldElementSize","maxElementPixels","mdTopIndex","bindTopIndex","topIndex","assign","scrollToIndex","scroller","sizer","offsetter","boundUpdateSize","updateSize","debouncedUpdateSize","jWindow","$emit","VirtualRepeatDirective","VirtualRepeatController","terminal","mdVirtualRepeat","repeatName","repeatListExpression","extraName","mdExtraName","$transclude","link_","$browser","mdOnDemand","browserCheckUrlChange","$$checkUrlChange","newStartIndex","newEndIndex","newVisibleEnd","startIndex","endIndex","itemSize","mdItemSize","isFirstRender","isVirtualRepeatUpdating_","itemsLength","unwatchItemSize_","blocks","pooledBlocks","cleanupBlocks_","VirtualRepeatModelArrayLike","model","getItemAtIndex","getLength","NUM_EXTRA","repeaterCtrl","handleScroll_","isHorizontal","setSize_","dimension","getDimensionName_","unsetSize_","containerUpdated","getScrollSize","sizeScroller_","crossDimension","numChildren","sizerChild","autoShrink_","shrinkSize","getItemSize","currentSize","_originalSize","setScrollSize","itemsSize","getScrollOffset","scrollTo","resetScroll","maxSize","scrollLeft","numItems","getItemCount","$$phase","Block","rawRepeatListExpression","sized","repeatListExpression_","block","readItemSize_","getBlock_","poolBlock_","repeatList","virtualList","$$includeIndexes","oldItems","virtualRepeatUpdate_","updateIndexes_","lengthChanged","previousScrollOffset","firstRenderStartIndex","cleanupFirstRender","mdStartIndex","blockIndex","newStartBlocks","newEndBlocks","updateBlock_","maxIndex","domFragmentFromBlocks_","new","updateScope_","fragment","createDocumentFragment","containerLength","MdWhiteframeDirective","elevation","DEFAULT_DP","DISABLE_DP","MAX_DP","MIN_DP","$updateClass","MdAutocompleteCtrl","$mdLiveAnnouncer","searchText","selectedItem","clearButton","gatherElements","moveDropdown","autofocus","focusInputElement","updateModelValidators","requireMatch","inputModelCtrl","$setValidity","positionDropdown","getVerticalOffset","correctHorizontalAlignment","dropdown","elements","scrollContainer","root","MENU_PADDING","hrect","$","dropdownHeight","dropdownItems","MAX_ITEMS","ITEM_HEIGHT","vrect","snap","bot","dropdownPosition","mdFloatingLabel","INPUT_PADDING","bottomSpace","isRequired","handleSearchText","selectedItemChange","hidden","snapWrap","gatherSnapWrap","ul","li","getAngularElements","oldHidden","reportMessages","ReportType","Count","Selected","enableWrapScroll","disableElementScrollEvents","onListEnter","noBlur","onListLeave","shouldHide","onMouseup","previousSelectedItem","getDisplayValue","handleSelectedItemChange","displayValue","announceItemChange","itemChange","getItemAsNameVal","announceTextChange","textChange","selectedItemWatchers","watcher","registerSelectedItemWatcher","unregisterSelectedItemWatcher","previousSearchText","getDefaultIndex","isMinLengthMet","handleQuery","setLoading","evalAttr","doBlur","forceBlur","isSearchable","updateScroll","hasSelection","shouldProcessEscape","clearSelectedItem","hasEscapeOption","clearSearchText","getMinLength","minLength","getItemText","itemText","itemName","autoselect","shouldShow","hasMatches","escapeOptions","notFoundVisible","loadingIsVisible","getCurrentDisplayValue","set","clearValue","fetchResults","handleAsyncResults","fetchesInProgress","onResultsRetrieved","cache","term","handleResults","itemExpr","isList","isPromise","isPolite","types","getCountMessage","hgt","isPromiseFetching","textLength","hasNotFound","noCache","selectOnMatch","selectItemOnMatch","isMatching","matchInsensitive","itemParts","itemsExpr","clear","listEnter","listLeave","mouseUp","MdAutocomplete","$$mdSvgRegistry","inputName","inputMinlength","inputMaxlength","floatingLabel","menuClass","inputId","mdClearButton","getItemTemplate","templateTag","getNoItemsTemplate","leftover","getClearButton","mdClose","noItemsTemplate","itemTemplate","MdAutocompleteItemScopeDirective","tAttr","watchVariable","variable","alias","newScope","connectScopes","scopeDigesting","newScopeDigesting","$mdAutocompleteCtrl","MdHighlightCtrl","regex","unsafeTermFn","unsafeContentFn","flags","mdHighlightFlags","unregisterFn","contentText","onRender","prevState","createRegex","applyRegex","tokens","resolveTokens","token","isMatch","tokenEl","string","appendToken","targetText","lastIndex","startFlag","endFlag","regexTerm","sanitizeRegex","MdHighlight","termExpr","mdHighlightText","unsafeContentExpr","MdChipCtrl","isEditting","parentController","enableChipEdit","chipKeyDown","chipMouseDown","getChipContent","chipContents","getContentElement","getChipIndex","goOutOfEditMode","contentEditable","chipIndex","updateChipContents","selectedChip","focusChip","removeChipAndFocusInput","selectNodeContents","range","selection","createTextRange","moveToElementText","getSelection","createRange","removeAllRanges","addRange","goInEditMode","MdChip","chipsController","chipController","chipContentElement","deleteHintTemplate","resetSelectedChip","shouldFocusLastChip","focusLastChipThenInput","DELETE_HINT_TEMPLATE","MdChipRemove","removeChip","$$replacedScope","MdChipTransclude","$mdChipsCtrl","$chip","newHtml","mdChipTransclude","MdChipsCtrl","userInputNgModelCtrl","autocompleteCtrl","userInputElement","mdEnableChipEdit","addOnBlur","mdAddOnBlur","inputAriaLabel","containerHint","deleteHint","deleteButtonLabel","chipBuffer","useTransformChip","useOnAdd","useOnRemove","wrapperId","contentIds","ariaTabIndex","chipAppendDelay","DEFAULT_CHIP_APPEND_DELAY","setupInputAria","setupWrapperAria","inputKeydown","getChipBuffer","isDefaultPrevented","getCursorPosition","selectAndFocusChipSafe","separatorKeys","hasMaxChipsReached","appendChip","resetChipBuffer","selectionStart","selectionEnd","$setDirty","isEditingChip","isRemovable","removable","chipKeydown","removeAndSelectAdjacentChip","getPlaceholder","useSecondary","secondaryPlaceholder","selIndex","getAdjacentChipIndex","newChip","transformChip","transformedChip","identical","validateModel","onAdd","useTransformChipExpression","useOnAddExpression","useOnRemoveExpression","useOnSelectExpression","useOnSelect","maxChips","removed","focusInput","selectChip","onSelect","selectAndFocusChip","chipContent","configureNgModel","onInputFocus","inputHasFocus","onInputBlur","shouldAddOnBlur","configureUserInput","inputElement","scopeApplyFn","configureAutocomplete","isModelValid","$valid","isAutocompleteShowing","contentIdFor","MdChips","getTemplateByQuery","userTemplate","chipTemplate","chipRemoveSelector","chipRemoveTemplate","templates","chipContentsTemplate","chipInputTemplate","staticChips","mdChipsCtrl","mdCloseIcon","mdTransformChip","mdOnAppend","useOnAppendExpression","mdOnAdd","mdOnRemove","mdOnSelect","autocompleteEl","compiledStaticChips","getTemplates","chips","MD_CHIPS_TEMPLATE","CHIP_INPUT_TEMPLATE","CHIP_DEFAULT_TEMPLATE","CHIP_REMOVE_TEMPLATE","onAppend","chipAppendDelayString","MdContactChipsCtrl","queryContact","contactQuery","$query","contactName","MdContactChips","contactChipsController","MD_CONTACT_CHIPS_TEMPLATE","contactImage","contactEmail","contacts","highlightFlags","calendarDirective","minDate","maxDate","dateFilter","_currentView","CalendarCtrl","mdCalendarCtrl","$$mdDateUtil","$mdDateLocale","dateUtil","today","createDateAtMidnight","SELECTED_DATE_CLASS","TODAY_CLASS","FOCUSED_DATE_CLASS","displayDate","selectedDate","firstRenderableDate","lastRenderableDate","scrollbarWidth","handleKeyElement","boundKeyHandler","handleKeyEvent","FALLBACK_WIDTH","currentView","dateLocale","setNgModelValue","date","setCurrentView","newView","isDate","isValidDate","previousFocus","cellId","getDateId","cell","getElementById","rootElement","getActionFromKeyEvent","hideVerticalScrollbar","childCtrl","setWidth","calendarScroller","namespace","getFullYear","getMonth","getDate","updateVirtualRepeat","virtualRepeatResizeListener","TBODY_SINGLE_ROW_HEIGHT","TBODY_HEIGHT","CalendarMonthCtrl","calendarCtrl","monthCtrl","isMonthTransitionInProgress","cellClickHandler","timestamp","getTimestampFromNode","headerClickHandler","getMonthDistance","attachScopeListeners","getSelectedMonthIndex","changeSelectedDate","previousSelectedDate","changeDisplayDate","selectedDateClass","prevDateCell","dateCell","buildWeekHeader","animationPromise","animateDateChange","monthDistance","firstDayOfWeek","shortDays","th","incrementDays","incrementMonths","getFirstDateOfMonth","getLastDateOfMonth","clampDate","mdCalendarMonthBodyDirective","ARROW_ICON","mdTabsArrow","CalendarMonthBodyCtrl","monthBodyCtrl","arrowIcon","generateContent","focusAfterAppend","buildCalendarForMonth","buildDateCell","opt_date","longDateFormatter","isSameDay","cellText","dates","isDateEnabled","selectionIndicator","isDateWithinRange","buildDateRow","rowNumber","weekNumberFormatter","opt_dateInMonth","firstDayOfMonth","firstDayOfTheWeek","getLocaleDay_","numberOfDaysInMonth","getNumberOfDaysInMonth","monthBody","isFinalMonth","blankCellOffset","monthLabelCell","monthLabelCellContent","monthHeaderFormatter","monthFormatter","monthLabelRow","dayOfWeek","iterationDate","d","setDate","whitespaceRow","getDay","CalendarYearCtrl","yearCtrl","getYearDistance","getFocusedYearIndex","changeDate","mdCalendarYearDirective","CalendarYearBodyCtrl","yearBodyCtrl","incrementYears","buildCalendarForYear","buildMonthCell","year","month","buildBlankCell","firstOfMonth","isSameMonthAndYear","shortMonths","isMonthWithinRange","yearBody","firstRow","labelCell","secondRow","DateLocaleProvider","months","days","formatDate","parseDate","msgCalendar","msgOpenCalendar","$locale","$filter","defaultFormatDate","timezone","localeTime","toLocaleTimeString","getHours","defaultParseDate","dateString","defaultIsDateComplete","re","defaultMonthHeaderFormatter","defaultMonthFormatter","defaultWeekNumberFormatter","number","defaultLongDateFormatter","defaultShortDays","DATETIME_FORMATS","SHORTDAY","day","defaultDates","defaultMsgCalendar","defaultMsgOpenCalendar","defaultFirstRenderableDate","defaultLastRendereableDate","MONTH","SHORTMONTH","DAY","isDateComplete","getDateInNextMonth","getDateInPreviousMonth","d1","d2","isInNextMonth","startDate","endDate","nextMonth","isInPreviousMonth","previousMonth","getDateMidpoint","getWeekOfMonth","numberOfDays","numberOfMonths","dateInTargetMonth","setDateTimeToMidnight","setHours","opt_value","dateAtMidnight","minDateAtMidnight","maxDateAtMidnight","numberOfYears","boundDate","Number","datePickerDirective","hiddenIcons","mdHideIcons","ariaLabelValue","mdPlaceholder","calendarButton","mdCalendar","triangleButton","HAS_TRIANGLE_ICON_CLASS","debounceInterval","DatePickerCtrl","mdDatePickerCtrl","mdInputContainer","spacer","INPUT_CONTAINER_CLASS","HAS_CALENDAR_ICON_CLASS","parentSubmittedWatcher","isSubmitted","updateErrorState","ngInputElement","calendarPane","inputMask","setDisabled","isCalendarOpen","openOnFocus","calendarPaneOpenedFrom","calendarPaneId","bodyClickHandler","handleBodyClick","windowEventName","IS_MOBILE_REGEX","windowEventHandler","closeCalendarPane","windowBlurHandler","handleWindowBlur","ngDateFilter","leftMargin","detachCalendarPane","mdIsOpen","shouldBeOpen","openCalendarPane","EXTRA_INPUT_SIZE","INVALID_CLASS","OPEN_CLASS","DEFAULT_DEBOUNCE_INTERVAL","CALENDAR_PANE_HEIGHT","CALENDAR_PANE_WIDTH","locale","installPropertyInterceptors","attachChangeListeners","attachInteractionListeners","parsedValue","parse","onExternalChange","unshift","updateOn","resizeInputElement","handleInputEvent","clearErrorState","inputString","parsedDate","isValidInput","attachCalendarPane","elementRect","bodyRect","paneTop","paneLeft","viewportLeft","viewportBottom","viewportRight","inputFocusedOnWindowBlur","focusCalendar","reset","getCalendarCtrl","isInCalendar","mdIconDirective","$mdIcon","prepareForFontIcon","mdSvgIcon","mdSvgSrc","mdFontIcon","lastFontSet","fontIconChanged","lastFontIcon","fontSet","mdFontSet","ariaHidden","iconName","alt","attrVal","svg","MdIconProvider","ConfigurationItem","viewBoxSize","defaultViewBoxSize","MdIconService","getIcon","getTrustedUrl","iconCache","transformClone","urlRegex","dataUrlRegex","loadByURL","cacheIcon","load","loadByID","loadFromIconSet","findRegisteredFontSet","useDefault","defaultFontSet","fontSets","cacheElement","cacheSuffix","icon","isIcon","Icon","iconConfig","extractFromSet","iconSetConfig","announceIdNotFound","setName","loadByDataUrl","isBase64","atob","loadByHttpUrl","announceAndReject","err","statusText","extractSvg","svgCache","prepare","prepareAndStyle","preserveAspectRatio","viewBox","cloneSVG","mdCancel","mdMenu","mdToggleArrow","mdChecked","iconSet","defaultIconSet","defaultIconSize","iconSize","MenuController","$mdMenu","menuContainer","nestLevel","mdNestLevel","setMenuContainer","isInMenuBar","nestedMenus","onIsOpenChanged","menuContainerId","aria-owns","aria-haspopup","disableHoverListener","openMenuTimeout","menuItems","deregisterScopeListeners","enableHoverListener","currentlyOpenMenu","isAlreadyOpening","registerContainerProxy","triggerContainerProxy","handleMenuItemHover","handleMenuItemMouseLeave","nestedMenu","focusableTarget","mdMenuCtrl","$mdMenuIsOpen","focusMenuContainer","focusTarget","containerProxy","skipFocus","closeOpts","eventDetails","restoreFocusTo","positionMode","attachment","mdPositionMode","mdOffset","$mdOpenMenu","MenuDirective","templateElement","triggerEl","isButtonTrigger","INVALID_PREFIX","nestingDepth","menuContents","MenuProvider","menuDefaultOptions","detachElement","cleanupBackdrop","showMenu","calculateMenuPosition","menuContentEl","startRepositioningOnResize","repositionMenu","setupBackdrop","handled","focusMenuItem","parentMenu","captureClickListener","hasAnyAttribute","closestMenu","childrenLen","childIndex","didFocus","currentItem","currentIndex","attemptFocus","toNode","firstVisibleChild","openMenuNode","alignTarget","openMenuNodeRect","boundryNode","boundryNodeRect","menuStyle","originNode","originNodeRect","MENU_EDGE_MARGIN","alignTargetRect","existingOffsets","rtl","willFitRight","MenuBarController","BOUND_MENU_METHODS","deregisterFns","handleKeyDown","parentToolbar","getMenus","enableOpenOnHover","rootMenus","disableOpenOnHover","setKeyboardMode","openOnHoverEnabled","handleParentClick","handleMenuHover","scheduleOpenHoveredMenu","menuCtrl","scheduleOpenMenu","pendingMenuOpen","currentMenu","wasOpen","newMenu","newMenuCtrl","openFocusedMenu","focusMenu","menus","focusedIndex","getFocusedMenuIndex","getOpenMenuIndex","changed","menu","getFocusedMenu","focusedEl","openMenu","MenuBarDirective","templateEl","templateAttrs","ariaRole","contentEls","MenuDividerDirective","MenuItemController","iconEl","buttonEl","initClickListeners","clearNgAria","clearAttrs","handleClick","MenuItemDirective","setDefault","moveAttrToButton","inMenuBarClass","iconTemplate","MdProgressCircularDirective","$mdProgressCircular","$interval","MdProgressCircularLink","renderCircle","animateFrom","animateTo","iterationCount","renderFrame","getDashLength","diameter","strokeWidth","dashLimit","lastAnimationId","changeInValue","mdDiameter","getStroke","easeFn","rotation","lastDrawFrame","rAF","animateIndeterminate","startIndeterminate","endIndeterminate","easeFnIndeterminate","durationIndeterminate","startIndeterminateAnimation","interval","INDETERMINATE_CLASS","cleanupIndeterminateAnimation","cAF","$watchGroup","newValues","oldValues","wasDisabled","getSvgArc","PI","indeterminate","radius","arcRadius","progressSize","parsed","requestAnimationFrame","webkitRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","aria-valuemin","aria-valuemax","MdProgressCircularProvider","linearEase","c","materialEase","progressConfig","easingPresets","configure","MdTab","getTabElementIndex","insertTab","active","getIndex","refreshIndex","updateTabOrder","removeTab","MdTabItem","MdTabLabel","MdTabScroll","mdTabScroll","MdTabsController","$mdTabInkRipple","defineOneWayBinding","handleStretchTabs","handleFocusIndexChange","selectedIndex","handleOffsetChange","handleHasContent","handleMaxTabWidth","getMaxTabWidth","handleShouldPaginate","defineBooleanAttribute","handleInkBar","handleDynamicHeight","handleCenterTabs","lastSelectedIndex","styleTabItemFocus","shouldCenterTabs","tabContentPrefix","setupTabsController","compileTemplate","getElements","updateHeightFromContent","adjustOffset","updateInkBarStyles","loaded","updatePagination","$mdTabsTemplate","handleWindowResize","handleSelectedIndexChange","updateValue","destroyed","stretchTabs","shouldStretchTabs","newWidth","oldWidth","maxTabWidth","hasContent","paging","redirectFocus","getNearestSafeIndex","handleResizeWhenVisible","incrementIndex","locked","focusIndex","canSkipClick","noSelectClick","scroll","shouldPaginate","fixOffset","wheelDelta","nextPage","canvas","totalWidth","previousPage","inkBar","tabData","hasLoaded","proto","isActive","isLeft","isRight","shouldRender","noDisconnect","updateHasContent","setAriaControls","dummies","canPageBack","canPageForward","lastTab","getFocusedTabId","centerTabs","noPagination","canvasWidth","maxOffset","calcTabsWidth","focusItem","inc","dynamicHeight","tabContent","contentHeight","tabsHeight","newHeight","currentHeight","fromHeight","toHeight","tabWidth","updateInkBarClassName","ink","MdTabs","MdTabsDummyWrapper","observer","mutationCallback","childList","subtree","characterData","debounced","MdTabsTemplate","handleScope","reconnect","enableDisconnect","compileScope","connected","ngMaterial","full","$stateProvider","$urlRouterProvider","$locationProvider","otherwise","html5Mode","hpeAccentMap","microTool","util","_classCallCheck","Constructor","TypeError","MainController","_createClass","defineProperties","descriptor","enumerable","configurable","writable","protoProps","staticProps","$state","$location","$anchorScroll","_this","reg","go","scrollToTop","old","steps","description","questions","dbEntity","analyticsName","nextStep","previousStep","isSectionIncomplete","isIncomplete","question","component","routes","ResultsCtrl","score","average","readOnly","getAvgOffset","final","isRegistered","userRoles","UtilService","Util","safeCb","urlParse","isSameOrigin","origins","o","hostnameCheck","hostname","protocolCheck","protocol","portCheck","port","HeaderComponent","title","isCollapsed","FooterComponent","QuestionComponent","updateInputs","bindings","StepperComponent","activeStep","completedSteps","StepComponent","lastStep","stepperCtrl","includes","HorizontalStepperComponent","HorizontalStepComponent","modules","mediaQuery","alreadyImportedModules","addStylesToDom","domStyle","stylesInDom","refs","addStyle","listToStyles","newStyles","sourceMap","part","insertStyleElement","styleElement","getHeadElement","lastStyleElementInsertedAtTop","styleElementsInsertedAtTop","insertAt","removeStyleElement","idx","createStyleElement","createLinkElement","rel","update","singleton","styleIndex","singletonCounter","singletonElement","applyToSingletonTag","URL","createObjectURL","revokeObjectURL","Blob","btoa","updateLink","applyToTag","newObj","styleSheet","replaceText","cssNode","unescape","encodeURIComponent","JSON","stringify","blob","oldSrc","memoize","memo","isOldIE","newList","mayRemove","textStore","replacement","Boolean"],"mappings":"AAAAA,cAAc,IAER,SAAUC,OAAQC,QAASC,qBCFjC,YC8EA,SAASC,wBAAuBC,KAAO,MAAOA,MAAOA,IAAIC,WAAaD,KAAQE,QAASF,KD5EvF,GAAAG,UAAAL,oBAAA,GCEIM,UAAYL,uBAAuBI,UDDvCE,gBAAAP,oBAAA,GCKIQ,iBAAmBP,uBAAuBM,iBDJ9CE,gBAAAT,oBAAA,GCQIU,iBAAmBT,uBAAuBQ,iBDP9CE,iBAAAX,oBAAA,GCWIY,kBAAoBX,uBAAuBU,kBDV/CE,iBAAAb,oBAAA,GCcIc,kBAAoBb,uBAAuBY,kBDb/CE,iBAAAf,oBAAA,ICiBIgB,kBAAoBf,uBAAuBc,kBDhB/CE,iBAAAjB,oBAAA,ICoBIkB,kBAAoBjB,uBAAuBgB,kBDnB/CE,KAAAnB,oBAAA,IAEAoB,MAAApB,oBAAA,ICuBIqB,OAASpB,uBAAuBmB,ODtBpCE,SAAAtB,oBAAA,IC0BIuB,UAAYtB,uBAAuBqB,UDzBvCE,MAAAxB,oBAAA,IC6BIyB,MAAQxB,uBAAuBuB,OD5BnCE,MAAA1B,oBAAA,ICgCI2B,OAAS1B,uBAAuByB,OD/BpCE,WAAA5B,oBAAA,ICmCI6B,YAAc5B,uBAAuB2B,YDlCzCE,QAAA9B,oBAAA,ICsCI+B,SAAW9B,uBAAuB6B,SDrCtCE,UAAAhC,oBAAA,ICyCIiC,WAAahC,uBAAuB+B,WDxCxCE,SAAAlC,oBAAA,IC4CImC,UAAYlC,uBAAuBiC,UD3CvCE,MAAApC,oBAAA,IC+CIqC,OAASpC,uBAAuBmC,OD9CpCE,mBAAAtC,oBAAA,ICkDIuC,oBAAsBtC,uBAAuBqC,oBDjDjDE,gBAAAxC,oBAAA,ICqDIyC,iBAAmBxC,uBAAuBuC,gBDlD9CxC,qBAAA,IAGAM,UAAAF,QAAQN,OAAO,kBAAkBY,iBAAAN,QAAAQ,kBAAAR,QAAAU,kBAAAV,QAAAY,kBAAAZ,QAAAI,iBAAAJ,QAAAc,kBAAAd,QAAAqB,MAAArB,QAAAuB,OAAAvB,QAAAiB,OAAAjB,QAAAmB,UAAAnB,QAAAyB,YAAAzB,QAAA2B,SAAA3B,QAAA6B,WAAA7B,QAAA+B,UAAA/B,QAAAiC,OAAAjC,QAAAmC,oBAAAnC,QAAAqC,iBAAArC,UAK9BsC,OALHvB,KAAAwB,aAMGC,IANHzB,KAAA0B,gBAQAvC,UAAAF,QAAQ0C,QAAQC,UACbC,MAAM,WACL1C,UAAAF,QAAQ6C,UAAUF,UAAW,mBAC3BG,UAAU,ODuDT,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACC,CACA,CAEF,SAAUpD,OAAQC,QAASC,qBGxGjCA,oBAAA,GAGAA,oBAAA,GACAA,oBAAA,IAGAA,oBAAA,IAGAF,OAAAC,QAAA,cH+GQ,CACA,CAEF,SAAUD,OAAQC,UIvHxB,SAAAoD,OAAAC,QAAAC,WACA,cAEA,WAGAD,QAAAtD,OAAA,s/CAEA,WA6BA,QAAAwD,eAAAC,KAAAC,WACA,GAAAA,UAAAC,IAAA,WACA,GAAAC,KAAA,gKAIAH,MAAAI,KAAAD,MAOA,QAAAE,iBAAAC,SAAAC,oBAEAD,SAAAE,UAAA,qBAAAC,eACAH,SAAAE,UAAA,kBAAAE,aAEAH,mBAAAI,MAAA,WACAC,eAAA,UACAC,cAAA,QACAC,YAAA,eACAC,kBAAA,QAMA,QAAAN,cAAAO,WA4BA,MAfAA,WAAAC,SAAA,SAAAC,IACA,GAAAC,YAAAC,cAAAC,QAAAC,OACA,mBACAH,WAAAI,UACAD,QAAAE,KACAH,QAAAH,GACAE,gBACAA,eAAA,EACAJ,UAAA,WACAK,QAAAI,MAAAH,QAAAI,MAAAC,UAAAC,MAAAC,KAAAV,aACAC,eAAA,OAKAJ,UAMA,QAAAN,YAAAM,WAYA,MAHAA,WAAAc,UACAd,UAAAc,QAAAd,UAAAe,MAEAf,UAhGAjB,cAAAiC,SAAA,oBACA3B,gBAAA2B,SAAA,iCACAvB,aAAAuB,SAAA,aACAtB,WAAAsB,SAAA,aACAnC,QACAtD,OAAA,iBACA,YACA,wBACA,uBACA,4BACA,yBACA,0BAEA4C,OAAAkB,iBACAhB,IAAAU,kBAsFA,WAgGA,QAAAkC,sBAAAC,QAQA,QAAAC,SAAAC,MAAA7C,QAAA8C,MAgBA,QAAAC,kBAAAC,OAIA1C,QAAA2C,YAAAD,SACAA,OAAA,GAGAhD,QAAAkD,YAAA,iBAAAF,OAvBA,GAAAG,SAAAL,KAAAM,aAAAN,KAAAO,aAAAP,KAAAQ,cAGAP,kBAAAJ,OAAAQ,SAAAN,QAGAM,SACAN,MAAAU,OAAAJ,QAAAJ,kBAfA,OACAS,SAAA,IACAC,MACAC,IAAAd,UAhGAF,qBAAAD,SAAA,UAA0CnC,QAAAtD,OAAA,iBAC1C2G,UAAA,cAAAjB,sBAGAiB,UAAA,cAAAjB,sBACAiB,UAAA,iBAAAjB,yBA8HA,WAaA,QAAAkB,oBAMA,QAAAC,WAAAC,OACA,GAAAC,KAAA,MAAAD,MAAA,GAAAA,MAAAE,OAAA,GAAAF,MACAG,IAAAF,IAAAG,OAAA,EACAC,IAAAJ,IAAAC,OAAA,EAAAC,KACAG,MAAAL,IAAAC,OAAAC,SACAI,KAAAN,IAAAC,OAAA,EAAAC,IAMA,OALA,KAAAA,MACAE,SACAC,aACAC,YAEA,QAAAC,SAAAH,IAAA,QAAAG,SAAAF,MAAA,QAAAE,SAAAD,KAAA,YAQA,QAAAE,WAAAT,OACAA,YAAAU,MAAA,uEAEA,IAAAT,KAAAD,OAAA,IAAAA,MAAAI,OAAA,KACA,IAAAI,SAAAR,MAAA,OAAAW,SAAA,KAAApC,OAAA,IACA,IAAAiC,SAAAR,MAAA,OAAAW,SAAA,KAAApC,OAAA,IACA,IAAAiC,SAAAR,MAAA,OAAAW,SAAA,KAAApC,OAAA,KAEA,OAAA0B,KAAAW,cAQA,QAAAC,WAAAb,OACA,MAAAA,OAAAc,QAAA,cAAAA,QAAA,UAQA,QAAAC,WAAAf,OACA,MAAAA,OACAA,MAAAc,QAAA,cAAAA,QAAA,kBACA,aAGA,OACAL,oBACAV,oBACAc,oBACAE,qBAhEAvE,QACAtD,OAAA,iBACA8H,QAAA,eAAAlB,qBAmEA,WAUA,QAAAmB,qBAOA,QAAAC,gBAAAC,MAEA,GAAAC,cAAAC,aAAA,IAAAF,KACAG,SAAAC,UAAAH,cACAI,SAAAF,SAAAG,OAAA,GAAAC,cAAAJ,SAAAK,UAAA,EAEA,OAAAC,kBAAAC,aAAAV,WACAS,iBAAAC,aAAAP,mBACAM,iBAAAC,aAAAL,mBAAAL,KAGA,QAAAS,kBAAAE,YAAAC,UACA,MAAAvF,SAAAwF,UAAAF,YAAAG,MAAAF,WAGA,QAAAR,WAAAW,OACA,MAAAA,OAAApB,QAAAqB,qBAAA,SAAAC,QAAAC,UAAAC,OAAAC,QACA,MAAAA,QAAAD,OAAA1B,cAAA0B,SAIA,QAAAE,iBAAAV,aACA,GAAAW,MAAA/B,MACAgC,YAAA,2BAEA,KAAAD,OAAAX,aAAAG,MACA,GAAAvB,MAAAgC,YAAAC,KAAAF,MACA,MAAA/B,OAAA,GAhCA,GAAAmB,cAAA1F,SAAAyG,cAAA,OACAvB,aAAAmB,gBAAAX,cACAgB,SAAA,UAAAC,KAAAzB,cACAc,qBAAA,gBAkCAY,MACAC,WAAA,SAAAC,GAA8B,MAAAA,GAAAC,SAAA,IAAAD,EAAAC,SAAA,IAC9BC,YAAA,SAAAF,GAA+B,WAAAA,EAAAG,UAAAH,EAAAC,SAAA,IAAAD,EAAAC,SAAA,KAC/BG,UAAA,SAAAJ,GAA4B,MAAAA,GAAAC,SAAA,IAAAD,EAAAC,SAAA,IAC5BI,YAAA,SAAAL,GAA8B,MAAAA,GAAAC,SAAA,KAAAD,EAAAC,SAAA,KAC9BK,gBAAA,SAAAN,GACA,GAAAO,IAAAT,KAAAU,SAAAC,iBAAAF,GAAAG,MAAAH,GAAAI,MAAAJ,GAAAK,SAAAL,GAAAM,WACA,OAAAJ,iBAAAK,QAAAd,EAAAC,WAAA,GAEAc,eAAA,SAAAf,GACA,MAAAA,GAAAgB,SAAAhB,EAAAiB,SAAAjB,EAAAkB,QASAC,mBAAA,QAKAC,eAAA,IAKAZ,UACAa,MAAA,IACAC,UAAA,IACAX,MAAA,GACAY,OAAA,GACAb,MAAA,GACAc,QAAA,GACAC,UAAA,GACAC,IAAA,GACAC,KAAA,GACAC,WAAA,GACAhB,SAAA,GACAiB,YAAA,GACAhB,WAAA,GACAiB,IAAA,EACAC,UAAA,EACAC,OAAA,IAOAC,KAEAC,cAAA,iBAAAtC,SAAA,2BACAuC,aAAA,gBAAAvC,SAAA,0BAEAwC,UAAAnE,eAAA,aACAoE,iBAAApE,eAAA,mBACAqE,WAAArE,eAAA,cACAsE,oBAAAtE,eAAA,sBACAuE,qBAAAvE,eAAA,sBACAwE,mBAAAxE,eAAA,qBACAyE,eAAAzE,eAAA,iBACA0E,iBAAA1E,eAAA,2BACA2E,oBAAA3E,eAAA,uBAYA4E,OACAC,GAAA,qBACAC,QAAA,qBACAC,GAAA,4CACAC,QAAA,qBACAC,GAAA,6CACAC,QAAA,sBACAC,GAAA,8CACAC,QAAA,sBACAC,GAAA,sBACAC,UAAA,2BACAC,SAAA,0BACAC,MAAA,SAGAC,gBACA,KACA,QACA,KACA,QACA,KACA,QACA,KACA,QACA,KACA,YACA,WACA,SAIA,OAAA5D,MA1JAvG,QAAAtD,OAAA,iBACA8H,QAAA,cAAAC,sBA6JA,WAwBA,QAAA2F,YAAAC,MAAAC,QAuCA,QAAAC,YACA,SAAAC,OAAAC,QAOA,QAAAC,SACA,MAAAD,QAAA7G,OAQA,QAAA+G,SAAAC,OACA,MAAAH,QAAA7G,QAAAgH,OAAA,GAAAA,MAAAH,OAAA7G,OAUA,QAAAiH,SAAAC,MACA,QAAAA,MAAAH,QAAApD,QAAAuD,MAAA,GAUA,QAAAC,aAAAD,MACA,QAAAA,MAAAH,QAAApD,QAAAuD,MAAA,GAQA,QAAAE,QAAAJ,OACA,MAAAD,SAAAC,OAAAH,OAAAG,OAAA,KAYA,QAAAK,QAAAC,IAAAC,KACA,MAAAV,QAAAW,OAAA,SAAAN,MACA,MAAAA,MAAAI,OAAAC,MAUA,QAAAE,KAAAP,KAAAF,OACA,MAAAE,OAEA9K,QAAAsL,SAAAV,SACAA,MAAAH,OAAA7G,QAGA6G,OAAAc,OAAAX,MAAA,EAAAE,MAEAvD,QAAAuD,QARA,EAeA,QAAAU,QAAAV,MACAW,SAAAX,OACAL,OAAAc,OAAAhE,QAAAuD,MAAA,GASA,QAAAvD,SAAAuD,MACA,MAAAL,QAAAlD,QAAAuD,MAQA,QAAAW,UAAAX,MACA,MAAAA,OAAAvD,QAAAuD,OAAA,EAOA,QAAAY,SACA,MAAAjB,QAAA7G,OAAA6G,OAAA,QAOA,QAAAkB,QACA,MAAAlB,QAAA7G,OAAA6G,cAAA7G,OAAA,QAeA,QAAAgI,oBAAAC,UAAAf,KAAAgB,SAAAC,OACAD,mBAAAE,MAGA,KADA,GAAAC,UAAA1E,QAAAuD,QACA,CACA,IAAAH,QAAAsB,UAAA,WAEA,IAAAC,WAAAD,UAAAJ,WAAA,KACAM,UAAA,IAQA,IAPAxB,QAAAuB,WACAC,UAAA1B,OAAAyB,WACS5B,SACT6B,UAAAN,UAAAF,OAAAD,QACAQ,UAAA3E,QAAA4E,YAGA,OAAAA,WAAAD,YAAAH,MAAA,WACA,IAAAD,SAAAK,WAAA,MAAAA,UAEAnM,SAAA2C,YAAAoJ,eAAAG,WAEAD,SAAAC,WAxMA,GAAAF,QAAA,WAA6B,SAE7B3B,SAAArK,QAAAoM,QAAA/B,SACAA,MAAAxI,MAAAC,UAAAC,MAAAC,KAAAqI,QAGAC,eACA,IAAAG,QAAAJ,SAGA,QACAA,MAAAE,SACAG,YAEAC,gBACAc,kBACAlE,gBACAyD,cAEAC,cAEAI,QACAG,cAEAE,YACAC,UACAU,KAAArM,QAAAsM,KAAA,KAAAV,oBAAA,GACAW,SAAAvM,QAAAsM,KAAA,KAAAV,oBAAA,GAEAb,wBACAF,iBApDA7K,QACAtD,OAAA,iBACA4C,QAAA,oBAAAmB,UACAA,SAAAE,UAAA,gCAAAQ,WAOA,MAFAA,WAAAqL,SAAApC,WAEAjJ,mBA2NA,WAqGA,QAAAsL,gBAAAC,YAAAC,WAAAC,SAYA,QAAAC,UAAAC,OACA,GAAAC,WAAAC,QAAAF,MACA9M,SAAA2C,YAAAoK,aACAA,UAAAC,QAAAF,OAAAhB,SAAAgB,OAGA,IAAAG,QAAAC,QAAAH,UAKA,OAJA/M,SAAA2C,YAAAsK,UACAA,OAAA5B,IAAA0B,YAGAE,OAGA,QAAAnB,UAAAgB,OACA,MAAAJ,aAAApD,MAAAwD,SACA,MAAAA,MAAA7H,OAAA,OAAA6H,MAAA,IAAAA,OAGA,QAAAzB,KAAAyB,OACA,GAAAG,QAAAE,KAAAL,MAMA,OALAG,UACAA,OAAAE,KAAAL,OAAAF,QAAAQ,WAAAN,QAGAG,OAAAI,YAAAC,eACAJ,QAAAD,OAAAM,SAAAN,OAAArH,QAGA,QAAA0H,eAAAR,OACAH,WAAAa,WAAA,WACAN,QAAAJ,MAAAS,SAAAT,MAAAlH,UAIA,QAAA6H,UAAA9I,MACA,MAAAwI,MAAAxI,MAGA,QAAA+I,wBAAAC,MAAAC,UACA,OAAAC,GAAA,EAAmBA,EAAAnB,YAAAvC,eAAAvG,OAAuCiK,IAAA,CAC1D,GAAAC,WAAApB,YAAAvC,eAAA0D,EACA,IAAAV,KAAAH,QAAAc,YAAAlI,QAAA,CAIA,GAAAmI,gBAAAC,kBAAAL,MAAAC,SAAA,IAAAE,UACA,IAAAH,MAAAI,gBACA,MAAAJ,OAAAI,iBAKA,MAAAJ,OAAAK,kBAAAL,MAAAC,WAGA,QAAAK,2BAAAC,UAAAP,MAAAQ,SACA,GAAAC,cAiBA,OAhBAF,WAAAG,QAAA,SAAAT,UACA,GAAAG,gBAAAC,kBAAAL,MAAAC,SACA5N,SAAAwF,UAAAmI,MAAAI,kBACAK,WAAAE,KACAX,MAAAY,SAAAR,eAAA/N,QAAAsM,KAAA,OAAA6B,QAAA,OAGA,QAAAL,aAAApB,aAAApD,MACAyE,eAAAC,kBAAAL,MAAAC,SAAA,IAAAE,WACA9N,QAAAwF,UAAAmI,MAAAI,kBACAK,WAAAE,KACAX,MAAAY,SAAAR,eAAA/N,QAAAsM,KAAA,OAAA6B,QAAAL,eAKA,WACAM,WAAAC,QAAA,SAAAG,IAAuCA,QAKvC,QAAAR,mBAAAL,MAAAC,UACA,MAAAa,gBAAAb,YACAa,eAAAb,UAAAD,MAAAe,WAAAd,WA7FA,GAAAZ,YACAG,QACAD,WACAuB,iBAMA,OAJA5B,UAAAa,8CACAb,SAAAY,kBACAZ,SAAAoB,oDAEApB,SA3GAJ,eAAAtK,SAAA,sCAAkEnC,QAAAtD,OAAA,iBAClE8H,QAAA,WAAAiI,mBAmMA,WAeA,QAAAkC,YAAAC,kBAAAC,eAgBA,QAAAC,YAAAC,YASA,MARAA,YAAA/O,QAAAoM,QAAA2C,oCAEAA,WAAAV,QAAA,SAAAvD,MACAkE,SAAAX,QAAA,SAAAY,QACAF,WAAAT,KAAAW,OAAA,IAAAnE,UAIAiE,WAGA,QAAAG,gBAAAH,YAGA,MAFAA,YAAA/O,QAAAoM,QAAA2C,oCAEAD,WAAAC,YACAI,IAAA,SAAArE,MACA,UAAAA,KAAA,MAEAsE,KAAA,KAGA,QAAAC,eAAA3P,QAAA4P,WAGA,GAFA5P,QAAA6P,kBAAA7P,UAEAA,QACA,QAKA,QAFA8P,eAAAV,WAAAQ,WAEAzB,EAAA,EAAmBA,EAAA2B,cAAA5L,OAA0BiK,IAC7C,GAAAnO,QAAA+P,aAAAD,cAAA3B,IACA,QAIA,UAGA,QAAA6B,kBAAAhQ,QAAA4P,WACA5P,QAAA6P,kBAAA7P,SAEAA,SAIAoP,WAAAQ,WAAAjB,QAAA,SAAAsB,mBACAjQ,QAAAkQ,gBAAAD,qBAWA,QAAAJ,mBAAA7P,SAGA,GAFAA,gBAAA,IAAAA,QAEAA,QAAAmQ,SACA,MAAAnQ,SA9EA,GAAAsP,WAAA,WAEA,OAAAJ,mBAGAC,cAAAK,eAAAN,mBAAAE,WAAAF,oBAIAkB,UAAAhB,WACAD,cAAAK,eACAO,aAAAJ,cACAO,gBAAAF,kBAzBA1P,QACAtD,OAAA,iBACA4C,QAAA,oBAAAmB,UACAA,SAAAE,UAAA,gCAAAQ,WAKA,MAFAA,WAAA4O,SAAApB,WAEAxN,mBA0FA,WAyBA,QAAA6O,aAAAC,UAAAC,SAAAC,SAAAxD,WAAAyD,YAAAC,aAAAlQ,KAAAmQ,aAAA1D,QAAA2D,OAwBA,QAAAC,kBAAA9N,OACA,MAAAA,OACA+N,MAAA/N,QAAAgO,WAAAhO,mBAAA,KADA,IAIA,QAAA+N,OAAA/N,OACA,MAAAiO,QAAAjO,OAAA6E,QAAA,SAGA,QAAAmJ,YAAAhO,OACA,MAAAiO,QAAAjO,OAAA6E,QAAA,QA8yBA,QAAAqJ,SAAAC,IACA,MAAAA,IAAA,IAAAA,GA/0BA,GAAAC,aAAAT,aAAAS,cACAC,UAAAV,aAAAU,YACAC,oBAAA,OAAAF,aAA+C,OAAAC,UAS/CE,iBAAA,SAAAC,OAAAhG,IAAAiG,aACA,GAAAC,WAAA,CAEA,IAAAF,eAAAtN,OAAA,CACA,GAAAyN,gBAAAzE,QAAA0E,iBAAAJ,OAAA,GACAE,UAAApR,QAAAwF,UAAA6L,eAAAnG,SAAAiG,aAAAE,eAAAnG,MAAAiG,aAGA,MAAAC,WAiBAG,SACAC,OACAC,IAAA1R,OAAA2R,aAAA3R,OAAA2R,YAAAD,IACAzR,QAAAsM,KAAAvM,OAAA2R,YAAA3R,OAAA2R,YAAAD,KAAAE,KAAAF,KAAA,WACA,UAAAE,OAAAC,WAUAC,eAAA,SAAAC,YAAAC,YACA,GAAAD,YAAAE,SAAA,CAIA,GAAAA,UAAAF,YAAAE,QAIA,OAAAA,UAAAC,UAAAD,SAAAC,UAAAF,YAAAC,SAAAD,cAOAG,KAAA,SAAAxS,QAAA6F,SAAA4M,OAAAC,QACA,GAAAC,OAAA,OAAApC,UAAA,GAAAqC,KAAA,OAAArC,UAAA,GAAAsC,KAAAD,IAGA,OAAA5Q,UAAAkC,OAAA,MAAAyO,KAAA,WAGA,IAAAG,MAAAxS,QAAAN,gBAEA2S,MAAArS,QAAAwF,UAAA2M,QACAK,KAAAC,IAAAlN,SAAAiL,iBAAA2B,UAEAE,KAAArS,QAAAwF,UAAA4M,SACAI,KAAAC,IAAAlN,SAAAiL,iBAAA4B,UAIAM,aAAA,SAAAhT,QAAAiT,UAAAC,UAAAlQ,OACA,GAAA2P,OAAA,OAAApC,UAAA,GAAAqC,KAAA,OAAArC,UAAA,GAAAsC,KAAAD,KAEAE,KAAAxS,QAAAN,gBAEA2S,MAAArS,QAAAwF,UAAAmN,YACAH,KAAAC,IAAAE,UAAAnC,iBAAA9N,QACA8P,KAAAC,IAAAG,UAAA,MAEAP,KAAArS,QAAAwF,UAAAoN,aACAJ,KAAAC,IAAAG,UAAApC,iBAAA9N,QACA8P,KAAAC,IAAAE,UAAA,MAIAE,WAAA,SAAAnT,QAAAoT,aAAAC,cACA,GAAAC,MAAApC,QAAAlR,QACAoT,cAAAlC,QAAAkC,cAAAE,KAAAF,cAAAnT,SAAA4S,KACA,IAAAU,UAAAD,KAAAE,wBAIAC,WAAAJ,aACAD,aAAAI,yBACOE,KAAA,EAAAC,IAAA,EAAAC,MAAA,EAAAC,OAAA,EACP,QACAH,KAAAH,SAAAG,KAAAD,WAAAC,KACAC,IAAAJ,SAAAI,IAAAF,WAAAE,IACAC,MAAAL,SAAAK,MACAC,OAAAN,SAAAM,SAGAJ,WAAA,SAAAzT,QAAAoT,cACA,MAAAvB,SAAAsB,WAAAnT,QAAAoT,cAAA,IAIAU,aAAA,SAAAC,OACAA,eAGA,QADAvG,YACAW,EAAA,EAAqBA,EAAA4F,MAAA7P,SAAkBiK,EACvCX,QAAAoB,KAAAmF,MAAA3I,KAAA+C,GAEA,OAAAX,UAQAwG,eAAA,WACA,MAAA3T,QAAA4T,SAAA5T,OAAA6T,aAAA,GAUAC,gBAAA,SAAAC,YAAAC,cAsBA,QAAAC,kBAAA9C,OAAA+C,UACA,GAAAC,SAAA7J,MAAA6G,OAAA,GAAAiD,iBAAAF,SAaA,OAVA5J,cAAAzG,QACAyG,MAAAzG,QAAA5D,QAAAqO,QAAAhE,MAAA,SAAA+J,IACAA,GAAApU,QAAAN,QAAA0U,GAIA,IAAAC,aAAAD,GAAAE,SAAA,eACAD,eAAAH,QAAAE,MAGAF,QAnCA,GACAK,WADAC,WAAA7S,KAAAoO,SAAA,kBAeA,OAZAwE,WAAAP,iBAAAF,YAAAC,cAAAS,YAEAD,WAAAR,cAAAS,aAEAD,UAAAP,iBAAAF,YAAAnS,KAAAoO,SAAA,qBAEAwE,YAEAA,UAAAP,iBAAAF,YAAAU,cAIAD,WAiCAE,oBAAA,SAAA/U,QAAAgV,OAAAC,SA0BA,QAAAC,sBAAAlV,SA2BA,QAAAmV,gBAAApO,GACAA,EAAAoO,iBA3BAnV,QAAAM,QAAAN,iBAAA6S,KAEA,IAAAuC,WAeA,OAbAH,SAAAI,kBACAD,WAAApV,SAEAoV,WAAA9U,QAAAN,QACA,8EAGAA,QAAAsV,OAAAF,aAGAA,WAAAG,GAAA,QAAAJ,gBACAC,WAAAG,GAAA,YAAAJ,gBAEA,WACAC,WAAAI,IAAA,SACAJ,WAAAI,IAAA,aAEAP,QAAAI,mBACAD,WAAA,GAAAK,WAAAC,YAAAN,WAAA,KAUA,QAAAO,qBACA,GAAAC,iBAAArF,UAAA,GAAAqF,gBAEAC,kBAAAD,gBAAA7P,MAAA+P,SAAA,GACAC,cAAAlD,KAAA9M,MAAA+P,SAAA,GAEAE,YAAAnE,QAAAmC,iBACAiC,YAAApD,KAAAoD,YACAC,qBAAArD,KAAAsD,aAAAtD,KAAAuD,aAAA,CAqBA,OAnBAF,uBACA5V,QAAAN,QAAA6S,MAAAE,KACAsD,SAAA,QACAzC,MAAA,OACAD,KAAAqC,YAAA,OAIAnD,KAAAoD,0BACApD,KAAA9M,MAAAuQ,SAAA,UAMAJ,uBACAN,gBAAA7P,MAAAwQ,UAAA,UAGA,WAEA1D,KAAA9M,MAAA+P,QAAAC,cACAH,gBAAA7P,MAAA+P,QAAAD,kBAGAhD,KAAA2D,UAAAR,aAxFA,GALAf,oBAEApD,QAAAkD,oBAAA0B,OAAAC,KAAAC,IAAA,EAAA9E,QAAAkD,oBAAA0B,QAAA,GACA5E,QAAAkD,oBAAA0B,SAEA5E,QAAAkD,oBAAA6B,eACA,MAAA/E,SAAAkD,oBAAA6B,cAGA,IAAA/D,MAAAtC,UAAA,GAAAsC,KACAgE,YAAAlB,oBACAmB,eAAA5B,qBAAAF,OAEA,OAAAnD,SAAAkD,oBAAA6B,eAAA,aACA/E,QAAAkD,oBAAA0B,QAAA,IACAI,cACAC,uBACAjF,SAAAkD,oBAAA6B,kBAkFAG,gBAAA,WACA,GAAAC,WAAA/U,KAAA8S,oBAAA6B,cACAI,yBAGAC,mBAAA,WACA,GAAAhV,KAAAgV,mBAAAC,SAAA3W,UAAA,CACA,GAAA4W,UAAA7W,QAAAN,QAAA,0BAAA+S,KACAa,MAAA,OACAwD,WAAA,EACAf,SAAA,WACAxC,OAAA,OACAwD,aAAA,UAEAF,UAAAG,WAAAvE,IAAA,iBAEAxC,UAAA,GAAAsC,KAAA0E,YAAAJ,SAAA,IACAlV,KAAAgV,mBAAAC,OAAAC,SAAA,GAAAK,aAAAL,SAAA,GAAAM,WAAA,GAAAD,YACAL,SAAArL,SAEA,MAAA7J,MAAAgV,mBAAAC,QAIAQ,WAAA,SAAA1X,SACA,GAAAsT,MAAAtT,QAAA,IAAAA,OAEAC,UAAA0X,iBAAA,gBAAAC,cAAAC,IACAA,GAAArG,SAAA8B,MAAAuE,GAAAC,SACAxE,KAAAyE,QACAF,GAAAG,2BACAH,GAAA1C,iBACA7B,KAAA2E,oBAAA,QAAAL,iBAEO,EAEP,IAAAM,UAAAjY,SAAAkY,YAAA,cACAD,UAAAE,eAAA,cAAA/X,UAA8D,SAC9D,mBACA6X,SAAAG,WAAA,EACAH,SAAAJ,QAAA,EACAxE,KAAAgF,cAAAJ,WAOAK,eAAA,SAAA1V,MAAA2V,UACA,MAAA/H,UAAAoB,QAAA4G,SAAA,6BAA+DD,YAAA3V,QAS/D4V,SAAA,SAAAC,SAAAC,OAAAC,SAEA,MADAA,kBAAA,kBACAF,SAAA9T,QAAAgU,QAAA,SAAAC,EAAAC,GACA,GAAAC,GAAAD,EAAAE,MAAA,KACAC,EAAAN,MACA,KACA,OAAAO,KAAAH,GACAA,EAAAI,eAAAD,KACAD,IAAAF,EAAAG,KAGS,MAAAnS,GACTkS,EAAAJ,EAEA,sBAAAI,IAAA,gBAAAA,KAAAJ,KAIAO,YAAA,WACA,OACAC,OAAA,EACAC,YAAAhZ,QAAAiZ,KACAC,cAAA,SAAAxW,OACAf,KAAAwX,WAAAzW,MACAf,KAAAyX,QAAA1W,OACAf,KAAA0X,qBAAAhL,QAAA,SAAAhN,IACAA,QAGAiY,SAAA,SAAA5W,OACA,eAAAA,OAAAkB,QAEA2V,YACAC,eACAH,wBACAD,QAAApZ,QAAAiZ,OASAQ,SAAA,SAAAC,KAAAC,KAAApX,MAAAqX,aACA,GAAAC,MAEA,mBACA,GAAApY,SAAAc,MACAuX,KAAAjY,MAAAC,UAAAC,MAAAC,KAAAN,UAEAwO,UAAA6J,OAAAF,OACAA,MAAA3J,SAAA,WAEA2J,MAAA5Z,UACAyZ,KAAA9X,MAAAH,QAAAqY,OAESH,MAAA,GAAAC,eAOTxY,SAAA,SAAAsY,KAAAM,OACA,GAAAC,OACA,mBACA,GAAAxY,SAAAE,KACAmY,KAAApY,UACA+P,IAAAF,QAAAE,QAEAwI,QAAAxI,IAAAwI,OAAAD,SACAN,KAAA9X,MAAAH,QAAAqY,MACAG,OAAAxI,OASAyI,KAAA,SAAA7Y,IACA,GAAA8Y,OAAA5I,QAAAE,KAEA,OADApQ,MACAkQ,QAAAE,MAAA0I,OAOAC,WAAA,SAAA7X,MAAA2I,IAAAmP,QACA,GAAA3X,OAAA,KAAAoX,KAAAjY,MAAAC,UAAAC,MAAAC,KAAAN,WACA4Y,OAAAR,KAAAlW,OAAA,EAAAkW,KAAA/X,MAAA,KAEAwY,QAAAC,eAAAjY,MAAA2I,KACAuP,IAAA,WAEA,MADA,QAAA/X,cAAA2X,OAAAzY,MAAAW,MAAA+X,SACA5X,UAUAgY,QAAA,WACA,SAAAC,gBAKAC,gBAAA,SAAArY,OACA,GAAAA,OAGAA,MAAAsY,QAAAtY,QACAA,MAAAuY,YAAA,CAEA,GAAApG,QAAAnS,MAAAwY,OACAxY,OAAAyY,gBAAA,EAGAtG,OAAAuG,cAAA1Y,QAAAmS,OAAAuG,YAAA1Y,MAAA2Y,eACAxG,OAAAyG,cAAA5Y,QAAAmS,OAAAyG,YAAA5Y,MAAA6Y,eACA7Y,MAAA6Y,gBAAA7Y,MAAA6Y,cAAAF,cAAA3Y,MAAA2Y,eACA3Y,MAAA2Y,gBAAA3Y,MAAA2Y,cAAAE,cAAA7Y,MAAA6Y,eAEA7Y,MAAA2Y,cAAA3Y,MAAA6Y,cAAA,OAKAC,eAAA,SAAA9Y,OACA,GAAAA,OAGAA,MAAAsY,QAAAtY,OACAA,MAAAyY,eAAA,CAEA,GAAAM,OAAA/Y,MAEAmS,OAAA4G,MAAAP,OACAO,OAAAN,gBAAA,EAEAM,MAAAF,cAAA1G,OAAAyG,YACAzG,OAAAuG,aACAvG,OAAAyG,YAAAD,cAAAI,MACA5G,OAAAyG,YAAAG,OAEA5G,OAAAuG,YAAAvG,OAAAyG,YAAAG,QAaAC,WAAA,SAAA1K,GAAA2K,aAAAC,YACA,GAAAzb,QAAA0b,SAAAF,cAAA,CACA,GAAAG,SAAAH,aAAApX,aACAoX,cAAA,SAAA3K,IACA,MAAAA,IAAA+K,SAAAxX,gBAAAuX,SAMA,GAFA9K,aAAA7Q,SAAAN,UAAAmR,MAAA,IACA4K,aAAA5K,MAAAsE,aACAtE,GAAA,WAEA,GACA,IAAA2K,aAAA3K,IACA,MAAAA,UAEOA,MAAAsE,WAEP,cAMA0G,gBAAA,SAAA7I,KAAAsI,OACA,GAAAQ,aAAA/b,OAAAgc,MAAAhc,OAAAgc,KAAAja,WAAAia,KAAAja,UAAA2J,SACAuQ,OAAAF,YAAA9b,QAAAsM,KAAA0G,UAAAvH,UAAAzL,QAAAsM,KAAA0G,KAAA,SAAAiJ,KAEA,MAAAjJ,QAAAsI,UAAA,GAAA3Z,KAAAua,wBAAAD,OAGA,OAAAD,QAAAV,QAYAa,qBAAA,SAAAzc,QAAAkc,SAAAQ,SAAAC,cAWA,QAAAC,UAAA5c,SACA,MAAA6c,WAAA7c,WAAA0c,SAAAI,aAAA9c,SAAA,MAMA,QAAA6c,WAAA7c,SACA,GAAAA,QACA,OAAAmO,GAAA,EAAA4O,IAAA/c,QAAAkE,OAA+CiK,EAAA4O,IAAS5O,IACxD,GAAAnO,QAAAmO,GAAA+N,SAAA1W,gBAAA0W,SACA,MAAAlc,SAAAmO,EAIA,aAMA,QAAA2O,cAAA9c,SACA,GAAAgd,MACA,IAAAhd,QACA,OAAAmO,GAAA,EAAA4O,IAAA/c,QAAAkE,OAA+CiK,EAAA4O,IAAS5O,IAAA,CACxD,GAAAqD,QAAAxR,QAAAmO,EACA,KAAA6O,MACA,OAAAC,GAAA,EAAAC,SAAA1L,OAAAiG,WAAAvT,OAAkE+Y,EAAAC,SAAcD,IAChFD,aAAAJ,UAAApL,OAAAiG,WAAAwF,KAKA,MAAAD,OA3CA,GAAAA,OAAAJ,SAAA5c,QAKA,QAJAgd,OAAAL,cACAlc,KAAAI,KAAAgR,QAAA4G,SAAA,+CAA8EyD,SAAAlc,QAAA,GAAAmd,aAG9E7c,QAAAN,QAAAgd,OAAAhd,UA8CAod,uBAAA,SAAAva,MAAAC,KAAAua,UACAA,sBACA/c,QAAAqO,QAAA9L,MAAAya,kBAAA,SAAAC,QAAA/R,KACA,GAAA+R,QAAAC,UAAAld,QAAA2C,YAAAJ,MAAA2I,MAAA,CACA,GAAAiS,eAAAnd,QAAAwF,UAAAhD,KAAAya,QAAArP,UACArL,OAAA2I,KAAAlL,QAAAwF,UAAAuX,SAAA7R,MAAA6R,SAAA7R,KAAAiS,kBAcAC,SAAA,SAAAC,SAAAC,OAAA/a,OAyBA,QAAAgb,gBACA,GAAAC,OAAAJ,SAAAI,MACAF,OAAAF,SAAAE,MAEAF,UAAAI,SACAJ,SAAAK,QAAA,KACAL,SAAAE,QAAA,EAEAE,MAAAnP,QAAA,SAAAqP,WACA,GAAAC,MAAAD,UAAAnb,OAAAmb,UAAAnb,MAAAuY,WACA6C,OACAD,UAAAL,aAIAC,QAAA3Q,WAAAiR,UAtCA,GAAAR,UAAA7L,QAAA6L,SACAK,QAAAL,SAAAK,QACAD,MAAAJ,SAAAI,SAaA,OAVAA,OAAAlP,MAAkB/L,YAAA8a,oBAGlB,MAAAC,iBAAA,GAGAF,SAAAE,OAAAF,SAAAE,eACAF,SAAAI,YAGAC,UAAAL,SAAAK,QAAAvN,SAAAqN,aAAA,QAkCAM,gBAAA,SAAAzF,UACA,MAAApH,qBACAoH,SAEAA,UAAApY,QAAA0b,SAAAtD,UACAA,SAAA9T,QAAA,QAAqCwM,aAAAxM,QAAA,MAA4ByM,WADjEqH,UAQA0F,2BAAA,SAAApe,SAIA,IAHA,GAAAgV,QAAAhV,QAAAgV,SAGAzD,iBAAAyD,OAAA,0BACAA,sBAGA,OAAAA,SAGAqJ,yBAAA,SAAAre,SAGA,IAFA,GAAAse,SAAAte,QAAAgV,SAAA,GAEAsJ,mBAAA1N,aAAA,IAAA0N,UAAAre,SAAA4S,MAAA,eAAAyL,QAAApC,SAAAxX,eACA4Z,gBAAA7I,UAEA,OAAA6I,UAOAC,mBAAA,WACA,GAAAC,YACAC,OAAAne,QAAAN,QAAA,QACAuQ,WAAA,GAAAsC,KAAA0E,YAAAkH,OAAA,GAGA,QADAC,cAAA,2BACAvQ,EAAA,EAAqBA,EAAAuQ,YAAAxa,SAAwBiK,EAO7C,GANAsQ,OAAA1L,KACAsD,SAAAqI,YAAAvQ,GACAwF,IAAA,EACAyD,UAAA,IAGAqH,OAAA1L,IAAA,aAAA2L,YAAAvQ,GAAA,CACAqQ,WAAAE,YAAAvQ,EACA,OAMA,MAFAsQ,QAAA3S,SAEA0S,YAYAG,sBAAA,SAAA3b,MAAA4b,cACA,WAAA5b,iBAAA4b,gBAAA,aAAA5b,OAAA,MAAAA,QAGAuO,kCASAsN,sBAAA,SAAA7e,SACA,GAAAgV,QAAAnD,QAAAgK,WAAA7b,QAAA,QACA8e,KAAA9J,OAAA1U,QAAAN,QAAAgV,QAAA+J,WAAA,YAEA,SAAAD,WAAAE,YAUAC,gBAAA,SAAAjf,QAAAkf,UAAAC,UAQA,QAAAC,eACA,GAAAC,aAAAC,sBAEAtf,SAAAwW,UAAA6I,aAEAE,cAAAF,YAAAH,UAAAG,YAAAH,YACArO,MAAAuO,aAIA,QAAAE,wBACA,GAAAE,cAAAL,UAAA,IACAM,YAAA5N,QAAAE,MAAA2N,SAEA,OAAAC,MAAAF,YAAAG,YAAAC,aAAAL,cAGA,QAAAG,MAAAF,YAAAhF,MAAAqF,OAAAX,UAGA,GAAAM,YAAAN,SACA,MAAA1E,OAAAqF,MAGA,IAAAC,KAAAN,aAAAN,UAAAM,YACAO,GAAAD,GAAAN,WAEA,OAAAhF,OAAAqF,SAAA,EAAAE,GAAA,EAAAD,IAlCA,GAAAH,aAAA5f,QAAAwW,UACAqJ,aAAAX,UAAAU,YACAL,cAAAK,YAAAV,UACAQ,UAAA7N,QAAAE,KAEAlB,OAAAuO,cA4CAa,KAAA,SAAAC,OACA,GAAAA,MAEA,MAAAA,OAAAxU,OAAA,SAAA1I,MAAAkI,MAAArE,MACA,MAAAA,MAAAgB,QAAA7E,SAAAkI,SAUA,OAFA2G,SAAAC,IAAAqO,SAAAzP,YAAAmB,SAEAA,QA91BAvB,YAAA7N,SAAA,oHACA,IAAAwY,cAAA,CAQA3a,SACAtD,OAAA,iBACA8H,QAAA,UAAAwL,aAg2BAhQ,QAAAN,QAAAoC,UAAA2V,MAAAzX,QAAAN,QAAAoC,UAAA2V,OAAA,WAIA,MAHA9V,MAAAiC,QACAjC,KAAA,GAAA8V,QAEA9V,MAEA3B,QAAAN,QAAAoC,UAAAge,KAAA9f,QAAAN,QAAAoC,UAAAge,MAAA,WAIA,MAHAne,MAAAiC,QACAjC,KAAA,GAAAme,OAEAne,SAIA,WAuFA,QAAAoe,mBAAAC,GAAAC,iBAAA7f,UAAA+P,SAAA+P,aAEAve,KAAAqe,MAGAre,KAAAse,kCAGAte,KAAAvB,oBAGAuB,KAAAwO,kBAGAxO,KAAAue,wBA5FAH,kBAAA5d,SAAA,8DACAnC,QACAtD,OAAA,iBACAyjB,QAAA,cAAAJ,mBAsIAA,kBAAAje,UAAAse,QAAA,SAAAzL,SAEA,MAAAA,SAAA0L,eACA1e,KAAA2e,uBAAA3L,SAEAhT,KAAA4e,iBAAA5L,UAWAoL,kBAAAje,UAAAwe,uBAAA,SAAA3L,SAEA,GAAA0L,gBAAA1e,KAAA6e,qBAAA7L,QAEA,OAAAhT,MAAAqe,GAAA/d,SACAvC,QAAA2gB,eAAA3gB,QACA+gB,QAAAJ,eAAAK,QACAC,UACAxd,KAAA,WACA,MAAAkd,gBAAA3gB,YAYAqgB,kBAAAje,UAAAye,iBAAA,SAAA5L,SAEA,GAAApO,MAAA5E,KACAif,YAAAjM,QAAAiM,YACAxI,SAAAzD,QAAAyD,UAAA,GACAnW,QAAAjC,QAAA6gB,UAAiClM,QAAA1S,SACjC0e,OAAA3gB,QAAA6gB,UAAgClM,QAAAgM,QAChCG,kBAAAnM,QAAAmM,mBAAA9gB,QAAA+gB,QAyBA,OApBA/gB,SAAAqO,QAAApM,QAAA,SAAAS,MAAAwI,KACAlL,QAAA0b,SAAAhZ,OACAT,QAAAiJ,KAAA3E,KAAAnG,UAAAqa,IAAA/X,OAEAT,QAAAiJ,KAAA3E,KAAAnG,UAAA4gB,OAAAte,SAMA1C,QAAA6gB,OAAA5e,QAAA0e,QAEAC,YACA3e,QAAAgf,aAAAtf,KAAAse,iBAAAW,aAEA3e,QAAAgf,aAAAtf,KAAAqe,GAAA9d,KAAAkW,UAKAzW,KAAAqe,GAAAkB,IAAAjf,SAAAkf,KAAA,SAAAR,QAEA,GAAAvI,UAAA0I,kBAAAH,OAAAM,aAAAtM,SACAjV,QAAAiV,QAAAjV,SAAAM,QAAAN,QAAA,SAAA0hB,KAAAhJ,SAAAiJ,QAAAC,UAEA,OAAA/a,MAAAgb,gBAAAZ,OAAAjhB,QAAAiV,YAaAoL,kBAAAje,UAAAyf,gBAAA,SAAAZ,OAAAjhB,QAAAiV,SAWA,QAAA6M,QAAAjf,OAIA,GAHAoe,OAAAc,OAAAlf,MAGAoS,QAAA8J,WAAA,CAEA,GAAAiD,cAAA1hB,QAAA6gB,OAAAF,QACAgB,SAAAjiB,UAGAkiB,WAAArb,KAAA2Z,YAAAvL,QAAA8J,WAAAiD,cAAA,EAAA/M,QAAAkN,aAEAlN,SAAAmN,kBACA9hB,QAAA6gB,OAAAe,WAAAG,SAAApB,OAGA,IAAAqB,MAAAJ,YAGAliB,SAAAuiB,KAAA,0BAAAD,MACAtiB,QAAAsX,WAAAiL,KAAA,0BAAAD,MAGAE,YAAAzD,WAAAuD,KAIA,MAAAG,UAAA5f,OArCA,GAAAgE,MAAA5E,KACAwgB,SAAAxgB,KAAAwO,SAAAzQ,SAEAwiB,aACAxiB,gBACA+gB,QAAA/gB,QAAA8L,OAAAc,KAAA5M,SACAihB,cACAxd,KAAAqe,OAiCA,OAAAU,cAWAnC,kBAAAje,UAAA0e,qBAAA,SAAA7L,SA6BA,QAAAyN,iBAAA1iB,SACA,GAAAgV,QAAAhV,QAAAyV,WACAkN,YAAA3iB,QAAA4iB,kBAEA,mBACAD,YAQA3N,OAAA6N,aAAA7iB,QAAA2iB,aALA3N,OAAAuC,YAAAvX,UAnCA,GAAA8iB,WAAA7N,QAAA0L,eACA3J,UAAA,IAqBA,OAnBA1W,SAAA0b,SAAA8G,YACAA,UAAA7iB,SAAA8iB,cAAAD,WACA9L,UAAA0L,gBAAAI,aAEAA,oBAAA,IAAAA,UAKA9L,UADA/W,SAAA8L,SAAA+W,WACAJ,gBAAAI,WAEA,WACAA,UAAArN,YACAqN,UAAArN,WAAAC,YAAAoN,cAOA9iB,QAAAM,QAAAN,QAAA8iB,WACA9B,QAAAhK,eAwBA,WAkCA,QAAAgM,kBAmBA,QAAAC,mBACArjB,OAAAsjB,cAAA,EAlBA,GAAAtjB,SAEAsjB,cAAA,EAGA,QACAD,gCACAE,MAAA,iDAAAtS,MAAApQ,KAAAyM,QAAAyD;AACA,MAAAyS,eAAAlhB,MAAAtC,OAAAoC,cAiBA,QAAAohB,eAAAvS,MAAApQ,KAAAyM,QAAAyD,cAsBA,QAAA0S,QAAArjB,QAAAkO,SAAAoV,cAEA,GAAAhQ,MAAAhT,QAAAN,iBAAA,IAAAA,SAGAsT,MACAA,KAAAvD,aAAA7B,WACA,IAAAoF,KAAAiQ,aAAArV,UAAAhK,QACAsf,kBAAAlQ,KAAApF,YAEAoV,aAAAhjB,QAAA0b,SAAAsH,2BAAA3B,OAAA,GACA2B,aAAApf,OACAlE,QAAA8C,KAAAoL,SAAAoV,cACOJ,cACPziB,KAAAI,KAAA,oBAAAqN,SAAA,qDAAAoF,OAMA,QAAAmQ,aAAAzjB,QAAAkO,SAAAwV,oBAIA7S,MAAA,WACAwS,OAAArjB,QAAAkO,SAAAwV,wBAIA,QAAAC,gBAAA3jB,QAAAkO,UACA,GAAA0V,SAAAC,QAAA7jB,UAAA,GACA8jB,WAAAF,QAAA/b,QAAA8I,aAAAS,gBAAA,CAEA0S,YACAL,YAAAzjB,QAAAkO,SAAA,WACA,MAAA2V,SAAA7jB,WAGAqjB,OAAArjB,QAAAkO,SAAA0V,SAIA,QAAAG,mBAAA/jB,QAAAkO,UACA,GAAA0V,SAAAC,QAAA7jB,SACA8jB,WAAAF,QAAA/b,QAAA8I,aAAAS,gBAAA,CAEA0S,aAAAF,SACAP,OAAArjB,QAAAkO,SAAA0V,SAIA,QAAAC,SAAA7jB,SAcA,QAAAgkB,kBAAA1Q,MACA,KAAAA,KAAAmC,aAAAnC,UAAAmC,cAAAzV,SACA,GAAAsT,KAAAiQ,cAAA,SAAAjQ,KAAAiQ,aAAA,eACA,SAhBAvjB,gBAAA,IAAAA,OAKA,KAJA,GAGAsT,MAHA2Q,OAAAhkB,SAAAikB,iBAAAlkB,QAAAmkB,WAAAC,UAAA,SACAC,KAAA,GAGA/Q,KAAA2Q,OAAAK,YACAN,iBAAA1Q,QACA+Q,MAAA/Q,KAAAiR,YAIA,OAAAF,MAAA1C,QAAA,GAWA,QAAA6B,mBAAAlQ,KAAApF,UAIA,QAAAsW,UAAArT,IACA,GAAApL,OAAAoL,GAAAsT,aAAAtT,GAAAsT,aAAAvX,QAAA0E,iBAAAT,GACA,gBAAApL,MAAA2e,QALA,GAAAC,aAAArR,KAAAsR,gBACAC,SAAA,CAOA,IAAAF,YAEA,OADArN,UAAAhE,KAAAmE,WACAtJ,EAAA,EAAmBA,EAAAmJ,SAAApT,OAAqBiK,IAAA,CACxC,GAAAyN,OAAAtE,SAAAnJ,EACA,KAAAyN,MAAAzL,UAAAyL,MAAA7L,aAAA7B,YACAsW,SAAA5I,SACAiJ,SAAA,IAKA,MAAAA,SAOA,QAAAC,cAAA9kB,SACA,GAAAsT,MAAAhT,QAAAN,iBAAA,IAAAA,OAGA,SAAAsT,KAAAvD,eAKAuD,KAAAvD,aAAA,eAAAuD,KAAAvD,aAAA,oBAAAuD,KAAAvD,aAAA,qBAQA,QAAAgV,oBAAA/kB,QAAAglB,OAeA,QAAAC,cAAAxP,YACA,IAAAqP,aAAArP,YACA,QAGA,IAAAA,WAAA1F,aAAA,QACA,OAAA0F,WAAA8N,aAAA,QAAA/d,eACA,cACA,iBACA,gBACA,WACA,WACA,eACA,UACA,cACA,WACA,cACA,WACA,mBACA,gBACA,gBACA,aACA,cACA,SAIA,OAAAiQ,WAAAwG,QAAAzW,eACA,WACA,cACA,cACA,aACA,YACA,QACA,UACA,UACA,UACA,iBACA,SACA,aACA,cACA,aACA,WACA,WACA,UACA,WACA,SACA,UACA,UACA,UACA,UACA,SACA,SACA,YACA,eACA,iBACA,WACA,SACA,SACA,SACA,SACA,SACA,SACA,aACA,WACA,QACA,UACA,cACA,UACA,aACA,YACA,aACA,SACA,UACA,WACA,WACA,aACA,SACA,aACA,UACA,mBACA,QACA,SACA,WACA,WACA,YACA,aACA,WACA,aACA,aACA,aACA,UACA,UACA,UACA,YACA,SACA,SACA,YACA,WACA,SACA,YACA,SACA,SACA,UACA,SAEA,SAxHAwf,aAAA,CACA,IAAA1R,MAAAhT,QAAAN,iBAAA,IAAAA,OACA,SAAAsT,KAAAmC,eAGAwP,aAAA3R,KAAAmC,cAGAuP,UACAA,OACAD,mBAAAzR,KAAAmC,WAAAuP,SAnJA,GAAA9B,cAAAjhB,KAAAihB,YAEA,QACAG,cACAI,wBACAE,8BACAI,oCACAF,gBACAiB,0BA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","file":"app.13b113c04f0f4e78b976.js","sourcesContent":["webpackJsonp([0],[\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _angular = __webpack_require__(1);\n\t\n\tvar _angular2 = _interopRequireDefault(_angular);\n\t\n\tvar _angularAnimate = __webpack_require__(3);\n\t\n\tvar _angularAnimate2 = _interopRequireDefault(_angularAnimate);\n\t\n\tvar _angularCookies = __webpack_require__(5);\n\t\n\tvar _angularCookies2 = _interopRequireDefault(_angularCookies);\n\t\n\tvar _angularResource = __webpack_require__(7);\n\t\n\tvar _angularResource2 = _interopRequireDefault(_angularResource);\n\t\n\tvar _angularSanitize = __webpack_require__(9);\n\t\n\tvar _angularSanitize2 = _interopRequireDefault(_angularSanitize);\n\t\n\tvar _angularUiRouter = __webpack_require__(11);\n\t\n\tvar _angularUiRouter2 = _interopRequireDefault(_angularUiRouter);\n\t\n\tvar _angularMaterial = __webpack_require__(12);\n\t\n\tvar _angularMaterial2 = _interopRequireDefault(_angularMaterial);\n\t\n\tvar _app = __webpack_require__(16);\n\t\n\tvar _main = __webpack_require__(17);\n\t\n\tvar _main2 = _interopRequireDefault(_main);\n\t\n\tvar _results = __webpack_require__(20);\n\t\n\tvar _results2 = _interopRequireDefault(_results);\n\t\n\tvar _app2 = __webpack_require__(23);\n\t\n\tvar _app3 = _interopRequireDefault(_app2);\n\t\n\tvar _util = __webpack_require__(25);\n\t\n\tvar _util2 = _interopRequireDefault(_util);\n\t\n\tvar _hpeHeader = __webpack_require__(27);\n\t\n\tvar _hpeHeader2 = _interopRequireDefault(_hpeHeader);\n\t\n\tvar _footer = __webpack_require__(29);\n\t\n\tvar _footer2 = _interopRequireDefault(_footer);\n\t\n\tvar _question = __webpack_require__(31);\n\t\n\tvar _question2 = _interopRequireDefault(_question);\n\t\n\tvar _stepper = __webpack_require__(33);\n\t\n\tvar _stepper2 = _interopRequireDefault(_stepper);\n\t\n\tvar _step = __webpack_require__(35);\n\t\n\tvar _step2 = _interopRequireDefault(_step);\n\t\n\tvar _horizontalStepper = __webpack_require__(37);\n\t\n\tvar _horizontalStepper2 = _interopRequireDefault(_horizontalStepper);\n\t\n\tvar _horizontalStep = __webpack_require__(39);\n\t\n\tvar _horizontalStep2 = _interopRequireDefault(_horizontalStep);\n\t\n\t__webpack_require__(41);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t_angular2.default.module('hpeSecurityApp', [_angularCookies2.default, _angularResource2.default, _angularSanitize2.default, _angularUiRouter2.default, _angularAnimate2.default, _angularMaterial2.default, _app3.default, _util2.default, _main2.default, _results2.default, _hpeHeader2.default, _footer2.default, _question2.default, _stepper2.default, _step2.default, _horizontalStepper2.default, _horizontalStep2.default]).config(_app.routeConfig).run(_app.mainstayConfig);\n\t\n\t_angular2.default.element(document).ready(function () {\n\t _angular2.default.bootstrap(document, ['hpeSecurityApp'], {\n\t strictDi: true\n\t });\n\t});\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */,\n/* 5 */,\n/* 6 */,\n/* 7 */,\n/* 8 */,\n/* 9 */,\n/* 10 */,\n/* 11 */,\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// Should already be required, here for clarity\n\t__webpack_require__(1);\n\t\n\t// Load Angular and dependent libs\n\t__webpack_require__(3);\n\t__webpack_require__(13);\n\t\n\t// Now load Angular Material\n\t__webpack_require__(15);\n\t\n\t// Export namespace\n\tmodule.exports = 'ngMaterial';\n\n\n/***/ }),\n/* 13 */,\n/* 14 */,\n/* 15 */\n/***/ (function(module, exports) {\n\n\t/*!\n\t * AngularJS Material Design\n\t * https://github.com/angular/material\n\t * @license MIT\n\t * v1.1.4\n\t */\n\t(function( window, angular, undefined ){\n\t\"use strict\";\n\t\n\t(function(){\n\t\"use strict\";\n\t\n\tangular.module('ngMaterial', [\"ng\",\"ngAnimate\",\"ngAria\",\"material.core\",\"material.core.interaction\",\"material.core.gestures\",\"material.core.layout\",\"material.core.meta\",\"material.core.theming.palette\",\"material.core.theming\",\"material.core.animate\",\"material.components.autocomplete\",\"material.components.backdrop\",\"material.components.bottomSheet\",\"material.components.button\",\"material.components.card\",\"material.components.checkbox\",\"material.components.chips\",\"material.components.colors\",\"material.components.content\",\"material.components.datepicker\",\"material.components.dialog\",\"material.components.divider\",\"material.components.fabActions\",\"material.components.fabShared\",\"material.components.fabSpeedDial\",\"material.components.fabToolbar\",\"material.components.gridList\",\"material.components.icon\",\"material.components.input\",\"material.components.list\",\"material.components.menu\",\"material.components.menuBar\",\"material.components.navBar\",\"material.components.progressCircular\",\"material.components.panel\",\"material.components.progressLinear\",\"material.components.radioButton\",\"material.components.showHide\",\"material.components.sidenav\",\"material.components.select\",\"material.components.slider\",\"material.components.sticky\",\"material.components.subheader\",\"material.components.switch\",\"material.components.swipe\",\"material.components.tabs\",\"material.components.toast\",\"material.components.toolbar\",\"material.components.tooltip\",\"material.components.truncate\",\"material.components.virtualRepeat\",\"material.components.whiteframe\"]);\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * Initialization function that validates environment\n\t * requirements.\n\t */\n\tDetectNgTouch.$inject = [\"$log\", \"$injector\"];\n\tMdCoreConfigure.$inject = [\"$provide\", \"$mdThemingProvider\"];\n\trAFDecorator.$inject = [\"$delegate\"];\n\tqDecorator.$inject = [\"$delegate\"];\n\tangular\n\t .module('material.core', [\n\t 'ngAnimate',\n\t 'material.core.animate',\n\t 'material.core.layout',\n\t 'material.core.interaction',\n\t 'material.core.gestures',\n\t 'material.core.theming'\n\t ])\n\t .config(MdCoreConfigure)\n\t .run(DetectNgTouch);\n\t\n\t\n\t/**\n\t * Detect if the ng-Touch module is also being used.\n\t * Warn if detected.\n\t * @ngInject\n\t */\n\tfunction DetectNgTouch($log, $injector) {\n\t if ( $injector.has('$swipe') ) {\n\t var msg = \"\" +\n\t \"You are using the ngTouch module. \\n\" +\n\t \"AngularJS Material already has mobile click, tap, and swipe support... \\n\" +\n\t \"ngTouch is not supported with AngularJS Material!\";\n\t $log.warn(msg);\n\t }\n\t}\n\t\n\t/**\n\t * @ngInject\n\t */\n\tfunction MdCoreConfigure($provide, $mdThemingProvider) {\n\t\n\t $provide.decorator('$$rAF', ['$delegate', rAFDecorator]);\n\t $provide.decorator('$q', ['$delegate', qDecorator]);\n\t\n\t $mdThemingProvider.theme('default')\n\t .primaryPalette('indigo')\n\t .accentPalette('pink')\n\t .warnPalette('deep-orange')\n\t .backgroundPalette('grey');\n\t}\n\t\n\t/**\n\t * @ngInject\n\t */\n\tfunction rAFDecorator($delegate) {\n\t /**\n\t * Use this to throttle events that come in often.\n\t * The throttled function will always use the *last* invocation before the\n\t * coming frame.\n\t *\n\t * For example, window resize events that fire many times a second:\n\t * If we set to use an raf-throttled callback on window resize, then\n\t * our callback will only be fired once per frame, with the last resize\n\t * event that happened before that frame.\n\t *\n\t * @param {function} callback function to debounce\n\t */\n\t $delegate.throttle = function(cb) {\n\t var queuedArgs, alreadyQueued, queueCb, context;\n\t return function debounced() {\n\t queuedArgs = arguments;\n\t context = this;\n\t queueCb = cb;\n\t if (!alreadyQueued) {\n\t alreadyQueued = true;\n\t $delegate(function() {\n\t queueCb.apply(context, Array.prototype.slice.call(queuedArgs));\n\t alreadyQueued = false;\n\t });\n\t }\n\t };\n\t };\n\t return $delegate;\n\t}\n\t\n\t/**\n\t * @ngInject\n\t */\n\tfunction qDecorator($delegate) {\n\t /**\n\t * Adds a shim for $q.resolve for AngularJS version that don't have it,\n\t * so we don't have to think about it.\n\t *\n\t * via https://github.com/angular/angular.js/pull/11987\n\t */\n\t\n\t // TODO(crisbeto): this won't be necessary once we drop AngularJS 1.3\n\t if (!$delegate.resolve) {\n\t $delegate.resolve = $delegate.when;\n\t }\n\t return $delegate;\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t\n\tMdAutofocusDirective.$inject = [\"$parse\"];angular.module('material.core')\n\t .directive('mdAutofocus', MdAutofocusDirective)\n\t\n\t // Support the deprecated md-auto-focus and md-sidenav-focus as well\n\t .directive('mdAutoFocus', MdAutofocusDirective)\n\t .directive('mdSidenavFocus', MdAutofocusDirective);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdAutofocus\n\t * @module material.core.util\n\t *\n\t * @description\n\t *\n\t * `[md-autofocus]` provides an optional way to identify the focused element when a `$mdDialog`,\n\t * `$mdBottomSheet`, `$mdMenu` or `$mdSidenav` opens or upon page load for input-like elements.\n\t *\n\t * When one of these opens, it will find the first nested element with the `[md-autofocus]`\n\t * attribute directive and optional expression. An expression may be specified as the directive\n\t * value to enable conditional activation of the autofocus.\n\t *\n\t * @usage\n\t *\n\t * ### Dialog\n\t * \n\t * \n\t *
\n\t * \n\t * \n\t * \n\t * \n\t *
\n\t *
\n\t *
\n\t *\n\t * ### Bottomsheet\n\t * \n\t * \n\t * Comment Actions\n\t * \n\t * \n\t *\n\t * \n\t * \n\t * {{ item.name }}\n\t * \n\t *\n\t * \n\t * \n\t * \n\t * \n\t *\n\t * ### Autocomplete\n\t * \n\t * \n\t * {{item.display}}\n\t * \n\t * \n\t *\n\t * ### Sidenav\n\t * \n\t *
\n\t * \n\t * Left Nav!\n\t * \n\t *\n\t * \n\t * Center Content\n\t * \n\t * Open Left Menu\n\t * \n\t * \n\t *\n\t * \n\t *
\n\t * \n\t * \n\t * \n\t * \n\t *
\n\t *
\n\t *
\n\t *
\n\t **/\n\tfunction MdAutofocusDirective($parse) {\n\t return {\n\t restrict: 'A',\n\t link: {\n\t pre: preLink\n\t }\n\t };\n\t\n\t function preLink(scope, element, attr) {\n\t var attrExp = attr.mdAutoFocus || attr.mdAutofocus || attr.mdSidenavFocus;\n\t\n\t // Initially update the expression by manually parsing the expression as per $watch source.\n\t updateExpression($parse(attrExp)(scope));\n\t\n\t // Only watch the expression if it is not empty.\n\t if (attrExp) {\n\t scope.$watch(attrExp, updateExpression);\n\t }\n\t\n\t /**\n\t * Updates the autofocus class which is used to determine whether the attribute\n\t * expression evaluates to true or false.\n\t * @param {string|boolean} value Attribute Value\n\t */\n\t function updateExpression(value) {\n\t\n\t // Rather than passing undefined to the jqLite toggle class function we explicitly set the\n\t // value to true. Otherwise the class will be just toggled instead of being forced.\n\t if (angular.isUndefined(value)) {\n\t value = true;\n\t }\n\t\n\t element.toggleClass('md-autofocus', !!value);\n\t }\n\t }\n\t\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.core.colorUtil\n\t * @description\n\t * Color Util\n\t */\n\tangular\n\t .module('material.core')\n\t .factory('$mdColorUtil', ColorUtilFactory);\n\t\n\tfunction ColorUtilFactory() {\n\t /**\n\t * Converts hex value to RGBA string\n\t * @param color {string}\n\t * @returns {string}\n\t */\n\t function hexToRgba (color) {\n\t var hex = color[ 0 ] === '#' ? color.substr(1) : color,\n\t dig = hex.length / 3,\n\t red = hex.substr(0, dig),\n\t green = hex.substr(dig, dig),\n\t blue = hex.substr(dig * 2);\n\t if (dig === 1) {\n\t red += red;\n\t green += green;\n\t blue += blue;\n\t }\n\t return 'rgba(' + parseInt(red, 16) + ',' + parseInt(green, 16) + ',' + parseInt(blue, 16) + ',0.1)';\n\t }\n\t\n\t /**\n\t * Converts rgba value to hex string\n\t * @param color {string}\n\t * @returns {string}\n\t */\n\t function rgbaToHex(color) {\n\t color = color.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i);\n\t\n\t var hex = (color && color.length === 4) ? \"#\" +\n\t (\"0\" + parseInt(color[1],10).toString(16)).slice(-2) +\n\t (\"0\" + parseInt(color[2],10).toString(16)).slice(-2) +\n\t (\"0\" + parseInt(color[3],10).toString(16)).slice(-2) : '';\n\t\n\t return hex.toUpperCase();\n\t }\n\t\n\t /**\n\t * Converts an RGB color to RGBA\n\t * @param color {string}\n\t * @returns {string}\n\t */\n\t function rgbToRgba (color) {\n\t return color.replace(')', ', 0.1)').replace('(', 'a(');\n\t }\n\t\n\t /**\n\t * Converts an RGBA color to RGB\n\t * @param color {string}\n\t * @returns {string}\n\t */\n\t function rgbaToRgb (color) {\n\t return color\n\t ? color.replace('rgba', 'rgb').replace(/,[^\\),]+\\)/, ')')\n\t : 'rgb(0,0,0)';\n\t }\n\t\n\t return {\n\t rgbaToHex: rgbaToHex,\n\t hexToRgba: hexToRgba,\n\t rgbToRgba: rgbToRgba,\n\t rgbaToRgb: rgbaToRgb\n\t };\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\tangular.module('material.core')\n\t.factory('$mdConstant', MdConstantFactory);\n\t\n\t/**\n\t * Factory function that creates the grab-bag $mdConstant service.\n\t * @ngInject\n\t */\n\tfunction MdConstantFactory() {\n\t\n\t var prefixTestEl = document.createElement('div');\n\t var vendorPrefix = getVendorPrefix(prefixTestEl);\n\t var isWebkit = /webkit/i.test(vendorPrefix);\n\t var SPECIAL_CHARS_REGEXP = /([:\\-_]+(.))/g;\n\t\n\t function vendorProperty(name) {\n\t // Add a dash between the prefix and name, to be able to transform the string into camelcase.\n\t var prefixedName = vendorPrefix + '-' + name;\n\t var ucPrefix = camelCase(prefixedName);\n\t var lcPrefix = ucPrefix.charAt(0).toLowerCase() + ucPrefix.substring(1);\n\t\n\t return hasStyleProperty(prefixTestEl, name) ? name : // The current browser supports the un-prefixed property\n\t hasStyleProperty(prefixTestEl, ucPrefix) ? ucPrefix : // The current browser only supports the prefixed property.\n\t hasStyleProperty(prefixTestEl, lcPrefix) ? lcPrefix : name; // Some browsers are only supporting the prefix in lowercase.\n\t }\n\t\n\t function hasStyleProperty(testElement, property) {\n\t return angular.isDefined(testElement.style[property]);\n\t }\n\t\n\t function camelCase(input) {\n\t return input.replace(SPECIAL_CHARS_REGEXP, function(matches, separator, letter, offset) {\n\t return offset ? letter.toUpperCase() : letter;\n\t });\n\t }\n\t\n\t function getVendorPrefix(testElement) {\n\t var prop, match;\n\t var vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/;\n\t\n\t for (prop in testElement.style) {\n\t if (match = vendorRegex.exec(prop)) {\n\t return match[0];\n\t }\n\t }\n\t }\n\t\n\t var self = {\n\t isInputKey : function(e) { return (e.keyCode >= 31 && e.keyCode <= 90); },\n\t isNumPadKey : function(e) { return (3 === e.location && e.keyCode >= 97 && e.keyCode <= 105); },\n\t isMetaKey: function(e) { return (e.keyCode >= 91 && e.keyCode <= 93); },\n\t isFnLockKey: function(e) { return (e.keyCode >= 112 && e.keyCode <= 145); },\n\t isNavigationKey : function(e) {\n\t var kc = self.KEY_CODE, NAVIGATION_KEYS = [kc.SPACE, kc.ENTER, kc.UP_ARROW, kc.DOWN_ARROW];\n\t return (NAVIGATION_KEYS.indexOf(e.keyCode) != -1);\n\t },\n\t hasModifierKey: function(e) {\n\t return e.ctrlKey || e.metaKey || e.altKey;\n\t },\n\t\n\t /**\n\t * Maximum size, in pixels, that can be explicitly set to an element. The actual value varies\n\t * between browsers, but IE11 has the very lowest size at a mere 1,533,917px. Ideally we could\n\t * compute this value, but Firefox always reports an element to have a size of zero if it\n\t * goes over the max, meaning that we'd have to binary search for the value.\n\t */\n\t ELEMENT_MAX_PIXELS: 1533917,\n\t\n\t /**\n\t * Priority for a directive that should run before the directives from ngAria.\n\t */\n\t BEFORE_NG_ARIA: 210,\n\t\n\t /**\n\t * Common Keyboard actions and their associated keycode.\n\t */\n\t KEY_CODE: {\n\t COMMA: 188,\n\t SEMICOLON : 186,\n\t ENTER: 13,\n\t ESCAPE: 27,\n\t SPACE: 32,\n\t PAGE_UP: 33,\n\t PAGE_DOWN: 34,\n\t END: 35,\n\t HOME: 36,\n\t LEFT_ARROW : 37,\n\t UP_ARROW : 38,\n\t RIGHT_ARROW : 39,\n\t DOWN_ARROW : 40,\n\t TAB : 9,\n\t BACKSPACE: 8,\n\t DELETE: 46\n\t },\n\t\n\t /**\n\t * Vendor prefixed CSS properties to be used to support the given functionality in older browsers\n\t * as well.\n\t */\n\t CSS: {\n\t /* Constants */\n\t TRANSITIONEND: 'transitionend' + (isWebkit ? ' webkitTransitionEnd' : ''),\n\t ANIMATIONEND: 'animationend' + (isWebkit ? ' webkitAnimationEnd' : ''),\n\t\n\t TRANSFORM: vendorProperty('transform'),\n\t TRANSFORM_ORIGIN: vendorProperty('transformOrigin'),\n\t TRANSITION: vendorProperty('transition'),\n\t TRANSITION_DURATION: vendorProperty('transitionDuration'),\n\t ANIMATION_PLAY_STATE: vendorProperty('animationPlayState'),\n\t ANIMATION_DURATION: vendorProperty('animationDuration'),\n\t ANIMATION_NAME: vendorProperty('animationName'),\n\t ANIMATION_TIMING: vendorProperty('animationTimingFunction'),\n\t ANIMATION_DIRECTION: vendorProperty('animationDirection')\n\t },\n\t\n\t /**\n\t * As defined in core/style/variables.scss\n\t *\n\t * $layout-breakpoint-xs: 600px !default;\n\t * $layout-breakpoint-sm: 960px !default;\n\t * $layout-breakpoint-md: 1280px !default;\n\t * $layout-breakpoint-lg: 1920px !default;\n\t *\n\t */\n\t MEDIA: {\n\t 'xs' : '(max-width: 599px)' ,\n\t 'gt-xs' : '(min-width: 600px)' ,\n\t 'sm' : '(min-width: 600px) and (max-width: 959px)' ,\n\t 'gt-sm' : '(min-width: 960px)' ,\n\t 'md' : '(min-width: 960px) and (max-width: 1279px)' ,\n\t 'gt-md' : '(min-width: 1280px)' ,\n\t 'lg' : '(min-width: 1280px) and (max-width: 1919px)',\n\t 'gt-lg' : '(min-width: 1920px)' ,\n\t 'xl' : '(min-width: 1920px)' ,\n\t 'landscape' : '(orientation: landscape)' ,\n\t 'portrait' : '(orientation: portrait)' ,\n\t 'print' : 'print'\n\t },\n\t\n\t MEDIA_PRIORITY: [\n\t 'xl',\n\t 'gt-lg',\n\t 'lg',\n\t 'gt-md',\n\t 'md',\n\t 'gt-sm',\n\t 'sm',\n\t 'gt-xs',\n\t 'xs',\n\t 'landscape',\n\t 'portrait',\n\t 'print'\n\t ]\n\t };\n\t\n\t return self;\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t angular\n\t .module('material.core')\n\t .config( [\"$provide\", function($provide){\n\t $provide.decorator('$mdUtil', ['$delegate', function ($delegate){\n\t /**\n\t * Inject the iterator facade to easily support iteration and accessors\n\t * @see iterator below\n\t */\n\t $delegate.iterator = MdIterator;\n\t\n\t return $delegate;\n\t }\n\t ]);\n\t }]);\n\t\n\t /**\n\t * iterator is a list facade to easily support iteration and accessors\n\t *\n\t * @param items Array list which this iterator will enumerate\n\t * @param reloop Boolean enables iterator to consider the list as an endless reloop\n\t */\n\t function MdIterator(items, reloop) {\n\t var trueFn = function() { return true; };\n\t\n\t if (items && !angular.isArray(items)) {\n\t items = Array.prototype.slice.call(items);\n\t }\n\t\n\t reloop = !!reloop;\n\t var _items = items || [ ];\n\t\n\t // Published API\n\t return {\n\t items: getItems,\n\t count: count,\n\t\n\t inRange: inRange,\n\t contains: contains,\n\t indexOf: indexOf,\n\t itemAt: itemAt,\n\t\n\t findBy: findBy,\n\t\n\t add: add,\n\t remove: remove,\n\t\n\t first: first,\n\t last: last,\n\t next: angular.bind(null, findSubsequentItem, false),\n\t previous: angular.bind(null, findSubsequentItem, true),\n\t\n\t hasPrevious: hasPrevious,\n\t hasNext: hasNext\n\t\n\t };\n\t\n\t /**\n\t * Publish copy of the enumerable set\n\t * @returns {Array|*}\n\t */\n\t function getItems() {\n\t return [].concat(_items);\n\t }\n\t\n\t /**\n\t * Determine length of the list\n\t * @returns {Array.length|*|number}\n\t */\n\t function count() {\n\t return _items.length;\n\t }\n\t\n\t /**\n\t * Is the index specified valid\n\t * @param index\n\t * @returns {Array.length|*|number|boolean}\n\t */\n\t function inRange(index) {\n\t return _items.length && ( index > -1 ) && (index < _items.length );\n\t }\n\t\n\t /**\n\t * Can the iterator proceed to the next item in the list; relative to\n\t * the specified item.\n\t *\n\t * @param item\n\t * @returns {Array.length|*|number|boolean}\n\t */\n\t function hasNext(item) {\n\t return item ? inRange(indexOf(item) + 1) : false;\n\t }\n\t\n\t /**\n\t * Can the iterator proceed to the previous item in the list; relative to\n\t * the specified item.\n\t *\n\t * @param item\n\t * @returns {Array.length|*|number|boolean}\n\t */\n\t function hasPrevious(item) {\n\t return item ? inRange(indexOf(item) - 1) : false;\n\t }\n\t\n\t /**\n\t * Get item at specified index/position\n\t * @param index\n\t * @returns {*}\n\t */\n\t function itemAt(index) {\n\t return inRange(index) ? _items[index] : null;\n\t }\n\t\n\t /**\n\t * Find all elements matching the key/value pair\n\t * otherwise return null\n\t *\n\t * @param val\n\t * @param key\n\t *\n\t * @return array\n\t */\n\t function findBy(key, val) {\n\t return _items.filter(function(item) {\n\t return item[key] === val;\n\t });\n\t }\n\t\n\t /**\n\t * Add item to list\n\t * @param item\n\t * @param index\n\t * @returns {*}\n\t */\n\t function add(item, index) {\n\t if ( !item ) return -1;\n\t\n\t if (!angular.isNumber(index)) {\n\t index = _items.length;\n\t }\n\t\n\t _items.splice(index, 0, item);\n\t\n\t return indexOf(item);\n\t }\n\t\n\t /**\n\t * Remove item from list...\n\t * @param item\n\t */\n\t function remove(item) {\n\t if ( contains(item) ){\n\t _items.splice(indexOf(item), 1);\n\t }\n\t }\n\t\n\t /**\n\t * Get the zero-based index of the target item\n\t * @param item\n\t * @returns {*}\n\t */\n\t function indexOf(item) {\n\t return _items.indexOf(item);\n\t }\n\t\n\t /**\n\t * Boolean existence check\n\t * @param item\n\t * @returns {boolean}\n\t */\n\t function contains(item) {\n\t return item && (indexOf(item) > -1);\n\t }\n\t\n\t /**\n\t * Return first item in the list\n\t * @returns {*}\n\t */\n\t function first() {\n\t return _items.length ? _items[0] : null;\n\t }\n\t\n\t /**\n\t * Return last item in the list...\n\t * @returns {*}\n\t */\n\t function last() {\n\t return _items.length ? _items[_items.length - 1] : null;\n\t }\n\t\n\t /**\n\t * Find the next item. If reloop is true and at the end of the list, it will go back to the\n\t * first item. If given, the `validate` callback will be used to determine whether the next item\n\t * is valid. If not valid, it will try to find the next item again.\n\t *\n\t * @param {boolean} backwards Specifies the direction of searching (forwards/backwards)\n\t * @param {*} item The item whose subsequent item we are looking for\n\t * @param {Function=} validate The `validate` function\n\t * @param {integer=} limit The recursion limit\n\t *\n\t * @returns {*} The subsequent item or null\n\t */\n\t function findSubsequentItem(backwards, item, validate, limit) {\n\t validate = validate || trueFn;\n\t\n\t var curIndex = indexOf(item);\n\t while (true) {\n\t if (!inRange(curIndex)) return null;\n\t\n\t var nextIndex = curIndex + (backwards ? -1 : 1);\n\t var foundItem = null;\n\t if (inRange(nextIndex)) {\n\t foundItem = _items[nextIndex];\n\t } else if (reloop) {\n\t foundItem = backwards ? last() : first();\n\t nextIndex = indexOf(foundItem);\n\t }\n\t\n\t if ((foundItem === null) || (nextIndex === limit)) return null;\n\t if (validate(foundItem)) return foundItem;\n\t\n\t if (angular.isUndefined(limit)) limit = nextIndex;\n\t\n\t curIndex = nextIndex;\n\t }\n\t }\n\t }\n\t\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t\n\tmdMediaFactory.$inject = [\"$mdConstant\", \"$rootScope\", \"$window\"];angular.module('material.core')\n\t.factory('$mdMedia', mdMediaFactory);\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdMedia\n\t * @module material.core\n\t *\n\t * @description\n\t * `$mdMedia` is used to evaluate whether a given media query is true or false given the\n\t * current device's screen / window size. The media query will be re-evaluated on resize, allowing\n\t * you to register a watch.\n\t *\n\t * `$mdMedia` also has pre-programmed support for media queries that match the layout breakpoints:\n\t *\n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t *
BreakpointmediaQuery
xs(max-width: 599px)
gt-xs(min-width: 600px)
sm(min-width: 600px) and (max-width: 959px)
gt-sm(min-width: 960px)
md(min-width: 960px) and (max-width: 1279px)
gt-md(min-width: 1280px)
lg(min-width: 1280px) and (max-width: 1919px)
gt-lg(min-width: 1920px)
xl(min-width: 1920px)
landscapelandscape
portraitportrait
printprint
\n\t *\n\t * See Material Design's Layout - Adaptive UI for more details.\n\t *\n\t * \n\t * \n\t * \n\t *\n\t * @returns {boolean} a boolean representing whether or not the given media query is true or false.\n\t *\n\t * @usage\n\t * \n\t * app.controller('MyController', function($mdMedia, $scope) {\n\t * $scope.$watch(function() { return $mdMedia('lg'); }, function(big) {\n\t * $scope.bigScreen = big;\n\t * });\n\t *\n\t * $scope.screenIsSmall = $mdMedia('sm');\n\t * $scope.customQuery = $mdMedia('(min-width: 1234px)');\n\t * $scope.anotherCustom = $mdMedia('max-width: 300px');\n\t * });\n\t * \n\t */\n\t\n\t/* @ngInject */\n\tfunction mdMediaFactory($mdConstant, $rootScope, $window) {\n\t var queries = {};\n\t var mqls = {};\n\t var results = {};\n\t var normalizeCache = {};\n\t\n\t $mdMedia.getResponsiveAttribute = getResponsiveAttribute;\n\t $mdMedia.getQuery = getQuery;\n\t $mdMedia.watchResponsiveAttributes = watchResponsiveAttributes;\n\t\n\t return $mdMedia;\n\t\n\t function $mdMedia(query) {\n\t var validated = queries[query];\n\t if (angular.isUndefined(validated)) {\n\t validated = queries[query] = validate(query);\n\t }\n\t\n\t var result = results[validated];\n\t if (angular.isUndefined(result)) {\n\t result = add(validated);\n\t }\n\t\n\t return result;\n\t }\n\t\n\t function validate(query) {\n\t return $mdConstant.MEDIA[query] ||\n\t ((query.charAt(0) !== '(') ? ('(' + query + ')') : query);\n\t }\n\t\n\t function add(query) {\n\t var result = mqls[query];\n\t if ( !result ) {\n\t result = mqls[query] = $window.matchMedia(query);\n\t }\n\t\n\t result.addListener(onQueryChange);\n\t return (results[result.media] = !!result.matches);\n\t }\n\t\n\t function onQueryChange(query) {\n\t $rootScope.$evalAsync(function() {\n\t results[query.media] = !!query.matches;\n\t });\n\t }\n\t\n\t function getQuery(name) {\n\t return mqls[name];\n\t }\n\t\n\t function getResponsiveAttribute(attrs, attrName) {\n\t for (var i = 0; i < $mdConstant.MEDIA_PRIORITY.length; i++) {\n\t var mediaName = $mdConstant.MEDIA_PRIORITY[i];\n\t if (!mqls[queries[mediaName]].matches) {\n\t continue;\n\t }\n\t\n\t var normalizedName = getNormalizedName(attrs, attrName + '-' + mediaName);\n\t if (attrs[normalizedName]) {\n\t return attrs[normalizedName];\n\t }\n\t }\n\t\n\t // fallback on unprefixed\n\t return attrs[getNormalizedName(attrs, attrName)];\n\t }\n\t\n\t function watchResponsiveAttributes(attrNames, attrs, watchFn) {\n\t var unwatchFns = [];\n\t attrNames.forEach(function(attrName) {\n\t var normalizedName = getNormalizedName(attrs, attrName);\n\t if (angular.isDefined(attrs[normalizedName])) {\n\t unwatchFns.push(\n\t attrs.$observe(normalizedName, angular.bind(void 0, watchFn, null)));\n\t }\n\t\n\t for (var mediaName in $mdConstant.MEDIA) {\n\t normalizedName = getNormalizedName(attrs, attrName + '-' + mediaName);\n\t if (angular.isDefined(attrs[normalizedName])) {\n\t unwatchFns.push(\n\t attrs.$observe(normalizedName, angular.bind(void 0, watchFn, mediaName)));\n\t }\n\t }\n\t });\n\t\n\t return function unwatch() {\n\t unwatchFns.forEach(function(fn) { fn(); });\n\t };\n\t }\n\t\n\t // Improves performance dramatically\n\t function getNormalizedName(attrs, attrName) {\n\t return normalizeCache[attrName] ||\n\t (normalizeCache[attrName] = attrs.$normalize(attrName));\n\t }\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\tangular\n\t .module('material.core')\n\t .config( [\"$provide\", function($provide) {\n\t $provide.decorator('$mdUtil', ['$delegate', function ($delegate) {\n\t\n\t // Inject the prefixer into our original $mdUtil service.\n\t $delegate.prefixer = MdPrefixer;\n\t\n\t return $delegate;\n\t }]);\n\t }]);\n\t\n\tfunction MdPrefixer(initialAttributes, buildSelector) {\n\t var PREFIXES = ['data', 'x'];\n\t\n\t if (initialAttributes) {\n\t // The prefixer also accepts attributes as a parameter, and immediately builds a list or selector for\n\t // the specified attributes.\n\t return buildSelector ? _buildSelector(initialAttributes) : _buildList(initialAttributes);\n\t }\n\t\n\t return {\n\t buildList: _buildList,\n\t buildSelector: _buildSelector,\n\t hasAttribute: _hasAttribute,\n\t removeAttribute: _removeAttribute\n\t };\n\t\n\t function _buildList(attributes) {\n\t attributes = angular.isArray(attributes) ? attributes : [attributes];\n\t\n\t attributes.forEach(function(item) {\n\t PREFIXES.forEach(function(prefix) {\n\t attributes.push(prefix + '-' + item);\n\t });\n\t });\n\t\n\t return attributes;\n\t }\n\t\n\t function _buildSelector(attributes) {\n\t attributes = angular.isArray(attributes) ? attributes : [attributes];\n\t\n\t return _buildList(attributes)\n\t .map(function(item) {\n\t return '[' + item + ']';\n\t })\n\t .join(',');\n\t }\n\t\n\t function _hasAttribute(element, attribute) {\n\t element = _getNativeElement(element);\n\t\n\t if (!element) {\n\t return false;\n\t }\n\t\n\t var prefixedAttrs = _buildList(attribute);\n\t\n\t for (var i = 0; i < prefixedAttrs.length; i++) {\n\t if (element.hasAttribute(prefixedAttrs[i])) {\n\t return true;\n\t }\n\t }\n\t\n\t return false;\n\t }\n\t\n\t function _removeAttribute(element, attribute) {\n\t element = _getNativeElement(element);\n\t\n\t if (!element) {\n\t return;\n\t }\n\t\n\t _buildList(attribute).forEach(function(prefixedAttribute) {\n\t element.removeAttribute(prefixedAttribute);\n\t });\n\t }\n\t\n\t /**\n\t * Transforms a jqLite or DOM element into a HTML element.\n\t * This is useful when supporting jqLite elements and DOM elements at\n\t * same time.\n\t * @param element {JQLite|Element} Element to be parsed\n\t * @returns {HTMLElement} Parsed HTMLElement\n\t */\n\t function _getNativeElement(element) {\n\t element = element[0] || element;\n\t\n\t if (element.nodeType) {\n\t return element;\n\t }\n\t }\n\t\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/*\n\t * This var has to be outside the angular factory, otherwise when\n\t * there are multiple material apps on the same page, each app\n\t * will create its own instance of this array and the app's IDs\n\t * will not be unique.\n\t */\n\tUtilFactory.$inject = [\"$document\", \"$timeout\", \"$compile\", \"$rootScope\", \"$$mdAnimate\", \"$interpolate\", \"$log\", \"$rootElement\", \"$window\", \"$$rAF\"];\n\tvar nextUniqueId = 0;\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.core.util\n\t * @description\n\t * Util\n\t */\n\tangular\n\t .module('material.core')\n\t .factory('$mdUtil', UtilFactory);\n\t\n\t/**\n\t * @ngInject\n\t */\n\tfunction UtilFactory($document, $timeout, $compile, $rootScope, $$mdAnimate, $interpolate, $log, $rootElement, $window, $$rAF) {\n\t // Setup some core variables for the processTemplate method\n\t var startSymbol = $interpolate.startSymbol(),\n\t endSymbol = $interpolate.endSymbol(),\n\t usesStandardSymbols = ((startSymbol === '{{') && (endSymbol === '}}'));\n\t\n\t /**\n\t * Checks if the target element has the requested style by key\n\t * @param {DOMElement|JQLite} target Target element\n\t * @param {string} key Style key\n\t * @param {string=} expectedVal Optional expected value\n\t * @returns {boolean} Whether the target element has the style or not\n\t */\n\t var hasComputedStyle = function (target, key, expectedVal) {\n\t var hasValue = false;\n\t\n\t if ( target && target.length ) {\n\t var computedStyles = $window.getComputedStyle(target[0]);\n\t hasValue = angular.isDefined(computedStyles[key]) && (expectedVal ? computedStyles[key] == expectedVal : true);\n\t }\n\t\n\t return hasValue;\n\t };\n\t\n\t function validateCssValue(value) {\n\t return !value ? '0' :\n\t hasPx(value) || hasPercent(value) ? value : value + 'px';\n\t }\n\t\n\t function hasPx(value) {\n\t return String(value).indexOf('px') > -1;\n\t }\n\t\n\t function hasPercent(value) {\n\t return String(value).indexOf('%') > -1;\n\t\n\t }\n\t\n\t var $mdUtil = {\n\t dom: {},\n\t now: window.performance && window.performance.now ?\n\t angular.bind(window.performance, window.performance.now) : Date.now || function() {\n\t return new Date().getTime();\n\t },\n\t\n\t /**\n\t * Cross-version compatibility method to retrieve an option of a ngModel controller,\n\t * which supports the breaking changes in the AngularJS snapshot (SHA 87a2ff76af5d0a9268d8eb84db5755077d27c84c).\n\t * @param {!angular.ngModelCtrl} ngModelCtrl\n\t * @param {!string} optionName\n\t * @returns {Object|undefined}\n\t */\n\t getModelOption: function (ngModelCtrl, optionName) {\n\t if (!ngModelCtrl.$options) {\n\t return;\n\t }\n\t\n\t var $options = ngModelCtrl.$options;\n\t\n\t // The newer versions of AngularJS introduced a `getOption function and made the option values no longer\n\t // visible on the $options object.\n\t return $options.getOption ? $options.getOption(optionName) : $options[optionName]\n\t },\n\t\n\t /**\n\t * Bi-directional accessor/mutator used to easily update an element's\n\t * property based on the current 'dir'ectional value.\n\t */\n\t bidi : function(element, property, lValue, rValue) {\n\t var ltr = !($document[0].dir == 'rtl' || $document[0].body.dir == 'rtl');\n\t\n\t // If accessor\n\t if ( arguments.length == 0 ) return ltr ? 'ltr' : 'rtl';\n\t\n\t // If mutator\n\t var elem = angular.element(element);\n\t\n\t if ( ltr && angular.isDefined(lValue)) {\n\t elem.css(property, validateCssValue(lValue));\n\t }\n\t else if ( !ltr && angular.isDefined(rValue)) {\n\t elem.css(property, validateCssValue(rValue) );\n\t }\n\t },\n\t\n\t bidiProperty: function (element, lProperty, rProperty, value) {\n\t var ltr = !($document[0].dir == 'rtl' || $document[0].body.dir == 'rtl');\n\t\n\t var elem = angular.element(element);\n\t\n\t if ( ltr && angular.isDefined(lProperty)) {\n\t elem.css(lProperty, validateCssValue(value));\n\t elem.css(rProperty, '');\n\t }\n\t else if ( !ltr && angular.isDefined(rProperty)) {\n\t elem.css(rProperty, validateCssValue(value) );\n\t elem.css(lProperty, '');\n\t }\n\t },\n\t\n\t clientRect: function(element, offsetParent, isOffsetRect) {\n\t var node = getNode(element);\n\t offsetParent = getNode(offsetParent || node.offsetParent || document.body);\n\t var nodeRect = node.getBoundingClientRect();\n\t\n\t // The user can ask for an offsetRect: a rect relative to the offsetParent,\n\t // or a clientRect: a rect relative to the page\n\t var offsetRect = isOffsetRect ?\n\t offsetParent.getBoundingClientRect() :\n\t {left: 0, top: 0, width: 0, height: 0};\n\t return {\n\t left: nodeRect.left - offsetRect.left,\n\t top: nodeRect.top - offsetRect.top,\n\t width: nodeRect.width,\n\t height: nodeRect.height\n\t };\n\t },\n\t offsetRect: function(element, offsetParent) {\n\t return $mdUtil.clientRect(element, offsetParent, true);\n\t },\n\t\n\t // Annoying method to copy nodes to an array, thanks to IE\n\t nodesToArray: function(nodes) {\n\t nodes = nodes || [];\n\t\n\t var results = [];\n\t for (var i = 0; i < nodes.length; ++i) {\n\t results.push(nodes.item(i));\n\t }\n\t return results;\n\t },\n\t\n\t /**\n\t * Determines the absolute position of the viewport.\n\t * Useful when making client rectangles absolute.\n\t * @returns {number}\n\t */\n\t getViewportTop: function() {\n\t return window.scrollY || window.pageYOffset || 0;\n\t },\n\t\n\t /**\n\t * Finds the proper focus target by searching the DOM.\n\t *\n\t * @param containerEl\n\t * @param attributeVal\n\t * @returns {*}\n\t */\n\t findFocusTarget: function(containerEl, attributeVal) {\n\t var AUTO_FOCUS = this.prefixer('md-autofocus', true);\n\t var elToFocus;\n\t\n\t elToFocus = scanForFocusable(containerEl, attributeVal || AUTO_FOCUS);\n\t\n\t if ( !elToFocus && attributeVal != AUTO_FOCUS) {\n\t // Scan for deprecated attribute\n\t elToFocus = scanForFocusable(containerEl, this.prefixer('md-auto-focus', true));\n\t\n\t if ( !elToFocus ) {\n\t // Scan for fallback to 'universal' API\n\t elToFocus = scanForFocusable(containerEl, AUTO_FOCUS);\n\t }\n\t }\n\t\n\t return elToFocus;\n\t\n\t /**\n\t * Can target and nested children for specified Selector (attribute)\n\t * whose value may be an expression that evaluates to True/False.\n\t */\n\t function scanForFocusable(target, selector) {\n\t var elFound, items = target[0].querySelectorAll(selector);\n\t\n\t // Find the last child element with the focus attribute\n\t if ( items && items.length ){\n\t items.length && angular.forEach(items, function(it) {\n\t it = angular.element(it);\n\t\n\t // Check the element for the md-autofocus class to ensure any associated expression\n\t // evaluated to true.\n\t var isFocusable = it.hasClass('md-autofocus');\n\t if (isFocusable) elFound = it;\n\t });\n\t }\n\t return elFound;\n\t }\n\t },\n\t\n\t /**\n\t * Disables scroll around the passed parent element.\n\t * @param element Unused\n\t * @param {!Element|!angular.JQLite} parent Element to disable scrolling within.\n\t * Defaults to body if none supplied.\n\t * @param options Object of options to modify functionality\n\t * - disableScrollMask Boolean of whether or not to create a scroll mask element or\n\t * use the passed parent element.\n\t */\n\t disableScrollAround: function(element, parent, options) {\n\t options = options || {};\n\t\n\t $mdUtil.disableScrollAround._count = Math.max(0, $mdUtil.disableScrollAround._count || 0);\n\t $mdUtil.disableScrollAround._count++;\n\t\n\t if ($mdUtil.disableScrollAround._restoreScroll) {\n\t return $mdUtil.disableScrollAround._restoreScroll;\n\t }\n\t\n\t var body = $document[0].body;\n\t var restoreBody = disableBodyScroll();\n\t var restoreElement = disableElementScroll(parent);\n\t\n\t return $mdUtil.disableScrollAround._restoreScroll = function() {\n\t if (--$mdUtil.disableScrollAround._count <= 0) {\n\t restoreBody();\n\t restoreElement();\n\t delete $mdUtil.disableScrollAround._restoreScroll;\n\t }\n\t };\n\t\n\t /**\n\t * Creates a virtual scrolling mask to prevent touchmove, keyboard, scrollbar clicking,\n\t * and wheel events\n\t */\n\t function disableElementScroll(element) {\n\t element = angular.element(element || body);\n\t\n\t var scrollMask;\n\t\n\t if (options.disableScrollMask) {\n\t scrollMask = element;\n\t } else {\n\t scrollMask = angular.element(\n\t '
' +\n\t '
' +\n\t '
');\n\t element.append(scrollMask);\n\t }\n\t\n\t scrollMask.on('wheel', preventDefault);\n\t scrollMask.on('touchmove', preventDefault);\n\t\n\t return function restoreElementScroll() {\n\t scrollMask.off('wheel');\n\t scrollMask.off('touchmove');\n\t\n\t if (!options.disableScrollMask) {\n\t scrollMask[0].parentNode.removeChild(scrollMask[0]);\n\t }\n\t };\n\t\n\t function preventDefault(e) {\n\t e.preventDefault();\n\t }\n\t }\n\t\n\t // Converts the body to a position fixed block and translate it to the proper scroll position\n\t function disableBodyScroll() {\n\t var documentElement = $document[0].documentElement;\n\t\n\t var prevDocumentStyle = documentElement.style.cssText || '';\n\t var prevBodyStyle = body.style.cssText || '';\n\t\n\t var viewportTop = $mdUtil.getViewportTop();\n\t var clientWidth = body.clientWidth;\n\t var hasVerticalScrollbar = body.scrollHeight > body.clientHeight + 1;\n\t\n\t if (hasVerticalScrollbar) {\n\t angular.element(body).css({\n\t position: 'fixed',\n\t width: '100%',\n\t top: -viewportTop + 'px'\n\t });\n\t }\n\t\n\t if (body.clientWidth < clientWidth) {\n\t body.style.overflow = 'hidden';\n\t }\n\t\n\t // This should be applied after the manipulation to the body, because\n\t // adding a scrollbar can potentially resize it, causing the measurement\n\t // to change.\n\t if (hasVerticalScrollbar) {\n\t documentElement.style.overflowY = 'scroll';\n\t }\n\t\n\t return function restoreScroll() {\n\t // Reset the inline style CSS to the previous.\n\t body.style.cssText = prevBodyStyle;\n\t documentElement.style.cssText = prevDocumentStyle;\n\t\n\t // The body loses its scroll position while being fixed.\n\t body.scrollTop = viewportTop;\n\t };\n\t }\n\t\n\t },\n\t\n\t enableScrolling: function() {\n\t var restoreFn = this.disableScrollAround._restoreScroll;\n\t restoreFn && restoreFn();\n\t },\n\t\n\t floatingScrollbars: function() {\n\t if (this.floatingScrollbars.cached === undefined) {\n\t var tempNode = angular.element('
').css({\n\t width: '100%',\n\t 'z-index': -1,\n\t position: 'absolute',\n\t height: '35px',\n\t 'overflow-y': 'scroll'\n\t });\n\t tempNode.children().css('height', '60px');\n\t\n\t $document[0].body.appendChild(tempNode[0]);\n\t this.floatingScrollbars.cached = (tempNode[0].offsetWidth == tempNode[0].childNodes[0].offsetWidth);\n\t tempNode.remove();\n\t }\n\t return this.floatingScrollbars.cached;\n\t },\n\t\n\t // Mobile safari only allows you to set focus in click event listeners...\n\t forceFocus: function(element) {\n\t var node = element[0] || element;\n\t\n\t document.addEventListener('click', function focusOnClick(ev) {\n\t if (ev.target === node && ev.$focus) {\n\t node.focus();\n\t ev.stopImmediatePropagation();\n\t ev.preventDefault();\n\t node.removeEventListener('click', focusOnClick);\n\t }\n\t }, true);\n\t\n\t var newEvent = document.createEvent('MouseEvents');\n\t newEvent.initMouseEvent('click', false, true, window, {}, 0, 0, 0, 0,\n\t false, false, false, false, 0, null);\n\t newEvent.$material = true;\n\t newEvent.$focus = true;\n\t node.dispatchEvent(newEvent);\n\t },\n\t\n\t /**\n\t * facade to build md-backdrop element with desired styles\n\t * NOTE: Use $compile to trigger backdrop postLink function\n\t */\n\t createBackdrop: function(scope, addClass) {\n\t return $compile($mdUtil.supplant('', [addClass]))(scope);\n\t },\n\t\n\t /**\n\t * supplant() method from Crockford's `Remedial Javascript`\n\t * Equivalent to use of $interpolate; without dependency on\n\t * interpolation symbols and scope. Note: the '{}' can\n\t * be property names, property chains, or array indices.\n\t */\n\t supplant: function(template, values, pattern) {\n\t pattern = pattern || /\\{([^\\{\\}]*)\\}/g;\n\t return template.replace(pattern, function(a, b) {\n\t var p = b.split('.'),\n\t r = values;\n\t try {\n\t for (var s in p) {\n\t if (p.hasOwnProperty(s) ) {\n\t r = r[p[s]];\n\t }\n\t }\n\t } catch (e) {\n\t r = a;\n\t }\n\t return (typeof r === 'string' || typeof r === 'number') ? r : a;\n\t });\n\t },\n\t\n\t fakeNgModel: function() {\n\t return {\n\t $fake: true,\n\t $setTouched: angular.noop,\n\t $setViewValue: function(value) {\n\t this.$viewValue = value;\n\t this.$render(value);\n\t this.$viewChangeListeners.forEach(function(cb) {\n\t cb();\n\t });\n\t },\n\t $isEmpty: function(value) {\n\t return ('' + value).length === 0;\n\t },\n\t $parsers: [],\n\t $formatters: [],\n\t $viewChangeListeners: [],\n\t $render: angular.noop\n\t };\n\t },\n\t\n\t // Returns a function, that, as long as it continues to be invoked, will not\n\t // be triggered. The function will be called after it stops being called for\n\t // N milliseconds.\n\t // @param wait Integer value of msecs to delay (since last debounce reset); default value 10 msecs\n\t // @param invokeApply should the $timeout trigger $digest() dirty checking\n\t debounce: function(func, wait, scope, invokeApply) {\n\t var timer;\n\t\n\t return function debounced() {\n\t var context = scope,\n\t args = Array.prototype.slice.call(arguments);\n\t\n\t $timeout.cancel(timer);\n\t timer = $timeout(function() {\n\t\n\t timer = undefined;\n\t func.apply(context, args);\n\t\n\t }, wait || 10, invokeApply);\n\t };\n\t },\n\t\n\t // Returns a function that can only be triggered every `delay` milliseconds.\n\t // In other words, the function will not be called unless it has been more\n\t // than `delay` milliseconds since the last call.\n\t throttle: function throttle(func, delay) {\n\t var recent;\n\t return function throttled() {\n\t var context = this;\n\t var args = arguments;\n\t var now = $mdUtil.now();\n\t\n\t if (!recent || (now - recent > delay)) {\n\t func.apply(context, args);\n\t recent = now;\n\t }\n\t };\n\t },\n\t\n\t /**\n\t * Measures the number of milliseconds taken to run the provided callback\n\t * function. Uses a high-precision timer if available.\n\t */\n\t time: function time(cb) {\n\t var start = $mdUtil.now();\n\t cb();\n\t return $mdUtil.now() - start;\n\t },\n\t\n\t /**\n\t * Create an implicit getter that caches its `getter()`\n\t * lookup value\n\t */\n\t valueOnUse : function (scope, key, getter) {\n\t var value = null, args = Array.prototype.slice.call(arguments);\n\t var params = (args.length > 3) ? args.slice(3) : [ ];\n\t\n\t Object.defineProperty(scope, key, {\n\t get: function () {\n\t if (value === null) value = getter.apply(scope, params);\n\t return value;\n\t }\n\t });\n\t },\n\t\n\t /**\n\t * Get a unique ID.\n\t *\n\t * @returns {string} an unique numeric string\n\t */\n\t nextUid: function() {\n\t return '' + nextUniqueId++;\n\t },\n\t\n\t // Stop watchers and events from firing on a scope without destroying it,\n\t // by disconnecting it from its parent and its siblings' linked lists.\n\t disconnectScope: function disconnectScope(scope) {\n\t if (!scope) return;\n\t\n\t // we can't destroy the root scope or a scope that has been already destroyed\n\t if (scope.$root === scope) return;\n\t if (scope.$$destroyed) return;\n\t\n\t var parent = scope.$parent;\n\t scope.$$disconnected = true;\n\t\n\t // See Scope.$destroy\n\t if (parent.$$childHead === scope) parent.$$childHead = scope.$$nextSibling;\n\t if (parent.$$childTail === scope) parent.$$childTail = scope.$$prevSibling;\n\t if (scope.$$prevSibling) scope.$$prevSibling.$$nextSibling = scope.$$nextSibling;\n\t if (scope.$$nextSibling) scope.$$nextSibling.$$prevSibling = scope.$$prevSibling;\n\t\n\t scope.$$nextSibling = scope.$$prevSibling = null;\n\t\n\t },\n\t\n\t // Undo the effects of disconnectScope above.\n\t reconnectScope: function reconnectScope(scope) {\n\t if (!scope) return;\n\t\n\t // we can't disconnect the root node or scope already disconnected\n\t if (scope.$root === scope) return;\n\t if (!scope.$$disconnected) return;\n\t\n\t var child = scope;\n\t\n\t var parent = child.$parent;\n\t child.$$disconnected = false;\n\t // See Scope.$new for this logic...\n\t child.$$prevSibling = parent.$$childTail;\n\t if (parent.$$childHead) {\n\t parent.$$childTail.$$nextSibling = child;\n\t parent.$$childTail = child;\n\t } else {\n\t parent.$$childHead = parent.$$childTail = child;\n\t }\n\t },\n\t\n\t /*\n\t * getClosest replicates jQuery.closest() to walk up the DOM tree until it finds a matching nodeName\n\t *\n\t * @param el Element to start walking the DOM from\n\t * @param check Either a string or a function. If a string is passed, it will be evaluated against\n\t * each of the parent nodes' tag name. If a function is passed, the loop will call it with each of\n\t * the parents and will use the return value to determine whether the node is a match.\n\t * @param onlyParent Only start checking from the parent element, not `el`.\n\t */\n\t getClosest: function getClosest(el, validateWith, onlyParent) {\n\t if ( angular.isString(validateWith) ) {\n\t var tagName = validateWith.toUpperCase();\n\t validateWith = function(el) {\n\t return el.nodeName.toUpperCase() === tagName;\n\t };\n\t }\n\t\n\t if (el instanceof angular.element) el = el[0];\n\t if (onlyParent) el = el.parentNode;\n\t if (!el) return null;\n\t\n\t do {\n\t if (validateWith(el)) {\n\t return el;\n\t }\n\t } while (el = el.parentNode);\n\t\n\t return null;\n\t },\n\t\n\t /**\n\t * Build polyfill for the Node.contains feature (if needed)\n\t */\n\t elementContains: function(node, child) {\n\t var hasContains = (window.Node && window.Node.prototype && Node.prototype.contains);\n\t var findFn = hasContains ? angular.bind(node, node.contains) : angular.bind(node, function(arg) {\n\t // compares the positions of two nodes and returns a bitmask\n\t return (node === child) || !!(this.compareDocumentPosition(arg) & 16)\n\t });\n\t\n\t return findFn(child);\n\t },\n\t\n\t /**\n\t * Functional equivalent for $element.filter(‘md-bottom-sheet’)\n\t * useful with interimElements where the element and its container are important...\n\t *\n\t * @param {[]} elements to scan\n\t * @param {string} name of node to find (e.g. 'md-dialog')\n\t * @param {boolean=} optional flag to allow deep scans; defaults to 'false'.\n\t * @param {boolean=} optional flag to enable log warnings; defaults to false\n\t */\n\t extractElementByName: function(element, nodeName, scanDeep, warnNotFound) {\n\t var found = scanTree(element);\n\t if (!found && !!warnNotFound) {\n\t $log.warn( $mdUtil.supplant(\"Unable to find node '{0}' in element '{1}'.\",[nodeName, element[0].outerHTML]) );\n\t }\n\t\n\t return angular.element(found || element);\n\t\n\t /**\n\t * Breadth-First tree scan for element with matching `nodeName`\n\t */\n\t function scanTree(element) {\n\t return scanLevel(element) || (!!scanDeep ? scanChildren(element) : null);\n\t }\n\t\n\t /**\n\t * Case-insensitive scan of current elements only (do not descend).\n\t */\n\t function scanLevel(element) {\n\t if ( element ) {\n\t for (var i = 0, len = element.length; i < len; i++) {\n\t if (element[i].nodeName.toLowerCase() === nodeName) {\n\t return element[i];\n\t }\n\t }\n\t }\n\t return null;\n\t }\n\t\n\t /**\n\t * Scan children of specified node\n\t */\n\t function scanChildren(element) {\n\t var found;\n\t if ( element ) {\n\t for (var i = 0, len = element.length; i < len; i++) {\n\t var target = element[i];\n\t if ( !found ) {\n\t for (var j = 0, numChild = target.childNodes.length; j < numChild; j++) {\n\t found = found || scanTree([target.childNodes[j]]);\n\t }\n\t }\n\t }\n\t }\n\t return found;\n\t }\n\t\n\t },\n\t\n\t /**\n\t * Give optional properties with no value a boolean true if attr provided or false otherwise\n\t */\n\t initOptionalProperties: function(scope, attr, defaults) {\n\t defaults = defaults || {};\n\t angular.forEach(scope.$$isolateBindings, function(binding, key) {\n\t if (binding.optional && angular.isUndefined(scope[key])) {\n\t var attrIsDefined = angular.isDefined(attr[binding.attrName]);\n\t scope[key] = angular.isDefined(defaults[key]) ? defaults[key] : attrIsDefined;\n\t }\n\t });\n\t },\n\t\n\t /**\n\t * Alternative to $timeout calls with 0 delay.\n\t * nextTick() coalesces all calls within a single frame\n\t * to minimize $digest thrashing\n\t *\n\t * @param callback\n\t * @param digest\n\t * @returns {*}\n\t */\n\t nextTick: function(callback, digest, scope) {\n\t //-- grab function reference for storing state details\n\t var nextTick = $mdUtil.nextTick;\n\t var timeout = nextTick.timeout;\n\t var queue = nextTick.queue || [];\n\t\n\t //-- add callback to the queue\n\t queue.push({scope: scope, callback: callback});\n\t\n\t //-- set default value for digest\n\t if (digest == null) digest = true;\n\t\n\t //-- store updated digest/queue values\n\t nextTick.digest = nextTick.digest || digest;\n\t nextTick.queue = queue;\n\t\n\t //-- either return existing timeout or create a new one\n\t return timeout || (nextTick.timeout = $timeout(processQueue, 0, false));\n\t\n\t /**\n\t * Grab a copy of the current queue\n\t * Clear the queue for future use\n\t * Process the existing queue\n\t * Trigger digest if necessary\n\t */\n\t function processQueue() {\n\t var queue = nextTick.queue;\n\t var digest = nextTick.digest;\n\t\n\t nextTick.queue = [];\n\t nextTick.timeout = null;\n\t nextTick.digest = false;\n\t\n\t queue.forEach(function(queueItem) {\n\t var skip = queueItem.scope && queueItem.scope.$$destroyed;\n\t if (!skip) {\n\t queueItem.callback();\n\t }\n\t });\n\t\n\t if (digest) $rootScope.$digest();\n\t }\n\t },\n\t\n\t /**\n\t * Processes a template and replaces the start/end symbols if the application has\n\t * overriden them.\n\t *\n\t * @param template The template to process whose start/end tags may be replaced.\n\t * @returns {*}\n\t */\n\t processTemplate: function(template) {\n\t if (usesStandardSymbols) {\n\t return template;\n\t } else {\n\t if (!template || !angular.isString(template)) return template;\n\t return template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n\t }\n\t },\n\t\n\t /**\n\t * Scan up dom hierarchy for enabled parent;\n\t */\n\t getParentWithPointerEvents: function (element) {\n\t var parent = element.parent();\n\t\n\t // jqLite might return a non-null, but still empty, parent; so check for parent and length\n\t while (hasComputedStyle(parent, 'pointer-events', 'none')) {\n\t parent = parent.parent();\n\t }\n\t\n\t return parent;\n\t },\n\t\n\t getNearestContentElement: function (element) {\n\t var current = element.parent()[0];\n\t // Look for the nearest parent md-content, stopping at the rootElement.\n\t while (current && current !== $rootElement[0] && current !== document.body && current.nodeName.toUpperCase() !== 'MD-CONTENT') {\n\t current = current.parentNode;\n\t }\n\t return current;\n\t },\n\t\n\t /**\n\t * Checks if the current browser is natively supporting the `sticky` position.\n\t * @returns {string} supported sticky property name\n\t */\n\t checkStickySupport: function() {\n\t var stickyProp;\n\t var testEl = angular.element('
');\n\t $document[0].body.appendChild(testEl[0]);\n\t\n\t var stickyProps = ['sticky', '-webkit-sticky'];\n\t for (var i = 0; i < stickyProps.length; ++i) {\n\t testEl.css({\n\t position: stickyProps[i],\n\t top: 0,\n\t 'z-index': 2\n\t });\n\t\n\t if (testEl.css('position') == stickyProps[i]) {\n\t stickyProp = stickyProps[i];\n\t break;\n\t }\n\t }\n\t\n\t testEl.remove();\n\t\n\t return stickyProp;\n\t },\n\t\n\t /**\n\t * Parses an attribute value, mostly a string.\n\t * By default checks for negated values and returns `false´ if present.\n\t * Negated values are: (native falsy) and negative strings like:\n\t * `false` or `0`.\n\t * @param value Attribute value which should be parsed.\n\t * @param negatedCheck When set to false, won't check for negated values.\n\t * @returns {boolean}\n\t */\n\t parseAttributeBoolean: function(value, negatedCheck) {\n\t return value === '' || !!value && (negatedCheck === false || value !== 'false' && value !== '0');\n\t },\n\t\n\t hasComputedStyle: hasComputedStyle,\n\t\n\t /**\n\t * Returns true if the parent form of the element has been submitted.\n\t *\n\t * @param element An AngularJS or HTML5 element.\n\t *\n\t * @returns {boolean}\n\t */\n\t isParentFormSubmitted: function(element) {\n\t var parent = $mdUtil.getClosest(element, 'form');\n\t var form = parent ? angular.element(parent).controller('form') : null;\n\t\n\t return form ? form.$submitted : false;\n\t },\n\t\n\t /**\n\t * Animate the requested element's scrollTop to the requested scrollPosition with basic easing.\n\t *\n\t * @param {!HTMLElement} element The element to scroll.\n\t * @param {number} scrollEnd The new/final scroll position.\n\t * @param {number=} duration Duration of the scroll. Default is 1000ms.\n\t */\n\t animateScrollTo: function(element, scrollEnd, duration) {\n\t var scrollStart = element.scrollTop;\n\t var scrollChange = scrollEnd - scrollStart;\n\t var scrollingDown = scrollStart < scrollEnd;\n\t var startTime = $mdUtil.now();\n\t\n\t $$rAF(scrollChunk);\n\t\n\t function scrollChunk() {\n\t var newPosition = calculateNewPosition();\n\t\n\t element.scrollTop = newPosition;\n\t\n\t if (scrollingDown ? newPosition < scrollEnd : newPosition > scrollEnd) {\n\t $$rAF(scrollChunk);\n\t }\n\t }\n\t\n\t function calculateNewPosition() {\n\t var easeDuration = duration || 1000;\n\t var currentTime = $mdUtil.now() - startTime;\n\t\n\t return ease(currentTime, scrollStart, scrollChange, easeDuration);\n\t }\n\t\n\t function ease(currentTime, start, change, duration) {\n\t // If the duration has passed (which can occur if our app loses focus due to $$rAF), jump\n\t // straight to the proper position\n\t if (currentTime > duration) {\n\t return start + change;\n\t }\n\t\n\t var ts = (currentTime /= duration) * currentTime;\n\t var tc = ts * currentTime;\n\t\n\t return start + change * (-2 * tc + 3 * ts);\n\t }\n\t },\n\t\n\t /**\n\t * Provides an easy mechanism for removing duplicates from an array.\n\t *\n\t * var myArray = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];\n\t *\n\t * $mdUtil.uniq(myArray) => [1, 2, 3, 4]\n\t *\n\t * @param {array} array The array whose unique values should be returned.\n\t *\n\t * @returns {array} A copy of the array containing only unique values.\n\t */\n\t uniq: function(array) {\n\t if (!array) { return; }\n\t\n\t return array.filter(function(value, index, self) {\n\t return self.indexOf(value) === index;\n\t });\n\t }\n\t };\n\t\n\t\n\t// Instantiate other namespace utility methods\n\t\n\t $mdUtil.dom.animator = $$mdAnimate($mdUtil);\n\t\n\t return $mdUtil;\n\t\n\t function getNode(el) {\n\t return el[0] || el;\n\t }\n\t\n\t}\n\t\n\t/*\n\t * Since removing jQuery from the demos, some code that uses `element.focus()` is broken.\n\t * We need to add `element.focus()`, because it's testable unlike `element[0].focus`.\n\t */\n\t\n\tangular.element.prototype.focus = angular.element.prototype.focus || function() {\n\t if (this.length) {\n\t this[0].focus();\n\t }\n\t return this;\n\t };\n\tangular.element.prototype.blur = angular.element.prototype.blur || function() {\n\t if (this.length) {\n\t this[0].blur();\n\t }\n\t return this;\n\t };\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.core.compiler\n\t * @description\n\t * AngularJS Material template and element compiler.\n\t */\n\tMdCompilerService.$inject = [\"$q\", \"$templateRequest\", \"$injector\", \"$compile\", \"$controller\"];\n\tangular\n\t .module('material.core')\n\t .service('$mdCompiler', MdCompilerService);\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdCompiler\n\t * @module material.core.compiler\n\t * @description\n\t * The $mdCompiler service is an abstraction of AngularJS's compiler, that allows developers\n\t * to easily compile an element with options like in a Directive Definition Object.\n\t *\n\t * > The compiler powers a lot of components inside of AngularJS Material.\n\t * > Like the `$mdPanel` or `$mdDialog`.\n\t *\n\t * @usage\n\t *\n\t * Basic Usage with a template\n\t *\n\t * \n\t * $mdCompiler.compile({\n\t * templateUrl: 'modal.html',\n\t * controller: 'ModalCtrl',\n\t * locals: {\n\t * modal: myModalInstance;\n\t * }\n\t * }).then(function (compileData) {\n\t * compileData.element; // Compiled DOM element\n\t * compileData.link(myScope); // Instantiate controller and link element to scope.\n\t * });\n\t * \n\t *\n\t * Example with a content element\n\t *\n\t * \n\t *\n\t * // Create a virtual element and link it manually.\n\t * // The compiler doesn't need to recompile the element each time.\n\t * var myElement = $compile('Test')(myScope);\n\t *\n\t * $mdCompiler.compile({\n\t * contentElement: myElement\n\t * }).then(function (compileData) {\n\t * compileData.element // Content Element (same as above)\n\t * compileData.link // This does nothing when using a contentElement.\n\t * });\n\t * \n\t *\n\t * > Content Element is a significant performance improvement when the developer already knows that the\n\t * > compiled element will be always the same and the scope will not change either.\n\t *\n\t * The `contentElement` option also supports DOM elements which will be temporary removed and restored\n\t * at its old position.\n\t *\n\t * \n\t * var domElement = document.querySelector('#myElement');\n\t *\n\t * $mdCompiler.compile({\n\t * contentElement: myElement\n\t * }).then(function (compileData) {\n\t * compileData.element // Content Element (same as above)\n\t * compileData.link // This does nothing when using a contentElement.\n\t * });\n\t * \n\t *\n\t * The `$mdCompiler` can also query for the element in the DOM itself.\n\t *\n\t * \n\t * $mdCompiler.compile({\n\t * contentElement: '#myElement'\n\t * }).then(function (compileData) {\n\t * compileData.element // Content Element (same as above)\n\t * compileData.link // This does nothing when using a contentElement.\n\t * });\n\t * \n\t *\n\t */\n\tfunction MdCompilerService($q, $templateRequest, $injector, $compile, $controller) {\n\t /** @private @const {!angular.$q} */\n\t this.$q = $q;\n\t\n\t /** @private @const {!angular.$templateRequest} */\n\t this.$templateRequest = $templateRequest;\n\t\n\t /** @private @const {!angular.$injector} */\n\t this.$injector = $injector;\n\t\n\t /** @private @const {!angular.$compile} */\n\t this.$compile = $compile;\n\t\n\t /** @private @const {!angular.$controller} */\n\t this.$controller = $controller;\n\t}\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdCompiler#compile\n\t * @description\n\t *\n\t * A method to compile a HTML template with the AngularJS compiler.\n\t * The `$mdCompiler` is wrapper around the AngularJS compiler and provides extra functionality\n\t * like controller instantiation or async resolves.\n\t *\n\t * @param {!Object} options An options object, with the following properties:\n\t *\n\t * - `controller` - `{string|Function}` Controller fn that should be associated with\n\t * newly created scope or the name of a registered controller if passed as a string.\n\t * - `controllerAs` - `{string=}` A controller alias name. If present the controller will be\n\t * published to scope under the `controllerAs` name.\n\t * - `contentElement` - `{string|Element}`: Instead of using a template, which will be\n\t * compiled each time, you can also use a DOM element.
\n\t * - `template` - `{string=}` An html template as a string.\n\t * - `templateUrl` - `{string=}` A path to an html template.\n\t * - `transformTemplate` - `{function(template)=}` A function which transforms the template after\n\t * it is loaded. It will be given the template string as a parameter, and should\n\t * return a a new string representing the transformed template.\n\t * - `resolve` - `{Object.=}` - An optional map of dependencies which should\n\t * be injected into the controller. If any of these dependencies are promises, the compiler\n\t * will wait for them all to be resolved, or if one is rejected before the controller is\n\t * instantiated `compile()` will fail..\n\t * * `key` - `{string}`: a name of a dependency to be injected into the controller.\n\t * * `factory` - `{string|function}`: If `string` then it is an alias for a service.\n\t * Otherwise if function, then it is injected and the return value is treated as the\n\t * dependency. If the result is a promise, it is resolved before its value is\n\t * injected into the controller.\n\t *\n\t * @returns {Object} promise A promise, which will be resolved with a `compileData` object.\n\t * `compileData` has the following properties:\n\t *\n\t * - `element` - `{element}`: an uncompiled element matching the provided template.\n\t * - `link` - `{function(scope)}`: A link function, which, when called, will compile\n\t * the element and instantiate the provided controller (if given).\n\t * - `locals` - `{object}`: The locals which will be passed into the controller once `link` is\n\t * called. If `bindToController` is true, they will be coppied to the ctrl instead\n\t *\n\t */\n\tMdCompilerService.prototype.compile = function(options) {\n\t\n\t if (options.contentElement) {\n\t return this._prepareContentElement(options);\n\t } else {\n\t return this._compileTemplate(options);\n\t }\n\t\n\t};\n\t\n\t/**\n\t * Instead of compiling any template, the compiler just fetches an existing HTML element from the DOM and\n\t * provides a restore function to put the element back it old DOM position.\n\t * @param {!Object} options Options to be used for the compiler.\n\t * @private\n\t */\n\tMdCompilerService.prototype._prepareContentElement = function(options) {\n\t\n\t var contentElement = this._fetchContentElement(options);\n\t\n\t return this.$q.resolve({\n\t element: contentElement.element,\n\t cleanup: contentElement.restore,\n\t locals: {},\n\t link: function() {\n\t return contentElement.element;\n\t }\n\t });\n\t\n\t};\n\t\n\t/**\n\t * Compiles a template by considering all options and waiting for all resolves to be ready.\n\t * @param {!Object} options Compile options\n\t * @returns {!Object} Compile data with link function.\n\t * @private\n\t */\n\tMdCompilerService.prototype._compileTemplate = function(options) {\n\t\n\t var self = this;\n\t var templateUrl = options.templateUrl;\n\t var template = options.template || '';\n\t var resolve = angular.extend({}, options.resolve);\n\t var locals = angular.extend({}, options.locals);\n\t var transformTemplate = options.transformTemplate || angular.identity;\n\t\n\t // Take resolve values and invoke them.\n\t // Resolves can either be a string (value: 'MyRegisteredAngularConst'),\n\t // or an invokable 'factory' of sorts: (value: function ValueGetter($dependency) {})\n\t angular.forEach(resolve, function(value, key) {\n\t if (angular.isString(value)) {\n\t resolve[key] = self.$injector.get(value);\n\t } else {\n\t resolve[key] = self.$injector.invoke(value);\n\t }\n\t });\n\t\n\t // Add the locals, which are just straight values to inject\n\t // eg locals: { three: 3 }, will inject three into the controller\n\t angular.extend(resolve, locals);\n\t\n\t if (templateUrl) {\n\t resolve.$$ngTemplate = this.$templateRequest(templateUrl);\n\t } else {\n\t resolve.$$ngTemplate = this.$q.when(template);\n\t }\n\t\n\t\n\t // Wait for all the resolves to finish if they are promises\n\t return this.$q.all(resolve).then(function(locals) {\n\t\n\t var template = transformTemplate(locals.$$ngTemplate, options);\n\t var element = options.element || angular.element('
').html(template.trim()).contents();\n\t\n\t return self._compileElement(locals, element, options);\n\t });\n\t\n\t};\n\t\n\t/**\n\t * Method to compile an element with the given options.\n\t * @param {!Object} locals Locals to be injected to the controller if present\n\t * @param {!JQLite} element Element to be compiled and linked\n\t * @param {!Object} options Options to be used for linking.\n\t * @returns {!Object} Compile data with link function.\n\t * @private\n\t */\n\tMdCompilerService.prototype._compileElement = function(locals, element, options) {\n\t var self = this;\n\t var ngLinkFn = this.$compile(element);\n\t\n\t var compileData = {\n\t element: element,\n\t cleanup: element.remove.bind(element),\n\t locals: locals,\n\t link: linkFn\n\t };\n\t\n\t function linkFn(scope) {\n\t locals.$scope = scope;\n\t\n\t // Instantiate controller if the developer provided one.\n\t if (options.controller) {\n\t\n\t var injectLocals = angular.extend(locals, {\n\t $element: element\n\t });\n\t\n\t var invokeCtrl = self.$controller(options.controller, injectLocals, true, options.controllerAs);\n\t\n\t if (options.bindToController) {\n\t angular.extend(invokeCtrl.instance, locals);\n\t }\n\t\n\t var ctrl = invokeCtrl();\n\t\n\t // Unique identifier for AngularJS Route ngView controllers.\n\t element.data('$ngControllerController', ctrl);\n\t element.children().data('$ngControllerController', ctrl);\n\t\n\t // Expose the instantiated controller to the compile data\n\t compileData.controller = ctrl;\n\t }\n\t\n\t // Invoke the AngularJS $compile link function.\n\t return ngLinkFn(scope);\n\t }\n\t\n\t return compileData;\n\t\n\t};\n\t\n\t/**\n\t * Fetches an element removing it from the DOM and using it temporary for the compiler.\n\t * Elements which were fetched will be restored after use.\n\t * @param {!Object} options Options to be used for the compilation.\n\t * @returns {{element: !JQLite, restore: !Function}}\n\t * @private\n\t */\n\tMdCompilerService.prototype._fetchContentElement = function(options) {\n\t\n\t var contentEl = options.contentElement;\n\t var restoreFn = null;\n\t\n\t if (angular.isString(contentEl)) {\n\t contentEl = document.querySelector(contentEl);\n\t restoreFn = createRestoreFn(contentEl);\n\t } else {\n\t contentEl = contentEl[0] || contentEl;\n\t\n\t // When the element is visible in the DOM, then we restore it at close of the dialog.\n\t // Otherwise it will be removed from the DOM after close.\n\t if (document.contains(contentEl)) {\n\t restoreFn = createRestoreFn(contentEl);\n\t } else {\n\t restoreFn = function() {\n\t if (contentEl.parentNode) {\n\t contentEl.parentNode.removeChild(contentEl);\n\t }\n\t }\n\t }\n\t }\n\t\n\t return {\n\t element: angular.element(contentEl),\n\t restore: restoreFn\n\t };\n\t\n\t function createRestoreFn(element) {\n\t var parent = element.parentNode;\n\t var nextSibling = element.nextElementSibling;\n\t\n\t return function() {\n\t if (!nextSibling) {\n\t // When the element didn't had any sibling, then it can be simply appended to the\n\t // parent, because it plays no role, which index it had before.\n\t parent.appendChild(element);\n\t } else {\n\t // When the element had a sibling, which marks the previous position of the element\n\t // in the DOM, we insert it correctly before the sibling, to have the same index as\n\t // before.\n\t parent.insertBefore(element, nextSibling);\n\t }\n\t }\n\t }\n\t};\n\t\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.core.aria\n\t * @description\n\t * Aria Expectations for AngularJS Material components.\n\t */\n\tMdAriaService.$inject = [\"$$rAF\", \"$log\", \"$window\", \"$interpolate\"];\n\tangular\n\t .module('material.core')\n\t .provider('$mdAria', MdAriaProvider);\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdAriaProvider\n\t * @module material.core.aria\n\t *\n\t * @description\n\t *\n\t * Modify options of the `$mdAria` service, which will be used by most of the AngularJS Material\n\t * components.\n\t *\n\t * You are able to disable `$mdAria` warnings, by using the following markup.\n\t *\n\t * \n\t * app.config(function($mdAriaProvider) {\n\t * // Globally disables all ARIA warnings.\n\t * $mdAriaProvider.disableWarnings();\n\t * });\n\t * \n\t *\n\t */\n\tfunction MdAriaProvider() {\n\t\n\t var config = {\n\t /** Whether we should show ARIA warnings in the console if labels are missing on the element */\n\t showWarnings: true\n\t };\n\t\n\t return {\n\t disableWarnings: disableWarnings,\n\t $get: [\"$$rAF\", \"$log\", \"$window\", \"$interpolate\", function($$rAF, $log, $window, $interpolate) {\n\t return MdAriaService.apply(config, arguments);\n\t }]\n\t };\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdAriaProvider#disableWarnings\n\t * @description Disables all ARIA warnings generated by AngularJS Material.\n\t */\n\t function disableWarnings() {\n\t config.showWarnings = false;\n\t }\n\t}\n\t\n\t/*\n\t * @ngInject\n\t */\n\tfunction MdAriaService($$rAF, $log, $window, $interpolate) {\n\t\n\t // Load the showWarnings option from the current context and store it inside of a scope variable,\n\t // because the context will be probably lost in some function calls.\n\t var showWarnings = this.showWarnings;\n\t\n\t return {\n\t expect: expect,\n\t expectAsync: expectAsync,\n\t expectWithText: expectWithText,\n\t expectWithoutText: expectWithoutText,\n\t getText: getText,\n\t hasAriaLabel: hasAriaLabel,\n\t parentHasAriaLabel: parentHasAriaLabel\n\t };\n\t\n\t /**\n\t * Check if expected attribute has been specified on the target element or child\n\t * @param element\n\t * @param attrName\n\t * @param {optional} defaultValue What to set the attr to if no value is found\n\t */\n\t function expect(element, attrName, defaultValue) {\n\t\n\t var node = angular.element(element)[0] || element;\n\t\n\t // if node exists and neither it nor its children have the attribute\n\t if (node &&\n\t ((!node.hasAttribute(attrName) ||\n\t node.getAttribute(attrName).length === 0) &&\n\t !childHasAttribute(node, attrName))) {\n\t\n\t defaultValue = angular.isString(defaultValue) ? defaultValue.trim() : '';\n\t if (defaultValue.length) {\n\t element.attr(attrName, defaultValue);\n\t } else if (showWarnings) {\n\t $log.warn('ARIA: Attribute \"', attrName, '\", required for accessibility, is missing on node:', node);\n\t }\n\t\n\t }\n\t }\n\t\n\t function expectAsync(element, attrName, defaultValueGetter) {\n\t // Problem: when retrieving the element's contents synchronously to find the label,\n\t // the text may not be defined yet in the case of a binding.\n\t // There is a higher chance that a binding will be defined if we wait one frame.\n\t $$rAF(function() {\n\t expect(element, attrName, defaultValueGetter());\n\t });\n\t }\n\t\n\t function expectWithText(element, attrName) {\n\t var content = getText(element) || \"\";\n\t var hasBinding = content.indexOf($interpolate.startSymbol()) > -1;\n\t\n\t if (hasBinding) {\n\t expectAsync(element, attrName, function() {\n\t return getText(element);\n\t });\n\t } else {\n\t expect(element, attrName, content);\n\t }\n\t }\n\t\n\t function expectWithoutText(element, attrName) {\n\t var content = getText(element);\n\t var hasBinding = content.indexOf($interpolate.startSymbol()) > -1;\n\t\n\t if ( !hasBinding && !content) {\n\t expect(element, attrName, content);\n\t }\n\t }\n\t\n\t function getText(element) {\n\t element = element[0] || element;\n\t var walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false);\n\t var text = '';\n\t\n\t var node;\n\t while (node = walker.nextNode()) {\n\t if (!isAriaHiddenNode(node)) {\n\t text += node.textContent;\n\t }\n\t }\n\t\n\t return text.trim() || '';\n\t\n\t function isAriaHiddenNode(node) {\n\t while (node.parentNode && (node = node.parentNode) !== element) {\n\t if (node.getAttribute && node.getAttribute('aria-hidden') === 'true') {\n\t return true;\n\t }\n\t }\n\t }\n\t }\n\t\n\t function childHasAttribute(node, attrName) {\n\t var hasChildren = node.hasChildNodes(),\n\t hasAttr = false;\n\t\n\t function isHidden(el) {\n\t var style = el.currentStyle ? el.currentStyle : $window.getComputedStyle(el);\n\t return (style.display === 'none');\n\t }\n\t\n\t if (hasChildren) {\n\t var children = node.childNodes;\n\t for (var i=0; i < children.length; i++) {\n\t var child = children[i];\n\t if (child.nodeType === 1 && child.hasAttribute(attrName)) {\n\t if (!isHidden(child)) {\n\t hasAttr = true;\n\t }\n\t }\n\t }\n\t }\n\t return hasAttr;\n\t }\n\t\n\t /**\n\t * Check if expected element has aria label attribute\n\t * @param element\n\t */\n\t function hasAriaLabel(element) {\n\t var node = angular.element(element)[0] || element;\n\t\n\t /* Check if compatible node type (ie: not HTML Document node) */\n\t if (!node.hasAttribute) {\n\t return false;\n\t }\n\t\n\t /* Check label or description attributes */\n\t return node.hasAttribute('aria-label') || node.hasAttribute('aria-labelledby') || node.hasAttribute('aria-describedby');\n\t }\n\t\n\t /**\n\t * Check if expected element's parent has aria label attribute and has valid role and tagName\n\t * @param element\n\t * @param {optional} level Number of levels deep search should be performed\n\t */\n\t function parentHasAriaLabel(element, level) {\n\t level = level || 1;\n\t var node = angular.element(element)[0] || element;\n\t if (!node.parentNode) {\n\t return false;\n\t }\n\t if (performCheck(node.parentNode)) {\n\t return true;\n\t }\n\t level--;\n\t if (level) {\n\t return parentHasAriaLabel(node.parentNode, level);\n\t }\n\t return false;\n\t\n\t function performCheck(parentNode) {\n\t if (!hasAriaLabel(parentNode)) {\n\t return false;\n\t }\n\t /* Perform role blacklist check */\n\t if (parentNode.hasAttribute('role')) {\n\t switch(parentNode.getAttribute('role').toLowerCase()) {\n\t case 'command':\n\t case 'definition':\n\t case 'directory':\n\t case 'grid':\n\t case 'list':\n\t case 'listitem':\n\t case 'log':\n\t case 'marquee':\n\t case 'menu':\n\t case 'menubar':\n\t case 'note':\n\t case 'presentation':\n\t case 'separator':\n\t case 'scrollbar':\n\t case 'status':\n\t case 'tablist':\n\t return false;\n\t }\n\t }\n\t /* Perform tagName blacklist check */\n\t switch(parentNode.tagName.toLowerCase()) {\n\t case 'abbr':\n\t case 'acronym':\n\t case 'address':\n\t case 'applet':\n\t case 'audio':\n\t case 'b':\n\t case 'bdi':\n\t case 'bdo':\n\t case 'big':\n\t case 'blockquote':\n\t case 'br':\n\t case 'canvas':\n\t case 'caption':\n\t case 'center':\n\t case 'cite':\n\t case 'code':\n\t case 'col':\n\t case 'data':\n\t case 'dd':\n\t case 'del':\n\t case 'dfn':\n\t case 'dir':\n\t case 'div':\n\t case 'dl':\n\t case 'em':\n\t case 'embed':\n\t case 'fieldset':\n\t case 'figcaption':\n\t case 'font':\n\t case 'h1':\n\t case 'h2':\n\t case 'h3':\n\t case 'h4':\n\t case 'h5':\n\t case 'h6':\n\t case 'hgroup':\n\t case 'html':\n\t case 'i':\n\t case 'ins':\n\t case 'isindex':\n\t case 'kbd':\n\t case 'keygen':\n\t case 'label':\n\t case 'legend':\n\t case 'li':\n\t case 'map':\n\t case 'mark':\n\t case 'menu':\n\t case 'object':\n\t case 'ol':\n\t case 'output':\n\t case 'pre':\n\t case 'presentation':\n\t case 'q':\n\t case 'rt':\n\t case 'ruby':\n\t case 'samp':\n\t case 'small':\n\t case 'source':\n\t case 'span':\n\t case 'status':\n\t case 'strike':\n\t case 'strong':\n\t case 'sub':\n\t case 'sup':\n\t case 'svg':\n\t case 'tbody':\n\t case 'td':\n\t case 'th':\n\t case 'thead':\n\t case 'time':\n\t case 'tr':\n\t case 'track':\n\t case 'tt':\n\t case 'ul':\n\t case 'var':\n\t return false;\n\t }\n\t return true;\n\t }\n\t }\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.core.interaction\n\t * @description\n\t * User interaction detection to provide proper accessibility.\n\t */\n\tMdInteractionService.$inject = [\"$timeout\", \"$mdUtil\"];\n\tangular\n\t .module('material.core.interaction', [])\n\t .service('$mdInteraction', MdInteractionService);\n\t\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdInteraction\n\t * @module material.core.interaction\n\t *\n\t * @description\n\t *\n\t * Service which keeps track of the last interaction type and validates them for several browsers.\n\t * The service hooks into the document's body and listens for touch, mouse and keyboard events.\n\t *\n\t * The most recent interaction type can be retrieved by calling the `getLastInteractionType` method.\n\t *\n\t * Here is an example markup for using the interaction service.\n\t *\n\t * \n\t * var lastType = $mdInteraction.getLastInteractionType();\n\t *\n\t * if (lastType === 'keyboard') {\n\t * // We only restore the focus for keyboard users.\n\t * restoreFocus();\n\t * }\n\t * \n\t *\n\t */\n\tfunction MdInteractionService($timeout, $mdUtil) {\n\t this.$timeout = $timeout;\n\t this.$mdUtil = $mdUtil;\n\t\n\t this.bodyElement = angular.element(document.body);\n\t this.isBuffering = false;\n\t this.bufferTimeout = null;\n\t this.lastInteractionType = null;\n\t this.lastInteractionTime = null;\n\t\n\t // Type Mappings for the different events\n\t // There will be three three interaction types\n\t // `keyboard`, `mouse` and `touch`\n\t // type `pointer` will be evaluated in `pointerMap` for IE Browser events\n\t this.inputEventMap = {\n\t 'keydown': 'keyboard',\n\t 'mousedown': 'mouse',\n\t 'mouseenter': 'mouse',\n\t 'touchstart': 'touch',\n\t 'pointerdown': 'pointer',\n\t 'MSPointerDown': 'pointer'\n\t };\n\t\n\t // IE PointerDown events will be validated in `touch` or `mouse`\n\t // Index numbers referenced here: https://msdn.microsoft.com/library/windows/apps/hh466130.aspx\n\t this.iePointerMap = {\n\t 2: 'touch',\n\t 3: 'touch',\n\t 4: 'mouse'\n\t };\n\t\n\t this.initializeEvents();\n\t}\n\t\n\t/**\n\t * Initializes the interaction service, by registering all interaction events to the\n\t * body element.\n\t */\n\tMdInteractionService.prototype.initializeEvents = function() {\n\t // IE browsers can also trigger pointer events, which also leads to an interaction.\n\t var pointerEvent = 'MSPointerEvent' in window ? 'MSPointerDown' : 'PointerEvent' in window ? 'pointerdown' : null;\n\t\n\t this.bodyElement.on('keydown mousedown', this.onInputEvent.bind(this));\n\t\n\t if ('ontouchstart' in document.documentElement) {\n\t this.bodyElement.on('touchstart', this.onBufferInputEvent.bind(this));\n\t }\n\t\n\t if (pointerEvent) {\n\t this.bodyElement.on(pointerEvent, this.onInputEvent.bind(this));\n\t }\n\t\n\t};\n\t\n\t/**\n\t * Event listener for normal interaction events, which should be tracked.\n\t * @param event {MouseEvent|KeyboardEvent|PointerEvent|TouchEvent}\n\t */\n\tMdInteractionService.prototype.onInputEvent = function(event) {\n\t if (this.isBuffering) {\n\t return;\n\t }\n\t\n\t var type = this.inputEventMap[event.type];\n\t\n\t if (type === 'pointer') {\n\t type = this.iePointerMap[event.pointerType] || event.pointerType;\n\t }\n\t\n\t this.lastInteractionType = type;\n\t this.lastInteractionTime = this.$mdUtil.now();\n\t};\n\t\n\t/**\n\t * Event listener for interaction events which should be buffered (touch events).\n\t * @param event {TouchEvent}\n\t */\n\tMdInteractionService.prototype.onBufferInputEvent = function(event) {\n\t this.$timeout.cancel(this.bufferTimeout);\n\t\n\t this.onInputEvent(event);\n\t this.isBuffering = true;\n\t\n\t // The timeout of 650ms is needed to delay the touchstart, because otherwise the touch will call\n\t // the `onInput` function multiple times.\n\t this.bufferTimeout = this.$timeout(function() {\n\t this.isBuffering = false;\n\t }.bind(this), 650, false);\n\t\n\t};\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdInteraction#getLastInteractionType\n\t * @description Retrieves the last interaction type triggered in body.\n\t * @returns {string|null} Last interaction type.\n\t */\n\tMdInteractionService.prototype.getLastInteractionType = function() {\n\t return this.lastInteractionType;\n\t};\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdInteraction#isUserInvoked\n\t * @description Method to detect whether any interaction happened recently or not.\n\t * @param {number=} checkDelay Time to check for any interaction to have been triggered.\n\t * @returns {boolean} Whether there was any interaction or not.\n\t */\n\tMdInteractionService.prototype.isUserInvoked = function(checkDelay) {\n\t var delay = angular.isNumber(checkDelay) ? checkDelay : 15;\n\t\n\t // Check for any interaction to be within the specified check time.\n\t return this.lastInteractionTime >= this.$mdUtil.now() - delay;\n\t};\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t\n\tMdGesture.$inject = [\"$$MdGestureHandler\", \"$$rAF\", \"$timeout\"];\n\tattachToDocument.$inject = [\"$mdGesture\", \"$$MdGestureHandler\"];var HANDLERS = {};\n\t\n\t/* The state of the current 'pointer'\n\t * The pointer represents the state of the current touch.\n\t * It contains normalized x and y coordinates from DOM events,\n\t * as well as other information abstracted from the DOM.\n\t */\n\t\n\tvar pointer, lastPointer, forceSkipClickHijack = false;\n\t\n\t/**\n\t * The position of the most recent click if that click was on a label element.\n\t * @type {{x: number, y: number}?}\n\t */\n\tvar lastLabelClickPos = null;\n\t\n\t// Used to attach event listeners once when multiple ng-apps are running.\n\tvar isInitialized = false;\n\t\n\tangular\n\t .module('material.core.gestures', [ ])\n\t .provider('$mdGesture', MdGestureProvider)\n\t .factory('$$MdGestureHandler', MdGestureHandler)\n\t .run( attachToDocument );\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdGestureProvider\n\t * @module material.core.gestures\n\t *\n\t * @description\n\t * In some scenarios on Mobile devices (without jQuery), the click events should NOT be hijacked.\n\t * `$mdGestureProvider` is used to configure the Gesture module to ignore or skip click hijacking on mobile\n\t * devices.\n\t *\n\t * \n\t * app.config(function($mdGestureProvider) {\n\t *\n\t * // For mobile devices without jQuery loaded, do not\n\t * // intercept click events during the capture phase.\n\t * $mdGestureProvider.skipClickHijack();\n\t *\n\t * });\n\t * \n\t *\n\t */\n\tfunction MdGestureProvider() { }\n\t\n\tMdGestureProvider.prototype = {\n\t\n\t // Publish access to setter to configure a variable BEFORE the\n\t // $mdGesture service is instantiated...\n\t skipClickHijack: function() {\n\t return forceSkipClickHijack = true;\n\t },\n\t\n\t /**\n\t * $get is used to build an instance of $mdGesture\n\t * @ngInject\n\t */\n\t $get : [\"$$MdGestureHandler\", \"$$rAF\", \"$timeout\", function($$MdGestureHandler, $$rAF, $timeout) {\n\t return new MdGesture($$MdGestureHandler, $$rAF, $timeout);\n\t }]\n\t};\n\t\n\t\n\t\n\t/**\n\t * MdGesture factory construction function\n\t * @ngInject\n\t */\n\tfunction MdGesture($$MdGestureHandler, $$rAF, $timeout) {\n\t var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n\t var isIos = userAgent.match(/ipad|iphone|ipod/i);\n\t var isAndroid = userAgent.match(/android/i);\n\t var touchActionProperty = getTouchAction();\n\t var hasJQuery = (typeof window.jQuery !== 'undefined') && (angular.element === window.jQuery);\n\t\n\t var self = {\n\t handler: addHandler,\n\t register: register,\n\t // On mobile w/out jQuery, we normally intercept clicks. Should we skip that?\n\t isHijackingClicks: (isIos || isAndroid) && !hasJQuery && !forceSkipClickHijack\n\t };\n\t\n\t if (self.isHijackingClicks) {\n\t var maxClickDistance = 6;\n\t self.handler('click', {\n\t options: {\n\t maxDistance: maxClickDistance\n\t },\n\t onEnd: checkDistanceAndEmit('click')\n\t });\n\t\n\t self.handler('focus', {\n\t options: {\n\t maxDistance: maxClickDistance\n\t },\n\t onEnd: function(ev, pointer) {\n\t if (pointer.distance < this.state.options.maxDistance) {\n\t if (canFocus(ev.target)) {\n\t this.dispatchEvent(ev, 'focus', pointer);\n\t ev.target.focus();\n\t }\n\t }\n\t\n\t function canFocus(element) {\n\t var focusableElements = ['INPUT', 'SELECT', 'BUTTON', 'TEXTAREA', 'VIDEO', 'AUDIO'];\n\t\n\t return (element.getAttribute('tabindex') != '-1') &&\n\t !element.hasAttribute('DISABLED') &&\n\t (element.hasAttribute('tabindex') || element.hasAttribute('href') || element.isContentEditable ||\n\t (focusableElements.indexOf(element.nodeName) != -1));\n\t }\n\t }\n\t });\n\t\n\t self.handler('mouseup', {\n\t options: {\n\t maxDistance: maxClickDistance\n\t },\n\t onEnd: checkDistanceAndEmit('mouseup')\n\t });\n\t\n\t self.handler('mousedown', {\n\t onStart: function(ev) {\n\t this.dispatchEvent(ev, 'mousedown');\n\t }\n\t });\n\t }\n\t\n\t function checkDistanceAndEmit(eventName) {\n\t return function(ev, pointer) {\n\t if (pointer.distance < this.state.options.maxDistance) {\n\t this.dispatchEvent(ev, eventName, pointer);\n\t }\n\t };\n\t }\n\t\n\t /*\n\t * Register an element to listen for a handler.\n\t * This allows an element to override the default options for a handler.\n\t * Additionally, some handlers like drag and hold only dispatch events if\n\t * the domEvent happens inside an element that's registered to listen for these events.\n\t *\n\t * @see GestureHandler for how overriding of default options works.\n\t * @example $mdGesture.register(myElement, 'drag', { minDistance: 20, horziontal: false })\n\t */\n\t function register(element, handlerName, options) {\n\t var handler = HANDLERS[handlerName.replace(/^\\$md./, '')];\n\t if (!handler) {\n\t throw new Error('Failed to register element with handler ' + handlerName + '. ' +\n\t 'Available handlers: ' + Object.keys(HANDLERS).join(', '));\n\t }\n\t return handler.registerElement(element, options);\n\t }\n\t\n\t /*\n\t * add a handler to $mdGesture. see below.\n\t */\n\t function addHandler(name, definition) {\n\t var handler = new $$MdGestureHandler(name);\n\t angular.extend(handler, definition);\n\t HANDLERS[name] = handler;\n\t\n\t return self;\n\t }\n\t\n\t /*\n\t * Register handlers. These listen to touch/start/move events, interpret them,\n\t * and dispatch gesture events depending on options & conditions. These are all\n\t * instances of GestureHandler.\n\t * @see GestureHandler\n\t */\n\t return self\n\t /*\n\t * The press handler dispatches an event on touchdown/touchend.\n\t * It's a simple abstraction of touch/mouse/pointer start and end.\n\t */\n\t .handler('press', {\n\t onStart: function (ev, pointer) {\n\t this.dispatchEvent(ev, '$md.pressdown');\n\t },\n\t onEnd: function (ev, pointer) {\n\t this.dispatchEvent(ev, '$md.pressup');\n\t }\n\t })\n\t\n\t /*\n\t * The hold handler dispatches an event if the user keeps their finger within\n\t * the same area for ms.\n\t * The hold handler will only run if a parent of the touch target is registered\n\t * to listen for hold events through $mdGesture.register()\n\t */\n\t .handler('hold', {\n\t options: {\n\t maxDistance: 6,\n\t delay: 500\n\t },\n\t onCancel: function () {\n\t $timeout.cancel(this.state.timeout);\n\t },\n\t onStart: function (ev, pointer) {\n\t // For hold, require a parent to be registered with $mdGesture.register()\n\t // Because we prevent scroll events, this is necessary.\n\t if (!this.state.registeredParent) return this.cancel();\n\t\n\t this.state.pos = {x: pointer.x, y: pointer.y};\n\t this.state.timeout = $timeout(angular.bind(this, function holdDelayFn() {\n\t this.dispatchEvent(ev, '$md.hold');\n\t this.cancel(); //we're done!\n\t }), this.state.options.delay, false);\n\t },\n\t onMove: function (ev, pointer) {\n\t // Don't scroll while waiting for hold.\n\t // If we don't preventDefault touchmove events here, Android will assume we don't\n\t // want to listen to anymore touch events. It will start scrolling and stop sending\n\t // touchmove events.\n\t if (!touchActionProperty && ev.type === 'touchmove') ev.preventDefault();\n\t\n\t // If the user moves greater than pixels, stop the hold timer\n\t // set in onStart\n\t var dx = this.state.pos.x - pointer.x;\n\t var dy = this.state.pos.y - pointer.y;\n\t if (Math.sqrt(dx * dx + dy * dy) > this.options.maxDistance) {\n\t this.cancel();\n\t }\n\t },\n\t onEnd: function () {\n\t this.onCancel();\n\t }\n\t })\n\t\n\t /*\n\t * The drag handler dispatches a drag event if the user holds and moves his finger greater than\n\t * px in the x or y direction, depending on options.horizontal.\n\t * The drag will be cancelled if the user moves his finger greater than * in\n\t * the perpendicular direction. Eg if the drag is horizontal and the user moves his finger *\n\t * pixels vertically, this handler won't consider the move part of a drag.\n\t */\n\t .handler('drag', {\n\t options: {\n\t minDistance: 6,\n\t horizontal: true,\n\t cancelMultiplier: 1.5\n\t },\n\t onSetup: function(element, options) {\n\t if (touchActionProperty) {\n\t // We check for horizontal to be false, because otherwise we would overwrite the default opts.\n\t this.oldTouchAction = element[0].style[touchActionProperty];\n\t element[0].style[touchActionProperty] = options.horizontal ? 'pan-y' : 'pan-x';\n\t }\n\t },\n\t onCleanup: function(element) {\n\t if (this.oldTouchAction) {\n\t element[0].style[touchActionProperty] = this.oldTouchAction;\n\t }\n\t },\n\t onStart: function (ev) {\n\t // For drag, require a parent to be registered with $mdGesture.register()\n\t if (!this.state.registeredParent) this.cancel();\n\t },\n\t onMove: function (ev, pointer) {\n\t var shouldStartDrag, shouldCancel;\n\t // Don't scroll while deciding if this touchmove qualifies as a drag event.\n\t // If we don't preventDefault touchmove events here, Android will assume we don't\n\t // want to listen to anymore touch events. It will start scrolling and stop sending\n\t // touchmove events.\n\t if (!touchActionProperty && ev.type === 'touchmove') ev.preventDefault();\n\t\n\t if (!this.state.dragPointer) {\n\t if (this.state.options.horizontal) {\n\t shouldStartDrag = Math.abs(pointer.distanceX) > this.state.options.minDistance;\n\t shouldCancel = Math.abs(pointer.distanceY) > this.state.options.minDistance * this.state.options.cancelMultiplier;\n\t } else {\n\t shouldStartDrag = Math.abs(pointer.distanceY) > this.state.options.minDistance;\n\t shouldCancel = Math.abs(pointer.distanceX) > this.state.options.minDistance * this.state.options.cancelMultiplier;\n\t }\n\t\n\t if (shouldStartDrag) {\n\t // Create a new pointer representing this drag, starting at this point where the drag started.\n\t this.state.dragPointer = makeStartPointer(ev);\n\t updatePointerState(ev, this.state.dragPointer);\n\t this.dispatchEvent(ev, '$md.dragstart', this.state.dragPointer);\n\t\n\t } else if (shouldCancel) {\n\t this.cancel();\n\t }\n\t } else {\n\t this.dispatchDragMove(ev);\n\t }\n\t },\n\t // Only dispatch dragmove events every frame; any more is unnecessary\n\t dispatchDragMove: $$rAF.throttle(function (ev) {\n\t // Make sure the drag didn't stop while waiting for the next frame\n\t if (this.state.isRunning) {\n\t updatePointerState(ev, this.state.dragPointer);\n\t this.dispatchEvent(ev, '$md.drag', this.state.dragPointer);\n\t }\n\t }),\n\t onEnd: function (ev, pointer) {\n\t if (this.state.dragPointer) {\n\t updatePointerState(ev, this.state.dragPointer);\n\t this.dispatchEvent(ev, '$md.dragend', this.state.dragPointer);\n\t }\n\t }\n\t })\n\t\n\t /*\n\t * The swipe handler will dispatch a swipe event if, on the end of a touch,\n\t * the velocity and distance were high enough.\n\t */\n\t .handler('swipe', {\n\t options: {\n\t minVelocity: 0.65,\n\t minDistance: 10\n\t },\n\t onEnd: function (ev, pointer) {\n\t var eventType;\n\t\n\t if (Math.abs(pointer.velocityX) > this.state.options.minVelocity &&\n\t Math.abs(pointer.distanceX) > this.state.options.minDistance) {\n\t eventType = pointer.directionX == 'left' ? '$md.swipeleft' : '$md.swiperight';\n\t this.dispatchEvent(ev, eventType);\n\t }\n\t else if (Math.abs(pointer.velocityY) > this.state.options.minVelocity &&\n\t Math.abs(pointer.distanceY) > this.state.options.minDistance) {\n\t eventType = pointer.directionY == 'up' ? '$md.swipeup' : '$md.swipedown';\n\t this.dispatchEvent(ev, eventType);\n\t }\n\t }\n\t });\n\t\n\t function getTouchAction() {\n\t var testEl = document.createElement('div');\n\t var vendorPrefixes = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n\t\n\t for (var i = 0; i < vendorPrefixes.length; i++) {\n\t var prefix = vendorPrefixes[i];\n\t var property = prefix ? prefix + 'TouchAction' : 'touchAction';\n\t if (angular.isDefined(testEl.style[property])) {\n\t return property;\n\t }\n\t }\n\t }\n\t\n\t}\n\t\n\t/**\n\t * MdGestureHandler\n\t * A GestureHandler is an object which is able to dispatch custom dom events\n\t * based on native dom {touch,pointer,mouse}{start,move,end} events.\n\t *\n\t * A gesture will manage its lifecycle through the start,move,end, and cancel\n\t * functions, which are called by native dom events.\n\t *\n\t * A gesture has the concept of 'options' (eg a swipe's required velocity), which can be\n\t * overridden by elements registering through $mdGesture.register()\n\t */\n\tfunction GestureHandler (name) {\n\t this.name = name;\n\t this.state = {};\n\t}\n\t\n\tfunction MdGestureHandler() {\n\t var hasJQuery = (typeof window.jQuery !== 'undefined') && (angular.element === window.jQuery);\n\t\n\t GestureHandler.prototype = {\n\t options: {},\n\t // jQuery listeners don't work with custom DOMEvents, so we have to dispatch events\n\t // differently when jQuery is loaded\n\t dispatchEvent: hasJQuery ? jQueryDispatchEvent : nativeDispatchEvent,\n\t\n\t // These are overridden by the registered handler\n\t onSetup: angular.noop,\n\t onCleanup: angular.noop,\n\t onStart: angular.noop,\n\t onMove: angular.noop,\n\t onEnd: angular.noop,\n\t onCancel: angular.noop,\n\t\n\t // onStart sets up a new state for the handler, which includes options from the\n\t // nearest registered parent element of ev.target.\n\t start: function (ev, pointer) {\n\t if (this.state.isRunning) return;\n\t var parentTarget = this.getNearestParent(ev.target);\n\t // Get the options from the nearest registered parent\n\t var parentTargetOptions = parentTarget && parentTarget.$mdGesture[this.name] || {};\n\t\n\t this.state = {\n\t isRunning: true,\n\t // Override the default options with the nearest registered parent's options\n\t options: angular.extend({}, this.options, parentTargetOptions),\n\t // Pass in the registered parent node to the state so the onStart listener can use\n\t registeredParent: parentTarget\n\t };\n\t this.onStart(ev, pointer);\n\t },\n\t move: function (ev, pointer) {\n\t if (!this.state.isRunning) return;\n\t this.onMove(ev, pointer);\n\t },\n\t end: function (ev, pointer) {\n\t if (!this.state.isRunning) return;\n\t this.onEnd(ev, pointer);\n\t this.state.isRunning = false;\n\t },\n\t cancel: function (ev, pointer) {\n\t this.onCancel(ev, pointer);\n\t this.state = {};\n\t },\n\t\n\t // Find and return the nearest parent element that has been registered to\n\t // listen for this handler via $mdGesture.register(element, 'handlerName').\n\t getNearestParent: function (node) {\n\t var current = node;\n\t while (current) {\n\t if ((current.$mdGesture || {})[this.name]) {\n\t return current;\n\t }\n\t current = current.parentNode;\n\t }\n\t return null;\n\t },\n\t\n\t // Called from $mdGesture.register when an element registers itself with a handler.\n\t // Store the options the user gave on the DOMElement itself. These options will\n\t // be retrieved with getNearestParent when the handler starts.\n\t registerElement: function (element, options) {\n\t var self = this;\n\t element[0].$mdGesture = element[0].$mdGesture || {};\n\t element[0].$mdGesture[this.name] = options || {};\n\t element.on('$destroy', onDestroy);\n\t\n\t self.onSetup(element, options || {});\n\t\n\t return onDestroy;\n\t\n\t function onDestroy() {\n\t delete element[0].$mdGesture[self.name];\n\t element.off('$destroy', onDestroy);\n\t\n\t self.onCleanup(element, options || {});\n\t }\n\t }\n\t };\n\t\n\t return GestureHandler;\n\t\n\t /*\n\t * Dispatch an event with jQuery\n\t * TODO: Make sure this sends bubbling events\n\t *\n\t * @param srcEvent the original DOM touch event that started this.\n\t * @param eventType the name of the custom event to send (eg 'click' or '$md.drag')\n\t * @param eventPointer the pointer object that matches this event.\n\t */\n\t function jQueryDispatchEvent(srcEvent, eventType, eventPointer) {\n\t eventPointer = eventPointer || pointer;\n\t var eventObj = new angular.element.Event(eventType);\n\t\n\t eventObj.$material = true;\n\t eventObj.pointer = eventPointer;\n\t eventObj.srcEvent = srcEvent;\n\t\n\t angular.extend(eventObj, {\n\t clientX: eventPointer.x,\n\t clientY: eventPointer.y,\n\t screenX: eventPointer.x,\n\t screenY: eventPointer.y,\n\t pageX: eventPointer.x,\n\t pageY: eventPointer.y,\n\t ctrlKey: srcEvent.ctrlKey,\n\t altKey: srcEvent.altKey,\n\t shiftKey: srcEvent.shiftKey,\n\t metaKey: srcEvent.metaKey\n\t });\n\t angular.element(eventPointer.target).trigger(eventObj);\n\t }\n\t\n\t /*\n\t * NOTE: nativeDispatchEvent is very performance sensitive.\n\t * @param srcEvent the original DOM touch event that started this.\n\t * @param eventType the name of the custom event to send (eg 'click' or '$md.drag')\n\t * @param eventPointer the pointer object that matches this event.\n\t */\n\t function nativeDispatchEvent(srcEvent, eventType, eventPointer) {\n\t eventPointer = eventPointer || pointer;\n\t var eventObj;\n\t\n\t if (eventType === 'click' || eventType == 'mouseup' || eventType == 'mousedown' ) {\n\t eventObj = document.createEvent('MouseEvents');\n\t eventObj.initMouseEvent(\n\t eventType, true, true, window, srcEvent.detail,\n\t eventPointer.x, eventPointer.y, eventPointer.x, eventPointer.y,\n\t srcEvent.ctrlKey, srcEvent.altKey, srcEvent.shiftKey, srcEvent.metaKey,\n\t srcEvent.button, srcEvent.relatedTarget || null\n\t );\n\t\n\t } else {\n\t eventObj = document.createEvent('CustomEvent');\n\t eventObj.initCustomEvent(eventType, true, true, {});\n\t }\n\t eventObj.$material = true;\n\t eventObj.pointer = eventPointer;\n\t eventObj.srcEvent = srcEvent;\n\t eventPointer.target.dispatchEvent(eventObj);\n\t }\n\t\n\t}\n\t\n\t/**\n\t * Attach Gestures: hook document and check shouldHijack clicks\n\t * @ngInject\n\t */\n\tfunction attachToDocument( $mdGesture, $$MdGestureHandler ) {\n\t\n\t // Polyfill document.contains for IE11.\n\t // TODO: move to util\n\t document.contains || (document.contains = function (node) {\n\t return document.body.contains(node);\n\t });\n\t\n\t if (!isInitialized && $mdGesture.isHijackingClicks ) {\n\t /*\n\t * If hijack clicks is true, we preventDefault any click that wasn't\n\t * sent by AngularJS Material. This is because on older Android & iOS, a false, or 'ghost',\n\t * click event will be sent ~400ms after a touchend event happens.\n\t * The only way to know if this click is real is to prevent any normal\n\t * click events, and add a flag to events sent by material so we know not to prevent those.\n\t *\n\t * Two exceptions to click events that should be prevented are:\n\t * - click events sent by the keyboard (eg form submit)\n\t * - events that originate from an Ionic app\n\t */\n\t document.addEventListener('click' , clickHijacker , true);\n\t document.addEventListener('mouseup' , mouseInputHijacker, true);\n\t document.addEventListener('mousedown', mouseInputHijacker, true);\n\t document.addEventListener('focus' , mouseInputHijacker, true);\n\t\n\t isInitialized = true;\n\t }\n\t\n\t function mouseInputHijacker(ev) {\n\t var isKeyClick = !ev.clientX && !ev.clientY;\n\t if (!isKeyClick && !ev.$material && !ev.isIonicTap\n\t && !isInputEventFromLabelClick(ev)) {\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t }\n\t }\n\t\n\t function clickHijacker(ev) {\n\t var isKeyClick = ev.clientX === 0 && ev.clientY === 0;\n\t var isSubmitEvent = ev.target && ev.target.type === 'submit';\n\t if (!isKeyClick && !ev.$material && !ev.isIonicTap\n\t && !isInputEventFromLabelClick(ev)\n\t && !isSubmitEvent) {\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t lastLabelClickPos = null;\n\t } else {\n\t lastLabelClickPos = null;\n\t if (ev.target.tagName.toLowerCase() == 'label') {\n\t lastLabelClickPos = {x: ev.x, y: ev.y};\n\t }\n\t }\n\t }\n\t\n\t\n\t // Listen to all events to cover all platforms.\n\t var START_EVENTS = 'mousedown touchstart pointerdown';\n\t var MOVE_EVENTS = 'mousemove touchmove pointermove';\n\t var END_EVENTS = 'mouseup mouseleave touchend touchcancel pointerup pointercancel';\n\t\n\t angular.element(document)\n\t .on(START_EVENTS, gestureStart)\n\t .on(MOVE_EVENTS, gestureMove)\n\t .on(END_EVENTS, gestureEnd)\n\t // For testing\n\t .on('$$mdGestureReset', function gestureClearCache () {\n\t lastPointer = pointer = null;\n\t });\n\t\n\t /*\n\t * When a DOM event happens, run all registered gesture handlers' lifecycle\n\t * methods which match the DOM event.\n\t * Eg when a 'touchstart' event happens, runHandlers('start') will call and\n\t * run `handler.cancel()` and `handler.start()` on all registered handlers.\n\t */\n\t function runHandlers(handlerEvent, event) {\n\t var handler;\n\t for (var name in HANDLERS) {\n\t handler = HANDLERS[name];\n\t if( handler instanceof $$MdGestureHandler ) {\n\t\n\t if (handlerEvent === 'start') {\n\t // Run cancel to reset any handlers' state\n\t handler.cancel();\n\t }\n\t handler[handlerEvent](event, pointer);\n\t\n\t }\n\t }\n\t }\n\t\n\t /*\n\t * gestureStart vets if a start event is legitimate (and not part of a 'ghost click' from iOS/Android)\n\t * If it is legitimate, we initiate the pointer state and mark the current pointer's type\n\t * For example, for a touchstart event, mark the current pointer as a 'touch' pointer, so mouse events\n\t * won't effect it.\n\t */\n\t function gestureStart(ev) {\n\t // If we're already touched down, abort\n\t if (pointer) return;\n\t\n\t var now = +Date.now();\n\t\n\t // iOS & old android bug: after a touch event, a click event is sent 350 ms later.\n\t // If <400ms have passed, don't allow an event of a different type than the previous event\n\t if (lastPointer && !typesMatch(ev, lastPointer) && (now - lastPointer.endTime < 1500)) {\n\t return;\n\t }\n\t\n\t pointer = makeStartPointer(ev);\n\t\n\t runHandlers('start', ev);\n\t }\n\t /*\n\t * If a move event happens of the right type, update the pointer and run all the move handlers.\n\t * \"of the right type\": if a mousemove happens but our pointer started with a touch event, do nothing.\n\t */\n\t function gestureMove(ev) {\n\t if (!pointer || !typesMatch(ev, pointer)) return;\n\t\n\t updatePointerState(ev, pointer);\n\t runHandlers('move', ev);\n\t }\n\t /*\n\t * If an end event happens of the right type, update the pointer, run endHandlers, and save the pointer as 'lastPointer'\n\t */\n\t function gestureEnd(ev) {\n\t if (!pointer || !typesMatch(ev, pointer)) return;\n\t\n\t updatePointerState(ev, pointer);\n\t pointer.endTime = +Date.now();\n\t\n\t runHandlers('end', ev);\n\t\n\t lastPointer = pointer;\n\t pointer = null;\n\t }\n\t\n\t}\n\t\n\t// ********************\n\t// Module Functions\n\t// ********************\n\t\n\t/*\n\t * Initiate the pointer. x, y, and the pointer's type.\n\t */\n\tfunction makeStartPointer(ev) {\n\t var point = getEventPoint(ev);\n\t var startPointer = {\n\t startTime: +Date.now(),\n\t target: ev.target,\n\t // 'p' for pointer events, 'm' for mouse, 't' for touch\n\t type: ev.type.charAt(0)\n\t };\n\t startPointer.startX = startPointer.x = point.pageX;\n\t startPointer.startY = startPointer.y = point.pageY;\n\t return startPointer;\n\t}\n\t\n\t/*\n\t * return whether the pointer's type matches the event's type.\n\t * Eg if a touch event happens but the pointer has a mouse type, return false.\n\t */\n\tfunction typesMatch(ev, pointer) {\n\t return ev && pointer && ev.type.charAt(0) === pointer.type;\n\t}\n\t\n\t/**\n\t * Gets whether the given event is an input event that was caused by clicking on an\n\t * associated label element.\n\t *\n\t * This is necessary because the browser will, upon clicking on a label element, fire an\n\t * *extra* click event on its associated input (if any). mdGesture is able to flag the label\n\t * click as with `$material` correctly, but not the second input click.\n\t *\n\t * In order to determine whether an input event is from a label click, we compare the (x, y) for\n\t * the event to the (x, y) for the most recent label click (which is cleared whenever a non-label\n\t * click occurs). Unfortunately, there are no event properties that tie the input and the label\n\t * together (such as relatedTarget).\n\t *\n\t * @param {MouseEvent} event\n\t * @returns {boolean}\n\t */\n\tfunction isInputEventFromLabelClick(event) {\n\t return lastLabelClickPos\n\t && lastLabelClickPos.x == event.x\n\t && lastLabelClickPos.y == event.y;\n\t}\n\t\n\t/*\n\t * Update the given pointer based upon the given DOMEvent.\n\t * Distance, velocity, direction, duration, etc\n\t */\n\tfunction updatePointerState(ev, pointer) {\n\t var point = getEventPoint(ev);\n\t var x = pointer.x = point.pageX;\n\t var y = pointer.y = point.pageY;\n\t\n\t pointer.distanceX = x - pointer.startX;\n\t pointer.distanceY = y - pointer.startY;\n\t pointer.distance = Math.sqrt(\n\t pointer.distanceX * pointer.distanceX + pointer.distanceY * pointer.distanceY\n\t );\n\t\n\t pointer.directionX = pointer.distanceX > 0 ? 'right' : pointer.distanceX < 0 ? 'left' : '';\n\t pointer.directionY = pointer.distanceY > 0 ? 'down' : pointer.distanceY < 0 ? 'up' : '';\n\t\n\t pointer.duration = +Date.now() - pointer.startTime;\n\t pointer.velocityX = pointer.distanceX / pointer.duration;\n\t pointer.velocityY = pointer.distanceY / pointer.duration;\n\t}\n\t\n\t/*\n\t * Normalize the point where the DOM event happened whether it's touch or mouse.\n\t * @returns point event obj with pageX and pageY on it.\n\t */\n\tfunction getEventPoint(ev) {\n\t ev = ev.originalEvent || ev; // support jQuery events\n\t return (ev.touches && ev.touches[0]) ||\n\t (ev.changedTouches && ev.changedTouches[0]) ||\n\t ev;\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\tangular.module('material.core')\n\t .provider('$$interimElement', InterimElementProvider);\n\t\n\t/*\n\t * @ngdoc service\n\t * @name $$interimElement\n\t * @module material.core\n\t *\n\t * @description\n\t *\n\t * Factory that contructs `$$interimElement.$service` services.\n\t * Used internally in material design for elements that appear on screen temporarily.\n\t * The service provides a promise-like API for interacting with the temporary\n\t * elements.\n\t *\n\t * ```js\n\t * app.service('$mdToast', function($$interimElement) {\n\t * var $mdToast = $$interimElement(toastDefaultOptions);\n\t * return $mdToast;\n\t * });\n\t * ```\n\t * @param {object=} defaultOptions Options used by default for the `show` method on the service.\n\t *\n\t * @returns {$$interimElement.$service}\n\t *\n\t */\n\t\n\tfunction InterimElementProvider() {\n\t InterimElementFactory.$inject = [\"$document\", \"$q\", \"$rootScope\", \"$timeout\", \"$rootElement\", \"$animate\", \"$mdUtil\", \"$mdCompiler\", \"$mdTheming\", \"$injector\", \"$exceptionHandler\"];\n\t createInterimElementProvider.$get = InterimElementFactory;\n\t return createInterimElementProvider;\n\t\n\t /**\n\t * Returns a new provider which allows configuration of a new interimElement\n\t * service. Allows configuration of default options & methods for options,\n\t * as well as configuration of 'preset' methods (eg dialog.basic(): basic is a preset method)\n\t */\n\t function createInterimElementProvider(interimFactoryName) {\n\t factory.$inject = [\"$$interimElement\", \"$injector\"];\n\t var EXPOSED_METHODS = ['onHide', 'onShow', 'onRemove'];\n\t\n\t var customMethods = {};\n\t var providerConfig = {\n\t presets: {}\n\t };\n\t\n\t var provider = {\n\t setDefaults: setDefaults,\n\t addPreset: addPreset,\n\t addMethod: addMethod,\n\t $get: factory\n\t };\n\t\n\t /**\n\t * all interim elements will come with the 'build' preset\n\t */\n\t provider.addPreset('build', {\n\t methods: ['controller', 'controllerAs', 'resolve', 'multiple',\n\t 'template', 'templateUrl', 'themable', 'transformTemplate', 'parent', 'contentElement']\n\t });\n\t\n\t return provider;\n\t\n\t /**\n\t * Save the configured defaults to be used when the factory is instantiated\n\t */\n\t function setDefaults(definition) {\n\t providerConfig.optionsFactory = definition.options;\n\t providerConfig.methods = (definition.methods || []).concat(EXPOSED_METHODS);\n\t return provider;\n\t }\n\t\n\t /**\n\t * Add a method to the factory that isn't specific to any interim element operations\n\t */\n\t\n\t function addMethod(name, fn) {\n\t customMethods[name] = fn;\n\t return provider;\n\t }\n\t\n\t /**\n\t * Save the configured preset to be used when the factory is instantiated\n\t */\n\t function addPreset(name, definition) {\n\t definition = definition || {};\n\t definition.methods = definition.methods || [];\n\t definition.options = definition.options || function() { return {}; };\n\t\n\t if (/^cancel|hide|show$/.test(name)) {\n\t throw new Error(\"Preset '\" + name + \"' in \" + interimFactoryName + \" is reserved!\");\n\t }\n\t if (definition.methods.indexOf('_options') > -1) {\n\t throw new Error(\"Method '_options' in \" + interimFactoryName + \" is reserved!\");\n\t }\n\t providerConfig.presets[name] = {\n\t methods: definition.methods.concat(EXPOSED_METHODS),\n\t optionsFactory: definition.options,\n\t argOption: definition.argOption\n\t };\n\t return provider;\n\t }\n\t\n\t function addPresetMethod(presetName, methodName, method) {\n\t providerConfig.presets[presetName][methodName] = method;\n\t }\n\t\n\t /**\n\t * Create a factory that has the given methods & defaults implementing interimElement\n\t */\n\t /* @ngInject */\n\t function factory($$interimElement, $injector) {\n\t var defaultMethods;\n\t var defaultOptions;\n\t var interimElementService = $$interimElement();\n\t\n\t /*\n\t * publicService is what the developer will be using.\n\t * It has methods hide(), cancel(), show(), build(), and any other\n\t * presets which were set during the config phase.\n\t */\n\t var publicService = {\n\t hide: interimElementService.hide,\n\t cancel: interimElementService.cancel,\n\t show: showInterimElement,\n\t\n\t // Special internal method to destroy an interim element without animations\n\t // used when navigation changes causes a $scope.$destroy() action\n\t destroy : destroyInterimElement\n\t };\n\t\n\t\n\t defaultMethods = providerConfig.methods || [];\n\t // This must be invoked after the publicService is initialized\n\t defaultOptions = invokeFactory(providerConfig.optionsFactory, {});\n\t\n\t // Copy over the simple custom methods\n\t angular.forEach(customMethods, function(fn, name) {\n\t publicService[name] = fn;\n\t });\n\t\n\t angular.forEach(providerConfig.presets, function(definition, name) {\n\t var presetDefaults = invokeFactory(definition.optionsFactory, {});\n\t var presetMethods = (definition.methods || []).concat(defaultMethods);\n\t\n\t // Every interimElement built with a preset has a field called `$type`,\n\t // which matches the name of the preset.\n\t // Eg in preset 'confirm', options.$type === 'confirm'\n\t angular.extend(presetDefaults, { $type: name });\n\t\n\t // This creates a preset class which has setter methods for every\n\t // method given in the `.addPreset()` function, as well as every\n\t // method given in the `.setDefaults()` function.\n\t //\n\t // @example\n\t // .setDefaults({\n\t // methods: ['hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],\n\t // options: dialogDefaultOptions\n\t // })\n\t // .addPreset('alert', {\n\t // methods: ['title', 'ok'],\n\t // options: alertDialogOptions\n\t // })\n\t //\n\t // Set values will be passed to the options when interimElement.show() is called.\n\t function Preset(opts) {\n\t this._options = angular.extend({}, presetDefaults, opts);\n\t }\n\t angular.forEach(presetMethods, function(name) {\n\t Preset.prototype[name] = function(value) {\n\t this._options[name] = value;\n\t return this;\n\t };\n\t });\n\t\n\t // Create shortcut method for one-linear methods\n\t if (definition.argOption) {\n\t var methodName = 'show' + name.charAt(0).toUpperCase() + name.slice(1);\n\t publicService[methodName] = function(arg) {\n\t var config = publicService[name](arg);\n\t return publicService.show(config);\n\t };\n\t }\n\t\n\t // eg $mdDialog.alert() will return a new alert preset\n\t publicService[name] = function(arg) {\n\t // If argOption is supplied, eg `argOption: 'content'`, then we assume\n\t // if the argument is not an options object then it is the `argOption` option.\n\t //\n\t // @example `$mdToast.simple('hello')` // sets options.content to hello\n\t // // because argOption === 'content'\n\t if (arguments.length && definition.argOption &&\n\t !angular.isObject(arg) && !angular.isArray(arg)) {\n\t\n\t return (new Preset())[definition.argOption](arg);\n\t\n\t } else {\n\t return new Preset(arg);\n\t }\n\t\n\t };\n\t });\n\t\n\t return publicService;\n\t\n\t /**\n\t *\n\t */\n\t function showInterimElement(opts) {\n\t // opts is either a preset which stores its options on an _options field,\n\t // or just an object made up of options\n\t opts = opts || { };\n\t if (opts._options) opts = opts._options;\n\t\n\t return interimElementService.show(\n\t angular.extend({}, defaultOptions, opts)\n\t );\n\t }\n\t\n\t /**\n\t * Special method to hide and destroy an interimElement WITHOUT\n\t * any 'leave` or hide animations ( an immediate force hide/remove )\n\t *\n\t * NOTE: This calls the onRemove() subclass method for each component...\n\t * which must have code to respond to `options.$destroy == true`\n\t */\n\t function destroyInterimElement(opts) {\n\t return interimElementService.destroy(opts);\n\t }\n\t\n\t /**\n\t * Helper to call $injector.invoke with a local of the factory name for\n\t * this provider.\n\t * If an $mdDialog is providing options for a dialog and tries to inject\n\t * $mdDialog, a circular dependency error will happen.\n\t * We get around that by manually injecting $mdDialog as a local.\n\t */\n\t function invokeFactory(factory, defaultVal) {\n\t var locals = {};\n\t locals[interimFactoryName] = publicService;\n\t return $injector.invoke(factory || function() { return defaultVal; }, {}, locals);\n\t }\n\t\n\t }\n\t\n\t }\n\t\n\t /* @ngInject */\n\t function InterimElementFactory($document, $q, $rootScope, $timeout, $rootElement, $animate,\n\t $mdUtil, $mdCompiler, $mdTheming, $injector, $exceptionHandler) {\n\t return function createInterimElementService() {\n\t var SHOW_CANCELLED = false;\n\t\n\t /*\n\t * @ngdoc service\n\t * @name $$interimElement.$service\n\t *\n\t * @description\n\t * A service used to control inserting and removing an element into the DOM.\n\t *\n\t */\n\t\n\t var service;\n\t\n\t var showPromises = []; // Promises for the interim's which are currently opening.\n\t var hidePromises = []; // Promises for the interim's which are currently hiding.\n\t var showingInterims = []; // Interim elements which are currently showing up.\n\t\n\t // Publish instance $$interimElement service;\n\t // ... used as $mdDialog, $mdToast, $mdMenu, and $mdSelect\n\t\n\t return service = {\n\t show: show,\n\t hide: waitForInterim(hide),\n\t cancel: waitForInterim(cancel),\n\t destroy : destroy,\n\t $injector_: $injector\n\t };\n\t\n\t /*\n\t * @ngdoc method\n\t * @name $$interimElement.$service#show\n\t * @kind function\n\t *\n\t * @description\n\t * Adds the `$interimElement` to the DOM and returns a special promise that will be resolved or rejected\n\t * with hide or cancel, respectively. To external cancel/hide, developers should use the\n\t *\n\t * @param {*} options is hashMap of settings\n\t * @returns a Promise\n\t *\n\t */\n\t function show(options) {\n\t options = options || {};\n\t var interimElement = new InterimElement(options || {});\n\t\n\t // When an interim element is currently showing, we have to cancel it.\n\t // Just hiding it, will resolve the InterimElement's promise, the promise should be\n\t // rejected instead.\n\t var hideAction = options.multiple ? $q.resolve() : $q.all(showPromises);\n\t\n\t if (!options.multiple) {\n\t // Wait for all opening interim's to finish their transition.\n\t hideAction = hideAction.then(function() {\n\t // Wait for all closing and showing interim's to be completely closed.\n\t var promiseArray = hidePromises.concat(showingInterims.map(service.cancel));\n\t return $q.all(promiseArray);\n\t });\n\t }\n\t\n\t var showAction = hideAction.then(function() {\n\t\n\t return interimElement\n\t .show()\n\t .catch(function(reason) { return reason; })\n\t .finally(function() {\n\t showPromises.splice(showPromises.indexOf(showAction), 1);\n\t showingInterims.push(interimElement);\n\t });\n\t\n\t });\n\t\n\t showPromises.push(showAction);\n\t\n\t // In AngularJS 1.6+, exceptions inside promises will cause a rejection. We need to handle\n\t // the rejection and only log it if it's an error.\n\t interimElement.deferred.promise.catch(function(fault) {\n\t if (fault instanceof Error) {\n\t $exceptionHandler(fault);\n\t }\n\t\n\t return fault;\n\t });\n\t\n\t // Return a promise that will be resolved when the interim\n\t // element is hidden or cancelled...\n\t return interimElement.deferred.promise;\n\t }\n\t\n\t /*\n\t * @ngdoc method\n\t * @name $$interimElement.$service#hide\n\t * @kind function\n\t *\n\t * @description\n\t * Removes the `$interimElement` from the DOM and resolves the promise returned from `show`\n\t *\n\t * @param {*} resolveParam Data to resolve the promise with\n\t * @returns a Promise that will be resolved after the element has been removed.\n\t *\n\t */\n\t function hide(reason, options) {\n\t options = options || {};\n\t\n\t if (options.closeAll) {\n\t // We have to make a shallow copy of the array, because otherwise the map will break.\n\t return $q.all(showingInterims.slice().reverse().map(closeElement));\n\t } else if (options.closeTo !== undefined) {\n\t return $q.all(showingInterims.slice(options.closeTo).map(closeElement));\n\t }\n\t\n\t // Hide the latest showing interim element.\n\t return closeElement(showingInterims[showingInterims.length - 1]);\n\t\n\t function closeElement(interim) {\n\t\n\t var hideAction = interim\n\t .remove(reason, false, options || { })\n\t .catch(function(reason) { return reason; })\n\t .finally(function() {\n\t hidePromises.splice(hidePromises.indexOf(hideAction), 1);\n\t });\n\t\n\t showingInterims.splice(showingInterims.indexOf(interim), 1);\n\t hidePromises.push(hideAction);\n\t\n\t return interim.deferred.promise;\n\t }\n\t }\n\t\n\t /*\n\t * @ngdoc method\n\t * @name $$interimElement.$service#cancel\n\t * @kind function\n\t *\n\t * @description\n\t * Removes the `$interimElement` from the DOM and rejects the promise returned from `show`\n\t *\n\t * @param {*} reason Data to reject the promise with\n\t * @returns Promise that will be resolved after the element has been removed.\n\t *\n\t */\n\t function cancel(reason, options) {\n\t var interim = showingInterims.pop();\n\t if (!interim) {\n\t return $q.when(reason);\n\t }\n\t\n\t var cancelAction = interim\n\t .remove(reason, true, options || {})\n\t .catch(function(reason) { return reason; })\n\t .finally(function() {\n\t hidePromises.splice(hidePromises.indexOf(cancelAction), 1);\n\t });\n\t\n\t hidePromises.push(cancelAction);\n\t\n\t // Since AngularJS 1.6.7, promises will be logged to $exceptionHandler when the promise\n\t // is not handling the rejection. We create a pseudo catch handler, which will prevent the\n\t // promise from being logged to the $exceptionHandler.\n\t return interim.deferred.promise.catch(angular.noop);\n\t }\n\t\n\t /**\n\t * Creates a function to wait for at least one interim element to be available.\n\t * @param callbackFn Function to be used as callback\n\t * @returns {Function}\n\t */\n\t function waitForInterim(callbackFn) {\n\t return function() {\n\t var fnArguments = arguments;\n\t\n\t if (!showingInterims.length) {\n\t // When there are still interim's opening, then wait for the first interim element to\n\t // finish its open animation.\n\t if (showPromises.length) {\n\t return showPromises[0].finally(function () {\n\t return callbackFn.apply(service, fnArguments);\n\t });\n\t }\n\t\n\t return $q.when(\"No interim elements currently showing up.\");\n\t }\n\t\n\t return callbackFn.apply(service, fnArguments);\n\t };\n\t }\n\t\n\t /*\n\t * Special method to quick-remove the interim element without animations\n\t * Note: interim elements are in \"interim containers\"\n\t */\n\t function destroy(targetEl) {\n\t var interim = !targetEl ? showingInterims.shift() : null;\n\t\n\t var parentEl = angular.element(targetEl).length && angular.element(targetEl)[0].parentNode;\n\t\n\t if (parentEl) {\n\t // Try to find the interim in the stack which corresponds to the supplied DOM element.\n\t var filtered = showingInterims.filter(function(entry) {\n\t return entry.options.element[0] === parentEl;\n\t });\n\t\n\t // Note: This function might be called when the element already has been removed,\n\t // in which case we won't find any matches.\n\t if (filtered.length) {\n\t interim = filtered[0];\n\t showingInterims.splice(showingInterims.indexOf(interim), 1);\n\t }\n\t }\n\t\n\t return interim ? interim.remove(SHOW_CANCELLED, false, { '$destroy': true }) :\n\t $q.when(SHOW_CANCELLED);\n\t }\n\t\n\t /*\n\t * Internal Interim Element Object\n\t * Used internally to manage the DOM element and related data\n\t */\n\t function InterimElement(options) {\n\t var self, element, showAction = $q.when(true);\n\t\n\t options = configureScopeAndTransitions(options);\n\t\n\t return self = {\n\t options : options,\n\t deferred: $q.defer(),\n\t show : createAndTransitionIn,\n\t remove : transitionOutAndRemove\n\t };\n\t\n\t /**\n\t * Compile, link, and show this interim element\n\t * Use optional autoHided and transition-in effects\n\t */\n\t function createAndTransitionIn() {\n\t return $q(function(resolve, reject) {\n\t\n\t // Trigger onCompiling callback before the compilation starts.\n\t // This is useful, when modifying options, which can be influenced by developers.\n\t options.onCompiling && options.onCompiling(options);\n\t\n\t compileElement(options)\n\t .then(function( compiledData ) {\n\t element = linkElement( compiledData, options );\n\t\n\t // Expose the cleanup function from the compiler.\n\t options.cleanupElement = compiledData.cleanup;\n\t\n\t showAction = showElement(element, options, compiledData.controller)\n\t .then(resolve, rejectAll);\n\t }).catch(rejectAll);\n\t\n\t function rejectAll(fault) {\n\t // Force the '$md.show()' promise to reject\n\t self.deferred.reject(fault);\n\t\n\t // Continue rejection propagation\n\t reject(fault);\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * After the show process has finished/rejected:\n\t * - announce 'removing',\n\t * - perform the transition-out, and\n\t * - perform optional clean up scope.\n\t */\n\t function transitionOutAndRemove(response, isCancelled, opts) {\n\t\n\t // abort if the show() and compile failed\n\t if ( !element ) return $q.when(false);\n\t\n\t options = angular.extend(options || {}, opts || {});\n\t options.cancelAutoHide && options.cancelAutoHide();\n\t options.element.triggerHandler('$mdInterimElementRemove');\n\t\n\t if ( options.$destroy === true ) {\n\t\n\t return hideElement(options.element, options).then(function(){\n\t (isCancelled && rejectAll(response)) || resolveAll(response);\n\t });\n\t\n\t } else {\n\t $q.when(showAction).finally(function() {\n\t hideElement(options.element, options).then(function() {\n\t isCancelled ? rejectAll(response) : resolveAll(response);\n\t }, rejectAll);\n\t });\n\t\n\t return self.deferred.promise;\n\t }\n\t\n\t\n\t /**\n\t * The `show()` returns a promise that will be resolved when the interim\n\t * element is hidden or cancelled...\n\t */\n\t function resolveAll(response) {\n\t self.deferred.resolve(response);\n\t }\n\t\n\t /**\n\t * Force the '$md.show()' promise to reject\n\t */\n\t function rejectAll(fault) {\n\t self.deferred.reject(fault);\n\t }\n\t }\n\t\n\t /**\n\t * Prepare optional isolated scope and prepare $animate with default enter and leave\n\t * transitions for the new element instance.\n\t */\n\t function configureScopeAndTransitions(options) {\n\t options = options || { };\n\t if ( options.template ) {\n\t options.template = $mdUtil.processTemplate(options.template);\n\t }\n\t\n\t return angular.extend({\n\t preserveScope: false,\n\t cancelAutoHide : angular.noop,\n\t scope: options.scope || $rootScope.$new(options.isolateScope),\n\t\n\t /**\n\t * Default usage to enable $animate to transition-in; can be easily overridden via 'options'\n\t */\n\t onShow: function transitionIn(scope, element, options) {\n\t return $animate.enter(element, options.parent);\n\t },\n\t\n\t /**\n\t * Default usage to enable $animate to transition-out; can be easily overridden via 'options'\n\t */\n\t onRemove: function transitionOut(scope, element) {\n\t // Element could be undefined if a new element is shown before\n\t // the old one finishes compiling.\n\t return element && $animate.leave(element) || $q.when();\n\t }\n\t }, options );\n\t\n\t }\n\t\n\t /**\n\t * Compile an element with a templateUrl, controller, and locals\n\t */\n\t function compileElement(options) {\n\t\n\t var compiled = !options.skipCompile ? $mdCompiler.compile(options) : null;\n\t\n\t return compiled || $q(function (resolve) {\n\t resolve({\n\t locals: {},\n\t link: function () {\n\t return options.element;\n\t }\n\t });\n\t });\n\t }\n\t\n\t /**\n\t * Link an element with compiled configuration\n\t */\n\t function linkElement(compileData, options){\n\t angular.extend(compileData.locals, options);\n\t\n\t var element = compileData.link(options.scope);\n\t\n\t // Search for parent at insertion time, if not specified\n\t options.element = element;\n\t options.parent = findParent(element, options);\n\t if (options.themable) $mdTheming(element);\n\t\n\t return element;\n\t }\n\t\n\t /**\n\t * Search for parent at insertion time, if not specified\n\t */\n\t function findParent(element, options) {\n\t var parent = options.parent;\n\t\n\t // Search for parent at insertion time, if not specified\n\t if (angular.isFunction(parent)) {\n\t parent = parent(options.scope, element, options);\n\t } else if (angular.isString(parent)) {\n\t parent = angular.element($document[0].querySelector(parent));\n\t } else {\n\t parent = angular.element(parent);\n\t }\n\t\n\t // If parent querySelector/getter function fails, or it's just null,\n\t // find a default.\n\t if (!(parent || {}).length) {\n\t var el;\n\t if ($rootElement[0] && $rootElement[0].querySelector) {\n\t el = $rootElement[0].querySelector(':not(svg) > body');\n\t }\n\t if (!el) el = $rootElement[0];\n\t if (el.nodeName == '#comment') {\n\t el = $document[0].body;\n\t }\n\t return angular.element(el);\n\t }\n\t\n\t return parent;\n\t }\n\t\n\t /**\n\t * If auto-hide is enabled, start timer and prepare cancel function\n\t */\n\t function startAutoHide() {\n\t var autoHideTimer, cancelAutoHide = angular.noop;\n\t\n\t if (options.hideDelay) {\n\t autoHideTimer = $timeout(service.hide, options.hideDelay) ;\n\t cancelAutoHide = function() {\n\t $timeout.cancel(autoHideTimer);\n\t };\n\t }\n\t\n\t // Cache for subsequent use\n\t options.cancelAutoHide = function() {\n\t cancelAutoHide();\n\t options.cancelAutoHide = undefined;\n\t };\n\t }\n\t\n\t /**\n\t * Show the element ( with transitions), notify complete and start\n\t * optional auto-Hide\n\t */\n\t function showElement(element, options, controller) {\n\t // Trigger onShowing callback before the `show()` starts\n\t var notifyShowing = options.onShowing || angular.noop;\n\t // Trigger onComplete callback when the `show()` finishes\n\t var notifyComplete = options.onComplete || angular.noop;\n\t\n\t // Necessary for consistency between AngularJS 1.5 and 1.6.\n\t try {\n\t notifyShowing(options.scope, element, options, controller);\n\t } catch (e) {\n\t return $q.reject(e);\n\t }\n\t\n\t return $q(function (resolve, reject) {\n\t try {\n\t // Start transitionIn\n\t $q.when(options.onShow(options.scope, element, options, controller))\n\t .then(function () {\n\t notifyComplete(options.scope, element, options);\n\t startAutoHide();\n\t\n\t resolve(element);\n\t }, reject);\n\t\n\t } catch (e) {\n\t reject(e.message);\n\t }\n\t });\n\t }\n\t\n\t function hideElement(element, options) {\n\t var announceRemoving = options.onRemoving || angular.noop;\n\t\n\t return $q(function (resolve, reject) {\n\t try {\n\t // Start transitionIn\n\t var action = $q.when( options.onRemove(options.scope, element, options) || true );\n\t\n\t // Trigger callback *before* the remove operation starts\n\t announceRemoving(element, action);\n\t\n\t if (options.$destroy) {\n\t // For $destroy, onRemove should be synchronous\n\t resolve(element);\n\t\n\t if (!options.preserveScope && options.scope ) {\n\t // scope destroy should still be be done after the current digest is done\n\t action.then( function() { options.scope.$destroy(); });\n\t }\n\t } else {\n\t // Wait until transition-out is done\n\t action.then(function () {\n\t if (!options.preserveScope && options.scope ) {\n\t options.scope.$destroy();\n\t }\n\t\n\t resolve(element);\n\t }, reject);\n\t }\n\t } catch (e) {\n\t reject(e.message);\n\t }\n\t });\n\t }\n\t\n\t }\n\t };\n\t\n\t }\n\t\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t var $mdUtil, $interpolate, $log;\n\t\n\t var SUFFIXES = /(-gt)?-(sm|md|lg|print)/g;\n\t var WHITESPACE = /\\s+/g;\n\t\n\t var FLEX_OPTIONS = ['grow', 'initial', 'auto', 'none', 'noshrink', 'nogrow' ];\n\t var LAYOUT_OPTIONS = ['row', 'column'];\n\t var ALIGNMENT_MAIN_AXIS= [ \"\", \"start\", \"center\", \"end\", \"stretch\", \"space-around\", \"space-between\" ];\n\t var ALIGNMENT_CROSS_AXIS= [ \"\", \"start\", \"center\", \"end\", \"stretch\" ];\n\t\n\t var config = {\n\t /**\n\t * Enable directive attribute-to-class conversions\n\t * Developers can use `` to quickly\n\t * disable the Layout directives and prohibit the injection of Layout classNames\n\t */\n\t enabled: true,\n\t\n\t /**\n\t * List of mediaQuery breakpoints and associated suffixes\n\t *\n\t * [\n\t * { suffix: \"sm\", mediaQuery: \"screen and (max-width: 599px)\" },\n\t * { suffix: \"md\", mediaQuery: \"screen and (min-width: 600px) and (max-width: 959px)\" }\n\t * ]\n\t */\n\t breakpoints: []\n\t };\n\t\n\t registerLayoutAPI( angular.module('material.core.layout', ['ng']) );\n\t\n\t /**\n\t * registerLayoutAPI()\n\t *\n\t * The original AngularJS Material Layout solution used attribute selectors and CSS.\n\t *\n\t * ```html\n\t *
My Content
\n\t * ```\n\t *\n\t * ```css\n\t * [layout] {\n\t * box-sizing: border-box;\n\t * display:flex;\n\t * }\n\t * [layout=column] {\n\t * flex-direction : column\n\t * }\n\t * ```\n\t *\n\t * Use of attribute selectors creates significant performance impacts in some\n\t * browsers... mainly IE.\n\t *\n\t * This module registers directives that allow the same layout attributes to be\n\t * interpreted and converted to class selectors. The directive will add equivalent classes to each element that\n\t * contains a Layout directive.\n\t *\n\t * ```html\n\t *
My Content
\n\t *```\n\t *\n\t * ```css\n\t * .layout {\n\t * box-sizing: border-box;\n\t * display:flex;\n\t * }\n\t * .layout-column {\n\t * flex-direction : column\n\t * }\n\t * ```\n\t */\n\t function registerLayoutAPI(module){\n\t var PREFIX_REGEXP = /^((?:x|data)[\\:\\-_])/i;\n\t var SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\n\t\n\t // NOTE: these are also defined in constants::MEDIA_PRIORITY and constants::MEDIA\n\t var BREAKPOINTS = [ \"\", \"xs\", \"gt-xs\", \"sm\", \"gt-sm\", \"md\", \"gt-md\", \"lg\", \"gt-lg\", \"xl\", \"print\" ];\n\t var API_WITH_VALUES = [ \"layout\", \"flex\", \"flex-order\", \"flex-offset\", \"layout-align\" ];\n\t var API_NO_VALUES = [ \"show\", \"hide\", \"layout-padding\", \"layout-margin\" ];\n\t\n\t\n\t // Build directive registration functions for the standard Layout API... for all breakpoints.\n\t angular.forEach(BREAKPOINTS, function(mqb) {\n\t\n\t // Attribute directives with expected, observable value(s)\n\t angular.forEach( API_WITH_VALUES, function(name){\n\t var fullName = mqb ? name + \"-\" + mqb : name;\n\t module.directive( directiveNormalize(fullName), attributeWithObserve(fullName));\n\t });\n\t\n\t // Attribute directives with no expected value(s)\n\t angular.forEach( API_NO_VALUES, function(name){\n\t var fullName = mqb ? name + \"-\" + mqb : name;\n\t module.directive( directiveNormalize(fullName), attributeWithoutValue(fullName));\n\t });\n\t\n\t });\n\t\n\t // Register other, special directive functions for the Layout features:\n\t module\n\t\n\t .provider('$$mdLayout' , function() {\n\t // Publish internal service for Layouts\n\t return {\n\t $get : angular.noop,\n\t validateAttributeValue : validateAttributeValue,\n\t validateAttributeUsage : validateAttributeUsage,\n\t /**\n\t * Easy way to disable/enable the Layout API.\n\t * When disabled, this stops all attribute-to-classname generations\n\t */\n\t disableLayouts : function(isDisabled) {\n\t config.enabled = (isDisabled !== true);\n\t }\n\t };\n\t })\n\t\n\t .directive('mdLayoutCss' , disableLayoutDirective )\n\t .directive('ngCloak' , buildCloakInterceptor('ng-cloak'))\n\t\n\t .directive('layoutWrap' , attributeWithoutValue('layout-wrap'))\n\t .directive('layoutNowrap' , attributeWithoutValue('layout-nowrap'))\n\t .directive('layoutNoWrap' , attributeWithoutValue('layout-no-wrap'))\n\t .directive('layoutFill' , attributeWithoutValue('layout-fill'))\n\t\n\t // !! Deprecated attributes: use the `-lt` (aka less-than) notations\n\t\n\t .directive('layoutLtMd' , warnAttrNotSupported('layout-lt-md', true))\n\t .directive('layoutLtLg' , warnAttrNotSupported('layout-lt-lg', true))\n\t .directive('flexLtMd' , warnAttrNotSupported('flex-lt-md', true))\n\t .directive('flexLtLg' , warnAttrNotSupported('flex-lt-lg', true))\n\t\n\t .directive('layoutAlignLtMd', warnAttrNotSupported('layout-align-lt-md'))\n\t .directive('layoutAlignLtLg', warnAttrNotSupported('layout-align-lt-lg'))\n\t .directive('flexOrderLtMd' , warnAttrNotSupported('flex-order-lt-md'))\n\t .directive('flexOrderLtLg' , warnAttrNotSupported('flex-order-lt-lg'))\n\t .directive('offsetLtMd' , warnAttrNotSupported('flex-offset-lt-md'))\n\t .directive('offsetLtLg' , warnAttrNotSupported('flex-offset-lt-lg'))\n\t\n\t .directive('hideLtMd' , warnAttrNotSupported('hide-lt-md'))\n\t .directive('hideLtLg' , warnAttrNotSupported('hide-lt-lg'))\n\t .directive('showLtMd' , warnAttrNotSupported('show-lt-md'))\n\t .directive('showLtLg' , warnAttrNotSupported('show-lt-lg'))\n\t\n\t // Determine if\n\t .config( detectDisabledLayouts );\n\t\n\t /**\n\t * Converts snake_case to camelCase.\n\t * Also there is special case for Moz prefix starting with upper case letter.\n\t * @param name Name to normalize\n\t */\n\t function directiveNormalize(name) {\n\t return name\n\t .replace(PREFIX_REGEXP, '')\n\t .replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\n\t return offset ? letter.toUpperCase() : letter;\n\t });\n\t }\n\t\n\t }\n\t\n\t\n\t /**\n\t * Detect if any of the HTML tags has a [md-layouts-disabled] attribute;\n\t * If yes, then immediately disable all layout API features\n\t *\n\t * Note: this attribute should be specified on either the HTML or BODY tags\n\t */\n\t /**\n\t * @ngInject\n\t */\n\t function detectDisabledLayouts() {\n\t var isDisabled = !!document.querySelector('[md-layouts-disabled]');\n\t config.enabled = !isDisabled;\n\t }\n\t\n\t /**\n\t * Special directive that will disable ALL Layout conversions of layout\n\t * attribute(s) to classname(s).\n\t *\n\t * \n\t * \n\t *\n\t * \n\t * ...\n\t * \n\t *\n\t * Note: Using md-layout-css directive requires the developer to load the Material\n\t * Layout Attribute stylesheet (which only uses attribute selectors):\n\t *\n\t * `angular-material.layout.css`\n\t *\n\t * Another option is to use the LayoutProvider to configure and disable the attribute\n\t * conversions; this would obviate the use of the `md-layout-css` directive\n\t *\n\t */\n\t function disableLayoutDirective() {\n\t // Return a 1x-only, first-match attribute directive\n\t config.enabled = false;\n\t\n\t return {\n\t restrict : 'A',\n\t priority : '900'\n\t };\n\t }\n\t\n\t /**\n\t * Tail-hook ngCloak to delay the uncloaking while Layout transformers\n\t * finish processing. Eliminates flicker with Material.Layouts\n\t */\n\t function buildCloakInterceptor(className) {\n\t return [ '$timeout', function($timeout){\n\t return {\n\t restrict : 'A',\n\t priority : -10, // run after normal ng-cloak\n\t compile : function( element ) {\n\t if (!config.enabled) return angular.noop;\n\t\n\t // Re-add the cloak\n\t element.addClass(className);\n\t\n\t return function( scope, element ) {\n\t // Wait while layout injectors configure, then uncloak\n\t // NOTE: $rAF does not delay enough... and this is a 1x-only event,\n\t // $timeout is acceptable.\n\t $timeout( function(){\n\t element.removeClass(className);\n\t }, 10, false);\n\t };\n\t }\n\t };\n\t }];\n\t }\n\t\n\t\n\t // *********************************************************************************\n\t //\n\t // These functions create registration functions for AngularJS Material Layout attribute directives\n\t // This provides easy translation to switch AngularJS Material attribute selectors to\n\t // CLASS selectors and directives; which has huge performance implications\n\t // for IE Browsers\n\t //\n\t // *********************************************************************************\n\t\n\t /**\n\t * Creates a directive registration function where a possible dynamic attribute\n\t * value will be observed/watched.\n\t * @param {string} className attribute name; eg `layout-gt-md` with value =\"row\"\n\t */\n\t function attributeWithObserve(className) {\n\t\n\t return ['$mdUtil', '$interpolate', \"$log\", function(_$mdUtil_, _$interpolate_, _$log_) {\n\t $mdUtil = _$mdUtil_;\n\t $interpolate = _$interpolate_;\n\t $log = _$log_;\n\t\n\t return {\n\t restrict: 'A',\n\t compile: function(element, attr) {\n\t var linkFn;\n\t if (config.enabled) {\n\t // immediately replace static (non-interpolated) invalid values...\n\t\n\t validateAttributeUsage(className, attr, element, $log);\n\t\n\t validateAttributeValue( className,\n\t getNormalizedAttrValue(className, attr, \"\"),\n\t buildUpdateFn(element, className, attr)\n\t );\n\t\n\t linkFn = translateWithValueToCssClass;\n\t }\n\t\n\t // Use for postLink to account for transforms after ng-transclude.\n\t return linkFn || angular.noop;\n\t }\n\t };\n\t }];\n\t\n\t /**\n\t * Add as transformed class selector(s), then\n\t * remove the deprecated attribute selector\n\t */\n\t function translateWithValueToCssClass(scope, element, attrs) {\n\t var updateFn = updateClassWithValue(element, className, attrs);\n\t var unwatch = attrs.$observe(attrs.$normalize(className), updateFn);\n\t\n\t updateFn(getNormalizedAttrValue(className, attrs, \"\"));\n\t scope.$on(\"$destroy\", function() { unwatch(); });\n\t }\n\t }\n\t\n\t /**\n\t * Creates a registration function for AngularJS Material Layout attribute directive.\n\t * This is a `simple` transpose of attribute usage to class usage; where we ignore\n\t * any attribute value\n\t */\n\t function attributeWithoutValue(className) {\n\t return ['$mdUtil', '$interpolate', \"$log\", function(_$mdUtil_, _$interpolate_, _$log_) {\n\t $mdUtil = _$mdUtil_;\n\t $interpolate = _$interpolate_;\n\t $log = _$log_;\n\t\n\t return {\n\t restrict: 'A',\n\t compile: function(element, attr) {\n\t var linkFn;\n\t if (config.enabled) {\n\t // immediately replace static (non-interpolated) invalid values...\n\t\n\t validateAttributeValue( className,\n\t getNormalizedAttrValue(className, attr, \"\"),\n\t buildUpdateFn(element, className, attr)\n\t );\n\t\n\t translateToCssClass(null, element);\n\t\n\t // Use for postLink to account for transforms after ng-transclude.\n\t linkFn = translateToCssClass;\n\t }\n\t\n\t return linkFn || angular.noop;\n\t }\n\t };\n\t }];\n\t\n\t /**\n\t * Add as transformed class selector, then\n\t * remove the deprecated attribute selector\n\t */\n\t function translateToCssClass(scope, element) {\n\t element.addClass(className);\n\t }\n\t }\n\t\n\t\n\t\n\t /**\n\t * After link-phase, do NOT remove deprecated layout attribute selector.\n\t * Instead watch the attribute so interpolated data-bindings to layout\n\t * selectors will continue to be supported.\n\t *\n\t * $observe() the className and update with new class (after removing the last one)\n\t *\n\t * e.g. `layout=\"{{layoutDemo.direction}}\"` will update...\n\t *\n\t * NOTE: The value must match one of the specified styles in the CSS.\n\t * For example `flex-gt-md=\"{{size}}` where `scope.size == 47` will NOT work since\n\t * only breakpoints for 0, 5, 10, 15... 100, 33, 34, 66, 67 are defined.\n\t *\n\t */\n\t function updateClassWithValue(element, className) {\n\t var lastClass;\n\t\n\t return function updateClassFn(newValue) {\n\t var value = validateAttributeValue(className, newValue || \"\");\n\t if ( angular.isDefined(value) ) {\n\t if (lastClass) element.removeClass(lastClass);\n\t lastClass = !value ? className : className + \"-\" + value.trim().replace(WHITESPACE, \"-\");\n\t element.addClass(lastClass);\n\t }\n\t };\n\t }\n\t\n\t /**\n\t * Provide console warning that this layout attribute has been deprecated\n\t *\n\t */\n\t function warnAttrNotSupported(className) {\n\t var parts = className.split(\"-\");\n\t return [\"$log\", function($log) {\n\t $log.warn(className + \"has been deprecated. Please use a `\" + parts[0] + \"-gt-` variant.\");\n\t return angular.noop;\n\t }];\n\t }\n\t\n\t /**\n\t * Centralize warnings for known flexbox issues (especially IE-related issues)\n\t */\n\t function validateAttributeUsage(className, attr, element, $log){\n\t var message, usage, url;\n\t var nodeName = element[0].nodeName.toLowerCase();\n\t\n\t switch(className.replace(SUFFIXES,\"\")) {\n\t case \"flex\":\n\t if ((nodeName == \"md-button\") || (nodeName == \"fieldset\")){\n\t // @see https://github.com/philipwalton/flexbugs#9-some-html-elements-cant-be-flex-containers\n\t // Use
wrapper inside (preferred) or outside\n\t\n\t usage = \"<\" + nodeName + \" \" + className + \">\";\n\t url = \"https://github.com/philipwalton/flexbugs#9-some-html-elements-cant-be-flex-containers\";\n\t message = \"Markup '{0}' may not work as expected in IE Browsers. Consult '{1}' for details.\";\n\t\n\t $log.warn( $mdUtil.supplant(message, [usage, url]) );\n\t }\n\t }\n\t\n\t }\n\t\n\t\n\t /**\n\t * For the Layout attribute value, validate or replace with default\n\t * fallback value\n\t */\n\t function validateAttributeValue(className, value, updateFn) {\n\t var origValue;\n\t\n\t if (!needsInterpolation(value)) {\n\t switch (className.replace(SUFFIXES,\"\")) {\n\t case 'layout' :\n\t if ( !findIn(value, LAYOUT_OPTIONS) ) {\n\t value = LAYOUT_OPTIONS[0]; // 'row';\n\t }\n\t break;\n\t\n\t case 'flex' :\n\t if (!findIn(value, FLEX_OPTIONS)) {\n\t if (isNaN(value)) {\n\t value = '';\n\t }\n\t }\n\t break;\n\t\n\t case 'flex-offset' :\n\t case 'flex-order' :\n\t if (!value || isNaN(+value)) {\n\t value = '0';\n\t }\n\t break;\n\t\n\t case 'layout-align' :\n\t var axis = extractAlignAxis(value);\n\t value = $mdUtil.supplant(\"{main}-{cross}\",axis);\n\t break;\n\t\n\t case 'layout-padding' :\n\t case 'layout-margin' :\n\t case 'layout-fill' :\n\t case 'layout-wrap' :\n\t case 'layout-nowrap' :\n\t case 'layout-nowrap' :\n\t value = '';\n\t break;\n\t }\n\t\n\t if (value != origValue) {\n\t (updateFn || angular.noop)(value);\n\t }\n\t }\n\t\n\t return value ? value.trim() : \"\";\n\t }\n\t\n\t /**\n\t * Replace current attribute value with fallback value\n\t */\n\t function buildUpdateFn(element, className, attrs) {\n\t return function updateAttrValue(fallback) {\n\t if (!needsInterpolation(fallback)) {\n\t // Do not modify the element's attribute value; so\n\t // uses '' will not\n\t // be affected. Just update the attrs value.\n\t attrs[attrs.$normalize(className)] = fallback;\n\t }\n\t };\n\t }\n\t\n\t /**\n\t * See if the original value has interpolation symbols:\n\t * e.g. flex-gt-md=\"{{triggerPoint}}\"\n\t */\n\t function needsInterpolation(value) {\n\t return (value || \"\").indexOf($interpolate.startSymbol()) > -1;\n\t }\n\t\n\t function getNormalizedAttrValue(className, attrs, defaultVal) {\n\t var normalizedAttr = attrs.$normalize(className);\n\t return attrs[normalizedAttr] ? attrs[normalizedAttr].trim().replace(WHITESPACE, \"-\") : defaultVal || null;\n\t }\n\t\n\t function findIn(item, list, replaceWith) {\n\t item = replaceWith && item ? item.replace(WHITESPACE, replaceWith) : item;\n\t\n\t var found = false;\n\t if (item) {\n\t list.forEach(function(it) {\n\t it = replaceWith ? it.replace(WHITESPACE, replaceWith) : it;\n\t found = found || (it === item);\n\t });\n\t }\n\t return found;\n\t }\n\t\n\t function extractAlignAxis(attrValue) {\n\t var axis = {\n\t main : \"start\",\n\t cross: \"stretch\"\n\t }, values;\n\t\n\t attrValue = (attrValue || \"\");\n\t\n\t if ( attrValue.indexOf(\"-\") === 0 || attrValue.indexOf(\" \") === 0) {\n\t // For missing main-axis values\n\t attrValue = \"none\" + attrValue;\n\t }\n\t\n\t values = attrValue.toLowerCase().trim().replace(WHITESPACE, \"-\").split(\"-\");\n\t if ( values.length && (values[0] === \"space\") ) {\n\t // for main-axis values of \"space-around\" or \"space-between\"\n\t values = [ values[0]+\"-\"+values[1],values[2] ];\n\t }\n\t\n\t if ( values.length > 0 ) axis.main = values[0] || axis.main;\n\t if ( values.length > 1 ) axis.cross = values[1] || axis.cross;\n\t\n\t if ( ALIGNMENT_MAIN_AXIS.indexOf(axis.main) < 0 ) axis.main = \"start\";\n\t if ( ALIGNMENT_CROSS_AXIS.indexOf(axis.cross) < 0 ) axis.cross = \"stretch\";\n\t\n\t return axis;\n\t }\n\t\n\t\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\r\n\t * @ngdoc module\r\n\t * @name material.core.liveannouncer\r\n\t * @description\r\n\t * AngularJS Material Live Announcer to provide accessibility for Voice Readers.\r\n\t */\r\n\tMdLiveAnnouncer.$inject = [\"$timeout\"];\r\n\tangular\r\n\t .module('material.core')\r\n\t .service('$mdLiveAnnouncer', MdLiveAnnouncer);\r\n\t\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $mdLiveAnnouncer\r\n\t * @module material.core.liveannouncer\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * Service to announce messages to supported screenreaders.\r\n\t *\r\n\t * > The `$mdLiveAnnouncer` service is internally used for components to provide proper accessibility.\r\n\t *\r\n\t * \r\n\t * module.controller('AppCtrl', function($mdLiveAnnouncer) {\r\n\t * // Basic announcement (Polite Mode)\r\n\t * $mdLiveAnnouncer.announce('Hey Google');\r\n\t *\r\n\t * // Custom announcement (Assertive Mode)\r\n\t * $mdLiveAnnouncer.announce('Hey Google', 'assertive');\r\n\t * });\r\n\t * \r\n\t *\r\n\t */\r\n\tfunction MdLiveAnnouncer($timeout) {\r\n\t /** @private @const @type {!angular.$timeout} */\r\n\t this._$timeout = $timeout;\r\n\t\r\n\t /** @private @const @type {!HTMLElement} */\r\n\t this._liveElement = this._createLiveElement();\r\n\t\r\n\t /** @private @const @type {!number} */\r\n\t this._announceTimeout = 100;\r\n\t}\r\n\t\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $mdLiveAnnouncer#announce\r\n\t * @description Announces messages to supported screenreaders.\r\n\t * @param {string} message Message to be announced to the screenreader\r\n\t * @param {'off'|'polite'|'assertive'} politeness The politeness of the announcer element.\r\n\t */\r\n\tMdLiveAnnouncer.prototype.announce = function(message, politeness) {\r\n\t if (!politeness) {\r\n\t politeness = 'polite';\r\n\t }\r\n\t\r\n\t var self = this;\r\n\t\r\n\t self._liveElement.textContent = '';\r\n\t self._liveElement.setAttribute('aria-live', politeness);\r\n\t\r\n\t // This 100ms timeout is necessary for some browser + screen-reader combinations:\r\n\t // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.\r\n\t // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a\r\n\t // second time without clearing and then using a non-zero delay.\r\n\t // (using JAWS 17 at time of this writing).\r\n\t self._$timeout(function() {\r\n\t self._liveElement.textContent = message;\r\n\t }, self._announceTimeout, false);\r\n\t};\r\n\t\r\n\t/**\r\n\t * Creates a live announcer element, which listens for DOM changes and announces them\r\n\t * to the screenreaders.\r\n\t * @returns {!HTMLElement}\r\n\t * @private\r\n\t */\r\n\tMdLiveAnnouncer.prototype._createLiveElement = function() {\r\n\t var liveEl = document.createElement('div');\r\n\t\r\n\t liveEl.classList.add('md-visually-hidden');\r\n\t liveEl.setAttribute('role', 'status');\r\n\t liveEl.setAttribute('aria-atomic', 'true');\r\n\t liveEl.setAttribute('aria-live', 'polite');\r\n\t\r\n\t document.body.appendChild(liveEl);\r\n\t\r\n\t return liveEl;\r\n\t};\r\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $$mdMeta\n\t * @module material.core.meta\n\t *\n\t * @description\n\t *\n\t * A provider and a service that simplifies meta tags access\n\t *\n\t * Note: This is intended only for use with dynamic meta tags such as browser color and title.\n\t * Tags that are only processed when the page is rendered (such as `charset`, and `http-equiv`)\n\t * will not work since `$$mdMeta` adds the tags after the page has already been loaded.\n\t *\n\t * ```js\n\t * app.config(function($$mdMetaProvider) {\n\t * var removeMeta = $$mdMetaProvider.setMeta('meta-name', 'content');\n\t * var metaValue = $$mdMetaProvider.getMeta('meta-name'); // -> 'content'\n\t *\n\t * removeMeta();\n\t * });\n\t *\n\t * app.controller('myController', function($$mdMeta) {\n\t * var removeMeta = $$mdMeta.setMeta('meta-name', 'content');\n\t * var metaValue = $$mdMeta.getMeta('meta-name'); // -> 'content'\n\t *\n\t * removeMeta();\n\t * });\n\t * ```\n\t *\n\t * @returns {$$mdMeta.$service}\n\t *\n\t */\n\tangular.module('material.core.meta', [])\n\t .provider('$$mdMeta', function () {\n\t var head = angular.element(document.head);\n\t var metaElements = {};\n\t\n\t /**\n\t * Checks if the requested element was written manually and maps it\n\t *\n\t * @param {string} name meta tag 'name' attribute value\n\t * @returns {boolean} returns true if there is an element with the requested name\n\t */\n\t function mapExistingElement(name) {\n\t if (metaElements[name]) {\n\t return true;\n\t }\n\t\n\t var element = document.getElementsByName(name)[0];\n\t\n\t if (!element) {\n\t return false;\n\t }\n\t\n\t metaElements[name] = angular.element(element);\n\t\n\t return true;\n\t }\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $$mdMeta#setMeta\n\t *\n\t * @description\n\t * Creates meta element with the 'name' and 'content' attributes,\n\t * if the meta tag is already created than we replace the 'content' value\n\t *\n\t * @param {string} name meta tag 'name' attribute value\n\t * @param {string} content meta tag 'content' attribute value\n\t * @returns {function} remove function\n\t *\n\t */\n\t function setMeta(name, content) {\n\t mapExistingElement(name);\n\t\n\t if (!metaElements[name]) {\n\t var newMeta = angular.element('');\n\t head.append(newMeta);\n\t metaElements[name] = newMeta;\n\t }\n\t else {\n\t metaElements[name].attr('content', content);\n\t }\n\t\n\t return function () {\n\t metaElements[name].attr('content', '');\n\t metaElements[name].remove();\n\t delete metaElements[name];\n\t };\n\t }\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $$mdMeta#getMeta\n\t *\n\t * @description\n\t * Gets the 'content' attribute value of the wanted meta element\n\t *\n\t * @param {string} name meta tag 'name' attribute value\n\t * @returns {string} content attribute value\n\t */\n\t function getMeta(name) {\n\t if (!mapExistingElement(name)) {\n\t throw Error('$$mdMeta: could not find a meta tag with the name \\'' + name + '\\'');\n\t }\n\t\n\t return metaElements[name].attr('content');\n\t }\n\t\n\t var module = {\n\t setMeta: setMeta,\n\t getMeta: getMeta\n\t };\n\t\n\t return angular.extend({}, module, {\n\t $get: function () {\n\t return module;\n\t }\n\t });\n\t });\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t /**\n\t * @ngdoc module\n\t * @name material.core.componentRegistry\n\t *\n\t * @description\n\t * A component instance registration service.\n\t * Note: currently this as a private service in the SideNav component.\n\t */\n\t ComponentRegistry.$inject = [\"$log\", \"$q\"];\n\t angular.module('material.core')\n\t .factory('$mdComponentRegistry', ComponentRegistry);\n\t\n\t /*\n\t * @private\n\t * @ngdoc factory\n\t * @name ComponentRegistry\n\t * @module material.core.componentRegistry\n\t *\n\t */\n\t function ComponentRegistry($log, $q) {\n\t\n\t var self;\n\t var instances = [ ];\n\t var pendings = { };\n\t\n\t return self = {\n\t /**\n\t * Used to print an error when an instance for a handle isn't found.\n\t */\n\t notFoundError: function(handle, msgContext) {\n\t $log.error( (msgContext || \"\") + 'No instance found for handle', handle);\n\t },\n\t /**\n\t * Return all registered instances as an array.\n\t */\n\t getInstances: function() {\n\t return instances;\n\t },\n\t\n\t /**\n\t * Get a registered instance.\n\t * @param handle the String handle to look up for a registered instance.\n\t */\n\t get: function(handle) {\n\t if ( !isValidID(handle) ) return null;\n\t\n\t var i, j, instance;\n\t for(i = 0, j = instances.length; i < j; i++) {\n\t instance = instances[i];\n\t if(instance.$$mdHandle === handle) {\n\t return instance;\n\t }\n\t }\n\t return null;\n\t },\n\t\n\t /**\n\t * Register an instance.\n\t * @param instance the instance to register\n\t * @param handle the handle to identify the instance under.\n\t */\n\t register: function(instance, handle) {\n\t if ( !handle ) return angular.noop;\n\t\n\t instance.$$mdHandle = handle;\n\t instances.push(instance);\n\t resolveWhen();\n\t\n\t return deregister;\n\t\n\t /**\n\t * Remove registration for an instance\n\t */\n\t function deregister() {\n\t var index = instances.indexOf(instance);\n\t if (index !== -1) {\n\t instances.splice(index, 1);\n\t }\n\t }\n\t\n\t /**\n\t * Resolve any pending promises for this instance\n\t */\n\t function resolveWhen() {\n\t var dfd = pendings[handle];\n\t if ( dfd ) {\n\t dfd.forEach(function (promise) {\n\t promise.resolve(instance);\n\t });\n\t delete pendings[handle];\n\t }\n\t }\n\t },\n\t\n\t /**\n\t * Async accessor to registered component instance\n\t * If not available then a promise is created to notify\n\t * all listeners when the instance is registered.\n\t */\n\t when : function(handle) {\n\t if ( isValidID(handle) ) {\n\t var deferred = $q.defer();\n\t var instance = self.get(handle);\n\t\n\t if ( instance ) {\n\t deferred.resolve( instance );\n\t } else {\n\t if (pendings[handle] === undefined) {\n\t pendings[handle] = [];\n\t }\n\t pendings[handle].push(deferred);\n\t }\n\t\n\t return deferred.promise;\n\t }\n\t return $q.reject(\"Invalid `md-component-id` value.\");\n\t }\n\t\n\t };\n\t\n\t function isValidID(handle){\n\t return handle && (handle !== \"\");\n\t }\n\t\n\t }\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t /**\n\t * @ngdoc service\n\t * @name $mdButtonInkRipple\n\t * @module material.core\n\t *\n\t * @description\n\t * Provides ripple effects for md-button. See $mdInkRipple service for all possible configuration options.\n\t *\n\t * @param {object=} scope Scope within the current context\n\t * @param {object=} element The element the ripple effect should be applied to\n\t * @param {object=} options (Optional) Configuration options to override the default ripple configuration\n\t */\n\t\n\t MdButtonInkRipple.$inject = [\"$mdInkRipple\"];\n\t angular.module('material.core')\n\t .factory('$mdButtonInkRipple', MdButtonInkRipple);\n\t\n\t function MdButtonInkRipple($mdInkRipple) {\n\t return {\n\t attach: function attachRipple(scope, element, options) {\n\t options = angular.extend(optionsForElement(element), options);\n\t\n\t return $mdInkRipple.attach(scope, element, options);\n\t }\n\t };\n\t\n\t function optionsForElement(element) {\n\t if (element.hasClass('md-icon-button')) {\n\t return {\n\t isMenuItem: element.hasClass('md-menu-item'),\n\t fitRipple: true,\n\t center: true\n\t };\n\t } else {\n\t return {\n\t isMenuItem: element.hasClass('md-menu-item'),\n\t dimBackground: true\n\t };\n\t }\n\t }\n\t }\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t /**\n\t * @ngdoc service\n\t * @name $mdCheckboxInkRipple\n\t * @module material.core\n\t *\n\t * @description\n\t * Provides ripple effects for md-checkbox. See $mdInkRipple service for all possible configuration options.\n\t *\n\t * @param {object=} scope Scope within the current context\n\t * @param {object=} element The element the ripple effect should be applied to\n\t * @param {object=} options (Optional) Configuration options to override the defaultripple configuration\n\t */\n\t\n\t MdCheckboxInkRipple.$inject = [\"$mdInkRipple\"];\n\t angular.module('material.core')\n\t .factory('$mdCheckboxInkRipple', MdCheckboxInkRipple);\n\t\n\t function MdCheckboxInkRipple($mdInkRipple) {\n\t return {\n\t attach: attach\n\t };\n\t\n\t function attach(scope, element, options) {\n\t return $mdInkRipple.attach(scope, element, angular.extend({\n\t center: true,\n\t dimBackground: false,\n\t fitRipple: true\n\t }, options));\n\t }\n\t }\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t /**\n\t * @ngdoc service\n\t * @name $mdListInkRipple\n\t * @module material.core\n\t *\n\t * @description\n\t * Provides ripple effects for md-list. See $mdInkRipple service for all possible configuration options.\n\t *\n\t * @param {object=} scope Scope within the current context\n\t * @param {object=} element The element the ripple effect should be applied to\n\t * @param {object=} options (Optional) Configuration options to override the defaultripple configuration\n\t */\n\t\n\t MdListInkRipple.$inject = [\"$mdInkRipple\"];\n\t angular.module('material.core')\n\t .factory('$mdListInkRipple', MdListInkRipple);\n\t\n\t function MdListInkRipple($mdInkRipple) {\n\t return {\n\t attach: attach\n\t };\n\t\n\t function attach(scope, element, options) {\n\t return $mdInkRipple.attach(scope, element, angular.extend({\n\t center: false,\n\t dimBackground: true,\n\t outline: false,\n\t rippleSize: 'full'\n\t }, options));\n\t }\n\t }\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.core.ripple\n\t * @description\n\t * Ripple\n\t */\n\tInkRippleCtrl.$inject = [\"$scope\", \"$element\", \"rippleOptions\", \"$window\", \"$timeout\", \"$mdUtil\", \"$mdColorUtil\"];\n\tInkRippleDirective.$inject = [\"$mdButtonInkRipple\", \"$mdCheckboxInkRipple\"];\n\tangular.module('material.core')\n\t .provider('$mdInkRipple', InkRippleProvider)\n\t .directive('mdInkRipple', InkRippleDirective)\n\t .directive('mdNoInk', attrNoDirective)\n\t .directive('mdNoBar', attrNoDirective)\n\t .directive('mdNoStretch', attrNoDirective);\n\t\n\tvar DURATION = 450;\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdInkRipple\n\t * @module material.core.ripple\n\t *\n\t * @description\n\t * The `md-ink-ripple` directive allows you to specify the ripple color or id a ripple is allowed.\n\t *\n\t * @param {string|boolean} md-ink-ripple A color string `#FF0000` or boolean (`false` or `0`) for preventing ripple\n\t *\n\t * @usage\n\t * ### String values\n\t * \n\t * \n\t * Ripples in red\n\t * \n\t *\n\t * \n\t * Not rippling\n\t * \n\t * \n\t *\n\t * ### Interpolated values\n\t * \n\t * \n\t * Ripples with the return value of 'randomColor' function\n\t * \n\t *\n\t * \n\t * Ripples if 'canRipple' function return value is not 'false' or '0'\n\t * \n\t * \n\t */\n\tfunction InkRippleDirective ($mdButtonInkRipple, $mdCheckboxInkRipple) {\n\t return {\n\t controller: angular.noop,\n\t link: function (scope, element, attr) {\n\t attr.hasOwnProperty('mdInkRippleCheckbox')\n\t ? $mdCheckboxInkRipple.attach(scope, element)\n\t : $mdButtonInkRipple.attach(scope, element);\n\t }\n\t };\n\t}\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdInkRipple\n\t * @module material.core.ripple\n\t *\n\t * @description\n\t * `$mdInkRipple` is a service for adding ripples to any element\n\t *\n\t * @usage\n\t * \n\t * app.factory('$myElementInkRipple', function($mdInkRipple) {\n\t * return {\n\t * attach: function (scope, element, options) {\n\t * return $mdInkRipple.attach(scope, element, angular.extend({\n\t * center: false,\n\t * dimBackground: true\n\t * }, options));\n\t * }\n\t * };\n\t * });\n\t *\n\t * app.controller('myController', function ($scope, $element, $myElementInkRipple) {\n\t * $scope.onClick = function (ev) {\n\t * $myElementInkRipple.attach($scope, angular.element(ev.target), { center: true });\n\t * }\n\t * });\n\t * \n\t *\n\t * ### Disabling ripples globally\n\t * If you want to disable ink ripples globally, for all components, you can call the\n\t * `disableInkRipple` method in your app's config.\n\t *\n\t * \n\t * app.config(function ($mdInkRippleProvider) {\n\t * $mdInkRippleProvider.disableInkRipple();\n\t * });\n\t */\n\t\n\tfunction InkRippleProvider () {\n\t var isDisabledGlobally = false;\n\t\n\t return {\n\t disableInkRipple: disableInkRipple,\n\t $get: [\"$injector\", function($injector) {\n\t return { attach: attach };\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdInkRipple#attach\n\t *\n\t * @description\n\t * Attaching given scope, element and options to inkRipple controller\n\t *\n\t * @param {object=} scope Scope within the current context\n\t * @param {object=} element The element the ripple effect should be applied to\n\t * @param {object=} options (Optional) Configuration options to override the defaultRipple configuration\n\t * * `center` - Whether the ripple should start from the center of the container element\n\t * * `dimBackground` - Whether the background should be dimmed with the ripple color\n\t * * `colorElement` - The element the ripple should take its color from, defined by css property `color`\n\t * * `fitRipple` - Whether the ripple should fill the element\n\t */\n\t function attach (scope, element, options) {\n\t if (isDisabledGlobally || element.controller('mdNoInk')) return angular.noop;\n\t return $injector.instantiate(InkRippleCtrl, {\n\t $scope: scope,\n\t $element: element,\n\t rippleOptions: options\n\t });\n\t }\n\t }]\n\t };\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdInkRipple#disableInkRipple\n\t *\n\t * @description\n\t * A config-time method that, when called, disables ripples globally.\n\t */\n\t function disableInkRipple () {\n\t isDisabledGlobally = true;\n\t }\n\t}\n\t\n\t/**\n\t * Controller used by the ripple service in order to apply ripples\n\t * @ngInject\n\t */\n\tfunction InkRippleCtrl ($scope, $element, rippleOptions, $window, $timeout, $mdUtil, $mdColorUtil) {\n\t this.$window = $window;\n\t this.$timeout = $timeout;\n\t this.$mdUtil = $mdUtil;\n\t this.$mdColorUtil = $mdColorUtil;\n\t this.$scope = $scope;\n\t this.$element = $element;\n\t this.options = rippleOptions;\n\t this.mousedown = false;\n\t this.ripples = [];\n\t this.timeout = null; // Stores a reference to the most-recent ripple timeout\n\t this.lastRipple = null;\n\t\n\t $mdUtil.valueOnUse(this, 'container', this.createContainer);\n\t\n\t this.$element.addClass('md-ink-ripple');\n\t\n\t // attach method for unit tests\n\t ($element.controller('mdInkRipple') || {}).createRipple = angular.bind(this, this.createRipple);\n\t ($element.controller('mdInkRipple') || {}).setColor = angular.bind(this, this.color);\n\t\n\t this.bindEvents();\n\t}\n\t\n\t\n\t/**\n\t * Either remove or unlock any remaining ripples when the user mouses off of the element (either by\n\t * mouseup or mouseleave event)\n\t */\n\tfunction autoCleanup (self, cleanupFn) {\n\t\n\t if ( self.mousedown || self.lastRipple ) {\n\t self.mousedown = false;\n\t self.$mdUtil.nextTick( angular.bind(self, cleanupFn), false);\n\t }\n\t\n\t}\n\t\n\t\n\t/**\n\t * Returns the color that the ripple should be (either based on CSS or hard-coded)\n\t * @returns {string}\n\t */\n\tInkRippleCtrl.prototype.color = function (value) {\n\t var self = this;\n\t\n\t // If assigning a color value, apply it to background and the ripple color\n\t if (angular.isDefined(value)) {\n\t self._color = self._parseColor(value);\n\t }\n\t\n\t // If color lookup, use assigned, defined, or inherited\n\t return self._color || self._parseColor( self.inkRipple() ) || self._parseColor( getElementColor() );\n\t\n\t /**\n\t * Finds the color element and returns its text color for use as default ripple color\n\t * @returns {string}\n\t */\n\t function getElementColor () {\n\t var items = self.options && self.options.colorElement ? self.options.colorElement : [];\n\t var elem = items.length ? items[ 0 ] : self.$element[ 0 ];\n\t\n\t return elem ? self.$window.getComputedStyle(elem).color : 'rgb(0,0,0)';\n\t }\n\t};\n\t\n\t/**\n\t * Updating the ripple colors based on the current inkRipple value\n\t * or the element's computed style color\n\t */\n\tInkRippleCtrl.prototype.calculateColor = function () {\n\t return this.color();\n\t};\n\t\n\t\n\t/**\n\t * Takes a string color and converts it to RGBA format\n\t * @param color {string}\n\t * @param [multiplier] {int}\n\t * @returns {string}\n\t */\n\t\n\tInkRippleCtrl.prototype._parseColor = function parseColor (color, multiplier) {\n\t multiplier = multiplier || 1;\n\t var colorUtil = this.$mdColorUtil;\n\t\n\t if (!color) return;\n\t if (color.indexOf('rgba') === 0) return color.replace(/\\d?\\.?\\d*\\s*\\)\\s*$/, (0.1 * multiplier).toString() + ')');\n\t if (color.indexOf('rgb') === 0) return colorUtil.rgbToRgba(color);\n\t if (color.indexOf('#') === 0) return colorUtil.hexToRgba(color);\n\t\n\t};\n\t\n\t/**\n\t * Binds events to the root element for\n\t */\n\tInkRippleCtrl.prototype.bindEvents = function () {\n\t this.$element.on('mousedown', angular.bind(this, this.handleMousedown));\n\t this.$element.on('mouseup touchend', angular.bind(this, this.handleMouseup));\n\t this.$element.on('mouseleave', angular.bind(this, this.handleMouseup));\n\t this.$element.on('touchmove', angular.bind(this, this.handleTouchmove));\n\t};\n\t\n\t/**\n\t * Create a new ripple on every mousedown event from the root element\n\t * @param event {MouseEvent}\n\t */\n\tInkRippleCtrl.prototype.handleMousedown = function (event) {\n\t if ( this.mousedown ) return;\n\t\n\t // When jQuery is loaded, we have to get the original event\n\t if (event.hasOwnProperty('originalEvent')) event = event.originalEvent;\n\t this.mousedown = true;\n\t if (this.options.center) {\n\t this.createRipple(this.container.prop('clientWidth') / 2, this.container.prop('clientWidth') / 2);\n\t } else {\n\t\n\t // We need to calculate the relative coordinates if the target is a sublayer of the ripple element\n\t if (event.srcElement !== this.$element[0]) {\n\t var layerRect = this.$element[0].getBoundingClientRect();\n\t var layerX = event.clientX - layerRect.left;\n\t var layerY = event.clientY - layerRect.top;\n\t\n\t this.createRipple(layerX, layerY);\n\t } else {\n\t this.createRipple(event.offsetX, event.offsetY);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Either remove or unlock any remaining ripples when the user mouses off of the element (either by\n\t * mouseup, touchend or mouseleave event)\n\t */\n\tInkRippleCtrl.prototype.handleMouseup = function () {\n\t autoCleanup(this, this.clearRipples);\n\t};\n\t\n\t/**\n\t * Either remove or unlock any remaining ripples when the user mouses off of the element (by\n\t * touchmove)\n\t */\n\tInkRippleCtrl.prototype.handleTouchmove = function () {\n\t autoCleanup(this, this.deleteRipples);\n\t};\n\t\n\t/**\n\t * Cycles through all ripples and attempts to remove them.\n\t */\n\tInkRippleCtrl.prototype.deleteRipples = function () {\n\t for (var i = 0; i < this.ripples.length; i++) {\n\t this.ripples[ i ].remove();\n\t }\n\t};\n\t\n\t/**\n\t * Cycles through all ripples and attempts to remove them with fade.\n\t * Depending on logic within `fadeInComplete`, some removals will be postponed.\n\t */\n\tInkRippleCtrl.prototype.clearRipples = function () {\n\t for (var i = 0; i < this.ripples.length; i++) {\n\t this.fadeInComplete(this.ripples[ i ]);\n\t }\n\t};\n\t\n\t/**\n\t * Creates the ripple container element\n\t * @returns {*}\n\t */\n\tInkRippleCtrl.prototype.createContainer = function () {\n\t var container = angular.element('
');\n\t this.$element.append(container);\n\t return container;\n\t};\n\t\n\tInkRippleCtrl.prototype.clearTimeout = function () {\n\t if (this.timeout) {\n\t this.$timeout.cancel(this.timeout);\n\t this.timeout = null;\n\t }\n\t};\n\t\n\tInkRippleCtrl.prototype.isRippleAllowed = function () {\n\t var element = this.$element[0];\n\t do {\n\t if (!element.tagName || element.tagName === 'BODY') break;\n\t\n\t if (element && angular.isFunction(element.hasAttribute)) {\n\t if (element.hasAttribute('disabled')) return false;\n\t if (this.inkRipple() === 'false' || this.inkRipple() === '0') return false;\n\t }\n\t\n\t } while (element = element.parentNode);\n\t return true;\n\t};\n\t\n\t/**\n\t * The attribute `md-ink-ripple` may be a static or interpolated\n\t * color value OR a boolean indicator (used to disable ripples)\n\t */\n\tInkRippleCtrl.prototype.inkRipple = function () {\n\t return this.$element.attr('md-ink-ripple');\n\t};\n\t\n\t/**\n\t * Creates a new ripple and adds it to the container. Also tracks ripple in `this.ripples`.\n\t * @param left\n\t * @param top\n\t */\n\tInkRippleCtrl.prototype.createRipple = function (left, top) {\n\t if (!this.isRippleAllowed()) return;\n\t\n\t var ctrl = this;\n\t var colorUtil = ctrl.$mdColorUtil;\n\t var ripple = angular.element('
');\n\t var width = this.$element.prop('clientWidth');\n\t var height = this.$element.prop('clientHeight');\n\t var x = Math.max(Math.abs(width - left), left) * 2;\n\t var y = Math.max(Math.abs(height - top), top) * 2;\n\t var size = getSize(this.options.fitRipple, x, y);\n\t var color = this.calculateColor();\n\t\n\t ripple.css({\n\t left: left + 'px',\n\t top: top + 'px',\n\t background: 'black',\n\t width: size + 'px',\n\t height: size + 'px',\n\t backgroundColor: colorUtil.rgbaToRgb(color),\n\t borderColor: colorUtil.rgbaToRgb(color)\n\t });\n\t this.lastRipple = ripple;\n\t\n\t // we only want one timeout to be running at a time\n\t this.clearTimeout();\n\t this.timeout = this.$timeout(function () {\n\t ctrl.clearTimeout();\n\t if (!ctrl.mousedown) ctrl.fadeInComplete(ripple);\n\t }, DURATION * 0.35, false);\n\t\n\t if (this.options.dimBackground) this.container.css({ backgroundColor: color });\n\t this.container.append(ripple);\n\t this.ripples.push(ripple);\n\t ripple.addClass('md-ripple-placed');\n\t\n\t this.$mdUtil.nextTick(function () {\n\t\n\t ripple.addClass('md-ripple-scaled md-ripple-active');\n\t ctrl.$timeout(function () {\n\t ctrl.clearRipples();\n\t }, DURATION, false);\n\t\n\t }, false);\n\t\n\t function getSize (fit, x, y) {\n\t return fit\n\t ? Math.max(x, y)\n\t : Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n\t }\n\t};\n\t\n\t\n\t\n\t/**\n\t * After fadeIn finishes, either kicks off the fade-out animation or queues the element for removal on mouseup\n\t * @param ripple\n\t */\n\tInkRippleCtrl.prototype.fadeInComplete = function (ripple) {\n\t if (this.lastRipple === ripple) {\n\t if (!this.timeout && !this.mousedown) {\n\t this.removeRipple(ripple);\n\t }\n\t } else {\n\t this.removeRipple(ripple);\n\t }\n\t};\n\t\n\t/**\n\t * Kicks off the animation for removing a ripple\n\t * @param ripple {Element}\n\t */\n\tInkRippleCtrl.prototype.removeRipple = function (ripple) {\n\t var ctrl = this;\n\t var index = this.ripples.indexOf(ripple);\n\t if (index < 0) return;\n\t this.ripples.splice(this.ripples.indexOf(ripple), 1);\n\t ripple.removeClass('md-ripple-active');\n\t ripple.addClass('md-ripple-remove');\n\t if (this.ripples.length === 0) this.container.css({ backgroundColor: '' });\n\t // use a 2-second timeout in order to allow for the animation to finish\n\t // we don't actually care how long the animation takes\n\t this.$timeout(function () {\n\t ctrl.fadeOutComplete(ripple);\n\t }, DURATION, false);\n\t};\n\t\n\t/**\n\t * Removes the provided ripple from the DOM\n\t * @param ripple\n\t */\n\tInkRippleCtrl.prototype.fadeOutComplete = function (ripple) {\n\t ripple.remove();\n\t this.lastRipple = null;\n\t};\n\t\n\t/**\n\t * Used to create an empty directive. This is used to track flag-directives whose children may have\n\t * functionality based on them.\n\t *\n\t * Example: `md-no-ink` will potentially be used by all child directives.\n\t */\n\tfunction attrNoDirective () {\n\t return { controller: angular.noop };\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t /**\n\t * @ngdoc service\n\t * @name $mdTabInkRipple\n\t * @module material.core\n\t *\n\t * @description\n\t * Provides ripple effects for md-tabs. See $mdInkRipple service for all possible configuration options.\n\t *\n\t * @param {object=} scope Scope within the current context\n\t * @param {object=} element The element the ripple effect should be applied to\n\t * @param {object=} options (Optional) Configuration options to override the defaultripple configuration\n\t */\n\t\n\t MdTabInkRipple.$inject = [\"$mdInkRipple\"];\n\t angular.module('material.core')\n\t .factory('$mdTabInkRipple', MdTabInkRipple);\n\t\n\t function MdTabInkRipple($mdInkRipple) {\n\t return {\n\t attach: attach\n\t };\n\t\n\t function attach(scope, element, options) {\n\t return $mdInkRipple.attach(scope, element, angular.extend({\n\t center: false,\n\t dimBackground: true,\n\t outline: false,\n\t rippleSize: 'full'\n\t }, options));\n\t }\n\t }\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\tangular.module('material.core.theming.palette', [])\n\t.constant('$mdColorPalette', {\n\t 'red': {\n\t '50': '#ffebee',\n\t '100': '#ffcdd2',\n\t '200': '#ef9a9a',\n\t '300': '#e57373',\n\t '400': '#ef5350',\n\t '500': '#f44336',\n\t '600': '#e53935',\n\t '700': '#d32f2f',\n\t '800': '#c62828',\n\t '900': '#b71c1c',\n\t 'A100': '#ff8a80',\n\t 'A200': '#ff5252',\n\t 'A400': '#ff1744',\n\t 'A700': '#d50000',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 300 A100',\n\t 'contrastStrongLightColors': '400 500 600 700 A200 A400 A700'\n\t },\n\t 'pink': {\n\t '50': '#fce4ec',\n\t '100': '#f8bbd0',\n\t '200': '#f48fb1',\n\t '300': '#f06292',\n\t '400': '#ec407a',\n\t '500': '#e91e63',\n\t '600': '#d81b60',\n\t '700': '#c2185b',\n\t '800': '#ad1457',\n\t '900': '#880e4f',\n\t 'A100': '#ff80ab',\n\t 'A200': '#ff4081',\n\t 'A400': '#f50057',\n\t 'A700': '#c51162',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 A100',\n\t 'contrastStrongLightColors': '500 600 A200 A400 A700'\n\t },\n\t 'purple': {\n\t '50': '#f3e5f5',\n\t '100': '#e1bee7',\n\t '200': '#ce93d8',\n\t '300': '#ba68c8',\n\t '400': '#ab47bc',\n\t '500': '#9c27b0',\n\t '600': '#8e24aa',\n\t '700': '#7b1fa2',\n\t '800': '#6a1b9a',\n\t '900': '#4a148c',\n\t 'A100': '#ea80fc',\n\t 'A200': '#e040fb',\n\t 'A400': '#d500f9',\n\t 'A700': '#aa00ff',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 A100',\n\t 'contrastStrongLightColors': '300 400 A200 A400 A700'\n\t },\n\t 'deep-purple': {\n\t '50': '#ede7f6',\n\t '100': '#d1c4e9',\n\t '200': '#b39ddb',\n\t '300': '#9575cd',\n\t '400': '#7e57c2',\n\t '500': '#673ab7',\n\t '600': '#5e35b1',\n\t '700': '#512da8',\n\t '800': '#4527a0',\n\t '900': '#311b92',\n\t 'A100': '#b388ff',\n\t 'A200': '#7c4dff',\n\t 'A400': '#651fff',\n\t 'A700': '#6200ea',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 A100',\n\t 'contrastStrongLightColors': '300 400 A200'\n\t },\n\t 'indigo': {\n\t '50': '#e8eaf6',\n\t '100': '#c5cae9',\n\t '200': '#9fa8da',\n\t '300': '#7986cb',\n\t '400': '#5c6bc0',\n\t '500': '#3f51b5',\n\t '600': '#3949ab',\n\t '700': '#303f9f',\n\t '800': '#283593',\n\t '900': '#1a237e',\n\t 'A100': '#8c9eff',\n\t 'A200': '#536dfe',\n\t 'A400': '#3d5afe',\n\t 'A700': '#304ffe',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 A100',\n\t 'contrastStrongLightColors': '300 400 A200 A400'\n\t },\n\t 'blue': {\n\t '50': '#e3f2fd',\n\t '100': '#bbdefb',\n\t '200': '#90caf9',\n\t '300': '#64b5f6',\n\t '400': '#42a5f5',\n\t '500': '#2196f3',\n\t '600': '#1e88e5',\n\t '700': '#1976d2',\n\t '800': '#1565c0',\n\t '900': '#0d47a1',\n\t 'A100': '#82b1ff',\n\t 'A200': '#448aff',\n\t 'A400': '#2979ff',\n\t 'A700': '#2962ff',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 300 400 A100',\n\t 'contrastStrongLightColors': '500 600 700 A200 A400 A700'\n\t },\n\t 'light-blue': {\n\t '50': '#e1f5fe',\n\t '100': '#b3e5fc',\n\t '200': '#81d4fa',\n\t '300': '#4fc3f7',\n\t '400': '#29b6f6',\n\t '500': '#03a9f4',\n\t '600': '#039be5',\n\t '700': '#0288d1',\n\t '800': '#0277bd',\n\t '900': '#01579b',\n\t 'A100': '#80d8ff',\n\t 'A200': '#40c4ff',\n\t 'A400': '#00b0ff',\n\t 'A700': '#0091ea',\n\t 'contrastDefaultColor': 'dark',\n\t 'contrastLightColors': '600 700 800 900 A700',\n\t 'contrastStrongLightColors': '600 700 800 A700'\n\t },\n\t 'cyan': {\n\t '50': '#e0f7fa',\n\t '100': '#b2ebf2',\n\t '200': '#80deea',\n\t '300': '#4dd0e1',\n\t '400': '#26c6da',\n\t '500': '#00bcd4',\n\t '600': '#00acc1',\n\t '700': '#0097a7',\n\t '800': '#00838f',\n\t '900': '#006064',\n\t 'A100': '#84ffff',\n\t 'A200': '#18ffff',\n\t 'A400': '#00e5ff',\n\t 'A700': '#00b8d4',\n\t 'contrastDefaultColor': 'dark',\n\t 'contrastLightColors': '700 800 900',\n\t 'contrastStrongLightColors': '700 800 900'\n\t },\n\t 'teal': {\n\t '50': '#e0f2f1',\n\t '100': '#b2dfdb',\n\t '200': '#80cbc4',\n\t '300': '#4db6ac',\n\t '400': '#26a69a',\n\t '500': '#009688',\n\t '600': '#00897b',\n\t '700': '#00796b',\n\t '800': '#00695c',\n\t '900': '#004d40',\n\t 'A100': '#a7ffeb',\n\t 'A200': '#64ffda',\n\t 'A400': '#1de9b6',\n\t 'A700': '#00bfa5',\n\t 'contrastDefaultColor': 'dark',\n\t 'contrastLightColors': '500 600 700 800 900',\n\t 'contrastStrongLightColors': '500 600 700'\n\t },\n\t 'green': {\n\t '50': '#e8f5e9',\n\t '100': '#c8e6c9',\n\t '200': '#a5d6a7',\n\t '300': '#81c784',\n\t '400': '#66bb6a',\n\t '500': '#4caf50',\n\t '600': '#43a047',\n\t '700': '#388e3c',\n\t '800': '#2e7d32',\n\t '900': '#1b5e20',\n\t 'A100': '#b9f6ca',\n\t 'A200': '#69f0ae',\n\t 'A400': '#00e676',\n\t 'A700': '#00c853',\n\t 'contrastDefaultColor': 'dark',\n\t 'contrastLightColors': '500 600 700 800 900',\n\t 'contrastStrongLightColors': '500 600 700'\n\t },\n\t 'light-green': {\n\t '50': '#f1f8e9',\n\t '100': '#dcedc8',\n\t '200': '#c5e1a5',\n\t '300': '#aed581',\n\t '400': '#9ccc65',\n\t '500': '#8bc34a',\n\t '600': '#7cb342',\n\t '700': '#689f38',\n\t '800': '#558b2f',\n\t '900': '#33691e',\n\t 'A100': '#ccff90',\n\t 'A200': '#b2ff59',\n\t 'A400': '#76ff03',\n\t 'A700': '#64dd17',\n\t 'contrastDefaultColor': 'dark',\n\t 'contrastLightColors': '700 800 900',\n\t 'contrastStrongLightColors': '700 800 900'\n\t },\n\t 'lime': {\n\t '50': '#f9fbe7',\n\t '100': '#f0f4c3',\n\t '200': '#e6ee9c',\n\t '300': '#dce775',\n\t '400': '#d4e157',\n\t '500': '#cddc39',\n\t '600': '#c0ca33',\n\t '700': '#afb42b',\n\t '800': '#9e9d24',\n\t '900': '#827717',\n\t 'A100': '#f4ff81',\n\t 'A200': '#eeff41',\n\t 'A400': '#c6ff00',\n\t 'A700': '#aeea00',\n\t 'contrastDefaultColor': 'dark',\n\t 'contrastLightColors': '900',\n\t 'contrastStrongLightColors': '900'\n\t },\n\t 'yellow': {\n\t '50': '#fffde7',\n\t '100': '#fff9c4',\n\t '200': '#fff59d',\n\t '300': '#fff176',\n\t '400': '#ffee58',\n\t '500': '#ffeb3b',\n\t '600': '#fdd835',\n\t '700': '#fbc02d',\n\t '800': '#f9a825',\n\t '900': '#f57f17',\n\t 'A100': '#ffff8d',\n\t 'A200': '#ffff00',\n\t 'A400': '#ffea00',\n\t 'A700': '#ffd600',\n\t 'contrastDefaultColor': 'dark'\n\t },\n\t 'amber': {\n\t '50': '#fff8e1',\n\t '100': '#ffecb3',\n\t '200': '#ffe082',\n\t '300': '#ffd54f',\n\t '400': '#ffca28',\n\t '500': '#ffc107',\n\t '600': '#ffb300',\n\t '700': '#ffa000',\n\t '800': '#ff8f00',\n\t '900': '#ff6f00',\n\t 'A100': '#ffe57f',\n\t 'A200': '#ffd740',\n\t 'A400': '#ffc400',\n\t 'A700': '#ffab00',\n\t 'contrastDefaultColor': 'dark'\n\t },\n\t 'orange': {\n\t '50': '#fff3e0',\n\t '100': '#ffe0b2',\n\t '200': '#ffcc80',\n\t '300': '#ffb74d',\n\t '400': '#ffa726',\n\t '500': '#ff9800',\n\t '600': '#fb8c00',\n\t '700': '#f57c00',\n\t '800': '#ef6c00',\n\t '900': '#e65100',\n\t 'A100': '#ffd180',\n\t 'A200': '#ffab40',\n\t 'A400': '#ff9100',\n\t 'A700': '#ff6d00',\n\t 'contrastDefaultColor': 'dark',\n\t 'contrastLightColors': '800 900',\n\t 'contrastStrongLightColors': '800 900'\n\t },\n\t 'deep-orange': {\n\t '50': '#fbe9e7',\n\t '100': '#ffccbc',\n\t '200': '#ffab91',\n\t '300': '#ff8a65',\n\t '400': '#ff7043',\n\t '500': '#ff5722',\n\t '600': '#f4511e',\n\t '700': '#e64a19',\n\t '800': '#d84315',\n\t '900': '#bf360c',\n\t 'A100': '#ff9e80',\n\t 'A200': '#ff6e40',\n\t 'A400': '#ff3d00',\n\t 'A700': '#dd2c00',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 300 400 A100 A200',\n\t 'contrastStrongLightColors': '500 600 700 800 900 A400 A700'\n\t },\n\t 'brown': {\n\t '50': '#efebe9',\n\t '100': '#d7ccc8',\n\t '200': '#bcaaa4',\n\t '300': '#a1887f',\n\t '400': '#8d6e63',\n\t '500': '#795548',\n\t '600': '#6d4c41',\n\t '700': '#5d4037',\n\t '800': '#4e342e',\n\t '900': '#3e2723',\n\t 'A100': '#d7ccc8',\n\t 'A200': '#bcaaa4',\n\t 'A400': '#8d6e63',\n\t 'A700': '#5d4037',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 A100 A200',\n\t 'contrastStrongLightColors': '300 400'\n\t },\n\t 'grey': {\n\t '50': '#fafafa',\n\t '100': '#f5f5f5',\n\t '200': '#eeeeee',\n\t '300': '#e0e0e0',\n\t '400': '#bdbdbd',\n\t '500': '#9e9e9e',\n\t '600': '#757575',\n\t '700': '#616161',\n\t '800': '#424242',\n\t '900': '#212121',\n\t 'A100': '#ffffff',\n\t 'A200': '#000000',\n\t 'A400': '#303030',\n\t 'A700': '#616161',\n\t 'contrastDefaultColor': 'dark',\n\t 'contrastLightColors': '600 700 800 900 A200 A400 A700'\n\t },\n\t 'blue-grey': {\n\t '50': '#eceff1',\n\t '100': '#cfd8dc',\n\t '200': '#b0bec5',\n\t '300': '#90a4ae',\n\t '400': '#78909c',\n\t '500': '#607d8b',\n\t '600': '#546e7a',\n\t '700': '#455a64',\n\t '800': '#37474f',\n\t '900': '#263238',\n\t 'A100': '#cfd8dc',\n\t 'A200': '#b0bec5',\n\t 'A400': '#78909c',\n\t 'A700': '#455a64',\n\t 'contrastDefaultColor': 'light',\n\t 'contrastDarkColors': '50 100 200 300 A100 A200',\n\t 'contrastStrongLightColors': '400 500 700'\n\t }\n\t});\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function(angular) {\n\t 'use strict';\n\t/**\n\t * @ngdoc module\n\t * @name material.core.theming\n\t * @description\n\t * Theming\n\t */\n\tdetectDisabledThemes.$inject = [\"$mdThemingProvider\"];\n\tThemingDirective.$inject = [\"$mdTheming\", \"$interpolate\", \"$parse\", \"$mdUtil\", \"$q\", \"$log\"];\n\tThemableDirective.$inject = [\"$mdTheming\"];\n\tThemingProvider.$inject = [\"$mdColorPalette\", \"$$mdMetaProvider\"];\n\tgenerateAllThemes.$inject = [\"$injector\", \"$mdTheming\"];\n\tangular.module('material.core.theming', ['material.core.theming.palette', 'material.core.meta'])\n\t .directive('mdTheme', ThemingDirective)\n\t .directive('mdThemable', ThemableDirective)\n\t .directive('mdThemesDisabled', disableThemesDirective )\n\t .provider('$mdTheming', ThemingProvider)\n\t .config( detectDisabledThemes )\n\t .run(generateAllThemes);\n\t\n\t/**\n\t * Detect if the HTML or the BODY tags has a [md-themes-disabled] attribute\n\t * If yes, then immediately disable all theme stylesheet generation and DOM injection\n\t */\n\t/**\n\t * @ngInject\n\t */\n\tfunction detectDisabledThemes($mdThemingProvider) {\n\t var isDisabled = !!document.querySelector('[md-themes-disabled]');\n\t $mdThemingProvider.disableTheming(isDisabled);\n\t}\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdThemingProvider\n\t * @module material.core.theming\n\t *\n\t * @description Provider to configure the `$mdTheming` service.\n\t *\n\t * ### Default Theme\n\t * The `$mdThemingProvider` uses by default the following theme configuration:\n\t *\n\t * - Primary Palette: `Blue`\n\t * - Accent Palette: `Pink`\n\t * - Warn Palette: `Deep-Orange`\n\t * - Background Palette: `Grey`\n\t *\n\t * If you don't want to use the `md-theme` directive on the elements itself, you may want to overwrite\n\t * the default theme.
\n\t * This can be done by using the following markup.\n\t *\n\t * \n\t * myAppModule.config(function($mdThemingProvider) {\n\t * $mdThemingProvider\n\t * .theme('default')\n\t * .primaryPalette('blue')\n\t * .accentPalette('teal')\n\t * .warnPalette('red')\n\t * .backgroundPalette('grey');\n\t * });\n\t * \n\t *\n\t\n\t * ### Dynamic Themes\n\t *\n\t * By default, if you change a theme at runtime, the `$mdTheming` service will not detect those changes.
\n\t * If you have an application, which changes its theme on runtime, you have to enable theme watching.\n\t *\n\t * \n\t * myAppModule.config(function($mdThemingProvider) {\n\t * // Enable theme watching.\n\t * $mdThemingProvider.alwaysWatchTheme(true);\n\t * });\n\t * \n\t *\n\t * ### Custom Theme Styles\n\t *\n\t * Sometimes you may want to use your own theme styles for some custom components.
\n\t * You are able to register your own styles by using the following markup.\n\t *\n\t * \n\t * myAppModule.config(function($mdThemingProvider) {\n\t * // Register our custom stylesheet into the theming provider.\n\t * $mdThemingProvider.registerStyles(STYLESHEET);\n\t * });\n\t * \n\t *\n\t * The `registerStyles` method only accepts strings as value, so you're actually not able to load an external\n\t * stylesheet file into the `$mdThemingProvider`.\n\t *\n\t * If it's necessary to load an external stylesheet, we suggest using a bundler, which supports including raw content,\n\t * like [raw-loader](https://github.com/webpack/raw-loader) for `webpack`.\n\t *\n\t * \n\t * myAppModule.config(function($mdThemingProvider) {\n\t * // Register your custom stylesheet into the theming provider.\n\t * $mdThemingProvider.registerStyles(require('../styles/my-component.theme.css'));\n\t * });\n\t * \n\t *\n\t * ### Browser color\n\t *\n\t * Enables browser header coloring\n\t * for more info please visit:\n\t * https://developers.google.com/web/fundamentals/design-and-ui/browser-customization/theme-color\n\t *\n\t * Options parameter:
\n\t * `theme` - A defined theme via `$mdThemeProvider` to use the palettes from. Default is `default` theme.
\n\t * `palette` - Can be any one of the basic material design palettes, extended defined palettes and 'primary',\n\t * 'accent', 'background' and 'warn'. Default is `primary`.
\n\t * `hue` - The hue from the selected palette. Default is `800`
\n\t *\n\t * \n\t * myAppModule.config(function($mdThemingProvider) {\n\t * // Enable browser color\n\t * $mdThemingProvider.enableBrowserColor({\n\t * theme: 'myTheme', // Default is 'default'\n\t * palette: 'accent', // Default is 'primary', any basic material palette and extended palettes are available\n\t * hue: '200' // Default is '800'\n\t * });\n\t * });\n\t * \n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdThemingProvider#registerStyles\n\t * @param {string} styles The styles to be appended to AngularJS Material's built in theme css.\n\t */\n\t/**\n\t * @ngdoc method\n\t * @name $mdThemingProvider#setNonce\n\t * @param {string} nonceValue The nonce to be added as an attribute to the theme style tags.\n\t * Setting a value allows the use of CSP policy without using the unsafe-inline directive.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdThemingProvider#setDefaultTheme\n\t * @param {string} themeName Default theme name to be applied to elements. Default value is `default`.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdThemingProvider#alwaysWatchTheme\n\t * @param {boolean} watch Whether or not to always watch themes for changes and re-apply\n\t * classes when they change. Default is `false`. Enabling can reduce performance.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdThemingProvider#enableBrowserColor\n\t * @param {Object=} options Options object for the browser color
\n\t * `theme` - A defined theme via `$mdThemeProvider` to use the palettes from. Default is `default` theme.
\n\t * `palette` - Can be any one of the basic material design palettes, extended defined palettes and 'primary',\n\t * 'accent', 'background' and 'warn'. Default is `primary`.
\n\t * `hue` - The hue from the selected palette. Default is `800`
\n\t * @returns {Function} remove function of the browser color\n\t */\n\t\n\t/* Some Example Valid Theming Expressions\n\t * =======================================\n\t *\n\t * Intention group expansion: (valid for primary, accent, warn, background)\n\t *\n\t * {{primary-100}} - grab shade 100 from the primary palette\n\t * {{primary-100-0.7}} - grab shade 100, apply opacity of 0.7\n\t * {{primary-100-contrast}} - grab shade 100's contrast color\n\t * {{primary-hue-1}} - grab the shade assigned to hue-1 from the primary palette\n\t * {{primary-hue-1-0.7}} - apply 0.7 opacity to primary-hue-1\n\t * {{primary-color}} - Generates .md-hue-1, .md-hue-2, .md-hue-3 with configured shades set for each hue\n\t * {{primary-color-0.7}} - Apply 0.7 opacity to each of the above rules\n\t * {{primary-contrast}} - Generates .md-hue-1, .md-hue-2, .md-hue-3 with configured contrast (ie. text) color shades set for each hue\n\t * {{primary-contrast-0.7}} - Apply 0.7 opacity to each of the above rules\n\t *\n\t * Foreground expansion: Applies rgba to black/white foreground text\n\t *\n\t * {{foreground-1}} - used for primary text\n\t * {{foreground-2}} - used for secondary text/divider\n\t * {{foreground-3}} - used for disabled text\n\t * {{foreground-4}} - used for dividers\n\t *\n\t */\n\t\n\t// In memory generated CSS rules; registered by theme.name\n\tvar GENERATED = { };\n\t\n\t// In memory storage of defined themes and color palettes (both loaded by CSS, and user specified)\n\tvar PALETTES;\n\t\n\t// Text Colors on light and dark backgrounds\n\t// @see https://www.google.com/design/spec/style/color.html#color-text-background-colors\n\tvar DARK_FOREGROUND = {\n\t name: 'dark',\n\t '1': 'rgba(0,0,0,0.87)',\n\t '2': 'rgba(0,0,0,0.54)',\n\t '3': 'rgba(0,0,0,0.38)',\n\t '4': 'rgba(0,0,0,0.12)'\n\t};\n\tvar LIGHT_FOREGROUND = {\n\t name: 'light',\n\t '1': 'rgba(255,255,255,1.0)',\n\t '2': 'rgba(255,255,255,0.7)',\n\t '3': 'rgba(255,255,255,0.5)',\n\t '4': 'rgba(255,255,255,0.12)'\n\t};\n\t\n\tvar DARK_SHADOW = '1px 1px 0px rgba(0,0,0,0.4), -1px -1px 0px rgba(0,0,0,0.4)';\n\tvar LIGHT_SHADOW = '';\n\t\n\tvar DARK_CONTRAST_COLOR = colorToRgbaArray('rgba(0,0,0,0.87)');\n\tvar LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgba(255,255,255,0.87)');\n\tvar STRONG_LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgb(255,255,255)');\n\t\n\tvar THEME_COLOR_TYPES = ['primary', 'accent', 'warn', 'background'];\n\tvar DEFAULT_COLOR_TYPE = 'primary';\n\t\n\t// A color in a theme will use these hues by default, if not specified by user.\n\tvar LIGHT_DEFAULT_HUES = {\n\t 'accent': {\n\t 'default': 'A200',\n\t 'hue-1': 'A100',\n\t 'hue-2': 'A400',\n\t 'hue-3': 'A700'\n\t },\n\t 'background': {\n\t 'default': '50',\n\t 'hue-1': 'A100',\n\t 'hue-2': '100',\n\t 'hue-3': '300'\n\t }\n\t};\n\t\n\tvar DARK_DEFAULT_HUES = {\n\t 'background': {\n\t 'default': 'A400',\n\t 'hue-1': '800',\n\t 'hue-2': '900',\n\t 'hue-3': 'A200'\n\t }\n\t};\n\tTHEME_COLOR_TYPES.forEach(function(colorType) {\n\t // Color types with unspecified default hues will use these default hue values\n\t var defaultDefaultHues = {\n\t 'default': '500',\n\t 'hue-1': '300',\n\t 'hue-2': '800',\n\t 'hue-3': 'A100'\n\t };\n\t if (!LIGHT_DEFAULT_HUES[colorType]) LIGHT_DEFAULT_HUES[colorType] = defaultDefaultHues;\n\t if (!DARK_DEFAULT_HUES[colorType]) DARK_DEFAULT_HUES[colorType] = defaultDefaultHues;\n\t});\n\t\n\tvar VALID_HUE_VALUES = [\n\t '50', '100', '200', '300', '400', '500', '600',\n\t '700', '800', '900', 'A100', 'A200', 'A400', 'A700'\n\t];\n\t\n\tvar themeConfig = {\n\t disableTheming : false, // Generate our themes at run time; also disable stylesheet DOM injection\n\t generateOnDemand : false, // Whether or not themes are to be generated on-demand (vs. eagerly).\n\t registeredStyles : [], // Custom styles registered to be used in the theming of custom components.\n\t nonce : null // Nonce to be added as an attribute to the generated themes style tags.\n\t};\n\t\n\t/**\n\t *\n\t */\n\tfunction ThemingProvider($mdColorPalette, $$mdMetaProvider) {\n\t ThemingService.$inject = [\"$rootScope\", \"$mdUtil\", \"$q\", \"$log\"];\n\t PALETTES = { };\n\t var THEMES = { };\n\t\n\t var themingProvider;\n\t\n\t var alwaysWatchTheme = false;\n\t var defaultTheme = 'default';\n\t\n\t // Load JS Defined Palettes\n\t angular.extend(PALETTES, $mdColorPalette);\n\t\n\t // Default theme defined in core.js\n\t\n\t /**\n\t * Adds `theme-color` and `msapplication-navbutton-color` meta tags with the color parameter\n\t * @param {string} color Hex value of the wanted browser color\n\t * @returns {Function} Remove function of the meta tags\n\t */\n\t var setBrowserColor = function (color) {\n\t // Chrome, Firefox OS and Opera\n\t var removeChrome = $$mdMetaProvider.setMeta('theme-color', color);\n\t // Windows Phone\n\t var removeWindows = $$mdMetaProvider.setMeta('msapplication-navbutton-color', color);\n\t\n\t return function () {\n\t removeChrome();\n\t removeWindows();\n\t };\n\t };\n\t\n\t /**\n\t * Enables browser header coloring\n\t * for more info please visit:\n\t * https://developers.google.com/web/fundamentals/design-and-ui/browser-customization/theme-color\n\t *\n\t * The default color is `800` from `primary` palette of the `default` theme\n\t *\n\t * options are:\n\t * `theme` - A defined theme via `$mdThemeProvider` to use the palettes from. Default is `default` theme\n\t * `palette` - Can be any one of the basic material design palettes, extended defined palettes and 'primary',\n\t * 'accent', 'background' and 'warn'. Default is `primary`\n\t * `hue` - The hue from the selected palette. Default is `800`\n\t *\n\t * @param {Object=} options Options object for the browser color\n\t * @returns {Function} remove function of the browser color\n\t */\n\t var enableBrowserColor = function (options) {\n\t options = angular.isObject(options) ? options : {};\n\t\n\t var theme = options.theme || 'default';\n\t var hue = options.hue || '800';\n\t\n\t var palette = PALETTES[options.palette] ||\n\t PALETTES[THEMES[theme].colors[options.palette || 'primary'].name];\n\t\n\t var color = angular.isObject(palette[hue]) ? palette[hue].hex : palette[hue];\n\t\n\t return setBrowserColor(color);\n\t };\n\t\n\t return themingProvider = {\n\t definePalette: definePalette,\n\t extendPalette: extendPalette,\n\t theme: registerTheme,\n\t\n\t /**\n\t * return a read-only clone of the current theme configuration\n\t */\n\t configuration : function() {\n\t return angular.extend( { }, themeConfig, {\n\t defaultTheme : defaultTheme,\n\t alwaysWatchTheme : alwaysWatchTheme,\n\t registeredStyles : [].concat(themeConfig.registeredStyles)\n\t });\n\t },\n\t\n\t /**\n\t * Easy way to disable theming without having to use\n\t * `.constant(\"$MD_THEME_CSS\",\"\");` This disables\n\t * all dynamic theme style sheet generations and injections...\n\t */\n\t disableTheming: function(isDisabled) {\n\t themeConfig.disableTheming = angular.isUndefined(isDisabled) || !!isDisabled;\n\t },\n\t\n\t registerStyles: function(styles) {\n\t themeConfig.registeredStyles.push(styles);\n\t },\n\t\n\t setNonce: function(nonceValue) {\n\t themeConfig.nonce = nonceValue;\n\t },\n\t\n\t generateThemesOnDemand: function(onDemand) {\n\t themeConfig.generateOnDemand = onDemand;\n\t },\n\t\n\t setDefaultTheme: function(theme) {\n\t defaultTheme = theme;\n\t },\n\t\n\t alwaysWatchTheme: function(alwaysWatch) {\n\t alwaysWatchTheme = alwaysWatch;\n\t },\n\t\n\t enableBrowserColor: enableBrowserColor,\n\t\n\t $get: ThemingService,\n\t _LIGHT_DEFAULT_HUES: LIGHT_DEFAULT_HUES,\n\t _DARK_DEFAULT_HUES: DARK_DEFAULT_HUES,\n\t _PALETTES: PALETTES,\n\t _THEMES: THEMES,\n\t _parseRules: parseRules,\n\t _rgba: rgba\n\t };\n\t\n\t // Example: $mdThemingProvider.definePalette('neonRed', { 50: '#f5fafa', ... });\n\t function definePalette(name, map) {\n\t map = map || {};\n\t PALETTES[name] = checkPaletteValid(name, map);\n\t return themingProvider;\n\t }\n\t\n\t // Returns an new object which is a copy of a given palette `name` with variables from\n\t // `map` overwritten\n\t // Example: var neonRedMap = $mdThemingProvider.extendPalette('red', { 50: '#f5fafafa' });\n\t function extendPalette(name, map) {\n\t return checkPaletteValid(name, angular.extend({}, PALETTES[name] || {}, map) );\n\t }\n\t\n\t // Make sure that palette has all required hues\n\t function checkPaletteValid(name, map) {\n\t var missingColors = VALID_HUE_VALUES.filter(function(field) {\n\t return !map[field];\n\t });\n\t if (missingColors.length) {\n\t throw new Error(\"Missing colors %1 in palette %2!\"\n\t .replace('%1', missingColors.join(', '))\n\t .replace('%2', name));\n\t }\n\t\n\t return map;\n\t }\n\t\n\t // Register a theme (which is a collection of color palettes to use with various states\n\t // ie. warn, accent, primary )\n\t // Optionally inherit from an existing theme\n\t // $mdThemingProvider.theme('custom-theme').primaryPalette('red');\n\t function registerTheme(name, inheritFrom) {\n\t if (THEMES[name]) return THEMES[name];\n\t\n\t inheritFrom = inheritFrom || 'default';\n\t\n\t var parentTheme = typeof inheritFrom === 'string' ? THEMES[inheritFrom] : inheritFrom;\n\t var theme = new Theme(name);\n\t\n\t if (parentTheme) {\n\t angular.forEach(parentTheme.colors, function(color, colorType) {\n\t theme.colors[colorType] = {\n\t name: color.name,\n\t // Make sure a COPY of the hues is given to the child color,\n\t // not the same reference.\n\t hues: angular.extend({}, color.hues)\n\t };\n\t });\n\t }\n\t THEMES[name] = theme;\n\t\n\t return theme;\n\t }\n\t\n\t function Theme(name) {\n\t var self = this;\n\t self.name = name;\n\t self.colors = {};\n\t\n\t self.dark = setDark;\n\t setDark(false);\n\t\n\t function setDark(isDark) {\n\t isDark = arguments.length === 0 ? true : !!isDark;\n\t\n\t // If no change, abort\n\t if (isDark === self.isDark) return;\n\t\n\t self.isDark = isDark;\n\t\n\t self.foregroundPalette = self.isDark ? LIGHT_FOREGROUND : DARK_FOREGROUND;\n\t self.foregroundShadow = self.isDark ? DARK_SHADOW : LIGHT_SHADOW;\n\t\n\t // Light and dark themes have different default hues.\n\t // Go through each existing color type for this theme, and for every\n\t // hue value that is still the default hue value from the previous light/dark setting,\n\t // set it to the default hue value from the new light/dark setting.\n\t var newDefaultHues = self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES;\n\t var oldDefaultHues = self.isDark ? LIGHT_DEFAULT_HUES : DARK_DEFAULT_HUES;\n\t angular.forEach(newDefaultHues, function(newDefaults, colorType) {\n\t var color = self.colors[colorType];\n\t var oldDefaults = oldDefaultHues[colorType];\n\t if (color) {\n\t for (var hueName in color.hues) {\n\t if (color.hues[hueName] === oldDefaults[hueName]) {\n\t color.hues[hueName] = newDefaults[hueName];\n\t }\n\t }\n\t }\n\t });\n\t\n\t return self;\n\t }\n\t\n\t THEME_COLOR_TYPES.forEach(function(colorType) {\n\t var defaultHues = (self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES)[colorType];\n\t self[colorType + 'Palette'] = function setPaletteType(paletteName, hues) {\n\t var color = self.colors[colorType] = {\n\t name: paletteName,\n\t hues: angular.extend({}, defaultHues, hues)\n\t };\n\t\n\t Object.keys(color.hues).forEach(function(name) {\n\t if (!defaultHues[name]) {\n\t throw new Error(\"Invalid hue name '%1' in theme %2's %3 color %4. Available hue names: %4\"\n\t .replace('%1', name)\n\t .replace('%2', self.name)\n\t .replace('%3', paletteName)\n\t .replace('%4', Object.keys(defaultHues).join(', '))\n\t );\n\t }\n\t });\n\t Object.keys(color.hues).map(function(key) {\n\t return color.hues[key];\n\t }).forEach(function(hueValue) {\n\t if (VALID_HUE_VALUES.indexOf(hueValue) == -1) {\n\t throw new Error(\"Invalid hue value '%1' in theme %2's %3 color %4. Available hue values: %5\"\n\t .replace('%1', hueValue)\n\t .replace('%2', self.name)\n\t .replace('%3', colorType)\n\t .replace('%4', paletteName)\n\t .replace('%5', VALID_HUE_VALUES.join(', '))\n\t );\n\t }\n\t });\n\t return self;\n\t };\n\t\n\t self[colorType + 'Color'] = function() {\n\t var args = Array.prototype.slice.call(arguments);\n\t console.warn('$mdThemingProviderTheme.' + colorType + 'Color() has been deprecated. ' +\n\t 'Use $mdThemingProviderTheme.' + colorType + 'Palette() instead.');\n\t return self[colorType + 'Palette'].apply(self, args);\n\t };\n\t });\n\t }\n\t\n\t /**\n\t * @ngdoc service\n\t * @name $mdTheming\n\t * @module material.core.theming\n\t *\n\t * @description\n\t *\n\t * Service that makes an element apply theming related classes to itself.\n\t *\n\t * \n\t * app.directive('myFancyDirective', function($mdTheming) {\n\t * return {\n\t * restrict: 'e',\n\t * link: function(scope, el, attrs) {\n\t * $mdTheming(el);\n\t *\n\t * $mdTheming.defineTheme('myTheme', {\n\t * primary: 'blue',\n\t * accent: 'pink',\n\t * dark: true\n\t * })\n\t * }\n\t * };\n\t * });\n\t * \n\t * @param {element=} element to apply theming to\n\t */\n\t\n\t /**\n\t * @ngdoc property\n\t * @name $mdTheming#THEMES\n\t * @description\n\t * Property to get all the themes defined\n\t * @returns {Object} All the themes defined with their properties\n\t */\n\t\n\t /**\n\t * @ngdoc property\n\t * @name $mdTheming#PALETTES\n\t * @description\n\t * Property to get all the palettes defined\n\t * @returns {Object} All the palettes defined with their colors\n\t */\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdTheming#registered\n\t * @description\n\t * Determine is specified theme name is a valid, registered theme\n\t * @param {string} themeName the theme to check if registered\n\t * @returns {boolean} whether the theme is registered or not\n\t */\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdTheming#defaultTheme\n\t * @description\n\t * Returns the default theme\n\t * @returns {string} The default theme\n\t */\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdTheming#generateTheme\n\t * @description\n\t * Lazy generate themes - by default, every theme is generated when defined.\n\t * You can disable this in the configuration section using the\n\t * `$mdThemingProvider.generateThemesOnDemand(true);`\n\t *\n\t * The theme name that is passed in must match the name of the theme that was defined as part of the configuration block.\n\t *\n\t * @param name {string} theme name to generate\n\t */\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdTheming#setBrowserColor\n\t * @description\n\t * Sets browser header coloring\n\t * for more info please visit:\n\t * https://developers.google.com/web/fundamentals/design-and-ui/browser-customization/theme-color\n\t *\n\t * The default color is `800` from `primary` palette of the `default` theme\n\t *\n\t * options are:
\n\t * `theme` - A defined theme via `$mdThemeProvider` to use the palettes from. Default is `default` theme.
\n\t * `palette` - Can be any one of the basic material design palettes, extended defined palettes and 'primary',\n\t * 'accent', 'background' and 'warn'. Default is `primary`
\n\t * `hue` - The hue from the selected palette. Default is `800`\n\t *\n\t * @param {Object} options Options object for the browser color\n\t * @returns {Function} remove function of the browser color\n\t */\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdTheming#defineTheme\n\t * @description\n\t * Dynamically define a theme by an options object\n\t *\n\t * options are:
\n\t * `primary` - The primary palette of the theme.
\n\t * `accent` - The accent palette of the theme.
\n\t * `warn` - The warn palette of the theme.
\n\t * `background` - The background palette of the theme.
\n\t * `dark` - Indicates if it's a dark theme.
\n\t *\n\t * @param {String} name Theme name to define\n\t * @param {Object} options Theme definition options\n\t * @returns {Promise} A resolved promise with the theme name\n\t */\n\t\n\t /* @ngInject */\n\t function ThemingService($rootScope, $mdUtil, $q, $log) {\n\t // Allow us to be invoked via a linking function signature.\n\t var applyTheme = function (scope, el) {\n\t if (el === undefined) { el = scope; scope = undefined; }\n\t if (scope === undefined) { scope = $rootScope; }\n\t applyTheme.inherit(el, el);\n\t };\n\t\n\t Object.defineProperty(applyTheme, 'THEMES', {\n\t get: function () {\n\t return angular.extend({}, THEMES);\n\t }\n\t });\n\t Object.defineProperty(applyTheme, 'PALETTES', {\n\t get: function () {\n\t return angular.extend({}, PALETTES);\n\t }\n\t });\n\t Object.defineProperty(applyTheme, 'ALWAYS_WATCH', {\n\t get: function () {\n\t return alwaysWatchTheme;\n\t }\n\t });\n\t applyTheme.inherit = inheritTheme;\n\t applyTheme.registered = registered;\n\t applyTheme.defaultTheme = function() { return defaultTheme; };\n\t applyTheme.generateTheme = function(name) { generateTheme(THEMES[name], name, themeConfig.nonce); };\n\t applyTheme.defineTheme = function(name, options) {\n\t options = options || {};\n\t\n\t var theme = registerTheme(name);\n\t\n\t if (options.primary) {\n\t theme.primaryPalette(options.primary);\n\t }\n\t if (options.accent) {\n\t theme.accentPalette(options.accent);\n\t }\n\t if (options.warn) {\n\t theme.warnPalette(options.warn);\n\t }\n\t if (options.background) {\n\t theme.backgroundPalette(options.background);\n\t }\n\t if (options.dark){\n\t theme.dark();\n\t }\n\t\n\t this.generateTheme(name);\n\t\n\t return $q.resolve(name);\n\t };\n\t applyTheme.setBrowserColor = enableBrowserColor;\n\t\n\t return applyTheme;\n\t\n\t /**\n\t * Determine is specified theme name is a valid, registered theme\n\t */\n\t function registered(themeName) {\n\t if (themeName === undefined || themeName === '') return true;\n\t return applyTheme.THEMES[themeName] !== undefined;\n\t }\n\t\n\t /**\n\t * Get theme name for the element, then update with Theme CSS class\n\t */\n\t function inheritTheme (el, parent) {\n\t var ctrl = parent.controller('mdTheme') || el.data('$mdThemeController');\n\t\n\t updateThemeClass(lookupThemeName());\n\t\n\t if (ctrl) {\n\t var watchTheme = alwaysWatchTheme ||\n\t ctrl.$shouldWatch ||\n\t $mdUtil.parseAttributeBoolean(el.attr('md-theme-watch'));\n\t\n\t var unwatch = ctrl.registerChanges(function (name) {\n\t updateThemeClass(name);\n\t\n\t if (!watchTheme) {\n\t unwatch();\n\t }\n\t else {\n\t el.on('$destroy', unwatch);\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Find the theme name from the parent controller or element data\n\t */\n\t function lookupThemeName() {\n\t // As a few components (dialog) add their controllers later, we should also watch for a controller init.\n\t return ctrl && ctrl.$mdTheme || (defaultTheme == 'default' ? '' : defaultTheme);\n\t }\n\t\n\t /**\n\t * Remove old theme class and apply a new one\n\t * NOTE: if not a valid theme name, then the current name is not changed\n\t */\n\t function updateThemeClass(theme) {\n\t if (!theme) return;\n\t if (!registered(theme)) {\n\t $log.warn('Attempted to use unregistered theme \\'' + theme + '\\'. ' +\n\t 'Register it with $mdThemingProvider.theme().');\n\t }\n\t\n\t var oldTheme = el.data('$mdThemeName');\n\t if (oldTheme) el.removeClass('md-' + oldTheme +'-theme');\n\t el.addClass('md-' + theme + '-theme');\n\t el.data('$mdThemeName', theme);\n\t if (ctrl) {\n\t el.data('$mdThemeController', ctrl);\n\t }\n\t }\n\t }\n\t\n\t }\n\t}\n\t\n\tfunction ThemingDirective($mdTheming, $interpolate, $parse, $mdUtil, $q, $log) {\n\t return {\n\t priority: 101, // has to be more than 100 to be before interpolation (issue on IE)\n\t link: {\n\t pre: function(scope, el, attrs) {\n\t var registeredCallbacks = [];\n\t\n\t var startSymbol = $interpolate.startSymbol();\n\t var endSymbol = $interpolate.endSymbol();\n\t\n\t var theme = attrs.mdTheme.trim();\n\t\n\t var hasInterpolation =\n\t theme.substr(0, startSymbol.length) === startSymbol &&\n\t theme.lastIndexOf(endSymbol) === theme.length - endSymbol.length;\n\t\n\t var oneTimeOperator = '::';\n\t var oneTimeBind = attrs.mdTheme\n\t .split(startSymbol).join('')\n\t .split(endSymbol).join('')\n\t .trim()\n\t .substr(0, oneTimeOperator.length) === oneTimeOperator;\n\t\n\t var ctrl = {\n\t registerChanges: function (cb, context) {\n\t if (context) {\n\t cb = angular.bind(context, cb);\n\t }\n\t\n\t registeredCallbacks.push(cb);\n\t\n\t return function () {\n\t var index = registeredCallbacks.indexOf(cb);\n\t\n\t if (index > -1) {\n\t registeredCallbacks.splice(index, 1);\n\t }\n\t };\n\t },\n\t $setTheme: function (theme) {\n\t if (!$mdTheming.registered(theme)) {\n\t $log.warn('attempted to use unregistered theme \\'' + theme + '\\'');\n\t }\n\t\n\t ctrl.$mdTheme = theme;\n\t\n\t // Iterating backwards to support unregistering during iteration\n\t // http://stackoverflow.com/a/9882349/890293\n\t // we don't use `reverse()` of array because it mutates the array and we don't want it to get re-indexed\n\t for (var i = registeredCallbacks.length; i--;) {\n\t registeredCallbacks[i](theme);\n\t }\n\t },\n\t $shouldWatch: $mdUtil.parseAttributeBoolean(el.attr('md-theme-watch')) ||\n\t $mdTheming.ALWAYS_WATCH ||\n\t (hasInterpolation && !oneTimeBind)\n\t };\n\t\n\t el.data('$mdThemeController', ctrl);\n\t\n\t var getTheme = function () {\n\t var interpolation = $interpolate(attrs.mdTheme)(scope);\n\t return $parse(interpolation)(scope) || interpolation;\n\t };\n\t\n\t var setParsedTheme = function (theme) {\n\t if (typeof theme === 'string') {\n\t return ctrl.$setTheme(theme);\n\t }\n\t\n\t $q.when( angular.isFunction(theme) ? theme() : theme )\n\t .then(function(name){\n\t ctrl.$setTheme(name);\n\t });\n\t };\n\t\n\t setParsedTheme(getTheme());\n\t\n\t var unwatch = scope.$watch(getTheme, function(theme) {\n\t if (theme) {\n\t setParsedTheme(theme);\n\t\n\t if (!ctrl.$shouldWatch) {\n\t unwatch();\n\t }\n\t }\n\t });\n\t }\n\t }\n\t };\n\t}\n\t\n\t/**\n\t * Special directive that will disable ALL runtime Theme style generation and DOM injection\n\t *\n\t * \n\t * \n\t *\n\t * \n\t * ...\n\t * \n\t *\n\t * Note: Using md-themes-css directive requires the developer to load external\n\t * theme stylesheets; e.g. custom themes from Material-Tools:\n\t *\n\t * `angular-material.themes.css`\n\t *\n\t * Another option is to use the ThemingProvider to configure and disable the attribute\n\t * conversions; this would obviate the use of the `md-themes-css` directive\n\t *\n\t */\n\tfunction disableThemesDirective() {\n\t themeConfig.disableTheming = true;\n\t\n\t // Return a 1x-only, first-match attribute directive\n\t return {\n\t restrict : 'A',\n\t priority : '900'\n\t };\n\t}\n\t\n\tfunction ThemableDirective($mdTheming) {\n\t return $mdTheming;\n\t}\n\t\n\tfunction parseRules(theme, colorType, rules) {\n\t checkValidPalette(theme, colorType);\n\t\n\t rules = rules.replace(/THEME_NAME/g, theme.name);\n\t var generatedRules = [];\n\t var color = theme.colors[colorType];\n\t\n\t var themeNameRegex = new RegExp('\\\\.md-' + theme.name + '-theme', 'g');\n\t // Matches '{{ primary-color }}', etc\n\t var hueRegex = new RegExp('(\\'|\")?{{\\\\s*(' + colorType + ')-(color|contrast)-?(\\\\d\\\\.?\\\\d*)?\\\\s*}}(\\\"|\\')?','g');\n\t var simpleVariableRegex = /'?\"?\\{\\{\\s*([a-zA-Z]+)-(A?\\d+|hue\\-[0-3]|shadow|default)-?(\\d\\.?\\d*)?(contrast)?\\s*\\}\\}'?\"?/g;\n\t var palette = PALETTES[color.name];\n\t\n\t // find and replace simple variables where we use a specific hue, not an entire palette\n\t // eg. \"{{primary-100}}\"\n\t //\\(' + THEME_COLOR_TYPES.join('\\|') + '\\)'\n\t rules = rules.replace(simpleVariableRegex, function(match, colorType, hue, opacity, contrast) {\n\t if (colorType === 'foreground') {\n\t if (hue == 'shadow') {\n\t return theme.foregroundShadow;\n\t } else {\n\t return theme.foregroundPalette[hue] || theme.foregroundPalette['1'];\n\t }\n\t }\n\t\n\t // `default` is also accepted as a hue-value, because the background palettes are\n\t // using it as a name for the default hue.\n\t if (hue.indexOf('hue') === 0 || hue === 'default') {\n\t hue = theme.colors[colorType].hues[hue];\n\t }\n\t\n\t return rgba( (PALETTES[ theme.colors[colorType].name ][hue] || '')[contrast ? 'contrast' : 'value'], opacity );\n\t });\n\t\n\t // For each type, generate rules for each hue (ie. default, md-hue-1, md-hue-2, md-hue-3)\n\t angular.forEach(color.hues, function(hueValue, hueName) {\n\t var newRule = rules\n\t .replace(hueRegex, function(match, _, colorType, hueType, opacity) {\n\t return rgba(palette[hueValue][hueType === 'color' ? 'value' : 'contrast'], opacity);\n\t });\n\t if (hueName !== 'default') {\n\t newRule = newRule.replace(themeNameRegex, '.md-' + theme.name + '-theme.md-' + hueName);\n\t }\n\t\n\t // Don't apply a selector rule to the default theme, making it easier to override\n\t // styles of the base-component\n\t if (theme.name == 'default') {\n\t var themeRuleRegex = /((?:\\s|>|\\.|\\w|-|:|\\(|\\)|\\[|\\]|\"|'|=)*)\\.md-default-theme((?:\\s|>|\\.|\\w|-|:|\\(|\\)|\\[|\\]|\"|'|=)*)/g;\n\t\n\t newRule = newRule.replace(themeRuleRegex, function(match, start, end) {\n\t return match + ', ' + start + end;\n\t });\n\t }\n\t generatedRules.push(newRule);\n\t });\n\t\n\t return generatedRules;\n\t}\n\t\n\tvar rulesByType = {};\n\t\n\t// Generate our themes at run time given the state of THEMES and PALETTES\n\tfunction generateAllThemes($injector, $mdTheming) {\n\t var head = document.head;\n\t var firstChild = head ? head.firstElementChild : null;\n\t var themeCss = !themeConfig.disableTheming && $injector.has('$MD_THEME_CSS') ? $injector.get('$MD_THEME_CSS') : '';\n\t\n\t // Append our custom registered styles to the theme stylesheet.\n\t themeCss += themeConfig.registeredStyles.join('');\n\t\n\t if ( !firstChild ) return;\n\t if (themeCss.length === 0) return; // no rules, so no point in running this expensive task\n\t\n\t // Expose contrast colors for palettes to ensure that text is always readable\n\t angular.forEach(PALETTES, sanitizePalette);\n\t\n\t // MD_THEME_CSS is a string generated by the build process that includes all the themable\n\t // components as templates\n\t\n\t // Break the CSS into individual rules\n\t var rules = themeCss\n\t .split(/\\}(?!(\\}|'|\"|;))/)\n\t .filter(function(rule) { return rule && rule.trim().length; })\n\t .map(function(rule) { return rule.trim() + '}'; });\n\t\n\t\n\t var ruleMatchRegex = new RegExp('md-(' + THEME_COLOR_TYPES.join('|') + ')', 'g');\n\t\n\t THEME_COLOR_TYPES.forEach(function(type) {\n\t rulesByType[type] = '';\n\t });\n\t\n\t\n\t // Sort the rules based on type, allowing us to do color substitution on a per-type basis\n\t rules.forEach(function(rule) {\n\t var match = rule.match(ruleMatchRegex);\n\t // First: test that if the rule has '.md-accent', it goes into the accent set of rules\n\t for (var i = 0, type; type = THEME_COLOR_TYPES[i]; i++) {\n\t if (rule.indexOf('.md-' + type) > -1) {\n\t return rulesByType[type] += rule;\n\t }\n\t }\n\t\n\t // If no eg 'md-accent' class is found, try to just find 'accent' in the rule and guess from\n\t // there\n\t for (i = 0; type = THEME_COLOR_TYPES[i]; i++) {\n\t if (rule.indexOf(type) > -1) {\n\t return rulesByType[type] += rule;\n\t }\n\t }\n\t\n\t // Default to the primary array\n\t return rulesByType[DEFAULT_COLOR_TYPE] += rule;\n\t });\n\t\n\t // If themes are being generated on-demand, quit here. The user will later manually\n\t // call generateTheme to do this on a theme-by-theme basis.\n\t if (themeConfig.generateOnDemand) return;\n\t\n\t angular.forEach($mdTheming.THEMES, function(theme) {\n\t if (!GENERATED[theme.name] && !($mdTheming.defaultTheme() !== 'default' && theme.name === 'default')) {\n\t generateTheme(theme, theme.name, themeConfig.nonce);\n\t }\n\t });\n\t\n\t\n\t // *************************\n\t // Internal functions\n\t // *************************\n\t\n\t // The user specifies a 'default' contrast color as either light or dark,\n\t // then explicitly lists which hues are the opposite contrast (eg. A100 has dark, A200 has light)\n\t function sanitizePalette(palette, name) {\n\t var defaultContrast = palette.contrastDefaultColor;\n\t var lightColors = palette.contrastLightColors || [];\n\t var strongLightColors = palette.contrastStrongLightColors || [];\n\t var darkColors = palette.contrastDarkColors || [];\n\t\n\t // These colors are provided as space-separated lists\n\t if (typeof lightColors === 'string') lightColors = lightColors.split(' ');\n\t if (typeof strongLightColors === 'string') strongLightColors = strongLightColors.split(' ');\n\t if (typeof darkColors === 'string') darkColors = darkColors.split(' ');\n\t\n\t // Cleanup after ourselves\n\t delete palette.contrastDefaultColor;\n\t delete palette.contrastLightColors;\n\t delete palette.contrastStrongLightColors;\n\t delete palette.contrastDarkColors;\n\t\n\t // Change { 'A100': '#fffeee' } to { 'A100': { value: '#fffeee', contrast:DARK_CONTRAST_COLOR }\n\t angular.forEach(palette, function(hueValue, hueName) {\n\t if (angular.isObject(hueValue)) return; // Already converted\n\t // Map everything to rgb colors\n\t var rgbValue = colorToRgbaArray(hueValue);\n\t if (!rgbValue) {\n\t throw new Error(\"Color %1, in palette %2's hue %3, is invalid. Hex or rgb(a) color expected.\"\n\t .replace('%1', hueValue)\n\t .replace('%2', palette.name)\n\t .replace('%3', hueName));\n\t }\n\t\n\t palette[hueName] = {\n\t hex: palette[hueName],\n\t value: rgbValue,\n\t contrast: getContrastColor()\n\t };\n\t function getContrastColor() {\n\t if (defaultContrast === 'light') {\n\t if (darkColors.indexOf(hueName) > -1) {\n\t return DARK_CONTRAST_COLOR;\n\t } else {\n\t return strongLightColors.indexOf(hueName) > -1 ? STRONG_LIGHT_CONTRAST_COLOR\n\t : LIGHT_CONTRAST_COLOR;\n\t }\n\t } else {\n\t if (lightColors.indexOf(hueName) > -1) {\n\t return strongLightColors.indexOf(hueName) > -1 ? STRONG_LIGHT_CONTRAST_COLOR\n\t : LIGHT_CONTRAST_COLOR;\n\t } else {\n\t return DARK_CONTRAST_COLOR;\n\t }\n\t }\n\t }\n\t });\n\t }\n\t}\n\t\n\tfunction generateTheme(theme, name, nonce) {\n\t var head = document.head;\n\t var firstChild = head ? head.firstElementChild : null;\n\t\n\t if (!GENERATED[name]) {\n\t // For each theme, use the color palettes specified for\n\t // `primary`, `warn` and `accent` to generate CSS rules.\n\t THEME_COLOR_TYPES.forEach(function(colorType) {\n\t var styleStrings = parseRules(theme, colorType, rulesByType[colorType]);\n\t while (styleStrings.length) {\n\t var styleContent = styleStrings.shift();\n\t if (styleContent) {\n\t var style = document.createElement('style');\n\t style.setAttribute('md-theme-style', '');\n\t if (nonce) {\n\t style.setAttribute('nonce', nonce);\n\t }\n\t style.appendChild(document.createTextNode(styleContent));\n\t head.insertBefore(style, firstChild);\n\t }\n\t }\n\t });\n\t\n\t GENERATED[theme.name] = true;\n\t }\n\t\n\t}\n\t\n\t\n\tfunction checkValidPalette(theme, colorType) {\n\t // If theme attempts to use a palette that doesnt exist, throw error\n\t if (!PALETTES[ (theme.colors[colorType] || {}).name ]) {\n\t throw new Error(\n\t \"You supplied an invalid color palette for theme %1's %2 palette. Available palettes: %3\"\n\t .replace('%1', theme.name)\n\t .replace('%2', colorType)\n\t .replace('%3', Object.keys(PALETTES).join(', '))\n\t );\n\t }\n\t}\n\t\n\tfunction colorToRgbaArray(clr) {\n\t if (angular.isArray(clr) && clr.length == 3) return clr;\n\t if (/^rgb/.test(clr)) {\n\t return clr.replace(/(^\\s*rgba?\\(|\\)\\s*$)/g, '').split(',').map(function(value, i) {\n\t return i == 3 ? parseFloat(value, 10) : parseInt(value, 10);\n\t });\n\t }\n\t if (clr.charAt(0) == '#') clr = clr.substring(1);\n\t if (!/^([a-fA-F0-9]{3}){1,2}$/g.test(clr)) return;\n\t\n\t var dig = clr.length / 3;\n\t var red = clr.substr(0, dig);\n\t var grn = clr.substr(dig, dig);\n\t var blu = clr.substr(dig * 2);\n\t if (dig === 1) {\n\t red += red;\n\t grn += grn;\n\t blu += blu;\n\t }\n\t return [parseInt(red, 16), parseInt(grn, 16), parseInt(blu, 16)];\n\t}\n\t\n\tfunction rgba(rgbArray, opacity) {\n\t if ( !rgbArray ) return \"rgb('0,0,0')\";\n\t\n\t if (rgbArray.length == 4) {\n\t rgbArray = angular.copy(rgbArray);\n\t opacity ? rgbArray.pop() : opacity = rgbArray.pop();\n\t }\n\t return opacity && (typeof opacity == 'number' || (typeof opacity == 'string' && opacity.length)) ?\n\t 'rgba(' + rgbArray.join(',') + ',' + opacity + ')' :\n\t 'rgb(' + rgbArray.join(',') + ')';\n\t}\n\t\n\t\n\t})(window.angular);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t// Polyfill angular < 1.4 (provide $animateCss)\n\tangular\n\t .module('material.core')\n\t .factory('$$mdAnimate', [\"$q\", \"$timeout\", \"$mdConstant\", \"$animateCss\", function($q, $timeout, $mdConstant, $animateCss){\n\t\n\t // Since $$mdAnimate is injected into $mdUtil... use a wrapper function\n\t // to subsequently inject $mdUtil as an argument to the AnimateDomUtils\n\t\n\t return function($mdUtil) {\n\t return AnimateDomUtils( $mdUtil, $q, $timeout, $mdConstant, $animateCss);\n\t };\n\t }]);\n\t\n\t/**\n\t * Factory function that requires special injections\n\t */\n\tfunction AnimateDomUtils($mdUtil, $q, $timeout, $mdConstant, $animateCss) {\n\t var self;\n\t return self = {\n\t /**\n\t *\n\t */\n\t translate3d : function( target, from, to, options ) {\n\t return $animateCss(target, {\n\t from: from,\n\t to: to,\n\t addClass: options.transitionInClass,\n\t removeClass: options.transitionOutClass,\n\t duration: options.duration\n\t })\n\t .start()\n\t .then(function(){\n\t // Resolve with reverser function...\n\t return reverseTranslate;\n\t });\n\t\n\t /**\n\t * Specific reversal of the request translate animation above...\n\t */\n\t function reverseTranslate (newFrom) {\n\t return $animateCss(target, {\n\t to: newFrom || from,\n\t addClass: options.transitionOutClass,\n\t removeClass: options.transitionInClass,\n\t duration: options.duration\n\t }).start();\n\t\n\t }\n\t },\n\t\n\t /**\n\t * Listen for transitionEnd event (with optional timeout)\n\t * Announce completion or failure via promise handlers\n\t */\n\t waitTransitionEnd: function (element, opts) {\n\t var TIMEOUT = 3000; // fallback is 3 secs\n\t\n\t return $q(function(resolve, reject){\n\t opts = opts || { };\n\t\n\t // If there is no transition is found, resolve immediately\n\t //\n\t // NOTE: using $mdUtil.nextTick() causes delays/issues\n\t if (noTransitionFound(opts.cachedTransitionStyles)) {\n\t TIMEOUT = 0;\n\t }\n\t\n\t var timer = $timeout(finished, opts.timeout || TIMEOUT);\n\t element.on($mdConstant.CSS.TRANSITIONEND, finished);\n\t\n\t /**\n\t * Upon timeout or transitionEnd, reject or resolve (respectively) this promise.\n\t * NOTE: Make sure this transitionEnd didn't bubble up from a child\n\t */\n\t function finished(ev) {\n\t if ( ev && ev.target !== element[0]) return;\n\t\n\t if ( ev ) $timeout.cancel(timer);\n\t element.off($mdConstant.CSS.TRANSITIONEND, finished);\n\t\n\t // Never reject since ngAnimate may cause timeouts due missed transitionEnd events\n\t resolve();\n\t\n\t }\n\t\n\t /**\n\t * Checks whether or not there is a transition.\n\t *\n\t * @param styles The cached styles to use for the calculation. If null, getComputedStyle()\n\t * will be used.\n\t *\n\t * @returns {boolean} True if there is no transition/duration; false otherwise.\n\t */\n\t function noTransitionFound(styles) {\n\t styles = styles || window.getComputedStyle(element[0]);\n\t\n\t return styles.transitionDuration == '0s' || (!styles.transition && !styles.transitionProperty);\n\t }\n\t\n\t });\n\t },\n\t\n\t calculateTransformValues: function (element, originator) {\n\t var origin = originator.element;\n\t var bounds = originator.bounds;\n\t\n\t if (origin || bounds) {\n\t var originBnds = origin ? self.clientRect(origin) || currentBounds() : self.copyRect(bounds);\n\t var dialogRect = self.copyRect(element[0].getBoundingClientRect());\n\t var dialogCenterPt = self.centerPointFor(dialogRect);\n\t var originCenterPt = self.centerPointFor(originBnds);\n\t\n\t return {\n\t centerX: originCenterPt.x - dialogCenterPt.x,\n\t centerY: originCenterPt.y - dialogCenterPt.y,\n\t scaleX: Math.round(100 * Math.min(0.5, originBnds.width / dialogRect.width)) / 100,\n\t scaleY: Math.round(100 * Math.min(0.5, originBnds.height / dialogRect.height)) / 100\n\t };\n\t }\n\t return {centerX: 0, centerY: 0, scaleX: 0.5, scaleY: 0.5};\n\t\n\t /**\n\t * This is a fallback if the origin information is no longer valid, then the\n\t * origin bounds simply becomes the current bounds for the dialogContainer's parent\n\t */\n\t function currentBounds() {\n\t var cntr = element ? element.parent() : null;\n\t var parent = cntr ? cntr.parent() : null;\n\t\n\t return parent ? self.clientRect(parent) : null;\n\t }\n\t },\n\t\n\t /**\n\t * Calculate the zoom transform from dialog to origin.\n\t *\n\t * We use this to set the dialog position immediately;\n\t * then the md-transition-in actually translates back to\n\t * `translate3d(0,0,0) scale(1.0)`...\n\t *\n\t * NOTE: all values are rounded to the nearest integer\n\t */\n\t calculateZoomToOrigin: function (element, originator) {\n\t var zoomTemplate = \"translate3d( {centerX}px, {centerY}px, 0 ) scale( {scaleX}, {scaleY} )\";\n\t var buildZoom = angular.bind(null, $mdUtil.supplant, zoomTemplate);\n\t\n\t return buildZoom(self.calculateTransformValues(element, originator));\n\t },\n\t\n\t /**\n\t * Calculate the slide transform from panel to origin.\n\t * NOTE: all values are rounded to the nearest integer\n\t */\n\t calculateSlideToOrigin: function (element, originator) {\n\t var slideTemplate = \"translate3d( {centerX}px, {centerY}px, 0 )\";\n\t var buildSlide = angular.bind(null, $mdUtil.supplant, slideTemplate);\n\t\n\t return buildSlide(self.calculateTransformValues(element, originator));\n\t },\n\t\n\t /**\n\t * Enhance raw values to represent valid css stylings...\n\t */\n\t toCss : function( raw ) {\n\t var css = { };\n\t var lookups = 'left top right bottom width height x y min-width min-height max-width max-height';\n\t\n\t angular.forEach(raw, function(value,key) {\n\t if ( angular.isUndefined(value) ) return;\n\t\n\t if ( lookups.indexOf(key) >= 0 ) {\n\t css[key] = value + 'px';\n\t } else {\n\t switch (key) {\n\t case 'transition':\n\t convertToVendor(key, $mdConstant.CSS.TRANSITION, value);\n\t break;\n\t case 'transform':\n\t convertToVendor(key, $mdConstant.CSS.TRANSFORM, value);\n\t break;\n\t case 'transformOrigin':\n\t convertToVendor(key, $mdConstant.CSS.TRANSFORM_ORIGIN, value);\n\t break;\n\t case 'font-size':\n\t css['font-size'] = value; // font sizes aren't always in px\n\t break;\n\t }\n\t }\n\t });\n\t\n\t return css;\n\t\n\t function convertToVendor(key, vendor, value) {\n\t angular.forEach(vendor.split(' '), function (key) {\n\t css[key] = value;\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * Convert the translate CSS value to key/value pair(s).\n\t */\n\t toTransformCss: function (transform, addTransition, transition) {\n\t var css = {};\n\t angular.forEach($mdConstant.CSS.TRANSFORM.split(' '), function (key) {\n\t css[key] = transform;\n\t });\n\t\n\t if (addTransition) {\n\t transition = transition || \"all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) !important\";\n\t css.transition = transition;\n\t }\n\t\n\t return css;\n\t },\n\t\n\t /**\n\t * Clone the Rect and calculate the height/width if needed\n\t */\n\t copyRect: function (source, destination) {\n\t if (!source) return null;\n\t\n\t destination = destination || {};\n\t\n\t angular.forEach('left top right bottom width height'.split(' '), function (key) {\n\t destination[key] = Math.round(source[key]);\n\t });\n\t\n\t destination.width = destination.width || (destination.right - destination.left);\n\t destination.height = destination.height || (destination.bottom - destination.top);\n\t\n\t return destination;\n\t },\n\t\n\t /**\n\t * Calculate ClientRect of element; return null if hidden or zero size\n\t */\n\t clientRect: function (element) {\n\t var bounds = angular.element(element)[0].getBoundingClientRect();\n\t var isPositiveSizeClientRect = function (rect) {\n\t return rect && (rect.width > 0) && (rect.height > 0);\n\t };\n\t\n\t // If the event origin element has zero size, it has probably been hidden.\n\t return isPositiveSizeClientRect(bounds) ? self.copyRect(bounds) : null;\n\t },\n\t\n\t /**\n\t * Calculate 'rounded' center point of Rect\n\t */\n\t centerPointFor: function (targetRect) {\n\t return targetRect ? {\n\t x: Math.round(targetRect.left + (targetRect.width / 2)),\n\t y: Math.round(targetRect.top + (targetRect.height / 2))\n\t } : { x : 0, y : 0 };\n\t }\n\t\n\t };\n\t}\n\t\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\tif (angular.version.minor >= 4) {\n\t angular.module('material.core.animate', []);\n\t} else {\n\t(function() {\n\t \"use strict\";\n\t\n\t var forEach = angular.forEach;\n\t\n\t var WEBKIT = angular.isDefined(document.documentElement.style.WebkitAppearance);\n\t var TRANSITION_PROP = WEBKIT ? 'WebkitTransition' : 'transition';\n\t var ANIMATION_PROP = WEBKIT ? 'WebkitAnimation' : 'animation';\n\t var PREFIX = WEBKIT ? '-webkit-' : '';\n\t\n\t var TRANSITION_EVENTS = (WEBKIT ? 'webkitTransitionEnd ' : '') + 'transitionend';\n\t var ANIMATION_EVENTS = (WEBKIT ? 'webkitAnimationEnd ' : '') + 'animationend';\n\t\n\t var $$ForceReflowFactory = ['$document', function($document) {\n\t return function() {\n\t return $document[0].body.clientWidth + 1;\n\t };\n\t }];\n\t\n\t var $$rAFMutexFactory = ['$$rAF', function($$rAF) {\n\t return function() {\n\t var passed = false;\n\t $$rAF(function() {\n\t passed = true;\n\t });\n\t return function(fn) {\n\t passed ? fn() : $$rAF(fn);\n\t };\n\t };\n\t }];\n\t\n\t var $$AnimateRunnerFactory = ['$q', '$$rAFMutex', function($q, $$rAFMutex) {\n\t var INITIAL_STATE = 0;\n\t var DONE_PENDING_STATE = 1;\n\t var DONE_COMPLETE_STATE = 2;\n\t\n\t function AnimateRunner(host) {\n\t this.setHost(host);\n\t\n\t this._doneCallbacks = [];\n\t this._runInAnimationFrame = $$rAFMutex();\n\t this._state = 0;\n\t }\n\t\n\t AnimateRunner.prototype = {\n\t setHost: function(host) {\n\t this.host = host || {};\n\t },\n\t\n\t done: function(fn) {\n\t if (this._state === DONE_COMPLETE_STATE) {\n\t fn();\n\t } else {\n\t this._doneCallbacks.push(fn);\n\t }\n\t },\n\t\n\t progress: angular.noop,\n\t\n\t getPromise: function() {\n\t if (!this.promise) {\n\t var self = this;\n\t this.promise = $q(function(resolve, reject) {\n\t self.done(function(status) {\n\t status === false ? reject() : resolve();\n\t });\n\t });\n\t }\n\t return this.promise;\n\t },\n\t\n\t then: function(resolveHandler, rejectHandler) {\n\t return this.getPromise().then(resolveHandler, rejectHandler);\n\t },\n\t\n\t 'catch': function(handler) {\n\t return this.getPromise()['catch'](handler);\n\t },\n\t\n\t 'finally': function(handler) {\n\t return this.getPromise()['finally'](handler);\n\t },\n\t\n\t pause: function() {\n\t if (this.host.pause) {\n\t this.host.pause();\n\t }\n\t },\n\t\n\t resume: function() {\n\t if (this.host.resume) {\n\t this.host.resume();\n\t }\n\t },\n\t\n\t end: function() {\n\t if (this.host.end) {\n\t this.host.end();\n\t }\n\t this._resolve(true);\n\t },\n\t\n\t cancel: function() {\n\t if (this.host.cancel) {\n\t this.host.cancel();\n\t }\n\t this._resolve(false);\n\t },\n\t\n\t complete: function(response) {\n\t var self = this;\n\t if (self._state === INITIAL_STATE) {\n\t self._state = DONE_PENDING_STATE;\n\t self._runInAnimationFrame(function() {\n\t self._resolve(response);\n\t });\n\t }\n\t },\n\t\n\t _resolve: function(response) {\n\t if (this._state !== DONE_COMPLETE_STATE) {\n\t forEach(this._doneCallbacks, function(fn) {\n\t fn(response);\n\t });\n\t this._doneCallbacks.length = 0;\n\t this._state = DONE_COMPLETE_STATE;\n\t }\n\t }\n\t };\n\t\n\t // Polyfill AnimateRunner.all which is used by input animations\n\t AnimateRunner.all = function(runners, callback) {\n\t var count = 0;\n\t var status = true;\n\t forEach(runners, function(runner) {\n\t runner.done(onProgress);\n\t });\n\t\n\t function onProgress(response) {\n\t status = status && response;\n\t if (++count === runners.length) {\n\t callback(status);\n\t }\n\t }\n\t };\n\t\n\t return AnimateRunner;\n\t }];\n\t\n\t angular\n\t .module('material.core.animate', [])\n\t .factory('$$forceReflow', $$ForceReflowFactory)\n\t .factory('$$AnimateRunner', $$AnimateRunnerFactory)\n\t .factory('$$rAFMutex', $$rAFMutexFactory)\n\t .factory('$animateCss', ['$window', '$$rAF', '$$AnimateRunner', '$$forceReflow', '$$jqLite', '$timeout', '$animate',\n\t function($window, $$rAF, $$AnimateRunner, $$forceReflow, $$jqLite, $timeout, $animate) {\n\t\n\t function init(element, options) {\n\t\n\t var temporaryStyles = [];\n\t var node = getDomNode(element);\n\t var areAnimationsAllowed = node && $animate.enabled();\n\t\n\t var hasCompleteStyles = false;\n\t var hasCompleteClasses = false;\n\t\n\t if (areAnimationsAllowed) {\n\t if (options.transitionStyle) {\n\t temporaryStyles.push([PREFIX + 'transition', options.transitionStyle]);\n\t }\n\t\n\t if (options.keyframeStyle) {\n\t temporaryStyles.push([PREFIX + 'animation', options.keyframeStyle]);\n\t }\n\t\n\t if (options.delay) {\n\t temporaryStyles.push([PREFIX + 'transition-delay', options.delay + 's']);\n\t }\n\t\n\t if (options.duration) {\n\t temporaryStyles.push([PREFIX + 'transition-duration', options.duration + 's']);\n\t }\n\t\n\t hasCompleteStyles = options.keyframeStyle ||\n\t (options.to && (options.duration > 0 || options.transitionStyle));\n\t hasCompleteClasses = !!options.addClass || !!options.removeClass;\n\t\n\t blockTransition(element, true);\n\t }\n\t\n\t var hasCompleteAnimation = areAnimationsAllowed && (hasCompleteStyles || hasCompleteClasses);\n\t\n\t applyAnimationFromStyles(element, options);\n\t\n\t var animationClosed = false;\n\t var events, eventFn;\n\t\n\t return {\n\t close: $window.close,\n\t start: function() {\n\t var runner = new $$AnimateRunner();\n\t waitUntilQuiet(function() {\n\t blockTransition(element, false);\n\t if (!hasCompleteAnimation) {\n\t return close();\n\t }\n\t\n\t forEach(temporaryStyles, function(entry) {\n\t var key = entry[0];\n\t var value = entry[1];\n\t node.style[camelCase(key)] = value;\n\t });\n\t\n\t applyClasses(element, options);\n\t\n\t var timings = computeTimings(element);\n\t if (timings.duration === 0) {\n\t return close();\n\t }\n\t\n\t var moreStyles = [];\n\t\n\t if (options.easing) {\n\t if (timings.transitionDuration) {\n\t moreStyles.push([PREFIX + 'transition-timing-function', options.easing]);\n\t }\n\t if (timings.animationDuration) {\n\t moreStyles.push([PREFIX + 'animation-timing-function', options.easing]);\n\t }\n\t }\n\t\n\t if (options.delay && timings.animationDelay) {\n\t moreStyles.push([PREFIX + 'animation-delay', options.delay + 's']);\n\t }\n\t\n\t if (options.duration && timings.animationDuration) {\n\t moreStyles.push([PREFIX + 'animation-duration', options.duration + 's']);\n\t }\n\t\n\t forEach(moreStyles, function(entry) {\n\t var key = entry[0];\n\t var value = entry[1];\n\t node.style[camelCase(key)] = value;\n\t temporaryStyles.push(entry);\n\t });\n\t\n\t var maxDelay = timings.delay;\n\t var maxDelayTime = maxDelay * 1000;\n\t var maxDuration = timings.duration;\n\t var maxDurationTime = maxDuration * 1000;\n\t var startTime = Date.now();\n\t\n\t events = [];\n\t if (timings.transitionDuration) {\n\t events.push(TRANSITION_EVENTS);\n\t }\n\t if (timings.animationDuration) {\n\t events.push(ANIMATION_EVENTS);\n\t }\n\t events = events.join(' ');\n\t eventFn = function(event) {\n\t event.stopPropagation();\n\t var ev = event.originalEvent || event;\n\t var timeStamp = ev.timeStamp || Date.now();\n\t var elapsedTime = parseFloat(ev.elapsedTime.toFixed(3));\n\t if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\n\t close();\n\t }\n\t };\n\t element.on(events, eventFn);\n\t\n\t applyAnimationToStyles(element, options);\n\t\n\t $timeout(close, maxDelayTime + maxDurationTime * 1.5, false);\n\t });\n\t\n\t return runner;\n\t\n\t function close() {\n\t if (animationClosed) return;\n\t animationClosed = true;\n\t\n\t if (events && eventFn) {\n\t element.off(events, eventFn);\n\t }\n\t applyClasses(element, options);\n\t applyAnimationStyles(element, options);\n\t forEach(temporaryStyles, function(entry) {\n\t node.style[camelCase(entry[0])] = '';\n\t });\n\t runner.complete(true);\n\t return runner;\n\t }\n\t }\n\t };\n\t }\n\t\n\t function applyClasses(element, options) {\n\t if (options.addClass) {\n\t $$jqLite.addClass(element, options.addClass);\n\t options.addClass = null;\n\t }\n\t if (options.removeClass) {\n\t $$jqLite.removeClass(element, options.removeClass);\n\t options.removeClass = null;\n\t }\n\t }\n\t\n\t function computeTimings(element) {\n\t var node = getDomNode(element);\n\t var cs = $window.getComputedStyle(node);\n\t var tdr = parseMaxTime(cs[prop('transitionDuration')]);\n\t var adr = parseMaxTime(cs[prop('animationDuration')]);\n\t var tdy = parseMaxTime(cs[prop('transitionDelay')]);\n\t var ady = parseMaxTime(cs[prop('animationDelay')]);\n\t\n\t adr *= (parseInt(cs[prop('animationIterationCount')], 10) || 1);\n\t var duration = Math.max(adr, tdr);\n\t var delay = Math.max(ady, tdy);\n\t\n\t return {\n\t duration: duration,\n\t delay: delay,\n\t animationDuration: adr,\n\t transitionDuration: tdr,\n\t animationDelay: ady,\n\t transitionDelay: tdy\n\t };\n\t\n\t function prop(key) {\n\t return WEBKIT ? 'Webkit' + key.charAt(0).toUpperCase() + key.substr(1)\n\t : key;\n\t }\n\t }\n\t\n\t function parseMaxTime(str) {\n\t var maxValue = 0;\n\t var values = (str || \"\").split(/\\s*,\\s*/);\n\t forEach(values, function(value) {\n\t // it's always safe to consider only second values and omit `ms` values since\n\t // getComputedStyle will always handle the conversion for us\n\t if (value.charAt(value.length - 1) == 's') {\n\t value = value.substring(0, value.length - 1);\n\t }\n\t value = parseFloat(value) || 0;\n\t maxValue = maxValue ? Math.max(value, maxValue) : value;\n\t });\n\t return maxValue;\n\t }\n\t\n\t var cancelLastRAFRequest;\n\t var rafWaitQueue = [];\n\t function waitUntilQuiet(callback) {\n\t if (cancelLastRAFRequest) {\n\t cancelLastRAFRequest(); //cancels the request\n\t }\n\t rafWaitQueue.push(callback);\n\t cancelLastRAFRequest = $$rAF(function() {\n\t cancelLastRAFRequest = null;\n\t\n\t // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.\n\t // PLEASE EXAMINE THE `$$forceReflow` service to understand why.\n\t var pageWidth = $$forceReflow();\n\t\n\t // we use a for loop to ensure that if the queue is changed\n\t // during this looping then it will consider new requests\n\t for (var i = 0; i < rafWaitQueue.length; i++) {\n\t rafWaitQueue[i](pageWidth);\n\t }\n\t rafWaitQueue.length = 0;\n\t });\n\t }\n\t\n\t function applyAnimationStyles(element, options) {\n\t applyAnimationFromStyles(element, options);\n\t applyAnimationToStyles(element, options);\n\t }\n\t\n\t function applyAnimationFromStyles(element, options) {\n\t if (options.from) {\n\t element.css(options.from);\n\t options.from = null;\n\t }\n\t }\n\t\n\t function applyAnimationToStyles(element, options) {\n\t if (options.to) {\n\t element.css(options.to);\n\t options.to = null;\n\t }\n\t }\n\t\n\t function getDomNode(element) {\n\t for (var i = 0; i < element.length; i++) {\n\t if (element[i].nodeType === 1) return element[i];\n\t }\n\t }\n\t\n\t function blockTransition(element, bool) {\n\t var node = getDomNode(element);\n\t var key = camelCase(PREFIX + 'transition-delay');\n\t node.style[key] = bool ? '-9999s' : '';\n\t }\n\t\n\t return init;\n\t }]);\n\t\n\t /**\n\t * Older browsers [FF31] expect camelCase\n\t * property keys.\n\t * e.g.\n\t * animation-duration --> animationDuration\n\t */\n\t function camelCase(str) {\n\t return str.replace(/-[a-z]/g, function(str) {\n\t return str.charAt(1).toUpperCase();\n\t });\n\t }\n\t\n\t})();\n\t\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.autocomplete\n\t */\n\t/*\n\t * @see js folder for autocomplete implementation\n\t */\n\tangular.module('material.components.autocomplete', [\n\t 'material.core',\n\t 'material.components.icon',\n\t 'material.components.virtualRepeat'\n\t]);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/*\n\t * @ngdoc module\n\t * @name material.components.backdrop\n\t * @description Backdrop\n\t */\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdBackdrop\n\t * @module material.components.backdrop\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * `` is a backdrop element used by other components, such as dialog and bottom sheet.\n\t * Apply class `opaque` to make the backdrop use the theme backdrop color.\n\t *\n\t */\n\t\n\tangular\n\t .module('material.components.backdrop', ['material.core'])\n\t .directive('mdBackdrop', [\"$mdTheming\", \"$mdUtil\", \"$animate\", \"$rootElement\", \"$window\", \"$log\", \"$$rAF\", \"$document\", function BackdropDirective($mdTheming, $mdUtil, $animate, $rootElement, $window, $log, $$rAF, $document) {\n\t var ERROR_CSS_POSITION = ' may not work properly in a scrolled, static-positioned parent container.';\n\t\n\t return {\n\t restrict: 'E',\n\t link: postLink\n\t };\n\t\n\t function postLink(scope, element, attrs) {\n\t // backdrop may be outside the $rootElement, tell ngAnimate to animate regardless\n\t if ($animate.pin) $animate.pin(element, $rootElement);\n\t\n\t var bodyStyles;\n\t\n\t $$rAF(function() {\n\t // If body scrolling has been disabled using mdUtil.disableBodyScroll(),\n\t // adjust the 'backdrop' height to account for the fixed 'body' top offset.\n\t // Note that this can be pretty expensive and is better done inside the $$rAF.\n\t bodyStyles = $window.getComputedStyle($document[0].body);\n\t\n\t if (bodyStyles.position === 'fixed') {\n\t var resizeHandler = $mdUtil.debounce(function(){\n\t bodyStyles = $window.getComputedStyle($document[0].body);\n\t resize();\n\t }, 60, null, false);\n\t\n\t resize();\n\t angular.element($window).on('resize', resizeHandler);\n\t\n\t scope.$on('$destroy', function() {\n\t angular.element($window).off('resize', resizeHandler);\n\t });\n\t }\n\t\n\t // Often $animate.enter() is used to append the backDrop element\n\t // so let's wait until $animate is done...\n\t var parent = element.parent();\n\t\n\t if (parent.length) {\n\t if (parent[0].nodeName === 'BODY') {\n\t element.css('position', 'fixed');\n\t }\n\t\n\t var styles = $window.getComputedStyle(parent[0]);\n\t\n\t if (styles.position === 'static') {\n\t // backdrop uses position:absolute and will not work properly with parent position:static (default)\n\t $log.warn(ERROR_CSS_POSITION);\n\t }\n\t\n\t // Only inherit the parent if the backdrop has a parent.\n\t $mdTheming.inherit(element, parent);\n\t }\n\t });\n\t\n\t function resize() {\n\t var viewportHeight = parseInt(bodyStyles.height, 10) + Math.abs(parseInt(bodyStyles.top, 10));\n\t element.css('height', viewportHeight + 'px');\n\t }\n\t }\n\t\n\t }]);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.bottomSheet\n\t * @description\n\t * BottomSheet\n\t */\n\tMdBottomSheetDirective.$inject = [\"$mdBottomSheet\"];\n\tMdBottomSheetProvider.$inject = [\"$$interimElementProvider\"];\n\tangular\n\t .module('material.components.bottomSheet', [\n\t 'material.core',\n\t 'material.components.backdrop'\n\t ])\n\t .directive('mdBottomSheet', MdBottomSheetDirective)\n\t .provider('$mdBottomSheet', MdBottomSheetProvider);\n\t\n\t/* @ngInject */\n\tfunction MdBottomSheetDirective($mdBottomSheet) {\n\t return {\n\t restrict: 'E',\n\t link : function postLink(scope, element) {\n\t element.addClass('_md'); // private md component indicator for styling\n\t\n\t // When navigation force destroys an interimElement, then\n\t // listen and $destroy() that interim instance...\n\t scope.$on('$destroy', function() {\n\t $mdBottomSheet.destroy();\n\t });\n\t }\n\t };\n\t}\n\t\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdBottomSheet\n\t * @module material.components.bottomSheet\n\t *\n\t * @description\n\t * `$mdBottomSheet` opens a bottom sheet over the app and provides a simple promise API.\n\t *\n\t * ## Restrictions\n\t *\n\t * - The bottom sheet's template must have an outer `` element.\n\t * - Add the `md-grid` class to the bottom sheet for a grid layout.\n\t * - Add the `md-list` class to the bottom sheet for a list layout.\n\t *\n\t * @usage\n\t * \n\t *
\n\t * \n\t * Open a Bottom Sheet!\n\t * \n\t *
\n\t *
\n\t * \n\t * var app = angular.module('app', ['ngMaterial']);\n\t * app.controller('MyController', function($scope, $mdBottomSheet) {\n\t * $scope.openBottomSheet = function() {\n\t * $mdBottomSheet.show({\n\t * template: '' +\n\t * 'Hello! Close' +\n\t * ''\n\t * })\n\t *\n\t * // Fires when the hide() method is used\n\t * .then(function() {\n\t * console.log('You clicked the button to close the bottom sheet!');\n\t * })\n\t *\n\t * // Fires when the cancel() method is used\n\t * .catch(function() {\n\t * console.log('You hit escape or clicked the backdrop to close.');\n\t * });\n\t * };\n\t *\n\t * $scope.closeBottomSheet = function($scope, $mdBottomSheet) {\n\t * $mdBottomSheet.hide();\n\t * }\n\t *\n\t * });\n\t * \n\t */\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdBottomSheet#show\n\t *\n\t * @description\n\t * Show a bottom sheet with the specified options.\n\t *\n\t * Note: You should always provide a `.catch()` method in case the user hits the\n\t * `esc` key or clicks the background to close. In this case, the `cancel()` method will\n\t * automatically be called on the bottom sheet which will `reject()` the promise. See the @usage\n\t * section above for an example.\n\t *\n\t * Newer versions of Angular will throw a `Possibly unhandled rejection` exception if you forget\n\t * this.\n\t *\n\t * @param {object} options An options object, with the following properties:\n\t *\n\t * - `templateUrl` - `{string=}`: The url of an html template file that will\n\t * be used as the content of the bottom sheet. Restrictions: the template must\n\t * have an outer `md-bottom-sheet` element.\n\t * - `template` - `{string=}`: Same as templateUrl, except this is an actual\n\t * template string.\n\t * - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new child scope.\n\t * This scope will be destroyed when the bottom sheet is removed unless `preserveScope` is set to true.\n\t * - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n\t * - `controller` - `{string=}`: The controller to associate with this bottom sheet.\n\t * - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n\t * be used as names of values to inject into the controller. For example,\n\t * `locals: {three: 3}` would inject `three` into the controller with the value\n\t * of 3.\n\t * - `clickOutsideToClose` - `{boolean=}`: Whether the user can click outside the bottom sheet to\n\t * close it. Default true.\n\t * - `bindToController` - `{boolean=}`: When set to true, the locals will be bound to the controller instance.\n\t * - `disableBackdrop` - `{boolean=}`: When set to true, the bottomsheet will not show a backdrop.\n\t * - `escapeToClose` - `{boolean=}`: Whether the user can press escape to close the bottom sheet.\n\t * Default true.\n\t * - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n\t * and the bottom sheet will not open until the promises resolve.\n\t * - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n\t * - `parent` - `{element=}`: The element to append the bottom sheet to. The `parent` may be a `function`, `string`,\n\t * `object`, or null. Defaults to appending to the body of the root element (or the root element) of the application.\n\t * e.g. angular.element(document.getElementById('content')) or \"#content\"\n\t * - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the bottom sheet is open.\n\t * Default true.\n\t *\n\t * @returns {promise} A promise that can be resolved with `$mdBottomSheet.hide()` or\n\t * rejected with `$mdBottomSheet.cancel()`.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdBottomSheet#hide\n\t *\n\t * @description\n\t * Hide the existing bottom sheet and resolve the promise returned from\n\t * `$mdBottomSheet.show()`. This call will close the most recently opened/current bottomsheet (if\n\t * any).\n\t *\n\t * Note: Use a `.then()` on your `.show()` to handle this callback.\n\t *\n\t * @param {*=} response An argument for the resolved promise.\n\t *\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdBottomSheet#cancel\n\t *\n\t * @description\n\t * Hide the existing bottom sheet and reject the promise returned from\n\t * `$mdBottomSheet.show()`.\n\t *\n\t * Note: Use a `.catch()` on your `.show()` to handle this callback.\n\t *\n\t * @param {*=} response An argument for the rejected promise.\n\t *\n\t */\n\t\n\tfunction MdBottomSheetProvider($$interimElementProvider) {\n\t // how fast we need to flick down to close the sheet, pixels/ms\n\t bottomSheetDefaults.$inject = [\"$animate\", \"$mdConstant\", \"$mdUtil\", \"$mdTheming\", \"$mdBottomSheet\", \"$rootElement\", \"$mdGesture\", \"$log\"];\n\t var CLOSING_VELOCITY = 0.5;\n\t var PADDING = 80; // same as css\n\t\n\t return $$interimElementProvider('$mdBottomSheet')\n\t .setDefaults({\n\t methods: ['disableParentScroll', 'escapeToClose', 'clickOutsideToClose'],\n\t options: bottomSheetDefaults\n\t });\n\t\n\t /* @ngInject */\n\t function bottomSheetDefaults($animate, $mdConstant, $mdUtil, $mdTheming, $mdBottomSheet, $rootElement,\n\t $mdGesture, $log) {\n\t var backdrop;\n\t\n\t return {\n\t themable: true,\n\t onShow: onShow,\n\t onRemove: onRemove,\n\t disableBackdrop: false,\n\t escapeToClose: true,\n\t clickOutsideToClose: true,\n\t disableParentScroll: true\n\t };\n\t\n\t\n\t function onShow(scope, element, options, controller) {\n\t\n\t element = $mdUtil.extractElementByName(element, 'md-bottom-sheet');\n\t\n\t // prevent tab focus or click focus on the bottom-sheet container\n\t element.attr('tabindex',\"-1\");\n\t\n\t // Once the md-bottom-sheet has `ng-cloak` applied on his template the opening animation will not work properly.\n\t // This is a very common problem, so we have to notify the developer about this.\n\t if (element.hasClass('ng-cloak')) {\n\t var message = '$mdBottomSheet: using `` will affect the bottom-sheet opening animations.';\n\t $log.warn( message, element[0] );\n\t }\n\t\n\t if (!options.disableBackdrop) {\n\t // Add a backdrop that will close on click\n\t backdrop = $mdUtil.createBackdrop(scope, \"md-bottom-sheet-backdrop md-opaque\");\n\t\n\t // Prevent mouse focus on backdrop; ONLY programatic focus allowed.\n\t // This allows clicks on backdrop to propogate to the $rootElement and\n\t // ESC key events to be detected properly.\n\t \n\t backdrop[0].tabIndex = -1;\n\t\n\t if (options.clickOutsideToClose) {\n\t backdrop.on('click', function() {\n\t $mdUtil.nextTick($mdBottomSheet.cancel,true);\n\t });\n\t }\n\t\n\t $mdTheming.inherit(backdrop, options.parent);\n\t\n\t $animate.enter(backdrop, options.parent, null);\n\t }\n\t\n\t var bottomSheet = new BottomSheet(element, options.parent);\n\t options.bottomSheet = bottomSheet;\n\t\n\t $mdTheming.inherit(bottomSheet.element, options.parent);\n\t\n\t if (options.disableParentScroll) {\n\t options.restoreScroll = $mdUtil.disableScrollAround(bottomSheet.element, options.parent);\n\t }\n\t\n\t return $animate.enter(bottomSheet.element, options.parent, backdrop)\n\t .then(function() {\n\t var focusable = $mdUtil.findFocusTarget(element) || angular.element(\n\t element[0].querySelector('button') ||\n\t element[0].querySelector('a') ||\n\t element[0].querySelector($mdUtil.prefixer('ng-click', true))\n\t ) || backdrop;\n\t\n\t if (options.escapeToClose) {\n\t options.rootElementKeyupCallback = function(e) {\n\t if (e.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n\t $mdUtil.nextTick($mdBottomSheet.cancel,true);\n\t }\n\t };\n\t\n\t $rootElement.on('keyup', options.rootElementKeyupCallback);\n\t focusable && focusable.focus();\n\t }\n\t });\n\t\n\t }\n\t\n\t function onRemove(scope, element, options) {\n\t\n\t var bottomSheet = options.bottomSheet;\n\t\n\t if (!options.disableBackdrop) $animate.leave(backdrop);\n\t return $animate.leave(bottomSheet.element).then(function() {\n\t if (options.disableParentScroll) {\n\t options.restoreScroll();\n\t delete options.restoreScroll;\n\t }\n\t\n\t bottomSheet.cleanup();\n\t });\n\t }\n\t\n\t /**\n\t * BottomSheet class to apply bottom-sheet behavior to an element\n\t */\n\t function BottomSheet(element, parent) {\n\t var deregister = $mdGesture.register(parent, 'drag', { horizontal: false });\n\t parent.on('$md.dragstart', onDragStart)\n\t .on('$md.drag', onDrag)\n\t .on('$md.dragend', onDragEnd);\n\t\n\t return {\n\t element: element,\n\t cleanup: function cleanup() {\n\t deregister();\n\t parent.off('$md.dragstart', onDragStart);\n\t parent.off('$md.drag', onDrag);\n\t parent.off('$md.dragend', onDragEnd);\n\t }\n\t };\n\t\n\t function onDragStart(ev) {\n\t // Disable transitions on transform so that it feels fast\n\t element.css($mdConstant.CSS.TRANSITION_DURATION, '0ms');\n\t }\n\t\n\t function onDrag(ev) {\n\t var transform = ev.pointer.distanceY;\n\t if (transform < 5) {\n\t // Slow down drag when trying to drag up, and stop after PADDING\n\t transform = Math.max(-PADDING, transform / 2);\n\t }\n\t element.css($mdConstant.CSS.TRANSFORM, 'translate3d(0,' + (PADDING + transform) + 'px,0)');\n\t }\n\t\n\t function onDragEnd(ev) {\n\t if (ev.pointer.distanceY > 0 &&\n\t (ev.pointer.distanceY > 20 || Math.abs(ev.pointer.velocityY) > CLOSING_VELOCITY)) {\n\t var distanceRemaining = element.prop('offsetHeight') - ev.pointer.distanceY;\n\t var transitionDuration = Math.min(distanceRemaining / ev.pointer.velocityY * 0.75, 500);\n\t element.css($mdConstant.CSS.TRANSITION_DURATION, transitionDuration + 'ms');\n\t $mdUtil.nextTick($mdBottomSheet.cancel,true);\n\t } else {\n\t element.css($mdConstant.CSS.TRANSITION_DURATION, '');\n\t element.css($mdConstant.CSS.TRANSFORM, '');\n\t }\n\t }\n\t }\n\t\n\t }\n\t\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.button\n\t * @description\n\t *\n\t * Button\n\t */\n\tMdButtonDirective.$inject = [\"$mdButtonInkRipple\", \"$mdTheming\", \"$mdAria\", \"$mdInteraction\"];\n\tMdAnchorDirective.$inject = [\"$mdTheming\"];\n\tangular\n\t .module('material.components.button', [ 'material.core' ])\n\t .directive('mdButton', MdButtonDirective)\n\t .directive('a', MdAnchorDirective);\n\t\n\t\n\t/**\n\t * @private\n\t * @restrict E\n\t *\n\t * @description\n\t * `a` is an anchor directive used to inherit theme colors for md-primary, md-accent, etc.\n\t *\n\t * @usage\n\t *\n\t * \n\t * \n\t * \n\t * \n\t * \n\t */\n\tfunction MdAnchorDirective($mdTheming) {\n\t return {\n\t restrict : 'E',\n\t link : function postLink(scope, element) {\n\t // Make sure to inherit theme so stand-alone anchors\n\t // support theme colors for md-primary, md-accent, etc.\n\t $mdTheming(element);\n\t }\n\t };\n\t}\n\t\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdButton\n\t * @module material.components.button\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * `` is a button directive with optional ink ripples (default enabled).\n\t *\n\t * If you supply a `href` or `ng-href` attribute, it will become an `` element. Otherwise, it\n\t * will become a `';\n\t }\n\t }\n\t\n\t function postLink(scope, element, attr) {\n\t $mdTheming(element);\n\t $mdButtonInkRipple.attach(scope, element);\n\t\n\t // Use async expect to support possible bindings in the button label\n\t $mdAria.expectWithoutText(element, 'aria-label');\n\t\n\t // For anchor elements, we have to set tabindex manually when the\n\t // element is disabled\n\t if (isAnchor(attr) && angular.isDefined(attr.ngDisabled) ) {\n\t scope.$watch(attr.ngDisabled, function(isDisabled) {\n\t element.attr('tabindex', isDisabled ? -1 : 0);\n\t });\n\t }\n\t\n\t // disabling click event when disabled is true\n\t element.on('click', function(e){\n\t if (attr.disabled === true) {\n\t e.preventDefault();\n\t e.stopImmediatePropagation();\n\t }\n\t });\n\t\n\t if (!element.hasClass('md-no-focus')) {\n\t\n\t element.on('focus', function() {\n\t\n\t // Only show the focus effect when being focused through keyboard interaction or programmatically\n\t if (!$mdInteraction.isUserInvoked() || $mdInteraction.getLastInteractionType() === 'keyboard') {\n\t element.addClass('md-focused');\n\t }\n\t\n\t });\n\t\n\t element.on('blur', function() {\n\t element.removeClass('md-focused');\n\t });\n\t }\n\t\n\t }\n\t\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.card\n\t *\n\t * @description\n\t * Card components.\n\t */\n\tmdCardDirective.$inject = [\"$mdTheming\"];\n\tangular.module('material.components.card', [\n\t 'material.core'\n\t ])\n\t .directive('mdCard', mdCardDirective);\n\t\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdCard\n\t * @module material.components.card\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * The `` directive is a container element used within `` containers.\n\t *\n\t * An image included as a direct descendant will fill the card's width. If you want to avoid this,\n\t * you can add the `md-image-no-fill` class to the parent element. The ``\n\t * container will wrap text content and provide padding. An `` element can be\n\t * optionally included to put content flush against the bottom edge of the card.\n\t *\n\t * Action buttons can be included in an `` element, similar to ``.\n\t * You can then position buttons using layout attributes.\n\t *\n\t * Card is built with:\n\t * * `` - Header for the card, holds avatar, text and squared image\n\t * - `` - Card avatar\n\t * - `md-user-avatar` - Class for user image\n\t * - ``\n\t * - `` - Contains elements for the card description\n\t * - `md-title` - Class for the card title\n\t * - `md-subhead` - Class for the card sub header\n\t * * `` - Image for the card\n\t * * `` - Card content title\n\t * - ``\n\t * - `md-headline` - Class for the card content title\n\t * - `md-subhead` - Class for the card content sub header\n\t * - `` - Squared image within the title\n\t * - `md-media-sm` - Class for small image\n\t * - `md-media-md` - Class for medium image\n\t * - `md-media-lg` - Class for large image\n\t * - `md-media-xl` - Class for extra large image\n\t * * `` - Card content\n\t * * `` - Card actions\n\t * - `` - Icon actions\n\t *\n\t * Cards have constant width and variable heights; where the maximum height is limited to what can\n\t * fit within a single view on a platform, but it can temporarily expand as needed.\n\t *\n\t * @usage\n\t * ### Card with optional footer\n\t * \n\t * \n\t * \"image\n\t * \n\t *

Card headline

\n\t *

Card content

\n\t *
\n\t * \n\t * Card footer\n\t * \n\t *
\n\t *
\n\t *\n\t * ### Card with actions\n\t * \n\t * \n\t * \"image\n\t * \n\t *

Card headline

\n\t *

Card content

\n\t *
\n\t * \n\t * Action 1\n\t * Action 2\n\t * \n\t *
\n\t *
\n\t *\n\t * ### Card with header, image, title actions and content\n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * Title\n\t * Sub header\n\t * \n\t * \n\t * \"image\n\t * \n\t * \n\t * Card headline\n\t * Card subheader\n\t * \n\t * \n\t * \n\t * Action 1\n\t * Action 2\n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t *

\n\t * Card content\n\t *

\n\t *
\n\t *
\n\t *
\n\t */\n\tfunction mdCardDirective($mdTheming) {\n\t return {\n\t restrict: 'E',\n\t link: function ($scope, $element, attr) {\n\t $element.addClass('_md'); // private md component indicator for styling\n\t $mdTheming($element);\n\t }\n\t };\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.checkbox\n\t * @description Checkbox module!\n\t */\n\tMdCheckboxDirective.$inject = [\"inputDirective\", \"$mdAria\", \"$mdConstant\", \"$mdTheming\", \"$mdUtil\", \"$mdInteraction\"];\n\tangular\n\t .module('material.components.checkbox', ['material.core'])\n\t .directive('mdCheckbox', MdCheckboxDirective);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdCheckbox\n\t * @module material.components.checkbox\n\t * @restrict E\n\t *\n\t * @description\n\t * The checkbox directive is used like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n\t *\n\t * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-color-schemes)\n\t * the checkbox is in the accent color by default. The primary color palette may be used with\n\t * the `md-primary` class.\n\t *\n\t * @param {string} ng-model Assignable angular expression to data-bind to.\n\t * @param {string=} name Property name of the form under which the control is published.\n\t * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n\t * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n\t * @param {string=} ng-change AngularJS expression to be executed when input changes due to user interaction with the input element.\n\t * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects\n\t * @param {string=} aria-label Adds label to checkbox for accessibility.\n\t * Defaults to checkbox's text. If no default text is found, a warning will be logged.\n\t * @param {expression=} md-indeterminate This determines when the checkbox should be rendered as 'indeterminate'.\n\t * If a truthy expression or no value is passed in the checkbox renders in the md-indeterminate state.\n\t * If falsy expression is passed in it just looks like a normal unchecked checkbox.\n\t * The indeterminate, checked, and unchecked states are mutually exclusive. A box cannot be in any two states at the same time.\n\t * Adding the 'md-indeterminate' attribute overrides any checked/unchecked rendering logic.\n\t * When using the 'md-indeterminate' attribute use 'ng-checked' to define rendering logic instead of using 'ng-model'.\n\t * @param {expression=} ng-checked If this expression evaluates as truthy, the 'md-checked' css class is added to the checkbox and it\n\t * will appear checked.\n\t *\n\t * @usage\n\t * \n\t * \n\t * Finished ?\n\t * \n\t *\n\t * \n\t * No Ink Effects\n\t * \n\t *\n\t * \n\t * Disabled\n\t * \n\t *\n\t * \n\t *\n\t */\n\tfunction MdCheckboxDirective(inputDirective, $mdAria, $mdConstant, $mdTheming, $mdUtil, $mdInteraction) {\n\t inputDirective = inputDirective[0];\n\t\n\t return {\n\t restrict: 'E',\n\t transclude: true,\n\t require: ['^?mdInputContainer', '?ngModel', '?^form'],\n\t priority: $mdConstant.BEFORE_NG_ARIA,\n\t template:\n\t '
' +\n\t '
' +\n\t '
' +\n\t '
',\n\t compile: compile\n\t };\n\t\n\t // **********************************************************\n\t // Private Methods\n\t // **********************************************************\n\t\n\t function compile (tElement, tAttrs) {\n\t tAttrs.$set('tabindex', tAttrs.tabindex || '0');\n\t tAttrs.$set('type', 'checkbox');\n\t tAttrs.$set('role', tAttrs.type);\n\t\n\t return {\n\t pre: function(scope, element) {\n\t // Attach a click handler during preLink, in order to immediately stop propagation\n\t // (especially for ng-click) when the checkbox is disabled.\n\t element.on('click', function(e) {\n\t if (this.hasAttribute('disabled')) {\n\t e.stopImmediatePropagation();\n\t }\n\t });\n\t },\n\t post: postLink\n\t };\n\t\n\t function postLink(scope, element, attr, ctrls) {\n\t var isIndeterminate;\n\t var containerCtrl = ctrls[0];\n\t var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n\t var formCtrl = ctrls[2];\n\t\n\t if (containerCtrl) {\n\t var isErrorGetter = containerCtrl.isErrorGetter || function() {\n\t return ngModelCtrl.$invalid && (ngModelCtrl.$touched || (formCtrl && formCtrl.$submitted));\n\t };\n\t\n\t containerCtrl.input = element;\n\t\n\t scope.$watch(isErrorGetter, containerCtrl.setInvalid);\n\t }\n\t\n\t $mdTheming(element);\n\t\n\t // Redirect focus events to the root element, because IE11 is always focusing the container element instead\n\t // of the md-checkbox element. This causes issues when using ngModelOptions: `updateOnBlur`\n\t element.children().on('focus', function() {\n\t element.focus();\n\t });\n\t\n\t if ($mdUtil.parseAttributeBoolean(attr.mdIndeterminate)) {\n\t setIndeterminateState();\n\t scope.$watch(attr.mdIndeterminate, setIndeterminateState);\n\t }\n\t\n\t if (attr.ngChecked) {\n\t scope.$watch(scope.$eval.bind(scope, attr.ngChecked), function(value) {\n\t ngModelCtrl.$setViewValue(value);\n\t ngModelCtrl.$render();\n\t });\n\t }\n\t\n\t $$watchExpr('ngDisabled', 'tabindex', {\n\t true: '-1',\n\t false: attr.tabindex\n\t });\n\t\n\t $mdAria.expectWithText(element, 'aria-label');\n\t\n\t // Reuse the original input[type=checkbox] directive from AngularJS core.\n\t // This is a bit hacky as we need our own event listener and own render\n\t // function.\n\t inputDirective.link.pre(scope, {\n\t on: angular.noop,\n\t 0: {}\n\t }, attr, [ngModelCtrl]);\n\t\n\t element.on('click', listener)\n\t .on('keypress', keypressHandler)\n\t .on('focus', function() {\n\t if ($mdInteraction.getLastInteractionType() === 'keyboard') {\n\t element.addClass('md-focused');\n\t }\n\t })\n\t .on('blur', function() {\n\t element.removeClass('md-focused');\n\t });\n\t\n\t ngModelCtrl.$render = render;\n\t\n\t function $$watchExpr(expr, htmlAttr, valueOpts) {\n\t if (attr[expr]) {\n\t scope.$watch(attr[expr], function(val) {\n\t if (valueOpts[val]) {\n\t element.attr(htmlAttr, valueOpts[val]);\n\t }\n\t });\n\t }\n\t }\n\t\n\t function keypressHandler(ev) {\n\t var keyCode = ev.which || ev.keyCode;\n\t if (keyCode === $mdConstant.KEY_CODE.SPACE || keyCode === $mdConstant.KEY_CODE.ENTER) {\n\t ev.preventDefault();\n\t element.addClass('md-focused');\n\t listener(ev);\n\t }\n\t }\n\t\n\t function listener(ev) {\n\t // skipToggle boolean is used by the switch directive to prevent the click event\n\t // when releasing the drag. There will be always a click if releasing the drag over the checkbox\n\t if (element[0].hasAttribute('disabled') || scope.skipToggle) {\n\t return;\n\t }\n\t\n\t scope.$apply(function() {\n\t // Toggle the checkbox value...\n\t var viewValue = attr.ngChecked && attr.ngClick ? attr.checked : !ngModelCtrl.$viewValue;\n\t\n\t ngModelCtrl.$setViewValue(viewValue, ev && ev.type);\n\t ngModelCtrl.$render();\n\t });\n\t }\n\t\n\t function render() {\n\t // Cast the $viewValue to a boolean since it could be undefined\n\t element.toggleClass('md-checked', !!ngModelCtrl.$viewValue && !isIndeterminate);\n\t }\n\t\n\t function setIndeterminateState(newValue) {\n\t isIndeterminate = newValue !== false;\n\t if (isIndeterminate) {\n\t element.attr('aria-checked', 'mixed');\n\t }\n\t element.toggleClass('md-indeterminate', isIndeterminate);\n\t }\n\t }\n\t }\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.chips\n\t */\n\t/*\n\t * @see js folder for chips implementation\n\t */\n\tangular.module('material.components.chips', [\n\t 'material.core',\n\t 'material.components.autocomplete'\n\t]);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function () {\n\t \"use strict\";\n\t\n\t /**\n\t * Use a RegExp to check if the `md-colors=\"\"` is static string\n\t * or one that should be observed and dynamically interpolated.\n\t */\n\t MdColorsDirective.$inject = [\"$mdColors\", \"$mdUtil\", \"$log\", \"$parse\"];\n\t MdColorsService.$inject = [\"$mdTheming\", \"$mdUtil\", \"$log\"];\n\t var STATIC_COLOR_EXPRESSION = /^{((\\s|,)*?[\"'a-zA-Z-]+?\\s*?:\\s*?('|\")[a-zA-Z0-9-.]*('|\"))+\\s*}$/;\n\t var colorPalettes = null;\n\t\n\t /**\n\t * @ngdoc module\n\t * @name material.components.colors\n\t *\n\t * @description\n\t * Define $mdColors service and a `md-colors=\"\"` attribute directive\n\t */\n\t angular\n\t .module('material.components.colors', ['material.core'])\n\t .directive('mdColors', MdColorsDirective)\n\t .service('$mdColors', MdColorsService);\n\t\n\t /**\n\t * @ngdoc service\n\t * @name $mdColors\n\t * @module material.components.colors\n\t *\n\t * @description\n\t * With only defining themes, one couldn't get non AngularJS Material elements colored with Material colors,\n\t * `$mdColors` service is used by the md-color directive to convert the 1..n color expressions to RGBA values and will apply\n\t * those values to element as CSS property values.\n\t *\n\t * @usage\n\t * \n\t * angular.controller('myCtrl', function ($mdColors) {\n\t * var color = $mdColors.getThemeColor('myTheme-red-200-0.5');\n\t * ...\n\t * });\n\t * \n\t *\n\t */\n\t function MdColorsService($mdTheming, $mdUtil, $log) {\n\t colorPalettes = colorPalettes || Object.keys($mdTheming.PALETTES);\n\t\n\t // Publish service instance\n\t return {\n\t applyThemeColors: applyThemeColors,\n\t getThemeColor: getThemeColor,\n\t hasTheme: hasTheme\n\t };\n\t\n\t // ********************************************\n\t // Internal Methods\n\t // ********************************************\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdColors#applyThemeColors\n\t *\n\t * @description\n\t * Gets a color json object, keys are css properties and values are string of the wanted color\n\t * Then calculate the rgba() values based on the theme color parts\n\t *\n\t * @param {DOMElement} element the element to apply the styles on.\n\t * @param {object} colorExpression json object, keys are css properties and values are string of the wanted color,\n\t * for example: `{color: 'red-A200-0.3'}`.\n\t *\n\t * @usage\n\t * \n\t * app.directive('myDirective', function($mdColors) {\n\t * return {\n\t * ...\n\t * link: function (scope, elem) {\n\t * $mdColors.applyThemeColors(elem, {color: 'red'});\n\t * }\n\t * }\n\t * });\n\t * \n\t */\n\t function applyThemeColors(element, colorExpression) {\n\t try {\n\t if (colorExpression) {\n\t // Assign the calculate RGBA color values directly as inline CSS\n\t element.css(interpolateColors(colorExpression));\n\t }\n\t } catch (e) {\n\t $log.error(e.message);\n\t }\n\t\n\t }\n\t\n\t /**\n\t * @ngdoc method\n\t * @name $mdColors#getThemeColor\n\t *\n\t * @description\n\t * Get parsed color from expression\n\t *\n\t * @param {string} expression string of a color expression (for instance `'red-700-0.8'`)\n\t *\n\t * @returns {string} a css color expression (for instance `rgba(211, 47, 47, 0.8)`)\n\t *\n\t * @usage\n\t * \n\t * angular.controller('myCtrl', function ($mdColors) {\n\t * var color = $mdColors.getThemeColor('myTheme-red-200-0.5');\n\t * ...\n\t * });\n\t * \n\t */\n\t function getThemeColor(expression) {\n\t var color = extractColorOptions(expression);\n\t\n\t return parseColor(color);\n\t }\n\t\n\t /**\n\t * Return the parsed color\n\t * @param color hashmap of color definitions\n\t * @param contrast whether use contrast color for foreground\n\t * @returns rgba color string\n\t */\n\t function parseColor(color, contrast) {\n\t contrast = contrast || false;\n\t var rgbValues = $mdTheming.PALETTES[color.palette][color.hue];\n\t\n\t rgbValues = contrast ? rgbValues.contrast : rgbValues.value;\n\t\n\t return $mdUtil.supplant('rgba({0}, {1}, {2}, {3})',\n\t [rgbValues[0], rgbValues[1], rgbValues[2], rgbValues[3] || color.opacity]\n\t );\n\t }\n\t\n\t /**\n\t * Convert the color expression into an object with scope-interpolated values\n\t * Then calculate the rgba() values based on the theme color parts\n\t *\n\t * @results Hashmap of CSS properties with associated `rgba( )` string vales\n\t *\n\t *\n\t */\n\t function interpolateColors(themeColors) {\n\t var rgbColors = {};\n\t\n\t var hasColorProperty = themeColors.hasOwnProperty('color');\n\t\n\t angular.forEach(themeColors, function (value, key) {\n\t var color = extractColorOptions(value);\n\t var hasBackground = key.indexOf('background') > -1;\n\t\n\t rgbColors[key] = parseColor(color);\n\t if (hasBackground && !hasColorProperty) {\n\t rgbColors.color = parseColor(color, true);\n\t }\n\t });\n\t\n\t return rgbColors;\n\t }\n\t\n\t /**\n\t * Check if expression has defined theme\n\t * e.g.\n\t * 'myTheme-primary' => true\n\t * 'red-800' => false\n\t */\n\t function hasTheme(expression) {\n\t return angular.isDefined($mdTheming.THEMES[expression.split('-')[0]]);\n\t }\n\t\n\t /**\n\t * For the evaluated expression, extract the color parts into a hash map\n\t */\n\t function extractColorOptions(expression) {\n\t var parts = expression.split('-');\n\t var hasTheme = angular.isDefined($mdTheming.THEMES[parts[0]]);\n\t var theme = hasTheme ? parts.splice(0, 1)[0] : $mdTheming.defaultTheme();\n\t\n\t return {\n\t theme: theme,\n\t palette: extractPalette(parts, theme),\n\t hue: extractHue(parts, theme),\n\t opacity: parts[2] || 1\n\t };\n\t }\n\t\n\t /**\n\t * Calculate the theme palette name\n\t */\n\t function extractPalette(parts, theme) {\n\t // If the next section is one of the palettes we assume it's a two word palette\n\t // Two word palette can be also written in camelCase, forming camelCase to dash-case\n\t\n\t var isTwoWord = parts.length > 1 && colorPalettes.indexOf(parts[1]) !== -1;\n\t var palette = parts[0].replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\t\n\t if (isTwoWord) palette = parts[0] + '-' + parts.splice(1, 1);\n\t\n\t if (colorPalettes.indexOf(palette) === -1) {\n\t // If the palette is not in the palette list it's one of primary/accent/warn/background\n\t var scheme = $mdTheming.THEMES[theme].colors[palette];\n\t if (!scheme) {\n\t throw new Error($mdUtil.supplant('mdColors: couldn\\'t find \\'{palette}\\' in the palettes.', {palette: palette}));\n\t }\n\t palette = scheme.name;\n\t }\n\t\n\t return palette;\n\t }\n\t\n\t function extractHue(parts, theme) {\n\t var themeColors = $mdTheming.THEMES[theme].colors;\n\t\n\t if (parts[1] === 'hue') {\n\t var hueNumber = parseInt(parts.splice(2, 1)[0], 10);\n\t\n\t if (hueNumber < 1 || hueNumber > 3) {\n\t throw new Error($mdUtil.supplant('mdColors: \\'hue-{hueNumber}\\' is not a valid hue, can be only \\'hue-1\\', \\'hue-2\\' and \\'hue-3\\'', {hueNumber: hueNumber}));\n\t }\n\t parts[1] = 'hue-' + hueNumber;\n\t\n\t if (!(parts[0] in themeColors)) {\n\t throw new Error($mdUtil.supplant('mdColors: \\'hue-x\\' can only be used with [{availableThemes}], but was used with \\'{usedTheme}\\'', {\n\t availableThemes: Object.keys(themeColors).join(', '),\n\t usedTheme: parts[0]\n\t }));\n\t }\n\t\n\t return themeColors[parts[0]].hues[parts[1]];\n\t }\n\t\n\t return parts[1] || themeColors[parts[0] in themeColors ? parts[0] : 'primary'].hues['default'];\n\t }\n\t }\n\t\n\t /**\n\t * @ngdoc directive\n\t * @name mdColors\n\t * @module material.components.colors\n\t *\n\t * @restrict A\n\t *\n\t * @description\n\t * `mdColors` directive will apply the theme-based color expression as RGBA CSS style values.\n\t *\n\t * The format will be similar to our color defining in the scss files:\n\t *\n\t * ## `[?theme]-[palette]-[?hue]-[?opacity]`\n\t * - [theme] - default value is the default theme\n\t * - [palette] - can be either palette name or primary/accent/warn/background\n\t * - [hue] - default is 500 (hue-x can be used with primary/accent/warn/background)\n\t * - [opacity] - default is 1\n\t *\n\t * > `?` indicates optional parameter\n\t *\n\t * @usage\n\t * \n\t *
\n\t *
\n\t * Color demo\n\t *
\n\t *
\n\t *
\n\t *\n\t * `mdColors` directive will automatically watch for changes in the expression if it recognizes an interpolation\n\t * expression or a function. For performance options, you can use `::` prefix to the `md-colors` expression\n\t * to indicate a one-time data binding.\n\t * \n\t * \n\t * \n\t * \n\t *\n\t */\n\t function MdColorsDirective($mdColors, $mdUtil, $log, $parse) {\n\t return {\n\t restrict: 'A',\n\t require: ['^?mdTheme'],\n\t compile: function (tElem, tAttrs) {\n\t var shouldWatch = shouldColorsWatch();\n\t\n\t return function (scope, element, attrs, ctrl) {\n\t var mdThemeController = ctrl[0];\n\t\n\t var lastColors = {};\n\t\n\t var parseColors = function (theme) {\n\t if (typeof theme !== 'string') {\n\t theme = '';\n\t }\n\t\n\t if (!attrs.mdColors) {\n\t attrs.mdColors = '{}';\n\t }\n\t\n\t /**\n\t * Json.parse() does not work because the keys are not quoted;\n\t * use $parse to convert to a hash map\n\t */\n\t var colors = $parse(attrs.mdColors)(scope);\n\t\n\t /**\n\t * If mdTheme is defined up the DOM tree\n\t * we add mdTheme theme to colors who doesn't specified a theme\n\t *\n\t * # example\n\t * \n\t *
\n\t *
\n\t * Color demo\n\t *
\n\t *
\n\t *
\n\t *\n\t * 'primary-600' will be 'myTheme-primary-600',\n\t * but 'mySecondTheme-accent-200' will stay the same cause it has a theme prefix\n\t */\n\t if (mdThemeController) {\n\t Object.keys(colors).forEach(function (prop) {\n\t var color = colors[prop];\n\t if (!$mdColors.hasTheme(color)) {\n\t colors[prop] = (theme || mdThemeController.$mdTheme) + '-' + color;\n\t }\n\t });\n\t }\n\t\n\t cleanElement(colors);\n\t\n\t return colors;\n\t };\n\t\n\t var cleanElement = function (colors) {\n\t if (!angular.equals(colors, lastColors)) {\n\t var keys = Object.keys(lastColors);\n\t\n\t if (lastColors.background && !keys.color) {\n\t keys.push('color');\n\t }\n\t\n\t keys.forEach(function (key) {\n\t element.css(key, '');\n\t });\n\t }\n\t\n\t lastColors = colors;\n\t };\n\t\n\t /**\n\t * Registering for mgTheme changes and asking mdTheme controller run our callback whenever a theme changes\n\t */\n\t var unregisterChanges = angular.noop;\n\t\n\t if (mdThemeController) {\n\t unregisterChanges = mdThemeController.registerChanges(function (theme) {\n\t $mdColors.applyThemeColors(element, parseColors(theme));\n\t });\n\t }\n\t\n\t scope.$on('$destroy', function () {\n\t unregisterChanges();\n\t });\n\t\n\t try {\n\t if (shouldWatch) {\n\t scope.$watch(parseColors, angular.bind(this,\n\t $mdColors.applyThemeColors, element\n\t ), true);\n\t }\n\t else {\n\t $mdColors.applyThemeColors(element, parseColors());\n\t }\n\t\n\t }\n\t catch (e) {\n\t $log.error(e.message);\n\t }\n\t\n\t };\n\t\n\t function shouldColorsWatch() {\n\t // Simulate 1x binding and mark mdColorsWatch == false\n\t var rawColorExpression = tAttrs.mdColors;\n\t var bindOnce = rawColorExpression.indexOf('::') > -1;\n\t var isStatic = bindOnce ? true : STATIC_COLOR_EXPRESSION.test(tAttrs.mdColors);\n\t\n\t // Remove it for the postLink...\n\t tAttrs.mdColors = rawColorExpression.replace('::', '');\n\t\n\t var hasWatchAttr = angular.isDefined(tAttrs.mdColorsWatch);\n\t\n\t return (bindOnce || isStatic) ? false :\n\t hasWatchAttr ? $mdUtil.parseAttributeBoolean(tAttrs.mdColorsWatch) : true;\n\t }\n\t }\n\t };\n\t\n\t }\n\t\n\t\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.content\n\t *\n\t * @description\n\t * Scrollable content\n\t */\n\tmdContentDirective.$inject = [\"$mdTheming\"];\n\tangular.module('material.components.content', [\n\t 'material.core'\n\t])\n\t .directive('mdContent', mdContentDirective);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdContent\n\t * @module material.components.content\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t *\n\t * The `` directive is a container element useful for scrollable content. It achieves\n\t * this by setting the CSS `overflow` property to `auto` so that content can properly scroll.\n\t *\n\t * In general, `` components are not designed to be nested inside one another. If\n\t * possible, it is better to make them siblings. This often results in a better user experience as\n\t * having nested scrollbars may confuse the user.\n\t *\n\t * ## Troubleshooting\n\t *\n\t * In some cases, you may wish to apply the `md-no-momentum` class to ensure that Safari's\n\t * momentum scrolling is disabled. Momentum scrolling can cause flickering issues while scrolling\n\t * SVG icons and some other components.\n\t *\n\t * Additionally, we now also offer the `md-no-flicker` class which can be applied to any element\n\t * and uses a Webkit-specific filter of `blur(0px)` that forces GPU rendering of all elements\n\t * inside (which eliminates the flicker on iOS devices).\n\t *\n\t * _Note: Forcing an element to render on the GPU can have unintended side-effects, especially\n\t * related to the z-index of elements. Please use with caution and only on the elements needed._\n\t *\n\t * @usage\n\t *\n\t * Add the `[layout-padding]` attribute to make the content padded.\n\t *\n\t * \n\t * \n\t * Lorem ipsum dolor sit amet, ne quod novum mei.\n\t * \n\t * \n\t */\n\t\n\tfunction mdContentDirective($mdTheming) {\n\t return {\n\t restrict: 'E',\n\t controller: ['$scope', '$element', ContentController],\n\t link: function(scope, element) {\n\t element.addClass('_md'); // private md component indicator for styling\n\t\n\t $mdTheming(element);\n\t scope.$broadcast('$mdContentLoaded', element);\n\t\n\t iosScrollFix(element[0]);\n\t }\n\t };\n\t\n\t function ContentController($scope, $element) {\n\t this.$scope = $scope;\n\t this.$element = $element;\n\t }\n\t}\n\t\n\tfunction iosScrollFix(node) {\n\t // IOS FIX:\n\t // If we scroll where there is no more room for the webview to scroll,\n\t // by default the webview itself will scroll up and down, this looks really\n\t // bad. So if we are scrolling to the very top or bottom, add/subtract one\n\t angular.element(node).on('$md.pressdown', function(ev) {\n\t // Only touch events\n\t if (ev.pointer.type !== 't') return;\n\t // Don't let a child content's touchstart ruin it for us.\n\t if (ev.$materialScrollFixed) return;\n\t ev.$materialScrollFixed = true;\n\t\n\t if (node.scrollTop === 0) {\n\t node.scrollTop = 1;\n\t } else if (node.scrollHeight === node.scrollTop + node.offsetHeight) {\n\t node.scrollTop -= 1;\n\t }\n\t });\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.datepicker\n\t * @description Module for the datepicker component.\n\t */\n\t\n\tangular.module('material.components.datepicker', [\n\t 'material.core',\n\t 'material.components.icon',\n\t 'material.components.virtualRepeat'\n\t]);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.dialog\n\t */\n\tMdDialogDirective.$inject = [\"$$rAF\", \"$mdTheming\", \"$mdDialog\"];\n\tMdDialogProvider.$inject = [\"$$interimElementProvider\"];\n\tangular\n\t .module('material.components.dialog', [\n\t 'material.core',\n\t 'material.components.backdrop'\n\t ])\n\t .directive('mdDialog', MdDialogDirective)\n\t .provider('$mdDialog', MdDialogProvider);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdDialog\n\t * @module material.components.dialog\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * `` - The dialog's template must be inside this element.\n\t *\n\t * Inside, use an `` element for the dialog's content, and use\n\t * an `` element for the dialog's actions.\n\t *\n\t * ## CSS\n\t * - `.md-dialog-content` - class that sets the padding on the content as the spec file\n\t *\n\t * ## Notes\n\t * - If you specify an `id` for the ``, the `` will have the same `id`\n\t * prefixed with `dialogContent_`.\n\t *\n\t * @usage\n\t * ### Dialog template\n\t * \n\t * \n\t * \n\t * \n\t * \n\t *

Number {{item}}

\n\t *
\n\t *
\n\t *
\n\t * \n\t * Close Dialog\n\t * \n\t *
\n\t *
\n\t */\n\tfunction MdDialogDirective($$rAF, $mdTheming, $mdDialog) {\n\t return {\n\t restrict: 'E',\n\t link: function(scope, element) {\n\t element.addClass('_md'); // private md component indicator for styling\n\t\n\t $mdTheming(element);\n\t $$rAF(function() {\n\t var images;\n\t var content = element[0].querySelector('md-dialog-content');\n\t\n\t if (content) {\n\t images = content.getElementsByTagName('img');\n\t addOverflowClass();\n\t //-- delayed image loading may impact scroll height, check after images are loaded\n\t angular.element(images).on('load', addOverflowClass);\n\t }\n\t\n\t scope.$on('$destroy', function() {\n\t $mdDialog.destroy(element);\n\t });\n\t\n\t /**\n\t *\n\t */\n\t function addOverflowClass() {\n\t element.toggleClass('md-content-overflow', content.scrollHeight > content.clientHeight);\n\t }\n\t\n\t\n\t });\n\t }\n\t };\n\t}\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdDialog\n\t * @module material.components.dialog\n\t *\n\t * @description\n\t * `$mdDialog` opens a dialog over the app to inform users about critical information or require\n\t * them to make decisions. There are two approaches for setup: a simple promise API\n\t * and regular object syntax.\n\t *\n\t * ## Restrictions\n\t *\n\t * - The dialog is always given an isolate scope.\n\t * - The dialog's template must have an outer `` element.\n\t * Inside, use an `` element for the dialog's content, and use\n\t * an `` element for the dialog's actions.\n\t * - Dialogs must cover the entire application to keep interactions inside of them.\n\t * Use the `parent` option to change where dialogs are appended.\n\t *\n\t * ## Sizing\n\t * - Complex dialogs can be sized with `flex=\"percentage\"`, i.e. `flex=\"66\"`.\n\t * - Default max-width is 80% of the `rootElement` or `parent`.\n\t *\n\t * ## CSS\n\t * - `.md-dialog-content` - class that sets the padding on the content as the spec file\n\t *\n\t * @usage\n\t * \n\t *
\n\t *
\n\t * \n\t * Employee Alert!\n\t * \n\t *
\n\t *
\n\t * \n\t * Custom Dialog\n\t * \n\t *
\n\t *
\n\t * \n\t * Close Alert\n\t * \n\t *
\n\t *
\n\t * \n\t * Greet Employee\n\t * \n\t *
\n\t *
\n\t *
\n\t *\n\t * ### JavaScript: object syntax\n\t * \n\t * (function(angular, undefined){\n\t * \"use strict\";\n\t *\n\t * angular\n\t * .module('demoApp', ['ngMaterial'])\n\t * .controller('AppCtrl', AppController);\n\t *\n\t * function AppController($scope, $mdDialog) {\n\t * var alert;\n\t * $scope.showAlert = showAlert;\n\t * $scope.showDialog = showDialog;\n\t * $scope.items = [1, 2, 3];\n\t *\n\t * // Internal method\n\t * function showAlert() {\n\t * alert = $mdDialog.alert({\n\t * title: 'Attention',\n\t * textContent: 'This is an example of how easy dialogs can be!',\n\t * ok: 'Close'\n\t * });\n\t *\n\t * $mdDialog\n\t * .show( alert )\n\t * .finally(function() {\n\t * alert = undefined;\n\t * });\n\t * }\n\t *\n\t * function showDialog($event) {\n\t * var parentEl = angular.element(document.body);\n\t * $mdDialog.show({\n\t * parent: parentEl,\n\t * targetEvent: $event,\n\t * template:\n\t * '' +\n\t * ' '+\n\t * ' '+\n\t * ' '+\n\t * '

Number {{item}}

' +\n\t * ' '+\n\t * '
'+\n\t * '
' +\n\t * ' ' +\n\t * ' ' +\n\t * ' Close Dialog' +\n\t * ' ' +\n\t * ' ' +\n\t * '
',\n\t * locals: {\n\t * items: $scope.items\n\t * },\n\t * controller: DialogController\n\t * });\n\t * function DialogController($scope, $mdDialog, items) {\n\t * $scope.items = items;\n\t * $scope.closeDialog = function() {\n\t * $mdDialog.hide();\n\t * }\n\t * }\n\t * }\n\t * }\n\t * })(angular);\n\t *
\n\t *\n\t * ### Multiple Dialogs\n\t * Using the `multiple` option for the `$mdDialog` service allows developers to show multiple dialogs\n\t * at the same time.\n\t *\n\t * \n\t * // From plain options\n\t * $mdDialog.show({\n\t * multiple: true\n\t * });\n\t *\n\t * // From a dialog preset\n\t * $mdDialog.show(\n\t * $mdDialog\n\t * .alert()\n\t * .multiple(true)\n\t * );\n\t *\n\t * \n\t *\n\t * ### Pre-Rendered Dialogs\n\t * By using the `contentElement` option, it is possible to use an already existing element in the DOM.\n\t *\n\t * > Pre-rendered dialogs will be not linked to any scope and will not instantiate any new controller.
\n\t * > You can manually link the elements to a scope or instantiate a controller from the template (`ng-controller`)\n\t *\n\t * \n\t * $scope.showPrerenderedDialog = function() {\n\t * $mdDialog.show({\n\t * contentElement: '#myStaticDialog',\n\t * parent: angular.element(document.body)\n\t * });\n\t * };\n\t * \n\t *\n\t * When using a string as value, `$mdDialog` will automatically query the DOM for the specified CSS selector.\n\t *\n\t * \n\t *
\n\t *
\n\t * \n\t * This is a pre-rendered dialog.\n\t * \n\t *
\n\t *
\n\t *
\n\t *\n\t * **Notice**: It is important, to use the `.md-dialog-container` as the content element, otherwise the dialog\n\t * will not show up.\n\t *\n\t * It also possible to use a DOM element for the `contentElement` option.\n\t * - `contentElement: document.querySelector('#myStaticDialog')`\n\t * - `contentElement: angular.element(TEMPLATE)`\n\t *\n\t * When using a `template` as content element, it will be not compiled upon open.\n\t * This allows you to compile the element yourself and use it each time the dialog opens.\n\t *\n\t * ### Custom Presets\n\t * Developers are also able to create their own preset, which can be easily used without repeating\n\t * their options each time.\n\t *\n\t * \n\t * $mdDialogProvider.addPreset('testPreset', {\n\t * options: function() {\n\t * return {\n\t * template:\n\t * '' +\n\t * 'This is a custom preset' +\n\t * '',\n\t * controllerAs: 'dialog',\n\t * bindToController: true,\n\t * clickOutsideToClose: true,\n\t * escapeToClose: true\n\t * };\n\t * }\n\t * });\n\t * \n\t *\n\t * After you created your preset at config phase, you can easily access it.\n\t *\n\t * \n\t * $mdDialog.show(\n\t * $mdDialog.testPreset()\n\t * );\n\t * \n\t *\n\t * ### JavaScript: promise API syntax, custom dialog template\n\t * \n\t * (function(angular, undefined){\n\t * \"use strict\";\n\t *\n\t * angular\n\t * .module('demoApp', ['ngMaterial'])\n\t * .controller('EmployeeController', EmployeeEditor)\n\t * .controller('GreetingController', GreetingController);\n\t *\n\t * // Fictitious Employee Editor to show how to use simple and complex dialogs.\n\t *\n\t * function EmployeeEditor($scope, $mdDialog) {\n\t * var alert;\n\t *\n\t * $scope.showAlert = showAlert;\n\t * $scope.closeAlert = closeAlert;\n\t * $scope.showGreeting = showCustomGreeting;\n\t *\n\t * $scope.hasAlert = function() { return !!alert };\n\t * $scope.userName = $scope.userName || 'Bobby';\n\t *\n\t * // Dialog #1 - Show simple alert dialog and cache\n\t * // reference to dialog instance\n\t *\n\t * function showAlert() {\n\t * alert = $mdDialog.alert()\n\t * .title('Attention, ' + $scope.userName)\n\t * .textContent('This is an example of how easy dialogs can be!')\n\t * .ok('Close');\n\t *\n\t * $mdDialog\n\t * .show( alert )\n\t * .finally(function() {\n\t * alert = undefined;\n\t * });\n\t * }\n\t *\n\t * // Close the specified dialog instance and resolve with 'finished' flag\n\t * // Normally this is not needed, just use '$mdDialog.hide()' to close\n\t * // the most recent dialog popup.\n\t *\n\t * function closeAlert() {\n\t * $mdDialog.hide( alert, \"finished\" );\n\t * alert = undefined;\n\t * }\n\t *\n\t * // Dialog #2 - Demonstrate more complex dialogs construction and popup.\n\t *\n\t * function showCustomGreeting($event) {\n\t * $mdDialog.show({\n\t * targetEvent: $event,\n\t * template:\n\t * '' +\n\t *\n\t * ' Hello {{ employee }}!' +\n\t *\n\t * ' ' +\n\t * ' ' +\n\t * ' Close Greeting' +\n\t * ' ' +\n\t * ' ' +\n\t * '',\n\t * controller: 'GreetingController',\n\t * onComplete: afterShowAnimation,\n\t * locals: { employee: $scope.userName }\n\t * });\n\t *\n\t * // When the 'enter' animation finishes...\n\t *\n\t * function afterShowAnimation(scope, element, options) {\n\t * // post-show code here: DOM element focus, etc.\n\t * }\n\t * }\n\t *\n\t * // Dialog #3 - Demonstrate use of ControllerAs and passing $scope to dialog\n\t * // Here we used ng-controller=\"GreetingController as vm\" and\n\t * // $scope.vm === \n\t *\n\t * function showCustomGreeting() {\n\t *\n\t * $mdDialog.show({\n\t * clickOutsideToClose: true,\n\t *\n\t * scope: $scope, // use parent scope in template\n\t * preserveScope: true, // do not forget this if use parent scope\n\t\n\t * // Since GreetingController is instantiated with ControllerAs syntax\n\t * // AND we are passing the parent '$scope' to the dialog, we MUST\n\t * // use 'vm.' in the template markup\n\t *\n\t * template: '' +\n\t * ' ' +\n\t * ' Hi There {{vm.employee}}' +\n\t * ' ' +\n\t * '',\n\t *\n\t * controller: function DialogController($scope, $mdDialog) {\n\t * $scope.closeDialog = function() {\n\t * $mdDialog.hide();\n\t * }\n\t * }\n\t * });\n\t * }\n\t *\n\t * }\n\t *\n\t * // Greeting controller used with the more complex 'showCustomGreeting()' custom dialog\n\t *\n\t * function GreetingController($scope, $mdDialog, employee) {\n\t * // Assigned from construction locals options...\n\t * $scope.employee = employee;\n\t *\n\t * $scope.closeDialog = function() {\n\t * // Easily hides most recent dialog shown...\n\t * // no specific instance reference is needed.\n\t * $mdDialog.hide();\n\t * };\n\t * }\n\t *\n\t * })(angular);\n\t * \n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdDialog#alert\n\t *\n\t * @description\n\t * Builds a preconfigured dialog with the specified message.\n\t *\n\t * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n\t *\n\t * - $mdDialogPreset#title(string) - Sets the alert title.\n\t * - $mdDialogPreset#textContent(string) - Sets the alert message.\n\t * - $mdDialogPreset#htmlContent(string) - Sets the alert message as HTML. Requires ngSanitize\n\t * module to be loaded. HTML is not run through Angular's compiler.\n\t * - $mdDialogPreset#ok(string) - Sets the alert \"Okay\" button text.\n\t * - $mdDialogPreset#theme(string) - Sets the theme of the alert dialog.\n\t * - $mdDialogPreset#targetEvent(DOMClickEvent=) - A click's event object. When passed in as an option,\n\t * the location of the click will be used as the starting point for the opening animation\n\t * of the the dialog.\n\t *\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdDialog#confirm\n\t *\n\t * @description\n\t * Builds a preconfigured dialog with the specified message. You can call show and the promise returned\n\t * will be resolved only if the user clicks the confirm action on the dialog.\n\t *\n\t * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n\t *\n\t * Additionally, it supports the following methods:\n\t *\n\t * - $mdDialogPreset#title(string) - Sets the confirm title.\n\t * - $mdDialogPreset#textContent(string) - Sets the confirm message.\n\t * - $mdDialogPreset#htmlContent(string) - Sets the confirm message as HTML. Requires ngSanitize\n\t * module to be loaded. HTML is not run through Angular's compiler.\n\t * - $mdDialogPreset#ok(string) - Sets the confirm \"Okay\" button text.\n\t * - $mdDialogPreset#cancel(string) - Sets the confirm \"Cancel\" button text.\n\t * - $mdDialogPreset#theme(string) - Sets the theme of the confirm dialog.\n\t * - $mdDialogPreset#targetEvent(DOMClickEvent=) - A click's event object. When passed in as an option,\n\t * the location of the click will be used as the starting point for the opening animation\n\t * of the the dialog.\n\t *\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdDialog#prompt\n\t *\n\t * @description\n\t * Builds a preconfigured dialog with the specified message and input box. You can call show and the promise returned\n\t * will be resolved only if the user clicks the prompt action on the dialog, passing the input value as the first argument.\n\t *\n\t * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n\t *\n\t * Additionally, it supports the following methods:\n\t *\n\t * - $mdDialogPreset#title(string) - Sets the prompt title.\n\t * - $mdDialogPreset#textContent(string) - Sets the prompt message.\n\t * - $mdDialogPreset#htmlContent(string) - Sets the prompt message as HTML. Requires ngSanitize\n\t * module to be loaded. HTML is not run through Angular's compiler.\n\t * - $mdDialogPreset#placeholder(string) - Sets the placeholder text for the input.\n\t * - $mdDialogPreset#initialValue(string) - Sets the initial value for the prompt input.\n\t * - $mdDialogPreset#ok(string) - Sets the prompt \"Okay\" button text.\n\t * - $mdDialogPreset#cancel(string) - Sets the prompt \"Cancel\" button text.\n\t * - $mdDialogPreset#theme(string) - Sets the theme of the prompt dialog.\n\t * - $mdDialogPreset#targetEvent(DOMClickEvent=) - A click's event object. When passed in as an option,\n\t * the location of the click will be used as the starting point for the opening animation\n\t * of the the dialog.\n\t *\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdDialog#show\n\t *\n\t * @description\n\t * Show a dialog with the specified options.\n\t *\n\t * @param {object} optionsOrPreset Either provide an `$mdDialogPreset` returned from `alert()`, and\n\t * `confirm()`, or an options object with the following properties:\n\t * - `templateUrl` - `{string=}`: The url of a template that will be used as the content\n\t * of the dialog.\n\t * - `template` - `{string=}`: HTML template to show in the dialog. This **must** be trusted HTML\n\t * with respect to Angular's [$sce service](https://docs.angularjs.org/api/ng/service/$sce).\n\t * This template should **never** be constructed with any kind of user input or user data.\n\t * - `contentElement` - `{string|Element}`: Instead of using a template, which will be compiled each time a\n\t * dialog opens, you can also use a DOM element.
\n\t * * When specifying an element, which is present on the DOM, `$mdDialog` will temporary fetch the element into\n\t * the dialog and restores it at the old DOM position upon close.\n\t * * When specifying a string, the string be used as a CSS selector, to lookup for the element in the DOM.\n\t * - `autoWrap` - `{boolean=}`: Whether or not to automatically wrap the template with a\n\t * `` tag if one is not provided. Defaults to true. Can be disabled if you provide a\n\t * custom dialog directive.\n\t * - `targetEvent` - `{DOMClickEvent=}`: A click's event object. When passed in as an option,\n\t * the location of the click will be used as the starting point for the opening animation\n\t * of the the dialog.\n\t * - `openFrom` - `{string|Element|object}`: The query selector, DOM element or the Rect object\n\t * that is used to determine the bounds (top, left, height, width) from which the Dialog will\n\t * originate.\n\t * - `closeTo` - `{string|Element|object}`: The query selector, DOM element or the Rect object\n\t * that is used to determine the bounds (top, left, height, width) to which the Dialog will\n\t * target.\n\t * - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified,\n\t * it will create a new isolate scope.\n\t * This scope will be destroyed when the dialog is removed unless `preserveScope` is set to true.\n\t * - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n\t * - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the dialog is open.\n\t * Default true.\n\t * - `hasBackdrop` - `{boolean=}`: Whether there should be an opaque backdrop behind the dialog.\n\t * Default true.\n\t * - `clickOutsideToClose` - `{boolean=}`: Whether the user can click outside the dialog to\n\t * close it. Default false.\n\t * - `escapeToClose` - `{boolean=}`: Whether the user can press escape to close the dialog.\n\t * Default true.\n\t * - `focusOnOpen` - `{boolean=}`: An option to override focus behavior on open. Only disable if\n\t * focusing some other way, as focus management is required for dialogs to be accessible.\n\t * Defaults to true.\n\t * - `controller` - `{function|string=}`: The controller to associate with the dialog. The controller\n\t * will be injected with the local `$mdDialog`, which passes along a scope for the dialog.\n\t * - `locals` - `{object=}`: An object containing key/value pairs. The keys will be used as names\n\t * of values to inject into the controller. For example, `locals: {three: 3}` would inject\n\t * `three` into the controller, with the value 3. If `bindToController` is true, they will be\n\t * copied to the controller instead.\n\t * - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in.\n\t * - `resolve` - `{object=}`: Similar to locals, except it takes promises as values, and the\n\t * dialog will not open until all of the promises resolve.\n\t * - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n\t * - `parent` - `{element=}`: The element to append the dialog to. Defaults to appending\n\t * to the root element of the application.\n\t * - `onShowing` - `function(scope, element)`: Callback function used to announce the show() action is\n\t * starting.\n\t * - `onComplete` - `function(scope, element)`: Callback function used to announce when the show() action is\n\t * finished.\n\t * - `onRemoving` - `function(element, removePromise)`: Callback function used to announce the\n\t * close/hide() action is starting. This allows developers to run custom animations\n\t * in parallel the close animations.\n\t * - `fullscreen` `{boolean=}`: An option to toggle whether the dialog should show in fullscreen\n\t * or not. Defaults to `false`.\n\t * - `multiple` `{boolean=}`: An option to allow this dialog to display over one that's currently open.\n\t * @returns {promise} A promise that can be resolved with `$mdDialog.hide()` or\n\t * rejected with `$mdDialog.cancel()`.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdDialog#hide\n\t *\n\t * @description\n\t * Hide an existing dialog and resolve the promise returned from `$mdDialog.show()`.\n\t *\n\t * @param {*=} response An argument for the resolved promise.\n\t *\n\t * @returns {promise} A promise that is resolved when the dialog has been closed.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdDialog#cancel\n\t *\n\t * @description\n\t * Hide an existing dialog and reject the promise returned from `$mdDialog.show()`.\n\t *\n\t * @param {*=} response An argument for the rejected promise.\n\t *\n\t * @returns {promise} A promise that is resolved when the dialog has been closed.\n\t */\n\t\n\tfunction MdDialogProvider($$interimElementProvider) {\n\t // Elements to capture and redirect focus when the user presses tab at the dialog boundary.\n\t advancedDialogOptions.$inject = [\"$mdDialog\", \"$mdConstant\"];\n\t dialogDefaultOptions.$inject = [\"$mdDialog\", \"$mdAria\", \"$mdUtil\", \"$mdConstant\", \"$animate\", \"$document\", \"$window\", \"$rootElement\", \"$log\", \"$injector\", \"$mdTheming\", \"$interpolate\", \"$mdInteraction\"];\n\t var topFocusTrap, bottomFocusTrap;\n\t\n\t return $$interimElementProvider('$mdDialog')\n\t .setDefaults({\n\t methods: ['disableParentScroll', 'hasBackdrop', 'clickOutsideToClose', 'escapeToClose',\n\t 'targetEvent', 'closeTo', 'openFrom', 'parent', 'fullscreen', 'multiple'],\n\t options: dialogDefaultOptions\n\t })\n\t .addPreset('alert', {\n\t methods: ['title', 'htmlContent', 'textContent', 'content', 'ariaLabel', 'ok', 'theme',\n\t 'css'],\n\t options: advancedDialogOptions\n\t })\n\t .addPreset('confirm', {\n\t methods: ['title', 'htmlContent', 'textContent', 'content', 'ariaLabel', 'ok', 'cancel',\n\t 'theme', 'css'],\n\t options: advancedDialogOptions\n\t })\n\t .addPreset('prompt', {\n\t methods: ['title', 'htmlContent', 'textContent', 'initialValue', 'content', 'placeholder', 'ariaLabel',\n\t 'ok', 'cancel', 'theme', 'css'],\n\t options: advancedDialogOptions\n\t });\n\t\n\t /* @ngInject */\n\t function advancedDialogOptions($mdDialog, $mdConstant) {\n\t return {\n\t template: [\n\t '',\n\t ' ',\n\t '

{{ dialog.title }}

',\n\t '
',\n\t '
',\n\t '

{{::dialog.mdTextContent}}

',\n\t '
',\n\t ' ',\n\t ' ',\n\t ' ',\n\t '
',\n\t ' ',\n\t ' ',\n\t ' {{ dialog.cancel }}',\n\t ' ',\n\t ' ',\n\t ' {{ dialog.ok }}',\n\t ' ',\n\t ' ',\n\t '
'\n\t ].join('').replace(/\\s\\s+/g, ''),\n\t controller: function mdDialogCtrl() {\n\t var isPrompt = this.$type == 'prompt';\n\t\n\t if (isPrompt && this.initialValue) {\n\t this.result = this.initialValue;\n\t }\n\t\n\t this.hide = function() {\n\t $mdDialog.hide(isPrompt ? this.result : true);\n\t };\n\t this.abort = function() {\n\t $mdDialog.cancel();\n\t };\n\t this.keypress = function($event) {\n\t if ($event.keyCode === $mdConstant.KEY_CODE.ENTER) {\n\t $mdDialog.hide(this.result);\n\t }\n\t };\n\t },\n\t controllerAs: 'dialog',\n\t bindToController: true,\n\t };\n\t }\n\t\n\t /* @ngInject */\n\t function dialogDefaultOptions($mdDialog, $mdAria, $mdUtil, $mdConstant, $animate, $document, $window, $rootElement,\n\t $log, $injector, $mdTheming, $interpolate, $mdInteraction) {\n\t\n\t return {\n\t hasBackdrop: true,\n\t isolateScope: true,\n\t onCompiling: beforeCompile,\n\t onShow: onShow,\n\t onShowing: beforeShow,\n\t onRemove: onRemove,\n\t clickOutsideToClose: false,\n\t escapeToClose: true,\n\t targetEvent: null,\n\t closeTo: null,\n\t openFrom: null,\n\t focusOnOpen: true,\n\t disableParentScroll: true,\n\t autoWrap: true,\n\t fullscreen: false,\n\t transformTemplate: function(template, options) {\n\t // Make the dialog container focusable, because otherwise the focus will be always redirected to\n\t // an element outside of the container, and the focus trap won't work probably..\n\t // Also the tabindex is needed for the `escapeToClose` functionality, because\n\t // the keyDown event can't be triggered when the focus is outside of the container.\n\t var startSymbol = $interpolate.startSymbol();\n\t var endSymbol = $interpolate.endSymbol();\n\t var theme = startSymbol + (options.themeWatch ? '' : '::') + 'theme' + endSymbol;\n\t return '
' + validatedTemplate(template) + '
';\n\t\n\t /**\n\t * The specified template should contain a wrapper element....\n\t */\n\t function validatedTemplate(template) {\n\t if (options.autoWrap && !/<\\/md-dialog>/g.test(template)) {\n\t return '' + (template || '') + '';\n\t } else {\n\t return template || '';\n\t }\n\t }\n\t }\n\t };\n\t\n\t function beforeCompile(options) {\n\t // Automatically apply the theme, if the user didn't specify a theme explicitly.\n\t // Those option changes need to be done, before the compilation has started, because otherwise\n\t // the option changes will be not available in the $mdCompilers locales.\n\t options.defaultTheme = $mdTheming.defaultTheme();\n\t\n\t detectTheming(options);\n\t }\n\t\n\t function beforeShow(scope, element, options, controller) {\n\t\n\t if (controller) {\n\t var mdHtmlContent = controller.htmlContent || options.htmlContent || '';\n\t var mdTextContent = controller.textContent || options.textContent ||\n\t controller.content || options.content || '';\n\t\n\t if (mdHtmlContent && !$injector.has('$sanitize')) {\n\t throw Error('The ngSanitize module must be loaded in order to use htmlContent.');\n\t }\n\t\n\t if (mdHtmlContent && mdTextContent) {\n\t throw Error('md-dialog cannot have both `htmlContent` and `textContent`');\n\t }\n\t\n\t // Only assign the content if nothing throws, otherwise it'll still be compiled.\n\t controller.mdHtmlContent = mdHtmlContent;\n\t controller.mdTextContent = mdTextContent;\n\t }\n\t }\n\t\n\t /** Show method for dialogs */\n\t function onShow(scope, element, options, controller) {\n\t angular.element($document[0].body).addClass('md-dialog-is-showing');\n\t\n\t var dialogElement = element.find('md-dialog');\n\t\n\t // Once a dialog has `ng-cloak` applied on his template the dialog animation will not work properly.\n\t // This is a very common problem, so we have to notify the developer about this.\n\t if (dialogElement.hasClass('ng-cloak')) {\n\t var message = '$mdDialog: using `` will affect the dialog opening animations.';\n\t $log.warn( message, element[0] );\n\t }\n\t\n\t captureParentAndFromToElements(options);\n\t configureAria(dialogElement, options);\n\t showBackdrop(scope, element, options);\n\t activateListeners(element, options);\n\t\n\t return dialogPopIn(element, options)\n\t .then(function() {\n\t lockScreenReader(element, options);\n\t warnDeprecatedActions();\n\t focusOnOpen();\n\t });\n\t\n\t /**\n\t * Check to see if they used the deprecated .md-actions class and log a warning\n\t */\n\t function warnDeprecatedActions() {\n\t if (element[0].querySelector('.md-actions')) {\n\t $log.warn('Using a class of md-actions is deprecated, please use .');\n\t }\n\t }\n\t\n\t /**\n\t * For alerts, focus on content... otherwise focus on\n\t * the close button (or equivalent)\n\t */\n\t function focusOnOpen() {\n\t if (options.focusOnOpen) {\n\t var target = $mdUtil.findFocusTarget(element) || findCloseButton() || dialogElement;\n\t target.focus();\n\t }\n\t\n\t /**\n\t * If no element with class dialog-close, try to find the last\n\t * button child in md-actions and assume it is a close button.\n\t *\n\t * If we find no actions at all, log a warning to the console.\n\t */\n\t function findCloseButton() {\n\t return element[0].querySelector('.dialog-close, md-dialog-actions button:last-child');\n\t }\n\t }\n\t }\n\t\n\t /**\n\t * Remove function for all dialogs\n\t */\n\t function onRemove(scope, element, options) {\n\t options.deactivateListeners();\n\t options.unlockScreenReader();\n\t options.hideBackdrop(options.$destroy);\n\t\n\t // Remove the focus traps that we added earlier for keeping focus within the dialog.\n\t if (topFocusTrap && topFocusTrap.parentNode) {\n\t topFocusTrap.parentNode.removeChild(topFocusTrap);\n\t }\n\t\n\t if (bottomFocusTrap && bottomFocusTrap.parentNode) {\n\t bottomFocusTrap.parentNode.removeChild(bottomFocusTrap);\n\t }\n\t\n\t // For navigation $destroy events, do a quick, non-animated removal,\n\t // but for normal closes (from clicks, etc) animate the removal\n\t return !!options.$destroy ? detachAndClean() : animateRemoval().then( detachAndClean );\n\t\n\t /**\n\t * For normal closes, animate the removal.\n\t * For forced closes (like $destroy events), skip the animations\n\t */\n\t function animateRemoval() {\n\t return dialogPopOut(element, options);\n\t }\n\t\n\t /**\n\t * Detach the element\n\t */\n\t function detachAndClean() {\n\t angular.element($document[0].body).removeClass('md-dialog-is-showing');\n\t\n\t // Reverse the container stretch if using a content element.\n\t if (options.contentElement) {\n\t options.reverseContainerStretch();\n\t }\n\t\n\t // Exposed cleanup function from the $mdCompiler.\n\t options.cleanupElement();\n\t\n\t // Restores the focus to the origin element if the last interaction upon opening was a keyboard.\n\t if (!options.$destroy && options.originInteraction === 'keyboard') {\n\t options.origin.focus();\n\t }\n\t }\n\t }\n\t\n\t function detectTheming(options) {\n\t // Once the user specifies a targetEvent, we will automatically try to find the correct\n\t // nested theme.\n\t var targetEl;\n\t if (options.targetEvent && options.targetEvent.target) {\n\t targetEl = angular.element(options.targetEvent.target);\n\t }\n\t\n\t var themeCtrl = targetEl && targetEl.controller('mdTheme');\n\t\n\t if (!themeCtrl) {\n\t return;\n\t }\n\t\n\t options.themeWatch = themeCtrl.$shouldWatch;\n\t\n\t var theme = options.theme || themeCtrl.$mdTheme;\n\t\n\t if (theme) {\n\t options.scope.theme = theme;\n\t }\n\t\n\t var unwatch = themeCtrl.registerChanges(function (newTheme) {\n\t options.scope.theme = newTheme;\n\t\n\t if (!options.themeWatch) {\n\t unwatch();\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Capture originator/trigger/from/to element information (if available)\n\t * and the parent container for the dialog; defaults to the $rootElement\n\t * unless overridden in the options.parent\n\t */\n\t function captureParentAndFromToElements(options) {\n\t options.origin = angular.extend({\n\t element: null,\n\t bounds: null,\n\t focus: angular.noop\n\t }, options.origin || {});\n\t\n\t options.parent = getDomElement(options.parent, $rootElement);\n\t options.closeTo = getBoundingClientRect(getDomElement(options.closeTo));\n\t options.openFrom = getBoundingClientRect(getDomElement(options.openFrom));\n\t\n\t if ( options.targetEvent ) {\n\t options.origin = getBoundingClientRect(options.targetEvent.target, options.origin);\n\t options.originInteraction = $mdInteraction.getLastInteractionType();\n\t }\n\t\n\t\n\t /**\n\t * Identify the bounding RECT for the target element\n\t *\n\t */\n\t function getBoundingClientRect (element, orig) {\n\t var source = angular.element((element || {}));\n\t if (source && source.length) {\n\t // Compute and save the target element's bounding rect, so that if the\n\t // element is hidden when the dialog closes, we can shrink the dialog\n\t // back to the same position it expanded from.\n\t //\n\t // Checking if the source is a rect object or a DOM element\n\t var bounds = {top:0,left:0,height:0,width:0};\n\t var hasFn = angular.isFunction(source[0].getBoundingClientRect);\n\t\n\t return angular.extend(orig || {}, {\n\t element : hasFn ? source : undefined,\n\t bounds : hasFn ? source[0].getBoundingClientRect() : angular.extend({}, bounds, source[0]),\n\t focus : angular.bind(source, source.focus),\n\t });\n\t }\n\t }\n\t\n\t /**\n\t * If the specifier is a simple string selector, then query for\n\t * the DOM element.\n\t */\n\t function getDomElement(element, defaultElement) {\n\t if (angular.isString(element)) {\n\t element = $document[0].querySelector(element);\n\t }\n\t\n\t // If we have a reference to a raw dom element, always wrap it in jqLite\n\t return angular.element(element || defaultElement);\n\t }\n\t\n\t }\n\t\n\t /**\n\t * Listen for escape keys and outside clicks to auto close\n\t */\n\t function activateListeners(element, options) {\n\t var window = angular.element($window);\n\t var onWindowResize = $mdUtil.debounce(function() {\n\t stretchDialogContainerToViewport(element, options);\n\t }, 60);\n\t\n\t var removeListeners = [];\n\t var smartClose = function() {\n\t // Only 'confirm' dialogs have a cancel button... escape/clickOutside will\n\t // cancel or fallback to hide.\n\t var closeFn = ( options.$type == 'alert' ) ? $mdDialog.hide : $mdDialog.cancel;\n\t $mdUtil.nextTick(closeFn, true);\n\t };\n\t\n\t if (options.escapeToClose) {\n\t var parentTarget = options.parent;\n\t var keyHandlerFn = function(ev) {\n\t if (ev.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n\t ev.stopPropagation();\n\t ev.preventDefault();\n\t\n\t smartClose();\n\t }\n\t };\n\t\n\t // Add keydown listeners\n\t element.on('keydown', keyHandlerFn);\n\t parentTarget.on('keydown', keyHandlerFn);\n\t\n\t // Queue remove listeners function\n\t removeListeners.push(function() {\n\t\n\t element.off('keydown', keyHandlerFn);\n\t parentTarget.off('keydown', keyHandlerFn);\n\t\n\t });\n\t }\n\t\n\t // Register listener to update dialog on window resize\n\t window.on('resize', onWindowResize);\n\t\n\t removeListeners.push(function() {\n\t window.off('resize', onWindowResize);\n\t });\n\t\n\t if (options.clickOutsideToClose) {\n\t var target = element;\n\t var sourceElem;\n\t\n\t // Keep track of the element on which the mouse originally went down\n\t // so that we can only close the backdrop when the 'click' started on it.\n\t // A simple 'click' handler does not work,\n\t // it sets the target object as the element the mouse went down on.\n\t var mousedownHandler = function(ev) {\n\t sourceElem = ev.target;\n\t };\n\t\n\t // We check if our original element and the target is the backdrop\n\t // because if the original was the backdrop and the target was inside the dialog\n\t // we don't want to dialog to close.\n\t var mouseupHandler = function(ev) {\n\t if (sourceElem === target[0] && ev.target === target[0]) {\n\t ev.stopPropagation();\n\t ev.preventDefault();\n\t\n\t smartClose();\n\t }\n\t };\n\t\n\t // Add listeners\n\t target.on('mousedown', mousedownHandler);\n\t target.on('mouseup', mouseupHandler);\n\t\n\t // Queue remove listeners function\n\t removeListeners.push(function() {\n\t target.off('mousedown', mousedownHandler);\n\t target.off('mouseup', mouseupHandler);\n\t });\n\t }\n\t\n\t // Attach specific `remove` listener handler\n\t options.deactivateListeners = function() {\n\t removeListeners.forEach(function(removeFn) {\n\t removeFn();\n\t });\n\t options.deactivateListeners = null;\n\t };\n\t }\n\t\n\t /**\n\t * Show modal backdrop element...\n\t */\n\t function showBackdrop(scope, element, options) {\n\t\n\t if (options.disableParentScroll) {\n\t // !! DO this before creating the backdrop; since disableScrollAround()\n\t // configures the scroll offset; which is used by mdBackDrop postLink()\n\t options.restoreScroll = $mdUtil.disableScrollAround(element, options.parent);\n\t }\n\t\n\t if (options.hasBackdrop) {\n\t options.backdrop = $mdUtil.createBackdrop(scope, \"md-dialog-backdrop md-opaque\");\n\t $animate.enter(options.backdrop, options.parent);\n\t }\n\t\n\t /**\n\t * Hide modal backdrop element...\n\t */\n\t options.hideBackdrop = function hideBackdrop($destroy) {\n\t if (options.backdrop) {\n\t if ( !!$destroy ) options.backdrop.remove();\n\t else $animate.leave(options.backdrop);\n\t }\n\t\n\t\n\t if (options.disableParentScroll) {\n\t options.restoreScroll && options.restoreScroll();\n\t delete options.restoreScroll;\n\t }\n\t\n\t options.hideBackdrop = null;\n\t };\n\t }\n\t\n\t /**\n\t * Inject ARIA-specific attributes appropriate for Dialogs\n\t */\n\t function configureAria(element, options) {\n\t\n\t var role = (options.$type === 'alert') ? 'alertdialog' : 'dialog';\n\t var dialogContent = element.find('md-dialog-content');\n\t var existingDialogId = element.attr('id');\n\t var dialogContentId = 'dialogContent_' + (existingDialogId || $mdUtil.nextUid());\n\t\n\t element.attr({\n\t 'role': role,\n\t 'tabIndex': '-1'\n\t });\n\t\n\t if (dialogContent.length === 0) {\n\t dialogContent = element;\n\t // If the dialog element already had an ID, don't clobber it.\n\t if (existingDialogId) {\n\t dialogContentId = existingDialogId;\n\t }\n\t }\n\t\n\t dialogContent.attr('id', dialogContentId);\n\t element.attr('aria-describedby', dialogContentId);\n\t\n\t if (options.ariaLabel) {\n\t $mdAria.expect(element, 'aria-label', options.ariaLabel);\n\t }\n\t else {\n\t $mdAria.expectAsync(element, 'aria-label', function() {\n\t var words = dialogContent.text().split(/\\s+/);\n\t if (words.length > 3) words = words.slice(0, 3).concat('...');\n\t return words.join(' ');\n\t });\n\t }\n\t\n\t // Set up elements before and after the dialog content to capture focus and\n\t // redirect back into the dialog.\n\t topFocusTrap = document.createElement('div');\n\t topFocusTrap.classList.add('md-dialog-focus-trap');\n\t topFocusTrap.tabIndex = 0;\n\t\n\t bottomFocusTrap = topFocusTrap.cloneNode(false);\n\t\n\t // When focus is about to move out of the dialog, we want to intercept it and redirect it\n\t // back to the dialog element.\n\t var focusHandler = function() {\n\t element.focus();\n\t };\n\t topFocusTrap.addEventListener('focus', focusHandler);\n\t bottomFocusTrap.addEventListener('focus', focusHandler);\n\t\n\t // The top focus trap inserted immeidately before the md-dialog element (as a sibling).\n\t // The bottom focus trap is inserted at the very end of the md-dialog element (as a child).\n\t element[0].parentNode.insertBefore(topFocusTrap, element[0]);\n\t element.after(bottomFocusTrap);\n\t }\n\t\n\t /**\n\t * Prevents screen reader interaction behind modal window\n\t * on swipe interfaces\n\t */\n\t function lockScreenReader(element, options) {\n\t var isHidden = true;\n\t\n\t // get raw DOM node\n\t walkDOM(element[0]);\n\t\n\t options.unlockScreenReader = function() {\n\t isHidden = false;\n\t walkDOM(element[0]);\n\t\n\t options.unlockScreenReader = null;\n\t };\n\t\n\t /**\n\t * Walk DOM to apply or remove aria-hidden on sibling nodes\n\t * and parent sibling nodes\n\t *\n\t */\n\t function walkDOM(element) {\n\t while (element.parentNode) {\n\t if (element === document.body) {\n\t return;\n\t }\n\t var children = element.parentNode.children;\n\t for (var i = 0; i < children.length; i++) {\n\t // skip over child if it is an ascendant of the dialog\n\t // or a script or style tag\n\t if (element !== children[i] && !isNodeOneOf(children[i], ['SCRIPT', 'STYLE'])) {\n\t children[i].setAttribute('aria-hidden', isHidden);\n\t }\n\t }\n\t\n\t walkDOM(element = element.parentNode);\n\t }\n\t }\n\t }\n\t\n\t /**\n\t * Ensure the dialog container fill-stretches to the viewport\n\t */\n\t function stretchDialogContainerToViewport(container, options) {\n\t var isFixed = $window.getComputedStyle($document[0].body).position == 'fixed';\n\t var backdrop = options.backdrop ? $window.getComputedStyle(options.backdrop[0]) : null;\n\t var height = backdrop ? Math.min($document[0].body.clientHeight, Math.ceil(Math.abs(parseInt(backdrop.height, 10)))) : 0;\n\t\n\t var previousStyles = {\n\t top: container.css('top'),\n\t height: container.css('height')\n\t };\n\t\n\t // If the body is fixed, determine the distance to the viewport in relative from the parent.\n\t var parentTop = Math.abs(options.parent[0].getBoundingClientRect().top);\n\t\n\t container.css({\n\t top: (isFixed ? parentTop : 0) + 'px',\n\t height: height ? height + 'px' : '100%'\n\t });\n\t\n\t return function() {\n\t // Reverts the modified styles back to the previous values.\n\t // This is needed for contentElements, which should have the same styles after close\n\t // as before.\n\t container.css(previousStyles);\n\t };\n\t }\n\t\n\t /**\n\t * Dialog open and pop-in animation\n\t */\n\t function dialogPopIn(container, options) {\n\t // Add the `md-dialog-container` to the DOM\n\t options.parent.append(container);\n\t options.reverseContainerStretch = stretchDialogContainerToViewport(container, options);\n\t\n\t var dialogEl = container.find('md-dialog');\n\t var animator = $mdUtil.dom.animator;\n\t var buildTranslateToOrigin = animator.calculateZoomToOrigin;\n\t var translateOptions = {transitionInClass: 'md-transition-in', transitionOutClass: 'md-transition-out'};\n\t var from = animator.toTransformCss(buildTranslateToOrigin(dialogEl, options.openFrom || options.origin));\n\t var to = animator.toTransformCss(\"\"); // defaults to center display (or parent or $rootElement)\n\t\n\t dialogEl.toggleClass('md-dialog-fullscreen', !!options.fullscreen);\n\t\n\t return animator\n\t .translate3d(dialogEl, from, to, translateOptions)\n\t .then(function(animateReversal) {\n\t\n\t // Build a reversal translate function synced to this translation...\n\t options.reverseAnimate = function() {\n\t delete options.reverseAnimate;\n\t\n\t if (options.closeTo) {\n\t // Using the opposite classes to create a close animation to the closeTo element\n\t translateOptions = {transitionInClass: 'md-transition-out', transitionOutClass: 'md-transition-in'};\n\t from = to;\n\t to = animator.toTransformCss(buildTranslateToOrigin(dialogEl, options.closeTo));\n\t\n\t return animator\n\t .translate3d(dialogEl, from, to,translateOptions);\n\t }\n\t\n\t return animateReversal(\n\t to = animator.toTransformCss(\n\t // in case the origin element has moved or is hidden,\n\t // let's recalculate the translateCSS\n\t buildTranslateToOrigin(dialogEl, options.origin)\n\t )\n\t );\n\t\n\t };\n\t\n\t // Function to revert the generated animation styles on the dialog element.\n\t // Useful when using a contentElement instead of a template.\n\t options.clearAnimate = function() {\n\t delete options.clearAnimate;\n\t\n\t // Remove the transition classes, added from $animateCSS, since those can't be removed\n\t // by reversely running the animator.\n\t dialogEl.removeClass([\n\t translateOptions.transitionOutClass,\n\t translateOptions.transitionInClass\n\t ].join(' '));\n\t\n\t // Run the animation reversely to remove the previous added animation styles.\n\t return animator.translate3d(dialogEl, to, animator.toTransformCss(''), {});\n\t };\n\t\n\t return true;\n\t });\n\t }\n\t\n\t /**\n\t * Dialog close and pop-out animation\n\t */\n\t function dialogPopOut(container, options) {\n\t return options.reverseAnimate().then(function() {\n\t if (options.contentElement) {\n\t // When we use a contentElement, we want the element to be the same as before.\n\t // That means, that we have to clear all the animation properties, like transform.\n\t options.clearAnimate();\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Utility function to filter out raw DOM nodes\n\t */\n\t function isNodeOneOf(elem, nodeTypeArray) {\n\t if (nodeTypeArray.indexOf(elem.nodeName) !== -1) {\n\t return true;\n\t }\n\t }\n\t\n\t }\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.divider\n\t * @description Divider module!\n\t */\n\tMdDividerDirective.$inject = [\"$mdTheming\"];\n\tangular.module('material.components.divider', [\n\t 'material.core'\n\t])\n\t .directive('mdDivider', MdDividerDirective);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdDivider\n\t * @module material.components.divider\n\t * @restrict E\n\t *\n\t * @description\n\t * Dividers group and separate content within lists and page layouts using strong visual and spatial distinctions. This divider is a thin rule, lightweight enough to not distract the user from content.\n\t *\n\t * @param {boolean=} md-inset Add this attribute to activate the inset divider style.\n\t * @usage\n\t * \n\t * \n\t *\n\t * \n\t * \n\t *\n\t */\n\tfunction MdDividerDirective($mdTheming) {\n\t return {\n\t restrict: 'E',\n\t link: $mdTheming\n\t };\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t /**\n\t * @ngdoc module\n\t * @name material.components.fabActions\n\t */\n\t MdFabActionsDirective.$inject = [\"$mdUtil\"];\n\t angular\n\t .module('material.components.fabActions', ['material.core'])\n\t .directive('mdFabActions', MdFabActionsDirective);\n\t\n\t /**\n\t * @ngdoc directive\n\t * @name mdFabActions\n\t * @module material.components.fabActions\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * The `` directive is used inside of a `` or\n\t * `` directive to mark an element (or elements) as the actions and setup the\n\t * proper event listeners.\n\t *\n\t * @usage\n\t * See the `` or `` directives for example usage.\n\t */\n\t function MdFabActionsDirective($mdUtil) {\n\t return {\n\t restrict: 'E',\n\t\n\t require: ['^?mdFabSpeedDial', '^?mdFabToolbar'],\n\t\n\t compile: function(element, attributes) {\n\t var children = element.children();\n\t\n\t var hasNgRepeat = $mdUtil.prefixer().hasAttribute(children, 'ng-repeat');\n\t\n\t // Support both ng-repeat and static content\n\t if (hasNgRepeat) {\n\t children.addClass('md-fab-action-item');\n\t } else {\n\t // Wrap every child in a new div and add a class that we can scale/fling independently\n\t children.wrap('
');\n\t }\n\t }\n\t };\n\t }\n\t\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t MdFabController.$inject = [\"$scope\", \"$element\", \"$animate\", \"$mdUtil\", \"$mdConstant\", \"$timeout\"];\n\t angular.module('material.components.fabShared', ['material.core'])\n\t .controller('MdFabController', MdFabController);\n\t\n\t function MdFabController($scope, $element, $animate, $mdUtil, $mdConstant, $timeout) {\n\t var vm = this;\n\t var initialAnimationAttempts = 0;\n\t\n\t // NOTE: We use async eval(s) below to avoid conflicts with any existing digest loops\n\t\n\t vm.open = function() {\n\t $scope.$evalAsync(\"vm.isOpen = true\");\n\t };\n\t\n\t vm.close = function() {\n\t // Async eval to avoid conflicts with existing digest loops\n\t $scope.$evalAsync(\"vm.isOpen = false\");\n\t\n\t // Focus the trigger when the element closes so users can still tab to the next item\n\t $element.find('md-fab-trigger')[0].focus();\n\t };\n\t\n\t // Toggle the open/close state when the trigger is clicked\n\t vm.toggle = function() {\n\t $scope.$evalAsync(\"vm.isOpen = !vm.isOpen\");\n\t };\n\t\n\t /*\n\t * AngularJS Lifecycle hook for newer AngularJS versions.\n\t * Bindings are not guaranteed to have been assigned in the controller, but they are in the $onInit hook.\n\t */\n\t vm.$onInit = function() {\n\t setupDefaults();\n\t setupListeners();\n\t setupWatchers();\n\t\n\t fireInitialAnimations();\n\t };\n\t\n\t // For AngularJS 1.4 and older, where there are no lifecycle hooks but bindings are pre-assigned,\n\t // manually call the $onInit hook.\n\t if (angular.version.major === 1 && angular.version.minor <= 4) {\n\t this.$onInit();\n\t }\n\t\n\t function setupDefaults() {\n\t // Set the default direction to 'down' if none is specified\n\t vm.direction = vm.direction || 'down';\n\t\n\t // Set the default to be closed\n\t vm.isOpen = vm.isOpen || false;\n\t\n\t // Start the keyboard interaction at the first action\n\t resetActionIndex();\n\t\n\t // Add an animations waiting class so we know not to run\n\t $element.addClass('md-animations-waiting');\n\t }\n\t\n\t function setupListeners() {\n\t var eventTypes = [\n\t 'click', 'focusin', 'focusout'\n\t ];\n\t\n\t // Add our listeners\n\t angular.forEach(eventTypes, function(eventType) {\n\t $element.on(eventType, parseEvents);\n\t });\n\t\n\t // Remove our listeners when destroyed\n\t $scope.$on('$destroy', function() {\n\t angular.forEach(eventTypes, function(eventType) {\n\t $element.off(eventType, parseEvents);\n\t });\n\t\n\t // remove any attached keyboard handlers in case element is removed while\n\t // speed dial is open\n\t disableKeyboard();\n\t });\n\t }\n\t\n\t var closeTimeout;\n\t function parseEvents(event) {\n\t // If the event is a click, just handle it\n\t if (event.type == 'click') {\n\t handleItemClick(event);\n\t }\n\t\n\t // If we focusout, set a timeout to close the element\n\t if (event.type == 'focusout' && !closeTimeout) {\n\t closeTimeout = $timeout(function() {\n\t vm.close();\n\t }, 100, false);\n\t }\n\t\n\t // If we see a focusin and there is a timeout about to run, cancel it so we stay open\n\t if (event.type == 'focusin' && closeTimeout) {\n\t $timeout.cancel(closeTimeout);\n\t closeTimeout = null;\n\t }\n\t }\n\t\n\t function resetActionIndex() {\n\t vm.currentActionIndex = -1;\n\t }\n\t\n\t function setupWatchers() {\n\t // Watch for changes to the direction and update classes/attributes\n\t $scope.$watch('vm.direction', function(newDir, oldDir) {\n\t // Add the appropriate classes so we can target the direction in the CSS\n\t $animate.removeClass($element, 'md-' + oldDir);\n\t $animate.addClass($element, 'md-' + newDir);\n\t\n\t // Reset the action index since it may have changed\n\t resetActionIndex();\n\t });\n\t\n\t var trigger, actions;\n\t\n\t // Watch for changes to md-open\n\t $scope.$watch('vm.isOpen', function(isOpen) {\n\t // Reset the action index since it may have changed\n\t resetActionIndex();\n\t\n\t // We can't get the trigger/actions outside of the watch because the component hasn't been\n\t // linked yet, so we wait until the first watch fires to cache them.\n\t if (!trigger || !actions) {\n\t trigger = getTriggerElement();\n\t actions = getActionsElement();\n\t }\n\t\n\t if (isOpen) {\n\t enableKeyboard();\n\t } else {\n\t disableKeyboard();\n\t }\n\t\n\t var toAdd = isOpen ? 'md-is-open' : '';\n\t var toRemove = isOpen ? '' : 'md-is-open';\n\t\n\t // Set the proper ARIA attributes\n\t trigger.attr('aria-haspopup', true);\n\t trigger.attr('aria-expanded', isOpen);\n\t actions.attr('aria-hidden', !isOpen);\n\t\n\t // Animate the CSS classes\n\t $animate.setClass($element, toAdd, toRemove);\n\t });\n\t }\n\t\n\t function fireInitialAnimations() {\n\t // If the element is actually visible on the screen\n\t if ($element[0].scrollHeight > 0) {\n\t // Fire our animation\n\t $animate.addClass($element, '_md-animations-ready').then(function() {\n\t // Remove the waiting class\n\t $element.removeClass('md-animations-waiting');\n\t });\n\t }\n\t\n\t // Otherwise, try for up to 1 second before giving up\n\t else if (initialAnimationAttempts < 10) {\n\t $timeout(fireInitialAnimations, 100);\n\t\n\t // Increment our counter\n\t initialAnimationAttempts = initialAnimationAttempts + 1;\n\t }\n\t }\n\t\n\t function enableKeyboard() {\n\t $element.on('keydown', keyPressed);\n\t\n\t // On the next tick, setup a check for outside clicks; we do this on the next tick to avoid\n\t // clicks/touches that result in the isOpen attribute changing (e.g. a bound radio button)\n\t $mdUtil.nextTick(function() {\n\t angular.element(document).on('click touchend', checkForOutsideClick);\n\t });\n\t\n\t // TODO: On desktop, we should be able to reset the indexes so you cannot tab through, but\n\t // this breaks accessibility, especially on mobile, since you have no arrow keys to press\n\t //resetActionTabIndexes();\n\t }\n\t\n\t function disableKeyboard() {\n\t $element.off('keydown', keyPressed);\n\t angular.element(document).off('click touchend', checkForOutsideClick);\n\t }\n\t\n\t function checkForOutsideClick(event) {\n\t if (event.target) {\n\t var closestTrigger = $mdUtil.getClosest(event.target, 'md-fab-trigger');\n\t var closestActions = $mdUtil.getClosest(event.target, 'md-fab-actions');\n\t\n\t if (!closestTrigger && !closestActions) {\n\t vm.close();\n\t }\n\t }\n\t }\n\t\n\t function keyPressed(event) {\n\t switch (event.which) {\n\t case $mdConstant.KEY_CODE.ESCAPE: vm.close(); event.preventDefault(); return false;\n\t case $mdConstant.KEY_CODE.LEFT_ARROW: doKeyLeft(event); return false;\n\t case $mdConstant.KEY_CODE.UP_ARROW: doKeyUp(event); return false;\n\t case $mdConstant.KEY_CODE.RIGHT_ARROW: doKeyRight(event); return false;\n\t case $mdConstant.KEY_CODE.DOWN_ARROW: doKeyDown(event); return false;\n\t }\n\t }\n\t\n\t function doActionPrev(event) {\n\t focusAction(event, -1);\n\t }\n\t\n\t function doActionNext(event) {\n\t focusAction(event, 1);\n\t }\n\t\n\t function focusAction(event, direction) {\n\t var actions = resetActionTabIndexes();\n\t\n\t // Increment/decrement the counter with restrictions\n\t vm.currentActionIndex = vm.currentActionIndex + direction;\n\t vm.currentActionIndex = Math.min(actions.length - 1, vm.currentActionIndex);\n\t vm.currentActionIndex = Math.max(0, vm.currentActionIndex);\n\t\n\t // Focus the element\n\t var focusElement = angular.element(actions[vm.currentActionIndex]).children()[0];\n\t angular.element(focusElement).attr('tabindex', 0);\n\t focusElement.focus();\n\t\n\t // Make sure the event doesn't bubble and cause something else\n\t event.preventDefault();\n\t event.stopImmediatePropagation();\n\t }\n\t\n\t function resetActionTabIndexes() {\n\t // Grab all of the actions\n\t var actions = getActionsElement()[0].querySelectorAll('.md-fab-action-item');\n\t\n\t // Disable all other actions for tabbing\n\t angular.forEach(actions, function(action) {\n\t angular.element(angular.element(action).children()[0]).attr('tabindex', -1);\n\t });\n\t\n\t return actions;\n\t }\n\t\n\t function doKeyLeft(event) {\n\t if (vm.direction === 'left') {\n\t doActionNext(event);\n\t } else {\n\t doActionPrev(event);\n\t }\n\t }\n\t\n\t function doKeyUp(event) {\n\t if (vm.direction === 'down') {\n\t doActionPrev(event);\n\t } else {\n\t doActionNext(event);\n\t }\n\t }\n\t\n\t function doKeyRight(event) {\n\t if (vm.direction === 'left') {\n\t doActionPrev(event);\n\t } else {\n\t doActionNext(event);\n\t }\n\t }\n\t\n\t function doKeyDown(event) {\n\t if (vm.direction === 'up') {\n\t doActionPrev(event);\n\t } else {\n\t doActionNext(event);\n\t }\n\t }\n\t\n\t function isTrigger(element) {\n\t return $mdUtil.getClosest(element, 'md-fab-trigger');\n\t }\n\t\n\t function isAction(element) {\n\t return $mdUtil.getClosest(element, 'md-fab-actions');\n\t }\n\t\n\t function handleItemClick(event) {\n\t if (isTrigger(event.target)) {\n\t vm.toggle();\n\t }\n\t\n\t if (isAction(event.target)) {\n\t vm.close();\n\t }\n\t }\n\t\n\t function getTriggerElement() {\n\t return $element.find('md-fab-trigger');\n\t }\n\t\n\t function getActionsElement() {\n\t return $element.find('md-fab-actions');\n\t }\n\t }\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t /**\n\t * The duration of the CSS animation in milliseconds.\n\t *\n\t * @type {number}\n\t */\n\t MdFabSpeedDialFlingAnimation.$inject = [\"$timeout\"];\n\t MdFabSpeedDialScaleAnimation.$inject = [\"$timeout\"];\n\t var cssAnimationDuration = 300;\n\t\n\t /**\n\t * @ngdoc module\n\t * @name material.components.fabSpeedDial\n\t */\n\t angular\n\t // Declare our module\n\t .module('material.components.fabSpeedDial', [\n\t 'material.core',\n\t 'material.components.fabShared',\n\t 'material.components.fabActions'\n\t ])\n\t\n\t // Register our directive\n\t .directive('mdFabSpeedDial', MdFabSpeedDialDirective)\n\t\n\t // Register our custom animations\n\t .animation('.md-fling', MdFabSpeedDialFlingAnimation)\n\t .animation('.md-scale', MdFabSpeedDialScaleAnimation)\n\t\n\t // Register a service for each animation so that we can easily inject them into unit tests\n\t .service('mdFabSpeedDialFlingAnimation', MdFabSpeedDialFlingAnimation)\n\t .service('mdFabSpeedDialScaleAnimation', MdFabSpeedDialScaleAnimation);\n\t\n\t /**\n\t * @ngdoc directive\n\t * @name mdFabSpeedDial\n\t * @module material.components.fabSpeedDial\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * The `` directive is used to present a series of popup elements (usually\n\t * ``s) for quick access to common actions.\n\t *\n\t * There are currently two animations available by applying one of the following classes to\n\t * the component:\n\t *\n\t * - `md-fling` - The speed dial items appear from underneath the trigger and move into their\n\t * appropriate positions.\n\t * - `md-scale` - The speed dial items appear in their proper places by scaling from 0% to 100%.\n\t *\n\t * You may also easily position the trigger by applying one one of the following classes to the\n\t * `` element:\n\t * - `md-fab-top-left`\n\t * - `md-fab-top-right`\n\t * - `md-fab-bottom-left`\n\t * - `md-fab-bottom-right`\n\t *\n\t * These CSS classes use `position: absolute`, so you need to ensure that the container element\n\t * also uses `position: absolute` or `position: relative` in order for them to work.\n\t *\n\t * Additionally, you may use the standard `ng-mouseenter` and `ng-mouseleave` directives to\n\t * open or close the speed dial. However, if you wish to allow users to hover over the empty\n\t * space where the actions will appear, you must also add the `md-hover-full` class to the speed\n\t * dial element. Without this, the hover effect will only occur on top of the trigger.\n\t *\n\t * See the demos for more information.\n\t *\n\t * ## Troubleshooting\n\t *\n\t * If your speed dial shows the closing animation upon launch, you may need to use `ng-cloak` on\n\t * the parent container to ensure that it is only visible once ready. We have plans to remove this\n\t * necessity in the future.\n\t *\n\t * @usage\n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t * \n\t * \n\t * \n\t * \n\t *\n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t * @param {string} md-direction From which direction you would like the speed dial to appear\n\t * relative to the trigger element.\n\t * @param {expression=} md-open Programmatically control whether or not the speed-dial is visible.\n\t */\n\t function MdFabSpeedDialDirective() {\n\t return {\n\t restrict: 'E',\n\t\n\t scope: {\n\t direction: '@?mdDirection',\n\t isOpen: '=?mdOpen'\n\t },\n\t\n\t bindToController: true,\n\t controller: 'MdFabController',\n\t controllerAs: 'vm',\n\t\n\t link: FabSpeedDialLink\n\t };\n\t\n\t function FabSpeedDialLink(scope, element) {\n\t // Prepend an element to hold our CSS variables so we can use them in the animations below\n\t element.prepend('
');\n\t }\n\t }\n\t\n\t function MdFabSpeedDialFlingAnimation($timeout) {\n\t function delayDone(done) { $timeout(done, cssAnimationDuration, false); }\n\t\n\t function runAnimation(element) {\n\t // Don't run if we are still waiting and we are not ready\n\t if (element.hasClass('md-animations-waiting') && !element.hasClass('_md-animations-ready')) {\n\t return;\n\t }\n\t\n\t var el = element[0];\n\t var ctrl = element.controller('mdFabSpeedDial');\n\t var items = el.querySelectorAll('.md-fab-action-item');\n\t\n\t // Grab our trigger element\n\t var triggerElement = el.querySelector('md-fab-trigger');\n\t\n\t // Grab our element which stores CSS variables\n\t var variablesElement = el.querySelector('._md-css-variables');\n\t\n\t // Setup JS variables based on our CSS variables\n\t var startZIndex = parseInt(window.getComputedStyle(variablesElement).zIndex);\n\t\n\t // Always reset the items to their natural position/state\n\t angular.forEach(items, function(item, index) {\n\t var styles = item.style;\n\t\n\t styles.transform = styles.webkitTransform = '';\n\t styles.transitionDelay = '';\n\t styles.opacity = 1;\n\t\n\t // Make the items closest to the trigger have the highest z-index\n\t styles.zIndex = (items.length - index) + startZIndex;\n\t });\n\t\n\t // Set the trigger to be above all of the actions so they disappear behind it.\n\t triggerElement.style.zIndex = startZIndex + items.length + 1;\n\t\n\t // If the control is closed, hide the items behind the trigger\n\t if (!ctrl.isOpen) {\n\t angular.forEach(items, function(item, index) {\n\t var newPosition, axis;\n\t var styles = item.style;\n\t\n\t // Make sure to account for differences in the dimensions of the trigger verses the items\n\t // so that we can properly center everything; this helps hide the item's shadows behind\n\t // the trigger.\n\t var triggerItemHeightOffset = (triggerElement.clientHeight - item.clientHeight) / 2;\n\t var triggerItemWidthOffset = (triggerElement.clientWidth - item.clientWidth) / 2;\n\t\n\t switch (ctrl.direction) {\n\t case 'up':\n\t newPosition = (item.scrollHeight * (index + 1) + triggerItemHeightOffset);\n\t axis = 'Y';\n\t break;\n\t case 'down':\n\t newPosition = -(item.scrollHeight * (index + 1) + triggerItemHeightOffset);\n\t axis = 'Y';\n\t break;\n\t case 'left':\n\t newPosition = (item.scrollWidth * (index + 1) + triggerItemWidthOffset);\n\t axis = 'X';\n\t break;\n\t case 'right':\n\t newPosition = -(item.scrollWidth * (index + 1) + triggerItemWidthOffset);\n\t axis = 'X';\n\t break;\n\t }\n\t\n\t var newTranslate = 'translate' + axis + '(' + newPosition + 'px)';\n\t\n\t styles.transform = styles.webkitTransform = newTranslate;\n\t });\n\t }\n\t }\n\t\n\t return {\n\t addClass: function(element, className, done) {\n\t if (element.hasClass('md-fling')) {\n\t runAnimation(element);\n\t delayDone(done);\n\t } else {\n\t done();\n\t }\n\t },\n\t removeClass: function(element, className, done) {\n\t runAnimation(element);\n\t delayDone(done);\n\t }\n\t };\n\t }\n\t\n\t function MdFabSpeedDialScaleAnimation($timeout) {\n\t function delayDone(done) { $timeout(done, cssAnimationDuration, false); }\n\t\n\t var delay = 65;\n\t\n\t function runAnimation(element) {\n\t var el = element[0];\n\t var ctrl = element.controller('mdFabSpeedDial');\n\t var items = el.querySelectorAll('.md-fab-action-item');\n\t\n\t // Grab our element which stores CSS variables\n\t var variablesElement = el.querySelector('._md-css-variables');\n\t\n\t // Setup JS variables based on our CSS variables\n\t var startZIndex = parseInt(window.getComputedStyle(variablesElement).zIndex);\n\t\n\t // Always reset the items to their natural position/state\n\t angular.forEach(items, function(item, index) {\n\t var styles = item.style,\n\t offsetDelay = index * delay;\n\t\n\t styles.opacity = ctrl.isOpen ? 1 : 0;\n\t styles.transform = styles.webkitTransform = ctrl.isOpen ? 'scale(1)' : 'scale(0)';\n\t styles.transitionDelay = (ctrl.isOpen ? offsetDelay : (items.length - offsetDelay)) + 'ms';\n\t\n\t // Make the items closest to the trigger have the highest z-index\n\t styles.zIndex = (items.length - index) + startZIndex;\n\t });\n\t }\n\t\n\t return {\n\t addClass: function(element, className, done) {\n\t runAnimation(element);\n\t delayDone(done);\n\t },\n\t\n\t removeClass: function(element, className, done) {\n\t runAnimation(element);\n\t delayDone(done);\n\t }\n\t };\n\t }\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t(function() {\n\t 'use strict';\n\t\n\t /**\n\t * @ngdoc module\n\t * @name material.components.fabToolbar\n\t */\n\t angular\n\t // Declare our module\n\t .module('material.components.fabToolbar', [\n\t 'material.core',\n\t 'material.components.fabShared',\n\t 'material.components.fabActions'\n\t ])\n\t\n\t // Register our directive\n\t .directive('mdFabToolbar', MdFabToolbarDirective)\n\t\n\t // Register our custom animations\n\t .animation('.md-fab-toolbar', MdFabToolbarAnimation)\n\t\n\t // Register a service for the animation so that we can easily inject it into unit tests\n\t .service('mdFabToolbarAnimation', MdFabToolbarAnimation);\n\t\n\t /**\n\t * @ngdoc directive\n\t * @name mdFabToolbar\n\t * @module material.components.fabToolbar\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t *\n\t * The `` directive is used to present a toolbar of elements (usually ``s)\n\t * for quick access to common actions when a floating action button is activated (via click or\n\t * keyboard navigation).\n\t *\n\t * You may also easily position the trigger by applying one one of the following classes to the\n\t * `` element:\n\t * - `md-fab-top-left`\n\t * - `md-fab-top-right`\n\t * - `md-fab-bottom-left`\n\t * - `md-fab-bottom-right`\n\t *\n\t * These CSS classes use `position: absolute`, so you need to ensure that the container element\n\t * also uses `position: absolute` or `position: relative` in order for them to work.\n\t *\n\t * @usage\n\t *\n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t * @param {string} md-direction From which direction you would like the toolbar items to appear\n\t * relative to the trigger element. Supports `left` and `right` directions.\n\t * @param {expression=} md-open Programmatically control whether or not the toolbar is visible.\n\t */\n\t function MdFabToolbarDirective() {\n\t return {\n\t restrict: 'E',\n\t transclude: true,\n\t template: '
' +\n\t '
' +\n\t '
',\n\t\n\t scope: {\n\t direction: '@?mdDirection',\n\t isOpen: '=?mdOpen'\n\t },\n\t\n\t bindToController: true,\n\t controller: 'MdFabController',\n\t controllerAs: 'vm',\n\t\n\t link: link\n\t };\n\t\n\t function link(scope, element, attributes) {\n\t // Add the base class for animations\n\t element.addClass('md-fab-toolbar');\n\t\n\t // Prepend the background element to the trigger's button\n\t element.find('md-fab-trigger').find('button')\n\t .prepend('
');\n\t }\n\t }\n\t\n\t function MdFabToolbarAnimation() {\n\t\n\t function runAnimation(element, className, done) {\n\t // If no className was specified, don't do anything\n\t if (!className) {\n\t return;\n\t }\n\t\n\t var el = element[0];\n\t var ctrl = element.controller('mdFabToolbar');\n\t\n\t // Grab the relevant child elements\n\t var backgroundElement = el.querySelector('.md-fab-toolbar-background');\n\t var triggerElement = el.querySelector('md-fab-trigger button');\n\t var toolbarElement = el.querySelector('md-toolbar');\n\t var iconElement = el.querySelector('md-fab-trigger button md-icon');\n\t var actions = element.find('md-fab-actions').children();\n\t\n\t // If we have both elements, use them to position the new background\n\t if (triggerElement && backgroundElement) {\n\t // Get our variables\n\t var color = window.getComputedStyle(triggerElement).getPropertyValue('background-color');\n\t var width = el.offsetWidth;\n\t var height = el.offsetHeight;\n\t\n\t // Make it twice as big as it should be since we scale from the center\n\t var scale = 2 * (width / triggerElement.offsetWidth);\n\t\n\t // Set some basic styles no matter what animation we're doing\n\t backgroundElement.style.backgroundColor = color;\n\t backgroundElement.style.borderRadius = width + 'px';\n\t\n\t // If we're open\n\t if (ctrl.isOpen) {\n\t // Turn on toolbar pointer events when closed\n\t toolbarElement.style.pointerEvents = 'inherit';\n\t\n\t backgroundElement.style.width = triggerElement.offsetWidth + 'px';\n\t backgroundElement.style.height = triggerElement.offsetHeight + 'px';\n\t backgroundElement.style.transform = 'scale(' + scale + ')';\n\t\n\t // Set the next close animation to have the proper delays\n\t backgroundElement.style.transitionDelay = '0ms';\n\t iconElement && (iconElement.style.transitionDelay = '.3s');\n\t\n\t // Apply a transition delay to actions\n\t angular.forEach(actions, function(action, index) {\n\t action.style.transitionDelay = (actions.length - index) * 25 + 'ms';\n\t });\n\t } else {\n\t // Turn off toolbar pointer events when closed\n\t toolbarElement.style.pointerEvents = 'none';\n\t\n\t // Scale it back down to the trigger's size\n\t backgroundElement.style.transform = 'scale(1)';\n\t\n\t // Reset the position\n\t backgroundElement.style.top = '0';\n\t\n\t if (element.hasClass('md-right')) {\n\t backgroundElement.style.left = '0';\n\t backgroundElement.style.right = null;\n\t }\n\t\n\t if (element.hasClass('md-left')) {\n\t backgroundElement.style.right = '0';\n\t backgroundElement.style.left = null;\n\t }\n\t\n\t // Set the next open animation to have the proper delays\n\t backgroundElement.style.transitionDelay = '200ms';\n\t iconElement && (iconElement.style.transitionDelay = '0ms');\n\t\n\t // Apply a transition delay to actions\n\t angular.forEach(actions, function(action, index) {\n\t action.style.transitionDelay = 200 + (index * 25) + 'ms';\n\t });\n\t }\n\t }\n\t }\n\t\n\t return {\n\t addClass: function(element, className, done) {\n\t runAnimation(element, className, done);\n\t done();\n\t },\n\t\n\t removeClass: function(element, className, done) {\n\t runAnimation(element, className, done);\n\t done();\n\t }\n\t };\n\t }\n\t})();\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.gridList\n\t */\n\tGridListController.$inject = [\"$mdUtil\"];\n\tGridLayoutFactory.$inject = [\"$mdUtil\"];\n\tGridListDirective.$inject = [\"$interpolate\", \"$mdConstant\", \"$mdGridLayout\", \"$mdMedia\"];\n\tGridTileDirective.$inject = [\"$mdMedia\"];\n\tangular.module('material.components.gridList', ['material.core'])\n\t .directive('mdGridList', GridListDirective)\n\t .directive('mdGridTile', GridTileDirective)\n\t .directive('mdGridTileFooter', GridTileCaptionDirective)\n\t .directive('mdGridTileHeader', GridTileCaptionDirective)\n\t .factory('$mdGridLayout', GridLayoutFactory);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdGridList\n\t * @module material.components.gridList\n\t * @restrict E\n\t * @description\n\t * Grid lists are an alternative to standard list views. Grid lists are distinct\n\t * from grids used for layouts and other visual presentations.\n\t *\n\t * A grid list is best suited to presenting a homogenous data type, typically\n\t * images, and is optimized for visual comprehension and differentiating between\n\t * like data types.\n\t *\n\t * A grid list is a continuous element consisting of tessellated, regular\n\t * subdivisions called cells that contain tiles (`md-grid-tile`).\n\t *\n\t * \"Concept\n\t * \"Grid\n\t *\n\t * Cells are arrayed vertically and horizontally within the grid.\n\t *\n\t * Tiles hold content and can span one or more cells vertically or horizontally.\n\t *\n\t * ### Responsive Attributes\n\t *\n\t * The `md-grid-list` directive supports \"responsive\" attributes, which allow\n\t * different `md-cols`, `md-gutter` and `md-row-height` values depending on the\n\t * currently matching media query.\n\t *\n\t * In order to set a responsive attribute, first define the fallback value with\n\t * the standard attribute name, then add additional attributes with the\n\t * following convention: `{base-attribute-name}-{media-query-name}=\"{value}\"`\n\t * (ie. `md-cols-lg=\"8\"`)\n\t *\n\t * @param {number} md-cols Number of columns in the grid.\n\t * @param {string} md-row-height One of\n\t *
    \n\t *
  • CSS length - Fixed height rows (eg. `8px` or `1rem`)
  • \n\t *
  • `{width}:{height}` - Ratio of width to height (eg.\n\t * `md-row-height=\"16:9\"`)
  • \n\t *
  • `\"fit\"` - Height will be determined by subdividing the available\n\t * height by the number of rows
  • \n\t *
\n\t * @param {string=} md-gutter The amount of space between tiles in CSS units\n\t * (default 1px)\n\t * @param {expression=} md-on-layout Expression to evaluate after layout. Event\n\t * object is available as `$event`, and contains performance information.\n\t *\n\t * @usage\n\t * Basic:\n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t * Fixed-height rows:\n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t * Fit rows:\n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t * Using responsive attributes:\n\t * \n\t * \n\t * \n\t * \n\t * \n\t */\n\tfunction GridListDirective($interpolate, $mdConstant, $mdGridLayout, $mdMedia) {\n\t return {\n\t restrict: 'E',\n\t controller: GridListController,\n\t scope: {\n\t mdOnLayout: '&'\n\t },\n\t link: postLink\n\t };\n\t\n\t function postLink(scope, element, attrs, ctrl) {\n\t element.addClass('_md'); // private md component indicator for styling\n\t \n\t // Apply semantics\n\t element.attr('role', 'list');\n\t\n\t // Provide the controller with a way to trigger layouts.\n\t ctrl.layoutDelegate = layoutDelegate;\n\t\n\t var invalidateLayout = angular.bind(ctrl, ctrl.invalidateLayout),\n\t unwatchAttrs = watchMedia();\n\t scope.$on('$destroy', unwatchMedia);\n\t\n\t /**\n\t * Watches for changes in media, invalidating layout as necessary.\n\t */\n\t function watchMedia() {\n\t for (var mediaName in $mdConstant.MEDIA) {\n\t $mdMedia(mediaName); // initialize\n\t $mdMedia.getQuery($mdConstant.MEDIA[mediaName])\n\t .addListener(invalidateLayout);\n\t }\n\t return $mdMedia.watchResponsiveAttributes(\n\t ['md-cols', 'md-row-height', 'md-gutter'], attrs, layoutIfMediaMatch);\n\t }\n\t\n\t function unwatchMedia() {\n\t ctrl.layoutDelegate = angular.noop;\n\t\n\t unwatchAttrs();\n\t for (var mediaName in $mdConstant.MEDIA) {\n\t $mdMedia.getQuery($mdConstant.MEDIA[mediaName])\n\t .removeListener(invalidateLayout);\n\t }\n\t }\n\t\n\t /**\n\t * Performs grid layout if the provided mediaName matches the currently\n\t * active media type.\n\t */\n\t function layoutIfMediaMatch(mediaName) {\n\t if (mediaName == null) {\n\t // TODO(shyndman): It would be nice to only layout if we have\n\t // instances of attributes using this media type\n\t ctrl.invalidateLayout();\n\t } else if ($mdMedia(mediaName)) {\n\t ctrl.invalidateLayout();\n\t }\n\t }\n\t\n\t var lastLayoutProps;\n\t\n\t /**\n\t * Invokes the layout engine, and uses its results to lay out our\n\t * tile elements.\n\t *\n\t * @param {boolean} tilesInvalidated Whether tiles have been\n\t * added/removed/moved since the last layout. This is to avoid situations\n\t * where tiles are replaced with properties identical to their removed\n\t * counterparts.\n\t */\n\t function layoutDelegate(tilesInvalidated) {\n\t var tiles = getTileElements();\n\t var props = {\n\t tileSpans: getTileSpans(tiles),\n\t colCount: getColumnCount(),\n\t rowMode: getRowMode(),\n\t rowHeight: getRowHeight(),\n\t gutter: getGutter()\n\t };\n\t\n\t if (!tilesInvalidated && angular.equals(props, lastLayoutProps)) {\n\t return;\n\t }\n\t\n\t var performance =\n\t $mdGridLayout(props.colCount, props.tileSpans, tiles)\n\t .map(function(tilePositions, rowCount) {\n\t return {\n\t grid: {\n\t element: element,\n\t style: getGridStyle(props.colCount, rowCount,\n\t props.gutter, props.rowMode, props.rowHeight)\n\t },\n\t tiles: tilePositions.map(function(ps, i) {\n\t return {\n\t element: angular.element(tiles[i]),\n\t style: getTileStyle(ps.position, ps.spans,\n\t props.colCount, rowCount,\n\t props.gutter, props.rowMode, props.rowHeight)\n\t }\n\t })\n\t }\n\t })\n\t .reflow()\n\t .performance();\n\t\n\t // Report layout\n\t scope.mdOnLayout({\n\t $event: {\n\t performance: performance\n\t }\n\t });\n\t\n\t lastLayoutProps = props;\n\t }\n\t\n\t // Use $interpolate to do some simple string interpolation as a convenience.\n\t\n\t var startSymbol = $interpolate.startSymbol();\n\t var endSymbol = $interpolate.endSymbol();\n\t\n\t // Returns an expression wrapped in the interpolator's start and end symbols.\n\t function expr(exprStr) {\n\t return startSymbol + exprStr + endSymbol;\n\t }\n\t\n\t // The amount of space a single 1x1 tile would take up (either width or height), used as\n\t // a basis for other calculations. This consists of taking the base size percent (as would be\n\t // if evenly dividing the size between cells), and then subtracting the size of one gutter.\n\t // However, since there are no gutters on the edges, each tile only uses a fration\n\t // (gutterShare = numGutters / numCells) of the gutter size. (Imagine having one gutter per\n\t // tile, and then breaking up the extra gutter on the edge evenly among the cells).\n\t var UNIT = $interpolate(expr('share') + '% - (' + expr('gutter') + ' * ' + expr('gutterShare') + ')');\n\t\n\t // The horizontal or vertical position of a tile, e.g., the 'top' or 'left' property value.\n\t // The position comes the size of a 1x1 tile plus gutter for each previous tile in the\n\t // row/column (offset).\n\t var POSITION = $interpolate('calc((' + expr('unit') + ' + ' + expr('gutter') + ') * ' + expr('offset') + ')');\n\t\n\t // The actual size of a tile, e.g., width or height, taking rowSpan or colSpan into account.\n\t // This is computed by multiplying the base unit by the rowSpan/colSpan, and then adding back\n\t // in the space that the gutter would normally have used (which was already accounted for in\n\t // the base unit calculation).\n\t var DIMENSION = $interpolate('calc((' + expr('unit') + ') * ' + expr('span') + ' + (' + expr('span') + ' - 1) * ' + expr('gutter') + ')');\n\t\n\t /**\n\t * Gets the styles applied to a tile element described by the given parameters.\n\t * @param {{row: number, col: number}} position The row and column indices of the tile.\n\t * @param {{row: number, col: number}} spans The rowSpan and colSpan of the tile.\n\t * @param {number} colCount The number of columns.\n\t * @param {number} rowCount The number of rows.\n\t * @param {string} gutter The amount of space between tiles. This will be something like\n\t * '5px' or '2em'.\n\t * @param {string} rowMode The row height mode. Can be one of:\n\t * 'fixed': all rows have a fixed size, given by rowHeight,\n\t * 'ratio': row height defined as a ratio to width, or\n\t * 'fit': fit to the grid-list element height, divinding evenly among rows.\n\t * @param {string|number} rowHeight The height of a row. This is only used for 'fixed' mode and\n\t * for 'ratio' mode. For 'ratio' mode, this is the *ratio* of width-to-height (e.g., 0.75).\n\t * @returns {Object} Map of CSS properties to be applied to the style element. Will define\n\t * values for top, left, width, height, marginTop, and paddingTop.\n\t */\n\t function getTileStyle(position, spans, colCount, rowCount, gutter, rowMode, rowHeight) {\n\t // TODO(shyndman): There are style caching opportunities here.\n\t\n\t // Percent of the available horizontal space that one column takes up.\n\t var hShare = (1 / colCount) * 100;\n\t\n\t // Fraction of the gutter size that each column takes up.\n\t var hGutterShare = (colCount - 1) / colCount;\n\t\n\t // Base horizontal size of a column.\n\t var hUnit = UNIT({share: hShare, gutterShare: hGutterShare, gutter: gutter});\n\t\n\t // The width and horizontal position of each tile is always calculated the same way, but the\n\t // height and vertical position depends on the rowMode.\n\t var ltr = document.dir != 'rtl' && document.body.dir != 'rtl';\n\t var style = ltr ? {\n\t left: POSITION({ unit: hUnit, offset: position.col, gutter: gutter }),\n\t width: DIMENSION({ unit: hUnit, span: spans.col, gutter: gutter }),\n\t // resets\n\t paddingTop: '',\n\t marginTop: '',\n\t top: '',\n\t height: ''\n\t } : {\n\t right: POSITION({ unit: hUnit, offset: position.col, gutter: gutter }),\n\t width: DIMENSION({ unit: hUnit, span: spans.col, gutter: gutter }),\n\t // resets\n\t paddingTop: '',\n\t marginTop: '',\n\t top: '',\n\t height: ''\n\t };\n\t\n\t switch (rowMode) {\n\t case 'fixed':\n\t // In fixed mode, simply use the given rowHeight.\n\t style.top = POSITION({ unit: rowHeight, offset: position.row, gutter: gutter });\n\t style.height = DIMENSION({ unit: rowHeight, span: spans.row, gutter: gutter });\n\t break;\n\t\n\t case 'ratio':\n\t // Percent of the available vertical space that one row takes up. Here, rowHeight holds\n\t // the ratio value. For example, if the width:height ratio is 4:3, rowHeight = 1.333.\n\t var vShare = hShare / rowHeight;\n\t\n\t // Base veritcal size of a row.\n\t var vUnit = UNIT({ share: vShare, gutterShare: hGutterShare, gutter: gutter });\n\t\n\t // padidngTop and marginTop are used to maintain the given aspect ratio, as\n\t // a percentage-based value for these properties is applied to the *width* of the\n\t // containing block. See http://www.w3.org/TR/CSS2/box.html#margin-properties\n\t style.paddingTop = DIMENSION({ unit: vUnit, span: spans.row, gutter: gutter});\n\t style.marginTop = POSITION({ unit: vUnit, offset: position.row, gutter: gutter });\n\t break;\n\t\n\t case 'fit':\n\t // Fraction of the gutter size that each column takes up.\n\t var vGutterShare = (rowCount - 1) / rowCount;\n\t\n\t // Percent of the available vertical space that one row takes up.\n\t var vShare = (1 / rowCount) * 100;\n\t\n\t // Base vertical size of a row.\n\t var vUnit = UNIT({share: vShare, gutterShare: vGutterShare, gutter: gutter});\n\t\n\t style.top = POSITION({unit: vUnit, offset: position.row, gutter: gutter});\n\t style.height = DIMENSION({unit: vUnit, span: spans.row, gutter: gutter});\n\t break;\n\t }\n\t\n\t return style;\n\t }\n\t\n\t function getGridStyle(colCount, rowCount, gutter, rowMode, rowHeight) {\n\t var style = {};\n\t\n\t switch(rowMode) {\n\t case 'fixed':\n\t style.height = DIMENSION({ unit: rowHeight, span: rowCount, gutter: gutter });\n\t style.paddingBottom = '';\n\t break;\n\t\n\t case 'ratio':\n\t // rowHeight is width / height\n\t var hGutterShare = colCount === 1 ? 0 : (colCount - 1) / colCount,\n\t hShare = (1 / colCount) * 100,\n\t vShare = hShare * (1 / rowHeight),\n\t vUnit = UNIT({ share: vShare, gutterShare: hGutterShare, gutter: gutter });\n\t\n\t style.height = '';\n\t style.paddingBottom = DIMENSION({ unit: vUnit, span: rowCount, gutter: gutter});\n\t break;\n\t\n\t case 'fit':\n\t // noop, as the height is user set\n\t break;\n\t }\n\t\n\t return style;\n\t }\n\t\n\t function getTileElements() {\n\t return [].filter.call(element.children(), function(ele) {\n\t return ele.tagName == 'MD-GRID-TILE' && !ele.$$mdDestroyed;\n\t });\n\t }\n\t\n\t /**\n\t * Gets an array of objects containing the rowspan and colspan for each tile.\n\t * @returns {Array<{row: number, col: number}>}\n\t */\n\t function getTileSpans(tileElements) {\n\t return [].map.call(tileElements, function(ele) {\n\t var ctrl = angular.element(ele).controller('mdGridTile');\n\t return {\n\t row: parseInt(\n\t $mdMedia.getResponsiveAttribute(ctrl.$attrs, 'md-rowspan'), 10) || 1,\n\t col: parseInt(\n\t $mdMedia.getResponsiveAttribute(ctrl.$attrs, 'md-colspan'), 10) || 1\n\t };\n\t });\n\t }\n\t\n\t function getColumnCount() {\n\t var colCount = parseInt($mdMedia.getResponsiveAttribute(attrs, 'md-cols'), 10);\n\t if (isNaN(colCount)) {\n\t throw 'md-grid-list: md-cols attribute was not found, or contained a non-numeric value';\n\t }\n\t return colCount;\n\t }\n\t\n\t function getGutter() {\n\t return applyDefaultUnit($mdMedia.getResponsiveAttribute(attrs, 'md-gutter') || 1);\n\t }\n\t\n\t function getRowHeight() {\n\t var rowHeight = $mdMedia.getResponsiveAttribute(attrs, 'md-row-height');\n\t if (!rowHeight) {\n\t throw 'md-grid-list: md-row-height attribute was not found';\n\t }\n\t\n\t switch (getRowMode()) {\n\t case 'fixed':\n\t return applyDefaultUnit(rowHeight);\n\t case 'ratio':\n\t var whRatio = rowHeight.split(':');\n\t return parseFloat(whRatio[0]) / parseFloat(whRatio[1]);\n\t case 'fit':\n\t return 0; // N/A\n\t }\n\t }\n\t\n\t function getRowMode() {\n\t var rowHeight = $mdMedia.getResponsiveAttribute(attrs, 'md-row-height');\n\t if (!rowHeight) {\n\t throw 'md-grid-list: md-row-height attribute was not found';\n\t }\n\t\n\t if (rowHeight == 'fit') {\n\t return 'fit';\n\t } else if (rowHeight.indexOf(':') !== -1) {\n\t return 'ratio';\n\t } else {\n\t return 'fixed';\n\t }\n\t }\n\t\n\t function applyDefaultUnit(val) {\n\t return /\\D$/.test(val) ? val : val + 'px';\n\t }\n\t }\n\t}\n\t\n\t/* @ngInject */\n\tfunction GridListController($mdUtil) {\n\t this.layoutInvalidated = false;\n\t this.tilesInvalidated = false;\n\t this.$timeout_ = $mdUtil.nextTick;\n\t this.layoutDelegate = angular.noop;\n\t}\n\t\n\tGridListController.prototype = {\n\t invalidateTiles: function() {\n\t this.tilesInvalidated = true;\n\t this.invalidateLayout();\n\t },\n\t\n\t invalidateLayout: function() {\n\t if (this.layoutInvalidated) {\n\t return;\n\t }\n\t this.layoutInvalidated = true;\n\t this.$timeout_(angular.bind(this, this.layout));\n\t },\n\t\n\t layout: function() {\n\t try {\n\t this.layoutDelegate(this.tilesInvalidated);\n\t } finally {\n\t this.layoutInvalidated = false;\n\t this.tilesInvalidated = false;\n\t }\n\t }\n\t};\n\t\n\t\n\t/* @ngInject */\n\tfunction GridLayoutFactory($mdUtil) {\n\t var defaultAnimator = GridTileAnimator;\n\t\n\t /**\n\t * Set the reflow animator callback\n\t */\n\t GridLayout.animateWith = function(customAnimator) {\n\t defaultAnimator = !angular.isFunction(customAnimator) ? GridTileAnimator : customAnimator;\n\t };\n\t\n\t return GridLayout;\n\t\n\t /**\n\t * Publish layout function\n\t */\n\t function GridLayout(colCount, tileSpans) {\n\t var self, layoutInfo, gridStyles, layoutTime, mapTime, reflowTime;\n\t\n\t layoutTime = $mdUtil.time(function() {\n\t layoutInfo = calculateGridFor(colCount, tileSpans);\n\t });\n\t\n\t return self = {\n\t\n\t /**\n\t * An array of objects describing each tile's position in the grid.\n\t */\n\t layoutInfo: function() {\n\t return layoutInfo;\n\t },\n\t\n\t /**\n\t * Maps grid positioning to an element and a set of styles using the\n\t * provided updateFn.\n\t */\n\t map: function(updateFn) {\n\t mapTime = $mdUtil.time(function() {\n\t var info = self.layoutInfo();\n\t gridStyles = updateFn(info.positioning, info.rowCount);\n\t });\n\t return self;\n\t },\n\t\n\t /**\n\t * Default animator simply sets the element.css( ). An alternate\n\t * animator can be provided as an argument. The function has the following\n\t * signature:\n\t *\n\t * function({grid: {element: JQLite, style: Object}, tiles: Array<{element: JQLite, style: Object}>)\n\t */\n\t reflow: function(animatorFn) {\n\t reflowTime = $mdUtil.time(function() {\n\t var animator = animatorFn || defaultAnimator;\n\t animator(gridStyles.grid, gridStyles.tiles);\n\t });\n\t return self;\n\t },\n\t\n\t /**\n\t * Timing for the most recent layout run.\n\t */\n\t performance: function() {\n\t return {\n\t tileCount: tileSpans.length,\n\t layoutTime: layoutTime,\n\t mapTime: mapTime,\n\t reflowTime: reflowTime,\n\t totalTime: layoutTime + mapTime + reflowTime\n\t };\n\t }\n\t };\n\t }\n\t\n\t /**\n\t * Default Gridlist animator simple sets the css for each element;\n\t * NOTE: any transitions effects must be manually set in the CSS.\n\t * e.g.\n\t *\n\t * md-grid-tile {\n\t * transition: all 700ms ease-out 50ms;\n\t * }\n\t *\n\t */\n\t function GridTileAnimator(grid, tiles) {\n\t grid.element.css(grid.style);\n\t tiles.forEach(function(t) {\n\t t.element.css(t.style);\n\t })\n\t }\n\t\n\t /**\n\t * Calculates the positions of tiles.\n\t *\n\t * The algorithm works as follows:\n\t * An Array with length colCount (spaceTracker) keeps track of\n\t * available tiling positions, where elements of value 0 represents an\n\t * empty position. Space for a tile is reserved by finding a sequence of\n\t * 0s with length <= than the tile's colspan. When such a space has been\n\t * found, the occupied tile positions are incremented by the tile's\n\t * rowspan value, as these positions have become unavailable for that\n\t * many rows.\n\t *\n\t * If the end of a row has been reached without finding space for the\n\t * tile, spaceTracker's elements are each decremented by 1 to a minimum\n\t * of 0. Rows are searched in this fashion until space is found.\n\t */\n\t function calculateGridFor(colCount, tileSpans) {\n\t var curCol = 0,\n\t curRow = 0,\n\t spaceTracker = newSpaceTracker();\n\t\n\t return {\n\t positioning: tileSpans.map(function(spans, i) {\n\t return {\n\t spans: spans,\n\t position: reserveSpace(spans, i)\n\t };\n\t }),\n\t rowCount: curRow + Math.max.apply(Math, spaceTracker)\n\t };\n\t\n\t function reserveSpace(spans, i) {\n\t if (spans.col > colCount) {\n\t throw 'md-grid-list: Tile at position ' + i + ' has a colspan ' +\n\t '(' + spans.col + ') that exceeds the column count ' +\n\t '(' + colCount + ')';\n\t }\n\t\n\t var start = 0,\n\t end = 0;\n\t\n\t // TODO(shyndman): This loop isn't strictly necessary if you can\n\t // determine the minimum number of rows before a space opens up. To do\n\t // this, recognize that you've iterated across an entire row looking for\n\t // space, and if so fast-forward by the minimum rowSpan count. Repeat\n\t // until the required space opens up.\n\t while (end - start < spans.col) {\n\t if (curCol >= colCount) {\n\t nextRow();\n\t continue;\n\t }\n\t\n\t start = spaceTracker.indexOf(0, curCol);\n\t if (start === -1 || (end = findEnd(start + 1)) === -1) {\n\t start = end = 0;\n\t nextRow();\n\t continue;\n\t }\n\t\n\t curCol = end + 1;\n\t }\n\t\n\t adjustRow(start, spans.col, spans.row);\n\t curCol = start + spans.col;\n\t\n\t return {\n\t col: start,\n\t row: curRow\n\t };\n\t }\n\t\n\t function nextRow() {\n\t curCol = 0;\n\t curRow++;\n\t adjustRow(0, colCount, -1); // Decrement row spans by one\n\t }\n\t\n\t function adjustRow(from, cols, by) {\n\t for (var i = from; i < from + cols; i++) {\n\t spaceTracker[i] = Math.max(spaceTracker[i] + by, 0);\n\t }\n\t }\n\t\n\t function findEnd(start) {\n\t var i;\n\t for (i = start; i < spaceTracker.length; i++) {\n\t if (spaceTracker[i] !== 0) {\n\t return i;\n\t }\n\t }\n\t\n\t if (i === spaceTracker.length) {\n\t return i;\n\t }\n\t }\n\t\n\t function newSpaceTracker() {\n\t var tracker = [];\n\t for (var i = 0; i < colCount; i++) {\n\t tracker.push(0);\n\t }\n\t return tracker;\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdGridTile\n\t * @module material.components.gridList\n\t * @restrict E\n\t * @description\n\t * Tiles contain the content of an `md-grid-list`. They span one or more grid\n\t * cells vertically or horizontally, and use `md-grid-tile-{footer,header}` to\n\t * display secondary content.\n\t *\n\t * ### Responsive Attributes\n\t *\n\t * The `md-grid-tile` directive supports \"responsive\" attributes, which allow\n\t * different `md-rowspan` and `md-colspan` values depending on the currently\n\t * matching media query.\n\t *\n\t * In order to set a responsive attribute, first define the fallback value with\n\t * the standard attribute name, then add additional attributes with the\n\t * following convention: `{base-attribute-name}-{media-query-name}=\"{value}\"`\n\t * (ie. `md-colspan-sm=\"4\"`)\n\t *\n\t * @param {number=} md-colspan The number of columns to span (default 1). Cannot\n\t * exceed the number of columns in the grid. Supports interpolation.\n\t * @param {number=} md-rowspan The number of rows to span (default 1). Supports\n\t * interpolation.\n\t *\n\t * @usage\n\t * With header:\n\t * \n\t * \n\t * \n\t *

This is a header

\n\t *
\n\t *
\n\t *
\n\t *\n\t * With footer:\n\t * \n\t * \n\t * \n\t *

This is a footer

\n\t *
\n\t *
\n\t *
\n\t *\n\t * Spanning multiple rows/columns:\n\t * \n\t * \n\t * \n\t * \n\t *\n\t * Responsive attributes:\n\t * \n\t * \n\t * \n\t * \n\t */\n\tfunction GridTileDirective($mdMedia) {\n\t return {\n\t restrict: 'E',\n\t require: '^mdGridList',\n\t template: '
',\n\t transclude: true,\n\t scope: {},\n\t // Simple controller that exposes attributes to the grid directive\n\t controller: [\"$attrs\", function($attrs) {\n\t this.$attrs = $attrs;\n\t }],\n\t link: postLink\n\t };\n\t\n\t function postLink(scope, element, attrs, gridCtrl) {\n\t // Apply semantics\n\t element.attr('role', 'listitem');\n\t\n\t // If our colspan or rowspan changes, trigger a layout\n\t var unwatchAttrs = $mdMedia.watchResponsiveAttributes(['md-colspan', 'md-rowspan'],\n\t attrs, angular.bind(gridCtrl, gridCtrl.invalidateLayout));\n\t\n\t // Tile registration/deregistration\n\t gridCtrl.invalidateTiles();\n\t scope.$on('$destroy', function() {\n\t // Mark the tile as destroyed so it is no longer considered in layout,\n\t // even if the DOM element sticks around (like during a leave animation)\n\t element[0].$$mdDestroyed = true;\n\t unwatchAttrs();\n\t gridCtrl.invalidateLayout();\n\t });\n\t\n\t if (angular.isDefined(scope.$parent.$index)) {\n\t scope.$watch(function() { return scope.$parent.$index; },\n\t function indexChanged(newIdx, oldIdx) {\n\t if (newIdx === oldIdx) {\n\t return;\n\t }\n\t gridCtrl.invalidateTiles();\n\t });\n\t }\n\t }\n\t}\n\t\n\t\n\tfunction GridTileCaptionDirective() {\n\t return {\n\t template: '
',\n\t transclude: true\n\t };\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.icon\n\t * @description\n\t * Icon\n\t */\n\tangular.module('material.components.icon', ['material.core']);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.input\n\t */\n\tmdInputContainerDirective.$inject = [\"$mdTheming\", \"$parse\"];\n\tinputTextareaDirective.$inject = [\"$mdUtil\", \"$window\", \"$mdAria\", \"$timeout\", \"$mdGesture\"];\n\tmdMaxlengthDirective.$inject = [\"$animate\", \"$mdUtil\"];\n\tplaceholderDirective.$inject = [\"$compile\"];\n\tngMessageDirective.$inject = [\"$mdUtil\"];\n\tmdSelectOnFocusDirective.$inject = [\"$timeout\"];\n\tmdInputInvalidMessagesAnimation.$inject = [\"$$AnimateRunner\", \"$animateCss\", \"$mdUtil\", \"$log\"];\n\tngMessagesAnimation.$inject = [\"$$AnimateRunner\", \"$animateCss\", \"$mdUtil\", \"$log\"];\n\tngMessageAnimation.$inject = [\"$$AnimateRunner\", \"$animateCss\", \"$mdUtil\", \"$log\"];\n\tvar inputModule = angular.module('material.components.input', [\n\t 'material.core'\n\t ])\n\t .directive('mdInputContainer', mdInputContainerDirective)\n\t .directive('label', labelDirective)\n\t .directive('input', inputTextareaDirective)\n\t .directive('textarea', inputTextareaDirective)\n\t .directive('mdMaxlength', mdMaxlengthDirective)\n\t .directive('placeholder', placeholderDirective)\n\t .directive('ngMessages', ngMessagesDirective)\n\t .directive('ngMessage', ngMessageDirective)\n\t .directive('ngMessageExp', ngMessageDirective)\n\t .directive('mdSelectOnFocus', mdSelectOnFocusDirective)\n\t\n\t .animation('.md-input-invalid', mdInputInvalidMessagesAnimation)\n\t .animation('.md-input-messages-animation', ngMessagesAnimation)\n\t .animation('.md-input-message-animation', ngMessageAnimation);\n\t\n\t// If we are running inside of tests; expose some extra services so that we can test them\n\tif (window._mdMocksIncluded) {\n\t inputModule.service('$$mdInput', function() {\n\t return {\n\t // special accessor to internals... useful for testing\n\t messages: {\n\t show : showInputMessages,\n\t hide : hideInputMessages,\n\t getElement : getMessagesElement\n\t }\n\t }\n\t })\n\t\n\t // Register a service for each animation so that we can easily inject them into unit tests\n\t .service('mdInputInvalidAnimation', mdInputInvalidMessagesAnimation)\n\t .service('mdInputMessagesAnimation', ngMessagesAnimation)\n\t .service('mdInputMessageAnimation', ngMessageAnimation);\n\t}\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdInputContainer\n\t * @module material.components.input\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * `` is the parent of any input or textarea element.\n\t *\n\t * Input and textarea elements will not behave properly unless the md-input-container\n\t * parent is provided.\n\t *\n\t * A single `` should contain only one `` element, otherwise it will throw an error.\n\t *\n\t * Exception: Hidden inputs (``) are ignored and will not throw an error, so\n\t * you may combine these with other inputs.\n\t *\n\t * Note: When using `ngMessages` with your input element, make sure the message and container elements\n\t * are *block* elements, otherwise animations applied to the messages will not look as intended. Either use a `div` and\n\t * apply the `ng-message` and `ng-messages` classes respectively, or use the `md-block` class on your element.\n\t *\n\t * @param md-is-error {expression=} When the given expression evaluates to true, the input container\n\t * will go into error state. Defaults to erroring if the input has been touched and is invalid.\n\t * @param md-no-float {boolean=} When present, `placeholder` attributes on the input will not be converted to floating\n\t * labels.\n\t *\n\t * @usage\n\t * \n\t *\n\t * \n\t * \n\t * \n\t * \n\t *\n\t * \n\t * \n\t * \n\t * \n\t *\n\t * \n\t *\n\t *

When disabling floating labels

\n\t * \n\t *\n\t * \n\t * \n\t * \n\t *\n\t * \n\t */\n\tfunction mdInputContainerDirective($mdTheming, $parse) {\n\t\n\t ContainerCtrl.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$animate\"];\n\t var INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT', 'MD-SELECT'];\n\t\n\t var LEFT_SELECTORS = INPUT_TAGS.reduce(function(selectors, isel) {\n\t return selectors.concat(['md-icon ~ ' + isel, '.md-icon ~ ' + isel]);\n\t }, []).join(\",\");\n\t\n\t var RIGHT_SELECTORS = INPUT_TAGS.reduce(function(selectors, isel) {\n\t return selectors.concat([isel + ' ~ md-icon', isel + ' ~ .md-icon']);\n\t }, []).join(\",\");\n\t\n\t return {\n\t restrict: 'E',\n\t compile: compile,\n\t controller: ContainerCtrl\n\t };\n\t\n\t function compile(tElement) {\n\t // Check for both a left & right icon\n\t var leftIcon = tElement[0].querySelector(LEFT_SELECTORS);\n\t var rightIcon = tElement[0].querySelector(RIGHT_SELECTORS);\n\t\n\t if (leftIcon) { tElement.addClass('md-icon-left'); }\n\t if (rightIcon) { tElement.addClass('md-icon-right'); }\n\t\n\t return function postLink(scope, element) {\n\t $mdTheming(element);\n\t };\n\t }\n\t\n\t function ContainerCtrl($scope, $element, $attrs, $animate) {\n\t var self = this;\n\t\n\t self.isErrorGetter = $attrs.mdIsError && $parse($attrs.mdIsError);\n\t\n\t self.delegateClick = function() {\n\t self.input.focus();\n\t };\n\t self.element = $element;\n\t self.setFocused = function(isFocused) {\n\t $element.toggleClass('md-input-focused', !!isFocused);\n\t };\n\t self.setHasValue = function(hasValue) {\n\t $element.toggleClass('md-input-has-value', !!hasValue);\n\t };\n\t self.setHasPlaceholder = function(hasPlaceholder) {\n\t $element.toggleClass('md-input-has-placeholder', !!hasPlaceholder);\n\t };\n\t self.setInvalid = function(isInvalid) {\n\t if (isInvalid) {\n\t $animate.addClass($element, 'md-input-invalid');\n\t } else {\n\t $animate.removeClass($element, 'md-input-invalid');\n\t }\n\t };\n\t $scope.$watch(function() {\n\t return self.label && self.input;\n\t }, function(hasLabelAndInput) {\n\t if (hasLabelAndInput && !self.label.attr('for')) {\n\t self.label.attr('for', self.input.attr('id'));\n\t }\n\t });\n\t }\n\t}\n\t\n\tfunction labelDirective() {\n\t return {\n\t restrict: 'E',\n\t require: '^?mdInputContainer',\n\t link: function(scope, element, attr, containerCtrl) {\n\t if (!containerCtrl || attr.mdNoFloat || element.hasClass('md-container-ignore')) return;\n\t\n\t containerCtrl.label = element;\n\t scope.$on('$destroy', function() {\n\t containerCtrl.label = null;\n\t });\n\t }\n\t };\n\t}\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdInput\n\t * @restrict E\n\t * @module material.components.input\n\t *\n\t * @description\n\t * You can use any `` or `\n\t *
\n\t *
This is required!
\n\t *
That's too long!
\n\t *
\n\t *
\n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t *\n\t *

Notes

\n\t *\n\t * - Requires [ngMessages](https://docs.angularjs.org/api/ngMessages).\n\t * - Behaves like the [AngularJS input directive](https://docs.angularjs.org/api/ng/directive/input).\n\t *\n\t * The `md-input` and `md-input-container` directives use very specific positioning to achieve the\n\t * error animation effects. Therefore, it is *not* advised to use the Layout system inside of the\n\t * `` tags. Instead, use relative or absolute positioning.\n\t *\n\t *\n\t *

Textarea directive

\n\t * The `textarea` element within a `md-input-container` has the following specific behavior:\n\t * - By default the `textarea` grows as the user types. This can be disabled via the `md-no-autogrow`\n\t * attribute.\n\t * - If a `textarea` has the `rows` attribute, it will treat the `rows` as the minimum height and will\n\t * continue growing as the user types. For example a textarea with `rows=\"3\"` will be 3 lines of text\n\t * high initially. If no rows are specified, the directive defaults to 1.\n\t * - The textarea's height gets set on initialization, as well as while the user is typing. In certain situations\n\t * (e.g. while animating) the directive might have been initialized, before the element got it's final height. In\n\t * those cases, you can trigger a resize manually by broadcasting a `md-resize-textarea` event on the scope.\n\t * - If you want a `textarea` to stop growing at a certain point, you can specify the `max-rows` attribute.\n\t * - The textarea's bottom border acts as a handle which users can drag, in order to resize the element vertically.\n\t * Once the user has resized a `textarea`, the autogrowing functionality becomes disabled. If you don't want a\n\t * `textarea` to be resizeable by the user, you can add the `md-no-resize` attribute.\n\t */\n\t\n\tfunction inputTextareaDirective($mdUtil, $window, $mdAria, $timeout, $mdGesture) {\n\t return {\n\t restrict: 'E',\n\t require: ['^?mdInputContainer', '?ngModel', '?^form'],\n\t link: postLink\n\t };\n\t\n\t function postLink(scope, element, attr, ctrls) {\n\t\n\t var containerCtrl = ctrls[0];\n\t var hasNgModel = !!ctrls[1];\n\t var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n\t var parentForm = ctrls[2];\n\t var isReadonly = angular.isDefined(attr.readonly);\n\t var mdNoAsterisk = $mdUtil.parseAttributeBoolean(attr.mdNoAsterisk);\n\t var tagName = element[0].tagName.toLowerCase();\n\t\n\t\n\t if (!containerCtrl) return;\n\t if (attr.type === 'hidden') {\n\t element.attr('aria-hidden', 'true');\n\t return;\n\t } else if (containerCtrl.input) {\n\t if (containerCtrl.input[0].contains(element[0])) {\n\t return;\n\t } else {\n\t throw new Error(\" can only have *one* , \n\t * \n\t *\n\t * \n\t */\n\tfunction mdSelectOnFocusDirective($timeout) {\n\t\n\t return {\n\t restrict: 'A',\n\t link: postLink\n\t };\n\t\n\t function postLink(scope, element, attr) {\n\t if (element[0].nodeName !== 'INPUT' && element[0].nodeName !== \"TEXTAREA\") return;\n\t\n\t var preventMouseUp = false;\n\t\n\t element\n\t .on('focus', onFocus)\n\t .on('mouseup', onMouseUp);\n\t\n\t scope.$on('$destroy', function() {\n\t element\n\t .off('focus', onFocus)\n\t .off('mouseup', onMouseUp);\n\t });\n\t\n\t function onFocus() {\n\t preventMouseUp = true;\n\t\n\t $timeout(function() {\n\t // Use HTMLInputElement#select to fix firefox select issues.\n\t // The debounce is here for Edge's sake, otherwise the selection doesn't work.\n\t element[0].select();\n\t\n\t // This should be reset from inside the `focus`, because the event might\n\t // have originated from something different than a click, e.g. a keyboard event.\n\t preventMouseUp = false;\n\t }, 1, false);\n\t }\n\t\n\t // Prevents the default action of the first `mouseup` after a focus.\n\t // This is necessary, because browsers fire a `mouseup` right after the element\n\t // has been focused. In some browsers (Firefox in particular) this can clear the\n\t // selection. There are examples of the problem in issue #7487.\n\t function onMouseUp(event) {\n\t if (preventMouseUp) {\n\t event.preventDefault();\n\t }\n\t }\n\t }\n\t}\n\t\n\tvar visibilityDirectives = ['ngIf', 'ngShow', 'ngHide', 'ngSwitchWhen', 'ngSwitchDefault'];\n\tfunction ngMessagesDirective() {\n\t return {\n\t restrict: 'EA',\n\t link: postLink,\n\t\n\t // This is optional because we don't want target *all* ngMessage instances, just those inside of\n\t // mdInputContainer.\n\t require: '^^?mdInputContainer'\n\t };\n\t\n\t function postLink(scope, element, attrs, inputContainer) {\n\t // If we are not a child of an input container, don't do anything\n\t if (!inputContainer) return;\n\t\n\t // Add our animation class\n\t element.toggleClass('md-input-messages-animation', true);\n\t\n\t // Add our md-auto-hide class to automatically hide/show messages when container is invalid\n\t element.toggleClass('md-auto-hide', true);\n\t\n\t // If we see some known visibility directives, remove the md-auto-hide class\n\t if (attrs.mdAutoHide == 'false' || hasVisibiltyDirective(attrs)) {\n\t element.toggleClass('md-auto-hide', false);\n\t }\n\t }\n\t\n\t function hasVisibiltyDirective(attrs) {\n\t return visibilityDirectives.some(function(attr) {\n\t return attrs[attr];\n\t });\n\t }\n\t}\n\t\n\tfunction ngMessageDirective($mdUtil) {\n\t return {\n\t restrict: 'EA',\n\t compile: compile,\n\t priority: 100\n\t };\n\t\n\t function compile(tElement) {\n\t if (!isInsideInputContainer(tElement)) {\n\t\n\t // When the current element is inside of a document fragment, then we need to check for an input-container\n\t // in the postLink, because the element will be later added to the DOM and is currently just in a temporary\n\t // fragment, which causes the input-container check to fail.\n\t if (isInsideFragment()) {\n\t return function (scope, element) {\n\t if (isInsideInputContainer(element)) {\n\t // Inside of the postLink function, a ngMessage directive will be a comment element, because it's\n\t // currently hidden. To access the shown element, we need to use the element from the compile function.\n\t initMessageElement(tElement);\n\t }\n\t };\n\t }\n\t } else {\n\t initMessageElement(tElement);\n\t }\n\t\n\t function isInsideFragment() {\n\t var nextNode = tElement[0];\n\t while (nextNode = nextNode.parentNode) {\n\t if (nextNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t }\n\t\n\t function isInsideInputContainer(element) {\n\t return !!$mdUtil.getClosest(element, \"md-input-container\");\n\t }\n\t\n\t function initMessageElement(element) {\n\t // Add our animation class\n\t element.toggleClass('md-input-message-animation', true);\n\t }\n\t }\n\t}\n\t\n\tvar $$AnimateRunner, $animateCss, $mdUtil, $log;\n\t\n\tfunction mdInputInvalidMessagesAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n\t saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\t\n\t return {\n\t addClass: function(element, className, done) {\n\t showInputMessages(element, done);\n\t }\n\t\n\t // NOTE: We do not need the removeClass method, because the message ng-leave animation will fire\n\t };\n\t}\n\t\n\tfunction ngMessagesAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n\t saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\t\n\t return {\n\t enter: function(element, done) {\n\t showInputMessages(element, done);\n\t },\n\t\n\t leave: function(element, done) {\n\t hideInputMessages(element, done);\n\t },\n\t\n\t addClass: function(element, className, done) {\n\t if (className == \"ng-hide\") {\n\t hideInputMessages(element, done);\n\t } else {\n\t done();\n\t }\n\t },\n\t\n\t removeClass: function(element, className, done) {\n\t if (className == \"ng-hide\") {\n\t showInputMessages(element, done);\n\t } else {\n\t done();\n\t }\n\t }\n\t };\n\t}\n\t\n\tfunction ngMessageAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n\t saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\t\n\t return {\n\t enter: function(element, done) {\n\t var animator = showMessage(element);\n\t\n\t animator.start().done(done);\n\t },\n\t\n\t leave: function(element, done) {\n\t var animator = hideMessage(element);\n\t\n\t animator.start().done(done);\n\t }\n\t };\n\t}\n\t\n\tfunction showInputMessages(element, done) {\n\t var animators = [], animator;\n\t var messages = getMessagesElement(element);\n\t var children = messages.children();\n\t\n\t if (messages.length == 0 || children.length == 0) {\n\t $log.warn('mdInput messages show animation called on invalid messages element: ', element);\n\t done();\n\t return;\n\t }\n\t\n\t angular.forEach(children, function(child) {\n\t animator = showMessage(angular.element(child));\n\t\n\t animators.push(animator.start());\n\t });\n\t\n\t $$AnimateRunner.all(animators, done);\n\t}\n\t\n\tfunction hideInputMessages(element, done) {\n\t var animators = [], animator;\n\t var messages = getMessagesElement(element);\n\t var children = messages.children();\n\t\n\t if (messages.length == 0 || children.length == 0) {\n\t $log.warn('mdInput messages hide animation called on invalid messages element: ', element);\n\t done();\n\t return;\n\t }\n\t\n\t angular.forEach(children, function(child) {\n\t animator = hideMessage(angular.element(child));\n\t\n\t animators.push(animator.start());\n\t });\n\t\n\t $$AnimateRunner.all(animators, done);\n\t}\n\t\n\tfunction showMessage(element) {\n\t var height = parseInt(window.getComputedStyle(element[0]).height);\n\t var topMargin = parseInt(window.getComputedStyle(element[0]).marginTop);\n\t\n\t var messages = getMessagesElement(element);\n\t var container = getInputElement(element);\n\t\n\t // Check to see if the message is already visible so we can skip\n\t var alreadyVisible = (topMargin > -height);\n\t\n\t // If we have the md-auto-hide class, the md-input-invalid animation will fire, so we can skip\n\t if (alreadyVisible || (messages.hasClass('md-auto-hide') && !container.hasClass('md-input-invalid'))) {\n\t return $animateCss(element, {});\n\t }\n\t\n\t return $animateCss(element, {\n\t event: 'enter',\n\t structural: true,\n\t from: {\"opacity\": 0, \"margin-top\": -height + \"px\"},\n\t to: {\"opacity\": 1, \"margin-top\": \"0\"},\n\t duration: 0.3\n\t });\n\t}\n\t\n\tfunction hideMessage(element) {\n\t var height = element[0].offsetHeight;\n\t var styles = window.getComputedStyle(element[0]);\n\t\n\t // If we are already hidden, just return an empty animation\n\t if (parseInt(styles.opacity) === 0) {\n\t return $animateCss(element, {});\n\t }\n\t\n\t // Otherwise, animate\n\t return $animateCss(element, {\n\t event: 'leave',\n\t structural: true,\n\t from: {\"opacity\": 1, \"margin-top\": 0},\n\t to: {\"opacity\": 0, \"margin-top\": -height + \"px\"},\n\t duration: 0.3\n\t });\n\t}\n\t\n\tfunction getInputElement(element) {\n\t var inputContainer = element.controller('mdInputContainer');\n\t\n\t return inputContainer.element;\n\t}\n\t\n\tfunction getMessagesElement(element) {\n\t // If we ARE the messages element, just return ourself\n\t if (element.hasClass('md-input-messages-animation')) {\n\t return element;\n\t }\n\t\n\t // If we are a ng-message element, we need to traverse up the DOM tree\n\t if (element.hasClass('md-input-message-animation')) {\n\t return angular.element($mdUtil.getClosest(element, function(node) {\n\t return node.classList.contains('md-input-messages-animation');\n\t }));\n\t }\n\t\n\t // Otherwise, we can traverse down\n\t return angular.element(element[0].querySelector('.md-input-messages-animation'));\n\t}\n\t\n\tfunction saveSharedServices(_$$AnimateRunner_, _$animateCss_, _$mdUtil_, _$log_) {\n\t $$AnimateRunner = _$$AnimateRunner_;\n\t $animateCss = _$animateCss_;\n\t $mdUtil = _$mdUtil_;\n\t $log = _$log_;\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.list\n\t * @description\n\t * List module\n\t */\n\tMdListController.$inject = [\"$scope\", \"$element\", \"$mdListInkRipple\"];\n\tmdListDirective.$inject = [\"$mdTheming\"];\n\tmdListItemDirective.$inject = [\"$mdAria\", \"$mdConstant\", \"$mdUtil\", \"$timeout\"];\n\tangular.module('material.components.list', [\n\t 'material.core'\n\t])\n\t .controller('MdListController', MdListController)\n\t .directive('mdList', mdListDirective)\n\t .directive('mdListItem', mdListItemDirective);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdList\n\t * @module material.components.list\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * The `` directive is a list container for 1..n `` tags.\n\t *\n\t * @usage\n\t * \n\t * \n\t * \n\t * \n\t *
\n\t *

{{item.title}}

\n\t *

{{item.description}}

\n\t *
\n\t *
\n\t *
\n\t *
\n\t */\n\t\n\tfunction mdListDirective($mdTheming) {\n\t return {\n\t restrict: 'E',\n\t compile: function(tEl) {\n\t tEl[0].setAttribute('role', 'list');\n\t return $mdTheming;\n\t }\n\t };\n\t}\n\t/**\n\t * @ngdoc directive\n\t * @name mdListItem\n\t * @module material.components.list\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * A `md-list-item` element can be used to represent some information in a row.
\n\t *\n\t * @usage\n\t * ### Single Row Item\n\t * \n\t * \n\t * Single Row Item\n\t * \n\t * \n\t *\n\t * ### Multiple Lines\n\t * By using the following markup, you will be able to have two lines inside of one `md-list-item`.\n\t *\n\t * \n\t * \n\t *
\n\t *

First Line

\n\t *

Second Line

\n\t *
\n\t *
\n\t *
\n\t *\n\t * It is also possible to have three lines inside of one list item.\n\t *\n\t * \n\t * \n\t *
\n\t *

First Line

\n\t *

Second Line

\n\t *

Third Line

\n\t *
\n\t *
\n\t *
\n\t *\n\t * ### Secondary Items\n\t * Secondary items are elements which will be aligned at the end of the `md-list-item`.\n\t *\n\t * \n\t * \n\t * Single Row Item\n\t * \n\t * Secondary Button\n\t * \n\t * \n\t * \n\t *\n\t * It also possible to have multiple secondary items inside of one `md-list-item`.\n\t *\n\t * \n\t * \n\t * Single Row Item\n\t * First Button\n\t * Second Button\n\t * \n\t * \n\t *\n\t * ### Proxy Item\n\t * Proxies are elements, which will execute their specific action on click
\n\t * Currently supported proxy items are\n\t * - `md-checkbox` (Toggle)\n\t * - `md-switch` (Toggle)\n\t * - `md-menu` (Open)\n\t *\n\t * This means, when using a supported proxy item inside of `md-list-item`, the list item will\n\t * automatically become clickable and executes the associated action of the proxy element on click.\n\t *\n\t * It is possible to disable this behavior by applying the `md-no-proxy` class to the list item.\n\t *\n\t * \n\t * \n\t * No Proxy List\n\t * \n\t * \n\t * \n\t *\n\t * Here are a few examples of proxy elements inside of a list item.\n\t *\n\t * \n\t * \n\t * First Line\n\t * \n\t * \n\t * \n\t *\n\t * The `md-checkbox` element will be automatically detected as a proxy element and will toggle on click.\n\t *\n\t * \n\t * \n\t * First Line\n\t * \n\t * \n\t * \n\t *\n\t * The recognized `md-switch` will toggle its state, when the user clicks on the `md-list-item`.\n\t *\n\t * It is also possible to have a `md-menu` inside of a `md-list-item`.\n\t * \n\t * \n\t *

Click anywhere to fire the secondary action

\n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * \n\t * Redial\n\t * \n\t * \n\t * \n\t * \n\t * Check voicemail\n\t * \n\t * \n\t * \n\t * \n\t * \n\t * Notifications\n\t * \n\t * \n\t * \n\t * \n\t *
\n\t *
\n\t *\n\t * The menu will automatically open, when the users clicks on the `md-list-item`.
\n\t *\n\t * If the developer didn't specify any position mode on the menu, the `md-list-item` will automatically detect the\n\t * position mode and applies it to the `md-menu`.\n\t *\n\t * ### Avatars\n\t * Sometimes you may want to have some avatars inside of the `md-list-item `.
\n\t * You are able to create a optimized icon for the list item, by applying the `.md-avatar` class on the `` element.\n\t *\n\t * \n\t * \n\t * \n\t * Alan Turing\n\t * \n\t *\n\t * When using `` for an avatar, you have to use the `.md-avatar-icon` class.\n\t * \n\t * \n\t * \n\t * Timothy Kopra\n\t * \n\t * \n\t *\n\t * In cases, you have a `md-list-item`, which doesn't have any avatar,\n\t * but you want to align it with the other avatar items, you have to use the `.md-offset` class.\n\t *\n\t * \n\t * \n\t * Jon Doe\n\t * \n\t * \n\t *\n\t * ### DOM modification\n\t * The `md-list-item` component automatically detects if the list item should be clickable.\n\t *\n\t * ---\n\t * If the `md-list-item` is clickable, we wrap all content inside of a `
` and create\n\t * an overlaying button, which will will execute the given actions (like `ng-href`, `ng-click`)\n\t *\n\t * We create an overlaying button, instead of wrapping all content inside of the button,\n\t * because otherwise some elements may not be clickable inside of the button.\n\t *\n\t * ---\n\t * When using a secondary item inside of your list item, the `md-list-item` component will automatically create\n\t * a secondary container at the end of the `md-list-item`, which contains all secondary items.\n\t *\n\t * The secondary item container is not static, because otherwise the overflow will not work properly on the\n\t * list item.\n\t *\n\t */\n\tfunction mdListItemDirective($mdAria, $mdConstant, $mdUtil, $timeout) {\n\t var proxiedTypes = ['md-checkbox', 'md-switch', 'md-menu'];\n\t return {\n\t restrict: 'E',\n\t controller: 'MdListController',\n\t compile: function(tEl, tAttrs) {\n\t\n\t // Check for proxy controls (no ng-click on parent, and a control inside)\n\t var secondaryItems = tEl[0].querySelectorAll('.md-secondary');\n\t var hasProxiedElement;\n\t var proxyElement;\n\t var itemContainer = tEl;\n\t\n\t tEl[0].setAttribute('role', 'listitem');\n\t\n\t if (tAttrs.ngClick || tAttrs.ngDblclick || tAttrs.ngHref || tAttrs.href || tAttrs.uiSref || tAttrs.ngAttrUiSref) {\n\t wrapIn('button');\n\t } else if (!tEl.hasClass('md-no-proxy')) {\n\t\n\t for (var i = 0, type; type = proxiedTypes[i]; ++i) {\n\t if (proxyElement = tEl[0].querySelector(type)) {\n\t hasProxiedElement = true;\n\t break;\n\t }\n\t }\n\t\n\t if (hasProxiedElement) {\n\t wrapIn('div');\n\t } else {\n\t tEl.addClass('md-no-proxy');\n\t }\n\t\n\t }\n\t\n\t wrapSecondaryItems();\n\t setupToggleAria();\n\t\n\t if (hasProxiedElement && proxyElement.nodeName === \"MD-MENU\") {\n\t setupProxiedMenu();\n\t }\n\t\n\t function setupToggleAria() {\n\t var toggleTypes = ['md-switch', 'md-checkbox'];\n\t var toggle;\n\t\n\t for (var i = 0, toggleType; toggleType = toggleTypes[i]; ++i) {\n\t if (toggle = tEl.find(toggleType)[0]) {\n\t if (!toggle.hasAttribute('aria-label')) {\n\t var p = tEl.find('p')[0];\n\t if (!p) return;\n\t toggle.setAttribute('aria-label', 'Toggle ' + p.textContent);\n\t }\n\t }\n\t }\n\t }\n\t\n\t function setupProxiedMenu() {\n\t var menuEl = angular.element(proxyElement);\n\t\n\t var isEndAligned = menuEl.parent().hasClass('md-secondary-container') ||\n\t proxyElement.parentNode.firstElementChild !== proxyElement;\n\t\n\t var xAxisPosition = 'left';\n\t\n\t if (isEndAligned) {\n\t // When the proxy item is aligned at the end of the list, we have to set the origin to the end.\n\t xAxisPosition = 'right';\n\t }\n\t\n\t // Set the position mode / origin of the proxied menu.\n\t if (!menuEl.attr('md-position-mode')) {\n\t menuEl.attr('md-position-mode', xAxisPosition + ' target');\n\t }\n\t\n\t // Apply menu open binding to menu button\n\t var menuOpenButton = menuEl.children().eq(0);\n\t if (!hasClickEvent(menuOpenButton[0])) {\n\t menuOpenButton.attr('ng-click', '$mdMenu.open($event)');\n\t }\n\t\n\t if (!menuOpenButton.attr('aria-label')) {\n\t menuOpenButton.attr('aria-label', 'Open List Menu');\n\t }\n\t }\n\t\n\t function wrapIn(type) {\n\t if (type == 'div') {\n\t itemContainer = angular.element('
');\n\t itemContainer.append(tEl.contents());\n\t tEl.addClass('md-proxy-focus');\n\t } else {\n\t // Element which holds the default list-item content.\n\t itemContainer = angular.element(\n\t '
'+\n\t '
'+\n\t '
'\n\t );\n\t\n\t // Button which shows ripple and executes primary action.\n\t var buttonWrap = angular.element(\n\t ''\n\t );\n\t\n\t copyAttributes(tEl[0], buttonWrap[0]);\n\t\n\t // If there is no aria-label set on the button (previously copied over if present)\n\t // we determine the label from the content and copy it to the button.\n\t if (!buttonWrap.attr('aria-label')) {\n\t buttonWrap.attr('aria-label', $mdAria.getText(tEl));\n\t }\n\t\n\t // We allow developers to specify the `md-no-focus` class, to disable the focus style\n\t // on the button executor. Once more classes should be forwarded, we should probably make the\n\t // class forward more generic.\n\t if (tEl.hasClass('md-no-focus')) {\n\t buttonWrap.addClass('md-no-focus');\n\t }\n\t\n\t // Append the button wrap before our list-item content, because it will overlay in relative.\n\t itemContainer.prepend(buttonWrap);\n\t itemContainer.children().eq(1).append(tEl.contents());\n\t\n\t tEl.addClass('_md-button-wrap');\n\t }\n\t\n\t tEl[0].setAttribute('tabindex', '-1');\n\t tEl.append(itemContainer);\n\t }\n\t\n\t function wrapSecondaryItems() {\n\t var secondaryItemsWrapper = angular.element('
');\n\t\n\t angular.forEach(secondaryItems, function(secondaryItem) {\n\t wrapSecondaryItem(secondaryItem, secondaryItemsWrapper);\n\t });\n\t\n\t itemContainer.append(secondaryItemsWrapper);\n\t }\n\t\n\t function wrapSecondaryItem(secondaryItem, container) {\n\t // If the current secondary item is not a button, but contains a ng-click attribute,\n\t // the secondary item will be automatically wrapped inside of a button.\n\t if (secondaryItem && !isButton(secondaryItem) && secondaryItem.hasAttribute('ng-click')) {\n\t\n\t $mdAria.expect(secondaryItem, 'aria-label');\n\t var buttonWrapper = angular.element('');\n\t\n\t // Copy the attributes from the secondary item to the generated button.\n\t // We also support some additional attributes from the secondary item,\n\t // because some developers may use a ngIf, ngHide, ngShow on their item.\n\t copyAttributes(secondaryItem, buttonWrapper[0], ['ng-if', 'ng-hide', 'ng-show']);\n\t\n\t secondaryItem.setAttribute('tabindex', '-1');\n\t buttonWrapper.append(secondaryItem);\n\t\n\t secondaryItem = buttonWrapper[0];\n\t }\n\t\n\t if (secondaryItem && (!hasClickEvent(secondaryItem) || (!tAttrs.ngClick && isProxiedElement(secondaryItem)))) {\n\t // In this case we remove the secondary class, so we can identify it later, when we searching for the\n\t // proxy items.\n\t angular.element(secondaryItem).removeClass('md-secondary');\n\t }\n\t\n\t tEl.addClass('md-with-secondary');\n\t container.append(secondaryItem);\n\t }\n\t\n\t /**\n\t * Copies attributes from a source element to the destination element\n\t * By default the function will copy the most necessary attributes, supported\n\t * by the button executor for clickable list items.\n\t * @param source Element with the specified attributes\n\t * @param destination Element which will retrieve the attributes\n\t * @param extraAttrs Additional attributes, which will be copied over.\n\t */\n\t function copyAttributes(source, destination, extraAttrs) {\n\t var copiedAttrs = $mdUtil.prefixer([\n\t 'ng-if', 'ng-click', 'ng-dblclick', 'aria-label', 'ng-disabled', 'ui-sref',\n\t 'href', 'ng-href', 'target', 'ng-attr-ui-sref', 'ui-sref-opts'\n\t ]);\n\t\n\t if (extraAttrs) {\n\t copiedAttrs = copiedAttrs.concat($mdUtil.prefixer(extraAttrs));\n\t }\n\t\n\t angular.forEach(copiedAttrs, function(attr) {\n\t if (source.hasAttribute(attr)) {\n\t destination.setAttribute(attr, source.getAttribute(attr));\n\t source.removeAttribute(attr);\n\t }\n\t });\n\t }\n\t\n\t function isProxiedElement(el) {\n\t return proxiedTypes.indexOf(el.nodeName.toLowerCase()) != -1;\n\t }\n\t\n\t function isButton(el) {\n\t var nodeName = el.nodeName.toUpperCase();\n\t\n\t return nodeName == \"MD-BUTTON\" || nodeName == \"BUTTON\";\n\t }\n\t\n\t function hasClickEvent (element) {\n\t var attr = element.attributes;\n\t for (var i = 0; i < attr.length; i++) {\n\t if (tAttrs.$normalize(attr[i].name) === 'ngClick') return true;\n\t }\n\t return false;\n\t }\n\t\n\t return postLink;\n\t\n\t function postLink($scope, $element, $attr, ctrl) {\n\t $element.addClass('_md'); // private md component indicator for styling\n\t\n\t var proxies = [],\n\t firstElement = $element[0].firstElementChild,\n\t isButtonWrap = $element.hasClass('_md-button-wrap'),\n\t clickChild = isButtonWrap ? firstElement.firstElementChild : firstElement,\n\t hasClick = clickChild && hasClickEvent(clickChild),\n\t noProxies = $element.hasClass('md-no-proxy');\n\t\n\t computeProxies();\n\t computeClickable();\n\t\n\t if (proxies.length) {\n\t angular.forEach(proxies, function(proxy) {\n\t proxy = angular.element(proxy);\n\t\n\t $scope.mouseActive = false;\n\t proxy.on('mousedown', function() {\n\t $scope.mouseActive = true;\n\t $timeout(function(){\n\t $scope.mouseActive = false;\n\t }, 100);\n\t })\n\t .on('focus', function() {\n\t if ($scope.mouseActive === false) { $element.addClass('md-focused'); }\n\t proxy.on('blur', function proxyOnBlur() {\n\t $element.removeClass('md-focused');\n\t proxy.off('blur', proxyOnBlur);\n\t });\n\t });\n\t });\n\t }\n\t\n\t\n\t function computeProxies() {\n\t\n\t if (firstElement && firstElement.children && !hasClick && !noProxies) {\n\t\n\t angular.forEach(proxiedTypes, function(type) {\n\t\n\t // All elements which are not capable for being used a proxy have the .md-secondary class\n\t // applied. These items had been sorted out in the secondary wrap function.\n\t angular.forEach(firstElement.querySelectorAll(type + ':not(.md-secondary)'), function(child) {\n\t proxies.push(child);\n\t });\n\t });\n\t\n\t }\n\t }\n\t\n\t function computeClickable() {\n\t if (proxies.length == 1 || hasClick) {\n\t $element.addClass('md-clickable');\n\t\n\t if (!hasClick) {\n\t ctrl.attachRipple($scope, angular.element($element[0].querySelector('.md-no-style')));\n\t }\n\t }\n\t }\n\t\n\t function isEventFromControl(event) {\n\t var forbiddenControls = ['md-slider'];\n\t\n\t // If there is no path property in the event, then we can assume that the event was not bubbled.\n\t if (!event.path) {\n\t return forbiddenControls.indexOf(event.target.tagName.toLowerCase()) !== -1;\n\t }\n\t\n\t // We iterate the event path up and check for a possible component.\n\t // Our maximum index to search, is the list item root.\n\t var maxPath = event.path.indexOf($element.children()[0]);\n\t\n\t for (var i = 0; i < maxPath; i++) {\n\t if (forbiddenControls.indexOf(event.path[i].tagName.toLowerCase()) !== -1) {\n\t return true;\n\t }\n\t }\n\t }\n\t\n\t var clickChildKeypressListener = function(e) {\n\t if (e.target.nodeName != 'INPUT' && e.target.nodeName != 'TEXTAREA' && !e.target.isContentEditable) {\n\t var keyCode = e.which || e.keyCode;\n\t if (keyCode == $mdConstant.KEY_CODE.SPACE) {\n\t if (clickChild) {\n\t clickChild.click();\n\t e.preventDefault();\n\t e.stopPropagation();\n\t }\n\t }\n\t }\n\t };\n\t\n\t if (!hasClick && !proxies.length) {\n\t clickChild && clickChild.addEventListener('keypress', clickChildKeypressListener);\n\t }\n\t\n\t $element.off('click');\n\t $element.off('keypress');\n\t\n\t if (proxies.length == 1 && clickChild) {\n\t $element.children().eq(0).on('click', function(e) {\n\t // When the event is coming from an control and it should not trigger the proxied element\n\t // then we are skipping.\n\t if (isEventFromControl(e)) return;\n\t\n\t var parentButton = $mdUtil.getClosest(e.target, 'BUTTON');\n\t if (!parentButton && clickChild.contains(e.target)) {\n\t angular.forEach(proxies, function(proxy) {\n\t if (e.target !== proxy && !proxy.contains(e.target)) {\n\t if (proxy.nodeName === 'MD-MENU') {\n\t proxy = proxy.children[0];\n\t }\n\t angular.element(proxy).triggerHandler('click');\n\t }\n\t });\n\t }\n\t });\n\t }\n\t\n\t $scope.$on('$destroy', function () {\n\t clickChild && clickChild.removeEventListener('keypress', clickChildKeypressListener);\n\t });\n\t }\n\t }\n\t };\n\t}\n\t\n\t/*\n\t * @private\n\t * @ngdoc controller\n\t * @name MdListController\n\t * @module material.components.list\n\t *\n\t */\n\tfunction MdListController($scope, $element, $mdListInkRipple) {\n\t var ctrl = this;\n\t ctrl.attachRipple = attachRipple;\n\t\n\t function attachRipple (scope, element) {\n\t var options = {};\n\t $mdListInkRipple.attach(scope, element, options);\n\t }\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.menu\n\t */\n\t\n\tangular.module('material.components.menu', [\n\t 'material.core',\n\t 'material.components.backdrop'\n\t]);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.menuBar\n\t */\n\t\n\tangular.module('material.components.menuBar', [\n\t 'material.core',\n\t 'material.components.icon',\n\t 'material.components.menu'\n\t]);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.navBar\n\t */\n\t\n\t\n\tMdNavBarController.$inject = [\"$element\", \"$scope\", \"$timeout\", \"$mdConstant\"];\n\tMdNavItem.$inject = [\"$mdAria\", \"$$rAF\"];\n\tMdNavItemController.$inject = [\"$element\"];\n\tMdNavBar.$inject = [\"$mdAria\", \"$mdTheming\"];\n\tangular.module('material.components.navBar', ['material.core'])\n\t .controller('MdNavBarController', MdNavBarController)\n\t .directive('mdNavBar', MdNavBar)\n\t .controller('MdNavItemController', MdNavItemController)\n\t .directive('mdNavItem', MdNavItem);\n\t\n\t\n\t/*****************************************************************************\n\t * PUBLIC DOCUMENTATION *\n\t *****************************************************************************/\n\t/**\n\t * @ngdoc directive\n\t * @name mdNavBar\n\t * @module material.components.navBar\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * The `` directive renders a list of material tabs that can be used\n\t * for top-level page navigation. Unlike ``, it has no concept of a tab\n\t * body and no bar pagination.\n\t *\n\t * Because it deals with page navigation, certain routing concepts are built-in.\n\t * Route changes via via ng-href, ui-sref, or ng-click events are supported.\n\t * Alternatively, the user could simply watch currentNavItem for changes.\n\t *\n\t * Accessibility functionality is implemented as a site navigator with a\n\t * listbox, according to\n\t * https://www.w3.org/TR/wai-aria-practices/#Site_Navigator_Tabbed_Style\n\t *\n\t * @param {string=} mdSelectedNavItem The name of the current tab; this must\n\t * match the name attribute of ``\n\t * @param {boolean=} mdNoInkBar If set to true, the ink bar will be hidden.\n\t * @param {string=} navBarAriaLabel An aria-label for the nav-bar\n\t *\n\t * @usage\n\t * \n\t * \n\t * \n\t * Page One\n\t * \n\t * Page Two\n\t * Page Three\n\t * \n\t * Page Four\n\t * \n\t * \n\t *\n\t * \n\t * (function() {\n\t * 'use strict';\n\t *\n\t * $rootScope.$on('$routeChangeSuccess', function(event, current) {\n\t * $scope.currentLink = getCurrentLinkFromRoute(current);\n\t * });\n\t * });\n\t * \n\t */\n\t\n\t/*****************************************************************************\n\t * mdNavItem\n\t *****************************************************************************/\n\t/**\n\t * @ngdoc directive\n\t * @name mdNavItem\n\t * @module material.components.navBar\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * `` describes a page navigation link within the ``\n\t * component. It renders an md-button as the actual link.\n\t *\n\t * Exactly one of the mdNavClick, mdNavHref, mdNavSref attributes are required\n\t * to be specified.\n\t *\n\t * @param {Function=} mdNavClick Function which will be called when the\n\t * link is clicked to change the page. Renders as an `ng-click`.\n\t * @param {string=} mdNavHref url to transition to when this link is clicked.\n\t * Renders as an `ng-href`.\n\t * @param {string=} mdNavSref Ui-router state to transition to when this link is\n\t * clicked. Renders as a `ui-sref`.\n\t * @param {!Object=} srefOpts Ui-router options that are passed to the\n\t * `$state.go()` function. See the [Ui-router documentation for details]\n\t * (https://ui-router.github.io/docs/latest/interfaces/transition.transitionoptions.html).\n\t * @param {string=} name The name of this link. Used by the nav bar to know\n\t * which link is currently selected.\n\t * @param {string=} aria-label Adds alternative text for accessibility\n\t *\n\t * @usage\n\t * See `` for usage.\n\t */\n\t\n\t\n\t/*****************************************************************************\n\t * IMPLEMENTATION *\n\t *****************************************************************************/\n\t\n\tfunction MdNavBar($mdAria, $mdTheming) {\n\t return {\n\t restrict: 'E',\n\t transclude: true,\n\t controller: MdNavBarController,\n\t controllerAs: 'ctrl',\n\t bindToController: true,\n\t scope: {\n\t 'mdSelectedNavItem': '=?',\n\t 'mdNoInkBar': '=?',\n\t 'navBarAriaLabel': '@?',\n\t },\n\t template:\n\t '
' +\n\t '' +\n\t '' +\n\t '
',\n\t link: function(scope, element, attrs, ctrl) {\n\t $mdTheming(element);\n\t if (!ctrl.navBarAriaLabel) {\n\t $mdAria.expectAsync(element, 'aria-label', angular.noop);\n\t }\n\t },\n\t };\n\t}\n\t\n\t/**\n\t * Controller for the nav-bar component.\n\t *\n\t * Accessibility functionality is implemented as a site navigator with a\n\t * listbox, according to\n\t * https://www.w3.org/TR/wai-aria-practices/#Site_Navigator_Tabbed_Style\n\t * @param {!angular.JQLite} $element\n\t * @param {!angular.Scope} $scope\n\t * @param {!angular.Timeout} $timeout\n\t * @param {!Object} $mdConstant\n\t * @constructor\n\t * @final\n\t * @ngInject\n\t */\n\tfunction MdNavBarController($element, $scope, $timeout, $mdConstant) {\n\t // Injected variables\n\t /** @private @const {!angular.Timeout} */\n\t this._$timeout = $timeout;\n\t\n\t /** @private @const {!angular.Scope} */\n\t this._$scope = $scope;\n\t\n\t /** @private @const {!Object} */\n\t this._$mdConstant = $mdConstant;\n\t\n\t // Data-bound variables.\n\t /** @type {string} */\n\t this.mdSelectedNavItem;\n\t\n\t /** @type {string} */\n\t this.navBarAriaLabel;\n\t\n\t // State variables.\n\t\n\t /** @type {?angular.JQLite} */\n\t this._navBarEl = $element[0];\n\t\n\t /** @type {?angular.JQLite} */\n\t this._inkbar;\n\t\n\t var self = this;\n\t // need to wait for transcluded content to be available\n\t var deregisterTabWatch = this._$scope.$watch(function() {\n\t return self._navBarEl.querySelectorAll('._md-nav-button').length;\n\t },\n\t function(newLength) {\n\t if (newLength > 0) {\n\t self._initTabs();\n\t deregisterTabWatch();\n\t }\n\t });\n\t}\n\t\n\t\n\t\n\t/**\n\t * Initializes the tab components once they exist.\n\t * @private\n\t */\n\tMdNavBarController.prototype._initTabs = function() {\n\t this._inkbar = angular.element(this._navBarEl.querySelector('md-nav-ink-bar'));\n\t\n\t var self = this;\n\t this._$timeout(function() {\n\t self._updateTabs(self.mdSelectedNavItem, undefined);\n\t });\n\t\n\t this._$scope.$watch('ctrl.mdSelectedNavItem', function(newValue, oldValue) {\n\t // Wait a digest before update tabs for products doing\n\t // anything dynamic in the template.\n\t self._$timeout(function() {\n\t self._updateTabs(newValue, oldValue);\n\t });\n\t });\n\t};\n\t\n\t/**\n\t * Set the current tab to be selected.\n\t * @param {string|undefined} newValue New current tab name.\n\t * @param {string|undefined} oldValue Previous tab name.\n\t * @private\n\t */\n\tMdNavBarController.prototype._updateTabs = function(newValue, oldValue) {\n\t var self = this;\n\t var tabs = this._getTabs();\n\t\n\t // this._getTabs can return null if nav-bar has not yet been initialized\n\t if(!tabs)\n\t return;\n\t\n\t var oldIndex = -1;\n\t var newIndex = -1;\n\t var newTab = this._getTabByName(newValue);\n\t var oldTab = this._getTabByName(oldValue);\n\t\n\t if (oldTab) {\n\t oldTab.setSelected(false);\n\t oldIndex = tabs.indexOf(oldTab);\n\t }\n\t\n\t if (newTab) {\n\t newTab.setSelected(true);\n\t newIndex = tabs.indexOf(newTab);\n\t }\n\t\n\t this._$timeout(function() {\n\t self._updateInkBarStyles(newTab, newIndex, oldIndex);\n\t });\n\t};\n\t\n\t/**\n\t * Repositions the ink bar to the selected tab.\n\t * @private\n\t */\n\tMdNavBarController.prototype._updateInkBarStyles = function(tab, newIndex, oldIndex) {\n\t this._inkbar.toggleClass('_md-left', newIndex < oldIndex)\n\t .toggleClass('_md-right', newIndex > oldIndex);\n\t\n\t this._inkbar.css({display: newIndex < 0 ? 'none' : ''});\n\t\n\t if (tab) {\n\t var tabEl = tab.getButtonEl();\n\t var left = tabEl.offsetLeft;\n\t\n\t this._inkbar.css({left: left + 'px', width: tabEl.offsetWidth + 'px'});\n\t }\n\t};\n\t\n\t/**\n\t * Returns an array of the current tabs.\n\t * @return {!Array}\n\t * @private\n\t */\n\tMdNavBarController.prototype._getTabs = function() {\n\t var controllers = Array.prototype.slice.call(\n\t this._navBarEl.querySelectorAll('.md-nav-item'))\n\t .map(function(el) {\n\t return angular.element(el).controller('mdNavItem')\n\t });\n\t return controllers.indexOf(undefined) ? controllers : null;\n\t};\n\t\n\t/**\n\t * Returns the tab with the specified name.\n\t * @param {string} name The name of the tab, found in its name attribute.\n\t * @return {!NavItemController|undefined}\n\t * @private\n\t */\n\tMdNavBarController.prototype._getTabByName = function(name) {\n\t return this._findTab(function(tab) {\n\t return tab.getName() == name;\n\t });\n\t};\n\t\n\t/**\n\t * Returns the selected tab.\n\t * @return {!NavItemController|undefined}\n\t * @private\n\t */\n\tMdNavBarController.prototype._getSelectedTab = function() {\n\t return this._findTab(function(tab) {\n\t return tab.isSelected();\n\t });\n\t};\n\t\n\t/**\n\t * Returns the focused tab.\n\t * @return {!NavItemController|undefined}\n\t */\n\tMdNavBarController.prototype.getFocusedTab = function() {\n\t return this._findTab(function(tab) {\n\t return tab.hasFocus();\n\t });\n\t};\n\t\n\t/**\n\t * Find a tab that matches the specified function.\n\t * @private\n\t */\n\tMdNavBarController.prototype._findTab = function(fn) {\n\t var tabs = this._getTabs();\n\t for (var i = 0; i < tabs.length; i++) {\n\t if (fn(tabs[i])) {\n\t return tabs[i];\n\t }\n\t }\n\t\n\t return null;\n\t};\n\t\n\t/**\n\t * Direct focus to the selected tab when focus enters the nav bar.\n\t */\n\tMdNavBarController.prototype.onFocus = function() {\n\t var tab = this._getSelectedTab();\n\t if (tab) {\n\t tab.setFocused(true);\n\t }\n\t};\n\t\n\t/**\n\t * Move focus from oldTab to newTab.\n\t * @param {!NavItemController} oldTab\n\t * @param {!NavItemController} newTab\n\t * @private\n\t */\n\tMdNavBarController.prototype._moveFocus = function(oldTab, newTab) {\n\t oldTab.setFocused(false);\n\t newTab.setFocused(true);\n\t};\n\t\n\t/**\n\t * Responds to keypress events.\n\t * @param {!Event} e\n\t */\n\tMdNavBarController.prototype.onKeydown = function(e) {\n\t var keyCodes = this._$mdConstant.KEY_CODE;\n\t var tabs = this._getTabs();\n\t var focusedTab = this.getFocusedTab();\n\t if (!focusedTab) return;\n\t\n\t var focusedTabIndex = tabs.indexOf(focusedTab);\n\t\n\t // use arrow keys to navigate between tabs\n\t switch (e.keyCode) {\n\t case keyCodes.UP_ARROW:\n\t case keyCodes.LEFT_ARROW:\n\t if (focusedTabIndex > 0) {\n\t this._moveFocus(focusedTab, tabs[focusedTabIndex - 1]);\n\t }\n\t break;\n\t case keyCodes.DOWN_ARROW:\n\t case keyCodes.RIGHT_ARROW:\n\t if (focusedTabIndex < tabs.length - 1) {\n\t this._moveFocus(focusedTab, tabs[focusedTabIndex + 1]);\n\t }\n\t break;\n\t case keyCodes.SPACE:\n\t case keyCodes.ENTER:\n\t // timeout to avoid a \"digest already in progress\" console error\n\t this._$timeout(function() {\n\t focusedTab.getButtonEl().click();\n\t });\n\t break;\n\t }\n\t};\n\t\n\t/**\n\t * @ngInject\n\t */\n\tfunction MdNavItem($mdAria, $$rAF) {\n\t return {\n\t restrict: 'E',\n\t require: ['mdNavItem', '^mdNavBar'],\n\t controller: MdNavItemController,\n\t bindToController: true,\n\t controllerAs: 'ctrl',\n\t replace: true,\n\t transclude: true,\n\t template: function(tElement, tAttrs) {\n\t var hasNavClick = tAttrs.mdNavClick;\n\t var hasNavHref = tAttrs.mdNavHref;\n\t var hasNavSref = tAttrs.mdNavSref;\n\t var hasSrefOpts = tAttrs.srefOpts;\n\t var navigationAttribute;\n\t var navigationOptions;\n\t var buttonTemplate;\n\t\n\t // Cannot specify more than one nav attribute\n\t if ((hasNavClick ? 1:0) + (hasNavHref ? 1:0) + (hasNavSref ? 1:0) > 1) {\n\t throw Error(\n\t 'Must not specify more than one of the md-nav-click, md-nav-href, ' +\n\t 'or md-nav-sref attributes per nav-item directive.'\n\t );\n\t }\n\t\n\t if (hasNavClick) {\n\t navigationAttribute = 'ng-click=\"ctrl.mdNavClick()\"';\n\t } else if (hasNavHref) {\n\t navigationAttribute = 'ng-href=\"{{ctrl.mdNavHref}}\"';\n\t } else if (hasNavSref) {\n\t navigationAttribute = 'ui-sref=\"{{ctrl.mdNavSref}}\"';\n\t }\n\t\n\t navigationOptions = hasSrefOpts ? 'ui-sref-opts=\"{{ctrl.srefOpts}}\" ' : '';\n\t\n\t if (navigationAttribute) {\n\t buttonTemplate = '' +\n\t '' +\n\t '' +\n\t '';\n\t }\n\t\n\t return '' +\n\t '
  • ' +\n\t (buttonTemplate || '') +\n\t '
  • ';\n\t },\n\t scope: {\n\t 'mdNavClick': '&?',\n\t 'mdNavHref': '@?',\n\t 'mdNavSref': '@?',\n\t 'srefOpts': '=?',\n\t 'name': '@',\n\t },\n\t link: function(scope, element, attrs, controllers) {\n\t // When accessing the element's contents synchronously, they\n\t // may not be defined yet because of transclusion. There is a higher\n\t // chance that it will be accessible if we wait one frame.\n\t $$rAF(function() {\n\t var mdNavItem = controllers[0];\n\t var mdNavBar = controllers[1];\n\t var navButton = angular.element(element[0].querySelector('._md-nav-button'));\n\t\n\t if (!mdNavItem.name) {\n\t mdNavItem.name = angular.element(element[0]\n\t .querySelector('._md-nav-button-text')).text().trim();\n\t }\n\t\n\t navButton.on('click', function() {\n\t mdNavBar.mdSelectedNavItem = mdNavItem.name;\n\t scope.$apply();\n\t });\n\t\n\t $mdAria.expectWithText(element, 'aria-label');\n\t });\n\t }\n\t };\n\t}\n\t\n\t/**\n\t * Controller for the nav-item component.\n\t * @param {!angular.JQLite} $element\n\t * @constructor\n\t * @final\n\t * @ngInject\n\t */\n\tfunction MdNavItemController($element) {\n\t\n\t /** @private @const {!angular.JQLite} */\n\t this._$element = $element;\n\t\n\t // Data-bound variables\n\t\n\t /** @const {?Function} */\n\t this.mdNavClick;\n\t\n\t /** @const {?string} */\n\t this.mdNavHref;\n\t\n\t /** @const {?string} */\n\t this.mdNavSref;\n\t /** @const {?Object} */\n\t this.srefOpts;\n\t /** @const {?string} */\n\t this.name;\n\t\n\t // State variables\n\t /** @private {boolean} */\n\t this._selected = false;\n\t\n\t /** @private {boolean} */\n\t this._focused = false;\n\t}\n\t\n\t/**\n\t * Returns a map of class names and values for use by ng-class.\n\t * @return {!Object}\n\t */\n\tMdNavItemController.prototype.getNgClassMap = function() {\n\t return {\n\t 'md-active': this._selected,\n\t 'md-primary': this._selected,\n\t 'md-unselected': !this._selected,\n\t 'md-focused': this._focused,\n\t };\n\t};\n\t\n\t/**\n\t * Get the name attribute of the tab.\n\t * @return {string}\n\t */\n\tMdNavItemController.prototype.getName = function() {\n\t return this.name;\n\t};\n\t\n\t/**\n\t * Get the button element associated with the tab.\n\t * @return {!Element}\n\t */\n\tMdNavItemController.prototype.getButtonEl = function() {\n\t return this._$element[0].querySelector('._md-nav-button');\n\t};\n\t\n\t/**\n\t * Set the selected state of the tab.\n\t * @param {boolean} isSelected\n\t */\n\tMdNavItemController.prototype.setSelected = function(isSelected) {\n\t this._selected = isSelected;\n\t};\n\t\n\t/**\n\t * @return {boolean}\n\t */\n\tMdNavItemController.prototype.isSelected = function() {\n\t return this._selected;\n\t};\n\t\n\t/**\n\t * Set the focused state of the tab.\n\t * @param {boolean} isFocused\n\t */\n\tMdNavItemController.prototype.setFocused = function(isFocused) {\n\t this._focused = isFocused;\n\t\n\t if (isFocused) {\n\t this.getButtonEl().focus();\n\t }\n\t};\n\t\n\t/**\n\t * @return {boolean}\n\t */\n\tMdNavItemController.prototype.hasFocus = function() {\n\t return this._focused;\n\t};\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.progressCircular\n\t * @description Module for a circular progressbar\n\t */\n\t\n\tangular.module('material.components.progressCircular', ['material.core']);\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.panel\n\t */\n\tMdPanelService.$inject = [\"presets\", \"$rootElement\", \"$rootScope\", \"$injector\", \"$window\"];\n\tangular\n\t .module('material.components.panel', [\n\t 'material.core',\n\t 'material.components.backdrop'\n\t ])\n\t .provider('$mdPanel', MdPanelProvider);\n\t\n\t\n\t/*****************************************************************************\n\t * PUBLIC DOCUMENTATION *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdPanelProvider\n\t * @module material.components.panel\n\t *\n\t * @description\n\t * `$mdPanelProvider` allows users to create configuration presets that will be\n\t * stored within a cached presets object. When the configuration is needed, the\n\t * user can request the preset by passing it as the first parameter in the\n\t * `$mdPanel.create` or `$mdPanel.open` methods.\n\t *\n\t * @usage\n\t * \n\t * (function(angular, undefined) {\n\t * 'use strict';\n\t *\n\t * angular\n\t * .module('demoApp', ['ngMaterial'])\n\t * .config(DemoConfig)\n\t * .controller('DemoCtrl', DemoCtrl)\n\t * .controller('DemoMenuCtrl', DemoMenuCtrl);\n\t *\n\t * function DemoConfig($mdPanelProvider) {\n\t * $mdPanelProvider.definePreset('demoPreset', {\n\t * attachTo: angular.element(document.body),\n\t * controller: DemoMenuCtrl,\n\t * controllerAs: 'ctrl',\n\t * template: '' +\n\t * '
    ' +\n\t * '
    ' +\n\t * '
    ' +\n\t * ' ' +\n\t * '
    ' +\n\t * ' ' +\n\t * '
    ' +\n\t * ' ' +\n\t * '
    ' +\n\t * '
    ' +\n\t * '
    ',\n\t * panelClass: 'menu-panel-container',\n\t * focusOnOpen: false,\n\t * zIndex: 100,\n\t * propagateContainerEvents: true,\n\t * groupName: 'menus'\n\t * });\n\t * }\n\t *\n\t * function PanelProviderCtrl($mdPanel) {\n\t * this.navigation = {\n\t * name: 'navigation',\n\t * items: [\n\t * 'Home',\n\t * 'About',\n\t * 'Contact'\n\t * ]\n\t * };\n\t * this.favorites = {\n\t * name: 'favorites',\n\t * items: [\n\t * 'Add to Favorites'\n\t * ]\n\t * };\n\t * this.more = {\n\t * name: 'more',\n\t * items: [\n\t * 'Account',\n\t * 'Sign Out'\n\t * ]\n\t * };\n\t *\n\t * $mdPanel.newPanelGroup('menus', {\n\t * maxOpen: 2\n\t * });\n\t *\n\t * this.showMenu = function($event, menu) {\n\t * $mdPanel.open('demoPreset', {\n\t * id: 'menu_' + menu.name,\n\t * position: $mdPanel.newPanelPosition()\n\t * .relativeTo($event.srcElement)\n\t * .addPanelPosition(\n\t * $mdPanel.xPosition.ALIGN_START,\n\t * $mdPanel.yPosition.BELOW\n\t * ),\n\t * locals: {\n\t * items: menu.items\n\t * },\n\t * openFrom: $event\n\t * });\n\t * };\n\t * }\n\t *\n\t * function PanelMenuCtrl(mdPanelRef) {\n\t * this.closeMenu = function() {\n\t * mdPanelRef && mdPanelRef.close();\n\t * };\n\t * }\n\t * })(angular);\n\t *
    \n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdPanelProvider#definePreset\n\t * @description\n\t * Takes the passed in preset name and preset configuration object and adds it\n\t * to the `_presets` object of the provider. This `_presets` object is then\n\t * passed along to the `$mdPanel` service.\n\t *\n\t * @param {string} name Preset name.\n\t * @param {!Object} preset Specific configuration object that can contain any\n\t * and all of the parameters avaialble within the `$mdPanel.create` method.\n\t * However, parameters that pertain to id, position, animation, and user\n\t * interaction are not allowed and will be removed from the preset\n\t * configuration.\n\t */\n\t\n\t\n\t/*****************************************************************************\n\t * MdPanel Service *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdPanel\n\t * @module material.components.panel\n\t *\n\t * @description\n\t * `$mdPanel` is a robust, low-level service for creating floating panels on\n\t * the screen. It can be used to implement tooltips, dialogs, pop-ups, etc.\n\t *\n\t * @usage\n\t * \n\t * (function(angular, undefined) {\n\t * 'use strict';\n\t *\n\t * angular\n\t * .module('demoApp', ['ngMaterial'])\n\t * .controller('DemoDialogController', DialogController);\n\t *\n\t * var panelRef;\n\t *\n\t * function showPanel($event) {\n\t * var panelPosition = $mdPanel.newPanelPosition()\n\t * .absolute()\n\t * .top('50%')\n\t * .left('50%');\n\t *\n\t * var panelAnimation = $mdPanel.newPanelAnimation()\n\t * .targetEvent($event)\n\t * .defaultAnimation('md-panel-animate-fly')\n\t * .closeTo('.show-button');\n\t *\n\t * var config = {\n\t * attachTo: angular.element(document.body),\n\t * controller: DialogController,\n\t * controllerAs: 'ctrl',\n\t * position: panelPosition,\n\t * animation: panelAnimation,\n\t * targetEvent: $event,\n\t * templateUrl: 'dialog-template.html',\n\t * clickOutsideToClose: true,\n\t * escapeToClose: true,\n\t * focusOnOpen: true\n\t * }\n\t *\n\t * $mdPanel.open(config)\n\t * .then(function(result) {\n\t * panelRef = result;\n\t * });\n\t * }\n\t *\n\t * function DialogController(MdPanelRef) {\n\t * function closeDialog() {\n\t * if (MdPanelRef) MdPanelRef.close();\n\t * }\n\t * }\n\t * })(angular);\n\t * \n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdPanel#create\n\t * @description\n\t * Creates a panel with the specified options.\n\t *\n\t * @param config {!Object=} Specific configuration object that may contain the\n\t * following properties:\n\t *\n\t * - `id` - `{string=}`: An ID to track the panel by. When an ID is provided,\n\t * the created panel is added to a tracked panels object. Any subsequent\n\t * requests made to create a panel with that ID are ignored. This is useful\n\t * in having the panel service not open multiple panels from the same user\n\t * interaction when there is no backdrop and events are propagated. Defaults\n\t * to an arbitrary string that is not tracked.\n\t * - `template` - `{string=}`: HTML template to show in the panel. This\n\t * **must** be trusted HTML with respect to AngularJS’s\n\t * [$sce service](https://docs.angularjs.org/api/ng/service/$sce).\n\t * - `templateUrl` - `{string=}`: The URL that will be used as the content of\n\t * the panel.\n\t * - `contentElement` - `{(string|!angular.JQLite|!Element)=}`: Pre-compiled\n\t * element to be used as the panel's content.\n\t * - `controller` - `{(function|string)=}`: The controller to associate with\n\t * the panel. The controller can inject a reference to the returned\n\t * panelRef, which allows the panel to be closed, hidden, and shown. Any\n\t * fields passed in through locals or resolve will be bound to the\n\t * controller.\n\t * - `controllerAs` - `{string=}`: An alias to assign the controller to on\n\t * the scope.\n\t * - `bindToController` - `{boolean=}`: Binds locals to the controller\n\t * instead of passing them in. Defaults to true, as this is a best\n\t * practice.\n\t * - `locals` - `{Object=}`: An object containing key/value pairs. The keys\n\t * will be used as names of values to inject into the controller. For\n\t * example, `locals: {three: 3}` would inject `three` into the controller,\n\t * with the value 3.\n\t * - `resolve` - `{Object=}`: Similar to locals, except it takes promises as\n\t * values. The panel will not open until all of the promises resolve.\n\t * - `attachTo` - `{(string|!angular.JQLite|!Element)=}`: The element to\n\t * attach the panel to. Defaults to appending to the root element of the\n\t * application.\n\t * - `propagateContainerEvents` - `{boolean=}`: Whether pointer or touch\n\t * events should be allowed to propagate 'go through' the container, aka the\n\t * wrapper, of the panel. Defaults to false.\n\t * - `panelClass` - `{string=}`: A css class to apply to the panel element.\n\t * This class should define any borders, box-shadow, etc. for the panel.\n\t * - `zIndex` - `{number=}`: The z-index to place the panel at.\n\t * Defaults to 80.\n\t * - `position` - `{MdPanelPosition=}`: An MdPanelPosition object that\n\t * specifies the alignment of the panel. For more information, see\n\t * `MdPanelPosition`.\n\t * - `clickOutsideToClose` - `{boolean=}`: Whether the user can click\n\t * outside the panel to close it. Defaults to false.\n\t * - `escapeToClose` - `{boolean=}`: Whether the user can press escape to\n\t * close the panel. Defaults to false.\n\t * - `onCloseSuccess` - `{function(!panelRef, string)=}`: Function that is\n\t * called after the close successfully finishes. The first parameter passed\n\t * into this function is the current panelRef and the 2nd is an optional\n\t * string explaining the close reason. The currently supported closeReasons\n\t * can be found in the MdPanelRef.closeReasons enum. These are by default\n\t * passed along by the panel.\n\t * - `trapFocus` - `{boolean=}`: Whether focus should be trapped within the\n\t * panel. If `trapFocus` is true, the user will not be able to interact\n\t * with the rest of the page until the panel is dismissed. Defaults to\n\t * false.\n\t * - `focusOnOpen` - `{boolean=}`: An option to override focus behavior on\n\t * open. Only disable if focusing some other way, as focus management is\n\t * required for panels to be accessible. Defaults to true.\n\t * - `fullscreen` - `{boolean=}`: Whether the panel should be full screen.\n\t * Applies the class `._md-panel-fullscreen` to the panel on open. Defaults\n\t * to false.\n\t * - `animation` - `{MdPanelAnimation=}`: An MdPanelAnimation object that\n\t * specifies the animation of the panel. For more information, see\n\t * `MdPanelAnimation`.\n\t * - `hasBackdrop` - `{boolean=}`: Whether there should be an opaque backdrop\n\t * behind the panel. Defaults to false.\n\t * - `disableParentScroll` - `{boolean=}`: Whether the user can scroll the\n\t * page behind the panel. Defaults to false.\n\t * - `onDomAdded` - `{function=}`: Callback function used to announce when\n\t * the panel is added to the DOM.\n\t * - `onOpenComplete` - `{function=}`: Callback function used to announce\n\t * when the open() action is finished.\n\t * - `onRemoving` - `{function=}`: Callback function used to announce the\n\t * close/hide() action is starting.\n\t * - `onDomRemoved` - `{function=}`: Callback function used to announce when\n\t * the panel is removed from the DOM.\n\t * - `origin` - `{(string|!angular.JQLite|!Element)=}`: The element to focus\n\t * on when the panel closes. This is commonly the element which triggered\n\t * the opening of the panel. If you do not use `origin`, you need to control\n\t * the focus manually.\n\t * - `groupName` - `{(string|!Array)=}`: A group name or an array of\n\t * group names. The group name is used for creating a group of panels. The\n\t * group is used for configuring the number of open panels and identifying\n\t * specific behaviors for groups. For instance, all tooltips could be\n\t * identified using the same groupName.\n\t *\n\t * @returns {!MdPanelRef} panelRef\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdPanel#open\n\t * @description\n\t * Calls the create method above, then opens the panel. This is a shortcut for\n\t * creating and then calling open manually. If custom methods need to be\n\t * called when the panel is added to the DOM or opened, do not use this method.\n\t * Instead create the panel, chain promises on the domAdded and openComplete\n\t * methods, and call open from the returned panelRef.\n\t *\n\t * @param {!Object=} config Specific configuration object that may contain\n\t * the properties defined in `$mdPanel.create`.\n\t * @returns {!angular.$q.Promise} panelRef A promise that resolves\n\t * to an instance of the panel.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdPanel#newPanelPosition\n\t * @description\n\t * Returns a new instance of the MdPanelPosition object. Use this to create\n\t * the position config object.\n\t *\n\t * @returns {!MdPanelPosition} panelPosition\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdPanel#newPanelAnimation\n\t * @description\n\t * Returns a new instance of the MdPanelAnimation object. Use this to create\n\t * the animation config object.\n\t *\n\t * @returns {!MdPanelAnimation} panelAnimation\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdPanel#newPanelGroup\n\t * @description\n\t * Creates a panel group and adds it to a tracked list of panel groups.\n\t *\n\t * @param {string} groupName Name of the group to create.\n\t * @param {!Object=} config Specific configuration object that may contain the\n\t * following properties:\n\t *\n\t * - `maxOpen` - `{number=}`: The maximum number of panels that are allowed to\n\t * be open within a defined panel group.\n\t *\n\t * @returns {!Object,\n\t * openPanels: !Array,\n\t * maxOpen: number}>} panelGroup\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name $mdPanel#setGroupMaxOpen\n\t * @description\n\t * Sets the maximum number of panels in a group that can be opened at a given\n\t * time.\n\t *\n\t * @param {string} groupName The name of the group to configure.\n\t * @param {number} maxOpen The maximum number of panels that can be\n\t * opened. Infinity can be passed in to remove the maxOpen limit.\n\t */\n\t\n\t\n\t/*****************************************************************************\n\t * MdPanelRef *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * @ngdoc type\n\t * @name MdPanelRef\n\t * @module material.components.panel\n\t * @description\n\t * A reference to a created panel. This reference contains a unique id for the\n\t * panel, along with the following properties:\n\t *\n\t * - `id` - `{string}`: The unique id for the panel. This id is used to track\n\t * when a panel was interacted with.\n\t * - `config` - `{!Object=}`: The entire config object that was used in\n\t * create.\n\t * - `isAttached` - `{boolean}`: Whether the panel is attached to the DOM.\n\t * Visibility to the user does not factor into isAttached.\n\t * - `panelContainer` - `{angular.JQLite}`: The wrapper element containing the\n\t * panel. This property is added in order to have access to the `addClass`,\n\t * `removeClass`, `toggleClass`, etc methods.\n\t * - `panelEl` - `{angular.JQLite}`: The panel element. This property is added\n\t * in order to have access to the `addClass`, `removeClass`, `toggleClass`,\n\t * etc methods.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#open\n\t * @description\n\t * Attaches and shows the panel.\n\t *\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n\t * opened.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#close\n\t * @description\n\t * Hides and detaches the panel. Note that this will **not** destroy the panel.\n\t * If you don't intend on using the panel again, call the {@link #destroy\n\t * destroy} method afterwards.\n\t *\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n\t * closed.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#attach\n\t * @description\n\t * Create the panel elements and attach them to the DOM. The panel will be\n\t * hidden by default.\n\t *\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n\t * attached.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#detach\n\t * @description\n\t * Removes the panel from the DOM. This will NOT hide the panel before removing\n\t * it.\n\t *\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n\t * detached.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#show\n\t * @description\n\t * Shows the panel.\n\t *\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n\t * shown and animations are completed.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#hide\n\t * @description\n\t * Hides the panel.\n\t *\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n\t * hidden and animations are completed.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#destroy\n\t * @description\n\t * Destroys the panel. The panel cannot be opened again after this is called.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#addClass\n\t * @deprecated\n\t * This method is in the process of being deprecated in favor of using the panel\n\t * and container JQLite elements that are referenced in the MdPanelRef object.\n\t * Full deprecation is scheduled for material 1.2.\n\t * @description\n\t * Adds a class to the panel. DO NOT use this hide/show the panel.\n\t *\n\t * @param {string} newClass class to be added.\n\t * @param {boolean} toElement Whether or not to add the class to the panel\n\t * element instead of the container.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#removeClass\n\t * @deprecated\n\t * This method is in the process of being deprecated in favor of using the panel\n\t * and container JQLite elements that are referenced in the MdPanelRef object.\n\t * Full deprecation is scheduled for material 1.2.\n\t * @description\n\t * Removes a class from the panel. DO NOT use this to hide/show the panel.\n\t *\n\t * @param {string} oldClass Class to be removed.\n\t * @param {boolean} fromElement Whether or not to remove the class from the\n\t * panel element instead of the container.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#toggleClass\n\t * @deprecated\n\t * This method is in the process of being deprecated in favor of using the panel\n\t * and container JQLite elements that are referenced in the MdPanelRef object.\n\t * Full deprecation is scheduled for material 1.2.\n\t * @description\n\t * Toggles a class on the panel. DO NOT use this to hide/show the panel.\n\t *\n\t * @param {string} toggleClass Class to be toggled.\n\t * @param {boolean} onElement Whether or not to remove the class from the panel\n\t * element instead of the container.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#updatePosition\n\t * @description\n\t * Updates the position configuration of a panel. Use this to update the\n\t * position of a panel that is open, without having to close and re-open the\n\t * panel.\n\t *\n\t * @param {!MdPanelPosition} position\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#addToGroup\n\t * @description\n\t * Adds a panel to a group if the panel does not exist within the group already.\n\t * A panel can only exist within a single group.\n\t *\n\t * @param {string} groupName The name of the group to add the panel to.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#removeFromGroup\n\t * @description\n\t * Removes a panel from a group if the panel exists within that group. The group\n\t * must be created ahead of time.\n\t *\n\t * @param {string} groupName The name of the group.\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#registerInterceptor\n\t * @description\n\t * Registers an interceptor with the panel. The callback should return a promise,\n\t * which will allow the action to continue when it gets resolved, or will\n\t * prevent an action if it is rejected. The interceptors are called sequentially\n\t * and it reverse order. `type` must be one of the following\n\t * values available on `$mdPanel.interceptorTypes`:\n\t * * `CLOSE` - Gets called before the panel begins closing.\n\t *\n\t * @param {string} type Type of interceptor.\n\t * @param {!angular.$q.Promise} callback Callback to be registered.\n\t * @returns {!MdPanelRef}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#removeInterceptor\n\t * @description\n\t * Removes a registered interceptor.\n\t *\n\t * @param {string} type Type of interceptor to be removed.\n\t * @param {function(): !angular.$q.Promise} callback Interceptor to be removed.\n\t * @returns {!MdPanelRef}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#removeAllInterceptors\n\t * @description\n\t * Removes all interceptors. If a type is supplied, only the\n\t * interceptors of that type will be cleared.\n\t *\n\t * @param {string=} type Type of interceptors to be removed.\n\t * @returns {!MdPanelRef}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelRef#updateAnimation\n\t * @description\n\t * Updates the animation configuration for a panel. You can use this to change\n\t * the panel's animation without having to re-create it.\n\t *\n\t * @param {!MdPanelAnimation} animation\n\t */\n\t\n\t\n\t/*****************************************************************************\n\t * MdPanelPosition *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * @ngdoc type\n\t * @name MdPanelPosition\n\t * @module material.components.panel\n\t * @description\n\t *\n\t * Object for configuring the position of the panel.\n\t *\n\t * @usage\n\t *\n\t * #### Centering the panel\n\t *\n\t * \n\t * new MdPanelPosition().absolute().center();\n\t * \n\t *\n\t * #### Overlapping the panel with an element\n\t *\n\t * \n\t * new MdPanelPosition()\n\t * .relativeTo(someElement)\n\t * .addPanelPosition(\n\t * $mdPanel.xPosition.ALIGN_START,\n\t * $mdPanel.yPosition.ALIGN_TOPS\n\t * );\n\t * \n\t *\n\t * #### Aligning the panel with the bottom of an element\n\t *\n\t * \n\t * new MdPanelPosition()\n\t * .relativeTo(someElement)\n\t * .addPanelPosition($mdPanel.xPosition.CENTER, $mdPanel.yPosition.BELOW);\n\t * \n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#absolute\n\t * @description\n\t * Positions the panel absolutely relative to the parent element. If the parent\n\t * is document.body, this is equivalent to positioning the panel absolutely\n\t * within the viewport.\n\t *\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#relativeTo\n\t * @description\n\t * Positions the panel relative to a specific element.\n\t *\n\t * @param {string|!Element|!angular.JQLite} element Query selector, DOM element,\n\t * or angular element to position the panel with respect to.\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#top\n\t * @description\n\t * Sets the value of `top` for the panel. Clears any previously set vertical\n\t * position.\n\t *\n\t * @param {string=} top Value of `top`. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#bottom\n\t * @description\n\t * Sets the value of `bottom` for the panel. Clears any previously set vertical\n\t * position.\n\t *\n\t * @param {string=} bottom Value of `bottom`. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#start\n\t * @description\n\t * Sets the panel to the start of the page - `left` if `ltr` or `right` for\n\t * `rtl`. Clears any previously set horizontal position.\n\t *\n\t * @param {string=} start Value of position. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#end\n\t * @description\n\t * Sets the panel to the end of the page - `right` if `ltr` or `left` for `rtl`.\n\t * Clears any previously set horizontal position.\n\t *\n\t * @param {string=} end Value of position. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#left\n\t * @description\n\t * Sets the value of `left` for the panel. Clears any previously set\n\t * horizontal position.\n\t *\n\t * @param {string=} left Value of `left`. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#right\n\t * @description\n\t * Sets the value of `right` for the panel. Clears any previously set\n\t * horizontal position.\n\t *\n\t * @param {string=} right Value of `right`. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#centerHorizontally\n\t * @description\n\t * Centers the panel horizontally in the viewport. Clears any previously set\n\t * horizontal position.\n\t *\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#centerVertically\n\t * @description\n\t * Centers the panel vertically in the viewport. Clears any previously set\n\t * vertical position.\n\t *\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#center\n\t * @description\n\t * Centers the panel horizontally and vertically in the viewport. This is\n\t * equivalent to calling both `centerHorizontally` and `centerVertically`.\n\t * Clears any previously set horizontal and vertical positions.\n\t *\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#addPanelPosition\n\t * @description\n\t * Sets the x and y position for the panel relative to another element. Can be\n\t * called multiple times to specify an ordered list of panel positions. The\n\t * first position which allows the panel to be completely on-screen will be\n\t * chosen; the last position will be chose whether it is on-screen or not.\n\t *\n\t * xPosition must be one of the following values available on\n\t * $mdPanel.xPosition:\n\t *\n\t *\n\t * CENTER | ALIGN_START | ALIGN_END | OFFSET_START | OFFSET_END\n\t *\n\t *
    \n\t *    *************\n\t *    *           *\n\t *    *   PANEL   *\n\t *    *           *\n\t *    *************\n\t *   A B    C    D E\n\t *\n\t * A: OFFSET_START (for LTR displays)\n\t * B: ALIGN_START (for LTR displays)\n\t * C: CENTER\n\t * D: ALIGN_END (for LTR displays)\n\t * E: OFFSET_END (for LTR displays)\n\t * 
    \n\t *\n\t * yPosition must be one of the following values available on\n\t * $mdPanel.yPosition:\n\t *\n\t * CENTER | ALIGN_TOPS | ALIGN_BOTTOMS | ABOVE | BELOW\n\t *\n\t *
    \n\t *   F\n\t *   G *************\n\t *     *           *\n\t *   H *   PANEL   *\n\t *     *           *\n\t *   I *************\n\t *   J\n\t *\n\t * F: BELOW\n\t * G: ALIGN_TOPS\n\t * H: CENTER\n\t * I: ALIGN_BOTTOMS\n\t * J: ABOVE\n\t * 
    \n\t *\n\t * @param {string} xPosition\n\t * @param {string} yPosition\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#withOffsetX\n\t * @description\n\t * Sets the value of the offset in the x-direction.\n\t *\n\t * @param {string} offsetX\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelPosition#withOffsetY\n\t * @description\n\t * Sets the value of the offset in the y-direction.\n\t *\n\t * @param {string} offsetY\n\t * @returns {!MdPanelPosition}\n\t */\n\t\n\t\n\t/*****************************************************************************\n\t * MdPanelAnimation *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * @ngdoc type\n\t * @name MdPanelAnimation\n\t * @module material.components.panel\n\t * @description\n\t * Animation configuration object. To use, create an MdPanelAnimation with the\n\t * desired properties, then pass the object as part of $mdPanel creation.\n\t *\n\t * @usage\n\t *\n\t * \n\t * var panelAnimation = new MdPanelAnimation()\n\t * .openFrom(myButtonEl)\n\t * .duration(1337)\n\t * .closeTo('.my-button')\n\t * .withAnimation($mdPanel.animation.SCALE);\n\t *\n\t * $mdPanel.create({\n\t * animation: panelAnimation\n\t * });\n\t * \n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelAnimation#openFrom\n\t * @description\n\t * Specifies where to start the open animation. `openFrom` accepts a\n\t * click event object, query selector, DOM element, or a Rect object that\n\t * is used to determine the bounds. When passed a click event, the location\n\t * of the click will be used as the position to start the animation.\n\t *\n\t * @param {string|!Element|!Event|{top: number, left: number}}\n\t * @returns {!MdPanelAnimation}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelAnimation#closeTo\n\t * @description\n\t * Specifies where to animate the panel close. `closeTo` accepts a\n\t * query selector, DOM element, or a Rect object that is used to determine\n\t * the bounds.\n\t *\n\t * @param {string|!Element|{top: number, left: number}}\n\t * @returns {!MdPanelAnimation}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelAnimation#withAnimation\n\t * @description\n\t * Specifies the animation class.\n\t *\n\t * There are several default animations that can be used:\n\t * ($mdPanel.animation)\n\t * SLIDE: The panel slides in and out from the specified\n\t * elements. It will not fade in or out.\n\t * SCALE: The panel scales in and out. Slide and fade are\n\t * included in this animation.\n\t * FADE: The panel fades in and out.\n\t *\n\t * Custom classes will by default fade in and out unless\n\t * \"transition: opacity 1ms\" is added to the to custom class.\n\t *\n\t * @param {string|{open: string, close: string}} cssClass\n\t * @returns {!MdPanelAnimation}\n\t */\n\t\n\t/**\n\t * @ngdoc method\n\t * @name MdPanelAnimation#duration\n\t * @description\n\t * Specifies the duration of the animation in milliseconds. The `duration`\n\t * method accepts either a number or an object with separate open and close\n\t * durations.\n\t *\n\t * @param {number|{open: number, close: number}} duration\n\t * @returns {!MdPanelAnimation}\n\t */\n\t\n\t\n\t/*****************************************************************************\n\t * PUBLIC DOCUMENTATION *\n\t *****************************************************************************/\n\t\n\t\n\tvar MD_PANEL_Z_INDEX = 80;\n\tvar MD_PANEL_HIDDEN = '_md-panel-hidden';\n\tvar FOCUS_TRAP_TEMPLATE = angular.element(\n\t '
    ');\n\t\n\tvar _presets = {};\n\t\n\t\n\t/**\n\t * A provider that is used for creating presets for the panel API.\n\t * @final @constructor @ngInject\n\t */\n\tfunction MdPanelProvider() {\n\t return {\n\t 'definePreset': definePreset,\n\t 'getAllPresets': getAllPresets,\n\t 'clearPresets': clearPresets,\n\t '$get': $getProvider()\n\t };\n\t}\n\t\n\t\n\t/**\n\t * Takes the passed in panel configuration object and adds it to the `_presets`\n\t * object at the specified name.\n\t * @param {string} name Name of the preset to set.\n\t * @param {!Object} preset Specific configuration object that can contain any\n\t * and all of the parameters avaialble within the `$mdPanel.create` method.\n\t * However, parameters that pertain to id, position, animation, and user\n\t * interaction are not allowed and will be removed from the preset\n\t * configuration.\n\t */\n\tfunction definePreset(name, preset) {\n\t if (!name || !preset) {\n\t throw new Error('mdPanelProvider: The panel preset definition is ' +\n\t 'malformed. The name and preset object are required.');\n\t } else if (_presets.hasOwnProperty(name)) {\n\t throw new Error('mdPanelProvider: The panel preset you have requested ' +\n\t 'has already been defined.');\n\t }\n\t\n\t // Delete any property on the preset that is not allowed.\n\t delete preset.id;\n\t delete preset.position;\n\t delete preset.animation;\n\t\n\t _presets[name] = preset;\n\t}\n\t\n\t\n\t/**\n\t * Gets a clone of the `_presets`.\n\t * @return {!Object}\n\t */\n\tfunction getAllPresets() {\n\t return angular.copy(_presets);\n\t}\n\t\n\t\n\t/**\n\t * Clears all of the stored presets.\n\t */\n\tfunction clearPresets() {\n\t _presets = {};\n\t}\n\t\n\t\n\t/**\n\t * Represents the `$get` method of the AngularJS provider. From here, a new\n\t * reference to the MdPanelService is returned where the needed arguments are\n\t * passed in including the MdPanelProvider `_presets`.\n\t * @param {!Object} _presets\n\t * @param {!angular.JQLite} $rootElement\n\t * @param {!angular.Scope} $rootScope\n\t * @param {!angular.$injector} $injector\n\t * @param {!angular.$window} $window\n\t */\n\tfunction $getProvider() {\n\t return [\n\t '$rootElement', '$rootScope', '$injector', '$window',\n\t function($rootElement, $rootScope, $injector, $window) {\n\t return new MdPanelService(_presets, $rootElement, $rootScope,\n\t $injector, $window);\n\t }\n\t ];\n\t}\n\t\n\t\n\t/*****************************************************************************\n\t * MdPanel Service *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * A service that is used for controlling/displaying panels on the screen.\n\t * @param {!Object} presets\n\t * @param {!angular.JQLite} $rootElement\n\t * @param {!angular.Scope} $rootScope\n\t * @param {!angular.$injector} $injector\n\t * @param {!angular.$window} $window\n\t * @final @constructor @ngInject\n\t */\n\tfunction MdPanelService(presets, $rootElement, $rootScope, $injector, $window) {\n\t /**\n\t * Default config options for the panel.\n\t * Anything angular related needs to be done later. Therefore\n\t * scope: $rootScope.$new(true),\n\t * attachTo: $rootElement,\n\t * are added later.\n\t * @private {!Object}\n\t */\n\t this._defaultConfigOptions = {\n\t bindToController: true,\n\t clickOutsideToClose: false,\n\t disableParentScroll: false,\n\t escapeToClose: false,\n\t focusOnOpen: true,\n\t fullscreen: false,\n\t hasBackdrop: false,\n\t propagateContainerEvents: false,\n\t transformTemplate: angular.bind(this, this._wrapTemplate),\n\t trapFocus: false,\n\t zIndex: MD_PANEL_Z_INDEX\n\t };\n\t\n\t /** @private {!Object} */\n\t this._config = {};\n\t\n\t /** @private {!Object} */\n\t this._presets = presets;\n\t\n\t /** @private @const */\n\t this._$rootElement = $rootElement;\n\t\n\t /** @private @const */\n\t this._$rootScope = $rootScope;\n\t\n\t /** @private @const */\n\t this._$injector = $injector;\n\t\n\t /** @private @const */\n\t this._$window = $window;\n\t\n\t /** @private @const */\n\t this._$mdUtil = this._$injector.get('$mdUtil');\n\t\n\t /** @private {!Object} */\n\t this._trackedPanels = {};\n\t\n\t /**\n\t * @private {!Object,\n\t * openPanels: !Array,\n\t * maxOpen: number}>}\n\t */\n\t this._groups = Object.create(null);\n\t\n\t /**\n\t * Default animations that can be used within the panel.\n\t * @type {enum}\n\t */\n\t this.animation = MdPanelAnimation.animation;\n\t\n\t /**\n\t * Possible values of xPosition for positioning the panel relative to\n\t * another element.\n\t * @type {enum}\n\t */\n\t this.xPosition = MdPanelPosition.xPosition;\n\t\n\t /**\n\t * Possible values of yPosition for positioning the panel relative to\n\t * another element.\n\t * @type {enum}\n\t */\n\t this.yPosition = MdPanelPosition.yPosition;\n\t\n\t /**\n\t * Possible values for the interceptors that can be registered on a panel.\n\t * @type {enum}\n\t */\n\t this.interceptorTypes = MdPanelRef.interceptorTypes;\n\t\n\t /**\n\t * Possible values for closing of a panel.\n\t * @type {enum}\n\t */\n\t this.closeReasons = MdPanelRef.closeReasons;\n\t\n\t /**\n\t * Possible values of absolute position.\n\t * @type {enum}\n\t */\n\t this.absPosition = MdPanelPosition.absPosition;\n\t}\n\t\n\t\n\t/**\n\t * Creates a panel with the specified options.\n\t * @param {string=} preset Name of a preset configuration that can be used to\n\t * extend the panel configuration.\n\t * @param {!Object=} config Configuration object for the panel.\n\t * @returns {!MdPanelRef}\n\t */\n\tMdPanelService.prototype.create = function(preset, config) {\n\t if (typeof preset === 'string') {\n\t preset = this._getPresetByName(preset);\n\t } else if (typeof preset === 'object' &&\n\t (angular.isUndefined(config) || !config)) {\n\t config = preset;\n\t preset = {};\n\t }\n\t\n\t preset = preset || {};\n\t config = config || {};\n\t\n\t // If the passed-in config contains an ID and the ID is within _trackedPanels,\n\t // return the tracked panel after updating its config with the passed-in\n\t // config.\n\t if (angular.isDefined(config.id) && this._trackedPanels[config.id]) {\n\t var trackedPanel = this._trackedPanels[config.id];\n\t angular.extend(trackedPanel.config, config);\n\t return trackedPanel;\n\t }\n\t\n\t // Combine the passed-in config, the _defaultConfigOptions, and the preset\n\t // configuration into the `_config`.\n\t this._config = angular.extend({\n\t // If no ID is set within the passed-in config, then create an arbitrary ID.\n\t id: config.id || 'panel_' + this._$mdUtil.nextUid(),\n\t scope: this._$rootScope.$new(true),\n\t attachTo: this._$rootElement\n\t }, this._defaultConfigOptions, config, preset);\n\t\n\t // Create the panelRef and add it to the `_trackedPanels` object.\n\t var panelRef = new MdPanelRef(this._config, this._$injector);\n\t this._trackedPanels[config.id] = panelRef;\n\t\n\t // Add the panel to each of its requested groups.\n\t if (this._config.groupName) {\n\t if (angular.isString(this._config.groupName)) {\n\t this._config.groupName = [this._config.groupName];\n\t }\n\t angular.forEach(this._config.groupName, function(group) {\n\t panelRef.addToGroup(group);\n\t });\n\t }\n\t\n\t this._config.scope.$on('$destroy', angular.bind(panelRef, panelRef.detach));\n\t\n\t return panelRef;\n\t};\n\t\n\t\n\t/**\n\t * Creates and opens a panel with the specified options.\n\t * @param {string=} preset Name of a preset configuration that can be used to\n\t * extend the panel configuration.\n\t * @param {!Object=} config Configuration object for the panel.\n\t * @returns {!angular.$q.Promise} The panel created from create.\n\t */\n\tMdPanelService.prototype.open = function(preset, config) {\n\t var panelRef = this.create(preset, config);\n\t return panelRef.open().then(function() {\n\t return panelRef;\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Gets a specific preset configuration object saved within `_presets`.\n\t * @param {string} preset Name of the preset to search for.\n\t * @returns {!Object} The preset configuration object.\n\t */\n\tMdPanelService.prototype._getPresetByName = function(preset) {\n\t if (!this._presets[preset]) {\n\t throw new Error('mdPanel: The panel preset configuration that you ' +\n\t 'requested does not exist. Use the $mdPanelProvider to create a ' +\n\t 'preset before requesting one.');\n\t }\n\t return this._presets[preset];\n\t};\n\t\n\t\n\t/**\n\t * Returns a new instance of the MdPanelPosition. Use this to create the\n\t * positioning object.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelService.prototype.newPanelPosition = function() {\n\t return new MdPanelPosition(this._$injector);\n\t};\n\t\n\t\n\t/**\n\t * Returns a new instance of the MdPanelAnimation. Use this to create the\n\t * animation object.\n\t * @returns {!MdPanelAnimation}\n\t */\n\tMdPanelService.prototype.newPanelAnimation = function() {\n\t return new MdPanelAnimation(this._$injector);\n\t};\n\t\n\t\n\t/**\n\t * Creates a panel group and adds it to a tracked list of panel groups.\n\t * @param groupName {string} Name of the group to create.\n\t * @param config {!Object=} Specific configuration object that may contain the\n\t * following properties:\n\t *\n\t * - `maxOpen` - `{number=}`: The maximum number of panels that are allowed\n\t * open within a defined panel group.\n\t *\n\t * @returns {!Object,\n\t * openPanels: !Array,\n\t * maxOpen: number}>} panelGroup\n\t */\n\tMdPanelService.prototype.newPanelGroup = function(groupName, config) {\n\t if (!this._groups[groupName]) {\n\t config = config || {};\n\t var group = {\n\t panels: [],\n\t openPanels: [],\n\t maxOpen: config.maxOpen > 0 ? config.maxOpen : Infinity\n\t };\n\t this._groups[groupName] = group;\n\t }\n\t return this._groups[groupName];\n\t};\n\t\n\t\n\t/**\n\t * Sets the maximum number of panels in a group that can be opened at a given\n\t * time.\n\t * @param {string} groupName The name of the group to configure.\n\t * @param {number} maxOpen The maximum number of panels that can be\n\t * opened. Infinity can be passed in to remove the maxOpen limit.\n\t */\n\tMdPanelService.prototype.setGroupMaxOpen = function(groupName, maxOpen) {\n\t if (this._groups[groupName]) {\n\t this._groups[groupName].maxOpen = maxOpen;\n\t } else {\n\t throw new Error('mdPanel: Group does not exist yet. Call newPanelGroup().');\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Determines if the current number of open panels within a group exceeds the\n\t * limit of allowed open panels.\n\t * @param {string} groupName The name of the group to check.\n\t * @returns {boolean} true if open count does exceed maxOpen and false if not.\n\t * @private\n\t */\n\tMdPanelService.prototype._openCountExceedsMaxOpen = function(groupName) {\n\t if (this._groups[groupName]) {\n\t var group = this._groups[groupName];\n\t return group.maxOpen > 0 && group.openPanels.length > group.maxOpen;\n\t }\n\t return false;\n\t};\n\t\n\t\n\t/**\n\t * Closes the first open panel within a specific group.\n\t * @param {string} groupName The name of the group.\n\t * @private\n\t */\n\tMdPanelService.prototype._closeFirstOpenedPanel = function(groupName) {\n\t this._groups[groupName].openPanels[0].close();\n\t};\n\t\n\t\n\t/**\n\t * Wraps the users template in two elements, md-panel-outer-wrapper, which\n\t * covers the entire attachTo element, and md-panel, which contains only the\n\t * template. This allows the panel control over positioning, animations,\n\t * and similar properties.\n\t * @param {string} origTemplate The original template.\n\t * @returns {string} The wrapped template.\n\t * @private\n\t */\n\tMdPanelService.prototype._wrapTemplate = function(origTemplate) {\n\t var template = origTemplate || '';\n\t\n\t // The panel should be initially rendered offscreen so we can calculate\n\t // height and width for positioning.\n\t return '' +\n\t '
    ' +\n\t '
    ' + template + '
    ' +\n\t '
    ';\n\t};\n\t\n\t\n\t/**\n\t * Wraps a content element in a md-panel-outer wrapper and\n\t * positions it off-screen. Allows for proper control over positoning\n\t * and animations.\n\t * @param {!angular.JQLite} contentElement Element to be wrapped.\n\t * @return {!angular.JQLite} Wrapper element.\n\t * @private\n\t */\n\tMdPanelService.prototype._wrapContentElement = function(contentElement) {\n\t var wrapper = angular.element('
    ');\n\t\n\t contentElement.addClass('md-panel _md-panel-offscreen');\n\t wrapper.append(contentElement);\n\t\n\t return wrapper;\n\t};\n\t\n\t\n\t/*****************************************************************************\n\t * MdPanelRef *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * A reference to a created panel. This reference contains a unique id for the\n\t * panel, along with properties/functions used to control the panel.\n\t * @param {!Object} config\n\t * @param {!angular.$injector} $injector\n\t * @final @constructor\n\t */\n\tfunction MdPanelRef(config, $injector) {\n\t // Injected variables.\n\t /** @private @const {!angular.$q} */\n\t this._$q = $injector.get('$q');\n\t\n\t /** @private @const {!angular.$mdCompiler} */\n\t this._$mdCompiler = $injector.get('$mdCompiler');\n\t\n\t /** @private @const {!angular.$mdConstant} */\n\t this._$mdConstant = $injector.get('$mdConstant');\n\t\n\t /** @private @const {!angular.$mdUtil} */\n\t this._$mdUtil = $injector.get('$mdUtil');\n\t\n\t /** @private @const {!angular.$mdTheming} */\n\t this._$mdTheming = $injector.get('$mdTheming');\n\t\n\t /** @private @const {!angular.Scope} */\n\t this._$rootScope = $injector.get('$rootScope');\n\t\n\t /** @private @const {!angular.$animate} */\n\t this._$animate = $injector.get('$animate');\n\t\n\t /** @private @const {!MdPanelRef} */\n\t this._$mdPanel = $injector.get('$mdPanel');\n\t\n\t /** @private @const {!angular.$log} */\n\t this._$log = $injector.get('$log');\n\t\n\t /** @private @const {!angular.$window} */\n\t this._$window = $injector.get('$window');\n\t\n\t /** @private @const {!Function} */\n\t this._$$rAF = $injector.get('$$rAF');\n\t\n\t // Public variables.\n\t /**\n\t * Unique id for the panelRef.\n\t * @type {string}\n\t */\n\t this.id = config.id;\n\t\n\t /** @type {!Object} */\n\t this.config = config;\n\t\n\t /** @type {!angular.JQLite|undefined} */\n\t this.panelContainer;\n\t\n\t /** @type {!angular.JQLite|undefined} */\n\t this.panelEl;\n\t\n\t /**\n\t * Whether the panel is attached. This is synchronous. When attach is called,\n\t * isAttached is set to true. When detach is called, isAttached is set to\n\t * false.\n\t * @type {boolean}\n\t */\n\t this.isAttached = false;\n\t\n\t // Private variables.\n\t /** @private {Array} */\n\t this._removeListeners = [];\n\t\n\t /** @private {!angular.JQLite|undefined} */\n\t this._topFocusTrap;\n\t\n\t /** @private {!angular.JQLite|undefined} */\n\t this._bottomFocusTrap;\n\t\n\t /** @private {!$mdPanel|undefined} */\n\t this._backdropRef;\n\t\n\t /** @private {Function?} */\n\t this._restoreScroll = null;\n\t\n\t /**\n\t * Keeps track of all the panel interceptors.\n\t * @private {!Object}\n\t */\n\t this._interceptors = Object.create(null);\n\t\n\t /**\n\t * Cleanup function, provided by `$mdCompiler` and assigned after the element\n\t * has been compiled. When `contentElement` is used, the function is used to\n\t * restore the element to it's proper place in the DOM.\n\t * @private {!Function}\n\t */\n\t this._compilerCleanup = null;\n\t\n\t /**\n\t * Cache for saving and restoring element inline styles, CSS classes etc.\n\t * @type {{styles: string, classes: string}}\n\t */\n\t this._restoreCache = {\n\t styles: '',\n\t classes: ''\n\t };\n\t}\n\t\n\t\n\tMdPanelRef.interceptorTypes = {\n\t CLOSE: 'onClose'\n\t};\n\t\n\t\n\t/**\n\t * Opens an already created and configured panel. If the panel is already\n\t * visible, does nothing.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when\n\t * the panel is opened and animations finish.\n\t */\n\tMdPanelRef.prototype.open = function() {\n\t var self = this;\n\t return this._$q(function(resolve, reject) {\n\t var done = self._done(resolve, self);\n\t var show = self._simpleBind(self.show, self);\n\t var checkGroupMaxOpen = function() {\n\t if (self.config.groupName) {\n\t angular.forEach(self.config.groupName, function(group) {\n\t if (self._$mdPanel._openCountExceedsMaxOpen(group)) {\n\t self._$mdPanel._closeFirstOpenedPanel(group);\n\t }\n\t });\n\t }\n\t };\n\t\n\t self.attach()\n\t .then(show)\n\t .then(checkGroupMaxOpen)\n\t .then(done)\n\t .catch(reject);\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Closes the panel.\n\t * @param {string} closeReason The event type that triggered the close.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when\n\t * the panel is closed and animations finish.\n\t */\n\tMdPanelRef.prototype.close = function(closeReason) {\n\t var self = this;\n\t\n\t return this._$q(function(resolve, reject) {\n\t self._callInterceptors(MdPanelRef.interceptorTypes.CLOSE).then(function() {\n\t var done = self._done(resolve, self);\n\t var detach = self._simpleBind(self.detach, self);\n\t var onCloseSuccess = self.config['onCloseSuccess'] || angular.noop;\n\t onCloseSuccess = angular.bind(self, onCloseSuccess, self, closeReason);\n\t\n\t self.hide()\n\t .then(detach)\n\t .then(done)\n\t .then(onCloseSuccess)\n\t .catch(reject);\n\t }, reject);\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Attaches the panel. The panel will be hidden afterwards.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when\n\t * the panel is attached.\n\t */\n\tMdPanelRef.prototype.attach = function() {\n\t if (this.isAttached && this.panelEl) {\n\t return this._$q.when(this);\n\t }\n\t\n\t var self = this;\n\t return this._$q(function(resolve, reject) {\n\t var done = self._done(resolve, self);\n\t var onDomAdded = self.config['onDomAdded'] || angular.noop;\n\t var addListeners = function(response) {\n\t self.isAttached = true;\n\t self._addEventListeners();\n\t return response;\n\t };\n\t\n\t self._$q.all([\n\t self._createBackdrop(),\n\t self._createPanel()\n\t .then(addListeners)\n\t .catch(reject)\n\t ]).then(onDomAdded)\n\t .then(done)\n\t .catch(reject);\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Only detaches the panel. Will NOT hide the panel first.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when\n\t * the panel is detached.\n\t */\n\tMdPanelRef.prototype.detach = function() {\n\t if (!this.isAttached) {\n\t return this._$q.when(this);\n\t }\n\t\n\t var self = this;\n\t var onDomRemoved = self.config['onDomRemoved'] || angular.noop;\n\t\n\t var detachFn = function() {\n\t self._removeEventListeners();\n\t\n\t // Remove the focus traps that we added earlier for keeping focus within\n\t // the panel.\n\t if (self._topFocusTrap && self._topFocusTrap.parentNode) {\n\t self._topFocusTrap.parentNode.removeChild(self._topFocusTrap);\n\t }\n\t\n\t if (self._bottomFocusTrap && self._bottomFocusTrap.parentNode) {\n\t self._bottomFocusTrap.parentNode.removeChild(self._bottomFocusTrap);\n\t }\n\t\n\t if (self._restoreCache.classes) {\n\t self.panelEl[0].className = self._restoreCache.classes;\n\t }\n\t\n\t // Either restore the saved styles or clear the ones set by mdPanel.\n\t self.panelEl[0].style.cssText = self._restoreCache.styles || '';\n\t\n\t self._compilerCleanup();\n\t self.panelContainer.remove();\n\t self.isAttached = false;\n\t return self._$q.when(self);\n\t };\n\t\n\t if (this._restoreScroll) {\n\t this._restoreScroll();\n\t this._restoreScroll = null;\n\t }\n\t\n\t return this._$q(function(resolve, reject) {\n\t var done = self._done(resolve, self);\n\t\n\t self._$q.all([\n\t detachFn(),\n\t self._backdropRef ? self._backdropRef.detach() : true\n\t ]).then(onDomRemoved)\n\t .then(done)\n\t .catch(reject);\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Destroys the panel. The Panel cannot be opened again after this.\n\t */\n\tMdPanelRef.prototype.destroy = function() {\n\t var self = this;\n\t if (this.config.groupName) {\n\t angular.forEach(this.config.groupName, function(group) {\n\t self.removeFromGroup(group);\n\t });\n\t }\n\t this.config.scope.$destroy();\n\t this.config.locals = null;\n\t this._interceptors = null;\n\t};\n\t\n\t\n\t/**\n\t * Shows the panel.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when\n\t * the panel has shown and animations finish.\n\t */\n\tMdPanelRef.prototype.show = function() {\n\t if (!this.panelContainer) {\n\t return this._$q(function(resolve, reject) {\n\t reject('mdPanel: Panel does not exist yet. Call open() or attach().');\n\t });\n\t }\n\t\n\t if (!this.panelContainer.hasClass(MD_PANEL_HIDDEN)) {\n\t return this._$q.when(this);\n\t }\n\t\n\t var self = this;\n\t var animatePromise = function() {\n\t self.panelContainer.removeClass(MD_PANEL_HIDDEN);\n\t return self._animateOpen();\n\t };\n\t\n\t return this._$q(function(resolve, reject) {\n\t var done = self._done(resolve, self);\n\t var onOpenComplete = self.config['onOpenComplete'] || angular.noop;\n\t var addToGroupOpen = function() {\n\t if (self.config.groupName) {\n\t angular.forEach(self.config.groupName, function(group) {\n\t self._$mdPanel._groups[group].openPanels.push(self);\n\t });\n\t }\n\t };\n\t\n\t self._$q.all([\n\t self._backdropRef ? self._backdropRef.show() : self,\n\t animatePromise().then(function() { self._focusOnOpen(); }, reject)\n\t ]).then(onOpenComplete)\n\t .then(addToGroupOpen)\n\t .then(done)\n\t .catch(reject);\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Hides the panel.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when\n\t * the panel has hidden and animations finish.\n\t */\n\tMdPanelRef.prototype.hide = function() {\n\t if (!this.panelContainer) {\n\t return this._$q(function(resolve, reject) {\n\t reject('mdPanel: Panel does not exist yet. Call open() or attach().');\n\t });\n\t }\n\t\n\t if (this.panelContainer.hasClass(MD_PANEL_HIDDEN)) {\n\t return this._$q.when(this);\n\t }\n\t\n\t var self = this;\n\t\n\t return this._$q(function(resolve, reject) {\n\t var done = self._done(resolve, self);\n\t var onRemoving = self.config['onRemoving'] || angular.noop;\n\t var hidePanel = function() {\n\t self.panelContainer.addClass(MD_PANEL_HIDDEN);\n\t };\n\t var removeFromGroupOpen = function() {\n\t if (self.config.groupName) {\n\t var group, index;\n\t angular.forEach(self.config.groupName, function(group) {\n\t group = self._$mdPanel._groups[group];\n\t index = group.openPanels.indexOf(self);\n\t if (index > -1) {\n\t group.openPanels.splice(index, 1);\n\t }\n\t });\n\t }\n\t };\n\t var focusOnOrigin = function() {\n\t var origin = self.config['origin'];\n\t if (origin) {\n\t getElement(origin).focus();\n\t }\n\t };\n\t\n\t self._$q.all([\n\t self._backdropRef ? self._backdropRef.hide() : self,\n\t self._animateClose()\n\t .then(onRemoving)\n\t .then(hidePanel)\n\t .then(removeFromGroupOpen)\n\t .then(focusOnOrigin)\n\t .catch(reject)\n\t ]).then(done, reject);\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Add a class to the panel. DO NOT use this to hide/show the panel.\n\t * @deprecated\n\t * This method is in the process of being deprecated in favor of using the panel\n\t * and container JQLite elements that are referenced in the MdPanelRef object.\n\t * Full deprecation is scheduled for material 1.2.\n\t *\n\t * @param {string} newClass Class to be added.\n\t * @param {boolean} toElement Whether or not to add the class to the panel\n\t * element instead of the container.\n\t */\n\tMdPanelRef.prototype.addClass = function(newClass, toElement) {\n\t this._$log.warn(\n\t 'mdPanel: The addClass method is in the process of being deprecated. ' +\n\t 'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n\t 'To achieve the same results, use the panelContainer or panelEl ' +\n\t 'JQLite elements that are referenced in MdPanelRef.');\n\t\n\t if (!this.panelContainer) {\n\t throw new Error(\n\t 'mdPanel: Panel does not exist yet. Call open() or attach().');\n\t }\n\t\n\t if (!toElement && !this.panelContainer.hasClass(newClass)) {\n\t this.panelContainer.addClass(newClass);\n\t } else if (toElement && !this.panelEl.hasClass(newClass)) {\n\t this.panelEl.addClass(newClass);\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Remove a class from the panel. DO NOT use this to hide/show the panel.\n\t * @deprecated\n\t * This method is in the process of being deprecated in favor of using the panel\n\t * and container JQLite elements that are referenced in the MdPanelRef object.\n\t * Full deprecation is scheduled for material 1.2.\n\t *\n\t * @param {string} oldClass Class to be removed.\n\t * @param {boolean} fromElement Whether or not to remove the class from the\n\t * panel element instead of the container.\n\t */\n\tMdPanelRef.prototype.removeClass = function(oldClass, fromElement) {\n\t this._$log.warn(\n\t 'mdPanel: The removeClass method is in the process of being deprecated. ' +\n\t 'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n\t 'To achieve the same results, use the panelContainer or panelEl ' +\n\t 'JQLite elements that are referenced in MdPanelRef.');\n\t\n\t if (!this.panelContainer) {\n\t throw new Error(\n\t 'mdPanel: Panel does not exist yet. Call open() or attach().');\n\t }\n\t\n\t if (!fromElement && this.panelContainer.hasClass(oldClass)) {\n\t this.panelContainer.removeClass(oldClass);\n\t } else if (fromElement && this.panelEl.hasClass(oldClass)) {\n\t this.panelEl.removeClass(oldClass);\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Toggle a class on the panel. DO NOT use this to hide/show the panel.\n\t * @deprecated\n\t * This method is in the process of being deprecated in favor of using the panel\n\t * and container JQLite elements that are referenced in the MdPanelRef object.\n\t * Full deprecation is scheduled for material 1.2.\n\t *\n\t * @param {string} toggleClass The class to toggle.\n\t * @param {boolean} onElement Whether or not to toggle the class on the panel\n\t * element instead of the container.\n\t */\n\tMdPanelRef.prototype.toggleClass = function(toggleClass, onElement) {\n\t this._$log.warn(\n\t 'mdPanel: The toggleClass method is in the process of being deprecated. ' +\n\t 'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n\t 'To achieve the same results, use the panelContainer or panelEl ' +\n\t 'JQLite elements that are referenced in MdPanelRef.');\n\t\n\t if (!this.panelContainer) {\n\t throw new Error(\n\t 'mdPanel: Panel does not exist yet. Call open() or attach().');\n\t }\n\t\n\t if (!onElement) {\n\t this.panelContainer.toggleClass(toggleClass);\n\t } else {\n\t this.panelEl.toggleClass(toggleClass);\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Compiles the panel, according to the passed in config and appends it to\n\t * the DOM. Helps normalize differences in the compilation process between\n\t * using a string template and a content element.\n\t * @returns {!angular.$q.Promise} Promise that is resolved when\n\t * the element has been compiled and added to the DOM.\n\t * @private\n\t */\n\tMdPanelRef.prototype._compile = function() {\n\t var self = this;\n\t\n\t // Compile the element via $mdCompiler. Note that when using a\n\t // contentElement, the element isn't actually being compiled, rather the\n\t // compiler saves it's place in the DOM and provides a way of restoring it.\n\t return self._$mdCompiler.compile(self.config).then(function(compileData) {\n\t var config = self.config;\n\t\n\t if (config.contentElement) {\n\t var panelEl = compileData.element;\n\t\n\t // Since mdPanel modifies the inline styles and CSS classes, we need\n\t // to save them in order to be able to restore on close.\n\t self._restoreCache.styles = panelEl[0].style.cssText;\n\t self._restoreCache.classes = panelEl[0].className;\n\t\n\t self.panelContainer = self._$mdPanel._wrapContentElement(panelEl);\n\t self.panelEl = panelEl;\n\t } else {\n\t self.panelContainer = compileData.link(config['scope']);\n\t self.panelEl = angular.element(\n\t self.panelContainer[0].querySelector('.md-panel')\n\t );\n\t }\n\t\n\t // Save a reference to the cleanup function from the compiler.\n\t self._compilerCleanup = compileData.cleanup;\n\t\n\t // Attach the panel to the proper place in the DOM.\n\t getElement(self.config['attachTo']).append(self.panelContainer);\n\t\n\t return self;\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Creates a panel and adds it to the dom.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n\t * created.\n\t * @private\n\t */\n\tMdPanelRef.prototype._createPanel = function() {\n\t var self = this;\n\t\n\t return this._$q(function(resolve, reject) {\n\t if (!self.config.locals) {\n\t self.config.locals = {};\n\t }\n\t\n\t self.config.locals.mdPanelRef = self;\n\t\n\t self._compile().then(function() {\n\t if (self.config['disableParentScroll']) {\n\t self._restoreScroll = self._$mdUtil.disableScrollAround(\n\t null,\n\t self.panelContainer,\n\t { disableScrollMask: true }\n\t );\n\t }\n\t\n\t // Add a custom CSS class to the panel element.\n\t if (self.config['panelClass']) {\n\t self.panelEl.addClass(self.config['panelClass']);\n\t }\n\t\n\t // Handle click and touch events for the panel container.\n\t if (self.config['propagateContainerEvents']) {\n\t self.panelContainer.css('pointer-events', 'none');\n\t }\n\t\n\t // Panel may be outside the $rootElement, tell ngAnimate to animate\n\t // regardless.\n\t if (self._$animate.pin) {\n\t self._$animate.pin(\n\t self.panelContainer,\n\t getElement(self.config['attachTo'])\n\t );\n\t }\n\t\n\t self._configureTrapFocus();\n\t self._addStyles().then(function() {\n\t resolve(self);\n\t }, reject);\n\t }, reject);\n\t\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Adds the styles for the panel, such as positioning and z-index. Also,\n\t * themes the panel element and panel container using `$mdTheming`.\n\t * @returns {!angular.$q.Promise}\n\t * @private\n\t */\n\tMdPanelRef.prototype._addStyles = function() {\n\t var self = this;\n\t return this._$q(function(resolve) {\n\t self.panelContainer.css('z-index', self.config['zIndex']);\n\t self.panelEl.css('z-index', self.config['zIndex'] + 1);\n\t\n\t var hideAndResolve = function() {\n\t // Theme the element and container.\n\t self._setTheming();\n\t\n\t // Remove offscreen class and add hidden class.\n\t self.panelEl.removeClass('_md-panel-offscreen');\n\t self.panelContainer.addClass(MD_PANEL_HIDDEN);\n\t\n\t resolve(self);\n\t };\n\t\n\t if (self.config['fullscreen']) {\n\t self.panelEl.addClass('_md-panel-fullscreen');\n\t hideAndResolve();\n\t return; // Don't setup positioning.\n\t }\n\t\n\t var positionConfig = self.config['position'];\n\t if (!positionConfig) {\n\t hideAndResolve();\n\t return; // Don't setup positioning.\n\t }\n\t\n\t // Wait for angular to finish processing the template\n\t self._$rootScope['$$postDigest'](function() {\n\t // Position it correctly. This is necessary so that the panel will have a\n\t // defined height and width.\n\t self._updatePosition(true);\n\t\n\t // Theme the element and container.\n\t self._setTheming();\n\t\n\t resolve(self);\n\t });\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Sets the `$mdTheming` classes on the `panelContainer` and `panelEl`.\n\t * @private\n\t */\n\tMdPanelRef.prototype._setTheming = function() {\n\t this._$mdTheming(this.panelEl);\n\t this._$mdTheming(this.panelContainer);\n\t};\n\t\n\t\n\t/**\n\t * Updates the position configuration of a panel\n\t * @param {!MdPanelPosition} position\n\t */\n\tMdPanelRef.prototype.updatePosition = function(position) {\n\t if (!this.panelContainer) {\n\t throw new Error(\n\t 'mdPanel: Panel does not exist yet. Call open() or attach().');\n\t }\n\t\n\t this.config['position'] = position;\n\t this._updatePosition();\n\t};\n\t\n\t\n\t/**\n\t * Calculates and updates the position of the panel.\n\t * @param {boolean=} init\n\t * @private\n\t */\n\tMdPanelRef.prototype._updatePosition = function(init) {\n\t var positionConfig = this.config['position'];\n\t\n\t if (positionConfig) {\n\t positionConfig._setPanelPosition(this.panelEl);\n\t\n\t // Hide the panel now that position is known.\n\t if (init) {\n\t this.panelEl.removeClass('_md-panel-offscreen');\n\t this.panelContainer.addClass(MD_PANEL_HIDDEN);\n\t }\n\t\n\t this.panelEl.css(\n\t MdPanelPosition.absPosition.TOP,\n\t positionConfig.getTop()\n\t );\n\t this.panelEl.css(\n\t MdPanelPosition.absPosition.BOTTOM,\n\t positionConfig.getBottom()\n\t );\n\t this.panelEl.css(\n\t MdPanelPosition.absPosition.LEFT,\n\t positionConfig.getLeft()\n\t );\n\t this.panelEl.css(\n\t MdPanelPosition.absPosition.RIGHT,\n\t positionConfig.getRight()\n\t );\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Focuses on the panel or the first focus target.\n\t * @private\n\t */\n\tMdPanelRef.prototype._focusOnOpen = function() {\n\t if (this.config['focusOnOpen']) {\n\t // Wait for the template to finish rendering to guarantee md-autofocus has\n\t // finished adding the class md-autofocus, otherwise the focusable element\n\t // isn't available to focus.\n\t var self = this;\n\t this._$rootScope['$$postDigest'](function() {\n\t var target = self._$mdUtil.findFocusTarget(self.panelEl) ||\n\t self.panelEl;\n\t target.focus();\n\t });\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Shows the backdrop.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the backdrop\n\t * is created and attached.\n\t * @private\n\t */\n\tMdPanelRef.prototype._createBackdrop = function() {\n\t if (this.config.hasBackdrop) {\n\t if (!this._backdropRef) {\n\t var backdropAnimation = this._$mdPanel.newPanelAnimation()\n\t .openFrom(this.config.attachTo)\n\t .withAnimation({\n\t open: '_md-opaque-enter',\n\t close: '_md-opaque-leave'\n\t });\n\t\n\t if (this.config.animation) {\n\t backdropAnimation.duration(this.config.animation._rawDuration);\n\t }\n\t\n\t var backdropConfig = {\n\t animation: backdropAnimation,\n\t attachTo: this.config.attachTo,\n\t focusOnOpen: false,\n\t panelClass: '_md-panel-backdrop',\n\t zIndex: this.config.zIndex - 1\n\t };\n\t\n\t this._backdropRef = this._$mdPanel.create(backdropConfig);\n\t }\n\t if (!this._backdropRef.isAttached) {\n\t return this._backdropRef.attach();\n\t }\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Listen for escape keys and outside clicks to auto close.\n\t * @private\n\t */\n\tMdPanelRef.prototype._addEventListeners = function() {\n\t this._configureEscapeToClose();\n\t this._configureClickOutsideToClose();\n\t this._configureScrollListener();\n\t};\n\t\n\t\n\t/**\n\t * Remove event listeners added in _addEventListeners.\n\t * @private\n\t */\n\tMdPanelRef.prototype._removeEventListeners = function() {\n\t this._removeListeners && this._removeListeners.forEach(function(removeFn) {\n\t removeFn();\n\t });\n\t this._removeListeners = [];\n\t};\n\t\n\t\n\t/**\n\t * Setup the escapeToClose event listeners.\n\t * @private\n\t */\n\tMdPanelRef.prototype._configureEscapeToClose = function() {\n\t if (this.config['escapeToClose']) {\n\t var parentTarget = getElement(this.config['attachTo']);\n\t var self = this;\n\t\n\t var keyHandlerFn = function(ev) {\n\t if (ev.keyCode === self._$mdConstant.KEY_CODE.ESCAPE) {\n\t ev.stopPropagation();\n\t ev.preventDefault();\n\t\n\t self.close(MdPanelRef.closeReasons.ESCAPE);\n\t }\n\t };\n\t\n\t // Add keydown listeners\n\t this.panelContainer.on('keydown', keyHandlerFn);\n\t parentTarget.on('keydown', keyHandlerFn);\n\t\n\t // Queue remove listeners function\n\t this._removeListeners.push(function() {\n\t self.panelContainer.off('keydown', keyHandlerFn);\n\t parentTarget.off('keydown', keyHandlerFn);\n\t });\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Setup the clickOutsideToClose event listeners.\n\t * @private\n\t */\n\tMdPanelRef.prototype._configureClickOutsideToClose = function() {\n\t if (this.config['clickOutsideToClose']) {\n\t var target = this.config['propagateContainerEvents'] ?\n\t angular.element(document.body) :\n\t this.panelContainer;\n\t var sourceEl;\n\t\n\t // Keep track of the element on which the mouse originally went down\n\t // so that we can only close the backdrop when the 'click' started on it.\n\t // A simple 'click' handler does not work, it sets the target object as the\n\t // element the mouse went down on.\n\t var mousedownHandler = function(ev) {\n\t sourceEl = ev.target;\n\t };\n\t\n\t // We check if our original element and the target is the backdrop\n\t // because if the original was the backdrop and the target was inside the\n\t // panel we don't want to panel to close.\n\t var self = this;\n\t var mouseupHandler = function(ev) {\n\t if (self.config['propagateContainerEvents']) {\n\t\n\t // We check if the sourceEl of the event is the panel element or one\n\t // of it's children. If it is not, then close the panel.\n\t if (sourceEl !== self.panelEl[0] && !self.panelEl[0].contains(sourceEl)) {\n\t self.close();\n\t }\n\t\n\t } else if (sourceEl === target[0] && ev.target === target[0]) {\n\t ev.stopPropagation();\n\t ev.preventDefault();\n\t\n\t self.close(MdPanelRef.closeReasons.CLICK_OUTSIDE);\n\t }\n\t };\n\t\n\t // Add listeners\n\t target.on('mousedown', mousedownHandler);\n\t target.on('mouseup', mouseupHandler);\n\t\n\t // Queue remove listeners function\n\t this._removeListeners.push(function() {\n\t target.off('mousedown', mousedownHandler);\n\t target.off('mouseup', mouseupHandler);\n\t });\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Configures the listeners for updating the panel position on scroll.\n\t * @private\n\t*/\n\tMdPanelRef.prototype._configureScrollListener = function() {\n\t // No need to bind the event if scrolling is disabled.\n\t if (!this.config['disableParentScroll']) {\n\t var updatePosition = angular.bind(this, this._updatePosition);\n\t var debouncedUpdatePosition = this._$$rAF.throttle(updatePosition);\n\t var self = this;\n\t\n\t var onScroll = function() {\n\t debouncedUpdatePosition();\n\t };\n\t\n\t // Add listeners.\n\t this._$window.addEventListener('scroll', onScroll, true);\n\t\n\t // Queue remove listeners function.\n\t this._removeListeners.push(function() {\n\t self._$window.removeEventListener('scroll', onScroll, true);\n\t });\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Setup the focus traps. These traps will wrap focus when tabbing past the\n\t * panel. When shift-tabbing, the focus will stick in place.\n\t * @private\n\t */\n\tMdPanelRef.prototype._configureTrapFocus = function() {\n\t // Focus doesn't remain inside of the panel without this.\n\t this.panelEl.attr('tabIndex', '-1');\n\t if (this.config['trapFocus']) {\n\t var element = this.panelEl;\n\t // Set up elements before and after the panel to capture focus and\n\t // redirect back into the panel.\n\t this._topFocusTrap = FOCUS_TRAP_TEMPLATE.clone()[0];\n\t this._bottomFocusTrap = FOCUS_TRAP_TEMPLATE.clone()[0];\n\t\n\t // When focus is about to move out of the panel, we want to intercept it\n\t // and redirect it back to the panel element.\n\t var focusHandler = function() {\n\t element.focus();\n\t };\n\t this._topFocusTrap.addEventListener('focus', focusHandler);\n\t this._bottomFocusTrap.addEventListener('focus', focusHandler);\n\t\n\t // Queue remove listeners function\n\t this._removeListeners.push(this._simpleBind(function() {\n\t this._topFocusTrap.removeEventListener('focus', focusHandler);\n\t this._bottomFocusTrap.removeEventListener('focus', focusHandler);\n\t }, this));\n\t\n\t // The top focus trap inserted immediately before the md-panel element (as\n\t // a sibling). The bottom focus trap inserted immediately after the\n\t // md-panel element (as a sibling).\n\t element[0].parentNode.insertBefore(this._topFocusTrap, element[0]);\n\t element.after(this._bottomFocusTrap);\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Updates the animation of a panel.\n\t * @param {!MdPanelAnimation} animation\n\t */\n\tMdPanelRef.prototype.updateAnimation = function(animation) {\n\t this.config['animation'] = animation;\n\t\n\t if (this._backdropRef) {\n\t this._backdropRef.config.animation.duration(animation._rawDuration);\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Animate the panel opening.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n\t * animated open.\n\t * @private\n\t */\n\tMdPanelRef.prototype._animateOpen = function() {\n\t this.panelContainer.addClass('md-panel-is-showing');\n\t var animationConfig = this.config['animation'];\n\t if (!animationConfig) {\n\t // Promise is in progress, return it.\n\t this.panelContainer.addClass('_md-panel-shown');\n\t return this._$q.when(this);\n\t }\n\t\n\t var self = this;\n\t return this._$q(function(resolve) {\n\t var done = self._done(resolve, self);\n\t var warnAndOpen = function() {\n\t self._$log.warn(\n\t 'mdPanel: MdPanel Animations failed. ' +\n\t 'Showing panel without animating.');\n\t done();\n\t };\n\t\n\t animationConfig.animateOpen(self.panelEl)\n\t .then(done, warnAndOpen);\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Animate the panel closing.\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n\t * animated closed.\n\t * @private\n\t */\n\tMdPanelRef.prototype._animateClose = function() {\n\t var animationConfig = this.config['animation'];\n\t if (!animationConfig) {\n\t this.panelContainer.removeClass('md-panel-is-showing');\n\t this.panelContainer.removeClass('_md-panel-shown');\n\t return this._$q.when(this);\n\t }\n\t\n\t var self = this;\n\t return this._$q(function(resolve) {\n\t var done = function() {\n\t self.panelContainer.removeClass('md-panel-is-showing');\n\t resolve(self);\n\t };\n\t var warnAndClose = function() {\n\t self._$log.warn(\n\t 'mdPanel: MdPanel Animations failed. ' +\n\t 'Hiding panel without animating.');\n\t done();\n\t };\n\t\n\t animationConfig.animateClose(self.panelEl)\n\t .then(done, warnAndClose);\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Registers a interceptor with the panel. The callback should return a promise,\n\t * which will allow the action to continue when it gets resolved, or will\n\t * prevent an action if it is rejected.\n\t * @param {string} type Type of interceptor.\n\t * @param {!angular.$q.Promise} callback Callback to be registered.\n\t * @returns {!MdPanelRef}\n\t */\n\tMdPanelRef.prototype.registerInterceptor = function(type, callback) {\n\t var error = null;\n\t\n\t if (!angular.isString(type)) {\n\t error = 'Interceptor type must be a string, instead got ' + typeof type;\n\t } else if (!angular.isFunction(callback)) {\n\t error = 'Interceptor callback must be a function, instead got ' + typeof callback;\n\t }\n\t\n\t if (error) {\n\t throw new Error('MdPanel: ' + error);\n\t }\n\t\n\t var interceptors = this._interceptors[type] = this._interceptors[type] || [];\n\t\n\t if (interceptors.indexOf(callback) === -1) {\n\t interceptors.push(callback);\n\t }\n\t\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Removes a registered interceptor.\n\t * @param {string} type Type of interceptor to be removed.\n\t * @param {Function} callback Interceptor to be removed.\n\t * @returns {!MdPanelRef}\n\t */\n\tMdPanelRef.prototype.removeInterceptor = function(type, callback) {\n\t var index = this._interceptors[type] ?\n\t this._interceptors[type].indexOf(callback) : -1;\n\t\n\t if (index > -1) {\n\t this._interceptors[type].splice(index, 1);\n\t }\n\t\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Removes all interceptors.\n\t * @param {string=} type Type of interceptors to be removed.\n\t * If ommited, all interceptors types will be removed.\n\t * @returns {!MdPanelRef}\n\t */\n\tMdPanelRef.prototype.removeAllInterceptors = function(type) {\n\t if (type) {\n\t this._interceptors[type] = [];\n\t } else {\n\t this._interceptors = Object.create(null);\n\t }\n\t\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Invokes all the interceptors of a certain type sequantially in\n\t * reverse order. Works in a similar way to `$q.all`, except it\n\t * respects the order of the functions.\n\t * @param {string} type Type of interceptors to be invoked.\n\t * @returns {!angular.$q.Promise}\n\t * @private\n\t */\n\tMdPanelRef.prototype._callInterceptors = function(type) {\n\t var self = this;\n\t var $q = self._$q;\n\t var interceptors = self._interceptors && self._interceptors[type] || [];\n\t\n\t return interceptors.reduceRight(function(promise, interceptor) {\n\t var isPromiseLike = interceptor && angular.isFunction(interceptor.then);\n\t var response = isPromiseLike ? interceptor : null;\n\t\n\t /**\n\t * For interceptors to reject/cancel subsequent portions of the chain, simply\n\t * return a `$q.reject()`\n\t */\n\t return promise.then(function() {\n\t if (!response) {\n\t try {\n\t response = interceptor(self);\n\t } catch(e) {\n\t response = $q.reject(e);\n\t }\n\t }\n\t\n\t return response;\n\t });\n\t }, $q.resolve(self));\n\t};\n\t\n\t\n\t/**\n\t * Faster, more basic than angular.bind\n\t * http://jsperf.com/angular-bind-vs-custom-vs-native\n\t * @param {function} callback\n\t * @param {!Object} self\n\t * @return {function} Callback function with a bound self.\n\t */\n\tMdPanelRef.prototype._simpleBind = function(callback, self) {\n\t return function(value) {\n\t return callback.apply(self, value);\n\t };\n\t};\n\t\n\t\n\t/**\n\t * @param {function} callback\n\t * @param {!Object} self\n\t * @return {function} Callback function with a self param.\n\t */\n\tMdPanelRef.prototype._done = function(callback, self) {\n\t return function() {\n\t callback(self);\n\t };\n\t};\n\t\n\t\n\t/**\n\t * Adds a panel to a group if the panel does not exist within the group already.\n\t * A panel can only exist within a single group.\n\t * @param {string} groupName The name of the group.\n\t */\n\tMdPanelRef.prototype.addToGroup = function(groupName) {\n\t if (!this._$mdPanel._groups[groupName]) {\n\t this._$mdPanel.newPanelGroup(groupName);\n\t }\n\t\n\t var group = this._$mdPanel._groups[groupName];\n\t var index = group.panels.indexOf(this);\n\t\n\t if (index < 0) {\n\t group.panels.push(this);\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Removes a panel from a group if the panel exists within that group. The group\n\t * must be created ahead of time.\n\t * @param {string} groupName The name of the group.\n\t */\n\tMdPanelRef.prototype.removeFromGroup = function(groupName) {\n\t if (!this._$mdPanel._groups[groupName]) {\n\t throw new Error('mdPanel: The group ' + groupName + ' does not exist.');\n\t }\n\t\n\t var group = this._$mdPanel._groups[groupName];\n\t var index = group.panels.indexOf(this);\n\t\n\t if (index > -1) {\n\t group.panels.splice(index, 1);\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Possible default closeReasons for the close function.\n\t * @enum {string}\n\t */\n\tMdPanelRef.closeReasons = {\n\t CLICK_OUTSIDE: 'clickOutsideToClose',\n\t ESCAPE: 'escapeToClose',\n\t};\n\t\n\t\n\t/*****************************************************************************\n\t * MdPanelPosition *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * Position configuration object. To use, create an MdPanelPosition with the\n\t * desired properties, then pass the object as part of $mdPanel creation.\n\t *\n\t * Example:\n\t *\n\t * var panelPosition = new MdPanelPosition()\n\t * .relativeTo(myButtonEl)\n\t * .addPanelPosition(\n\t * $mdPanel.xPosition.CENTER,\n\t * $mdPanel.yPosition.ALIGN_TOPS\n\t * );\n\t *\n\t * $mdPanel.create({\n\t * position: panelPosition\n\t * });\n\t *\n\t * @param {!angular.$injector} $injector\n\t * @final @constructor\n\t */\n\tfunction MdPanelPosition($injector) {\n\t /** @private @const {!angular.$window} */\n\t this._$window = $injector.get('$window');\n\t\n\t /** @private {boolean} */\n\t this._isRTL = $injector.get('$mdUtil').bidi() === 'rtl';\n\t\n\t /** @private @const {!angular.$mdConstant} */\n\t this._$mdConstant = $injector.get('$mdConstant');\n\t\n\t /** @private {boolean} */\n\t this._absolute = false;\n\t\n\t /** @private {!angular.JQLite} */\n\t this._relativeToEl;\n\t\n\t /** @private {string} */\n\t this._top = '';\n\t\n\t /** @private {string} */\n\t this._bottom = '';\n\t\n\t /** @private {string} */\n\t this._left = '';\n\t\n\t /** @private {string} */\n\t this._right = '';\n\t\n\t /** @private {!Array} */\n\t this._translateX = [];\n\t\n\t /** @private {!Array} */\n\t this._translateY = [];\n\t\n\t /** @private {!Array<{x:string, y:string}>} */\n\t this._positions = [];\n\t\n\t /** @private {?{x:string, y:string}} */\n\t this._actualPosition;\n\t}\n\t\n\t\n\t/**\n\t * Possible values of xPosition.\n\t * @enum {string}\n\t */\n\tMdPanelPosition.xPosition = {\n\t CENTER: 'center',\n\t ALIGN_START: 'align-start',\n\t ALIGN_END: 'align-end',\n\t OFFSET_START: 'offset-start',\n\t OFFSET_END: 'offset-end'\n\t};\n\t\n\t\n\t/**\n\t * Possible values of yPosition.\n\t * @enum {string}\n\t */\n\tMdPanelPosition.yPosition = {\n\t CENTER: 'center',\n\t ALIGN_TOPS: 'align-tops',\n\t ALIGN_BOTTOMS: 'align-bottoms',\n\t ABOVE: 'above',\n\t BELOW: 'below'\n\t};\n\t\n\t\n\t/**\n\t * Possible values of absolute position.\n\t * @enum {string}\n\t */\n\tMdPanelPosition.absPosition = {\n\t TOP: 'top',\n\t RIGHT: 'right',\n\t BOTTOM: 'bottom',\n\t LEFT: 'left'\n\t};\n\t\n\t/**\n\t * Margin between the edges of a panel and the viewport.\n\t * @const {number}\n\t */\n\tMdPanelPosition.viewportMargin = 8;\n\t\n\t\n\t/**\n\t * Sets absolute positioning for the panel.\n\t * @return {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.absolute = function() {\n\t this._absolute = true;\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Sets the value of a position for the panel. Clears any previously set\n\t * position.\n\t * @param {string} position Position to set\n\t * @param {string=} value Value of the position. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t * @private\n\t */\n\tMdPanelPosition.prototype._setPosition = function(position, value) {\n\t if (position === MdPanelPosition.absPosition.RIGHT ||\n\t position === MdPanelPosition.absPosition.LEFT) {\n\t this._left = this._right = '';\n\t } else if (\n\t position === MdPanelPosition.absPosition.BOTTOM ||\n\t position === MdPanelPosition.absPosition.TOP) {\n\t this._top = this._bottom = '';\n\t } else {\n\t var positions = Object.keys(MdPanelPosition.absPosition).join()\n\t .toLowerCase();\n\t\n\t throw new Error('mdPanel: Position must be one of ' + positions + '.');\n\t }\n\t\n\t this['_' + position] = angular.isString(value) ? value : '0';\n\t\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Sets the value of `top` for the panel. Clears any previously set vertical\n\t * position.\n\t * @param {string=} top Value of `top`. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.top = function(top) {\n\t return this._setPosition(MdPanelPosition.absPosition.TOP, top);\n\t};\n\t\n\t\n\t/**\n\t * Sets the value of `bottom` for the panel. Clears any previously set vertical\n\t * position.\n\t * @param {string=} bottom Value of `bottom`. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.bottom = function(bottom) {\n\t return this._setPosition(MdPanelPosition.absPosition.BOTTOM, bottom);\n\t};\n\t\n\t\n\t/**\n\t * Sets the panel to the start of the page - `left` if `ltr` or `right` for\n\t * `rtl`. Clears any previously set horizontal position.\n\t * @param {string=} start Value of position. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.start = function(start) {\n\t var position = this._isRTL ? MdPanelPosition.absPosition.RIGHT : MdPanelPosition.absPosition.LEFT;\n\t return this._setPosition(position, start);\n\t};\n\t\n\t\n\t/**\n\t * Sets the panel to the end of the page - `right` if `ltr` or `left` for `rtl`.\n\t * Clears any previously set horizontal position.\n\t * @param {string=} end Value of position. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.end = function(end) {\n\t var position = this._isRTL ? MdPanelPosition.absPosition.LEFT : MdPanelPosition.absPosition.RIGHT;\n\t return this._setPosition(position, end);\n\t};\n\t\n\t\n\t/**\n\t * Sets the value of `left` for the panel. Clears any previously set\n\t * horizontal position.\n\t * @param {string=} left Value of `left`. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.left = function(left) {\n\t return this._setPosition(MdPanelPosition.absPosition.LEFT, left);\n\t};\n\t\n\t\n\t/**\n\t * Sets the value of `right` for the panel. Clears any previously set\n\t * horizontal position.\n\t * @param {string=} right Value of `right`. Defaults to '0'.\n\t * @returns {!MdPanelPosition}\n\t*/\n\tMdPanelPosition.prototype.right = function(right) {\n\t return this._setPosition(MdPanelPosition.absPosition.RIGHT, right);\n\t};\n\t\n\t\n\t/**\n\t * Centers the panel horizontally in the viewport. Clears any previously set\n\t * horizontal position.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.centerHorizontally = function() {\n\t this._left = '50%';\n\t this._right = '';\n\t this._translateX = ['-50%'];\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Centers the panel vertically in the viewport. Clears any previously set\n\t * vertical position.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.centerVertically = function() {\n\t this._top = '50%';\n\t this._bottom = '';\n\t this._translateY = ['-50%'];\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Centers the panel horizontally and vertically in the viewport. This is\n\t * equivalent to calling both `centerHorizontally` and `centerVertically`.\n\t * Clears any previously set horizontal and vertical positions.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.center = function() {\n\t return this.centerHorizontally().centerVertically();\n\t};\n\t\n\t\n\t/**\n\t * Sets element for relative positioning.\n\t * @param {string|!Element|!angular.JQLite} element Query selector, DOM element,\n\t * or angular element to set the panel relative to.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.relativeTo = function(element) {\n\t this._absolute = false;\n\t this._relativeToEl = getElement(element);\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Sets the x and y positions for the panel relative to another element.\n\t * @param {string} xPosition must be one of the MdPanelPosition.xPosition\n\t * values.\n\t * @param {string} yPosition must be one of the MdPanelPosition.yPosition\n\t * values.\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.addPanelPosition = function(xPosition, yPosition) {\n\t if (!this._relativeToEl) {\n\t throw new Error('mdPanel: addPanelPosition can only be used with ' +\n\t 'relative positioning. Set relativeTo first.');\n\t }\n\t\n\t this._validateXPosition(xPosition);\n\t this._validateYPosition(yPosition);\n\t\n\t this._positions.push({\n\t x: xPosition,\n\t y: yPosition,\n\t });\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Ensures that yPosition is a valid position name. Throw an exception if not.\n\t * @param {string} yPosition\n\t */\n\tMdPanelPosition.prototype._validateYPosition = function(yPosition) {\n\t // empty is ok\n\t if (yPosition == null) {\n\t return;\n\t }\n\t\n\t var positionKeys = Object.keys(MdPanelPosition.yPosition);\n\t var positionValues = [];\n\t for (var key, i = 0; key = positionKeys[i]; i++) {\n\t var position = MdPanelPosition.yPosition[key];\n\t positionValues.push(position);\n\t\n\t if (position === yPosition) {\n\t return;\n\t }\n\t }\n\t\n\t throw new Error('mdPanel: Panel y position only accepts the following ' +\n\t 'values:\\n' + positionValues.join(' | '));\n\t};\n\t\n\t\n\t/**\n\t * Ensures that xPosition is a valid position name. Throw an exception if not.\n\t * @param {string} xPosition\n\t */\n\tMdPanelPosition.prototype._validateXPosition = function(xPosition) {\n\t // empty is ok\n\t if (xPosition == null) {\n\t return;\n\t }\n\t\n\t var positionKeys = Object.keys(MdPanelPosition.xPosition);\n\t var positionValues = [];\n\t for (var key, i = 0; key = positionKeys[i]; i++) {\n\t var position = MdPanelPosition.xPosition[key];\n\t positionValues.push(position);\n\t if (position === xPosition) {\n\t return;\n\t }\n\t }\n\t\n\t throw new Error('mdPanel: Panel x Position only accepts the following ' +\n\t 'values:\\n' + positionValues.join(' | '));\n\t};\n\t\n\t\n\t/**\n\t * Sets the value of the offset in the x-direction. This will add to any\n\t * previously set offsets.\n\t * @param {string|function(MdPanelPosition): string} offsetX\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.withOffsetX = function(offsetX) {\n\t this._translateX.push(offsetX);\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Sets the value of the offset in the y-direction. This will add to any\n\t * previously set offsets.\n\t * @param {string|function(MdPanelPosition): string} offsetY\n\t * @returns {!MdPanelPosition}\n\t */\n\tMdPanelPosition.prototype.withOffsetY = function(offsetY) {\n\t this._translateY.push(offsetY);\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Gets the value of `top` for the panel.\n\t * @returns {string}\n\t */\n\tMdPanelPosition.prototype.getTop = function() {\n\t return this._top;\n\t};\n\t\n\t\n\t/**\n\t * Gets the value of `bottom` for the panel.\n\t * @returns {string}\n\t */\n\tMdPanelPosition.prototype.getBottom = function() {\n\t return this._bottom;\n\t};\n\t\n\t\n\t/**\n\t * Gets the value of `left` for the panel.\n\t * @returns {string}\n\t */\n\tMdPanelPosition.prototype.getLeft = function() {\n\t return this._left;\n\t};\n\t\n\t\n\t/**\n\t * Gets the value of `right` for the panel.\n\t * @returns {string}\n\t */\n\tMdPanelPosition.prototype.getRight = function() {\n\t return this._right;\n\t};\n\t\n\t\n\t/**\n\t * Gets the value of `transform` for the panel.\n\t * @returns {string}\n\t */\n\tMdPanelPosition.prototype.getTransform = function() {\n\t var translateX = this._reduceTranslateValues('translateX', this._translateX);\n\t var translateY = this._reduceTranslateValues('translateY', this._translateY);\n\t\n\t // It's important to trim the result, because the browser will ignore the set\n\t // operation if the string contains only whitespace.\n\t return (translateX + ' ' + translateY).trim();\n\t};\n\t\n\t\n\t/**\n\t * Sets the `transform` value for a panel element.\n\t * @param {!angular.JQLite} panelEl\n\t * @returns {!angular.JQLite}\n\t * @private\n\t */\n\tMdPanelPosition.prototype._setTransform = function(panelEl) {\n\t return panelEl.css(this._$mdConstant.CSS.TRANSFORM, this.getTransform());\n\t};\n\t\n\t\n\t/**\n\t * True if the panel is completely on-screen with this positioning; false\n\t * otherwise.\n\t * @param {!angular.JQLite} panelEl\n\t * @return {boolean}\n\t * @private\n\t */\n\tMdPanelPosition.prototype._isOnscreen = function(panelEl) {\n\t // this works because we always use fixed positioning for the panel,\n\t // which is relative to the viewport.\n\t var left = parseInt(this.getLeft());\n\t var top = parseInt(this.getTop());\n\t\n\t if (this._translateX.length || this._translateY.length) {\n\t var prefixedTransform = this._$mdConstant.CSS.TRANSFORM;\n\t var offsets = getComputedTranslations(panelEl, prefixedTransform);\n\t left += offsets.x;\n\t top += offsets.y;\n\t }\n\t\n\t var right = left + panelEl[0].offsetWidth;\n\t var bottom = top + panelEl[0].offsetHeight;\n\t\n\t return (left >= 0) &&\n\t (top >= 0) &&\n\t (bottom <= this._$window.innerHeight) &&\n\t (right <= this._$window.innerWidth);\n\t};\n\t\n\t\n\t/**\n\t * Gets the first x/y position that can fit on-screen.\n\t * @returns {{x: string, y: string}}\n\t */\n\tMdPanelPosition.prototype.getActualPosition = function() {\n\t return this._actualPosition;\n\t};\n\t\n\t\n\t/**\n\t * Reduces a list of translate values to a string that can be used within\n\t * transform.\n\t * @param {string} translateFn\n\t * @param {!Array} values\n\t * @returns {string}\n\t * @private\n\t */\n\tMdPanelPosition.prototype._reduceTranslateValues =\n\t function(translateFn, values) {\n\t return values.map(function(translation) {\n\t // TODO(crisbeto): this should add the units after #9609 is merged.\n\t var translationValue = angular.isFunction(translation) ?\n\t translation(this) : translation;\n\t return translateFn + '(' + translationValue + ')';\n\t }, this).join(' ');\n\t };\n\t\n\t\n\t/**\n\t * Sets the panel position based on the created panel element and best x/y\n\t * positioning.\n\t * @param {!angular.JQLite} panelEl\n\t * @private\n\t */\n\tMdPanelPosition.prototype._setPanelPosition = function(panelEl) {\n\t // Remove the \"position adjusted\" class in case it has been added before.\n\t panelEl.removeClass('_md-panel-position-adjusted');\n\t\n\t // Only calculate the position if necessary.\n\t if (this._absolute) {\n\t this._setTransform(panelEl);\n\t return;\n\t }\n\t\n\t if (this._actualPosition) {\n\t this._calculatePanelPosition(panelEl, this._actualPosition);\n\t this._setTransform(panelEl);\n\t this._constrainToViewport(panelEl);\n\t return;\n\t }\n\t\n\t for (var i = 0; i < this._positions.length; i++) {\n\t this._actualPosition = this._positions[i];\n\t this._calculatePanelPosition(panelEl, this._actualPosition);\n\t this._setTransform(panelEl);\n\t\n\t if (this._isOnscreen(panelEl)) {\n\t return;\n\t }\n\t }\n\t\n\t this._constrainToViewport(panelEl);\n\t};\n\t\n\t\n\t/**\n\t * Constrains a panel's position to the viewport.\n\t * @param {!angular.JQLite} panelEl\n\t * @private\n\t */\n\tMdPanelPosition.prototype._constrainToViewport = function(panelEl) {\n\t var margin = MdPanelPosition.viewportMargin;\n\t var initialTop = this._top;\n\t var initialLeft = this._left;\n\t\n\t if (this.getTop()) {\n\t var top = parseInt(this.getTop());\n\t var bottom = panelEl[0].offsetHeight + top;\n\t var viewportHeight = this._$window.innerHeight;\n\t\n\t if (top < margin) {\n\t this._top = margin + 'px';\n\t } else if (bottom > viewportHeight) {\n\t this._top = top - (bottom - viewportHeight + margin) + 'px';\n\t }\n\t }\n\t\n\t if (this.getLeft()) {\n\t var left = parseInt(this.getLeft());\n\t var right = panelEl[0].offsetWidth + left;\n\t var viewportWidth = this._$window.innerWidth;\n\t\n\t if (left < margin) {\n\t this._left = margin + 'px';\n\t } else if (right > viewportWidth) {\n\t this._left = left - (right - viewportWidth + margin) + 'px';\n\t }\n\t }\n\t\n\t // Class that can be used to re-style the panel if it was repositioned.\n\t panelEl.toggleClass(\n\t '_md-panel-position-adjusted',\n\t this._top !== initialTop || this._left !== initialLeft\n\t );\n\t};\n\t\n\t\n\t/**\n\t * Switches between 'start' and 'end'.\n\t * @param {string} position Horizontal position of the panel\n\t * @returns {string} Reversed position\n\t * @private\n\t */\n\tMdPanelPosition.prototype._reverseXPosition = function(position) {\n\t if (position === MdPanelPosition.xPosition.CENTER) {\n\t return;\n\t }\n\t\n\t var start = 'start';\n\t var end = 'end';\n\t\n\t return position.indexOf(start) > -1 ? position.replace(start, end) : position.replace(end, start);\n\t};\n\t\n\t\n\t/**\n\t * Handles horizontal positioning in rtl or ltr environments.\n\t * @param {string} position Horizontal position of the panel\n\t * @returns {string} The correct position according the page direction\n\t * @private\n\t */\n\tMdPanelPosition.prototype._bidi = function(position) {\n\t return this._isRTL ? this._reverseXPosition(position) : position;\n\t};\n\t\n\t\n\t/**\n\t * Calculates the panel position based on the created panel element and the\n\t * provided positioning.\n\t * @param {!angular.JQLite} panelEl\n\t * @param {!{x:string, y:string}} position\n\t * @private\n\t */\n\tMdPanelPosition.prototype._calculatePanelPosition = function(panelEl, position) {\n\t\n\t var panelBounds = panelEl[0].getBoundingClientRect();\n\t var panelWidth = panelBounds.width;\n\t var panelHeight = panelBounds.height;\n\t\n\t var targetBounds = this._relativeToEl[0].getBoundingClientRect();\n\t\n\t var targetLeft = targetBounds.left;\n\t var targetRight = targetBounds.right;\n\t var targetWidth = targetBounds.width;\n\t\n\t switch (this._bidi(position.x)) {\n\t case MdPanelPosition.xPosition.OFFSET_START:\n\t this._left = targetLeft - panelWidth + 'px';\n\t break;\n\t case MdPanelPosition.xPosition.ALIGN_END:\n\t this._left = targetRight - panelWidth + 'px';\n\t break;\n\t case MdPanelPosition.xPosition.CENTER:\n\t var left = targetLeft + (0.5 * targetWidth) - (0.5 * panelWidth);\n\t this._left = left + 'px';\n\t break;\n\t case MdPanelPosition.xPosition.ALIGN_START:\n\t this._left = targetLeft + 'px';\n\t break;\n\t case MdPanelPosition.xPosition.OFFSET_END:\n\t this._left = targetRight + 'px';\n\t break;\n\t }\n\t\n\t var targetTop = targetBounds.top;\n\t var targetBottom = targetBounds.bottom;\n\t var targetHeight = targetBounds.height;\n\t\n\t switch (position.y) {\n\t case MdPanelPosition.yPosition.ABOVE:\n\t this._top = targetTop - panelHeight + 'px';\n\t break;\n\t case MdPanelPosition.yPosition.ALIGN_BOTTOMS:\n\t this._top = targetBottom - panelHeight + 'px';\n\t break;\n\t case MdPanelPosition.yPosition.CENTER:\n\t var top = targetTop + (0.5 * targetHeight) - (0.5 * panelHeight);\n\t this._top = top + 'px';\n\t break;\n\t case MdPanelPosition.yPosition.ALIGN_TOPS:\n\t this._top = targetTop + 'px';\n\t break;\n\t case MdPanelPosition.yPosition.BELOW:\n\t this._top = targetBottom + 'px';\n\t break;\n\t }\n\t};\n\t\n\t\n\t/*****************************************************************************\n\t * MdPanelAnimation *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * Animation configuration object. To use, create an MdPanelAnimation with the\n\t * desired properties, then pass the object as part of $mdPanel creation.\n\t *\n\t * Example:\n\t *\n\t * var panelAnimation = new MdPanelAnimation()\n\t * .openFrom(myButtonEl)\n\t * .closeTo('.my-button')\n\t * .withAnimation($mdPanel.animation.SCALE);\n\t *\n\t * $mdPanel.create({\n\t * animation: panelAnimation\n\t * });\n\t *\n\t * @param {!angular.$injector} $injector\n\t * @final @constructor\n\t */\n\tfunction MdPanelAnimation($injector) {\n\t /** @private @const {!angular.$mdUtil} */\n\t this._$mdUtil = $injector.get('$mdUtil');\n\t\n\t /**\n\t * @private {{element: !angular.JQLite|undefined, bounds: !DOMRect}|\n\t * undefined}\n\t */\n\t this._openFrom;\n\t\n\t /**\n\t * @private {{element: !angular.JQLite|undefined, bounds: !DOMRect}|\n\t * undefined}\n\t */\n\t this._closeTo;\n\t\n\t /** @private {string|{open: string, close: string}} */\n\t this._animationClass = '';\n\t\n\t /** @private {number} */\n\t this._openDuration;\n\t\n\t /** @private {number} */\n\t this._closeDuration;\n\t\n\t /** @private {number|{open: number, close: number}} */\n\t this._rawDuration;\n\t}\n\t\n\t\n\t/**\n\t * Possible default animations.\n\t * @enum {string}\n\t */\n\tMdPanelAnimation.animation = {\n\t SLIDE: 'md-panel-animate-slide',\n\t SCALE: 'md-panel-animate-scale',\n\t FADE: 'md-panel-animate-fade'\n\t};\n\t\n\t\n\t/**\n\t * Specifies where to start the open animation. `openFrom` accepts a\n\t * click event object, query selector, DOM element, or a Rect object that\n\t * is used to determine the bounds. When passed a click event, the location\n\t * of the click will be used as the position to start the animation.\n\t * @param {string|!Element|!Event|{top: number, left: number}} openFrom\n\t * @returns {!MdPanelAnimation}\n\t */\n\tMdPanelAnimation.prototype.openFrom = function(openFrom) {\n\t // Check if 'openFrom' is an Event.\n\t openFrom = openFrom.target ? openFrom.target : openFrom;\n\t\n\t this._openFrom = this._getPanelAnimationTarget(openFrom);\n\t\n\t if (!this._closeTo) {\n\t this._closeTo = this._openFrom;\n\t }\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Specifies where to animate the panel close. `closeTo` accepts a\n\t * query selector, DOM element, or a Rect object that is used to determine\n\t * the bounds.\n\t * @param {string|!Element|{top: number, left: number}} closeTo\n\t * @returns {!MdPanelAnimation}\n\t */\n\tMdPanelAnimation.prototype.closeTo = function(closeTo) {\n\t this._closeTo = this._getPanelAnimationTarget(closeTo);\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Specifies the duration of the animation in milliseconds.\n\t * @param {number|{open: number, close: number}} duration\n\t * @returns {!MdPanelAnimation}\n\t */\n\tMdPanelAnimation.prototype.duration = function(duration) {\n\t if (duration) {\n\t if (angular.isNumber(duration)) {\n\t this._openDuration = this._closeDuration = toSeconds(duration);\n\t } else if (angular.isObject(duration)) {\n\t this._openDuration = toSeconds(duration.open);\n\t this._closeDuration = toSeconds(duration.close);\n\t }\n\t }\n\t\n\t // Save the original value so it can be passed to the backdrop.\n\t this._rawDuration = duration;\n\t\n\t return this;\n\t\n\t function toSeconds(value) {\n\t if (angular.isNumber(value)) return value / 1000;\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Returns the element and bounds for the animation target.\n\t * @param {string|!Element|{top: number, left: number}} location\n\t * @returns {{element: !angular.JQLite|undefined, bounds: !DOMRect}}\n\t * @private\n\t */\n\tMdPanelAnimation.prototype._getPanelAnimationTarget = function(location) {\n\t if (angular.isDefined(location.top) || angular.isDefined(location.left)) {\n\t return {\n\t element: undefined,\n\t bounds: {\n\t top: location.top || 0,\n\t left: location.left || 0\n\t }\n\t };\n\t } else {\n\t return this._getBoundingClientRect(getElement(location));\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Specifies the animation class.\n\t *\n\t * There are several default animations that can be used:\n\t * (MdPanelAnimation.animation)\n\t * SLIDE: The panel slides in and out from the specified\n\t * elements.\n\t * SCALE: The panel scales in and out.\n\t * FADE: The panel fades in and out.\n\t *\n\t * @param {string|{open: string, close: string}} cssClass\n\t * @returns {!MdPanelAnimation}\n\t */\n\tMdPanelAnimation.prototype.withAnimation = function(cssClass) {\n\t this._animationClass = cssClass;\n\t return this;\n\t};\n\t\n\t\n\t/**\n\t * Animate the panel open.\n\t * @param {!angular.JQLite} panelEl\n\t * @returns {!angular.$q.Promise} A promise that is resolved when the open\n\t * animation is complete.\n\t */\n\tMdPanelAnimation.prototype.animateOpen = function(panelEl) {\n\t var animator = this._$mdUtil.dom.animator;\n\t\n\t this._fixBounds(panelEl);\n\t var animationOptions = {};\n\t\n\t // Include the panel transformations when calculating the animations.\n\t var panelTransform = panelEl[0].style.transform || '';\n\t\n\t var openFrom = animator.toTransformCss(panelTransform);\n\t var openTo = animator.toTransformCss(panelTransform);\n\t\n\t switch (this._animationClass) {\n\t case MdPanelAnimation.animation.SLIDE:\n\t // Slide should start with opacity: 1.\n\t panelEl.css('opacity', '1');\n\t\n\t animationOptions = {\n\t transitionInClass: '_md-panel-animate-enter'\n\t };\n\t\n\t var openSlide = animator.calculateSlideToOrigin(\n\t panelEl, this._openFrom) || '';\n\t openFrom = animator.toTransformCss(openSlide + ' ' + panelTransform);\n\t break;\n\t\n\t case MdPanelAnimation.animation.SCALE:\n\t animationOptions = {\n\t transitionInClass: '_md-panel-animate-enter'\n\t };\n\t\n\t var openScale = animator.calculateZoomToOrigin(\n\t panelEl, this._openFrom) || '';\n\t openFrom = animator.toTransformCss(openScale + ' ' + panelTransform);\n\t break;\n\t\n\t case MdPanelAnimation.animation.FADE:\n\t animationOptions = {\n\t transitionInClass: '_md-panel-animate-enter'\n\t };\n\t break;\n\t\n\t default:\n\t if (angular.isString(this._animationClass)) {\n\t animationOptions = {\n\t transitionInClass: this._animationClass\n\t };\n\t } else {\n\t animationOptions = {\n\t transitionInClass: this._animationClass['open'],\n\t transitionOutClass: this._animationClass['close'],\n\t };\n\t }\n\t }\n\t\n\t animationOptions.duration = this._openDuration;\n\t\n\t return animator\n\t .translate3d(panelEl, openFrom, openTo, animationOptions);\n\t};\n\t\n\t\n\t/**\n\t * Animate the panel close.\n\t * @param {!angular.JQLite} panelEl\n\t * @returns {!angular.$q.Promise} A promise that resolves when the close\n\t * animation is complete.\n\t */\n\tMdPanelAnimation.prototype.animateClose = function(panelEl) {\n\t var animator = this._$mdUtil.dom.animator;\n\t var reverseAnimationOptions = {};\n\t\n\t // Include the panel transformations when calculating the animations.\n\t var panelTransform = panelEl[0].style.transform || '';\n\t\n\t var closeFrom = animator.toTransformCss(panelTransform);\n\t var closeTo = animator.toTransformCss(panelTransform);\n\t\n\t switch (this._animationClass) {\n\t case MdPanelAnimation.animation.SLIDE:\n\t // Slide should start with opacity: 1.\n\t panelEl.css('opacity', '1');\n\t reverseAnimationOptions = {\n\t transitionInClass: '_md-panel-animate-leave'\n\t };\n\t\n\t var closeSlide = animator.calculateSlideToOrigin(\n\t panelEl, this._closeTo) || '';\n\t closeTo = animator.toTransformCss(closeSlide + ' ' + panelTransform);\n\t break;\n\t\n\t case MdPanelAnimation.animation.SCALE:\n\t reverseAnimationOptions = {\n\t transitionInClass: '_md-panel-animate-scale-out _md-panel-animate-leave'\n\t };\n\t\n\t var closeScale = animator.calculateZoomToOrigin(\n\t panelEl, this._closeTo) || '';\n\t closeTo = animator.toTransformCss(closeScale + ' ' + panelTransform);\n\t break;\n\t\n\t case MdPanelAnimation.animation.FADE:\n\t reverseAnimationOptions = {\n\t transitionInClass: '_md-panel-animate-fade-out _md-panel-animate-leave'\n\t };\n\t break;\n\t\n\t default:\n\t if (angular.isString(this._animationClass)) {\n\t reverseAnimationOptions = {\n\t transitionOutClass: this._animationClass\n\t };\n\t } else {\n\t reverseAnimationOptions = {\n\t transitionInClass: this._animationClass['close'],\n\t transitionOutClass: this._animationClass['open']\n\t };\n\t }\n\t }\n\t\n\t reverseAnimationOptions.duration = this._closeDuration;\n\t\n\t return animator\n\t .translate3d(panelEl, closeFrom, closeTo, reverseAnimationOptions);\n\t};\n\t\n\t\n\t/**\n\t * Set the height and width to match the panel if not provided.\n\t * @param {!angular.JQLite} panelEl\n\t * @private\n\t */\n\tMdPanelAnimation.prototype._fixBounds = function(panelEl) {\n\t var panelWidth = panelEl[0].offsetWidth;\n\t var panelHeight = panelEl[0].offsetHeight;\n\t\n\t if (this._openFrom && this._openFrom.bounds.height == null) {\n\t this._openFrom.bounds.height = panelHeight;\n\t }\n\t if (this._openFrom && this._openFrom.bounds.width == null) {\n\t this._openFrom.bounds.width = panelWidth;\n\t }\n\t if (this._closeTo && this._closeTo.bounds.height == null) {\n\t this._closeTo.bounds.height = panelHeight;\n\t }\n\t if (this._closeTo && this._closeTo.bounds.width == null) {\n\t this._closeTo.bounds.width = panelWidth;\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Identify the bounding RECT for the target element.\n\t * @param {!angular.JQLite} element\n\t * @returns {{element: !angular.JQLite|undefined, bounds: !DOMRect}}\n\t * @private\n\t */\n\tMdPanelAnimation.prototype._getBoundingClientRect = function(element) {\n\t if (element instanceof angular.element) {\n\t return {\n\t element: element,\n\t bounds: element[0].getBoundingClientRect()\n\t };\n\t }\n\t};\n\t\n\t\n\t/*****************************************************************************\n\t * Util Methods *\n\t *****************************************************************************/\n\t\n\t\n\t/**\n\t * Returns the angular element associated with a css selector or element.\n\t * @param el {string|!angular.JQLite|!Element}\n\t * @returns {!angular.JQLite}\n\t */\n\tfunction getElement(el) {\n\t var queryResult = angular.isString(el) ?\n\t document.querySelector(el) : el;\n\t return angular.element(queryResult);\n\t}\n\t\n\t\n\t/**\n\t * Gets the computed values for an element's translateX and translateY in px.\n\t * @param {!angular.JQLite|!Element} el\n\t * @param {string} property\n\t * @return {{x: number, y: number}}\n\t */\n\tfunction getComputedTranslations(el, property) {\n\t // The transform being returned by `getComputedStyle` is in the format:\n\t // `matrix(a, b, c, d, translateX, translateY)` if defined and `none`\n\t // if the element doesn't have a transform.\n\t var transform = getComputedStyle(el[0] || el)[property];\n\t var openIndex = transform.indexOf('(');\n\t var closeIndex = transform.lastIndexOf(')');\n\t var output = { x: 0, y: 0 };\n\t\n\t if (openIndex > -1 && closeIndex > -1) {\n\t var parsedValues = transform\n\t .substring(openIndex + 1, closeIndex)\n\t .split(', ')\n\t .slice(-2);\n\t\n\t output.x = parseInt(parsedValues[0]);\n\t output.y = parseInt(parsedValues[1]);\n\t }\n\t\n\t return output;\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.progressLinear\n\t * @description Linear Progress module!\n\t */\n\tMdProgressLinearDirective.$inject = [\"$mdTheming\", \"$mdUtil\", \"$log\"];\n\tangular.module('material.components.progressLinear', [\n\t 'material.core'\n\t])\n\t .directive('mdProgressLinear', MdProgressLinearDirective);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdProgressLinear\n\t * @module material.components.progressLinear\n\t * @restrict E\n\t *\n\t * @description\n\t * The linear progress directive is used to make loading content\n\t * in your app as delightful and painless as possible by minimizing\n\t * the amount of visual change a user sees before they can view\n\t * and interact with content.\n\t *\n\t * Each operation should only be represented by one activity indicator\n\t * For example: one refresh operation should not display both a\n\t * refresh bar and an activity circle.\n\t *\n\t * For operations where the percentage of the operation completed\n\t * can be determined, use a determinate indicator. They give users\n\t * a quick sense of how long an operation will take.\n\t *\n\t * For operations where the user is asked to wait a moment while\n\t * something finishes up, and it’s not necessary to expose what's\n\t * happening behind the scenes and how long it will take, use an\n\t * indeterminate indicator.\n\t *\n\t * @param {string} md-mode Select from one of four modes: determinate, indeterminate, buffer or query.\n\t *\n\t * Note: if the `md-mode` value is set as undefined or specified as 1 of the four (4) valid modes, then `indeterminate`\n\t * will be auto-applied as the mode.\n\t *\n\t * Note: if not configured, the `md-mode=\"indeterminate\"` will be auto injected as an attribute. If `value=\"\"` is also specified, however,\n\t * then `md-mode=\"determinate\"` would be auto-injected instead.\n\t * @param {number=} value In determinate and buffer modes, this number represents the percentage of the primary progress bar. Default: 0\n\t * @param {number=} md-buffer-value In the buffer mode, this number represents the percentage of the secondary progress bar. Default: 0\n\t * @param {boolean=} ng-disabled Determines whether to disable the progress element.\n\t *\n\t * @usage\n\t * \n\t * \n\t *\n\t * \n\t *\n\t * \n\t *\n\t * \n\t *\n\t * \n\t * \n\t */\n\tfunction MdProgressLinearDirective($mdTheming, $mdUtil, $log) {\n\t var MODE_DETERMINATE = \"determinate\";\n\t var MODE_INDETERMINATE = \"indeterminate\";\n\t var MODE_BUFFER = \"buffer\";\n\t var MODE_QUERY = \"query\";\n\t var DISABLED_CLASS = \"_md-progress-linear-disabled\";\n\t\n\t return {\n\t restrict: 'E',\n\t template: '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ',\n\t compile: compile\n\t };\n\t\n\t function compile(tElement, tAttrs, transclude) {\n\t tElement.attr('aria-valuemin', 0);\n\t tElement.attr('aria-valuemax', 100);\n\t tElement.attr('role', 'progressbar');\n\t\n\t return postLink;\n\t }\n\t function postLink(scope, element, attr) {\n\t $mdTheming(element);\n\t\n\t var lastMode;\n\t var isDisabled = attr.hasOwnProperty('disabled');\n\t var toVendorCSS = $mdUtil.dom.animator.toCss;\n\t var bar1 = angular.element(element[0].querySelector('.md-bar1'));\n\t var bar2 = angular.element(element[0].querySelector('.md-bar2'));\n\t var container = angular.element(element[0].querySelector('.md-container'));\n\t\n\t element\n\t .attr('md-mode', mode())\n\t .toggleClass(DISABLED_CLASS, isDisabled);\n\t\n\t validateMode();\n\t watchAttributes();\n\t\n\t /**\n\t * Watch the value, md-buffer-value, and md-mode attributes\n\t */\n\t function watchAttributes() {\n\t attr.$observe('value', function(value) {\n\t var percentValue = clamp(value);\n\t element.attr('aria-valuenow', percentValue);\n\t\n\t if (mode() != MODE_QUERY) animateIndicator(bar2, percentValue);\n\t });\n\t\n\t attr.$observe('mdBufferValue', function(value) {\n\t animateIndicator(bar1, clamp(value));\n\t });\n\t\n\t attr.$observe('disabled', function(value) {\n\t if (value === true || value === false) {\n\t isDisabled = !!value;\n\t } else {\n\t isDisabled = angular.isDefined(value);\n\t }\n\t\n\t element.toggleClass(DISABLED_CLASS, isDisabled);\n\t container.toggleClass(lastMode, !isDisabled);\n\t });\n\t\n\t attr.$observe('mdMode', function(mode) {\n\t if (lastMode) container.removeClass( lastMode );\n\t\n\t switch( mode ) {\n\t case MODE_QUERY:\n\t case MODE_BUFFER:\n\t case MODE_DETERMINATE:\n\t case MODE_INDETERMINATE:\n\t container.addClass( lastMode = \"md-mode-\" + mode );\n\t break;\n\t default:\n\t container.addClass( lastMode = \"md-mode-\" + MODE_INDETERMINATE );\n\t break;\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Auto-defaults the mode to either `determinate` or `indeterminate` mode; if not specified\n\t */\n\t function validateMode() {\n\t if ( angular.isUndefined(attr.mdMode) ) {\n\t var hasValue = angular.isDefined(attr.value);\n\t var mode = hasValue ? MODE_DETERMINATE : MODE_INDETERMINATE;\n\t var info = \"Auto-adding the missing md-mode='{0}' to the ProgressLinear element\";\n\t\n\t //$log.debug( $mdUtil.supplant(info, [mode]) );\n\t\n\t element.attr(\"md-mode\", mode);\n\t attr.mdMode = mode;\n\t }\n\t }\n\t\n\t /**\n\t * Is the md-mode a valid option?\n\t */\n\t function mode() {\n\t var value = (attr.mdMode || \"\").trim();\n\t if ( value ) {\n\t switch(value) {\n\t case MODE_DETERMINATE:\n\t case MODE_INDETERMINATE:\n\t case MODE_BUFFER:\n\t case MODE_QUERY:\n\t break;\n\t default:\n\t value = MODE_INDETERMINATE;\n\t break;\n\t }\n\t }\n\t return value;\n\t }\n\t\n\t /**\n\t * Manually set CSS to animate the Determinate indicator based on the specified\n\t * percentage value (0-100).\n\t */\n\t function animateIndicator(target, value) {\n\t if ( isDisabled || !mode() ) return;\n\t\n\t var to = $mdUtil.supplant(\"translateX({0}%) scale({1},1)\", [ (value-100)/2, value/100 ]);\n\t var styles = toVendorCSS({ transform : to });\n\t angular.element(target).css( styles );\n\t }\n\t }\n\t\n\t /**\n\t * Clamps the value to be between 0 and 100.\n\t * @param {number} value The value to clamp.\n\t * @returns {number}\n\t */\n\t function clamp(value) {\n\t return Math.max(0, Math.min(value || 0, 100));\n\t }\n\t}\n\t\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.radioButton\n\t * @description radioButton module!\n\t */\n\tmdRadioGroupDirective.$inject = [\"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$timeout\"];\n\tmdRadioButtonDirective.$inject = [\"$mdAria\", \"$mdUtil\", \"$mdTheming\"];\n\tangular.module('material.components.radioButton', [\n\t 'material.core'\n\t])\n\t .directive('mdRadioGroup', mdRadioGroupDirective)\n\t .directive('mdRadioButton', mdRadioButtonDirective);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @module material.components.radioButton\n\t * @name mdRadioGroup\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * The `` directive identifies a grouping\n\t * container for the 1..n grouped radio buttons; specified using nested\n\t * `` tags.\n\t *\n\t * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n\t * the radio button is in the accent color by default. The primary color palette may be used with\n\t * the `md-primary` class.\n\t *\n\t * Note: `` and `` handle tabindex differently\n\t * than the native `` controls. Whereas the native controls\n\t * force the user to tab through all the radio buttons, ``\n\t * is focusable, and by default the ``s are not.\n\t *\n\t * @param {string} ng-model Assignable angular expression to data-bind to.\n\t * @param {boolean=} md-no-ink Use of attribute indicates flag to disable ink ripple effects.\n\t * @param {string} ngModel Assignable angular expression to data-bind to.\n\t * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n\t * interaction with the input element.\n\t *\n\t * @usage\n\t * \n\t * \n\t *\n\t * \n\t *\n\t * {{ d.label }}\n\t *\n\t * \n\t *\n\t * \n\t * \n\t *\n\t */\n\tfunction mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming, $timeout) {\n\t RadioGroupController.prototype = createRadioGroupControllerProto();\n\t\n\t return {\n\t restrict: 'E',\n\t controller: ['$element', RadioGroupController],\n\t require: ['mdRadioGroup', '?ngModel'],\n\t link: { pre: linkRadioGroup }\n\t };\n\t\n\t function linkRadioGroup(scope, element, attr, ctrls) {\n\t element.addClass('_md'); // private md component indicator for styling\n\t $mdTheming(element);\n\t\n\t var rgCtrl = ctrls[0];\n\t var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n\t\n\t rgCtrl.init(ngModelCtrl);\n\t\n\t scope.mouseActive = false;\n\t\n\t element\n\t .attr({\n\t 'role': 'radiogroup',\n\t 'tabIndex': element.attr('tabindex') || '0'\n\t })\n\t .on('keydown', keydownListener)\n\t .on('mousedown', function(event) {\n\t scope.mouseActive = true;\n\t $timeout(function() {\n\t scope.mouseActive = false;\n\t }, 100);\n\t })\n\t .on('focus', function() {\n\t if(scope.mouseActive === false) {\n\t rgCtrl.$element.addClass('md-focused');\n\t }\n\t })\n\t .on('blur', function() {\n\t rgCtrl.$element.removeClass('md-focused');\n\t });\n\t\n\t /**\n\t *\n\t */\n\t function setFocus() {\n\t if (!element.hasClass('md-focused')) { element.addClass('md-focused'); }\n\t }\n\t\n\t /**\n\t *\n\t */\n\t function keydownListener(ev) {\n\t var keyCode = ev.which || ev.keyCode;\n\t\n\t // Only listen to events that we originated ourselves\n\t // so that we don't trigger on things like arrow keys in\n\t // inputs.\n\t\n\t if (keyCode != $mdConstant.KEY_CODE.ENTER &&\n\t ev.currentTarget != ev.target) {\n\t return;\n\t }\n\t\n\t switch (keyCode) {\n\t case $mdConstant.KEY_CODE.LEFT_ARROW:\n\t case $mdConstant.KEY_CODE.UP_ARROW:\n\t ev.preventDefault();\n\t rgCtrl.selectPrevious();\n\t setFocus();\n\t break;\n\t\n\t case $mdConstant.KEY_CODE.RIGHT_ARROW:\n\t case $mdConstant.KEY_CODE.DOWN_ARROW:\n\t ev.preventDefault();\n\t rgCtrl.selectNext();\n\t setFocus();\n\t break;\n\t\n\t case $mdConstant.KEY_CODE.ENTER:\n\t var form = angular.element($mdUtil.getClosest(element[0], 'form'));\n\t if (form.length > 0) {\n\t form.triggerHandler('submit');\n\t }\n\t break;\n\t }\n\t\n\t }\n\t }\n\t\n\t function RadioGroupController($element) {\n\t this._radioButtonRenderFns = [];\n\t this.$element = $element;\n\t }\n\t\n\t function createRadioGroupControllerProto() {\n\t return {\n\t init: function(ngModelCtrl) {\n\t this._ngModelCtrl = ngModelCtrl;\n\t this._ngModelCtrl.$render = angular.bind(this, this.render);\n\t },\n\t add: function(rbRender) {\n\t this._radioButtonRenderFns.push(rbRender);\n\t },\n\t remove: function(rbRender) {\n\t var index = this._radioButtonRenderFns.indexOf(rbRender);\n\t if (index !== -1) {\n\t this._radioButtonRenderFns.splice(index, 1);\n\t }\n\t },\n\t render: function() {\n\t this._radioButtonRenderFns.forEach(function(rbRender) {\n\t rbRender();\n\t });\n\t },\n\t setViewValue: function(value, eventType) {\n\t this._ngModelCtrl.$setViewValue(value, eventType);\n\t // update the other radio buttons as well\n\t this.render();\n\t },\n\t getViewValue: function() {\n\t return this._ngModelCtrl.$viewValue;\n\t },\n\t selectNext: function() {\n\t return changeSelectedButton(this.$element, 1);\n\t },\n\t selectPrevious: function() {\n\t return changeSelectedButton(this.$element, -1);\n\t },\n\t setActiveDescendant: function (radioId) {\n\t this.$element.attr('aria-activedescendant', radioId);\n\t },\n\t isDisabled: function() {\n\t return this.$element[0].hasAttribute('disabled');\n\t }\n\t };\n\t }\n\t /**\n\t * Change the radio group's selected button by a given increment.\n\t * If no button is selected, select the first button.\n\t */\n\t function changeSelectedButton(parent, increment) {\n\t // Coerce all child radio buttons into an array, then wrap then in an iterator\n\t var buttons = $mdUtil.iterator(parent[0].querySelectorAll('md-radio-button'), true);\n\t\n\t if (buttons.count()) {\n\t var validate = function (button) {\n\t // If disabled, then NOT valid\n\t return !angular.element(button).attr(\"disabled\");\n\t };\n\t\n\t var selected = parent[0].querySelector('md-radio-button.md-checked');\n\t var target = buttons[increment < 0 ? 'previous' : 'next'](selected, validate) || buttons.first();\n\t\n\t // Activate radioButton's click listener (triggerHandler won't create a real click event)\n\t angular.element(target).triggerHandler('click');\n\t }\n\t }\n\t\n\t}\n\t\n\t/**\n\t * @ngdoc directive\n\t * @module material.components.radioButton\n\t * @name mdRadioButton\n\t *\n\t * @restrict E\n\t *\n\t * @description\n\t * The ``directive is the child directive required to be used within `` elements.\n\t *\n\t * While similar to the `` directive,\n\t * the `` directive provides ink effects, ARIA support, and\n\t * supports use within named radio groups.\n\t *\n\t * @param {string} ngValue AngularJS expression which sets the value to which the expression should\n\t * be set when selected.\n\t * @param {string} value The value to which the expression should be set when selected.\n\t * @param {string=} name Property name of the form under which the control is published.\n\t * @param {string=} aria-label Adds label to radio button for accessibility.\n\t * Defaults to radio button's text. If no text content is available, a warning will be logged.\n\t *\n\t * @usage\n\t * \n\t *\n\t * \n\t * Label 1\n\t * \n\t *\n\t * \n\t * Green\n\t * \n\t *\n\t * \n\t *\n\t */\n\tfunction mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {\n\t\n\t var CHECKED_CSS = 'md-checked';\n\t\n\t return {\n\t restrict: 'E',\n\t require: '^mdRadioGroup',\n\t transclude: true,\n\t template: '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ',\n\t link: link\n\t };\n\t\n\t function link(scope, element, attr, rgCtrl) {\n\t var lastChecked;\n\t\n\t $mdTheming(element);\n\t configureAria(element, scope);\n\t\n\t // ngAria overwrites the aria-checked inside a $watch for ngValue.\n\t // We should defer the initialization until all the watches have fired.\n\t // This can also be fixed by removing the `lastChecked` check, but that'll\n\t // cause more DOM manipulation on each digest.\n\t if (attr.ngValue) {\n\t $mdUtil.nextTick(initialize, false);\n\t } else {\n\t initialize();\n\t }\n\t\n\t /**\n\t * Initializes the component.\n\t */\n\t function initialize() {\n\t if (!rgCtrl) {\n\t throw 'RadioButton: No RadioGroupController could be found.';\n\t }\n\t\n\t rgCtrl.add(render);\n\t attr.$observe('value', render);\n\t\n\t element\n\t .on('click', listener)\n\t .on('$destroy', function() {\n\t rgCtrl.remove(render);\n\t });\n\t }\n\t\n\t /**\n\t * On click functionality.\n\t */\n\t function listener(ev) {\n\t if (element[0].hasAttribute('disabled') || rgCtrl.isDisabled()) return;\n\t\n\t scope.$apply(function() {\n\t rgCtrl.setViewValue(attr.value, ev && ev.type);\n\t });\n\t }\n\t\n\t /**\n\t * Add or remove the `.md-checked` class from the RadioButton (and conditionally its parent).\n\t * Update the `aria-activedescendant` attribute.\n\t */\n\t function render() {\n\t var checked = rgCtrl.getViewValue() == attr.value;\n\t\n\t if (checked === lastChecked) return;\n\t\n\t if (element[0].parentNode.nodeName.toLowerCase() !== 'md-radio-group') {\n\t // If the radioButton is inside a div, then add class so highlighting will work\n\t element.parent().toggleClass(CHECKED_CSS, checked);\n\t }\n\t\n\t if (checked) {\n\t rgCtrl.setActiveDescendant(element.attr('id'));\n\t }\n\t\n\t lastChecked = checked;\n\t\n\t element\n\t .attr('aria-checked', checked)\n\t .toggleClass(CHECKED_CSS, checked);\n\t }\n\t\n\t /**\n\t * Inject ARIA-specific attributes appropriate for each radio button\n\t */\n\t function configureAria(element, scope){\n\t element.attr({\n\t id: attr.id || 'radio_' + $mdUtil.nextUid(),\n\t role: 'radio',\n\t 'aria-checked': 'false'\n\t });\n\t\n\t $mdAria.expectWithText(element, 'aria-label');\n\t }\n\t }\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.showHide\n\t */\n\t\n\t// Add additional handlers to ng-show and ng-hide that notify directives\n\t// contained within that they should recompute their size.\n\t// These run in addition to AngularJS's built-in ng-hide and ng-show directives.\n\tangular.module('material.components.showHide', [\n\t 'material.core'\n\t])\n\t .directive('ngShow', createDirective('ngShow', true))\n\t .directive('ngHide', createDirective('ngHide', false));\n\t\n\t\n\tfunction createDirective(name, targetValue) {\n\t return ['$mdUtil', '$window', function($mdUtil, $window) {\n\t return {\n\t restrict: 'A',\n\t multiElement: true,\n\t link: function($scope, $element, $attr) {\n\t var unregister = $scope.$on('$md-resize-enable', function() {\n\t unregister();\n\t\n\t var node = $element[0];\n\t var cachedTransitionStyles = node.nodeType === $window.Node.ELEMENT_NODE ?\n\t $window.getComputedStyle(node) : {};\n\t\n\t $scope.$watch($attr[name], function(value) {\n\t if (!!value === targetValue) {\n\t $mdUtil.nextTick(function() {\n\t $scope.$broadcast('$md-resize');\n\t });\n\t\n\t var opts = {\n\t cachedTransitionStyles: cachedTransitionStyles\n\t };\n\t\n\t $mdUtil.dom.animator.waitTransitionEnd($element, opts).then(function() {\n\t $scope.$broadcast('$md-resize');\n\t });\n\t }\n\t });\n\t });\n\t }\n\t };\n\t }];\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.sidenav\n\t *\n\t * @description\n\t * A Sidenav QP component.\n\t */\n\tSidenavService.$inject = [\"$mdComponentRegistry\", \"$mdUtil\", \"$q\", \"$log\"];\n\tSidenavDirective.$inject = [\"$mdMedia\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdInteraction\", \"$animate\", \"$compile\", \"$parse\", \"$log\", \"$q\", \"$document\", \"$window\", \"$$rAF\"];\n\tSidenavController.$inject = [\"$scope\", \"$attrs\", \"$mdComponentRegistry\", \"$q\", \"$interpolate\"];\n\tangular\n\t .module('material.components.sidenav', [\n\t 'material.core',\n\t 'material.components.backdrop'\n\t ])\n\t .factory('$mdSidenav', SidenavService )\n\t .directive('mdSidenav', SidenavDirective)\n\t .directive('mdSidenavFocus', SidenavFocusDirective)\n\t .controller('$mdSidenavController', SidenavController);\n\t\n\t\n\t/**\n\t * @ngdoc service\n\t * @name $mdSidenav\n\t * @module material.components.sidenav\n\t *\n\t * @description\n\t * `$mdSidenav` makes it easy to interact with multiple sidenavs\n\t * in an app. When looking up a sidenav instance, you can either look\n\t * it up synchronously or wait for it to be initializied asynchronously.\n\t * This is done by passing the second argument to `$mdSidenav`.\n\t *\n\t * @usage\n\t * \n\t * // Async lookup for sidenav instance; will resolve when the instance is available\n\t * $mdSidenav(componentId, true).then(function(instance) {\n\t * $log.debug( componentId + \"is now ready\" );\n\t * });\n\t * // Sync lookup for sidenav instance; this will resolve immediately.\n\t * $mdSidenav(componentId).then(function(instance) {\n\t * $log.debug( componentId + \"is now ready\" );\n\t * });\n\t * // Async toggle the given sidenav;\n\t * // when instance is known ready and lazy lookup is not needed.\n\t * $mdSidenav(componentId)\n\t * .toggle()\n\t * .then(function(){\n\t * $log.debug('toggled');\n\t * });\n\t * // Async open the given sidenav\n\t * $mdSidenav(componentId)\n\t * .open()\n\t * .then(function(){\n\t * $log.debug('opened');\n\t * });\n\t * // Async close the given sidenav\n\t * $mdSidenav(componentId)\n\t * .close()\n\t * .then(function(){\n\t * $log.debug('closed');\n\t * });\n\t * // Sync check to see if the specified sidenav is set to be open\n\t * $mdSidenav(componentId).isOpen();\n\t * // Sync check to whether given sidenav is locked open\n\t * // If this is true, the sidenav will be open regardless of close()\n\t * $mdSidenav(componentId).isLockedOpen();\n\t * // On close callback to handle close, backdrop click or escape key pressed\n\t * // Callback happens BEFORE the close action occurs.\n\t * $mdSidenav(componentId).onClose(function () {\n\t * $log.debug('closing');\n\t * });\n\t * \n\t */\n\tfunction SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {\n\t var errorMsg = \"SideNav '{0}' is not available! Did you use md-component-id='{0}'?\";\n\t var service = {\n\t find : findInstance, // sync - returns proxy API\n\t waitFor : waitForInstance // async - returns promise\n\t };\n\t\n\t /**\n\t * Service API that supports three (3) usages:\n\t * $mdSidenav().find(\"left\") // sync (must already exist) or returns undefined\n\t * $mdSidenav(\"left\").toggle(); // sync (must already exist) or returns reject promise;\n\t * $mdSidenav(\"left\",true).then( function(left){ // async returns instance when available\n\t * left.toggle();\n\t * });\n\t */\n\t return function(handle, enableWait) {\n\t if ( angular.isUndefined(handle) ) return service;\n\t\n\t var shouldWait = enableWait === true;\n\t var instance = service.find(handle, shouldWait);\n\t return !instance && shouldWait ? service.waitFor(handle) :\n\t !instance && angular.isUndefined(enableWait) ? addLegacyAPI(service, handle) : instance;\n\t };\n\t\n\t /**\n\t * For failed instance/handle lookups, older-clients expect an response object with noops\n\t * that include `rejected promise APIs`\n\t */\n\t function addLegacyAPI(service, handle) {\n\t var falseFn = function() { return false; };\n\t var rejectFn = function() {\n\t return $q.when($mdUtil.supplant(errorMsg, [handle || \"\"]));\n\t };\n\t\n\t return angular.extend({\n\t isLockedOpen : falseFn,\n\t isOpen : falseFn,\n\t toggle : rejectFn,\n\t open : rejectFn,\n\t close : rejectFn,\n\t onClose : angular.noop,\n\t then : function(callback) {\n\t return waitForInstance(handle)\n\t .then(callback || angular.noop);\n\t }\n\t }, service);\n\t }\n\t /**\n\t * Synchronously lookup the controller instance for the specified sidNav instance which has been\n\t * registered with the markup `md-component-id`\n\t */\n\t function findInstance(handle, shouldWait) {\n\t var instance = $mdComponentRegistry.get(handle);\n\t\n\t if (!instance && !shouldWait) {\n\t\n\t // Report missing instance\n\t $log.error( $mdUtil.supplant(errorMsg, [handle || \"\"]) );\n\t\n\t // The component has not registered itself... most like NOT yet created\n\t // return null to indicate that the Sidenav is not in the DOM\n\t return undefined;\n\t }\n\t return instance;\n\t }\n\t\n\t /**\n\t * Asynchronously wait for the component instantiation,\n\t * Deferred lookup of component instance using $component registry\n\t */\n\t function waitForInstance(handle) {\n\t return $mdComponentRegistry.when(handle).catch($log.error);\n\t }\n\t}\n\t/**\n\t * @ngdoc directive\n\t * @name mdSidenavFocus\n\t * @module material.components.sidenav\n\t *\n\t * @restrict A\n\t *\n\t * @description\n\t * `mdSidenavFocus` provides a way to specify the focused element when a sidenav opens.\n\t * This is completely optional, as the sidenav itself is focused by default.\n\t *\n\t * @usage\n\t * \n\t * \n\t *
    \n\t * \n\t * \n\t * \n\t * \n\t *
    \n\t *
    \n\t *
    \n\t **/\n\tfunction SidenavFocusDirective() {\n\t return {\n\t restrict: 'A',\n\t require: '^mdSidenav',\n\t link: function(scope, element, attr, sidenavCtrl) {\n\t // @see $mdUtil.findFocusTarget(...)\n\t }\n\t };\n\t}\n\t/**\n\t * @ngdoc directive\n\t * @name mdSidenav\n\t * @module material.components.sidenav\n\t * @restrict E\n\t *\n\t * @description\n\t *\n\t * A Sidenav component that can be opened and closed programatically.\n\t *\n\t * By default, upon opening it will slide out on top of the main content area.\n\t *\n\t * For keyboard and screen reader accessibility, focus is sent to the sidenav wrapper by default.\n\t * It can be overridden with the `md-autofocus` directive on the child element you want focused.\n\t *\n\t * @usage\n\t * \n\t *
    \n\t * \n\t * Left Nav!\n\t * \n\t *\n\t * \n\t * Center Content\n\t * \n\t * Open Left Menu\n\t * \n\t * \n\t *\n\t * \n\t *
    \n\t * \n\t * \n\t * \n\t * \n\t *
    \n\t *
    \n\t *
    \n\t *
    \n\t *\n\t * \n\t * var app = angular.module('myApp', ['ngMaterial']);\n\t * app.controller('MyController', function($scope, $mdSidenav) {\n\t * $scope.openLeftMenu = function() {\n\t * $mdSidenav('left').toggle();\n\t * };\n\t * });\n\t * \n\t *\n\t * @param {expression=} md-is-open A model bound to whether the sidenav is opened.\n\t * @param {boolean=} md-disable-backdrop When present in the markup, the sidenav will not show a backdrop.\n\t * @param {string=} md-component-id componentId to use with $mdSidenav service.\n\t * @param {expression=} md-is-locked-open When this expression evaluates to true,\n\t * the sidenav 'locks open': it falls into the content's flow instead\n\t * of appearing over it. This overrides the `md-is-open` attribute.\n\t * @param {string=} md-disable-scroll-target Selector, pointing to an element, whose scrolling will\n\t * be disabled when the sidenav is opened. By default this is the sidenav's direct parent.\n\t *\n\t* The $mdMedia() service is exposed to the is-locked-open attribute, which\n\t * can be given a media query or one of the `sm`, `gt-sm`, `md`, `gt-md`, `lg` or `gt-lg` presets.\n\t * Examples:\n\t *\n\t * - ``\n\t * - ``\n\t * - `` (locks open on small screens)\n\t */\n\tfunction SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $mdInteraction, $animate,\n\t $compile, $parse, $log, $q, $document, $window, $$rAF) {\n\t return {\n\t restrict: 'E',\n\t scope: {\n\t isOpen: '=?mdIsOpen'\n\t },\n\t controller: '$mdSidenavController',\n\t compile: function(element) {\n\t element.addClass('md-closed').attr('tabIndex', '-1');\n\t return postLink;\n\t }\n\t };\n\t\n\t /**\n\t * Directive Post Link function...\n\t */\n\t function postLink(scope, element, attr, sidenavCtrl) {\n\t var lastParentOverFlow;\n\t var backdrop;\n\t var disableScrollTarget = null;\n\t var triggeringInteractionType;\n\t var triggeringElement = null;\n\t var previousContainerStyles;\n\t var promise = $q.when(true);\n\t var isLockedOpenParsed = $parse(attr.mdIsLockedOpen);\n\t var ngWindow = angular.element($window);\n\t var isLocked = function() {\n\t return isLockedOpenParsed(scope.$parent, {\n\t $media: function(arg) {\n\t $log.warn(\"$media is deprecated for is-locked-open. Use $mdMedia instead.\");\n\t return $mdMedia(arg);\n\t },\n\t $mdMedia: $mdMedia\n\t });\n\t };\n\t\n\t if (attr.mdDisableScrollTarget) {\n\t disableScrollTarget = $document[0].querySelector(attr.mdDisableScrollTarget);\n\t\n\t if (disableScrollTarget) {\n\t disableScrollTarget = angular.element(disableScrollTarget);\n\t } else {\n\t $log.warn($mdUtil.supplant('mdSidenav: couldn\\'t find element matching ' +\n\t 'selector \"{selector}\". Falling back to parent.', { selector: attr.mdDisableScrollTarget }));\n\t }\n\t }\n\t\n\t if (!disableScrollTarget) {\n\t disableScrollTarget = element.parent();\n\t }\n\t\n\t // Only create the backdrop if the backdrop isn't disabled.\n\t if (!attr.hasOwnProperty('mdDisableBackdrop')) {\n\t backdrop = $mdUtil.createBackdrop(scope, \"md-sidenav-backdrop md-opaque ng-enter\");\n\t }\n\t\n\t element.addClass('_md'); // private md component indicator for styling\n\t $mdTheming(element);\n\t\n\t // The backdrop should inherit the sidenavs theme,\n\t // because the backdrop will take its parent theme by default.\n\t if ( backdrop ) $mdTheming.inherit(backdrop, element);\n\t\n\t element.on('$destroy', function() {\n\t backdrop && backdrop.remove();\n\t sidenavCtrl.destroy();\n\t });\n\t\n\t scope.$on('$destroy', function(){\n\t backdrop && backdrop.remove();\n\t });\n\t\n\t scope.$watch(isLocked, updateIsLocked);\n\t scope.$watch('isOpen', updateIsOpen);\n\t\n\t\n\t // Publish special accessor for the Controller instance\n\t sidenavCtrl.$toggleOpen = toggleOpen;\n\t\n\t /**\n\t * Toggle the DOM classes to indicate `locked`\n\t * @param isLocked\n\t */\n\t function updateIsLocked(isLocked, oldValue) {\n\t scope.isLockedOpen = isLocked;\n\t if (isLocked === oldValue) {\n\t element.toggleClass('md-locked-open', !!isLocked);\n\t } else {\n\t $animate[isLocked ? 'addClass' : 'removeClass'](element, 'md-locked-open');\n\t }\n\t if (backdrop) {\n\t backdrop.toggleClass('md-locked-open', !!isLocked);\n\t }\n\t }\n\t\n\t /**\n\t * Toggle the SideNav view and attach/detach listeners\n\t * @param isOpen\n\t */\n\t function updateIsOpen(isOpen) {\n\t // Support deprecated md-sidenav-focus attribute as fallback\n\t var focusEl = $mdUtil.findFocusTarget(element) || $mdUtil.findFocusTarget(element,'[md-sidenav-focus]') || element;\n\t var parent = element.parent();\n\t\n\t parent[isOpen ? 'on' : 'off']('keydown', onKeyDown);\n\t if (backdrop) backdrop[isOpen ? 'on' : 'off']('click', close);\n\t\n\t var restorePositioning = updateContainerPositions(parent, isOpen);\n\t\n\t if ( isOpen ) {\n\t // Capture upon opening..\n\t triggeringElement = $document[0].activeElement;\n\t triggeringInteractionType = $mdInteraction.getLastInteractionType();\n\t }\n\t\n\t disableParentScroll(isOpen);\n\t\n\t return promise = $q.all([\n\t isOpen && backdrop ? $animate.enter(backdrop, parent) : backdrop ?\n\t $animate.leave(backdrop) : $q.when(true),\n\t $animate[isOpen ? 'removeClass' : 'addClass'](element, 'md-closed')\n\t ]).then(function() {\n\t // Perform focus when animations are ALL done...\n\t if (scope.isOpen) {\n\t $$rAF(function() {\n\t // Notifies child components that the sidenav was opened. Should wait\n\t // a frame in order to allow for the element height to be computed.\n\t ngWindow.triggerHandler('resize');\n\t });\n\t\n\t focusEl && focusEl.focus();\n\t }\n\t\n\t // Restores the positioning on the sidenav and backdrop.\n\t restorePositioning && restorePositioning();\n\t });\n\t }\n\t\n\t function updateContainerPositions(parent, willOpen) {\n\t var drawerEl = element[0];\n\t var scrollTop = parent[0].scrollTop;\n\t\n\t if (willOpen && scrollTop) {\n\t previousContainerStyles = {\n\t top: drawerEl.style.top,\n\t bottom: drawerEl.style.bottom,\n\t height: drawerEl.style.height\n\t };\n\t\n\t // When the parent is scrolled down, then we want to be able to show the sidenav at the current scroll\n\t // position. We're moving the sidenav down to the correct scroll position and apply the height of the\n\t // parent, to increase the performance. Using 100% as height, will impact the performance heavily.\n\t var positionStyle = {\n\t top: scrollTop + 'px',\n\t bottom: 'auto',\n\t height: parent[0].clientHeight + 'px'\n\t };\n\t\n\t // Apply the new position styles to the sidenav and backdrop.\n\t element.css(positionStyle);\n\t backdrop.css(positionStyle);\n\t }\n\t\n\t // When the sidenav is closing and we have previous defined container styles,\n\t // then we return a restore function, which resets the sidenav and backdrop.\n\t if (!willOpen && previousContainerStyles) {\n\t return function() {\n\t drawerEl.style.top = previousContainerStyles.top;\n\t drawerEl.style.bottom = previousContainerStyles.bottom;\n\t drawerEl.style.height = previousContainerStyles.height;\n\t\n\t backdrop[0].style.top = null;\n\t backdrop[0].style.bottom = null;\n\t backdrop[0].style.height = null;\n\t\n\t previousContainerStyles = null;\n\t };\n\t }\n\t }\n\t\n\t /**\n\t * Prevent parent scrolling (when the SideNav is open)\n\t */\n\t function disableParentScroll(disabled) {\n\t if ( disabled && !lastParentOverFlow ) {\n\t lastParentOverFlow = disableScrollTarget.css('overflow');\n\t disableScrollTarget.css('overflow', 'hidden');\n\t } else if (angular.isDefined(lastParentOverFlow)) {\n\t disableScrollTarget.css('overflow', lastParentOverFlow);\n\t lastParentOverFlow = undefined;\n\t }\n\t }\n\t\n\t /**\n\t * Toggle the sideNav view and publish a promise to be resolved when\n\t * the view animation finishes.\n\t *\n\t * @param isOpen\n\t * @returns {*}\n\t */\n\t function toggleOpen( isOpen ) {\n\t if (scope.isOpen == isOpen ) {\n\t\n\t return $q.when(true);\n\t\n\t } else {\n\t if (scope.isOpen && sidenavCtrl.onCloseCb) sidenavCtrl.onCloseCb();\n\t\n\t return $q(function(resolve){\n\t // Toggle value to force an async `updateIsOpen()` to run\n\t scope.isOpen = isOpen;\n\t\n\t $mdUtil.nextTick(function() {\n\t // When the current `updateIsOpen()` animation finishes\n\t promise.then(function(result) {\n\t\n\t if ( !scope.isOpen && triggeringElement && triggeringInteractionType === 'keyboard') {\n\t // reset focus to originating element (if available) upon close\n\t triggeringElement.focus();\n\t triggeringElement = null;\n\t }\n\t\n\t resolve(result);\n\t });\n\t });\n\t\n\t });\n\t\n\t }\n\t }\n\t\n\t /**\n\t * Auto-close sideNav when the `escape` key is pressed.\n\t * @param evt\n\t */\n\t function onKeyDown(ev) {\n\t var isEscape = (ev.keyCode === $mdConstant.KEY_CODE.ESCAPE);\n\t return isEscape ? close(ev) : $q.when(true);\n\t }\n\t\n\t /**\n\t * With backdrop `clicks` or `escape` key-press, immediately\n\t * apply the CSS close transition... Then notify the controller\n\t * to close() and perform its own actions.\n\t */\n\t function close(ev) {\n\t ev.preventDefault();\n\t\n\t return sidenavCtrl.close();\n\t }\n\t\n\t }\n\t}\n\t\n\t/*\n\t * @private\n\t * @ngdoc controller\n\t * @name SidenavController\n\t * @module material.components.sidenav\n\t */\n\tfunction SidenavController($scope, $attrs, $mdComponentRegistry, $q, $interpolate) {\n\t\n\t var self = this;\n\t\n\t // Use Default internal method until overridden by directive postLink\n\t\n\t // Synchronous getters\n\t self.isOpen = function() { return !!$scope.isOpen; };\n\t self.isLockedOpen = function() { return !!$scope.isLockedOpen; };\n\t\n\t // Synchronous setters\n\t self.onClose = function (callback) {\n\t self.onCloseCb = callback;\n\t return self;\n\t };\n\t\n\t // Async actions\n\t self.open = function() { return self.$toggleOpen( true ); };\n\t self.close = function() { return self.$toggleOpen( false ); };\n\t self.toggle = function() { return self.$toggleOpen( !$scope.isOpen ); };\n\t self.$toggleOpen = function(value) { return $q.when($scope.isOpen = value); };\n\t\n\t // Evaluate the component id.\n\t var rawId = $attrs.mdComponentId;\n\t var hasDataBinding = rawId && rawId.indexOf($interpolate.startSymbol()) > -1;\n\t var componentId = hasDataBinding ? $interpolate(rawId)($scope.$parent) : rawId;\n\t\n\t // Register the component.\n\t self.destroy = $mdComponentRegistry.register(self, componentId);\n\t\n\t // Watch and update the component, if the id has changed.\n\t if (hasDataBinding) {\n\t $attrs.$observe('mdComponentId', function(id) {\n\t if (id && id !== self.$$mdHandle) {\n\t self.destroy(); // `destroy` only deregisters the old component id so we can add the new one.\n\t self.destroy = $mdComponentRegistry.register(self, id);\n\t }\n\t });\n\t }\n\t}\n\t\n\t})();\n\t(function(){\n\t\"use strict\";\n\t\n\t/**\n\t * @ngdoc module\n\t * @name material.components.select\n\t */\n\t\n\t/***************************************************\n\t\n\t ### TODO - POST RC1 ###\n\t - [ ] Abstract placement logic in $mdSelect service to $mdMenu service\n\t\n\t ***************************************************/\n\t\n\tSelectDirective.$inject = [\"$mdSelect\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdAria\", \"$parse\", \"$sce\", \"$injector\"];\n\tSelectMenuDirective.$inject = [\"$parse\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\"];\n\tOptionDirective.$inject = [\"$mdButtonInkRipple\", \"$mdUtil\", \"$mdTheming\"];\n\tSelectProvider.$inject = [\"$$interimElementProvider\"];\n\tvar SELECT_EDGE_MARGIN = 8;\n\tvar selectNextId = 0;\n\tvar CHECKBOX_SELECTION_INDICATOR =\n\t angular.element('
    ');\n\t\n\tangular.module('material.components.select', [\n\t 'material.core',\n\t 'material.components.backdrop'\n\t ])\n\t .directive('mdSelect', SelectDirective)\n\t .directive('mdSelectMenu', SelectMenuDirective)\n\t .directive('mdOption', OptionDirective)\n\t .directive('mdOptgroup', OptgroupDirective)\n\t .directive('mdSelectHeader', SelectHeaderDirective)\n\t .provider('$mdSelect', SelectProvider);\n\t\n\t/**\n\t * @ngdoc directive\n\t * @name mdSelect\n\t * @restrict E\n\t * @module material.components.select\n\t *\n\t * @description Displays a select box, bound to an ng-model.\n\t *\n\t * When the select is required and uses a floating label, then the label will automatically contain\n\t * an asterisk (`*`). This behavior can be disabled by using the `md-no-asterisk` attribute.\n\t *\n\t * By default, the select will display with an underline to match other form elements. This can be\n\t * disabled by applying the `md-no-underline` CSS class.\n\t *\n\t * ### Option Params\n\t *\n\t * When applied, `md-option-empty` will mark the option as \"empty\" allowing the option to clear the\n\t * select and put it back in it's default state. You may supply this attribute on any option you\n\t * wish, however, it is automatically applied to an option whose `value` or `ng-value` are not\n\t * defined.\n\t *\n\t * **Automatically Applied**\n\t *\n\t * - ``\n\t * - ``\n\t * - ``\n\t * - ``\n\t * - ``\n\t *\n\t * **NOT Automatically Applied**\n\t *\n\t * - ``\n\t * - ``\n\t * - ``\n\t * - `` (this evaluates to the string `\"undefined\"`)\n\t * - <md-option ng-value=\"{{someValueThatMightBeUndefined}}\">\n\t *\n\t * **Note:** A value of `undefined` ***is considered a valid value*** (and does not auto-apply this\n\t * attribute) since you may wish this to be your \"Not Available\" or \"None\" option.\n\t *\n\t * **Note:** Using the `value` attribute (as opposed to `ng-value`) always evaluates to a string, so\n\t * `value=\"null\"` will require the test `ng-if=\"myValue != 'null'\"` rather than `ng-if=\"!myValue\"`.\n\t *\n\t * @param {expression} ng-model The model!\n\t * @param {boolean=} multiple When set to true, allows for more than one option to be selected. The model is an array with the selected choices.\n\t * @param {expression=} md-on-close Expression to be evaluated when the select is closed.\n\t * @param {expression=} md-on-open Expression to be evaluated when opening the select.\n\t * Will hide the select options and show a spinner until the evaluated promise resolves.\n\t * @param {expression=} md-selected-text Expression to be evaluated that will return a string\n\t * to be displayed as a placeholder in the select input box when it is closed. The value\n\t * will be treated as *text* (not html).\n\t * @param {expression=} md-selected-html Expression to be evaluated that will return a string\n\t * to be displayed as a placeholder in the select input box when it is closed. The value\n\t * will be treated as *html*. The value must either be explicitly marked as trustedHtml or\n\t * the ngSanitize module must be loaded.\n\t * @param {string=} placeholder Placeholder hint text.\n\t * @param md-no-asterisk {boolean=} When set to true, an asterisk will not be appended to the\n\t * floating label. **Note:** This attribute is only evaluated once; it is not watched.\n\t * @param {string=} aria-label Optional label for accessibility. Only necessary if no placeholder or\n\t * explicit label is present.\n\t * @param {string=} md-container-class Class list to get applied to the `.md-select-menu-container`\n\t * element (for custom styling).\n\t *\n\t * @usage\n\t * With a placeholder (label and aria-label are added dynamically)\n\t * \n\t * \n\t * \n\t * {{ opt }}\n\t * \n\t * \n\t * \n\t *\n\t * With an explicit label\n\t * \n\t * \n\t * \n\t * \n\t * {{ opt }}\n\t * \n\t * \n\t * \n\t *\n\t * With a select-header\n\t *\n\t * When a developer needs to put more than just a text label in the\n\t * md-select-menu, they should use the md-select-header.\n\t * The user can put custom HTML inside of the header and style it to their liking.\n\t * One common use case of this would be a sticky search bar.\n\t *\n\t * When using the md-select-header the labels that would previously be added to the\n\t * OptGroupDirective are ignored.\n\t *\n\t * \n\t * \n\t * \n\t * \n\t * Neighborhoods - \n\t * \n\t * {{ opt }}\n\t * \n\t * \n\t * \n\t *\n\t * ## Selects and object equality\n\t * When using a `md-select` to pick from a list of objects, it is important to realize how javascript handles\n\t * equality. Consider the following example:\n\t * \n\t * angular.controller('MyCtrl', function($scope) {\n\t * $scope.users = [\n\t * { id: 1, name: 'Bob' },\n\t * { id: 2, name: 'Alice' },\n\t * { id: 3, name: 'Steve' }\n\t * ];\n\t * $scope.selectedUser = { id: 1, name: 'Bob' };\n\t * });\n\t * \n\t * \n\t *
    \n\t * \n\t * {{ user.name }}\n\t * \n\t *
    \n\t *
    \n\t *\n\t * At first one might expect that the select should be populated with \"Bob\" as the selected user. However,\n\t * this is not true. To determine whether something is selected,\n\t * `ngModelController` is looking at whether `$scope.selectedUser == (any user in $scope.users);`;\n\t *\n\t * Javascript's `==` operator does not check for deep equality (ie. that all properties\n\t * on the object are the same), but instead whether the objects are *the same object in memory*.\n\t * In this case, we have two instances of identical objects, but they exist in memory as unique\n\t * entities. Because of this, the select will have no value populated for a selected user.\n\t *\n\t * To get around this, `ngModelController` provides a `track by` option that allows us to specify a different\n\t * expression which will be used for the equality operator. As such, we can update our `html` to\n\t * make use of this by specifying the `ng-model-options=\"{trackBy: '$value.id'}\"` on the `md-select`\n\t * element. This converts our equality expression to be\n\t * `$scope.selectedUser.id == (any id in $scope.users.map(function(u) { return u.id; }));`\n\t * which results in Bob being selected as desired.\n\t *\n\t * Working HTML:\n\t * \n\t *
    \n\t * \n\t * {{ user.name }}\n\t * \n\t *
    \n\t *
    \n\t */\n\tfunction SelectDirective($mdSelect, $mdUtil, $mdConstant, $mdTheming, $mdAria, $parse, $sce,\n\t $injector) {\n\t var keyCodes = $mdConstant.KEY_CODE;\n\t var NAVIGATION_KEYS = [keyCodes.SPACE, keyCodes.ENTER, keyCodes.UP_ARROW, keyCodes.DOWN_ARROW];\n\t\n\t return {\n\t restrict: 'E',\n\t require: ['^?mdInputContainer', 'mdSelect', 'ngModel', '?^form'],\n\t compile: compile,\n\t controller: function() {\n\t } // empty placeholder controller to be initialized in link\n\t };\n\t\n\t function compile(element, attr) {\n\t // add the select value that will hold our placeholder or selected option value\n\t var valueEl = angular.element('');\n\t valueEl.append('');\n\t valueEl.addClass('md-select-value');\n\t if (!valueEl[0].hasAttribute('id')) {\n\t valueEl.attr('id', 'select_value_label_' + $mdUtil.nextUid());\n\t }\n\t\n\t // There's got to be an md-content inside. If there's not one, let's add it.\n\t if (!element.find('md-content').length) {\n\t element.append(angular.element('').append(element.contents()));\n\t }\n\t\n\t\n\t // Add progress spinner for md-options-loading\n\t if (attr.mdOnOpen) {\n\t\n\t // Show progress indicator while loading async\n\t // Use ng-hide for `display:none` so the indicator does not interfere with the options list\n\t element\n\t .find('md-content')\n\t .prepend(angular.element(\n\t '
    ' +\n\t ' ' +\n\t '
    '\n\t ));\n\t\n\t // Hide list [of item options] while loading async\n\t element\n\t .find('md-option')\n\t .attr('ng-show', '$$loadingAsyncDone');\n\t }\n\t\n\t if (attr.name) {\n\t var autofillClone = angular.element(', \n * \n *\n * \n *\n *

    When disabling floating labels

    \n * \n *\n * \n * \n * \n *\n * \n */\nfunction mdInputContainerDirective($mdTheming, $parse) {\n\n ContainerCtrl.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$animate\"];\n var INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT', 'MD-SELECT'];\n\n var LEFT_SELECTORS = INPUT_TAGS.reduce(function(selectors, isel) {\n return selectors.concat(['md-icon ~ ' + isel, '.md-icon ~ ' + isel]);\n }, []).join(\",\");\n\n var RIGHT_SELECTORS = INPUT_TAGS.reduce(function(selectors, isel) {\n return selectors.concat([isel + ' ~ md-icon', isel + ' ~ .md-icon']);\n }, []).join(\",\");\n\n return {\n restrict: 'E',\n compile: compile,\n controller: ContainerCtrl\n };\n\n function compile(tElement) {\n // Check for both a left & right icon\n var leftIcon = tElement[0].querySelector(LEFT_SELECTORS);\n var rightIcon = tElement[0].querySelector(RIGHT_SELECTORS);\n\n if (leftIcon) { tElement.addClass('md-icon-left'); }\n if (rightIcon) { tElement.addClass('md-icon-right'); }\n\n return function postLink(scope, element) {\n $mdTheming(element);\n };\n }\n\n function ContainerCtrl($scope, $element, $attrs, $animate) {\n var self = this;\n\n self.isErrorGetter = $attrs.mdIsError && $parse($attrs.mdIsError);\n\n self.delegateClick = function() {\n self.input.focus();\n };\n self.element = $element;\n self.setFocused = function(isFocused) {\n $element.toggleClass('md-input-focused', !!isFocused);\n };\n self.setHasValue = function(hasValue) {\n $element.toggleClass('md-input-has-value', !!hasValue);\n };\n self.setHasPlaceholder = function(hasPlaceholder) {\n $element.toggleClass('md-input-has-placeholder', !!hasPlaceholder);\n };\n self.setInvalid = function(isInvalid) {\n if (isInvalid) {\n $animate.addClass($element, 'md-input-invalid');\n } else {\n $animate.removeClass($element, 'md-input-invalid');\n }\n };\n $scope.$watch(function() {\n return self.label && self.input;\n }, function(hasLabelAndInput) {\n if (hasLabelAndInput && !self.label.attr('for')) {\n self.label.attr('for', self.input.attr('id'));\n }\n });\n }\n}\n\nfunction labelDirective() {\n return {\n restrict: 'E',\n require: '^?mdInputContainer',\n link: function(scope, element, attr, containerCtrl) {\n if (!containerCtrl || attr.mdNoFloat || element.hasClass('md-container-ignore')) return;\n\n containerCtrl.label = element;\n scope.$on('$destroy', function() {\n containerCtrl.label = null;\n });\n }\n };\n}\n\n/**\n * @ngdoc directive\n * @name mdInput\n * @restrict E\n * @module material.components.input\n *\n * @description\n * You can use any `` or `\n *
    \n *
    This is required!
    \n *
    That's too long!
    \n *
    \n * \n * \n * \n * \n * \n * \n * \n * \n * \n *\n *

    Notes

    \n *\n * - Requires [ngMessages](https://docs.angularjs.org/api/ngMessages).\n * - Behaves like the [AngularJS input directive](https://docs.angularjs.org/api/ng/directive/input).\n *\n * The `md-input` and `md-input-container` directives use very specific positioning to achieve the\n * error animation effects. Therefore, it is *not* advised to use the Layout system inside of the\n * `` tags. Instead, use relative or absolute positioning.\n *\n *\n *

    Textarea directive

    \n * The `textarea` element within a `md-input-container` has the following specific behavior:\n * - By default the `textarea` grows as the user types. This can be disabled via the `md-no-autogrow`\n * attribute.\n * - If a `textarea` has the `rows` attribute, it will treat the `rows` as the minimum height and will\n * continue growing as the user types. For example a textarea with `rows=\"3\"` will be 3 lines of text\n * high initially. If no rows are specified, the directive defaults to 1.\n * - The textarea's height gets set on initialization, as well as while the user is typing. In certain situations\n * (e.g. while animating) the directive might have been initialized, before the element got it's final height. In\n * those cases, you can trigger a resize manually by broadcasting a `md-resize-textarea` event on the scope.\n * - If you want a `textarea` to stop growing at a certain point, you can specify the `max-rows` attribute.\n * - The textarea's bottom border acts as a handle which users can drag, in order to resize the element vertically.\n * Once the user has resized a `textarea`, the autogrowing functionality becomes disabled. If you don't want a\n * `textarea` to be resizeable by the user, you can add the `md-no-resize` attribute.\n */\n\nfunction inputTextareaDirective($mdUtil, $window, $mdAria, $timeout, $mdGesture) {\n return {\n restrict: 'E',\n require: ['^?mdInputContainer', '?ngModel', '?^form'],\n link: postLink\n };\n\n function postLink(scope, element, attr, ctrls) {\n\n var containerCtrl = ctrls[0];\n var hasNgModel = !!ctrls[1];\n var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n var parentForm = ctrls[2];\n var isReadonly = angular.isDefined(attr.readonly);\n var mdNoAsterisk = $mdUtil.parseAttributeBoolean(attr.mdNoAsterisk);\n var tagName = element[0].tagName.toLowerCase();\n\n\n if (!containerCtrl) return;\n if (attr.type === 'hidden') {\n element.attr('aria-hidden', 'true');\n return;\n } else if (containerCtrl.input) {\n if (containerCtrl.input[0].contains(element[0])) {\n return;\n } else {\n throw new Error(\" can only have *one* , \n * \n *\n * \n */\nfunction mdSelectOnFocusDirective($timeout) {\n\n return {\n restrict: 'A',\n link: postLink\n };\n\n function postLink(scope, element, attr) {\n if (element[0].nodeName !== 'INPUT' && element[0].nodeName !== \"TEXTAREA\") return;\n\n var preventMouseUp = false;\n\n element\n .on('focus', onFocus)\n .on('mouseup', onMouseUp);\n\n scope.$on('$destroy', function() {\n element\n .off('focus', onFocus)\n .off('mouseup', onMouseUp);\n });\n\n function onFocus() {\n preventMouseUp = true;\n\n $timeout(function() {\n // Use HTMLInputElement#select to fix firefox select issues.\n // The debounce is here for Edge's sake, otherwise the selection doesn't work.\n element[0].select();\n\n // This should be reset from inside the `focus`, because the event might\n // have originated from something different than a click, e.g. a keyboard event.\n preventMouseUp = false;\n }, 1, false);\n }\n\n // Prevents the default action of the first `mouseup` after a focus.\n // This is necessary, because browsers fire a `mouseup` right after the element\n // has been focused. In some browsers (Firefox in particular) this can clear the\n // selection. There are examples of the problem in issue #7487.\n function onMouseUp(event) {\n if (preventMouseUp) {\n event.preventDefault();\n }\n }\n }\n}\n\nvar visibilityDirectives = ['ngIf', 'ngShow', 'ngHide', 'ngSwitchWhen', 'ngSwitchDefault'];\nfunction ngMessagesDirective() {\n return {\n restrict: 'EA',\n link: postLink,\n\n // This is optional because we don't want target *all* ngMessage instances, just those inside of\n // mdInputContainer.\n require: '^^?mdInputContainer'\n };\n\n function postLink(scope, element, attrs, inputContainer) {\n // If we are not a child of an input container, don't do anything\n if (!inputContainer) return;\n\n // Add our animation class\n element.toggleClass('md-input-messages-animation', true);\n\n // Add our md-auto-hide class to automatically hide/show messages when container is invalid\n element.toggleClass('md-auto-hide', true);\n\n // If we see some known visibility directives, remove the md-auto-hide class\n if (attrs.mdAutoHide == 'false' || hasVisibiltyDirective(attrs)) {\n element.toggleClass('md-auto-hide', false);\n }\n }\n\n function hasVisibiltyDirective(attrs) {\n return visibilityDirectives.some(function(attr) {\n return attrs[attr];\n });\n }\n}\n\nfunction ngMessageDirective($mdUtil) {\n return {\n restrict: 'EA',\n compile: compile,\n priority: 100\n };\n\n function compile(tElement) {\n if (!isInsideInputContainer(tElement)) {\n\n // When the current element is inside of a document fragment, then we need to check for an input-container\n // in the postLink, because the element will be later added to the DOM and is currently just in a temporary\n // fragment, which causes the input-container check to fail.\n if (isInsideFragment()) {\n return function (scope, element) {\n if (isInsideInputContainer(element)) {\n // Inside of the postLink function, a ngMessage directive will be a comment element, because it's\n // currently hidden. To access the shown element, we need to use the element from the compile function.\n initMessageElement(tElement);\n }\n };\n }\n } else {\n initMessageElement(tElement);\n }\n\n function isInsideFragment() {\n var nextNode = tElement[0];\n while (nextNode = nextNode.parentNode) {\n if (nextNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n return true;\n }\n }\n return false;\n }\n\n function isInsideInputContainer(element) {\n return !!$mdUtil.getClosest(element, \"md-input-container\");\n }\n\n function initMessageElement(element) {\n // Add our animation class\n element.toggleClass('md-input-message-animation', true);\n }\n }\n}\n\nvar $$AnimateRunner, $animateCss, $mdUtil, $log;\n\nfunction mdInputInvalidMessagesAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\n return {\n addClass: function(element, className, done) {\n showInputMessages(element, done);\n }\n\n // NOTE: We do not need the removeClass method, because the message ng-leave animation will fire\n };\n}\n\nfunction ngMessagesAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\n return {\n enter: function(element, done) {\n showInputMessages(element, done);\n },\n\n leave: function(element, done) {\n hideInputMessages(element, done);\n },\n\n addClass: function(element, className, done) {\n if (className == \"ng-hide\") {\n hideInputMessages(element, done);\n } else {\n done();\n }\n },\n\n removeClass: function(element, className, done) {\n if (className == \"ng-hide\") {\n showInputMessages(element, done);\n } else {\n done();\n }\n }\n };\n}\n\nfunction ngMessageAnimation($$AnimateRunner, $animateCss, $mdUtil, $log) {\n saveSharedServices($$AnimateRunner, $animateCss, $mdUtil, $log);\n\n return {\n enter: function(element, done) {\n var animator = showMessage(element);\n\n animator.start().done(done);\n },\n\n leave: function(element, done) {\n var animator = hideMessage(element);\n\n animator.start().done(done);\n }\n };\n}\n\nfunction showInputMessages(element, done) {\n var animators = [], animator;\n var messages = getMessagesElement(element);\n var children = messages.children();\n\n if (messages.length == 0 || children.length == 0) {\n $log.warn('mdInput messages show animation called on invalid messages element: ', element);\n done();\n return;\n }\n\n angular.forEach(children, function(child) {\n animator = showMessage(angular.element(child));\n\n animators.push(animator.start());\n });\n\n $$AnimateRunner.all(animators, done);\n}\n\nfunction hideInputMessages(element, done) {\n var animators = [], animator;\n var messages = getMessagesElement(element);\n var children = messages.children();\n\n if (messages.length == 0 || children.length == 0) {\n $log.warn('mdInput messages hide animation called on invalid messages element: ', element);\n done();\n return;\n }\n\n angular.forEach(children, function(child) {\n animator = hideMessage(angular.element(child));\n\n animators.push(animator.start());\n });\n\n $$AnimateRunner.all(animators, done);\n}\n\nfunction showMessage(element) {\n var height = parseInt(window.getComputedStyle(element[0]).height);\n var topMargin = parseInt(window.getComputedStyle(element[0]).marginTop);\n\n var messages = getMessagesElement(element);\n var container = getInputElement(element);\n\n // Check to see if the message is already visible so we can skip\n var alreadyVisible = (topMargin > -height);\n\n // If we have the md-auto-hide class, the md-input-invalid animation will fire, so we can skip\n if (alreadyVisible || (messages.hasClass('md-auto-hide') && !container.hasClass('md-input-invalid'))) {\n return $animateCss(element, {});\n }\n\n return $animateCss(element, {\n event: 'enter',\n structural: true,\n from: {\"opacity\": 0, \"margin-top\": -height + \"px\"},\n to: {\"opacity\": 1, \"margin-top\": \"0\"},\n duration: 0.3\n });\n}\n\nfunction hideMessage(element) {\n var height = element[0].offsetHeight;\n var styles = window.getComputedStyle(element[0]);\n\n // If we are already hidden, just return an empty animation\n if (parseInt(styles.opacity) === 0) {\n return $animateCss(element, {});\n }\n\n // Otherwise, animate\n return $animateCss(element, {\n event: 'leave',\n structural: true,\n from: {\"opacity\": 1, \"margin-top\": 0},\n to: {\"opacity\": 0, \"margin-top\": -height + \"px\"},\n duration: 0.3\n });\n}\n\nfunction getInputElement(element) {\n var inputContainer = element.controller('mdInputContainer');\n\n return inputContainer.element;\n}\n\nfunction getMessagesElement(element) {\n // If we ARE the messages element, just return ourself\n if (element.hasClass('md-input-messages-animation')) {\n return element;\n }\n\n // If we are a ng-message element, we need to traverse up the DOM tree\n if (element.hasClass('md-input-message-animation')) {\n return angular.element($mdUtil.getClosest(element, function(node) {\n return node.classList.contains('md-input-messages-animation');\n }));\n }\n\n // Otherwise, we can traverse down\n return angular.element(element[0].querySelector('.md-input-messages-animation'));\n}\n\nfunction saveSharedServices(_$$AnimateRunner_, _$animateCss_, _$mdUtil_, _$log_) {\n $$AnimateRunner = _$$AnimateRunner_;\n $animateCss = _$animateCss_;\n $mdUtil = _$mdUtil_;\n $log = _$log_;\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.list\n * @description\n * List module\n */\nMdListController.$inject = [\"$scope\", \"$element\", \"$mdListInkRipple\"];\nmdListDirective.$inject = [\"$mdTheming\"];\nmdListItemDirective.$inject = [\"$mdAria\", \"$mdConstant\", \"$mdUtil\", \"$timeout\"];\nangular.module('material.components.list', [\n 'material.core'\n])\n .controller('MdListController', MdListController)\n .directive('mdList', mdListDirective)\n .directive('mdListItem', mdListItemDirective);\n\n/**\n * @ngdoc directive\n * @name mdList\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * The `` directive is a list container for 1..n `` tags.\n *\n * @usage\n * \n * \n * \n * \n *
    \n *

    {{item.title}}

    \n *

    {{item.description}}

    \n *
    \n *
    \n *
    \n *
    \n */\n\nfunction mdListDirective($mdTheming) {\n return {\n restrict: 'E',\n compile: function(tEl) {\n tEl[0].setAttribute('role', 'list');\n return $mdTheming;\n }\n };\n}\n/**\n * @ngdoc directive\n * @name mdListItem\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * A `md-list-item` element can be used to represent some information in a row.
    \n *\n * @usage\n * ### Single Row Item\n * \n * \n * Single Row Item\n * \n * \n *\n * ### Multiple Lines\n * By using the following markup, you will be able to have two lines inside of one `md-list-item`.\n *\n * \n * \n *
    \n *

    First Line

    \n *

    Second Line

    \n *
    \n *
    \n *
    \n *\n * It is also possible to have three lines inside of one list item.\n *\n * \n * \n *
    \n *

    First Line

    \n *

    Second Line

    \n *

    Third Line

    \n *
    \n *
    \n *
    \n *\n * ### Secondary Items\n * Secondary items are elements which will be aligned at the end of the `md-list-item`.\n *\n * \n * \n * Single Row Item\n * \n * Secondary Button\n * \n * \n * \n *\n * It also possible to have multiple secondary items inside of one `md-list-item`.\n *\n * \n * \n * Single Row Item\n * First Button\n * Second Button\n * \n * \n *\n * ### Proxy Item\n * Proxies are elements, which will execute their specific action on click
    \n * Currently supported proxy items are\n * - `md-checkbox` (Toggle)\n * - `md-switch` (Toggle)\n * - `md-menu` (Open)\n *\n * This means, when using a supported proxy item inside of `md-list-item`, the list item will\n * automatically become clickable and executes the associated action of the proxy element on click.\n *\n * It is possible to disable this behavior by applying the `md-no-proxy` class to the list item.\n *\n * \n * \n * No Proxy List\n * \n * \n * \n *\n * Here are a few examples of proxy elements inside of a list item.\n *\n * \n * \n * First Line\n * \n * \n * \n *\n * The `md-checkbox` element will be automatically detected as a proxy element and will toggle on click.\n *\n * \n * \n * First Line\n * \n * \n * \n *\n * The recognized `md-switch` will toggle its state, when the user clicks on the `md-list-item`.\n *\n * It is also possible to have a `md-menu` inside of a `md-list-item`.\n * \n * \n *

    Click anywhere to fire the secondary action

    \n * \n * \n * \n * \n * \n * \n * \n * Redial\n * \n * \n * \n * \n * Check voicemail\n * \n * \n * \n * \n * \n * Notifications\n * \n * \n * \n * \n *
    \n *
    \n *\n * The menu will automatically open, when the users clicks on the `md-list-item`.
    \n *\n * If the developer didn't specify any position mode on the menu, the `md-list-item` will automatically detect the\n * position mode and applies it to the `md-menu`.\n *\n * ### Avatars\n * Sometimes you may want to have some avatars inside of the `md-list-item `.
    \n * You are able to create a optimized icon for the list item, by applying the `.md-avatar` class on the `` element.\n *\n * \n * \n * \n * Alan Turing\n * \n *\n * When using `` for an avatar, you have to use the `.md-avatar-icon` class.\n * \n * \n * \n * Timothy Kopra\n * \n * \n *\n * In cases, you have a `md-list-item`, which doesn't have any avatar,\n * but you want to align it with the other avatar items, you have to use the `.md-offset` class.\n *\n * \n * \n * Jon Doe\n * \n * \n *\n * ### DOM modification\n * The `md-list-item` component automatically detects if the list item should be clickable.\n *\n * ---\n * If the `md-list-item` is clickable, we wrap all content inside of a `
    ` and create\n * an overlaying button, which will will execute the given actions (like `ng-href`, `ng-click`)\n *\n * We create an overlaying button, instead of wrapping all content inside of the button,\n * because otherwise some elements may not be clickable inside of the button.\n *\n * ---\n * When using a secondary item inside of your list item, the `md-list-item` component will automatically create\n * a secondary container at the end of the `md-list-item`, which contains all secondary items.\n *\n * The secondary item container is not static, because otherwise the overflow will not work properly on the\n * list item.\n *\n */\nfunction mdListItemDirective($mdAria, $mdConstant, $mdUtil, $timeout) {\n var proxiedTypes = ['md-checkbox', 'md-switch', 'md-menu'];\n return {\n restrict: 'E',\n controller: 'MdListController',\n compile: function(tEl, tAttrs) {\n\n // Check for proxy controls (no ng-click on parent, and a control inside)\n var secondaryItems = tEl[0].querySelectorAll('.md-secondary');\n var hasProxiedElement;\n var proxyElement;\n var itemContainer = tEl;\n\n tEl[0].setAttribute('role', 'listitem');\n\n if (tAttrs.ngClick || tAttrs.ngDblclick || tAttrs.ngHref || tAttrs.href || tAttrs.uiSref || tAttrs.ngAttrUiSref) {\n wrapIn('button');\n } else if (!tEl.hasClass('md-no-proxy')) {\n\n for (var i = 0, type; type = proxiedTypes[i]; ++i) {\n if (proxyElement = tEl[0].querySelector(type)) {\n hasProxiedElement = true;\n break;\n }\n }\n\n if (hasProxiedElement) {\n wrapIn('div');\n } else {\n tEl.addClass('md-no-proxy');\n }\n\n }\n\n wrapSecondaryItems();\n setupToggleAria();\n\n if (hasProxiedElement && proxyElement.nodeName === \"MD-MENU\") {\n setupProxiedMenu();\n }\n\n function setupToggleAria() {\n var toggleTypes = ['md-switch', 'md-checkbox'];\n var toggle;\n\n for (var i = 0, toggleType; toggleType = toggleTypes[i]; ++i) {\n if (toggle = tEl.find(toggleType)[0]) {\n if (!toggle.hasAttribute('aria-label')) {\n var p = tEl.find('p')[0];\n if (!p) return;\n toggle.setAttribute('aria-label', 'Toggle ' + p.textContent);\n }\n }\n }\n }\n\n function setupProxiedMenu() {\n var menuEl = angular.element(proxyElement);\n\n var isEndAligned = menuEl.parent().hasClass('md-secondary-container') ||\n proxyElement.parentNode.firstElementChild !== proxyElement;\n\n var xAxisPosition = 'left';\n\n if (isEndAligned) {\n // When the proxy item is aligned at the end of the list, we have to set the origin to the end.\n xAxisPosition = 'right';\n }\n\n // Set the position mode / origin of the proxied menu.\n if (!menuEl.attr('md-position-mode')) {\n menuEl.attr('md-position-mode', xAxisPosition + ' target');\n }\n\n // Apply menu open binding to menu button\n var menuOpenButton = menuEl.children().eq(0);\n if (!hasClickEvent(menuOpenButton[0])) {\n menuOpenButton.attr('ng-click', '$mdMenu.open($event)');\n }\n\n if (!menuOpenButton.attr('aria-label')) {\n menuOpenButton.attr('aria-label', 'Open List Menu');\n }\n }\n\n function wrapIn(type) {\n if (type == 'div') {\n itemContainer = angular.element('
    ');\n itemContainer.append(tEl.contents());\n tEl.addClass('md-proxy-focus');\n } else {\n // Element which holds the default list-item content.\n itemContainer = angular.element(\n '
    '+\n '
    '+\n '
    '\n );\n\n // Button which shows ripple and executes primary action.\n var buttonWrap = angular.element(\n ''\n );\n\n copyAttributes(tEl[0], buttonWrap[0]);\n\n // If there is no aria-label set on the button (previously copied over if present)\n // we determine the label from the content and copy it to the button.\n if (!buttonWrap.attr('aria-label')) {\n buttonWrap.attr('aria-label', $mdAria.getText(tEl));\n }\n\n // We allow developers to specify the `md-no-focus` class, to disable the focus style\n // on the button executor. Once more classes should be forwarded, we should probably make the\n // class forward more generic.\n if (tEl.hasClass('md-no-focus')) {\n buttonWrap.addClass('md-no-focus');\n }\n\n // Append the button wrap before our list-item content, because it will overlay in relative.\n itemContainer.prepend(buttonWrap);\n itemContainer.children().eq(1).append(tEl.contents());\n\n tEl.addClass('_md-button-wrap');\n }\n\n tEl[0].setAttribute('tabindex', '-1');\n tEl.append(itemContainer);\n }\n\n function wrapSecondaryItems() {\n var secondaryItemsWrapper = angular.element('
    ');\n\n angular.forEach(secondaryItems, function(secondaryItem) {\n wrapSecondaryItem(secondaryItem, secondaryItemsWrapper);\n });\n\n itemContainer.append(secondaryItemsWrapper);\n }\n\n function wrapSecondaryItem(secondaryItem, container) {\n // If the current secondary item is not a button, but contains a ng-click attribute,\n // the secondary item will be automatically wrapped inside of a button.\n if (secondaryItem && !isButton(secondaryItem) && secondaryItem.hasAttribute('ng-click')) {\n\n $mdAria.expect(secondaryItem, 'aria-label');\n var buttonWrapper = angular.element('');\n\n // Copy the attributes from the secondary item to the generated button.\n // We also support some additional attributes from the secondary item,\n // because some developers may use a ngIf, ngHide, ngShow on their item.\n copyAttributes(secondaryItem, buttonWrapper[0], ['ng-if', 'ng-hide', 'ng-show']);\n\n secondaryItem.setAttribute('tabindex', '-1');\n buttonWrapper.append(secondaryItem);\n\n secondaryItem = buttonWrapper[0];\n }\n\n if (secondaryItem && (!hasClickEvent(secondaryItem) || (!tAttrs.ngClick && isProxiedElement(secondaryItem)))) {\n // In this case we remove the secondary class, so we can identify it later, when we searching for the\n // proxy items.\n angular.element(secondaryItem).removeClass('md-secondary');\n }\n\n tEl.addClass('md-with-secondary');\n container.append(secondaryItem);\n }\n\n /**\n * Copies attributes from a source element to the destination element\n * By default the function will copy the most necessary attributes, supported\n * by the button executor for clickable list items.\n * @param source Element with the specified attributes\n * @param destination Element which will retrieve the attributes\n * @param extraAttrs Additional attributes, which will be copied over.\n */\n function copyAttributes(source, destination, extraAttrs) {\n var copiedAttrs = $mdUtil.prefixer([\n 'ng-if', 'ng-click', 'ng-dblclick', 'aria-label', 'ng-disabled', 'ui-sref',\n 'href', 'ng-href', 'target', 'ng-attr-ui-sref', 'ui-sref-opts'\n ]);\n\n if (extraAttrs) {\n copiedAttrs = copiedAttrs.concat($mdUtil.prefixer(extraAttrs));\n }\n\n angular.forEach(copiedAttrs, function(attr) {\n if (source.hasAttribute(attr)) {\n destination.setAttribute(attr, source.getAttribute(attr));\n source.removeAttribute(attr);\n }\n });\n }\n\n function isProxiedElement(el) {\n return proxiedTypes.indexOf(el.nodeName.toLowerCase()) != -1;\n }\n\n function isButton(el) {\n var nodeName = el.nodeName.toUpperCase();\n\n return nodeName == \"MD-BUTTON\" || nodeName == \"BUTTON\";\n }\n\n function hasClickEvent (element) {\n var attr = element.attributes;\n for (var i = 0; i < attr.length; i++) {\n if (tAttrs.$normalize(attr[i].name) === 'ngClick') return true;\n }\n return false;\n }\n\n return postLink;\n\n function postLink($scope, $element, $attr, ctrl) {\n $element.addClass('_md'); // private md component indicator for styling\n\n var proxies = [],\n firstElement = $element[0].firstElementChild,\n isButtonWrap = $element.hasClass('_md-button-wrap'),\n clickChild = isButtonWrap ? firstElement.firstElementChild : firstElement,\n hasClick = clickChild && hasClickEvent(clickChild),\n noProxies = $element.hasClass('md-no-proxy');\n\n computeProxies();\n computeClickable();\n\n if (proxies.length) {\n angular.forEach(proxies, function(proxy) {\n proxy = angular.element(proxy);\n\n $scope.mouseActive = false;\n proxy.on('mousedown', function() {\n $scope.mouseActive = true;\n $timeout(function(){\n $scope.mouseActive = false;\n }, 100);\n })\n .on('focus', function() {\n if ($scope.mouseActive === false) { $element.addClass('md-focused'); }\n proxy.on('blur', function proxyOnBlur() {\n $element.removeClass('md-focused');\n proxy.off('blur', proxyOnBlur);\n });\n });\n });\n }\n\n\n function computeProxies() {\n\n if (firstElement && firstElement.children && !hasClick && !noProxies) {\n\n angular.forEach(proxiedTypes, function(type) {\n\n // All elements which are not capable for being used a proxy have the .md-secondary class\n // applied. These items had been sorted out in the secondary wrap function.\n angular.forEach(firstElement.querySelectorAll(type + ':not(.md-secondary)'), function(child) {\n proxies.push(child);\n });\n });\n\n }\n }\n\n function computeClickable() {\n if (proxies.length == 1 || hasClick) {\n $element.addClass('md-clickable');\n\n if (!hasClick) {\n ctrl.attachRipple($scope, angular.element($element[0].querySelector('.md-no-style')));\n }\n }\n }\n\n function isEventFromControl(event) {\n var forbiddenControls = ['md-slider'];\n\n // If there is no path property in the event, then we can assume that the event was not bubbled.\n if (!event.path) {\n return forbiddenControls.indexOf(event.target.tagName.toLowerCase()) !== -1;\n }\n\n // We iterate the event path up and check for a possible component.\n // Our maximum index to search, is the list item root.\n var maxPath = event.path.indexOf($element.children()[0]);\n\n for (var i = 0; i < maxPath; i++) {\n if (forbiddenControls.indexOf(event.path[i].tagName.toLowerCase()) !== -1) {\n return true;\n }\n }\n }\n\n var clickChildKeypressListener = function(e) {\n if (e.target.nodeName != 'INPUT' && e.target.nodeName != 'TEXTAREA' && !e.target.isContentEditable) {\n var keyCode = e.which || e.keyCode;\n if (keyCode == $mdConstant.KEY_CODE.SPACE) {\n if (clickChild) {\n clickChild.click();\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }\n };\n\n if (!hasClick && !proxies.length) {\n clickChild && clickChild.addEventListener('keypress', clickChildKeypressListener);\n }\n\n $element.off('click');\n $element.off('keypress');\n\n if (proxies.length == 1 && clickChild) {\n $element.children().eq(0).on('click', function(e) {\n // When the event is coming from an control and it should not trigger the proxied element\n // then we are skipping.\n if (isEventFromControl(e)) return;\n\n var parentButton = $mdUtil.getClosest(e.target, 'BUTTON');\n if (!parentButton && clickChild.contains(e.target)) {\n angular.forEach(proxies, function(proxy) {\n if (e.target !== proxy && !proxy.contains(e.target)) {\n if (proxy.nodeName === 'MD-MENU') {\n proxy = proxy.children[0];\n }\n angular.element(proxy).triggerHandler('click');\n }\n });\n }\n });\n }\n\n $scope.$on('$destroy', function () {\n clickChild && clickChild.removeEventListener('keypress', clickChildKeypressListener);\n });\n }\n }\n };\n}\n\n/*\n * @private\n * @ngdoc controller\n * @name MdListController\n * @module material.components.list\n *\n */\nfunction MdListController($scope, $element, $mdListInkRipple) {\n var ctrl = this;\n ctrl.attachRipple = attachRipple;\n\n function attachRipple (scope, element) {\n var options = {};\n $mdListInkRipple.attach(scope, element, options);\n }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.menu\n */\n\nangular.module('material.components.menu', [\n 'material.core',\n 'material.components.backdrop'\n]);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.menuBar\n */\n\nangular.module('material.components.menuBar', [\n 'material.core',\n 'material.components.icon',\n 'material.components.menu'\n]);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.navBar\n */\n\n\nMdNavBarController.$inject = [\"$element\", \"$scope\", \"$timeout\", \"$mdConstant\"];\nMdNavItem.$inject = [\"$mdAria\", \"$$rAF\"];\nMdNavItemController.$inject = [\"$element\"];\nMdNavBar.$inject = [\"$mdAria\", \"$mdTheming\"];\nangular.module('material.components.navBar', ['material.core'])\n .controller('MdNavBarController', MdNavBarController)\n .directive('mdNavBar', MdNavBar)\n .controller('MdNavItemController', MdNavItemController)\n .directive('mdNavItem', MdNavItem);\n\n\n/*****************************************************************************\n * PUBLIC DOCUMENTATION *\n *****************************************************************************/\n/**\n * @ngdoc directive\n * @name mdNavBar\n * @module material.components.navBar\n *\n * @restrict E\n *\n * @description\n * The `` directive renders a list of material tabs that can be used\n * for top-level page navigation. Unlike ``, it has no concept of a tab\n * body and no bar pagination.\n *\n * Because it deals with page navigation, certain routing concepts are built-in.\n * Route changes via via ng-href, ui-sref, or ng-click events are supported.\n * Alternatively, the user could simply watch currentNavItem for changes.\n *\n * Accessibility functionality is implemented as a site navigator with a\n * listbox, according to\n * https://www.w3.org/TR/wai-aria-practices/#Site_Navigator_Tabbed_Style\n *\n * @param {string=} mdSelectedNavItem The name of the current tab; this must\n * match the name attribute of ``\n * @param {boolean=} mdNoInkBar If set to true, the ink bar will be hidden.\n * @param {string=} navBarAriaLabel An aria-label for the nav-bar\n *\n * @usage\n * \n * \n * \n * Page One\n * \n * Page Two\n * Page Three\n * \n * Page Four\n * \n * \n *\n * \n * (function() {\n * 'use strict';\n *\n * $rootScope.$on('$routeChangeSuccess', function(event, current) {\n * $scope.currentLink = getCurrentLinkFromRoute(current);\n * });\n * });\n * \n */\n\n/*****************************************************************************\n * mdNavItem\n *****************************************************************************/\n/**\n * @ngdoc directive\n * @name mdNavItem\n * @module material.components.navBar\n *\n * @restrict E\n *\n * @description\n * `` describes a page navigation link within the ``\n * component. It renders an md-button as the actual link.\n *\n * Exactly one of the mdNavClick, mdNavHref, mdNavSref attributes are required\n * to be specified.\n *\n * @param {Function=} mdNavClick Function which will be called when the\n * link is clicked to change the page. Renders as an `ng-click`.\n * @param {string=} mdNavHref url to transition to when this link is clicked.\n * Renders as an `ng-href`.\n * @param {string=} mdNavSref Ui-router state to transition to when this link is\n * clicked. Renders as a `ui-sref`.\n * @param {!Object=} srefOpts Ui-router options that are passed to the\n * `$state.go()` function. See the [Ui-router documentation for details]\n * (https://ui-router.github.io/docs/latest/interfaces/transition.transitionoptions.html).\n * @param {string=} name The name of this link. Used by the nav bar to know\n * which link is currently selected.\n * @param {string=} aria-label Adds alternative text for accessibility\n *\n * @usage\n * See `` for usage.\n */\n\n\n/*****************************************************************************\n * IMPLEMENTATION *\n *****************************************************************************/\n\nfunction MdNavBar($mdAria, $mdTheming) {\n return {\n restrict: 'E',\n transclude: true,\n controller: MdNavBarController,\n controllerAs: 'ctrl',\n bindToController: true,\n scope: {\n 'mdSelectedNavItem': '=?',\n 'mdNoInkBar': '=?',\n 'navBarAriaLabel': '@?',\n },\n template:\n '
    ' +\n '' +\n '' +\n '
    ',\n link: function(scope, element, attrs, ctrl) {\n $mdTheming(element);\n if (!ctrl.navBarAriaLabel) {\n $mdAria.expectAsync(element, 'aria-label', angular.noop);\n }\n },\n };\n}\n\n/**\n * Controller for the nav-bar component.\n *\n * Accessibility functionality is implemented as a site navigator with a\n * listbox, according to\n * https://www.w3.org/TR/wai-aria-practices/#Site_Navigator_Tabbed_Style\n * @param {!angular.JQLite} $element\n * @param {!angular.Scope} $scope\n * @param {!angular.Timeout} $timeout\n * @param {!Object} $mdConstant\n * @constructor\n * @final\n * @ngInject\n */\nfunction MdNavBarController($element, $scope, $timeout, $mdConstant) {\n // Injected variables\n /** @private @const {!angular.Timeout} */\n this._$timeout = $timeout;\n\n /** @private @const {!angular.Scope} */\n this._$scope = $scope;\n\n /** @private @const {!Object} */\n this._$mdConstant = $mdConstant;\n\n // Data-bound variables.\n /** @type {string} */\n this.mdSelectedNavItem;\n\n /** @type {string} */\n this.navBarAriaLabel;\n\n // State variables.\n\n /** @type {?angular.JQLite} */\n this._navBarEl = $element[0];\n\n /** @type {?angular.JQLite} */\n this._inkbar;\n\n var self = this;\n // need to wait for transcluded content to be available\n var deregisterTabWatch = this._$scope.$watch(function() {\n return self._navBarEl.querySelectorAll('._md-nav-button').length;\n },\n function(newLength) {\n if (newLength > 0) {\n self._initTabs();\n deregisterTabWatch();\n }\n });\n}\n\n\n\n/**\n * Initializes the tab components once they exist.\n * @private\n */\nMdNavBarController.prototype._initTabs = function() {\n this._inkbar = angular.element(this._navBarEl.querySelector('md-nav-ink-bar'));\n\n var self = this;\n this._$timeout(function() {\n self._updateTabs(self.mdSelectedNavItem, undefined);\n });\n\n this._$scope.$watch('ctrl.mdSelectedNavItem', function(newValue, oldValue) {\n // Wait a digest before update tabs for products doing\n // anything dynamic in the template.\n self._$timeout(function() {\n self._updateTabs(newValue, oldValue);\n });\n });\n};\n\n/**\n * Set the current tab to be selected.\n * @param {string|undefined} newValue New current tab name.\n * @param {string|undefined} oldValue Previous tab name.\n * @private\n */\nMdNavBarController.prototype._updateTabs = function(newValue, oldValue) {\n var self = this;\n var tabs = this._getTabs();\n\n // this._getTabs can return null if nav-bar has not yet been initialized\n if(!tabs)\n return;\n\n var oldIndex = -1;\n var newIndex = -1;\n var newTab = this._getTabByName(newValue);\n var oldTab = this._getTabByName(oldValue);\n\n if (oldTab) {\n oldTab.setSelected(false);\n oldIndex = tabs.indexOf(oldTab);\n }\n\n if (newTab) {\n newTab.setSelected(true);\n newIndex = tabs.indexOf(newTab);\n }\n\n this._$timeout(function() {\n self._updateInkBarStyles(newTab, newIndex, oldIndex);\n });\n};\n\n/**\n * Repositions the ink bar to the selected tab.\n * @private\n */\nMdNavBarController.prototype._updateInkBarStyles = function(tab, newIndex, oldIndex) {\n this._inkbar.toggleClass('_md-left', newIndex < oldIndex)\n .toggleClass('_md-right', newIndex > oldIndex);\n\n this._inkbar.css({display: newIndex < 0 ? 'none' : ''});\n\n if (tab) {\n var tabEl = tab.getButtonEl();\n var left = tabEl.offsetLeft;\n\n this._inkbar.css({left: left + 'px', width: tabEl.offsetWidth + 'px'});\n }\n};\n\n/**\n * Returns an array of the current tabs.\n * @return {!Array}\n * @private\n */\nMdNavBarController.prototype._getTabs = function() {\n var controllers = Array.prototype.slice.call(\n this._navBarEl.querySelectorAll('.md-nav-item'))\n .map(function(el) {\n return angular.element(el).controller('mdNavItem')\n });\n return controllers.indexOf(undefined) ? controllers : null;\n};\n\n/**\n * Returns the tab with the specified name.\n * @param {string} name The name of the tab, found in its name attribute.\n * @return {!NavItemController|undefined}\n * @private\n */\nMdNavBarController.prototype._getTabByName = function(name) {\n return this._findTab(function(tab) {\n return tab.getName() == name;\n });\n};\n\n/**\n * Returns the selected tab.\n * @return {!NavItemController|undefined}\n * @private\n */\nMdNavBarController.prototype._getSelectedTab = function() {\n return this._findTab(function(tab) {\n return tab.isSelected();\n });\n};\n\n/**\n * Returns the focused tab.\n * @return {!NavItemController|undefined}\n */\nMdNavBarController.prototype.getFocusedTab = function() {\n return this._findTab(function(tab) {\n return tab.hasFocus();\n });\n};\n\n/**\n * Find a tab that matches the specified function.\n * @private\n */\nMdNavBarController.prototype._findTab = function(fn) {\n var tabs = this._getTabs();\n for (var i = 0; i < tabs.length; i++) {\n if (fn(tabs[i])) {\n return tabs[i];\n }\n }\n\n return null;\n};\n\n/**\n * Direct focus to the selected tab when focus enters the nav bar.\n */\nMdNavBarController.prototype.onFocus = function() {\n var tab = this._getSelectedTab();\n if (tab) {\n tab.setFocused(true);\n }\n};\n\n/**\n * Move focus from oldTab to newTab.\n * @param {!NavItemController} oldTab\n * @param {!NavItemController} newTab\n * @private\n */\nMdNavBarController.prototype._moveFocus = function(oldTab, newTab) {\n oldTab.setFocused(false);\n newTab.setFocused(true);\n};\n\n/**\n * Responds to keypress events.\n * @param {!Event} e\n */\nMdNavBarController.prototype.onKeydown = function(e) {\n var keyCodes = this._$mdConstant.KEY_CODE;\n var tabs = this._getTabs();\n var focusedTab = this.getFocusedTab();\n if (!focusedTab) return;\n\n var focusedTabIndex = tabs.indexOf(focusedTab);\n\n // use arrow keys to navigate between tabs\n switch (e.keyCode) {\n case keyCodes.UP_ARROW:\n case keyCodes.LEFT_ARROW:\n if (focusedTabIndex > 0) {\n this._moveFocus(focusedTab, tabs[focusedTabIndex - 1]);\n }\n break;\n case keyCodes.DOWN_ARROW:\n case keyCodes.RIGHT_ARROW:\n if (focusedTabIndex < tabs.length - 1) {\n this._moveFocus(focusedTab, tabs[focusedTabIndex + 1]);\n }\n break;\n case keyCodes.SPACE:\n case keyCodes.ENTER:\n // timeout to avoid a \"digest already in progress\" console error\n this._$timeout(function() {\n focusedTab.getButtonEl().click();\n });\n break;\n }\n};\n\n/**\n * @ngInject\n */\nfunction MdNavItem($mdAria, $$rAF) {\n return {\n restrict: 'E',\n require: ['mdNavItem', '^mdNavBar'],\n controller: MdNavItemController,\n bindToController: true,\n controllerAs: 'ctrl',\n replace: true,\n transclude: true,\n template: function(tElement, tAttrs) {\n var hasNavClick = tAttrs.mdNavClick;\n var hasNavHref = tAttrs.mdNavHref;\n var hasNavSref = tAttrs.mdNavSref;\n var hasSrefOpts = tAttrs.srefOpts;\n var navigationAttribute;\n var navigationOptions;\n var buttonTemplate;\n\n // Cannot specify more than one nav attribute\n if ((hasNavClick ? 1:0) + (hasNavHref ? 1:0) + (hasNavSref ? 1:0) > 1) {\n throw Error(\n 'Must not specify more than one of the md-nav-click, md-nav-href, ' +\n 'or md-nav-sref attributes per nav-item directive.'\n );\n }\n\n if (hasNavClick) {\n navigationAttribute = 'ng-click=\"ctrl.mdNavClick()\"';\n } else if (hasNavHref) {\n navigationAttribute = 'ng-href=\"{{ctrl.mdNavHref}}\"';\n } else if (hasNavSref) {\n navigationAttribute = 'ui-sref=\"{{ctrl.mdNavSref}}\"';\n }\n\n navigationOptions = hasSrefOpts ? 'ui-sref-opts=\"{{ctrl.srefOpts}}\" ' : '';\n\n if (navigationAttribute) {\n buttonTemplate = '' +\n '' +\n '' +\n '';\n }\n\n return '' +\n '
  • ' +\n (buttonTemplate || '') +\n '
  • ';\n },\n scope: {\n 'mdNavClick': '&?',\n 'mdNavHref': '@?',\n 'mdNavSref': '@?',\n 'srefOpts': '=?',\n 'name': '@',\n },\n link: function(scope, element, attrs, controllers) {\n // When accessing the element's contents synchronously, they\n // may not be defined yet because of transclusion. There is a higher\n // chance that it will be accessible if we wait one frame.\n $$rAF(function() {\n var mdNavItem = controllers[0];\n var mdNavBar = controllers[1];\n var navButton = angular.element(element[0].querySelector('._md-nav-button'));\n\n if (!mdNavItem.name) {\n mdNavItem.name = angular.element(element[0]\n .querySelector('._md-nav-button-text')).text().trim();\n }\n\n navButton.on('click', function() {\n mdNavBar.mdSelectedNavItem = mdNavItem.name;\n scope.$apply();\n });\n\n $mdAria.expectWithText(element, 'aria-label');\n });\n }\n };\n}\n\n/**\n * Controller for the nav-item component.\n * @param {!angular.JQLite} $element\n * @constructor\n * @final\n * @ngInject\n */\nfunction MdNavItemController($element) {\n\n /** @private @const {!angular.JQLite} */\n this._$element = $element;\n\n // Data-bound variables\n\n /** @const {?Function} */\n this.mdNavClick;\n\n /** @const {?string} */\n this.mdNavHref;\n\n /** @const {?string} */\n this.mdNavSref;\n /** @const {?Object} */\n this.srefOpts;\n /** @const {?string} */\n this.name;\n\n // State variables\n /** @private {boolean} */\n this._selected = false;\n\n /** @private {boolean} */\n this._focused = false;\n}\n\n/**\n * Returns a map of class names and values for use by ng-class.\n * @return {!Object}\n */\nMdNavItemController.prototype.getNgClassMap = function() {\n return {\n 'md-active': this._selected,\n 'md-primary': this._selected,\n 'md-unselected': !this._selected,\n 'md-focused': this._focused,\n };\n};\n\n/**\n * Get the name attribute of the tab.\n * @return {string}\n */\nMdNavItemController.prototype.getName = function() {\n return this.name;\n};\n\n/**\n * Get the button element associated with the tab.\n * @return {!Element}\n */\nMdNavItemController.prototype.getButtonEl = function() {\n return this._$element[0].querySelector('._md-nav-button');\n};\n\n/**\n * Set the selected state of the tab.\n * @param {boolean} isSelected\n */\nMdNavItemController.prototype.setSelected = function(isSelected) {\n this._selected = isSelected;\n};\n\n/**\n * @return {boolean}\n */\nMdNavItemController.prototype.isSelected = function() {\n return this._selected;\n};\n\n/**\n * Set the focused state of the tab.\n * @param {boolean} isFocused\n */\nMdNavItemController.prototype.setFocused = function(isFocused) {\n this._focused = isFocused;\n\n if (isFocused) {\n this.getButtonEl().focus();\n }\n};\n\n/**\n * @return {boolean}\n */\nMdNavItemController.prototype.hasFocus = function() {\n return this._focused;\n};\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.progressCircular\n * @description Module for a circular progressbar\n */\n\nangular.module('material.components.progressCircular', ['material.core']);\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.panel\n */\nMdPanelService.$inject = [\"presets\", \"$rootElement\", \"$rootScope\", \"$injector\", \"$window\"];\nangular\n .module('material.components.panel', [\n 'material.core',\n 'material.components.backdrop'\n ])\n .provider('$mdPanel', MdPanelProvider);\n\n\n/*****************************************************************************\n * PUBLIC DOCUMENTATION *\n *****************************************************************************/\n\n\n/**\n * @ngdoc service\n * @name $mdPanelProvider\n * @module material.components.panel\n *\n * @description\n * `$mdPanelProvider` allows users to create configuration presets that will be\n * stored within a cached presets object. When the configuration is needed, the\n * user can request the preset by passing it as the first parameter in the\n * `$mdPanel.create` or `$mdPanel.open` methods.\n *\n * @usage\n * \n * (function(angular, undefined) {\n * 'use strict';\n *\n * angular\n * .module('demoApp', ['ngMaterial'])\n * .config(DemoConfig)\n * .controller('DemoCtrl', DemoCtrl)\n * .controller('DemoMenuCtrl', DemoMenuCtrl);\n *\n * function DemoConfig($mdPanelProvider) {\n * $mdPanelProvider.definePreset('demoPreset', {\n * attachTo: angular.element(document.body),\n * controller: DemoMenuCtrl,\n * controllerAs: 'ctrl',\n * template: '' +\n * '
    ' +\n * '
    ' +\n * '
    ' +\n * ' ' +\n * '
    ' +\n * ' ' +\n * '
    ' +\n * ' ' +\n * '
    ' +\n * '
    ' +\n * '
    ',\n * panelClass: 'menu-panel-container',\n * focusOnOpen: false,\n * zIndex: 100,\n * propagateContainerEvents: true,\n * groupName: 'menus'\n * });\n * }\n *\n * function PanelProviderCtrl($mdPanel) {\n * this.navigation = {\n * name: 'navigation',\n * items: [\n * 'Home',\n * 'About',\n * 'Contact'\n * ]\n * };\n * this.favorites = {\n * name: 'favorites',\n * items: [\n * 'Add to Favorites'\n * ]\n * };\n * this.more = {\n * name: 'more',\n * items: [\n * 'Account',\n * 'Sign Out'\n * ]\n * };\n *\n * $mdPanel.newPanelGroup('menus', {\n * maxOpen: 2\n * });\n *\n * this.showMenu = function($event, menu) {\n * $mdPanel.open('demoPreset', {\n * id: 'menu_' + menu.name,\n * position: $mdPanel.newPanelPosition()\n * .relativeTo($event.srcElement)\n * .addPanelPosition(\n * $mdPanel.xPosition.ALIGN_START,\n * $mdPanel.yPosition.BELOW\n * ),\n * locals: {\n * items: menu.items\n * },\n * openFrom: $event\n * });\n * };\n * }\n *\n * function PanelMenuCtrl(mdPanelRef) {\n * this.closeMenu = function() {\n * mdPanelRef && mdPanelRef.close();\n * };\n * }\n * })(angular);\n *
    \n */\n\n/**\n * @ngdoc method\n * @name $mdPanelProvider#definePreset\n * @description\n * Takes the passed in preset name and preset configuration object and adds it\n * to the `_presets` object of the provider. This `_presets` object is then\n * passed along to the `$mdPanel` service.\n *\n * @param {string} name Preset name.\n * @param {!Object} preset Specific configuration object that can contain any\n * and all of the parameters avaialble within the `$mdPanel.create` method.\n * However, parameters that pertain to id, position, animation, and user\n * interaction are not allowed and will be removed from the preset\n * configuration.\n */\n\n\n/*****************************************************************************\n * MdPanel Service *\n *****************************************************************************/\n\n\n/**\n * @ngdoc service\n * @name $mdPanel\n * @module material.components.panel\n *\n * @description\n * `$mdPanel` is a robust, low-level service for creating floating panels on\n * the screen. It can be used to implement tooltips, dialogs, pop-ups, etc.\n *\n * @usage\n * \n * (function(angular, undefined) {\n * 'use strict';\n *\n * angular\n * .module('demoApp', ['ngMaterial'])\n * .controller('DemoDialogController', DialogController);\n *\n * var panelRef;\n *\n * function showPanel($event) {\n * var panelPosition = $mdPanel.newPanelPosition()\n * .absolute()\n * .top('50%')\n * .left('50%');\n *\n * var panelAnimation = $mdPanel.newPanelAnimation()\n * .targetEvent($event)\n * .defaultAnimation('md-panel-animate-fly')\n * .closeTo('.show-button');\n *\n * var config = {\n * attachTo: angular.element(document.body),\n * controller: DialogController,\n * controllerAs: 'ctrl',\n * position: panelPosition,\n * animation: panelAnimation,\n * targetEvent: $event,\n * templateUrl: 'dialog-template.html',\n * clickOutsideToClose: true,\n * escapeToClose: true,\n * focusOnOpen: true\n * }\n *\n * $mdPanel.open(config)\n * .then(function(result) {\n * panelRef = result;\n * });\n * }\n *\n * function DialogController(MdPanelRef) {\n * function closeDialog() {\n * if (MdPanelRef) MdPanelRef.close();\n * }\n * }\n * })(angular);\n * \n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#create\n * @description\n * Creates a panel with the specified options.\n *\n * @param config {!Object=} Specific configuration object that may contain the\n * following properties:\n *\n * - `id` - `{string=}`: An ID to track the panel by. When an ID is provided,\n * the created panel is added to a tracked panels object. Any subsequent\n * requests made to create a panel with that ID are ignored. This is useful\n * in having the panel service not open multiple panels from the same user\n * interaction when there is no backdrop and events are propagated. Defaults\n * to an arbitrary string that is not tracked.\n * - `template` - `{string=}`: HTML template to show in the panel. This\n * **must** be trusted HTML with respect to AngularJS’s\n * [$sce service](https://docs.angularjs.org/api/ng/service/$sce).\n * - `templateUrl` - `{string=}`: The URL that will be used as the content of\n * the panel.\n * - `contentElement` - `{(string|!angular.JQLite|!Element)=}`: Pre-compiled\n * element to be used as the panel's content.\n * - `controller` - `{(function|string)=}`: The controller to associate with\n * the panel. The controller can inject a reference to the returned\n * panelRef, which allows the panel to be closed, hidden, and shown. Any\n * fields passed in through locals or resolve will be bound to the\n * controller.\n * - `controllerAs` - `{string=}`: An alias to assign the controller to on\n * the scope.\n * - `bindToController` - `{boolean=}`: Binds locals to the controller\n * instead of passing them in. Defaults to true, as this is a best\n * practice.\n * - `locals` - `{Object=}`: An object containing key/value pairs. The keys\n * will be used as names of values to inject into the controller. For\n * example, `locals: {three: 3}` would inject `three` into the controller,\n * with the value 3.\n * - `resolve` - `{Object=}`: Similar to locals, except it takes promises as\n * values. The panel will not open until all of the promises resolve.\n * - `attachTo` - `{(string|!angular.JQLite|!Element)=}`: The element to\n * attach the panel to. Defaults to appending to the root element of the\n * application.\n * - `propagateContainerEvents` - `{boolean=}`: Whether pointer or touch\n * events should be allowed to propagate 'go through' the container, aka the\n * wrapper, of the panel. Defaults to false.\n * - `panelClass` - `{string=}`: A css class to apply to the panel element.\n * This class should define any borders, box-shadow, etc. for the panel.\n * - `zIndex` - `{number=}`: The z-index to place the panel at.\n * Defaults to 80.\n * - `position` - `{MdPanelPosition=}`: An MdPanelPosition object that\n * specifies the alignment of the panel. For more information, see\n * `MdPanelPosition`.\n * - `clickOutsideToClose` - `{boolean=}`: Whether the user can click\n * outside the panel to close it. Defaults to false.\n * - `escapeToClose` - `{boolean=}`: Whether the user can press escape to\n * close the panel. Defaults to false.\n * - `onCloseSuccess` - `{function(!panelRef, string)=}`: Function that is\n * called after the close successfully finishes. The first parameter passed\n * into this function is the current panelRef and the 2nd is an optional\n * string explaining the close reason. The currently supported closeReasons\n * can be found in the MdPanelRef.closeReasons enum. These are by default\n * passed along by the panel.\n * - `trapFocus` - `{boolean=}`: Whether focus should be trapped within the\n * panel. If `trapFocus` is true, the user will not be able to interact\n * with the rest of the page until the panel is dismissed. Defaults to\n * false.\n * - `focusOnOpen` - `{boolean=}`: An option to override focus behavior on\n * open. Only disable if focusing some other way, as focus management is\n * required for panels to be accessible. Defaults to true.\n * - `fullscreen` - `{boolean=}`: Whether the panel should be full screen.\n * Applies the class `._md-panel-fullscreen` to the panel on open. Defaults\n * to false.\n * - `animation` - `{MdPanelAnimation=}`: An MdPanelAnimation object that\n * specifies the animation of the panel. For more information, see\n * `MdPanelAnimation`.\n * - `hasBackdrop` - `{boolean=}`: Whether there should be an opaque backdrop\n * behind the panel. Defaults to false.\n * - `disableParentScroll` - `{boolean=}`: Whether the user can scroll the\n * page behind the panel. Defaults to false.\n * - `onDomAdded` - `{function=}`: Callback function used to announce when\n * the panel is added to the DOM.\n * - `onOpenComplete` - `{function=}`: Callback function used to announce\n * when the open() action is finished.\n * - `onRemoving` - `{function=}`: Callback function used to announce the\n * close/hide() action is starting.\n * - `onDomRemoved` - `{function=}`: Callback function used to announce when\n * the panel is removed from the DOM.\n * - `origin` - `{(string|!angular.JQLite|!Element)=}`: The element to focus\n * on when the panel closes. This is commonly the element which triggered\n * the opening of the panel. If you do not use `origin`, you need to control\n * the focus manually.\n * - `groupName` - `{(string|!Array)=}`: A group name or an array of\n * group names. The group name is used for creating a group of panels. The\n * group is used for configuring the number of open panels and identifying\n * specific behaviors for groups. For instance, all tooltips could be\n * identified using the same groupName.\n *\n * @returns {!MdPanelRef} panelRef\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#open\n * @description\n * Calls the create method above, then opens the panel. This is a shortcut for\n * creating and then calling open manually. If custom methods need to be\n * called when the panel is added to the DOM or opened, do not use this method.\n * Instead create the panel, chain promises on the domAdded and openComplete\n * methods, and call open from the returned panelRef.\n *\n * @param {!Object=} config Specific configuration object that may contain\n * the properties defined in `$mdPanel.create`.\n * @returns {!angular.$q.Promise} panelRef A promise that resolves\n * to an instance of the panel.\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#newPanelPosition\n * @description\n * Returns a new instance of the MdPanelPosition object. Use this to create\n * the position config object.\n *\n * @returns {!MdPanelPosition} panelPosition\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#newPanelAnimation\n * @description\n * Returns a new instance of the MdPanelAnimation object. Use this to create\n * the animation config object.\n *\n * @returns {!MdPanelAnimation} panelAnimation\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#newPanelGroup\n * @description\n * Creates a panel group and adds it to a tracked list of panel groups.\n *\n * @param {string} groupName Name of the group to create.\n * @param {!Object=} config Specific configuration object that may contain the\n * following properties:\n *\n * - `maxOpen` - `{number=}`: The maximum number of panels that are allowed to\n * be open within a defined panel group.\n *\n * @returns {!Object,\n * openPanels: !Array,\n * maxOpen: number}>} panelGroup\n */\n\n/**\n * @ngdoc method\n * @name $mdPanel#setGroupMaxOpen\n * @description\n * Sets the maximum number of panels in a group that can be opened at a given\n * time.\n *\n * @param {string} groupName The name of the group to configure.\n * @param {number} maxOpen The maximum number of panels that can be\n * opened. Infinity can be passed in to remove the maxOpen limit.\n */\n\n\n/*****************************************************************************\n * MdPanelRef *\n *****************************************************************************/\n\n\n/**\n * @ngdoc type\n * @name MdPanelRef\n * @module material.components.panel\n * @description\n * A reference to a created panel. This reference contains a unique id for the\n * panel, along with the following properties:\n *\n * - `id` - `{string}`: The unique id for the panel. This id is used to track\n * when a panel was interacted with.\n * - `config` - `{!Object=}`: The entire config object that was used in\n * create.\n * - `isAttached` - `{boolean}`: Whether the panel is attached to the DOM.\n * Visibility to the user does not factor into isAttached.\n * - `panelContainer` - `{angular.JQLite}`: The wrapper element containing the\n * panel. This property is added in order to have access to the `addClass`,\n * `removeClass`, `toggleClass`, etc methods.\n * - `panelEl` - `{angular.JQLite}`: The panel element. This property is added\n * in order to have access to the `addClass`, `removeClass`, `toggleClass`,\n * etc methods.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#open\n * @description\n * Attaches and shows the panel.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n * opened.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#close\n * @description\n * Hides and detaches the panel. Note that this will **not** destroy the panel.\n * If you don't intend on using the panel again, call the {@link #destroy\n * destroy} method afterwards.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n * closed.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#attach\n * @description\n * Create the panel elements and attach them to the DOM. The panel will be\n * hidden by default.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n * attached.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#detach\n * @description\n * Removes the panel from the DOM. This will NOT hide the panel before removing\n * it.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n * detached.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#show\n * @description\n * Shows the panel.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n * shown and animations are completed.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#hide\n * @description\n * Hides the panel.\n *\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n * hidden and animations are completed.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#destroy\n * @description\n * Destroys the panel. The panel cannot be opened again after this is called.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#addClass\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n * @description\n * Adds a class to the panel. DO NOT use this hide/show the panel.\n *\n * @param {string} newClass class to be added.\n * @param {boolean} toElement Whether or not to add the class to the panel\n * element instead of the container.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#removeClass\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n * @description\n * Removes a class from the panel. DO NOT use this to hide/show the panel.\n *\n * @param {string} oldClass Class to be removed.\n * @param {boolean} fromElement Whether or not to remove the class from the\n * panel element instead of the container.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#toggleClass\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n * @description\n * Toggles a class on the panel. DO NOT use this to hide/show the panel.\n *\n * @param {string} toggleClass Class to be toggled.\n * @param {boolean} onElement Whether or not to remove the class from the panel\n * element instead of the container.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#updatePosition\n * @description\n * Updates the position configuration of a panel. Use this to update the\n * position of a panel that is open, without having to close and re-open the\n * panel.\n *\n * @param {!MdPanelPosition} position\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#addToGroup\n * @description\n * Adds a panel to a group if the panel does not exist within the group already.\n * A panel can only exist within a single group.\n *\n * @param {string} groupName The name of the group to add the panel to.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#removeFromGroup\n * @description\n * Removes a panel from a group if the panel exists within that group. The group\n * must be created ahead of time.\n *\n * @param {string} groupName The name of the group.\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#registerInterceptor\n * @description\n * Registers an interceptor with the panel. The callback should return a promise,\n * which will allow the action to continue when it gets resolved, or will\n * prevent an action if it is rejected. The interceptors are called sequentially\n * and it reverse order. `type` must be one of the following\n * values available on `$mdPanel.interceptorTypes`:\n * * `CLOSE` - Gets called before the panel begins closing.\n *\n * @param {string} type Type of interceptor.\n * @param {!angular.$q.Promise} callback Callback to be registered.\n * @returns {!MdPanelRef}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#removeInterceptor\n * @description\n * Removes a registered interceptor.\n *\n * @param {string} type Type of interceptor to be removed.\n * @param {function(): !angular.$q.Promise} callback Interceptor to be removed.\n * @returns {!MdPanelRef}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#removeAllInterceptors\n * @description\n * Removes all interceptors. If a type is supplied, only the\n * interceptors of that type will be cleared.\n *\n * @param {string=} type Type of interceptors to be removed.\n * @returns {!MdPanelRef}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelRef#updateAnimation\n * @description\n * Updates the animation configuration for a panel. You can use this to change\n * the panel's animation without having to re-create it.\n *\n * @param {!MdPanelAnimation} animation\n */\n\n\n/*****************************************************************************\n * MdPanelPosition *\n *****************************************************************************/\n\n\n/**\n * @ngdoc type\n * @name MdPanelPosition\n * @module material.components.panel\n * @description\n *\n * Object for configuring the position of the panel.\n *\n * @usage\n *\n * #### Centering the panel\n *\n * \n * new MdPanelPosition().absolute().center();\n * \n *\n * #### Overlapping the panel with an element\n *\n * \n * new MdPanelPosition()\n * .relativeTo(someElement)\n * .addPanelPosition(\n * $mdPanel.xPosition.ALIGN_START,\n * $mdPanel.yPosition.ALIGN_TOPS\n * );\n * \n *\n * #### Aligning the panel with the bottom of an element\n *\n * \n * new MdPanelPosition()\n * .relativeTo(someElement)\n * .addPanelPosition($mdPanel.xPosition.CENTER, $mdPanel.yPosition.BELOW);\n * \n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#absolute\n * @description\n * Positions the panel absolutely relative to the parent element. If the parent\n * is document.body, this is equivalent to positioning the panel absolutely\n * within the viewport.\n *\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#relativeTo\n * @description\n * Positions the panel relative to a specific element.\n *\n * @param {string|!Element|!angular.JQLite} element Query selector, DOM element,\n * or angular element to position the panel with respect to.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#top\n * @description\n * Sets the value of `top` for the panel. Clears any previously set vertical\n * position.\n *\n * @param {string=} top Value of `top`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#bottom\n * @description\n * Sets the value of `bottom` for the panel. Clears any previously set vertical\n * position.\n *\n * @param {string=} bottom Value of `bottom`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#start\n * @description\n * Sets the panel to the start of the page - `left` if `ltr` or `right` for\n * `rtl`. Clears any previously set horizontal position.\n *\n * @param {string=} start Value of position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#end\n * @description\n * Sets the panel to the end of the page - `right` if `ltr` or `left` for `rtl`.\n * Clears any previously set horizontal position.\n *\n * @param {string=} end Value of position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#left\n * @description\n * Sets the value of `left` for the panel. Clears any previously set\n * horizontal position.\n *\n * @param {string=} left Value of `left`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#right\n * @description\n * Sets the value of `right` for the panel. Clears any previously set\n * horizontal position.\n *\n * @param {string=} right Value of `right`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#centerHorizontally\n * @description\n * Centers the panel horizontally in the viewport. Clears any previously set\n * horizontal position.\n *\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#centerVertically\n * @description\n * Centers the panel vertically in the viewport. Clears any previously set\n * vertical position.\n *\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#center\n * @description\n * Centers the panel horizontally and vertically in the viewport. This is\n * equivalent to calling both `centerHorizontally` and `centerVertically`.\n * Clears any previously set horizontal and vertical positions.\n *\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#addPanelPosition\n * @description\n * Sets the x and y position for the panel relative to another element. Can be\n * called multiple times to specify an ordered list of panel positions. The\n * first position which allows the panel to be completely on-screen will be\n * chosen; the last position will be chose whether it is on-screen or not.\n *\n * xPosition must be one of the following values available on\n * $mdPanel.xPosition:\n *\n *\n * CENTER | ALIGN_START | ALIGN_END | OFFSET_START | OFFSET_END\n *\n *
    \n *    *************\n *    *           *\n *    *   PANEL   *\n *    *           *\n *    *************\n *   A B    C    D E\n *\n * A: OFFSET_START (for LTR displays)\n * B: ALIGN_START (for LTR displays)\n * C: CENTER\n * D: ALIGN_END (for LTR displays)\n * E: OFFSET_END (for LTR displays)\n * 
    \n *\n * yPosition must be one of the following values available on\n * $mdPanel.yPosition:\n *\n * CENTER | ALIGN_TOPS | ALIGN_BOTTOMS | ABOVE | BELOW\n *\n *
    \n *   F\n *   G *************\n *     *           *\n *   H *   PANEL   *\n *     *           *\n *   I *************\n *   J\n *\n * F: BELOW\n * G: ALIGN_TOPS\n * H: CENTER\n * I: ALIGN_BOTTOMS\n * J: ABOVE\n * 
    \n *\n * @param {string} xPosition\n * @param {string} yPosition\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#withOffsetX\n * @description\n * Sets the value of the offset in the x-direction.\n *\n * @param {string} offsetX\n * @returns {!MdPanelPosition}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelPosition#withOffsetY\n * @description\n * Sets the value of the offset in the y-direction.\n *\n * @param {string} offsetY\n * @returns {!MdPanelPosition}\n */\n\n\n/*****************************************************************************\n * MdPanelAnimation *\n *****************************************************************************/\n\n\n/**\n * @ngdoc type\n * @name MdPanelAnimation\n * @module material.components.panel\n * @description\n * Animation configuration object. To use, create an MdPanelAnimation with the\n * desired properties, then pass the object as part of $mdPanel creation.\n *\n * @usage\n *\n * \n * var panelAnimation = new MdPanelAnimation()\n * .openFrom(myButtonEl)\n * .duration(1337)\n * .closeTo('.my-button')\n * .withAnimation($mdPanel.animation.SCALE);\n *\n * $mdPanel.create({\n * animation: panelAnimation\n * });\n * \n */\n\n/**\n * @ngdoc method\n * @name MdPanelAnimation#openFrom\n * @description\n * Specifies where to start the open animation. `openFrom` accepts a\n * click event object, query selector, DOM element, or a Rect object that\n * is used to determine the bounds. When passed a click event, the location\n * of the click will be used as the position to start the animation.\n *\n * @param {string|!Element|!Event|{top: number, left: number}}\n * @returns {!MdPanelAnimation}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelAnimation#closeTo\n * @description\n * Specifies where to animate the panel close. `closeTo` accepts a\n * query selector, DOM element, or a Rect object that is used to determine\n * the bounds.\n *\n * @param {string|!Element|{top: number, left: number}}\n * @returns {!MdPanelAnimation}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelAnimation#withAnimation\n * @description\n * Specifies the animation class.\n *\n * There are several default animations that can be used:\n * ($mdPanel.animation)\n * SLIDE: The panel slides in and out from the specified\n * elements. It will not fade in or out.\n * SCALE: The panel scales in and out. Slide and fade are\n * included in this animation.\n * FADE: The panel fades in and out.\n *\n * Custom classes will by default fade in and out unless\n * \"transition: opacity 1ms\" is added to the to custom class.\n *\n * @param {string|{open: string, close: string}} cssClass\n * @returns {!MdPanelAnimation}\n */\n\n/**\n * @ngdoc method\n * @name MdPanelAnimation#duration\n * @description\n * Specifies the duration of the animation in milliseconds. The `duration`\n * method accepts either a number or an object with separate open and close\n * durations.\n *\n * @param {number|{open: number, close: number}} duration\n * @returns {!MdPanelAnimation}\n */\n\n\n/*****************************************************************************\n * PUBLIC DOCUMENTATION *\n *****************************************************************************/\n\n\nvar MD_PANEL_Z_INDEX = 80;\nvar MD_PANEL_HIDDEN = '_md-panel-hidden';\nvar FOCUS_TRAP_TEMPLATE = angular.element(\n '
    ');\n\nvar _presets = {};\n\n\n/**\n * A provider that is used for creating presets for the panel API.\n * @final @constructor @ngInject\n */\nfunction MdPanelProvider() {\n return {\n 'definePreset': definePreset,\n 'getAllPresets': getAllPresets,\n 'clearPresets': clearPresets,\n '$get': $getProvider()\n };\n}\n\n\n/**\n * Takes the passed in panel configuration object and adds it to the `_presets`\n * object at the specified name.\n * @param {string} name Name of the preset to set.\n * @param {!Object} preset Specific configuration object that can contain any\n * and all of the parameters avaialble within the `$mdPanel.create` method.\n * However, parameters that pertain to id, position, animation, and user\n * interaction are not allowed and will be removed from the preset\n * configuration.\n */\nfunction definePreset(name, preset) {\n if (!name || !preset) {\n throw new Error('mdPanelProvider: The panel preset definition is ' +\n 'malformed. The name and preset object are required.');\n } else if (_presets.hasOwnProperty(name)) {\n throw new Error('mdPanelProvider: The panel preset you have requested ' +\n 'has already been defined.');\n }\n\n // Delete any property on the preset that is not allowed.\n delete preset.id;\n delete preset.position;\n delete preset.animation;\n\n _presets[name] = preset;\n}\n\n\n/**\n * Gets a clone of the `_presets`.\n * @return {!Object}\n */\nfunction getAllPresets() {\n return angular.copy(_presets);\n}\n\n\n/**\n * Clears all of the stored presets.\n */\nfunction clearPresets() {\n _presets = {};\n}\n\n\n/**\n * Represents the `$get` method of the AngularJS provider. From here, a new\n * reference to the MdPanelService is returned where the needed arguments are\n * passed in including the MdPanelProvider `_presets`.\n * @param {!Object} _presets\n * @param {!angular.JQLite} $rootElement\n * @param {!angular.Scope} $rootScope\n * @param {!angular.$injector} $injector\n * @param {!angular.$window} $window\n */\nfunction $getProvider() {\n return [\n '$rootElement', '$rootScope', '$injector', '$window',\n function($rootElement, $rootScope, $injector, $window) {\n return new MdPanelService(_presets, $rootElement, $rootScope,\n $injector, $window);\n }\n ];\n}\n\n\n/*****************************************************************************\n * MdPanel Service *\n *****************************************************************************/\n\n\n/**\n * A service that is used for controlling/displaying panels on the screen.\n * @param {!Object} presets\n * @param {!angular.JQLite} $rootElement\n * @param {!angular.Scope} $rootScope\n * @param {!angular.$injector} $injector\n * @param {!angular.$window} $window\n * @final @constructor @ngInject\n */\nfunction MdPanelService(presets, $rootElement, $rootScope, $injector, $window) {\n /**\n * Default config options for the panel.\n * Anything angular related needs to be done later. Therefore\n * scope: $rootScope.$new(true),\n * attachTo: $rootElement,\n * are added later.\n * @private {!Object}\n */\n this._defaultConfigOptions = {\n bindToController: true,\n clickOutsideToClose: false,\n disableParentScroll: false,\n escapeToClose: false,\n focusOnOpen: true,\n fullscreen: false,\n hasBackdrop: false,\n propagateContainerEvents: false,\n transformTemplate: angular.bind(this, this._wrapTemplate),\n trapFocus: false,\n zIndex: MD_PANEL_Z_INDEX\n };\n\n /** @private {!Object} */\n this._config = {};\n\n /** @private {!Object} */\n this._presets = presets;\n\n /** @private @const */\n this._$rootElement = $rootElement;\n\n /** @private @const */\n this._$rootScope = $rootScope;\n\n /** @private @const */\n this._$injector = $injector;\n\n /** @private @const */\n this._$window = $window;\n\n /** @private @const */\n this._$mdUtil = this._$injector.get('$mdUtil');\n\n /** @private {!Object} */\n this._trackedPanels = {};\n\n /**\n * @private {!Object,\n * openPanels: !Array,\n * maxOpen: number}>}\n */\n this._groups = Object.create(null);\n\n /**\n * Default animations that can be used within the panel.\n * @type {enum}\n */\n this.animation = MdPanelAnimation.animation;\n\n /**\n * Possible values of xPosition for positioning the panel relative to\n * another element.\n * @type {enum}\n */\n this.xPosition = MdPanelPosition.xPosition;\n\n /**\n * Possible values of yPosition for positioning the panel relative to\n * another element.\n * @type {enum}\n */\n this.yPosition = MdPanelPosition.yPosition;\n\n /**\n * Possible values for the interceptors that can be registered on a panel.\n * @type {enum}\n */\n this.interceptorTypes = MdPanelRef.interceptorTypes;\n\n /**\n * Possible values for closing of a panel.\n * @type {enum}\n */\n this.closeReasons = MdPanelRef.closeReasons;\n\n /**\n * Possible values of absolute position.\n * @type {enum}\n */\n this.absPosition = MdPanelPosition.absPosition;\n}\n\n\n/**\n * Creates a panel with the specified options.\n * @param {string=} preset Name of a preset configuration that can be used to\n * extend the panel configuration.\n * @param {!Object=} config Configuration object for the panel.\n * @returns {!MdPanelRef}\n */\nMdPanelService.prototype.create = function(preset, config) {\n if (typeof preset === 'string') {\n preset = this._getPresetByName(preset);\n } else if (typeof preset === 'object' &&\n (angular.isUndefined(config) || !config)) {\n config = preset;\n preset = {};\n }\n\n preset = preset || {};\n config = config || {};\n\n // If the passed-in config contains an ID and the ID is within _trackedPanels,\n // return the tracked panel after updating its config with the passed-in\n // config.\n if (angular.isDefined(config.id) && this._trackedPanels[config.id]) {\n var trackedPanel = this._trackedPanels[config.id];\n angular.extend(trackedPanel.config, config);\n return trackedPanel;\n }\n\n // Combine the passed-in config, the _defaultConfigOptions, and the preset\n // configuration into the `_config`.\n this._config = angular.extend({\n // If no ID is set within the passed-in config, then create an arbitrary ID.\n id: config.id || 'panel_' + this._$mdUtil.nextUid(),\n scope: this._$rootScope.$new(true),\n attachTo: this._$rootElement\n }, this._defaultConfigOptions, config, preset);\n\n // Create the panelRef and add it to the `_trackedPanels` object.\n var panelRef = new MdPanelRef(this._config, this._$injector);\n this._trackedPanels[config.id] = panelRef;\n\n // Add the panel to each of its requested groups.\n if (this._config.groupName) {\n if (angular.isString(this._config.groupName)) {\n this._config.groupName = [this._config.groupName];\n }\n angular.forEach(this._config.groupName, function(group) {\n panelRef.addToGroup(group);\n });\n }\n\n this._config.scope.$on('$destroy', angular.bind(panelRef, panelRef.detach));\n\n return panelRef;\n};\n\n\n/**\n * Creates and opens a panel with the specified options.\n * @param {string=} preset Name of a preset configuration that can be used to\n * extend the panel configuration.\n * @param {!Object=} config Configuration object for the panel.\n * @returns {!angular.$q.Promise} The panel created from create.\n */\nMdPanelService.prototype.open = function(preset, config) {\n var panelRef = this.create(preset, config);\n return panelRef.open().then(function() {\n return panelRef;\n });\n};\n\n\n/**\n * Gets a specific preset configuration object saved within `_presets`.\n * @param {string} preset Name of the preset to search for.\n * @returns {!Object} The preset configuration object.\n */\nMdPanelService.prototype._getPresetByName = function(preset) {\n if (!this._presets[preset]) {\n throw new Error('mdPanel: The panel preset configuration that you ' +\n 'requested does not exist. Use the $mdPanelProvider to create a ' +\n 'preset before requesting one.');\n }\n return this._presets[preset];\n};\n\n\n/**\n * Returns a new instance of the MdPanelPosition. Use this to create the\n * positioning object.\n * @returns {!MdPanelPosition}\n */\nMdPanelService.prototype.newPanelPosition = function() {\n return new MdPanelPosition(this._$injector);\n};\n\n\n/**\n * Returns a new instance of the MdPanelAnimation. Use this to create the\n * animation object.\n * @returns {!MdPanelAnimation}\n */\nMdPanelService.prototype.newPanelAnimation = function() {\n return new MdPanelAnimation(this._$injector);\n};\n\n\n/**\n * Creates a panel group and adds it to a tracked list of panel groups.\n * @param groupName {string} Name of the group to create.\n * @param config {!Object=} Specific configuration object that may contain the\n * following properties:\n *\n * - `maxOpen` - `{number=}`: The maximum number of panels that are allowed\n * open within a defined panel group.\n *\n * @returns {!Object,\n * openPanels: !Array,\n * maxOpen: number}>} panelGroup\n */\nMdPanelService.prototype.newPanelGroup = function(groupName, config) {\n if (!this._groups[groupName]) {\n config = config || {};\n var group = {\n panels: [],\n openPanels: [],\n maxOpen: config.maxOpen > 0 ? config.maxOpen : Infinity\n };\n this._groups[groupName] = group;\n }\n return this._groups[groupName];\n};\n\n\n/**\n * Sets the maximum number of panels in a group that can be opened at a given\n * time.\n * @param {string} groupName The name of the group to configure.\n * @param {number} maxOpen The maximum number of panels that can be\n * opened. Infinity can be passed in to remove the maxOpen limit.\n */\nMdPanelService.prototype.setGroupMaxOpen = function(groupName, maxOpen) {\n if (this._groups[groupName]) {\n this._groups[groupName].maxOpen = maxOpen;\n } else {\n throw new Error('mdPanel: Group does not exist yet. Call newPanelGroup().');\n }\n};\n\n\n/**\n * Determines if the current number of open panels within a group exceeds the\n * limit of allowed open panels.\n * @param {string} groupName The name of the group to check.\n * @returns {boolean} true if open count does exceed maxOpen and false if not.\n * @private\n */\nMdPanelService.prototype._openCountExceedsMaxOpen = function(groupName) {\n if (this._groups[groupName]) {\n var group = this._groups[groupName];\n return group.maxOpen > 0 && group.openPanels.length > group.maxOpen;\n }\n return false;\n};\n\n\n/**\n * Closes the first open panel within a specific group.\n * @param {string} groupName The name of the group.\n * @private\n */\nMdPanelService.prototype._closeFirstOpenedPanel = function(groupName) {\n this._groups[groupName].openPanels[0].close();\n};\n\n\n/**\n * Wraps the users template in two elements, md-panel-outer-wrapper, which\n * covers the entire attachTo element, and md-panel, which contains only the\n * template. This allows the panel control over positioning, animations,\n * and similar properties.\n * @param {string} origTemplate The original template.\n * @returns {string} The wrapped template.\n * @private\n */\nMdPanelService.prototype._wrapTemplate = function(origTemplate) {\n var template = origTemplate || '';\n\n // The panel should be initially rendered offscreen so we can calculate\n // height and width for positioning.\n return '' +\n '
    ' +\n '
    ' + template + '
    ' +\n '
    ';\n};\n\n\n/**\n * Wraps a content element in a md-panel-outer wrapper and\n * positions it off-screen. Allows for proper control over positoning\n * and animations.\n * @param {!angular.JQLite} contentElement Element to be wrapped.\n * @return {!angular.JQLite} Wrapper element.\n * @private\n */\nMdPanelService.prototype._wrapContentElement = function(contentElement) {\n var wrapper = angular.element('
    ');\n\n contentElement.addClass('md-panel _md-panel-offscreen');\n wrapper.append(contentElement);\n\n return wrapper;\n};\n\n\n/*****************************************************************************\n * MdPanelRef *\n *****************************************************************************/\n\n\n/**\n * A reference to a created panel. This reference contains a unique id for the\n * panel, along with properties/functions used to control the panel.\n * @param {!Object} config\n * @param {!angular.$injector} $injector\n * @final @constructor\n */\nfunction MdPanelRef(config, $injector) {\n // Injected variables.\n /** @private @const {!angular.$q} */\n this._$q = $injector.get('$q');\n\n /** @private @const {!angular.$mdCompiler} */\n this._$mdCompiler = $injector.get('$mdCompiler');\n\n /** @private @const {!angular.$mdConstant} */\n this._$mdConstant = $injector.get('$mdConstant');\n\n /** @private @const {!angular.$mdUtil} */\n this._$mdUtil = $injector.get('$mdUtil');\n\n /** @private @const {!angular.$mdTheming} */\n this._$mdTheming = $injector.get('$mdTheming');\n\n /** @private @const {!angular.Scope} */\n this._$rootScope = $injector.get('$rootScope');\n\n /** @private @const {!angular.$animate} */\n this._$animate = $injector.get('$animate');\n\n /** @private @const {!MdPanelRef} */\n this._$mdPanel = $injector.get('$mdPanel');\n\n /** @private @const {!angular.$log} */\n this._$log = $injector.get('$log');\n\n /** @private @const {!angular.$window} */\n this._$window = $injector.get('$window');\n\n /** @private @const {!Function} */\n this._$$rAF = $injector.get('$$rAF');\n\n // Public variables.\n /**\n * Unique id for the panelRef.\n * @type {string}\n */\n this.id = config.id;\n\n /** @type {!Object} */\n this.config = config;\n\n /** @type {!angular.JQLite|undefined} */\n this.panelContainer;\n\n /** @type {!angular.JQLite|undefined} */\n this.panelEl;\n\n /**\n * Whether the panel is attached. This is synchronous. When attach is called,\n * isAttached is set to true. When detach is called, isAttached is set to\n * false.\n * @type {boolean}\n */\n this.isAttached = false;\n\n // Private variables.\n /** @private {Array} */\n this._removeListeners = [];\n\n /** @private {!angular.JQLite|undefined} */\n this._topFocusTrap;\n\n /** @private {!angular.JQLite|undefined} */\n this._bottomFocusTrap;\n\n /** @private {!$mdPanel|undefined} */\n this._backdropRef;\n\n /** @private {Function?} */\n this._restoreScroll = null;\n\n /**\n * Keeps track of all the panel interceptors.\n * @private {!Object}\n */\n this._interceptors = Object.create(null);\n\n /**\n * Cleanup function, provided by `$mdCompiler` and assigned after the element\n * has been compiled. When `contentElement` is used, the function is used to\n * restore the element to it's proper place in the DOM.\n * @private {!Function}\n */\n this._compilerCleanup = null;\n\n /**\n * Cache for saving and restoring element inline styles, CSS classes etc.\n * @type {{styles: string, classes: string}}\n */\n this._restoreCache = {\n styles: '',\n classes: ''\n };\n}\n\n\nMdPanelRef.interceptorTypes = {\n CLOSE: 'onClose'\n};\n\n\n/**\n * Opens an already created and configured panel. If the panel is already\n * visible, does nothing.\n * @returns {!angular.$q.Promise} A promise that is resolved when\n * the panel is opened and animations finish.\n */\nMdPanelRef.prototype.open = function() {\n var self = this;\n return this._$q(function(resolve, reject) {\n var done = self._done(resolve, self);\n var show = self._simpleBind(self.show, self);\n var checkGroupMaxOpen = function() {\n if (self.config.groupName) {\n angular.forEach(self.config.groupName, function(group) {\n if (self._$mdPanel._openCountExceedsMaxOpen(group)) {\n self._$mdPanel._closeFirstOpenedPanel(group);\n }\n });\n }\n };\n\n self.attach()\n .then(show)\n .then(checkGroupMaxOpen)\n .then(done)\n .catch(reject);\n });\n};\n\n\n/**\n * Closes the panel.\n * @param {string} closeReason The event type that triggered the close.\n * @returns {!angular.$q.Promise} A promise that is resolved when\n * the panel is closed and animations finish.\n */\nMdPanelRef.prototype.close = function(closeReason) {\n var self = this;\n\n return this._$q(function(resolve, reject) {\n self._callInterceptors(MdPanelRef.interceptorTypes.CLOSE).then(function() {\n var done = self._done(resolve, self);\n var detach = self._simpleBind(self.detach, self);\n var onCloseSuccess = self.config['onCloseSuccess'] || angular.noop;\n onCloseSuccess = angular.bind(self, onCloseSuccess, self, closeReason);\n\n self.hide()\n .then(detach)\n .then(done)\n .then(onCloseSuccess)\n .catch(reject);\n }, reject);\n });\n};\n\n\n/**\n * Attaches the panel. The panel will be hidden afterwards.\n * @returns {!angular.$q.Promise} A promise that is resolved when\n * the panel is attached.\n */\nMdPanelRef.prototype.attach = function() {\n if (this.isAttached && this.panelEl) {\n return this._$q.when(this);\n }\n\n var self = this;\n return this._$q(function(resolve, reject) {\n var done = self._done(resolve, self);\n var onDomAdded = self.config['onDomAdded'] || angular.noop;\n var addListeners = function(response) {\n self.isAttached = true;\n self._addEventListeners();\n return response;\n };\n\n self._$q.all([\n self._createBackdrop(),\n self._createPanel()\n .then(addListeners)\n .catch(reject)\n ]).then(onDomAdded)\n .then(done)\n .catch(reject);\n });\n};\n\n\n/**\n * Only detaches the panel. Will NOT hide the panel first.\n * @returns {!angular.$q.Promise} A promise that is resolved when\n * the panel is detached.\n */\nMdPanelRef.prototype.detach = function() {\n if (!this.isAttached) {\n return this._$q.when(this);\n }\n\n var self = this;\n var onDomRemoved = self.config['onDomRemoved'] || angular.noop;\n\n var detachFn = function() {\n self._removeEventListeners();\n\n // Remove the focus traps that we added earlier for keeping focus within\n // the panel.\n if (self._topFocusTrap && self._topFocusTrap.parentNode) {\n self._topFocusTrap.parentNode.removeChild(self._topFocusTrap);\n }\n\n if (self._bottomFocusTrap && self._bottomFocusTrap.parentNode) {\n self._bottomFocusTrap.parentNode.removeChild(self._bottomFocusTrap);\n }\n\n if (self._restoreCache.classes) {\n self.panelEl[0].className = self._restoreCache.classes;\n }\n\n // Either restore the saved styles or clear the ones set by mdPanel.\n self.panelEl[0].style.cssText = self._restoreCache.styles || '';\n\n self._compilerCleanup();\n self.panelContainer.remove();\n self.isAttached = false;\n return self._$q.when(self);\n };\n\n if (this._restoreScroll) {\n this._restoreScroll();\n this._restoreScroll = null;\n }\n\n return this._$q(function(resolve, reject) {\n var done = self._done(resolve, self);\n\n self._$q.all([\n detachFn(),\n self._backdropRef ? self._backdropRef.detach() : true\n ]).then(onDomRemoved)\n .then(done)\n .catch(reject);\n });\n};\n\n\n/**\n * Destroys the panel. The Panel cannot be opened again after this.\n */\nMdPanelRef.prototype.destroy = function() {\n var self = this;\n if (this.config.groupName) {\n angular.forEach(this.config.groupName, function(group) {\n self.removeFromGroup(group);\n });\n }\n this.config.scope.$destroy();\n this.config.locals = null;\n this._interceptors = null;\n};\n\n\n/**\n * Shows the panel.\n * @returns {!angular.$q.Promise} A promise that is resolved when\n * the panel has shown and animations finish.\n */\nMdPanelRef.prototype.show = function() {\n if (!this.panelContainer) {\n return this._$q(function(resolve, reject) {\n reject('mdPanel: Panel does not exist yet. Call open() or attach().');\n });\n }\n\n if (!this.panelContainer.hasClass(MD_PANEL_HIDDEN)) {\n return this._$q.when(this);\n }\n\n var self = this;\n var animatePromise = function() {\n self.panelContainer.removeClass(MD_PANEL_HIDDEN);\n return self._animateOpen();\n };\n\n return this._$q(function(resolve, reject) {\n var done = self._done(resolve, self);\n var onOpenComplete = self.config['onOpenComplete'] || angular.noop;\n var addToGroupOpen = function() {\n if (self.config.groupName) {\n angular.forEach(self.config.groupName, function(group) {\n self._$mdPanel._groups[group].openPanels.push(self);\n });\n }\n };\n\n self._$q.all([\n self._backdropRef ? self._backdropRef.show() : self,\n animatePromise().then(function() { self._focusOnOpen(); }, reject)\n ]).then(onOpenComplete)\n .then(addToGroupOpen)\n .then(done)\n .catch(reject);\n });\n};\n\n\n/**\n * Hides the panel.\n * @returns {!angular.$q.Promise} A promise that is resolved when\n * the panel has hidden and animations finish.\n */\nMdPanelRef.prototype.hide = function() {\n if (!this.panelContainer) {\n return this._$q(function(resolve, reject) {\n reject('mdPanel: Panel does not exist yet. Call open() or attach().');\n });\n }\n\n if (this.panelContainer.hasClass(MD_PANEL_HIDDEN)) {\n return this._$q.when(this);\n }\n\n var self = this;\n\n return this._$q(function(resolve, reject) {\n var done = self._done(resolve, self);\n var onRemoving = self.config['onRemoving'] || angular.noop;\n var hidePanel = function() {\n self.panelContainer.addClass(MD_PANEL_HIDDEN);\n };\n var removeFromGroupOpen = function() {\n if (self.config.groupName) {\n var group, index;\n angular.forEach(self.config.groupName, function(group) {\n group = self._$mdPanel._groups[group];\n index = group.openPanels.indexOf(self);\n if (index > -1) {\n group.openPanels.splice(index, 1);\n }\n });\n }\n };\n var focusOnOrigin = function() {\n var origin = self.config['origin'];\n if (origin) {\n getElement(origin).focus();\n }\n };\n\n self._$q.all([\n self._backdropRef ? self._backdropRef.hide() : self,\n self._animateClose()\n .then(onRemoving)\n .then(hidePanel)\n .then(removeFromGroupOpen)\n .then(focusOnOrigin)\n .catch(reject)\n ]).then(done, reject);\n });\n};\n\n\n/**\n * Add a class to the panel. DO NOT use this to hide/show the panel.\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n *\n * @param {string} newClass Class to be added.\n * @param {boolean} toElement Whether or not to add the class to the panel\n * element instead of the container.\n */\nMdPanelRef.prototype.addClass = function(newClass, toElement) {\n this._$log.warn(\n 'mdPanel: The addClass method is in the process of being deprecated. ' +\n 'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n 'To achieve the same results, use the panelContainer or panelEl ' +\n 'JQLite elements that are referenced in MdPanelRef.');\n\n if (!this.panelContainer) {\n throw new Error(\n 'mdPanel: Panel does not exist yet. Call open() or attach().');\n }\n\n if (!toElement && !this.panelContainer.hasClass(newClass)) {\n this.panelContainer.addClass(newClass);\n } else if (toElement && !this.panelEl.hasClass(newClass)) {\n this.panelEl.addClass(newClass);\n }\n};\n\n\n/**\n * Remove a class from the panel. DO NOT use this to hide/show the panel.\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n *\n * @param {string} oldClass Class to be removed.\n * @param {boolean} fromElement Whether or not to remove the class from the\n * panel element instead of the container.\n */\nMdPanelRef.prototype.removeClass = function(oldClass, fromElement) {\n this._$log.warn(\n 'mdPanel: The removeClass method is in the process of being deprecated. ' +\n 'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n 'To achieve the same results, use the panelContainer or panelEl ' +\n 'JQLite elements that are referenced in MdPanelRef.');\n\n if (!this.panelContainer) {\n throw new Error(\n 'mdPanel: Panel does not exist yet. Call open() or attach().');\n }\n\n if (!fromElement && this.panelContainer.hasClass(oldClass)) {\n this.panelContainer.removeClass(oldClass);\n } else if (fromElement && this.panelEl.hasClass(oldClass)) {\n this.panelEl.removeClass(oldClass);\n }\n};\n\n\n/**\n * Toggle a class on the panel. DO NOT use this to hide/show the panel.\n * @deprecated\n * This method is in the process of being deprecated in favor of using the panel\n * and container JQLite elements that are referenced in the MdPanelRef object.\n * Full deprecation is scheduled for material 1.2.\n *\n * @param {string} toggleClass The class to toggle.\n * @param {boolean} onElement Whether or not to toggle the class on the panel\n * element instead of the container.\n */\nMdPanelRef.prototype.toggleClass = function(toggleClass, onElement) {\n this._$log.warn(\n 'mdPanel: The toggleClass method is in the process of being deprecated. ' +\n 'Full deprecation is scheduled for the AngularJS Material 1.2 release. ' +\n 'To achieve the same results, use the panelContainer or panelEl ' +\n 'JQLite elements that are referenced in MdPanelRef.');\n\n if (!this.panelContainer) {\n throw new Error(\n 'mdPanel: Panel does not exist yet. Call open() or attach().');\n }\n\n if (!onElement) {\n this.panelContainer.toggleClass(toggleClass);\n } else {\n this.panelEl.toggleClass(toggleClass);\n }\n};\n\n\n/**\n * Compiles the panel, according to the passed in config and appends it to\n * the DOM. Helps normalize differences in the compilation process between\n * using a string template and a content element.\n * @returns {!angular.$q.Promise} Promise that is resolved when\n * the element has been compiled and added to the DOM.\n * @private\n */\nMdPanelRef.prototype._compile = function() {\n var self = this;\n\n // Compile the element via $mdCompiler. Note that when using a\n // contentElement, the element isn't actually being compiled, rather the\n // compiler saves it's place in the DOM and provides a way of restoring it.\n return self._$mdCompiler.compile(self.config).then(function(compileData) {\n var config = self.config;\n\n if (config.contentElement) {\n var panelEl = compileData.element;\n\n // Since mdPanel modifies the inline styles and CSS classes, we need\n // to save them in order to be able to restore on close.\n self._restoreCache.styles = panelEl[0].style.cssText;\n self._restoreCache.classes = panelEl[0].className;\n\n self.panelContainer = self._$mdPanel._wrapContentElement(panelEl);\n self.panelEl = panelEl;\n } else {\n self.panelContainer = compileData.link(config['scope']);\n self.panelEl = angular.element(\n self.panelContainer[0].querySelector('.md-panel')\n );\n }\n\n // Save a reference to the cleanup function from the compiler.\n self._compilerCleanup = compileData.cleanup;\n\n // Attach the panel to the proper place in the DOM.\n getElement(self.config['attachTo']).append(self.panelContainer);\n\n return self;\n });\n};\n\n\n/**\n * Creates a panel and adds it to the dom.\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel is\n * created.\n * @private\n */\nMdPanelRef.prototype._createPanel = function() {\n var self = this;\n\n return this._$q(function(resolve, reject) {\n if (!self.config.locals) {\n self.config.locals = {};\n }\n\n self.config.locals.mdPanelRef = self;\n\n self._compile().then(function() {\n if (self.config['disableParentScroll']) {\n self._restoreScroll = self._$mdUtil.disableScrollAround(\n null,\n self.panelContainer,\n { disableScrollMask: true }\n );\n }\n\n // Add a custom CSS class to the panel element.\n if (self.config['panelClass']) {\n self.panelEl.addClass(self.config['panelClass']);\n }\n\n // Handle click and touch events for the panel container.\n if (self.config['propagateContainerEvents']) {\n self.panelContainer.css('pointer-events', 'none');\n }\n\n // Panel may be outside the $rootElement, tell ngAnimate to animate\n // regardless.\n if (self._$animate.pin) {\n self._$animate.pin(\n self.panelContainer,\n getElement(self.config['attachTo'])\n );\n }\n\n self._configureTrapFocus();\n self._addStyles().then(function() {\n resolve(self);\n }, reject);\n }, reject);\n\n });\n};\n\n\n/**\n * Adds the styles for the panel, such as positioning and z-index. Also,\n * themes the panel element and panel container using `$mdTheming`.\n * @returns {!angular.$q.Promise}\n * @private\n */\nMdPanelRef.prototype._addStyles = function() {\n var self = this;\n return this._$q(function(resolve) {\n self.panelContainer.css('z-index', self.config['zIndex']);\n self.panelEl.css('z-index', self.config['zIndex'] + 1);\n\n var hideAndResolve = function() {\n // Theme the element and container.\n self._setTheming();\n\n // Remove offscreen class and add hidden class.\n self.panelEl.removeClass('_md-panel-offscreen');\n self.panelContainer.addClass(MD_PANEL_HIDDEN);\n\n resolve(self);\n };\n\n if (self.config['fullscreen']) {\n self.panelEl.addClass('_md-panel-fullscreen');\n hideAndResolve();\n return; // Don't setup positioning.\n }\n\n var positionConfig = self.config['position'];\n if (!positionConfig) {\n hideAndResolve();\n return; // Don't setup positioning.\n }\n\n // Wait for angular to finish processing the template\n self._$rootScope['$$postDigest'](function() {\n // Position it correctly. This is necessary so that the panel will have a\n // defined height and width.\n self._updatePosition(true);\n\n // Theme the element and container.\n self._setTheming();\n\n resolve(self);\n });\n });\n};\n\n\n/**\n * Sets the `$mdTheming` classes on the `panelContainer` and `panelEl`.\n * @private\n */\nMdPanelRef.prototype._setTheming = function() {\n this._$mdTheming(this.panelEl);\n this._$mdTheming(this.panelContainer);\n};\n\n\n/**\n * Updates the position configuration of a panel\n * @param {!MdPanelPosition} position\n */\nMdPanelRef.prototype.updatePosition = function(position) {\n if (!this.panelContainer) {\n throw new Error(\n 'mdPanel: Panel does not exist yet. Call open() or attach().');\n }\n\n this.config['position'] = position;\n this._updatePosition();\n};\n\n\n/**\n * Calculates and updates the position of the panel.\n * @param {boolean=} init\n * @private\n */\nMdPanelRef.prototype._updatePosition = function(init) {\n var positionConfig = this.config['position'];\n\n if (positionConfig) {\n positionConfig._setPanelPosition(this.panelEl);\n\n // Hide the panel now that position is known.\n if (init) {\n this.panelEl.removeClass('_md-panel-offscreen');\n this.panelContainer.addClass(MD_PANEL_HIDDEN);\n }\n\n this.panelEl.css(\n MdPanelPosition.absPosition.TOP,\n positionConfig.getTop()\n );\n this.panelEl.css(\n MdPanelPosition.absPosition.BOTTOM,\n positionConfig.getBottom()\n );\n this.panelEl.css(\n MdPanelPosition.absPosition.LEFT,\n positionConfig.getLeft()\n );\n this.panelEl.css(\n MdPanelPosition.absPosition.RIGHT,\n positionConfig.getRight()\n );\n }\n};\n\n\n/**\n * Focuses on the panel or the first focus target.\n * @private\n */\nMdPanelRef.prototype._focusOnOpen = function() {\n if (this.config['focusOnOpen']) {\n // Wait for the template to finish rendering to guarantee md-autofocus has\n // finished adding the class md-autofocus, otherwise the focusable element\n // isn't available to focus.\n var self = this;\n this._$rootScope['$$postDigest'](function() {\n var target = self._$mdUtil.findFocusTarget(self.panelEl) ||\n self.panelEl;\n target.focus();\n });\n }\n};\n\n\n/**\n * Shows the backdrop.\n * @returns {!angular.$q.Promise} A promise that is resolved when the backdrop\n * is created and attached.\n * @private\n */\nMdPanelRef.prototype._createBackdrop = function() {\n if (this.config.hasBackdrop) {\n if (!this._backdropRef) {\n var backdropAnimation = this._$mdPanel.newPanelAnimation()\n .openFrom(this.config.attachTo)\n .withAnimation({\n open: '_md-opaque-enter',\n close: '_md-opaque-leave'\n });\n\n if (this.config.animation) {\n backdropAnimation.duration(this.config.animation._rawDuration);\n }\n\n var backdropConfig = {\n animation: backdropAnimation,\n attachTo: this.config.attachTo,\n focusOnOpen: false,\n panelClass: '_md-panel-backdrop',\n zIndex: this.config.zIndex - 1\n };\n\n this._backdropRef = this._$mdPanel.create(backdropConfig);\n }\n if (!this._backdropRef.isAttached) {\n return this._backdropRef.attach();\n }\n }\n};\n\n\n/**\n * Listen for escape keys and outside clicks to auto close.\n * @private\n */\nMdPanelRef.prototype._addEventListeners = function() {\n this._configureEscapeToClose();\n this._configureClickOutsideToClose();\n this._configureScrollListener();\n};\n\n\n/**\n * Remove event listeners added in _addEventListeners.\n * @private\n */\nMdPanelRef.prototype._removeEventListeners = function() {\n this._removeListeners && this._removeListeners.forEach(function(removeFn) {\n removeFn();\n });\n this._removeListeners = [];\n};\n\n\n/**\n * Setup the escapeToClose event listeners.\n * @private\n */\nMdPanelRef.prototype._configureEscapeToClose = function() {\n if (this.config['escapeToClose']) {\n var parentTarget = getElement(this.config['attachTo']);\n var self = this;\n\n var keyHandlerFn = function(ev) {\n if (ev.keyCode === self._$mdConstant.KEY_CODE.ESCAPE) {\n ev.stopPropagation();\n ev.preventDefault();\n\n self.close(MdPanelRef.closeReasons.ESCAPE);\n }\n };\n\n // Add keydown listeners\n this.panelContainer.on('keydown', keyHandlerFn);\n parentTarget.on('keydown', keyHandlerFn);\n\n // Queue remove listeners function\n this._removeListeners.push(function() {\n self.panelContainer.off('keydown', keyHandlerFn);\n parentTarget.off('keydown', keyHandlerFn);\n });\n }\n};\n\n\n/**\n * Setup the clickOutsideToClose event listeners.\n * @private\n */\nMdPanelRef.prototype._configureClickOutsideToClose = function() {\n if (this.config['clickOutsideToClose']) {\n var target = this.config['propagateContainerEvents'] ?\n angular.element(document.body) :\n this.panelContainer;\n var sourceEl;\n\n // Keep track of the element on which the mouse originally went down\n // so that we can only close the backdrop when the 'click' started on it.\n // A simple 'click' handler does not work, it sets the target object as the\n // element the mouse went down on.\n var mousedownHandler = function(ev) {\n sourceEl = ev.target;\n };\n\n // We check if our original element and the target is the backdrop\n // because if the original was the backdrop and the target was inside the\n // panel we don't want to panel to close.\n var self = this;\n var mouseupHandler = function(ev) {\n if (self.config['propagateContainerEvents']) {\n\n // We check if the sourceEl of the event is the panel element or one\n // of it's children. If it is not, then close the panel.\n if (sourceEl !== self.panelEl[0] && !self.panelEl[0].contains(sourceEl)) {\n self.close();\n }\n\n } else if (sourceEl === target[0] && ev.target === target[0]) {\n ev.stopPropagation();\n ev.preventDefault();\n\n self.close(MdPanelRef.closeReasons.CLICK_OUTSIDE);\n }\n };\n\n // Add listeners\n target.on('mousedown', mousedownHandler);\n target.on('mouseup', mouseupHandler);\n\n // Queue remove listeners function\n this._removeListeners.push(function() {\n target.off('mousedown', mousedownHandler);\n target.off('mouseup', mouseupHandler);\n });\n }\n};\n\n\n/**\n * Configures the listeners for updating the panel position on scroll.\n * @private\n*/\nMdPanelRef.prototype._configureScrollListener = function() {\n // No need to bind the event if scrolling is disabled.\n if (!this.config['disableParentScroll']) {\n var updatePosition = angular.bind(this, this._updatePosition);\n var debouncedUpdatePosition = this._$$rAF.throttle(updatePosition);\n var self = this;\n\n var onScroll = function() {\n debouncedUpdatePosition();\n };\n\n // Add listeners.\n this._$window.addEventListener('scroll', onScroll, true);\n\n // Queue remove listeners function.\n this._removeListeners.push(function() {\n self._$window.removeEventListener('scroll', onScroll, true);\n });\n }\n};\n\n\n/**\n * Setup the focus traps. These traps will wrap focus when tabbing past the\n * panel. When shift-tabbing, the focus will stick in place.\n * @private\n */\nMdPanelRef.prototype._configureTrapFocus = function() {\n // Focus doesn't remain inside of the panel without this.\n this.panelEl.attr('tabIndex', '-1');\n if (this.config['trapFocus']) {\n var element = this.panelEl;\n // Set up elements before and after the panel to capture focus and\n // redirect back into the panel.\n this._topFocusTrap = FOCUS_TRAP_TEMPLATE.clone()[0];\n this._bottomFocusTrap = FOCUS_TRAP_TEMPLATE.clone()[0];\n\n // When focus is about to move out of the panel, we want to intercept it\n // and redirect it back to the panel element.\n var focusHandler = function() {\n element.focus();\n };\n this._topFocusTrap.addEventListener('focus', focusHandler);\n this._bottomFocusTrap.addEventListener('focus', focusHandler);\n\n // Queue remove listeners function\n this._removeListeners.push(this._simpleBind(function() {\n this._topFocusTrap.removeEventListener('focus', focusHandler);\n this._bottomFocusTrap.removeEventListener('focus', focusHandler);\n }, this));\n\n // The top focus trap inserted immediately before the md-panel element (as\n // a sibling). The bottom focus trap inserted immediately after the\n // md-panel element (as a sibling).\n element[0].parentNode.insertBefore(this._topFocusTrap, element[0]);\n element.after(this._bottomFocusTrap);\n }\n};\n\n\n/**\n * Updates the animation of a panel.\n * @param {!MdPanelAnimation} animation\n */\nMdPanelRef.prototype.updateAnimation = function(animation) {\n this.config['animation'] = animation;\n\n if (this._backdropRef) {\n this._backdropRef.config.animation.duration(animation._rawDuration);\n }\n};\n\n\n/**\n * Animate the panel opening.\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n * animated open.\n * @private\n */\nMdPanelRef.prototype._animateOpen = function() {\n this.panelContainer.addClass('md-panel-is-showing');\n var animationConfig = this.config['animation'];\n if (!animationConfig) {\n // Promise is in progress, return it.\n this.panelContainer.addClass('_md-panel-shown');\n return this._$q.when(this);\n }\n\n var self = this;\n return this._$q(function(resolve) {\n var done = self._done(resolve, self);\n var warnAndOpen = function() {\n self._$log.warn(\n 'mdPanel: MdPanel Animations failed. ' +\n 'Showing panel without animating.');\n done();\n };\n\n animationConfig.animateOpen(self.panelEl)\n .then(done, warnAndOpen);\n });\n};\n\n\n/**\n * Animate the panel closing.\n * @returns {!angular.$q.Promise} A promise that is resolved when the panel has\n * animated closed.\n * @private\n */\nMdPanelRef.prototype._animateClose = function() {\n var animationConfig = this.config['animation'];\n if (!animationConfig) {\n this.panelContainer.removeClass('md-panel-is-showing');\n this.panelContainer.removeClass('_md-panel-shown');\n return this._$q.when(this);\n }\n\n var self = this;\n return this._$q(function(resolve) {\n var done = function() {\n self.panelContainer.removeClass('md-panel-is-showing');\n resolve(self);\n };\n var warnAndClose = function() {\n self._$log.warn(\n 'mdPanel: MdPanel Animations failed. ' +\n 'Hiding panel without animating.');\n done();\n };\n\n animationConfig.animateClose(self.panelEl)\n .then(done, warnAndClose);\n });\n};\n\n\n/**\n * Registers a interceptor with the panel. The callback should return a promise,\n * which will allow the action to continue when it gets resolved, or will\n * prevent an action if it is rejected.\n * @param {string} type Type of interceptor.\n * @param {!angular.$q.Promise} callback Callback to be registered.\n * @returns {!MdPanelRef}\n */\nMdPanelRef.prototype.registerInterceptor = function(type, callback) {\n var error = null;\n\n if (!angular.isString(type)) {\n error = 'Interceptor type must be a string, instead got ' + typeof type;\n } else if (!angular.isFunction(callback)) {\n error = 'Interceptor callback must be a function, instead got ' + typeof callback;\n }\n\n if (error) {\n throw new Error('MdPanel: ' + error);\n }\n\n var interceptors = this._interceptors[type] = this._interceptors[type] || [];\n\n if (interceptors.indexOf(callback) === -1) {\n interceptors.push(callback);\n }\n\n return this;\n};\n\n\n/**\n * Removes a registered interceptor.\n * @param {string} type Type of interceptor to be removed.\n * @param {Function} callback Interceptor to be removed.\n * @returns {!MdPanelRef}\n */\nMdPanelRef.prototype.removeInterceptor = function(type, callback) {\n var index = this._interceptors[type] ?\n this._interceptors[type].indexOf(callback) : -1;\n\n if (index > -1) {\n this._interceptors[type].splice(index, 1);\n }\n\n return this;\n};\n\n\n/**\n * Removes all interceptors.\n * @param {string=} type Type of interceptors to be removed.\n * If ommited, all interceptors types will be removed.\n * @returns {!MdPanelRef}\n */\nMdPanelRef.prototype.removeAllInterceptors = function(type) {\n if (type) {\n this._interceptors[type] = [];\n } else {\n this._interceptors = Object.create(null);\n }\n\n return this;\n};\n\n\n/**\n * Invokes all the interceptors of a certain type sequantially in\n * reverse order. Works in a similar way to `$q.all`, except it\n * respects the order of the functions.\n * @param {string} type Type of interceptors to be invoked.\n * @returns {!angular.$q.Promise}\n * @private\n */\nMdPanelRef.prototype._callInterceptors = function(type) {\n var self = this;\n var $q = self._$q;\n var interceptors = self._interceptors && self._interceptors[type] || [];\n\n return interceptors.reduceRight(function(promise, interceptor) {\n var isPromiseLike = interceptor && angular.isFunction(interceptor.then);\n var response = isPromiseLike ? interceptor : null;\n\n /**\n * For interceptors to reject/cancel subsequent portions of the chain, simply\n * return a `$q.reject()`\n */\n return promise.then(function() {\n if (!response) {\n try {\n response = interceptor(self);\n } catch(e) {\n response = $q.reject(e);\n }\n }\n\n return response;\n });\n }, $q.resolve(self));\n};\n\n\n/**\n * Faster, more basic than angular.bind\n * http://jsperf.com/angular-bind-vs-custom-vs-native\n * @param {function} callback\n * @param {!Object} self\n * @return {function} Callback function with a bound self.\n */\nMdPanelRef.prototype._simpleBind = function(callback, self) {\n return function(value) {\n return callback.apply(self, value);\n };\n};\n\n\n/**\n * @param {function} callback\n * @param {!Object} self\n * @return {function} Callback function with a self param.\n */\nMdPanelRef.prototype._done = function(callback, self) {\n return function() {\n callback(self);\n };\n};\n\n\n/**\n * Adds a panel to a group if the panel does not exist within the group already.\n * A panel can only exist within a single group.\n * @param {string} groupName The name of the group.\n */\nMdPanelRef.prototype.addToGroup = function(groupName) {\n if (!this._$mdPanel._groups[groupName]) {\n this._$mdPanel.newPanelGroup(groupName);\n }\n\n var group = this._$mdPanel._groups[groupName];\n var index = group.panels.indexOf(this);\n\n if (index < 0) {\n group.panels.push(this);\n }\n};\n\n\n/**\n * Removes a panel from a group if the panel exists within that group. The group\n * must be created ahead of time.\n * @param {string} groupName The name of the group.\n */\nMdPanelRef.prototype.removeFromGroup = function(groupName) {\n if (!this._$mdPanel._groups[groupName]) {\n throw new Error('mdPanel: The group ' + groupName + ' does not exist.');\n }\n\n var group = this._$mdPanel._groups[groupName];\n var index = group.panels.indexOf(this);\n\n if (index > -1) {\n group.panels.splice(index, 1);\n }\n};\n\n\n/**\n * Possible default closeReasons for the close function.\n * @enum {string}\n */\nMdPanelRef.closeReasons = {\n CLICK_OUTSIDE: 'clickOutsideToClose',\n ESCAPE: 'escapeToClose',\n};\n\n\n/*****************************************************************************\n * MdPanelPosition *\n *****************************************************************************/\n\n\n/**\n * Position configuration object. To use, create an MdPanelPosition with the\n * desired properties, then pass the object as part of $mdPanel creation.\n *\n * Example:\n *\n * var panelPosition = new MdPanelPosition()\n * .relativeTo(myButtonEl)\n * .addPanelPosition(\n * $mdPanel.xPosition.CENTER,\n * $mdPanel.yPosition.ALIGN_TOPS\n * );\n *\n * $mdPanel.create({\n * position: panelPosition\n * });\n *\n * @param {!angular.$injector} $injector\n * @final @constructor\n */\nfunction MdPanelPosition($injector) {\n /** @private @const {!angular.$window} */\n this._$window = $injector.get('$window');\n\n /** @private {boolean} */\n this._isRTL = $injector.get('$mdUtil').bidi() === 'rtl';\n\n /** @private @const {!angular.$mdConstant} */\n this._$mdConstant = $injector.get('$mdConstant');\n\n /** @private {boolean} */\n this._absolute = false;\n\n /** @private {!angular.JQLite} */\n this._relativeToEl;\n\n /** @private {string} */\n this._top = '';\n\n /** @private {string} */\n this._bottom = '';\n\n /** @private {string} */\n this._left = '';\n\n /** @private {string} */\n this._right = '';\n\n /** @private {!Array} */\n this._translateX = [];\n\n /** @private {!Array} */\n this._translateY = [];\n\n /** @private {!Array<{x:string, y:string}>} */\n this._positions = [];\n\n /** @private {?{x:string, y:string}} */\n this._actualPosition;\n}\n\n\n/**\n * Possible values of xPosition.\n * @enum {string}\n */\nMdPanelPosition.xPosition = {\n CENTER: 'center',\n ALIGN_START: 'align-start',\n ALIGN_END: 'align-end',\n OFFSET_START: 'offset-start',\n OFFSET_END: 'offset-end'\n};\n\n\n/**\n * Possible values of yPosition.\n * @enum {string}\n */\nMdPanelPosition.yPosition = {\n CENTER: 'center',\n ALIGN_TOPS: 'align-tops',\n ALIGN_BOTTOMS: 'align-bottoms',\n ABOVE: 'above',\n BELOW: 'below'\n};\n\n\n/**\n * Possible values of absolute position.\n * @enum {string}\n */\nMdPanelPosition.absPosition = {\n TOP: 'top',\n RIGHT: 'right',\n BOTTOM: 'bottom',\n LEFT: 'left'\n};\n\n/**\n * Margin between the edges of a panel and the viewport.\n * @const {number}\n */\nMdPanelPosition.viewportMargin = 8;\n\n\n/**\n * Sets absolute positioning for the panel.\n * @return {!MdPanelPosition}\n */\nMdPanelPosition.prototype.absolute = function() {\n this._absolute = true;\n return this;\n};\n\n\n/**\n * Sets the value of a position for the panel. Clears any previously set\n * position.\n * @param {string} position Position to set\n * @param {string=} value Value of the position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n * @private\n */\nMdPanelPosition.prototype._setPosition = function(position, value) {\n if (position === MdPanelPosition.absPosition.RIGHT ||\n position === MdPanelPosition.absPosition.LEFT) {\n this._left = this._right = '';\n } else if (\n position === MdPanelPosition.absPosition.BOTTOM ||\n position === MdPanelPosition.absPosition.TOP) {\n this._top = this._bottom = '';\n } else {\n var positions = Object.keys(MdPanelPosition.absPosition).join()\n .toLowerCase();\n\n throw new Error('mdPanel: Position must be one of ' + positions + '.');\n }\n\n this['_' + position] = angular.isString(value) ? value : '0';\n\n return this;\n};\n\n\n/**\n * Sets the value of `top` for the panel. Clears any previously set vertical\n * position.\n * @param {string=} top Value of `top`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.top = function(top) {\n return this._setPosition(MdPanelPosition.absPosition.TOP, top);\n};\n\n\n/**\n * Sets the value of `bottom` for the panel. Clears any previously set vertical\n * position.\n * @param {string=} bottom Value of `bottom`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.bottom = function(bottom) {\n return this._setPosition(MdPanelPosition.absPosition.BOTTOM, bottom);\n};\n\n\n/**\n * Sets the panel to the start of the page - `left` if `ltr` or `right` for\n * `rtl`. Clears any previously set horizontal position.\n * @param {string=} start Value of position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.start = function(start) {\n var position = this._isRTL ? MdPanelPosition.absPosition.RIGHT : MdPanelPosition.absPosition.LEFT;\n return this._setPosition(position, start);\n};\n\n\n/**\n * Sets the panel to the end of the page - `right` if `ltr` or `left` for `rtl`.\n * Clears any previously set horizontal position.\n * @param {string=} end Value of position. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.end = function(end) {\n var position = this._isRTL ? MdPanelPosition.absPosition.LEFT : MdPanelPosition.absPosition.RIGHT;\n return this._setPosition(position, end);\n};\n\n\n/**\n * Sets the value of `left` for the panel. Clears any previously set\n * horizontal position.\n * @param {string=} left Value of `left`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.left = function(left) {\n return this._setPosition(MdPanelPosition.absPosition.LEFT, left);\n};\n\n\n/**\n * Sets the value of `right` for the panel. Clears any previously set\n * horizontal position.\n * @param {string=} right Value of `right`. Defaults to '0'.\n * @returns {!MdPanelPosition}\n*/\nMdPanelPosition.prototype.right = function(right) {\n return this._setPosition(MdPanelPosition.absPosition.RIGHT, right);\n};\n\n\n/**\n * Centers the panel horizontally in the viewport. Clears any previously set\n * horizontal position.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.centerHorizontally = function() {\n this._left = '50%';\n this._right = '';\n this._translateX = ['-50%'];\n return this;\n};\n\n\n/**\n * Centers the panel vertically in the viewport. Clears any previously set\n * vertical position.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.centerVertically = function() {\n this._top = '50%';\n this._bottom = '';\n this._translateY = ['-50%'];\n return this;\n};\n\n\n/**\n * Centers the panel horizontally and vertically in the viewport. This is\n * equivalent to calling both `centerHorizontally` and `centerVertically`.\n * Clears any previously set horizontal and vertical positions.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.center = function() {\n return this.centerHorizontally().centerVertically();\n};\n\n\n/**\n * Sets element for relative positioning.\n * @param {string|!Element|!angular.JQLite} element Query selector, DOM element,\n * or angular element to set the panel relative to.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.relativeTo = function(element) {\n this._absolute = false;\n this._relativeToEl = getElement(element);\n return this;\n};\n\n\n/**\n * Sets the x and y positions for the panel relative to another element.\n * @param {string} xPosition must be one of the MdPanelPosition.xPosition\n * values.\n * @param {string} yPosition must be one of the MdPanelPosition.yPosition\n * values.\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.addPanelPosition = function(xPosition, yPosition) {\n if (!this._relativeToEl) {\n throw new Error('mdPanel: addPanelPosition can only be used with ' +\n 'relative positioning. Set relativeTo first.');\n }\n\n this._validateXPosition(xPosition);\n this._validateYPosition(yPosition);\n\n this._positions.push({\n x: xPosition,\n y: yPosition,\n });\n return this;\n};\n\n\n/**\n * Ensures that yPosition is a valid position name. Throw an exception if not.\n * @param {string} yPosition\n */\nMdPanelPosition.prototype._validateYPosition = function(yPosition) {\n // empty is ok\n if (yPosition == null) {\n return;\n }\n\n var positionKeys = Object.keys(MdPanelPosition.yPosition);\n var positionValues = [];\n for (var key, i = 0; key = positionKeys[i]; i++) {\n var position = MdPanelPosition.yPosition[key];\n positionValues.push(position);\n\n if (position === yPosition) {\n return;\n }\n }\n\n throw new Error('mdPanel: Panel y position only accepts the following ' +\n 'values:\\n' + positionValues.join(' | '));\n};\n\n\n/**\n * Ensures that xPosition is a valid position name. Throw an exception if not.\n * @param {string} xPosition\n */\nMdPanelPosition.prototype._validateXPosition = function(xPosition) {\n // empty is ok\n if (xPosition == null) {\n return;\n }\n\n var positionKeys = Object.keys(MdPanelPosition.xPosition);\n var positionValues = [];\n for (var key, i = 0; key = positionKeys[i]; i++) {\n var position = MdPanelPosition.xPosition[key];\n positionValues.push(position);\n if (position === xPosition) {\n return;\n }\n }\n\n throw new Error('mdPanel: Panel x Position only accepts the following ' +\n 'values:\\n' + positionValues.join(' | '));\n};\n\n\n/**\n * Sets the value of the offset in the x-direction. This will add to any\n * previously set offsets.\n * @param {string|function(MdPanelPosition): string} offsetX\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.withOffsetX = function(offsetX) {\n this._translateX.push(offsetX);\n return this;\n};\n\n\n/**\n * Sets the value of the offset in the y-direction. This will add to any\n * previously set offsets.\n * @param {string|function(MdPanelPosition): string} offsetY\n * @returns {!MdPanelPosition}\n */\nMdPanelPosition.prototype.withOffsetY = function(offsetY) {\n this._translateY.push(offsetY);\n return this;\n};\n\n\n/**\n * Gets the value of `top` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getTop = function() {\n return this._top;\n};\n\n\n/**\n * Gets the value of `bottom` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getBottom = function() {\n return this._bottom;\n};\n\n\n/**\n * Gets the value of `left` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getLeft = function() {\n return this._left;\n};\n\n\n/**\n * Gets the value of `right` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getRight = function() {\n return this._right;\n};\n\n\n/**\n * Gets the value of `transform` for the panel.\n * @returns {string}\n */\nMdPanelPosition.prototype.getTransform = function() {\n var translateX = this._reduceTranslateValues('translateX', this._translateX);\n var translateY = this._reduceTranslateValues('translateY', this._translateY);\n\n // It's important to trim the result, because the browser will ignore the set\n // operation if the string contains only whitespace.\n return (translateX + ' ' + translateY).trim();\n};\n\n\n/**\n * Sets the `transform` value for a panel element.\n * @param {!angular.JQLite} panelEl\n * @returns {!angular.JQLite}\n * @private\n */\nMdPanelPosition.prototype._setTransform = function(panelEl) {\n return panelEl.css(this._$mdConstant.CSS.TRANSFORM, this.getTransform());\n};\n\n\n/**\n * True if the panel is completely on-screen with this positioning; false\n * otherwise.\n * @param {!angular.JQLite} panelEl\n * @return {boolean}\n * @private\n */\nMdPanelPosition.prototype._isOnscreen = function(panelEl) {\n // this works because we always use fixed positioning for the panel,\n // which is relative to the viewport.\n var left = parseInt(this.getLeft());\n var top = parseInt(this.getTop());\n\n if (this._translateX.length || this._translateY.length) {\n var prefixedTransform = this._$mdConstant.CSS.TRANSFORM;\n var offsets = getComputedTranslations(panelEl, prefixedTransform);\n left += offsets.x;\n top += offsets.y;\n }\n\n var right = left + panelEl[0].offsetWidth;\n var bottom = top + panelEl[0].offsetHeight;\n\n return (left >= 0) &&\n (top >= 0) &&\n (bottom <= this._$window.innerHeight) &&\n (right <= this._$window.innerWidth);\n};\n\n\n/**\n * Gets the first x/y position that can fit on-screen.\n * @returns {{x: string, y: string}}\n */\nMdPanelPosition.prototype.getActualPosition = function() {\n return this._actualPosition;\n};\n\n\n/**\n * Reduces a list of translate values to a string that can be used within\n * transform.\n * @param {string} translateFn\n * @param {!Array} values\n * @returns {string}\n * @private\n */\nMdPanelPosition.prototype._reduceTranslateValues =\n function(translateFn, values) {\n return values.map(function(translation) {\n // TODO(crisbeto): this should add the units after #9609 is merged.\n var translationValue = angular.isFunction(translation) ?\n translation(this) : translation;\n return translateFn + '(' + translationValue + ')';\n }, this).join(' ');\n };\n\n\n/**\n * Sets the panel position based on the created panel element and best x/y\n * positioning.\n * @param {!angular.JQLite} panelEl\n * @private\n */\nMdPanelPosition.prototype._setPanelPosition = function(panelEl) {\n // Remove the \"position adjusted\" class in case it has been added before.\n panelEl.removeClass('_md-panel-position-adjusted');\n\n // Only calculate the position if necessary.\n if (this._absolute) {\n this._setTransform(panelEl);\n return;\n }\n\n if (this._actualPosition) {\n this._calculatePanelPosition(panelEl, this._actualPosition);\n this._setTransform(panelEl);\n this._constrainToViewport(panelEl);\n return;\n }\n\n for (var i = 0; i < this._positions.length; i++) {\n this._actualPosition = this._positions[i];\n this._calculatePanelPosition(panelEl, this._actualPosition);\n this._setTransform(panelEl);\n\n if (this._isOnscreen(panelEl)) {\n return;\n }\n }\n\n this._constrainToViewport(panelEl);\n};\n\n\n/**\n * Constrains a panel's position to the viewport.\n * @param {!angular.JQLite} panelEl\n * @private\n */\nMdPanelPosition.prototype._constrainToViewport = function(panelEl) {\n var margin = MdPanelPosition.viewportMargin;\n var initialTop = this._top;\n var initialLeft = this._left;\n\n if (this.getTop()) {\n var top = parseInt(this.getTop());\n var bottom = panelEl[0].offsetHeight + top;\n var viewportHeight = this._$window.innerHeight;\n\n if (top < margin) {\n this._top = margin + 'px';\n } else if (bottom > viewportHeight) {\n this._top = top - (bottom - viewportHeight + margin) + 'px';\n }\n }\n\n if (this.getLeft()) {\n var left = parseInt(this.getLeft());\n var right = panelEl[0].offsetWidth + left;\n var viewportWidth = this._$window.innerWidth;\n\n if (left < margin) {\n this._left = margin + 'px';\n } else if (right > viewportWidth) {\n this._left = left - (right - viewportWidth + margin) + 'px';\n }\n }\n\n // Class that can be used to re-style the panel if it was repositioned.\n panelEl.toggleClass(\n '_md-panel-position-adjusted',\n this._top !== initialTop || this._left !== initialLeft\n );\n};\n\n\n/**\n * Switches between 'start' and 'end'.\n * @param {string} position Horizontal position of the panel\n * @returns {string} Reversed position\n * @private\n */\nMdPanelPosition.prototype._reverseXPosition = function(position) {\n if (position === MdPanelPosition.xPosition.CENTER) {\n return;\n }\n\n var start = 'start';\n var end = 'end';\n\n return position.indexOf(start) > -1 ? position.replace(start, end) : position.replace(end, start);\n};\n\n\n/**\n * Handles horizontal positioning in rtl or ltr environments.\n * @param {string} position Horizontal position of the panel\n * @returns {string} The correct position according the page direction\n * @private\n */\nMdPanelPosition.prototype._bidi = function(position) {\n return this._isRTL ? this._reverseXPosition(position) : position;\n};\n\n\n/**\n * Calculates the panel position based on the created panel element and the\n * provided positioning.\n * @param {!angular.JQLite} panelEl\n * @param {!{x:string, y:string}} position\n * @private\n */\nMdPanelPosition.prototype._calculatePanelPosition = function(panelEl, position) {\n\n var panelBounds = panelEl[0].getBoundingClientRect();\n var panelWidth = panelBounds.width;\n var panelHeight = panelBounds.height;\n\n var targetBounds = this._relativeToEl[0].getBoundingClientRect();\n\n var targetLeft = targetBounds.left;\n var targetRight = targetBounds.right;\n var targetWidth = targetBounds.width;\n\n switch (this._bidi(position.x)) {\n case MdPanelPosition.xPosition.OFFSET_START:\n this._left = targetLeft - panelWidth + 'px';\n break;\n case MdPanelPosition.xPosition.ALIGN_END:\n this._left = targetRight - panelWidth + 'px';\n break;\n case MdPanelPosition.xPosition.CENTER:\n var left = targetLeft + (0.5 * targetWidth) - (0.5 * panelWidth);\n this._left = left + 'px';\n break;\n case MdPanelPosition.xPosition.ALIGN_START:\n this._left = targetLeft + 'px';\n break;\n case MdPanelPosition.xPosition.OFFSET_END:\n this._left = targetRight + 'px';\n break;\n }\n\n var targetTop = targetBounds.top;\n var targetBottom = targetBounds.bottom;\n var targetHeight = targetBounds.height;\n\n switch (position.y) {\n case MdPanelPosition.yPosition.ABOVE:\n this._top = targetTop - panelHeight + 'px';\n break;\n case MdPanelPosition.yPosition.ALIGN_BOTTOMS:\n this._top = targetBottom - panelHeight + 'px';\n break;\n case MdPanelPosition.yPosition.CENTER:\n var top = targetTop + (0.5 * targetHeight) - (0.5 * panelHeight);\n this._top = top + 'px';\n break;\n case MdPanelPosition.yPosition.ALIGN_TOPS:\n this._top = targetTop + 'px';\n break;\n case MdPanelPosition.yPosition.BELOW:\n this._top = targetBottom + 'px';\n break;\n }\n};\n\n\n/*****************************************************************************\n * MdPanelAnimation *\n *****************************************************************************/\n\n\n/**\n * Animation configuration object. To use, create an MdPanelAnimation with the\n * desired properties, then pass the object as part of $mdPanel creation.\n *\n * Example:\n *\n * var panelAnimation = new MdPanelAnimation()\n * .openFrom(myButtonEl)\n * .closeTo('.my-button')\n * .withAnimation($mdPanel.animation.SCALE);\n *\n * $mdPanel.create({\n * animation: panelAnimation\n * });\n *\n * @param {!angular.$injector} $injector\n * @final @constructor\n */\nfunction MdPanelAnimation($injector) {\n /** @private @const {!angular.$mdUtil} */\n this._$mdUtil = $injector.get('$mdUtil');\n\n /**\n * @private {{element: !angular.JQLite|undefined, bounds: !DOMRect}|\n * undefined}\n */\n this._openFrom;\n\n /**\n * @private {{element: !angular.JQLite|undefined, bounds: !DOMRect}|\n * undefined}\n */\n this._closeTo;\n\n /** @private {string|{open: string, close: string}} */\n this._animationClass = '';\n\n /** @private {number} */\n this._openDuration;\n\n /** @private {number} */\n this._closeDuration;\n\n /** @private {number|{open: number, close: number}} */\n this._rawDuration;\n}\n\n\n/**\n * Possible default animations.\n * @enum {string}\n */\nMdPanelAnimation.animation = {\n SLIDE: 'md-panel-animate-slide',\n SCALE: 'md-panel-animate-scale',\n FADE: 'md-panel-animate-fade'\n};\n\n\n/**\n * Specifies where to start the open animation. `openFrom` accepts a\n * click event object, query selector, DOM element, or a Rect object that\n * is used to determine the bounds. When passed a click event, the location\n * of the click will be used as the position to start the animation.\n * @param {string|!Element|!Event|{top: number, left: number}} openFrom\n * @returns {!MdPanelAnimation}\n */\nMdPanelAnimation.prototype.openFrom = function(openFrom) {\n // Check if 'openFrom' is an Event.\n openFrom = openFrom.target ? openFrom.target : openFrom;\n\n this._openFrom = this._getPanelAnimationTarget(openFrom);\n\n if (!this._closeTo) {\n this._closeTo = this._openFrom;\n }\n return this;\n};\n\n\n/**\n * Specifies where to animate the panel close. `closeTo` accepts a\n * query selector, DOM element, or a Rect object that is used to determine\n * the bounds.\n * @param {string|!Element|{top: number, left: number}} closeTo\n * @returns {!MdPanelAnimation}\n */\nMdPanelAnimation.prototype.closeTo = function(closeTo) {\n this._closeTo = this._getPanelAnimationTarget(closeTo);\n return this;\n};\n\n\n/**\n * Specifies the duration of the animation in milliseconds.\n * @param {number|{open: number, close: number}} duration\n * @returns {!MdPanelAnimation}\n */\nMdPanelAnimation.prototype.duration = function(duration) {\n if (duration) {\n if (angular.isNumber(duration)) {\n this._openDuration = this._closeDuration = toSeconds(duration);\n } else if (angular.isObject(duration)) {\n this._openDuration = toSeconds(duration.open);\n this._closeDuration = toSeconds(duration.close);\n }\n }\n\n // Save the original value so it can be passed to the backdrop.\n this._rawDuration = duration;\n\n return this;\n\n function toSeconds(value) {\n if (angular.isNumber(value)) return value / 1000;\n }\n};\n\n\n/**\n * Returns the element and bounds for the animation target.\n * @param {string|!Element|{top: number, left: number}} location\n * @returns {{element: !angular.JQLite|undefined, bounds: !DOMRect}}\n * @private\n */\nMdPanelAnimation.prototype._getPanelAnimationTarget = function(location) {\n if (angular.isDefined(location.top) || angular.isDefined(location.left)) {\n return {\n element: undefined,\n bounds: {\n top: location.top || 0,\n left: location.left || 0\n }\n };\n } else {\n return this._getBoundingClientRect(getElement(location));\n }\n};\n\n\n/**\n * Specifies the animation class.\n *\n * There are several default animations that can be used:\n * (MdPanelAnimation.animation)\n * SLIDE: The panel slides in and out from the specified\n * elements.\n * SCALE: The panel scales in and out.\n * FADE: The panel fades in and out.\n *\n * @param {string|{open: string, close: string}} cssClass\n * @returns {!MdPanelAnimation}\n */\nMdPanelAnimation.prototype.withAnimation = function(cssClass) {\n this._animationClass = cssClass;\n return this;\n};\n\n\n/**\n * Animate the panel open.\n * @param {!angular.JQLite} panelEl\n * @returns {!angular.$q.Promise} A promise that is resolved when the open\n * animation is complete.\n */\nMdPanelAnimation.prototype.animateOpen = function(panelEl) {\n var animator = this._$mdUtil.dom.animator;\n\n this._fixBounds(panelEl);\n var animationOptions = {};\n\n // Include the panel transformations when calculating the animations.\n var panelTransform = panelEl[0].style.transform || '';\n\n var openFrom = animator.toTransformCss(panelTransform);\n var openTo = animator.toTransformCss(panelTransform);\n\n switch (this._animationClass) {\n case MdPanelAnimation.animation.SLIDE:\n // Slide should start with opacity: 1.\n panelEl.css('opacity', '1');\n\n animationOptions = {\n transitionInClass: '_md-panel-animate-enter'\n };\n\n var openSlide = animator.calculateSlideToOrigin(\n panelEl, this._openFrom) || '';\n openFrom = animator.toTransformCss(openSlide + ' ' + panelTransform);\n break;\n\n case MdPanelAnimation.animation.SCALE:\n animationOptions = {\n transitionInClass: '_md-panel-animate-enter'\n };\n\n var openScale = animator.calculateZoomToOrigin(\n panelEl, this._openFrom) || '';\n openFrom = animator.toTransformCss(openScale + ' ' + panelTransform);\n break;\n\n case MdPanelAnimation.animation.FADE:\n animationOptions = {\n transitionInClass: '_md-panel-animate-enter'\n };\n break;\n\n default:\n if (angular.isString(this._animationClass)) {\n animationOptions = {\n transitionInClass: this._animationClass\n };\n } else {\n animationOptions = {\n transitionInClass: this._animationClass['open'],\n transitionOutClass: this._animationClass['close'],\n };\n }\n }\n\n animationOptions.duration = this._openDuration;\n\n return animator\n .translate3d(panelEl, openFrom, openTo, animationOptions);\n};\n\n\n/**\n * Animate the panel close.\n * @param {!angular.JQLite} panelEl\n * @returns {!angular.$q.Promise} A promise that resolves when the close\n * animation is complete.\n */\nMdPanelAnimation.prototype.animateClose = function(panelEl) {\n var animator = this._$mdUtil.dom.animator;\n var reverseAnimationOptions = {};\n\n // Include the panel transformations when calculating the animations.\n var panelTransform = panelEl[0].style.transform || '';\n\n var closeFrom = animator.toTransformCss(panelTransform);\n var closeTo = animator.toTransformCss(panelTransform);\n\n switch (this._animationClass) {\n case MdPanelAnimation.animation.SLIDE:\n // Slide should start with opacity: 1.\n panelEl.css('opacity', '1');\n reverseAnimationOptions = {\n transitionInClass: '_md-panel-animate-leave'\n };\n\n var closeSlide = animator.calculateSlideToOrigin(\n panelEl, this._closeTo) || '';\n closeTo = animator.toTransformCss(closeSlide + ' ' + panelTransform);\n break;\n\n case MdPanelAnimation.animation.SCALE:\n reverseAnimationOptions = {\n transitionInClass: '_md-panel-animate-scale-out _md-panel-animate-leave'\n };\n\n var closeScale = animator.calculateZoomToOrigin(\n panelEl, this._closeTo) || '';\n closeTo = animator.toTransformCss(closeScale + ' ' + panelTransform);\n break;\n\n case MdPanelAnimation.animation.FADE:\n reverseAnimationOptions = {\n transitionInClass: '_md-panel-animate-fade-out _md-panel-animate-leave'\n };\n break;\n\n default:\n if (angular.isString(this._animationClass)) {\n reverseAnimationOptions = {\n transitionOutClass: this._animationClass\n };\n } else {\n reverseAnimationOptions = {\n transitionInClass: this._animationClass['close'],\n transitionOutClass: this._animationClass['open']\n };\n }\n }\n\n reverseAnimationOptions.duration = this._closeDuration;\n\n return animator\n .translate3d(panelEl, closeFrom, closeTo, reverseAnimationOptions);\n};\n\n\n/**\n * Set the height and width to match the panel if not provided.\n * @param {!angular.JQLite} panelEl\n * @private\n */\nMdPanelAnimation.prototype._fixBounds = function(panelEl) {\n var panelWidth = panelEl[0].offsetWidth;\n var panelHeight = panelEl[0].offsetHeight;\n\n if (this._openFrom && this._openFrom.bounds.height == null) {\n this._openFrom.bounds.height = panelHeight;\n }\n if (this._openFrom && this._openFrom.bounds.width == null) {\n this._openFrom.bounds.width = panelWidth;\n }\n if (this._closeTo && this._closeTo.bounds.height == null) {\n this._closeTo.bounds.height = panelHeight;\n }\n if (this._closeTo && this._closeTo.bounds.width == null) {\n this._closeTo.bounds.width = panelWidth;\n }\n};\n\n\n/**\n * Identify the bounding RECT for the target element.\n * @param {!angular.JQLite} element\n * @returns {{element: !angular.JQLite|undefined, bounds: !DOMRect}}\n * @private\n */\nMdPanelAnimation.prototype._getBoundingClientRect = function(element) {\n if (element instanceof angular.element) {\n return {\n element: element,\n bounds: element[0].getBoundingClientRect()\n };\n }\n};\n\n\n/*****************************************************************************\n * Util Methods *\n *****************************************************************************/\n\n\n/**\n * Returns the angular element associated with a css selector or element.\n * @param el {string|!angular.JQLite|!Element}\n * @returns {!angular.JQLite}\n */\nfunction getElement(el) {\n var queryResult = angular.isString(el) ?\n document.querySelector(el) : el;\n return angular.element(queryResult);\n}\n\n\n/**\n * Gets the computed values for an element's translateX and translateY in px.\n * @param {!angular.JQLite|!Element} el\n * @param {string} property\n * @return {{x: number, y: number}}\n */\nfunction getComputedTranslations(el, property) {\n // The transform being returned by `getComputedStyle` is in the format:\n // `matrix(a, b, c, d, translateX, translateY)` if defined and `none`\n // if the element doesn't have a transform.\n var transform = getComputedStyle(el[0] || el)[property];\n var openIndex = transform.indexOf('(');\n var closeIndex = transform.lastIndexOf(')');\n var output = { x: 0, y: 0 };\n\n if (openIndex > -1 && closeIndex > -1) {\n var parsedValues = transform\n .substring(openIndex + 1, closeIndex)\n .split(', ')\n .slice(-2);\n\n output.x = parseInt(parsedValues[0]);\n output.y = parseInt(parsedValues[1]);\n }\n\n return output;\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.progressLinear\n * @description Linear Progress module!\n */\nMdProgressLinearDirective.$inject = [\"$mdTheming\", \"$mdUtil\", \"$log\"];\nangular.module('material.components.progressLinear', [\n 'material.core'\n])\n .directive('mdProgressLinear', MdProgressLinearDirective);\n\n/**\n * @ngdoc directive\n * @name mdProgressLinear\n * @module material.components.progressLinear\n * @restrict E\n *\n * @description\n * The linear progress directive is used to make loading content\n * in your app as delightful and painless as possible by minimizing\n * the amount of visual change a user sees before they can view\n * and interact with content.\n *\n * Each operation should only be represented by one activity indicator\n * For example: one refresh operation should not display both a\n * refresh bar and an activity circle.\n *\n * For operations where the percentage of the operation completed\n * can be determined, use a determinate indicator. They give users\n * a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while\n * something finishes up, and it’s not necessary to expose what's\n * happening behind the scenes and how long it will take, use an\n * indeterminate indicator.\n *\n * @param {string} md-mode Select from one of four modes: determinate, indeterminate, buffer or query.\n *\n * Note: if the `md-mode` value is set as undefined or specified as 1 of the four (4) valid modes, then `indeterminate`\n * will be auto-applied as the mode.\n *\n * Note: if not configured, the `md-mode=\"indeterminate\"` will be auto injected as an attribute. If `value=\"\"` is also specified, however,\n * then `md-mode=\"determinate\"` would be auto-injected instead.\n * @param {number=} value In determinate and buffer modes, this number represents the percentage of the primary progress bar. Default: 0\n * @param {number=} md-buffer-value In the buffer mode, this number represents the percentage of the secondary progress bar. Default: 0\n * @param {boolean=} ng-disabled Determines whether to disable the progress element.\n *\n * @usage\n * \n * \n *\n * \n *\n * \n *\n * \n *\n * \n * \n */\nfunction MdProgressLinearDirective($mdTheming, $mdUtil, $log) {\n var MODE_DETERMINATE = \"determinate\";\n var MODE_INDETERMINATE = \"indeterminate\";\n var MODE_BUFFER = \"buffer\";\n var MODE_QUERY = \"query\";\n var DISABLED_CLASS = \"_md-progress-linear-disabled\";\n\n return {\n restrict: 'E',\n template: '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ',\n compile: compile\n };\n\n function compile(tElement, tAttrs, transclude) {\n tElement.attr('aria-valuemin', 0);\n tElement.attr('aria-valuemax', 100);\n tElement.attr('role', 'progressbar');\n\n return postLink;\n }\n function postLink(scope, element, attr) {\n $mdTheming(element);\n\n var lastMode;\n var isDisabled = attr.hasOwnProperty('disabled');\n var toVendorCSS = $mdUtil.dom.animator.toCss;\n var bar1 = angular.element(element[0].querySelector('.md-bar1'));\n var bar2 = angular.element(element[0].querySelector('.md-bar2'));\n var container = angular.element(element[0].querySelector('.md-container'));\n\n element\n .attr('md-mode', mode())\n .toggleClass(DISABLED_CLASS, isDisabled);\n\n validateMode();\n watchAttributes();\n\n /**\n * Watch the value, md-buffer-value, and md-mode attributes\n */\n function watchAttributes() {\n attr.$observe('value', function(value) {\n var percentValue = clamp(value);\n element.attr('aria-valuenow', percentValue);\n\n if (mode() != MODE_QUERY) animateIndicator(bar2, percentValue);\n });\n\n attr.$observe('mdBufferValue', function(value) {\n animateIndicator(bar1, clamp(value));\n });\n\n attr.$observe('disabled', function(value) {\n if (value === true || value === false) {\n isDisabled = !!value;\n } else {\n isDisabled = angular.isDefined(value);\n }\n\n element.toggleClass(DISABLED_CLASS, isDisabled);\n container.toggleClass(lastMode, !isDisabled);\n });\n\n attr.$observe('mdMode', function(mode) {\n if (lastMode) container.removeClass( lastMode );\n\n switch( mode ) {\n case MODE_QUERY:\n case MODE_BUFFER:\n case MODE_DETERMINATE:\n case MODE_INDETERMINATE:\n container.addClass( lastMode = \"md-mode-\" + mode );\n break;\n default:\n container.addClass( lastMode = \"md-mode-\" + MODE_INDETERMINATE );\n break;\n }\n });\n }\n\n /**\n * Auto-defaults the mode to either `determinate` or `indeterminate` mode; if not specified\n */\n function validateMode() {\n if ( angular.isUndefined(attr.mdMode) ) {\n var hasValue = angular.isDefined(attr.value);\n var mode = hasValue ? MODE_DETERMINATE : MODE_INDETERMINATE;\n var info = \"Auto-adding the missing md-mode='{0}' to the ProgressLinear element\";\n\n //$log.debug( $mdUtil.supplant(info, [mode]) );\n\n element.attr(\"md-mode\", mode);\n attr.mdMode = mode;\n }\n }\n\n /**\n * Is the md-mode a valid option?\n */\n function mode() {\n var value = (attr.mdMode || \"\").trim();\n if ( value ) {\n switch(value) {\n case MODE_DETERMINATE:\n case MODE_INDETERMINATE:\n case MODE_BUFFER:\n case MODE_QUERY:\n break;\n default:\n value = MODE_INDETERMINATE;\n break;\n }\n }\n return value;\n }\n\n /**\n * Manually set CSS to animate the Determinate indicator based on the specified\n * percentage value (0-100).\n */\n function animateIndicator(target, value) {\n if ( isDisabled || !mode() ) return;\n\n var to = $mdUtil.supplant(\"translateX({0}%) scale({1},1)\", [ (value-100)/2, value/100 ]);\n var styles = toVendorCSS({ transform : to });\n angular.element(target).css( styles );\n }\n }\n\n /**\n * Clamps the value to be between 0 and 100.\n * @param {number} value The value to clamp.\n * @returns {number}\n */\n function clamp(value) {\n return Math.max(0, Math.min(value || 0, 100));\n }\n}\n\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.radioButton\n * @description radioButton module!\n */\nmdRadioGroupDirective.$inject = [\"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$timeout\"];\nmdRadioButtonDirective.$inject = [\"$mdAria\", \"$mdUtil\", \"$mdTheming\"];\nangular.module('material.components.radioButton', [\n 'material.core'\n])\n .directive('mdRadioGroup', mdRadioGroupDirective)\n .directive('mdRadioButton', mdRadioButtonDirective);\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioGroup\n *\n * @restrict E\n *\n * @description\n * The `` directive identifies a grouping\n * container for the 1..n grouped radio buttons; specified using nested\n * `` tags.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the radio button is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * Note: `` and `` handle tabindex differently\n * than the native `` controls. Whereas the native controls\n * force the user to tab through all the radio buttons, ``\n * is focusable, and by default the ``s are not.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {boolean=} md-no-ink Use of attribute indicates flag to disable ink ripple effects.\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} ngChange AngularJS expression to be executed when input changes due to user\n * interaction with the input element.\n *\n * @usage\n * \n * \n *\n * \n *\n * {{ d.label }}\n *\n * \n *\n * \n * \n *\n */\nfunction mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming, $timeout) {\n RadioGroupController.prototype = createRadioGroupControllerProto();\n\n return {\n restrict: 'E',\n controller: ['$element', RadioGroupController],\n require: ['mdRadioGroup', '?ngModel'],\n link: { pre: linkRadioGroup }\n };\n\n function linkRadioGroup(scope, element, attr, ctrls) {\n element.addClass('_md'); // private md component indicator for styling\n $mdTheming(element);\n\n var rgCtrl = ctrls[0];\n var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n\n rgCtrl.init(ngModelCtrl);\n\n scope.mouseActive = false;\n\n element\n .attr({\n 'role': 'radiogroup',\n 'tabIndex': element.attr('tabindex') || '0'\n })\n .on('keydown', keydownListener)\n .on('mousedown', function(event) {\n scope.mouseActive = true;\n $timeout(function() {\n scope.mouseActive = false;\n }, 100);\n })\n .on('focus', function() {\n if(scope.mouseActive === false) {\n rgCtrl.$element.addClass('md-focused');\n }\n })\n .on('blur', function() {\n rgCtrl.$element.removeClass('md-focused');\n });\n\n /**\n *\n */\n function setFocus() {\n if (!element.hasClass('md-focused')) { element.addClass('md-focused'); }\n }\n\n /**\n *\n */\n function keydownListener(ev) {\n var keyCode = ev.which || ev.keyCode;\n\n // Only listen to events that we originated ourselves\n // so that we don't trigger on things like arrow keys in\n // inputs.\n\n if (keyCode != $mdConstant.KEY_CODE.ENTER &&\n ev.currentTarget != ev.target) {\n return;\n }\n\n switch (keyCode) {\n case $mdConstant.KEY_CODE.LEFT_ARROW:\n case $mdConstant.KEY_CODE.UP_ARROW:\n ev.preventDefault();\n rgCtrl.selectPrevious();\n setFocus();\n break;\n\n case $mdConstant.KEY_CODE.RIGHT_ARROW:\n case $mdConstant.KEY_CODE.DOWN_ARROW:\n ev.preventDefault();\n rgCtrl.selectNext();\n setFocus();\n break;\n\n case $mdConstant.KEY_CODE.ENTER:\n var form = angular.element($mdUtil.getClosest(element[0], 'form'));\n if (form.length > 0) {\n form.triggerHandler('submit');\n }\n break;\n }\n\n }\n }\n\n function RadioGroupController($element) {\n this._radioButtonRenderFns = [];\n this.$element = $element;\n }\n\n function createRadioGroupControllerProto() {\n return {\n init: function(ngModelCtrl) {\n this._ngModelCtrl = ngModelCtrl;\n this._ngModelCtrl.$render = angular.bind(this, this.render);\n },\n add: function(rbRender) {\n this._radioButtonRenderFns.push(rbRender);\n },\n remove: function(rbRender) {\n var index = this._radioButtonRenderFns.indexOf(rbRender);\n if (index !== -1) {\n this._radioButtonRenderFns.splice(index, 1);\n }\n },\n render: function() {\n this._radioButtonRenderFns.forEach(function(rbRender) {\n rbRender();\n });\n },\n setViewValue: function(value, eventType) {\n this._ngModelCtrl.$setViewValue(value, eventType);\n // update the other radio buttons as well\n this.render();\n },\n getViewValue: function() {\n return this._ngModelCtrl.$viewValue;\n },\n selectNext: function() {\n return changeSelectedButton(this.$element, 1);\n },\n selectPrevious: function() {\n return changeSelectedButton(this.$element, -1);\n },\n setActiveDescendant: function (radioId) {\n this.$element.attr('aria-activedescendant', radioId);\n },\n isDisabled: function() {\n return this.$element[0].hasAttribute('disabled');\n }\n };\n }\n /**\n * Change the radio group's selected button by a given increment.\n * If no button is selected, select the first button.\n */\n function changeSelectedButton(parent, increment) {\n // Coerce all child radio buttons into an array, then wrap then in an iterator\n var buttons = $mdUtil.iterator(parent[0].querySelectorAll('md-radio-button'), true);\n\n if (buttons.count()) {\n var validate = function (button) {\n // If disabled, then NOT valid\n return !angular.element(button).attr(\"disabled\");\n };\n\n var selected = parent[0].querySelector('md-radio-button.md-checked');\n var target = buttons[increment < 0 ? 'previous' : 'next'](selected, validate) || buttons.first();\n\n // Activate radioButton's click listener (triggerHandler won't create a real click event)\n angular.element(target).triggerHandler('click');\n }\n }\n\n}\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioButton\n *\n * @restrict E\n *\n * @description\n * The ``directive is the child directive required to be used within `` elements.\n *\n * While similar to the `` directive,\n * the `` directive provides ink effects, ARIA support, and\n * supports use within named radio groups.\n *\n * @param {string} ngValue AngularJS expression which sets the value to which the expression should\n * be set when selected.\n * @param {string} value The value to which the expression should be set when selected.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} aria-label Adds label to radio button for accessibility.\n * Defaults to radio button's text. If no text content is available, a warning will be logged.\n *\n * @usage\n * \n *\n * \n * Label 1\n * \n *\n * \n * Green\n * \n *\n * \n *\n */\nfunction mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {\n\n var CHECKED_CSS = 'md-checked';\n\n return {\n restrict: 'E',\n require: '^mdRadioGroup',\n transclude: true,\n template: '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ',\n link: link\n };\n\n function link(scope, element, attr, rgCtrl) {\n var lastChecked;\n\n $mdTheming(element);\n configureAria(element, scope);\n\n // ngAria overwrites the aria-checked inside a $watch for ngValue.\n // We should defer the initialization until all the watches have fired.\n // This can also be fixed by removing the `lastChecked` check, but that'll\n // cause more DOM manipulation on each digest.\n if (attr.ngValue) {\n $mdUtil.nextTick(initialize, false);\n } else {\n initialize();\n }\n\n /**\n * Initializes the component.\n */\n function initialize() {\n if (!rgCtrl) {\n throw 'RadioButton: No RadioGroupController could be found.';\n }\n\n rgCtrl.add(render);\n attr.$observe('value', render);\n\n element\n .on('click', listener)\n .on('$destroy', function() {\n rgCtrl.remove(render);\n });\n }\n\n /**\n * On click functionality.\n */\n function listener(ev) {\n if (element[0].hasAttribute('disabled') || rgCtrl.isDisabled()) return;\n\n scope.$apply(function() {\n rgCtrl.setViewValue(attr.value, ev && ev.type);\n });\n }\n\n /**\n * Add or remove the `.md-checked` class from the RadioButton (and conditionally its parent).\n * Update the `aria-activedescendant` attribute.\n */\n function render() {\n var checked = rgCtrl.getViewValue() == attr.value;\n\n if (checked === lastChecked) return;\n\n if (element[0].parentNode.nodeName.toLowerCase() !== 'md-radio-group') {\n // If the radioButton is inside a div, then add class so highlighting will work\n element.parent().toggleClass(CHECKED_CSS, checked);\n }\n\n if (checked) {\n rgCtrl.setActiveDescendant(element.attr('id'));\n }\n\n lastChecked = checked;\n\n element\n .attr('aria-checked', checked)\n .toggleClass(CHECKED_CSS, checked);\n }\n\n /**\n * Inject ARIA-specific attributes appropriate for each radio button\n */\n function configureAria(element, scope){\n element.attr({\n id: attr.id || 'radio_' + $mdUtil.nextUid(),\n role: 'radio',\n 'aria-checked': 'false'\n });\n\n $mdAria.expectWithText(element, 'aria-label');\n }\n }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.showHide\n */\n\n// Add additional handlers to ng-show and ng-hide that notify directives\n// contained within that they should recompute their size.\n// These run in addition to AngularJS's built-in ng-hide and ng-show directives.\nangular.module('material.components.showHide', [\n 'material.core'\n])\n .directive('ngShow', createDirective('ngShow', true))\n .directive('ngHide', createDirective('ngHide', false));\n\n\nfunction createDirective(name, targetValue) {\n return ['$mdUtil', '$window', function($mdUtil, $window) {\n return {\n restrict: 'A',\n multiElement: true,\n link: function($scope, $element, $attr) {\n var unregister = $scope.$on('$md-resize-enable', function() {\n unregister();\n\n var node = $element[0];\n var cachedTransitionStyles = node.nodeType === $window.Node.ELEMENT_NODE ?\n $window.getComputedStyle(node) : {};\n\n $scope.$watch($attr[name], function(value) {\n if (!!value === targetValue) {\n $mdUtil.nextTick(function() {\n $scope.$broadcast('$md-resize');\n });\n\n var opts = {\n cachedTransitionStyles: cachedTransitionStyles\n };\n\n $mdUtil.dom.animator.waitTransitionEnd($element, opts).then(function() {\n $scope.$broadcast('$md-resize');\n });\n }\n });\n });\n }\n };\n }];\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.sidenav\n *\n * @description\n * A Sidenav QP component.\n */\nSidenavService.$inject = [\"$mdComponentRegistry\", \"$mdUtil\", \"$q\", \"$log\"];\nSidenavDirective.$inject = [\"$mdMedia\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdInteraction\", \"$animate\", \"$compile\", \"$parse\", \"$log\", \"$q\", \"$document\", \"$window\", \"$$rAF\"];\nSidenavController.$inject = [\"$scope\", \"$attrs\", \"$mdComponentRegistry\", \"$q\", \"$interpolate\"];\nangular\n .module('material.components.sidenav', [\n 'material.core',\n 'material.components.backdrop'\n ])\n .factory('$mdSidenav', SidenavService )\n .directive('mdSidenav', SidenavDirective)\n .directive('mdSidenavFocus', SidenavFocusDirective)\n .controller('$mdSidenavController', SidenavController);\n\n\n/**\n * @ngdoc service\n * @name $mdSidenav\n * @module material.components.sidenav\n *\n * @description\n * `$mdSidenav` makes it easy to interact with multiple sidenavs\n * in an app. When looking up a sidenav instance, you can either look\n * it up synchronously or wait for it to be initializied asynchronously.\n * This is done by passing the second argument to `$mdSidenav`.\n *\n * @usage\n * \n * // Async lookup for sidenav instance; will resolve when the instance is available\n * $mdSidenav(componentId, true).then(function(instance) {\n * $log.debug( componentId + \"is now ready\" );\n * });\n * // Sync lookup for sidenav instance; this will resolve immediately.\n * $mdSidenav(componentId).then(function(instance) {\n * $log.debug( componentId + \"is now ready\" );\n * });\n * // Async toggle the given sidenav;\n * // when instance is known ready and lazy lookup is not needed.\n * $mdSidenav(componentId)\n * .toggle()\n * .then(function(){\n * $log.debug('toggled');\n * });\n * // Async open the given sidenav\n * $mdSidenav(componentId)\n * .open()\n * .then(function(){\n * $log.debug('opened');\n * });\n * // Async close the given sidenav\n * $mdSidenav(componentId)\n * .close()\n * .then(function(){\n * $log.debug('closed');\n * });\n * // Sync check to see if the specified sidenav is set to be open\n * $mdSidenav(componentId).isOpen();\n * // Sync check to whether given sidenav is locked open\n * // If this is true, the sidenav will be open regardless of close()\n * $mdSidenav(componentId).isLockedOpen();\n * // On close callback to handle close, backdrop click or escape key pressed\n * // Callback happens BEFORE the close action occurs.\n * $mdSidenav(componentId).onClose(function () {\n * $log.debug('closing');\n * });\n * \n */\nfunction SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {\n var errorMsg = \"SideNav '{0}' is not available! Did you use md-component-id='{0}'?\";\n var service = {\n find : findInstance, // sync - returns proxy API\n waitFor : waitForInstance // async - returns promise\n };\n\n /**\n * Service API that supports three (3) usages:\n * $mdSidenav().find(\"left\") // sync (must already exist) or returns undefined\n * $mdSidenav(\"left\").toggle(); // sync (must already exist) or returns reject promise;\n * $mdSidenav(\"left\",true).then( function(left){ // async returns instance when available\n * left.toggle();\n * });\n */\n return function(handle, enableWait) {\n if ( angular.isUndefined(handle) ) return service;\n\n var shouldWait = enableWait === true;\n var instance = service.find(handle, shouldWait);\n return !instance && shouldWait ? service.waitFor(handle) :\n !instance && angular.isUndefined(enableWait) ? addLegacyAPI(service, handle) : instance;\n };\n\n /**\n * For failed instance/handle lookups, older-clients expect an response object with noops\n * that include `rejected promise APIs`\n */\n function addLegacyAPI(service, handle) {\n var falseFn = function() { return false; };\n var rejectFn = function() {\n return $q.when($mdUtil.supplant(errorMsg, [handle || \"\"]));\n };\n\n return angular.extend({\n isLockedOpen : falseFn,\n isOpen : falseFn,\n toggle : rejectFn,\n open : rejectFn,\n close : rejectFn,\n onClose : angular.noop,\n then : function(callback) {\n return waitForInstance(handle)\n .then(callback || angular.noop);\n }\n }, service);\n }\n /**\n * Synchronously lookup the controller instance for the specified sidNav instance which has been\n * registered with the markup `md-component-id`\n */\n function findInstance(handle, shouldWait) {\n var instance = $mdComponentRegistry.get(handle);\n\n if (!instance && !shouldWait) {\n\n // Report missing instance\n $log.error( $mdUtil.supplant(errorMsg, [handle || \"\"]) );\n\n // The component has not registered itself... most like NOT yet created\n // return null to indicate that the Sidenav is not in the DOM\n return undefined;\n }\n return instance;\n }\n\n /**\n * Asynchronously wait for the component instantiation,\n * Deferred lookup of component instance using $component registry\n */\n function waitForInstance(handle) {\n return $mdComponentRegistry.when(handle).catch($log.error);\n }\n}\n/**\n * @ngdoc directive\n * @name mdSidenavFocus\n * @module material.components.sidenav\n *\n * @restrict A\n *\n * @description\n * `mdSidenavFocus` provides a way to specify the focused element when a sidenav opens.\n * This is completely optional, as the sidenav itself is focused by default.\n *\n * @usage\n * \n * \n *
    \n * \n * \n * \n * \n *
    \n *
    \n *
    \n **/\nfunction SidenavFocusDirective() {\n return {\n restrict: 'A',\n require: '^mdSidenav',\n link: function(scope, element, attr, sidenavCtrl) {\n // @see $mdUtil.findFocusTarget(...)\n }\n };\n}\n/**\n * @ngdoc directive\n * @name mdSidenav\n * @module material.components.sidenav\n * @restrict E\n *\n * @description\n *\n * A Sidenav component that can be opened and closed programatically.\n *\n * By default, upon opening it will slide out on top of the main content area.\n *\n * For keyboard and screen reader accessibility, focus is sent to the sidenav wrapper by default.\n * It can be overridden with the `md-autofocus` directive on the child element you want focused.\n *\n * @usage\n * \n *
    \n * \n * Left Nav!\n * \n *\n * \n * Center Content\n * \n * Open Left Menu\n * \n * \n *\n * \n *
    \n * \n * \n * \n * \n *
    \n *
    \n *
    \n *
    \n *\n * \n * var app = angular.module('myApp', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdSidenav) {\n * $scope.openLeftMenu = function() {\n * $mdSidenav('left').toggle();\n * };\n * });\n * \n *\n * @param {expression=} md-is-open A model bound to whether the sidenav is opened.\n * @param {boolean=} md-disable-backdrop When present in the markup, the sidenav will not show a backdrop.\n * @param {string=} md-component-id componentId to use with $mdSidenav service.\n * @param {expression=} md-is-locked-open When this expression evaluates to true,\n * the sidenav 'locks open': it falls into the content's flow instead\n * of appearing over it. This overrides the `md-is-open` attribute.\n * @param {string=} md-disable-scroll-target Selector, pointing to an element, whose scrolling will\n * be disabled when the sidenav is opened. By default this is the sidenav's direct parent.\n *\n* The $mdMedia() service is exposed to the is-locked-open attribute, which\n * can be given a media query or one of the `sm`, `gt-sm`, `md`, `gt-md`, `lg` or `gt-lg` presets.\n * Examples:\n *\n * - ``\n * - ``\n * - `` (locks open on small screens)\n */\nfunction SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $mdInteraction, $animate,\n $compile, $parse, $log, $q, $document, $window, $$rAF) {\n return {\n restrict: 'E',\n scope: {\n isOpen: '=?mdIsOpen'\n },\n controller: '$mdSidenavController',\n compile: function(element) {\n element.addClass('md-closed').attr('tabIndex', '-1');\n return postLink;\n }\n };\n\n /**\n * Directive Post Link function...\n */\n function postLink(scope, element, attr, sidenavCtrl) {\n var lastParentOverFlow;\n var backdrop;\n var disableScrollTarget = null;\n var triggeringInteractionType;\n var triggeringElement = null;\n var previousContainerStyles;\n var promise = $q.when(true);\n var isLockedOpenParsed = $parse(attr.mdIsLockedOpen);\n var ngWindow = angular.element($window);\n var isLocked = function() {\n return isLockedOpenParsed(scope.$parent, {\n $media: function(arg) {\n $log.warn(\"$media is deprecated for is-locked-open. Use $mdMedia instead.\");\n return $mdMedia(arg);\n },\n $mdMedia: $mdMedia\n });\n };\n\n if (attr.mdDisableScrollTarget) {\n disableScrollTarget = $document[0].querySelector(attr.mdDisableScrollTarget);\n\n if (disableScrollTarget) {\n disableScrollTarget = angular.element(disableScrollTarget);\n } else {\n $log.warn($mdUtil.supplant('mdSidenav: couldn\\'t find element matching ' +\n 'selector \"{selector}\". Falling back to parent.', { selector: attr.mdDisableScrollTarget }));\n }\n }\n\n if (!disableScrollTarget) {\n disableScrollTarget = element.parent();\n }\n\n // Only create the backdrop if the backdrop isn't disabled.\n if (!attr.hasOwnProperty('mdDisableBackdrop')) {\n backdrop = $mdUtil.createBackdrop(scope, \"md-sidenav-backdrop md-opaque ng-enter\");\n }\n\n element.addClass('_md'); // private md component indicator for styling\n $mdTheming(element);\n\n // The backdrop should inherit the sidenavs theme,\n // because the backdrop will take its parent theme by default.\n if ( backdrop ) $mdTheming.inherit(backdrop, element);\n\n element.on('$destroy', function() {\n backdrop && backdrop.remove();\n sidenavCtrl.destroy();\n });\n\n scope.$on('$destroy', function(){\n backdrop && backdrop.remove();\n });\n\n scope.$watch(isLocked, updateIsLocked);\n scope.$watch('isOpen', updateIsOpen);\n\n\n // Publish special accessor for the Controller instance\n sidenavCtrl.$toggleOpen = toggleOpen;\n\n /**\n * Toggle the DOM classes to indicate `locked`\n * @param isLocked\n */\n function updateIsLocked(isLocked, oldValue) {\n scope.isLockedOpen = isLocked;\n if (isLocked === oldValue) {\n element.toggleClass('md-locked-open', !!isLocked);\n } else {\n $animate[isLocked ? 'addClass' : 'removeClass'](element, 'md-locked-open');\n }\n if (backdrop) {\n backdrop.toggleClass('md-locked-open', !!isLocked);\n }\n }\n\n /**\n * Toggle the SideNav view and attach/detach listeners\n * @param isOpen\n */\n function updateIsOpen(isOpen) {\n // Support deprecated md-sidenav-focus attribute as fallback\n var focusEl = $mdUtil.findFocusTarget(element) || $mdUtil.findFocusTarget(element,'[md-sidenav-focus]') || element;\n var parent = element.parent();\n\n parent[isOpen ? 'on' : 'off']('keydown', onKeyDown);\n if (backdrop) backdrop[isOpen ? 'on' : 'off']('click', close);\n\n var restorePositioning = updateContainerPositions(parent, isOpen);\n\n if ( isOpen ) {\n // Capture upon opening..\n triggeringElement = $document[0].activeElement;\n triggeringInteractionType = $mdInteraction.getLastInteractionType();\n }\n\n disableParentScroll(isOpen);\n\n return promise = $q.all([\n isOpen && backdrop ? $animate.enter(backdrop, parent) : backdrop ?\n $animate.leave(backdrop) : $q.when(true),\n $animate[isOpen ? 'removeClass' : 'addClass'](element, 'md-closed')\n ]).then(function() {\n // Perform focus when animations are ALL done...\n if (scope.isOpen) {\n $$rAF(function() {\n // Notifies child components that the sidenav was opened. Should wait\n // a frame in order to allow for the element height to be computed.\n ngWindow.triggerHandler('resize');\n });\n\n focusEl && focusEl.focus();\n }\n\n // Restores the positioning on the sidenav and backdrop.\n restorePositioning && restorePositioning();\n });\n }\n\n function updateContainerPositions(parent, willOpen) {\n var drawerEl = element[0];\n var scrollTop = parent[0].scrollTop;\n\n if (willOpen && scrollTop) {\n previousContainerStyles = {\n top: drawerEl.style.top,\n bottom: drawerEl.style.bottom,\n height: drawerEl.style.height\n };\n\n // When the parent is scrolled down, then we want to be able to show the sidenav at the current scroll\n // position. We're moving the sidenav down to the correct scroll position and apply the height of the\n // parent, to increase the performance. Using 100% as height, will impact the performance heavily.\n var positionStyle = {\n top: scrollTop + 'px',\n bottom: 'auto',\n height: parent[0].clientHeight + 'px'\n };\n\n // Apply the new position styles to the sidenav and backdrop.\n element.css(positionStyle);\n backdrop.css(positionStyle);\n }\n\n // When the sidenav is closing and we have previous defined container styles,\n // then we return a restore function, which resets the sidenav and backdrop.\n if (!willOpen && previousContainerStyles) {\n return function() {\n drawerEl.style.top = previousContainerStyles.top;\n drawerEl.style.bottom = previousContainerStyles.bottom;\n drawerEl.style.height = previousContainerStyles.height;\n\n backdrop[0].style.top = null;\n backdrop[0].style.bottom = null;\n backdrop[0].style.height = null;\n\n previousContainerStyles = null;\n };\n }\n }\n\n /**\n * Prevent parent scrolling (when the SideNav is open)\n */\n function disableParentScroll(disabled) {\n if ( disabled && !lastParentOverFlow ) {\n lastParentOverFlow = disableScrollTarget.css('overflow');\n disableScrollTarget.css('overflow', 'hidden');\n } else if (angular.isDefined(lastParentOverFlow)) {\n disableScrollTarget.css('overflow', lastParentOverFlow);\n lastParentOverFlow = undefined;\n }\n }\n\n /**\n * Toggle the sideNav view and publish a promise to be resolved when\n * the view animation finishes.\n *\n * @param isOpen\n * @returns {*}\n */\n function toggleOpen( isOpen ) {\n if (scope.isOpen == isOpen ) {\n\n return $q.when(true);\n\n } else {\n if (scope.isOpen && sidenavCtrl.onCloseCb) sidenavCtrl.onCloseCb();\n\n return $q(function(resolve){\n // Toggle value to force an async `updateIsOpen()` to run\n scope.isOpen = isOpen;\n\n $mdUtil.nextTick(function() {\n // When the current `updateIsOpen()` animation finishes\n promise.then(function(result) {\n\n if ( !scope.isOpen && triggeringElement && triggeringInteractionType === 'keyboard') {\n // reset focus to originating element (if available) upon close\n triggeringElement.focus();\n triggeringElement = null;\n }\n\n resolve(result);\n });\n });\n\n });\n\n }\n }\n\n /**\n * Auto-close sideNav when the `escape` key is pressed.\n * @param evt\n */\n function onKeyDown(ev) {\n var isEscape = (ev.keyCode === $mdConstant.KEY_CODE.ESCAPE);\n return isEscape ? close(ev) : $q.when(true);\n }\n\n /**\n * With backdrop `clicks` or `escape` key-press, immediately\n * apply the CSS close transition... Then notify the controller\n * to close() and perform its own actions.\n */\n function close(ev) {\n ev.preventDefault();\n\n return sidenavCtrl.close();\n }\n\n }\n}\n\n/*\n * @private\n * @ngdoc controller\n * @name SidenavController\n * @module material.components.sidenav\n */\nfunction SidenavController($scope, $attrs, $mdComponentRegistry, $q, $interpolate) {\n\n var self = this;\n\n // Use Default internal method until overridden by directive postLink\n\n // Synchronous getters\n self.isOpen = function() { return !!$scope.isOpen; };\n self.isLockedOpen = function() { return !!$scope.isLockedOpen; };\n\n // Synchronous setters\n self.onClose = function (callback) {\n self.onCloseCb = callback;\n return self;\n };\n\n // Async actions\n self.open = function() { return self.$toggleOpen( true ); };\n self.close = function() { return self.$toggleOpen( false ); };\n self.toggle = function() { return self.$toggleOpen( !$scope.isOpen ); };\n self.$toggleOpen = function(value) { return $q.when($scope.isOpen = value); };\n\n // Evaluate the component id.\n var rawId = $attrs.mdComponentId;\n var hasDataBinding = rawId && rawId.indexOf($interpolate.startSymbol()) > -1;\n var componentId = hasDataBinding ? $interpolate(rawId)($scope.$parent) : rawId;\n\n // Register the component.\n self.destroy = $mdComponentRegistry.register(self, componentId);\n\n // Watch and update the component, if the id has changed.\n if (hasDataBinding) {\n $attrs.$observe('mdComponentId', function(id) {\n if (id && id !== self.$$mdHandle) {\n self.destroy(); // `destroy` only deregisters the old component id so we can add the new one.\n self.destroy = $mdComponentRegistry.register(self, id);\n }\n });\n }\n}\n\n})();\n(function(){\n\"use strict\";\n\n/**\n * @ngdoc module\n * @name material.components.select\n */\n\n/***************************************************\n\n ### TODO - POST RC1 ###\n - [ ] Abstract placement logic in $mdSelect service to $mdMenu service\n\n ***************************************************/\n\nSelectDirective.$inject = [\"$mdSelect\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdAria\", \"$parse\", \"$sce\", \"$injector\"];\nSelectMenuDirective.$inject = [\"$parse\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\"];\nOptionDirective.$inject = [\"$mdButtonInkRipple\", \"$mdUtil\", \"$mdTheming\"];\nSelectProvider.$inject = [\"$$interimElementProvider\"];\nvar SELECT_EDGE_MARGIN = 8;\nvar selectNextId = 0;\nvar CHECKBOX_SELECTION_INDICATOR =\n angular.element('
    ');\n\nangular.module('material.components.select', [\n 'material.core',\n 'material.components.backdrop'\n ])\n .directive('mdSelect', SelectDirective)\n .directive('mdSelectMenu', SelectMenuDirective)\n .directive('mdOption', OptionDirective)\n .directive('mdOptgroup', OptgroupDirective)\n .directive('mdSelectHeader', SelectHeaderDirective)\n .provider('$mdSelect', SelectProvider);\n\n/**\n * @ngdoc directive\n * @name mdSelect\n * @restrict E\n * @module material.components.select\n *\n * @description Displays a select box, bound to an ng-model.\n *\n * When the select is required and uses a floating label, then the label will automatically contain\n * an asterisk (`*`). This behavior can be disabled by using the `md-no-asterisk` attribute.\n *\n * By default, the select will display with an underline to match other form elements. This can be\n * disabled by applying the `md-no-underline` CSS class.\n *\n * ### Option Params\n *\n * When applied, `md-option-empty` will mark the option as \"empty\" allowing the option to clear the\n * select and put it back in it's default state. You may supply this attribute on any option you\n * wish, however, it is automatically applied to an option whose `value` or `ng-value` are not\n * defined.\n *\n * **Automatically Applied**\n *\n * - ``\n * - ``\n * - ``\n * - ``\n * - ``\n *\n * **NOT Automatically Applied**\n *\n * - ``\n * - ``\n * - ``\n * - `` (this evaluates to the string `\"undefined\"`)\n * - <md-option ng-value=\"{{someValueThatMightBeUndefined}}\">\n *\n * **Note:** A value of `undefined` ***is considered a valid value*** (and does not auto-apply this\n * attribute) since you may wish this to be your \"Not Available\" or \"None\" option.\n *\n * **Note:** Using the `value` attribute (as opposed to `ng-value`) always evaluates to a string, so\n * `value=\"null\"` will require the test `ng-if=\"myValue != 'null'\"` rather than `ng-if=\"!myValue\"`.\n *\n * @param {expression} ng-model The model!\n * @param {boolean=} multiple When set to true, allows for more than one option to be selected. The model is an array with the selected choices.\n * @param {expression=} md-on-close Expression to be evaluated when the select is closed.\n * @param {expression=} md-on-open Expression to be evaluated when opening the select.\n * Will hide the select options and show a spinner until the evaluated promise resolves.\n * @param {expression=} md-selected-text Expression to be evaluated that will return a string\n * to be displayed as a placeholder in the select input box when it is closed. The value\n * will be treated as *text* (not html).\n * @param {expression=} md-selected-html Expression to be evaluated that will return a string\n * to be displayed as a placeholder in the select input box when it is closed. The value\n * will be treated as *html*. The value must either be explicitly marked as trustedHtml or\n * the ngSanitize module must be loaded.\n * @param {string=} placeholder Placeholder hint text.\n * @param md-no-asterisk {boolean=} When set to true, an asterisk will not be appended to the\n * floating label. **Note:** This attribute is only evaluated once; it is not watched.\n * @param {string=} aria-label Optional label for accessibility. Only necessary if no placeholder or\n * explicit label is present.\n * @param {string=} md-container-class Class list to get applied to the `.md-select-menu-container`\n * element (for custom styling).\n *\n * @usage\n * With a placeholder (label and aria-label are added dynamically)\n * \n * \n * \n * {{ opt }}\n * \n * \n * \n *\n * With an explicit label\n * \n * \n * \n * \n * {{ opt }}\n * \n * \n * \n *\n * With a select-header\n *\n * When a developer needs to put more than just a text label in the\n * md-select-menu, they should use the md-select-header.\n * The user can put custom HTML inside of the header and style it to their liking.\n * One common use case of this would be a sticky search bar.\n *\n * When using the md-select-header the labels that would previously be added to the\n * OptGroupDirective are ignored.\n *\n * \n * \n * \n * \n * Neighborhoods - \n * \n * {{ opt }}\n * \n * \n * \n *\n * ## Selects and object equality\n * When using a `md-select` to pick from a list of objects, it is important to realize how javascript handles\n * equality. Consider the following example:\n * \n * angular.controller('MyCtrl', function($scope) {\n * $scope.users = [\n * { id: 1, name: 'Bob' },\n * { id: 2, name: 'Alice' },\n * { id: 3, name: 'Steve' }\n * ];\n * $scope.selectedUser = { id: 1, name: 'Bob' };\n * });\n * \n * \n *
    \n * \n * {{ user.name }}\n * \n *
    \n *
    \n *\n * At first one might expect that the select should be populated with \"Bob\" as the selected user. However,\n * this is not true. To determine whether something is selected,\n * `ngModelController` is looking at whether `$scope.selectedUser == (any user in $scope.users);`;\n *\n * Javascript's `==` operator does not check for deep equality (ie. that all properties\n * on the object are the same), but instead whether the objects are *the same object in memory*.\n * In this case, we have two instances of identical objects, but they exist in memory as unique\n * entities. Because of this, the select will have no value populated for a selected user.\n *\n * To get around this, `ngModelController` provides a `track by` option that allows us to specify a different\n * expression which will be used for the equality operator. As such, we can update our `html` to\n * make use of this by specifying the `ng-model-options=\"{trackBy: '$value.id'}\"` on the `md-select`\n * element. This converts our equality expression to be\n * `$scope.selectedUser.id == (any id in $scope.users.map(function(u) { return u.id; }));`\n * which results in Bob being selected as desired.\n *\n * Working HTML:\n * \n *
    \n * \n * {{ user.name }}\n * \n *
    \n *
    \n */\nfunction SelectDirective($mdSelect, $mdUtil, $mdConstant, $mdTheming, $mdAria, $parse, $sce,\n $injector) {\n var keyCodes = $mdConstant.KEY_CODE;\n var NAVIGATION_KEYS = [keyCodes.SPACE, keyCodes.ENTER, keyCodes.UP_ARROW, keyCodes.DOWN_ARROW];\n\n return {\n restrict: 'E',\n require: ['^?mdInputContainer', 'mdSelect', 'ngModel', '?^form'],\n compile: compile,\n controller: function() {\n } // empty placeholder controller to be initialized in link\n };\n\n function compile(element, attr) {\n // add the select value that will hold our placeholder or selected option value\n var valueEl = angular.element('');\n valueEl.append('');\n valueEl.addClass('md-select-value');\n if (!valueEl[0].hasAttribute('id')) {\n valueEl.attr('id', 'select_value_label_' + $mdUtil.nextUid());\n }\n\n // There's got to be an md-content inside. If there's not one, let's add it.\n if (!element.find('md-content').length) {\n element.append(angular.element('').append(element.contents()));\n }\n\n\n // Add progress spinner for md-options-loading\n if (attr.mdOnOpen) {\n\n // Show progress indicator while loading async\n // Use ng-hide for `display:none` so the indicator does not interfere with the options list\n element\n .find('md-content')\n .prepend(angular.element(\n '
    ' +\n ' ' +\n '
    '\n ));\n\n // Hide list [of item options] while loading async\n element\n .find('md-option')\n .attr('ng-show', '$$loadingAsyncDone');\n }\n\n if (attr.name) {\n var autofillClone = angular.element(',