{"version":3,"file":"1735.9c6c002d11de5cfb.js","mappings":"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","names":["dueTime","intervalOrScheduler","scheduler","asyncScheduler","intervalDuration","isScheduler","Observable","subscriber","due","isValidDate","now","n","schedule","closed","next","this","undefined","complete","duration","durationSelector","operate","source","hasValue","lastValue","durationSubscriber","isComplete","endDuration","unsubscribe","value","cleanupDuration","subscribe","createOperatorSubscriber","innerFrom","audit","timer","resolved","nextHandle","activeHandles","handle","Immediate","setImmediate","cb","Promise","resolve","then","findAndClearHandle","clearImmediate","immediateProvider","args","delegate","asapScheduler","AsyncScheduler","flush","action","_active","flushId","_scheduled","actions","error","shift","execute","state","delay","id","AsyncAction","constructor","work","super","requestAsyncId","push","bind","recycleAsyncId","_a","length","el","attr","getAttribute","match","CDK_DESCRIBEDBY_ID_PREFIX","CDK_DESCRIBEDBY_HOST_ATTRIBUTE","nextId","AriaDescriber","_document","_platform","_messageRegistry","Map","_messagesContainer","_id","describe","hostElement","message","role","_canBeDescribed","key","getKey","setMessageId","set","messageElement","referenceCount","has","_createMessageElement","_isElementDescribedByMessage","_addMessageReference","removeDescription","_isElementNode","_removeMessageReference","registeredMessage","get","_deleteMessageElement","childNodes","remove","ngOnDestroy","describedElements","querySelectorAll","i","_removeCdkDescribedByReferenceIds","removeAttribute","clear","createElement","textContent","setAttribute","_createMessagesContainer","appendChild","_b","delete","containerClassName","serverContainers","messagesContainer","style","visibility","classList","add","isBrowser","body","element","originalReferenceIds","getAriaReferenceIds","filter","indexOf","join","ids","some","existingId","trim","ID_DELIMITER","addAriaReferencedId","filteredIds","val","removeAriaReferencedId","referenceIds","messageId","trimmedMessage","ariaLabel","nodeType","ELEMENT_NODE","ɵfac","i0","DOCUMENT","i1","ɵprov","factory","_items","_activeItemIndex","_activeItem","_wrap","_letterKeyStream","Subject","_typeaheadSubscription","Subscription","_vertical","_allowedModifierKeys","_homeAndEnd","_skipPredicateFn","item","disabled","_pressedLetters","tabOut","change","QueryList","changes","newItems","newIndex","itemArray","toArray","skipPredicate","predicate","withWrap","shouldWrap","withVerticalOrientation","enabled","withHorizontalOrientation","direction","_horizontal","withAllowedModifierKeys","keys","withTypeAhead","debounceInterval","pipe","tap","letter","debounceTime","map","inputString","items","_getItemsArray","index","getLabel","toUpperCase","setActiveItem","withHomeAndEnd","previousActiveItem","updateActiveItem","onKeydown","event","keyCode","isModifierAllowed","modifiers","every","modifier","TAB","DOWN_ARROW","setNextItemActive","UP_ARROW","setPreviousItemActive","RIGHT_ARROW","LEFT_ARROW","HOME","setFirstItemActive","END","setLastItemActive","hasModifierKey","toLocaleUpperCase","A","Z","ZERO","NINE","String","fromCharCode","preventDefault","activeItemIndex","activeItem","isTyping","_setActiveItemByIndex","_setActiveItemByDelta","delta","_setActiveInWrapMode","_setActiveInDefaultMode","fallbackDelta","ListKeyManager","setInactiveStyles","setActiveStyles","arguments","_origin","setFocusOrigin","origin","focus","InteractivityChecker","isDisabled","hasAttribute","isVisible","offsetWidth","offsetHeight","getClientRects","hasGeometry","getComputedStyle","isTabbable","frameElement","window","getFrameElement","node","ownerDocument","defaultView","getWindow","getTabIndexValue","nodeName","toLowerCase","tabIndexValue","WEBKIT","IOS","inputType","type","isPotentiallyTabbableIOS","FIREFOX","tabIndex","isFocusable","config","isInputElement","isHiddenInput","isNativeFormElement","isAnchorElement","isAnchorWithHref","hasValidTabIndex","isPotentiallyFocusable","ignoreVisibility","isNaN","parseInt","_element","_checker","_ngZone","deferAnchors","_hasAttached","startAnchorListener","focusLastTabbableElement","endAnchorListener","focusFirstTabbableElement","_enabled","attachAnchors","_startAnchor","_endAnchor","_toggleAnchorTabIndex","destroy","startAnchor","endAnchor","removeEventListener","runOutsideAngular","_createAnchor","addEventListener","parentNode","insertBefore","nextSibling","focusInitialElementWhenReady","options","_executeOnStable","focusInitialElement","focusFirstTabbableElementWhenReady","focusLastTabbableElementWhenReady","_getRegionBoundary","bound","markers","_getFirstTabbableElement","_getLastTabbableElement","redirectToElement","querySelector","focusableChild","hasAttached","root","children","tabbableChild","anchor","isEnabled","toggleAnchors","fn","isStable","onStable","take","FocusTrapFactory","create","deferCaptureElements","FocusTrap","buttons","offsetX","offsetY","touch","touches","changedTouches","identifier","radiusX","radiusY","INPUT_MODALITY_DETECTOR_OPTIONS","InjectionToken","INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS","ignoreKeys","ALT","CONTROL","MAC_META","META","SHIFT","modalityEventListenerOptions","normalizePassiveListenerOptions","passive","capture","InputModalityDetector","ngZone","document","_mostRecentTarget","_modality","BehaviorSubject","_lastTouchMs","_onKeydown","_options","_getEventTarget","_onMousedown","Date","isFakeMousedownFromScreenReader","_onTouchstart","isFakeTouchstartFromScreenReader","Object","assign","modalityDetected","skip","modalityChanged","distinctUntilChanged","mostRecentModality","LIVE_ANNOUNCER_ELEMENT_TOKEN","providedIn","LIVE_ANNOUNCER_DEFAULT_OPTIONS","LiveAnnouncer","elementToken","_defaultOptions","_liveElement","_createLiveElement","announce","defaultOptions","politeness","clearTimeout","_previousTimeout","_currentPromise","_currentResolve","setTimeout","call","elementClass","previousElements","getElementsByClassName","liveEl","FOCUS_MONITOR_DEFAULT_OPTIONS","captureEventListenerOptions","FocusMonitor","_inputModalityDetector","_windowFocused","_originFromTouchInteraction","_elementInfo","_monitoredElementCount","_rootNodeFocusListenerCount","_windowFocusListener","_windowFocusTimeoutId","_stopInputModalityDetector","_rootNodeFocusAndBlurListener","target","handler","_onFocus","_onBlur","parentElement","_detectionMode","detectionMode","monitor","checkChildren","nativeElement","coerceElement","of","rootNode","_getShadowRoot","_getDocument","cachedInfo","subject","info","_registerGlobalListeners","stopMonitoring","elementInfo","_setClasses","_removeGlobalListeners","focusVia","activeElement","_getClosestElementsInfo","forEach","currentElement","_originChanged","_setOrigin","_info","_getWindow","doc","_getFocusOrigin","focusEventTarget","_shouldBeAttributedToTouch","_lastFocusOrigin","contains","toggle","isFromInteraction","_originTimeoutId","ms","relatedTarget","Node","_emitOrigin","run","rootNodeFocusListeners","takeUntil","modality","results","CdkMonitorFocus","_elementRef","_focusMonitor","cdkFocusChange","EventEmitter","ngAfterViewInit","_monitorSubscription","emit","ɵdir","selectors","BLACK_ON_WHITE_CSS_CLASS","WHITE_ON_BLACK_CSS_CLASS","HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS","HighContrastModeDetector","getHighContrastMode","testElement","backgroundColor","position","documentWindow","computedStyle","computedColor","replace","_applyBodyHighContrastModeCssClasses","_hasCheckedHighContrastMode","bodyClasses","mode","A11yModule","highContrastModeDetector","ɵmod","ɵinj","ObserversModule","DIR_DOCUMENT","inject","RTL_LOCALE_PATTERN","Directionality","htmlDir","documentElement","dir","rawValue","navigator","language","test","_resolveDirectionality","BidiModule","fallbackValue","parseFloat","Number","_isNumberValue","Array","isArray","elementOrRef","ElementRef","result","ENTER","ESCAPE","SPACE","PAGE_UP","PAGE_DOWN","altKey","shiftKey","ctrlKey","metaKey","MutationObserverFactory","callback","MutationObserver","ContentObserver","_mutationObserverFactory","_observedElements","_","_cleanupObserver","observe","observer","subscription","stream","_observeElement","_unobserveElement","count","mutations","characterData","childList","subtree","disconnect","CdkObserveContent","_contentObserver","_disabled","_currentSubscription","coerceBooleanProperty","_unsubscribe","_subscribe","debounce","_debounce","coerceNumberProperty","ngAfterContentInit","scrollBehaviorSupported","supportsScrollBehavior","_viewportRuler","_previousHTMLStyles","top","left","_isEnabled","attach","enable","_canBeEnabled","_previousScrollPosition","getViewportScrollPosition","coerceCssPixelValue","disable","html","htmlStyle","bodyStyle","previousHtmlScrollBehavior","scrollBehavior","previousBodyScrollBehavior","scroll","viewport","getViewportSize","scrollHeight","height","scrollWidth","width","_scrollDispatcher","_config","_scrollSubscription","_detach","_overlayRef","detach","overlayRef","scrolled","threshold","_initialScrollPosition","scrollPosition","Math","abs","updatePosition","scrollContainers","containerBounds","bottom","right","outsideRight","scrollContainerRect","clippedRight","scrollThrottle","autoClose","overlayRect","overlayElement","getBoundingClientRect","isElementScrolledOutsideView","ScrollStrategyOptions","noop","NoopScrollStrategy","close","CloseScrollStrategy","block","BlockScrollStrategy","reposition","RepositionScrollStrategy","scrollStrategy","panelClass","hasBackdrop","backdropClass","disposeOnNavigation","configKeys","connectionPair","scrollableViewProperties","_portalOutlet","_host","_pane","_keyboardDispatcher","_location","_outsideClickDispatcher","_backdropElement","_backdropClick","_attachments","_detachments","_locationChanges","_backdropClickHandler","_backdropTransitionendHandler","_disposeBackdrop","_keydownEvents","_outsidePointerEvents","_scrollStrategy","_positionStrategy","positionStrategy","backdropElement","portal","_previousHostParent","attachResult","_updateStackingOrder","_updateElementSize","_updateElementDirection","_togglePointerEvents","_attachBackdrop","_toggleClasses","dispose","detachBackdrop","detachmentResult","_detachContentWhenStable","isAttached","_disposeScrollStrategy","backdropClick","attachments","detachments","keydownEvents","outsidePointerEvents","getConfig","apply","updatePositionStrategy","strategy","updateSize","sizeConfig","setDirection","addPanelClass","classes","removePanelClass","getDirection","updateScrollStrategy","minWidth","minHeight","maxWidth","maxHeight","enablePointer","pointerEvents","showingClass","requestAnimationFrame","backdropToDetach","_backdropTimeout","cssClasses","isAdd","coerceArray","c","merge","backdrop","OverlayContainer","_containerElement","getContainerElement","_createContainer","containerClass","_isTestEnvironment","oppositePlatformContainers","container","i1$1","boundingBoxClass","cssUnitPattern","connectedTo","_overlayContainer","_lastBoundingBoxSize","_isPushed","_canPush","_growAfterOpen","_hasFlexibleDimensions","_positionLocked","_viewportMargin","_scrollables","_preferredPositions","_positionChanges","_resizeSubscription","_offsetX","_offsetY","_appliedPanelClasses","positionChanges","setOrigin","positions","_validatePositions","_boundingBox","_isDisposed","_isInitialRender","_lastPosition","reapplyLastPosition","_clearPanelClasses","_resetOverlayElementStyles","_resetBoundingBoxStyles","_viewportRect","_getNarrowedViewportRect","_originRect","_getOriginRect","_overlayRect","_containerRect","originRect","viewportRect","containerRect","flexibleFits","fallback","pos","originPoint","_getOriginPoint","overlayPoint","_getOverlayPoint","overlayFit","_getOverlayFit","isCompletelyWithinViewport","_applyPosition","_canFitWithFlexibleDimensions","boundingBoxRect","_calculateBoundingBoxRect","visibleArea","bestFit","bestScore","fit","score","weight","_previousPushAmount","extendStyles","alignItems","justifyContent","lastPosition","withScrollableContainers","scrollables","withPositions","withViewportMargin","margin","withFlexibleDimensions","flexibleDimensions","withGrowAfterOpen","growAfterOpen","withPush","canPush","withLockedPosition","isLocked","withDefaultOffsetX","offset","withDefaultOffsetY","withTransformOriginOn","selector","_transformOriginSelector","x","y","originX","startX","_isRtl","endX","originY","overlayStartX","overlayStartY","overlayX","r","overlayY","point","rawOverlayRect","overlay","getRoundedBoundingClientRect","_getOffset","topOverflow","bottomOverflow","visibleWidth","_subtractOverflows","visibleHeight","fitsInViewportVertically","fitsInViewportHorizontally","availableHeight","availableWidth","getPixelValue","horizontalFit","_pushOverlayOnScreen","start","overflowRight","max","overflowBottom","overflowTop","overflowLeft","pushX","pushY","h","_setTransformOrigin","_setOverlayElementStyles","_setBoundingBoxStyles","_addPanelClasses","observers","_getScrollVisibility","changeEvent","ConnectedOverlayPositionChange","elements","xOrigin","yOrigin","transformOrigin","isRtl","smallestDistanceToViewportEdge","min","previousHeight","previousWidth","styles","_hasExactPosition","o","transform","hasExactPosition","hasFlexibleDimensions","_getExactOverlayY","_getExactOverlayX","transformString","clientHeight","horizontalStyleProperty","clientWidth","originBounds","overlayBounds","scrollContainerBounds","scrollable","getElementRef","isOriginClipped","isElementClippedByScrolling","isOriginOutsideView","isOverlayClipped","isOverlayOutsideView","overflows","reduce","currentValue","currentOverflow","axis","cssClass","Element","destination","hasOwnProperty","input","units","split","clientRect","floor","wrapperClass","_cssPosition","_topOffset","_bottomOffset","_leftOffset","_rightOffset","_alignItems","_justifyContent","_width","_height","centerHorizontally","centerVertically","parentStyles","shouldBeFlushHorizontally","shouldBeFlushVertically","marginLeft","marginTop","marginBottom","marginRight","K","parent","OverlayPositionBuilder","global","GlobalPositionStrategy","flexibleConnectedTo","FlexibleConnectedPositionStrategy","BaseOverlayDispatcher","_attachedOverlays","splice","OverlayKeyboardDispatcher","_keydownListener","overlays","_isAttached","OverlayOutsideClickDispatcher","_cursorStyleIsSet","_pointerDownListener","_pointerDownEventTarget","_clickListener","slice","_addEventListeners","_cursorOriginalValue","cursor","nextUniqueId","Overlay","scrollStrategies","_componentFactoryResolver","_positionBuilder","_injector","_directionality","host","_createHostElement","pane","_createPaneElement","portalOutlet","_createPortalOutlet","overlayConfig","OverlayConfig","OverlayRef","_appRef","ApplicationRef","DomPortalOutlet","i5","i6","defaultPositionList","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY","CdkOverlayOrigin","elementRef","CdkConnectedOverlay","_overlay","templateRef","viewContainerRef","scrollStrategyFactory","_dir","_hasBackdrop","_lockPosition","_flexibleDimensions","_push","_backdropSubscription","_attachSubscription","_detachSubscription","_positionSubscription","viewportMargin","open","disableClose","positionChange","overlayKeydown","overlayOutsideClick","_templatePortal","TemplatePortal","_scrollStrategyFactory","_position","_updatePositionStrategy","lockPosition","ngOnChanges","_attachOverlay","_detachOverlay","_createOverlay","_buildConfig","_createPositionStrategy","currentPosition","_getFlexibleConnectedPositionStrategyOrigin","transformOriginSelector","inclusive","takeWhile","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER","provide","deps","useFactory","OverlayModule","imports","PortalModule","ScrollingModule","FullscreenOverlayContainer","hasV8BreakIterator","Intl","v8BreakIterator","supportsPassiveEvents","rtlScrollAxisType","shadowDomIsSupported","Platform","_platformId","isPlatformBrowser","EDGE","userAgent","TRIDENT","BLINK","chrome","CSS","ANDROID","SAFARI","PLATFORM_ID","defineProperty","supportsPassiveEventListeners","scrollToFunction","prototype","scrollTo","toString","scrollContainer","containerStyle","overflow","content","contentStyle","scrollLeft","head","createShadowRoot","attachShadow","_supportsShadowDom","getRootNode","ShadowRoot","shadowRoot","newActiveElement","composedPath","__karma__","jasmine","jest","Mocha","_attachedHost","setAttachedHost","Portal","component","injector","componentFactoryResolver","template","context","attachDomPortal","_attachedPortal","ComponentPortal","attachComponentPortal","attachTemplatePortal","DomPortal","_invokeDisposeFn","setDisposeFn","_disposeFn","BasePortalOutlet","outletElement","_defaultInjector","anchorNode","createComment","replaceChild","componentFactory","resolveComponentFactory","componentRef","createComponent","Injector","attachView","hostView","viewCount","detachView","_getComponentRootNode","viewContainer","viewRef","createEmbeddedView","rootNodes","detectChanges","CdkPortal","CdkPortalOutlet","_viewContainerRef","_isInitialized","attached","_getRootNode","attachedRef","_attachedRef","ngOnInit","ref","notFoundValue","ScrollDispatcher","_scrolled","_globalSubscription","_scrolledCount","register","elementScrolled","deregister","scrollableReference","auditTimeInMs","_addGlobalListener","auditTime","_removeGlobalListener","ancestorScrolled","elementOrElementRef","ancestors","getAncestorScrollContainers","scrollingContainers","_subscription","_scrollableContainsElement","scrollableElement","fromEvent","CdkScrollable","scrollDispatcher","_destroyed","_elementScrolled","end","k","getRtlScrollAxisType","_applyScrollToOptions","scrollTop","measureScrollOffset","from","LEFT","RIGHT","i2","ViewportRuler","_change","_changeListener","_viewportSize","_updateViewportSize","output","getViewportRect","documentRect","scrollY","scrollX","throttleTime","innerWidth","innerHeight","CdkScrollableModule","BUTTON_HOST_ATTRIBUTES","_MatButtonBase","mixinColor","mixinDisabled","mixinDisableRipple","MatButton","_animationMode","isRoundButton","_hasHostAttributes","isIconButton","_getHostElement","color","DEFAULT_ROUND_BUTTON_COLOR","_isRippleDisabled","disableRipple","attributes","attribute","ANIMATION_MODULE_TYPE","ɵcmp","MatRipple","g","attrs","directives","MatAnchor","focusMonitor","animationMode","_haltDisabledEvents","stopImmediatePropagation","MatButtonModule","MatRippleModule","MatCommonModule","MATERIAL_SANITY_CHECKS","_sanityChecks","_hasDoneGlobalChecks","_checkIsEnabled","name","base","defaultColor","_color","colorPalette","_disableRipple","defaultTabIndex","_tabIndex","stateChanges","errorState","updateErrorState","oldState","newState","errorStateMatcher","_defaultErrorStateMatcher","isErrorState","ngControl","control","_parentFormGroup","_parentForm","MAT_DATE_LOCALE","LOCALE_ID","_localeChanges","localeChanges","getValidDateOrNull","obj","isDateInstance","isValid","deserialize","invalid","setLocale","locale","compareDate","first","second","getYear","getMonth","getDate","sameDate","firstValid","secondValid","clampDate","date","MAT_DATE_FORMATS","ISO_8601_REGEX","valueFunction","valuesArray","NativeDateAdapter","DateAdapter","matDateLocale","useUtcForDisplay","getFullYear","getDayOfWeek","getDay","getMonthNames","dtf","DateTimeFormat","month","timeZone","range","_format","getDateNames","day","getDayOfWeekNames","weekday","getYearName","year","getFirstDayOfWeek","getNumDaysInMonth","_createDateWithOverflow","clone","getTime","createDate","today","parse","format","displayFormat","Error","addCalendarYears","years","addCalendarMonths","months","newDate","addCalendarDays","days","toIso8601","getUTCFullYear","_2digit","getUTCMonth","getUTCDate","NaN","d","setFullYear","setHours","setUTCFullYear","setUTCHours","getHours","getMinutes","getSeconds","getMilliseconds","MAT_NATIVE_DATE_FORMATS","dateInput","display","monthYearLabel","dateA11yLabel","monthYearA11yLabel","NativeDateModule","useClass","MatNativeDateModule","useValue","ErrorStateMatcher","form","touched","submitted","MatLine","lines","prefix","startWith","setClass","e","className","MatLineModule","_renderer","fadeOut","fadeOutRipple","defaultRippleAnimationConfig","enterDuration","exitDuration","passiveEventOptions","pointerDownEvents","pointerUpEvents","_target","platform","_isPointerDown","_activeRipples","Set","_pointerUpEventsRegistered","fadeInRipple","animationConfig","animation","centered","radius","rect","distX","distY","sqrt","distanceToFurthestCorner","ripple","transitionDuration","getPropertyValue","enforceStyleRecalculation","rippleRef","RippleRef","persistent","_mostRecentTransientRipple","_runTimeoutOutsideZone","isMostRecentTransientRipple","wasActive","size","rippleEl","opacity","fadeOutAll","fadeOutAllNonPersistent","setupTriggerEvents","_triggerElement","_removeTriggerEvents","_registerEvents","handleEvent","_onTouchStart","_onPointerUp","isFakeMousedown","isSyntheticEvent","_lastTouchStartEvent","rippleDisabled","clientX","clientY","rippleConfig","terminateOnPointerUp","eventTypes","MAT_RIPPLE_GLOBAL_OPTIONS","globalOptions","_globalOptions","_rippleRenderer","RippleRenderer","_setupTriggerEventsIfEnabled","trigger","_trigger","launch","configOrX","MatPseudoCheckbox","MatPseudoCheckboxModule","MAT_OPTION_PARENT_COMPONENT","MAT_OPTGROUP","_uniqueIdCounter","isUserInput","_MatOptionBase","_changeDetectorRef","_parent","group","_selected","_mostRecentViewValue","onSelectionChange","_stateChanges","multiple","selected","active","viewValue","select","markForCheck","_emitSelectionChangeEvent","deselect","_handleKeydown","_selectViaInteraction","_getAriaSelected","_getTabIndex","ngAfterViewChecked","MatOptionSelectionChange","inputs","MatOption","changeDetectorRef","ngContentSelectors","i3","optionIndex","optionGroups","optionsArray","groups","groupCounter","optionOffset","optionHeight","currentScrollPosition","panelHeight","MatOptionModule","CommonModule"],"sourceRoot":"webpack:///","sources":["./node_modules/rxjs/dist/esm/internal/observable/timer.js","./node_modules/rxjs/dist/esm/internal/operators/auditTime.js","./node_modules/rxjs/dist/esm/internal/operators/audit.js","./node_modules/rxjs/dist/esm/internal/util/Immediate.js","./node_modules/rxjs/dist/esm/internal/scheduler/immediateProvider.js","./node_modules/rxjs/dist/esm/internal/scheduler/asap.js","./node_modules/rxjs/dist/esm/internal/scheduler/AsapScheduler.js","./node_modules/rxjs/dist/esm/internal/scheduler/AsapAction.js","./node_modules/@angular/cdk/fesm2015/a11y.mjs","./node_modules/@angular/cdk/fesm2015/bidi.mjs","./node_modules/@angular/cdk/fesm2015/coercion.mjs","./node_modules/@angular/cdk/fesm2015/keycodes.mjs","./node_modules/@angular/cdk/fesm2015/observers.mjs","./node_modules/@angular/cdk/fesm2015/overlay.mjs","./node_modules/rxjs/dist/esm/internal/operators/takeWhile.js","./node_modules/@angular/cdk/fesm2015/platform.mjs","./node_modules/@angular/cdk/fesm2015/portal.mjs","./node_modules/@angular/cdk/fesm2015/scrolling.mjs","./node_modules/@angular/material/fesm2015/button.mjs","./node_modules/@angular/material/fesm2015/core.mjs"],"sourcesContent":["import { Observable } from '../Observable';\nimport { async as asyncScheduler } from '../scheduler/async';\nimport { isScheduler } from '../util/isScheduler';\nimport { isValidDate } from '../util/isDate';\nexport function timer(dueTime = 0, intervalOrScheduler, scheduler = asyncScheduler) {\n let intervalDuration = -1;\n if (intervalOrScheduler != null) {\n if (isScheduler(intervalOrScheduler)) {\n scheduler = intervalOrScheduler;\n }\n else {\n intervalDuration = intervalOrScheduler;\n }\n }\n return new Observable((subscriber) => {\n let due = isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;\n if (due < 0) {\n due = 0;\n }\n let n = 0;\n return scheduler.schedule(function () {\n if (!subscriber.closed) {\n subscriber.next(n++);\n if (0 <= intervalDuration) {\n this.schedule(undefined, intervalDuration);\n }\n else {\n subscriber.complete();\n }\n }\n }, due);\n });\n}\n","import { asyncScheduler } from '../scheduler/async';\nimport { audit } from './audit';\nimport { timer } from '../observable/timer';\nexport function auditTime(duration, scheduler = asyncScheduler) {\n return audit(() => timer(duration, scheduler));\n}\n","import { operate } from '../util/lift';\nimport { innerFrom } from '../observable/innerFrom';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function audit(durationSelector) {\n return operate((source, subscriber) => {\n let hasValue = false;\n let lastValue = null;\n let durationSubscriber = null;\n let isComplete = false;\n const endDuration = () => {\n durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();\n durationSubscriber = null;\n if (hasValue) {\n hasValue = false;\n const value = lastValue;\n lastValue = null;\n subscriber.next(value);\n }\n isComplete && subscriber.complete();\n };\n const cleanupDuration = () => {\n durationSubscriber = null;\n isComplete && subscriber.complete();\n };\n source.subscribe(createOperatorSubscriber(subscriber, (value) => {\n hasValue = true;\n lastValue = value;\n if (!durationSubscriber) {\n innerFrom(durationSelector(value)).subscribe((durationSubscriber = createOperatorSubscriber(subscriber, endDuration, cleanupDuration)));\n }\n }, () => {\n isComplete = true;\n (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();\n }));\n });\n}\n","let nextHandle = 1;\nlet resolved;\nconst activeHandles = {};\nfunction findAndClearHandle(handle) {\n if (handle in activeHandles) {\n delete activeHandles[handle];\n return true;\n }\n return false;\n}\nexport const Immediate = {\n setImmediate(cb) {\n const handle = nextHandle++;\n activeHandles[handle] = true;\n if (!resolved) {\n resolved = Promise.resolve();\n }\n resolved.then(() => findAndClearHandle(handle) && cb());\n return handle;\n },\n clearImmediate(handle) {\n findAndClearHandle(handle);\n },\n};\nexport const TestTools = {\n pending() {\n return Object.keys(activeHandles).length;\n }\n};\n","import { Immediate } from '../util/Immediate';\nconst { setImmediate, clearImmediate } = Immediate;\nexport const immediateProvider = {\n setImmediate(...args) {\n const { delegate } = immediateProvider;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.setImmediate) || setImmediate)(...args);\n },\n clearImmediate(handle) {\n const { delegate } = immediateProvider;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearImmediate) || clearImmediate)(handle);\n },\n delegate: undefined,\n};\n","import { AsapAction } from './AsapAction';\nimport { AsapScheduler } from './AsapScheduler';\nexport const asapScheduler = new AsapScheduler(AsapAction);\nexport const asap = asapScheduler;\n","import { AsyncScheduler } from './AsyncScheduler';\nexport class AsapScheduler extends AsyncScheduler {\n flush(action) {\n this._active = true;\n const flushId = this._scheduled;\n this._scheduled = undefined;\n const { actions } = this;\n let error;\n action = action || actions.shift();\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n this._active = false;\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n","import { AsyncAction } from './AsyncAction';\nimport { immediateProvider } from './immediateProvider';\nexport class AsapAction extends AsyncAction {\n constructor(scheduler, work) {\n super(scheduler, work);\n this.scheduler = scheduler;\n this.work = work;\n }\n requestAsyncId(scheduler, id, delay = 0) {\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n scheduler.actions.push(this);\n return scheduler._scheduled || (scheduler._scheduled = immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));\n }\n recycleAsyncId(scheduler, id, delay = 0) {\n var _a;\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n const { actions } = scheduler;\n if (id != null && ((_a = actions[actions.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== id) {\n immediateProvider.clearImmediate(id);\n scheduler._scheduled = undefined;\n }\n return undefined;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Injectable, Inject, QueryList, Directive, Input, InjectionToken, Optional, EventEmitter, Output, NgModule } from '@angular/core';\nimport * as i1 from '@angular/cdk/platform';\nimport { _getFocusedElementPierceShadowDom, normalizePassiveListenerOptions, _getEventTarget, _getShadowRoot } from '@angular/cdk/platform';\nimport { Subject, Subscription, BehaviorSubject, of } from 'rxjs';\nimport { hasModifierKey, A, Z, ZERO, NINE, END, HOME, LEFT_ARROW, RIGHT_ARROW, UP_ARROW, DOWN_ARROW, TAB, ALT, CONTROL, MAC_META, META, SHIFT } from '@angular/cdk/keycodes';\nimport { tap, debounceTime, filter, map, take, skip, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { coerceBooleanProperty, coerceElement } from '@angular/cdk/coercion';\nimport * as i1$1 from '@angular/cdk/observers';\nimport { ObserversModule } from '@angular/cdk/observers';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** IDs are delimited by an empty space, as per the spec. */\nconst ID_DELIMITER = ' ';\n/**\n * Adds the given ID to the specified ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nfunction addAriaReferencedId(el, attr, id) {\n const ids = getAriaReferenceIds(el, attr);\n if (ids.some(existingId => existingId.trim() == id.trim())) {\n return;\n }\n ids.push(id.trim());\n el.setAttribute(attr, ids.join(ID_DELIMITER));\n}\n/**\n * Removes the given ID from the specified ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nfunction removeAriaReferencedId(el, attr, id) {\n const ids = getAriaReferenceIds(el, attr);\n const filteredIds = ids.filter(val => val != id.trim());\n if (filteredIds.length) {\n el.setAttribute(attr, filteredIds.join(ID_DELIMITER));\n }\n else {\n el.removeAttribute(attr);\n }\n}\n/**\n * Gets the list of IDs referenced by the given ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nfunction getAriaReferenceIds(el, attr) {\n // Get string array of all individual ids (whitespace delimited) in the attribute value\n return (el.getAttribute(attr) || '').match(/\\S+/g) || [];\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * ID used for the body container where all messages are appended.\n * @deprecated No longer being used. To be removed.\n * @breaking-change 14.0.0\n */\nconst MESSAGES_CONTAINER_ID = 'cdk-describedby-message-container';\n/**\n * ID prefix used for each created message element.\n * @deprecated To be turned into a private variable.\n * @breaking-change 14.0.0\n */\nconst CDK_DESCRIBEDBY_ID_PREFIX = 'cdk-describedby-message';\n/**\n * Attribute given to each host element that is described by a message element.\n * @deprecated To be turned into a private variable.\n * @breaking-change 14.0.0\n */\nconst CDK_DESCRIBEDBY_HOST_ATTRIBUTE = 'cdk-describedby-host';\n/** Global incremental identifier for each registered message element. */\nlet nextId = 0;\n/**\n * Utility that creates visually hidden elements with a message content. Useful for elements that\n * want to use aria-describedby to further describe themselves without adding additional visual\n * content.\n */\nclass AriaDescriber {\n constructor(_document, \n /**\n * @deprecated To be turned into a required parameter.\n * @breaking-change 14.0.0\n */\n _platform) {\n this._platform = _platform;\n /** Map of all registered message elements that have been placed into the document. */\n this._messageRegistry = new Map();\n /** Container for all registered messages. */\n this._messagesContainer = null;\n /** Unique ID for the service. */\n this._id = `${nextId++}`;\n this._document = _document;\n }\n describe(hostElement, message, role) {\n if (!this._canBeDescribed(hostElement, message)) {\n return;\n }\n const key = getKey(message, role);\n if (typeof message !== 'string') {\n // We need to ensure that the element has an ID.\n setMessageId(message);\n this._messageRegistry.set(key, { messageElement: message, referenceCount: 0 });\n }\n else if (!this._messageRegistry.has(key)) {\n this._createMessageElement(message, role);\n }\n if (!this._isElementDescribedByMessage(hostElement, key)) {\n this._addMessageReference(hostElement, key);\n }\n }\n removeDescription(hostElement, message, role) {\n var _a;\n if (!message || !this._isElementNode(hostElement)) {\n return;\n }\n const key = getKey(message, role);\n if (this._isElementDescribedByMessage(hostElement, key)) {\n this._removeMessageReference(hostElement, key);\n }\n // If the message is a string, it means that it's one that we created for the\n // consumer so we can remove it safely, otherwise we should leave it in place.\n if (typeof message === 'string') {\n const registeredMessage = this._messageRegistry.get(key);\n if (registeredMessage && registeredMessage.referenceCount === 0) {\n this._deleteMessageElement(key);\n }\n }\n if (((_a = this._messagesContainer) === null || _a === void 0 ? void 0 : _a.childNodes.length) === 0) {\n this._messagesContainer.remove();\n this._messagesContainer = null;\n }\n }\n /** Unregisters all created message elements and removes the message container. */\n ngOnDestroy() {\n var _a;\n const describedElements = this._document.querySelectorAll(`[${CDK_DESCRIBEDBY_HOST_ATTRIBUTE}=\"${this._id}\"]`);\n for (let i = 0; i < describedElements.length; i++) {\n this._removeCdkDescribedByReferenceIds(describedElements[i]);\n describedElements[i].removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);\n }\n (_a = this._messagesContainer) === null || _a === void 0 ? void 0 : _a.remove();\n this._messagesContainer = null;\n this._messageRegistry.clear();\n }\n /**\n * Creates a new element in the visually hidden message container element with the message\n * as its content and adds it to the message registry.\n */\n _createMessageElement(message, role) {\n const messageElement = this._document.createElement('div');\n setMessageId(messageElement);\n messageElement.textContent = message;\n if (role) {\n messageElement.setAttribute('role', role);\n }\n this._createMessagesContainer();\n this._messagesContainer.appendChild(messageElement);\n this._messageRegistry.set(getKey(message, role), { messageElement, referenceCount: 0 });\n }\n /** Deletes the message element from the global messages container. */\n _deleteMessageElement(key) {\n var _a, _b;\n (_b = (_a = this._messageRegistry.get(key)) === null || _a === void 0 ? void 0 : _a.messageElement) === null || _b === void 0 ? void 0 : _b.remove();\n this._messageRegistry.delete(key);\n }\n /** Creates the global container for all aria-describedby messages. */\n _createMessagesContainer() {\n if (this._messagesContainer) {\n return;\n }\n const containerClassName = 'cdk-describedby-message-container';\n const serverContainers = this._document.querySelectorAll(`.${containerClassName}[platform=\"server\"]`);\n for (let i = 0; i < serverContainers.length; i++) {\n // When going from the server to the client, we may end up in a situation where there's\n // already a container on the page, but we don't have a reference to it. Clear the\n // old container so we don't get duplicates. Doing this, instead of emptying the previous\n // container, should be slightly faster.\n serverContainers[i].remove();\n }\n const messagesContainer = this._document.createElement('div');\n // We add `visibility: hidden` in order to prevent text in this container from\n // being searchable by the browser's Ctrl + F functionality.\n // Screen-readers will still read the description for elements with aria-describedby even\n // when the description element is not visible.\n messagesContainer.style.visibility = 'hidden';\n // Even though we use `visibility: hidden`, we still apply `cdk-visually-hidden` so that\n // the description element doesn't impact page layout.\n messagesContainer.classList.add(containerClassName);\n messagesContainer.classList.add('cdk-visually-hidden');\n // @breaking-change 14.0.0 Remove null check for `_platform`.\n if (this._platform && !this._platform.isBrowser) {\n messagesContainer.setAttribute('platform', 'server');\n }\n this._document.body.appendChild(messagesContainer);\n this._messagesContainer = messagesContainer;\n }\n /** Removes all cdk-describedby messages that are hosted through the element. */\n _removeCdkDescribedByReferenceIds(element) {\n // Remove all aria-describedby reference IDs that are prefixed by CDK_DESCRIBEDBY_ID_PREFIX\n const originalReferenceIds = getAriaReferenceIds(element, 'aria-describedby').filter(id => id.indexOf(CDK_DESCRIBEDBY_ID_PREFIX) != 0);\n element.setAttribute('aria-describedby', originalReferenceIds.join(' '));\n }\n /**\n * Adds a message reference to the element using aria-describedby and increments the registered\n * message's reference count.\n */\n _addMessageReference(element, key) {\n const registeredMessage = this._messageRegistry.get(key);\n // Add the aria-describedby reference and set the\n // describedby_host attribute to mark the element.\n addAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);\n element.setAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE, this._id);\n registeredMessage.referenceCount++;\n }\n /**\n * Removes a message reference from the element using aria-describedby\n * and decrements the registered message's reference count.\n */\n _removeMessageReference(element, key) {\n const registeredMessage = this._messageRegistry.get(key);\n registeredMessage.referenceCount--;\n removeAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);\n element.removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);\n }\n /** Returns true if the element has been described by the provided message ID. */\n _isElementDescribedByMessage(element, key) {\n const referenceIds = getAriaReferenceIds(element, 'aria-describedby');\n const registeredMessage = this._messageRegistry.get(key);\n const messageId = registeredMessage && registeredMessage.messageElement.id;\n return !!messageId && referenceIds.indexOf(messageId) != -1;\n }\n /** Determines whether a message can be described on a particular element. */\n _canBeDescribed(element, message) {\n if (!this._isElementNode(element)) {\n return false;\n }\n if (message && typeof message === 'object') {\n // We'd have to make some assumptions about the description element's text, if the consumer\n // passed in an element. Assume that if an element is passed in, the consumer has verified\n // that it can be used as a description.\n return true;\n }\n const trimmedMessage = message == null ? '' : `${message}`.trim();\n const ariaLabel = element.getAttribute('aria-label');\n // We shouldn't set descriptions if they're exactly the same as the `aria-label` of the\n // element, because screen readers will end up reading out the same text twice in a row.\n return trimmedMessage ? !ariaLabel || ariaLabel.trim() !== trimmedMessage : false;\n }\n /** Checks whether a node is an Element node. */\n _isElementNode(element) {\n return element.nodeType === this._document.ELEMENT_NODE;\n }\n}\nAriaDescriber.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: AriaDescriber, deps: [{ token: DOCUMENT }, { token: i1.Platform }], target: i0.ɵɵFactoryTarget.Injectable });\nAriaDescriber.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: AriaDescriber, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: AriaDescriber, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i1.Platform }];\n } });\n/** Gets a key that can be used to look messages up in the registry. */\nfunction getKey(message, role) {\n return typeof message === 'string' ? `${role || ''}/${message}` : message;\n}\n/** Assigns a unique ID to an element, if it doesn't have one already. */\nfunction setMessageId(element) {\n if (!element.id) {\n element.id = `${CDK_DESCRIBEDBY_ID_PREFIX}-${nextId++}`;\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * This class manages keyboard events for selectable lists. If you pass it a query list\n * of items, it will set the active item correctly when arrow events occur.\n */\nclass ListKeyManager {\n constructor(_items) {\n this._items = _items;\n this._activeItemIndex = -1;\n this._activeItem = null;\n this._wrap = false;\n this._letterKeyStream = new Subject();\n this._typeaheadSubscription = Subscription.EMPTY;\n this._vertical = true;\n this._allowedModifierKeys = [];\n this._homeAndEnd = false;\n /**\n * Predicate function that can be used to check whether an item should be skipped\n * by the key manager. By default, disabled items are skipped.\n */\n this._skipPredicateFn = (item) => item.disabled;\n // Buffer for the letters that the user has pressed when the typeahead option is turned on.\n this._pressedLetters = [];\n /**\n * Stream that emits any time the TAB key is pressed, so components can react\n * when focus is shifted off of the list.\n */\n this.tabOut = new Subject();\n /** Stream that emits whenever the active item of the list manager changes. */\n this.change = new Subject();\n // We allow for the items to be an array because, in some cases, the consumer may\n // not have access to a QueryList of the items they want to manage (e.g. when the\n // items aren't being collected via `ViewChildren` or `ContentChildren`).\n if (_items instanceof QueryList) {\n _items.changes.subscribe((newItems) => {\n if (this._activeItem) {\n const itemArray = newItems.toArray();\n const newIndex = itemArray.indexOf(this._activeItem);\n if (newIndex > -1 && newIndex !== this._activeItemIndex) {\n this._activeItemIndex = newIndex;\n }\n }\n });\n }\n }\n /**\n * Sets the predicate function that determines which items should be skipped by the\n * list key manager.\n * @param predicate Function that determines whether the given item should be skipped.\n */\n skipPredicate(predicate) {\n this._skipPredicateFn = predicate;\n return this;\n }\n /**\n * Configures wrapping mode, which determines whether the active item will wrap to\n * the other end of list when there are no more items in the given direction.\n * @param shouldWrap Whether the list should wrap when reaching the end.\n */\n withWrap(shouldWrap = true) {\n this._wrap = shouldWrap;\n return this;\n }\n /**\n * Configures whether the key manager should be able to move the selection vertically.\n * @param enabled Whether vertical selection should be enabled.\n */\n withVerticalOrientation(enabled = true) {\n this._vertical = enabled;\n return this;\n }\n /**\n * Configures the key manager to move the selection horizontally.\n * Passing in `null` will disable horizontal movement.\n * @param direction Direction in which the selection can be moved.\n */\n withHorizontalOrientation(direction) {\n this._horizontal = direction;\n return this;\n }\n /**\n * Modifier keys which are allowed to be held down and whose default actions will be prevented\n * as the user is pressing the arrow keys. Defaults to not allowing any modifier keys.\n */\n withAllowedModifierKeys(keys) {\n this._allowedModifierKeys = keys;\n return this;\n }\n /**\n * Turns on typeahead mode which allows users to set the active item by typing.\n * @param debounceInterval Time to wait after the last keystroke before setting the active item.\n */\n withTypeAhead(debounceInterval = 200) {\n if ((typeof ngDevMode === 'undefined' || ngDevMode) &&\n this._items.length &&\n this._items.some(item => typeof item.getLabel !== 'function')) {\n throw Error('ListKeyManager items in typeahead mode must implement the `getLabel` method.');\n }\n this._typeaheadSubscription.unsubscribe();\n // Debounce the presses of non-navigational keys, collect the ones that correspond to letters\n // and convert those letters back into a string. Afterwards find the first item that starts\n // with that string and select it.\n this._typeaheadSubscription = this._letterKeyStream\n .pipe(tap(letter => this._pressedLetters.push(letter)), debounceTime(debounceInterval), filter(() => this._pressedLetters.length > 0), map(() => this._pressedLetters.join('')))\n .subscribe(inputString => {\n const items = this._getItemsArray();\n // Start at 1 because we want to start searching at the item immediately\n // following the current active item.\n for (let i = 1; i < items.length + 1; i++) {\n const index = (this._activeItemIndex + i) % items.length;\n const item = items[index];\n if (!this._skipPredicateFn(item) &&\n item.getLabel().toUpperCase().trim().indexOf(inputString) === 0) {\n this.setActiveItem(index);\n break;\n }\n }\n this._pressedLetters = [];\n });\n return this;\n }\n /**\n * Configures the key manager to activate the first and last items\n * respectively when the Home or End key is pressed.\n * @param enabled Whether pressing the Home or End key activates the first/last item.\n */\n withHomeAndEnd(enabled = true) {\n this._homeAndEnd = enabled;\n return this;\n }\n setActiveItem(item) {\n const previousActiveItem = this._activeItem;\n this.updateActiveItem(item);\n if (this._activeItem !== previousActiveItem) {\n this.change.next(this._activeItemIndex);\n }\n }\n /**\n * Sets the active item depending on the key event passed in.\n * @param event Keyboard event to be used for determining which element should be active.\n */\n onKeydown(event) {\n const keyCode = event.keyCode;\n const modifiers = ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'];\n const isModifierAllowed = modifiers.every(modifier => {\n return !event[modifier] || this._allowedModifierKeys.indexOf(modifier) > -1;\n });\n switch (keyCode) {\n case TAB:\n this.tabOut.next();\n return;\n case DOWN_ARROW:\n if (this._vertical && isModifierAllowed) {\n this.setNextItemActive();\n break;\n }\n else {\n return;\n }\n case UP_ARROW:\n if (this._vertical && isModifierAllowed) {\n this.setPreviousItemActive();\n break;\n }\n else {\n return;\n }\n case RIGHT_ARROW:\n if (this._horizontal && isModifierAllowed) {\n this._horizontal === 'rtl' ? this.setPreviousItemActive() : this.setNextItemActive();\n break;\n }\n else {\n return;\n }\n case LEFT_ARROW:\n if (this._horizontal && isModifierAllowed) {\n this._horizontal === 'rtl' ? this.setNextItemActive() : this.setPreviousItemActive();\n break;\n }\n else {\n return;\n }\n case HOME:\n if (this._homeAndEnd && isModifierAllowed) {\n this.setFirstItemActive();\n break;\n }\n else {\n return;\n }\n case END:\n if (this._homeAndEnd && isModifierAllowed) {\n this.setLastItemActive();\n break;\n }\n else {\n return;\n }\n default:\n if (isModifierAllowed || hasModifierKey(event, 'shiftKey')) {\n // Attempt to use the `event.key` which also maps it to the user's keyboard language,\n // otherwise fall back to resolving alphanumeric characters via the keyCode.\n if (event.key && event.key.length === 1) {\n this._letterKeyStream.next(event.key.toLocaleUpperCase());\n }\n else if ((keyCode >= A && keyCode <= Z) || (keyCode >= ZERO && keyCode <= NINE)) {\n this._letterKeyStream.next(String.fromCharCode(keyCode));\n }\n }\n // Note that we return here, in order to avoid preventing\n // the default action of non-navigational keys.\n return;\n }\n this._pressedLetters = [];\n event.preventDefault();\n }\n /** Index of the currently active item. */\n get activeItemIndex() {\n return this._activeItemIndex;\n }\n /** The active item. */\n get activeItem() {\n return this._activeItem;\n }\n /** Gets whether the user is currently typing into the manager using the typeahead feature. */\n isTyping() {\n return this._pressedLetters.length > 0;\n }\n /** Sets the active item to the first enabled item in the list. */\n setFirstItemActive() {\n this._setActiveItemByIndex(0, 1);\n }\n /** Sets the active item to the last enabled item in the list. */\n setLastItemActive() {\n this._setActiveItemByIndex(this._items.length - 1, -1);\n }\n /** Sets the active item to the next enabled item in the list. */\n setNextItemActive() {\n this._activeItemIndex < 0 ? this.setFirstItemActive() : this._setActiveItemByDelta(1);\n }\n /** Sets the active item to a previous enabled item in the list. */\n setPreviousItemActive() {\n this._activeItemIndex < 0 && this._wrap\n ? this.setLastItemActive()\n : this._setActiveItemByDelta(-1);\n }\n updateActiveItem(item) {\n const itemArray = this._getItemsArray();\n const index = typeof item === 'number' ? item : itemArray.indexOf(item);\n const activeItem = itemArray[index];\n // Explicitly check for `null` and `undefined` because other falsy values are valid.\n this._activeItem = activeItem == null ? null : activeItem;\n this._activeItemIndex = index;\n }\n /**\n * This method sets the active item, given a list of items and the delta between the\n * currently active item and the new active item. It will calculate differently\n * depending on whether wrap mode is turned on.\n */\n _setActiveItemByDelta(delta) {\n this._wrap ? this._setActiveInWrapMode(delta) : this._setActiveInDefaultMode(delta);\n }\n /**\n * Sets the active item properly given \"wrap\" mode. In other words, it will continue to move\n * down the list until it finds an item that is not disabled, and it will wrap if it\n * encounters either end of the list.\n */\n _setActiveInWrapMode(delta) {\n const items = this._getItemsArray();\n for (let i = 1; i <= items.length; i++) {\n const index = (this._activeItemIndex + delta * i + items.length) % items.length;\n const item = items[index];\n if (!this._skipPredicateFn(item)) {\n this.setActiveItem(index);\n return;\n }\n }\n }\n /**\n * Sets the active item properly given the default mode. In other words, it will\n * continue to move down the list until it finds an item that is not disabled. If\n * it encounters either end of the list, it will stop and not wrap.\n */\n _setActiveInDefaultMode(delta) {\n this._setActiveItemByIndex(this._activeItemIndex + delta, delta);\n }\n /**\n * Sets the active item to the first enabled item starting at the index specified. If the\n * item is disabled, it will move in the fallbackDelta direction until it either\n * finds an enabled item or encounters the end of the list.\n */\n _setActiveItemByIndex(index, fallbackDelta) {\n const items = this._getItemsArray();\n if (!items[index]) {\n return;\n }\n while (this._skipPredicateFn(items[index])) {\n index += fallbackDelta;\n if (!items[index]) {\n return;\n }\n }\n this.setActiveItem(index);\n }\n /** Returns the items as an array. */\n _getItemsArray() {\n return this._items instanceof QueryList ? this._items.toArray() : this._items;\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass ActiveDescendantKeyManager extends ListKeyManager {\n setActiveItem(index) {\n if (this.activeItem) {\n this.activeItem.setInactiveStyles();\n }\n super.setActiveItem(index);\n if (this.activeItem) {\n this.activeItem.setActiveStyles();\n }\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass FocusKeyManager extends ListKeyManager {\n constructor() {\n super(...arguments);\n this._origin = 'program';\n }\n /**\n * Sets the focus origin that will be passed in to the items for any subsequent `focus` calls.\n * @param origin Focus origin to be used when focusing items.\n */\n setFocusOrigin(origin) {\n this._origin = origin;\n return this;\n }\n setActiveItem(item) {\n super.setActiveItem(item);\n if (this.activeItem) {\n this.activeItem.focus(this._origin);\n }\n }\n}\n\n/**\n * Configuration for the isFocusable method.\n */\nclass IsFocusableConfig {\n constructor() {\n /**\n * Whether to count an element as focusable even if it is not currently visible.\n */\n this.ignoreVisibility = false;\n }\n}\n// The InteractivityChecker leans heavily on the ally.js accessibility utilities.\n// Methods like `isTabbable` are only covering specific edge-cases for the browsers which are\n// supported.\n/**\n * Utility for checking the interactivity of an element, such as whether is is focusable or\n * tabbable.\n */\nclass InteractivityChecker {\n constructor(_platform) {\n this._platform = _platform;\n }\n /**\n * Gets whether an element is disabled.\n *\n * @param element Element to be checked.\n * @returns Whether the element is disabled.\n */\n isDisabled(element) {\n // This does not capture some cases, such as a non-form control with a disabled attribute or\n // a form control inside of a disabled form, but should capture the most common cases.\n return element.hasAttribute('disabled');\n }\n /**\n * Gets whether an element is visible for the purposes of interactivity.\n *\n * This will capture states like `display: none` and `visibility: hidden`, but not things like\n * being clipped by an `overflow: hidden` parent or being outside the viewport.\n *\n * @returns Whether the element is visible.\n */\n isVisible(element) {\n return hasGeometry(element) && getComputedStyle(element).visibility === 'visible';\n }\n /**\n * Gets whether an element can be reached via Tab key.\n * Assumes that the element has already been checked with isFocusable.\n *\n * @param element Element to be checked.\n * @returns Whether the element is tabbable.\n */\n isTabbable(element) {\n // Nothing is tabbable on the server 😎\n if (!this._platform.isBrowser) {\n return false;\n }\n const frameElement = getFrameElement(getWindow(element));\n if (frameElement) {\n // Frame elements inherit their tabindex onto all child elements.\n if (getTabIndexValue(frameElement) === -1) {\n return false;\n }\n // Browsers disable tabbing to an element inside of an invisible frame.\n if (!this.isVisible(frameElement)) {\n return false;\n }\n }\n let nodeName = element.nodeName.toLowerCase();\n let tabIndexValue = getTabIndexValue(element);\n if (element.hasAttribute('contenteditable')) {\n return tabIndexValue !== -1;\n }\n if (nodeName === 'iframe' || nodeName === 'object') {\n // The frame or object's content may be tabbable depending on the content, but it's\n // not possibly to reliably detect the content of the frames. We always consider such\n // elements as non-tabbable.\n return false;\n }\n // In iOS, the browser only considers some specific elements as tabbable.\n if (this._platform.WEBKIT && this._platform.IOS && !isPotentiallyTabbableIOS(element)) {\n return false;\n }\n if (nodeName === 'audio') {\n // Audio elements without controls enabled are never tabbable, regardless\n // of the tabindex attribute explicitly being set.\n if (!element.hasAttribute('controls')) {\n return false;\n }\n // Audio elements with controls are by default tabbable unless the\n // tabindex attribute is set to `-1` explicitly.\n return tabIndexValue !== -1;\n }\n if (nodeName === 'video') {\n // For all video elements, if the tabindex attribute is set to `-1`, the video\n // is not tabbable. Note: We cannot rely on the default `HTMLElement.tabIndex`\n // property as that one is set to `-1` in Chrome, Edge and Safari v13.1. The\n // tabindex attribute is the source of truth here.\n if (tabIndexValue === -1) {\n return false;\n }\n // If the tabindex is explicitly set, and not `-1` (as per check before), the\n // video element is always tabbable (regardless of whether it has controls or not).\n if (tabIndexValue !== null) {\n return true;\n }\n // Otherwise (when no explicit tabindex is set), a video is only tabbable if it\n // has controls enabled. Firefox is special as videos are always tabbable regardless\n // of whether there are controls or not.\n return this._platform.FIREFOX || element.hasAttribute('controls');\n }\n return element.tabIndex >= 0;\n }\n /**\n * Gets whether an element can be focused by the user.\n *\n * @param element Element to be checked.\n * @param config The config object with options to customize this method's behavior\n * @returns Whether the element is focusable.\n */\n isFocusable(element, config) {\n // Perform checks in order of left to most expensive.\n // Again, naive approach that does not capture many edge cases and browser quirks.\n return (isPotentiallyFocusable(element) &&\n !this.isDisabled(element) &&\n ((config === null || config === void 0 ? void 0 : config.ignoreVisibility) || this.isVisible(element)));\n }\n}\nInteractivityChecker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: InteractivityChecker, deps: [{ token: i1.Platform }], target: i0.ɵɵFactoryTarget.Injectable });\nInteractivityChecker.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: InteractivityChecker, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: InteractivityChecker, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () { return [{ type: i1.Platform }]; } });\n/**\n * Returns the frame element from a window object. Since browsers like MS Edge throw errors if\n * the frameElement property is being accessed from a different host address, this property\n * should be accessed carefully.\n */\nfunction getFrameElement(window) {\n try {\n return window.frameElement;\n }\n catch (_a) {\n return null;\n }\n}\n/** Checks whether the specified element has any geometry / rectangles. */\nfunction hasGeometry(element) {\n // Use logic from jQuery to check for an invisible element.\n // See https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js#L12\n return !!(element.offsetWidth ||\n element.offsetHeight ||\n (typeof element.getClientRects === 'function' && element.getClientRects().length));\n}\n/** Gets whether an element's */\nfunction isNativeFormElement(element) {\n let nodeName = element.nodeName.toLowerCase();\n return (nodeName === 'input' ||\n nodeName === 'select' ||\n nodeName === 'button' ||\n nodeName === 'textarea');\n}\n/** Gets whether an element is an ``. */\nfunction isHiddenInput(element) {\n return isInputElement(element) && element.type == 'hidden';\n}\n/** Gets whether an element is an anchor that has an href attribute. */\nfunction isAnchorWithHref(element) {\n return isAnchorElement(element) && element.hasAttribute('href');\n}\n/** Gets whether an element is an input element. */\nfunction isInputElement(element) {\n return element.nodeName.toLowerCase() == 'input';\n}\n/** Gets whether an element is an anchor element. */\nfunction isAnchorElement(element) {\n return element.nodeName.toLowerCase() == 'a';\n}\n/** Gets whether an element has a valid tabindex. */\nfunction hasValidTabIndex(element) {\n if (!element.hasAttribute('tabindex') || element.tabIndex === undefined) {\n return false;\n }\n let tabIndex = element.getAttribute('tabindex');\n return !!(tabIndex && !isNaN(parseInt(tabIndex, 10)));\n}\n/**\n * Returns the parsed tabindex from the element attributes instead of returning the\n * evaluated tabindex from the browsers defaults.\n */\nfunction getTabIndexValue(element) {\n if (!hasValidTabIndex(element)) {\n return null;\n }\n // See browser issue in Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054\n const tabIndex = parseInt(element.getAttribute('tabindex') || '', 10);\n return isNaN(tabIndex) ? -1 : tabIndex;\n}\n/** Checks whether the specified element is potentially tabbable on iOS */\nfunction isPotentiallyTabbableIOS(element) {\n let nodeName = element.nodeName.toLowerCase();\n let inputType = nodeName === 'input' && element.type;\n return (inputType === 'text' ||\n inputType === 'password' ||\n nodeName === 'select' ||\n nodeName === 'textarea');\n}\n/**\n * Gets whether an element is potentially focusable without taking current visible/disabled state\n * into account.\n */\nfunction isPotentiallyFocusable(element) {\n // Inputs are potentially focusable *unless* they're type=\"hidden\".\n if (isHiddenInput(element)) {\n return false;\n }\n return (isNativeFormElement(element) ||\n isAnchorWithHref(element) ||\n element.hasAttribute('contenteditable') ||\n hasValidTabIndex(element));\n}\n/** Gets the parent window of a DOM node with regards of being inside of an iframe. */\nfunction getWindow(node) {\n // ownerDocument is null if `node` itself *is* a document.\n return (node.ownerDocument && node.ownerDocument.defaultView) || window;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Class that allows for trapping focus within a DOM element.\n *\n * This class currently uses a relatively simple approach to focus trapping.\n * It assumes that the tab order is the same as DOM order, which is not necessarily true.\n * Things like `tabIndex > 0`, flex `order`, and shadow roots can cause the two to be misaligned.\n *\n * @deprecated Use `ConfigurableFocusTrap` instead.\n * @breaking-change 11.0.0\n */\nclass FocusTrap {\n constructor(_element, _checker, _ngZone, _document, deferAnchors = false) {\n this._element = _element;\n this._checker = _checker;\n this._ngZone = _ngZone;\n this._document = _document;\n this._hasAttached = false;\n // Event listeners for the anchors. Need to be regular functions so that we can unbind them later.\n this.startAnchorListener = () => this.focusLastTabbableElement();\n this.endAnchorListener = () => this.focusFirstTabbableElement();\n this._enabled = true;\n if (!deferAnchors) {\n this.attachAnchors();\n }\n }\n /** Whether the focus trap is active. */\n get enabled() {\n return this._enabled;\n }\n set enabled(value) {\n this._enabled = value;\n if (this._startAnchor && this._endAnchor) {\n this._toggleAnchorTabIndex(value, this._startAnchor);\n this._toggleAnchorTabIndex(value, this._endAnchor);\n }\n }\n /** Destroys the focus trap by cleaning up the anchors. */\n destroy() {\n const startAnchor = this._startAnchor;\n const endAnchor = this._endAnchor;\n if (startAnchor) {\n startAnchor.removeEventListener('focus', this.startAnchorListener);\n startAnchor.remove();\n }\n if (endAnchor) {\n endAnchor.removeEventListener('focus', this.endAnchorListener);\n endAnchor.remove();\n }\n this._startAnchor = this._endAnchor = null;\n this._hasAttached = false;\n }\n /**\n * Inserts the anchors into the DOM. This is usually done automatically\n * in the constructor, but can be deferred for cases like directives with `*ngIf`.\n * @returns Whether the focus trap managed to attach successfully. This may not be the case\n * if the target element isn't currently in the DOM.\n */\n attachAnchors() {\n // If we're not on the browser, there can be no focus to trap.\n if (this._hasAttached) {\n return true;\n }\n this._ngZone.runOutsideAngular(() => {\n if (!this._startAnchor) {\n this._startAnchor = this._createAnchor();\n this._startAnchor.addEventListener('focus', this.startAnchorListener);\n }\n if (!this._endAnchor) {\n this._endAnchor = this._createAnchor();\n this._endAnchor.addEventListener('focus', this.endAnchorListener);\n }\n });\n if (this._element.parentNode) {\n this._element.parentNode.insertBefore(this._startAnchor, this._element);\n this._element.parentNode.insertBefore(this._endAnchor, this._element.nextSibling);\n this._hasAttached = true;\n }\n return this._hasAttached;\n }\n /**\n * Waits for the zone to stabilize, then focuses the first tabbable element.\n * @returns Returns a promise that resolves with a boolean, depending\n * on whether focus was moved successfully.\n */\n focusInitialElementWhenReady(options) {\n return new Promise(resolve => {\n this._executeOnStable(() => resolve(this.focusInitialElement(options)));\n });\n }\n /**\n * Waits for the zone to stabilize, then focuses\n * the first tabbable element within the focus trap region.\n * @returns Returns a promise that resolves with a boolean, depending\n * on whether focus was moved successfully.\n */\n focusFirstTabbableElementWhenReady(options) {\n return new Promise(resolve => {\n this._executeOnStable(() => resolve(this.focusFirstTabbableElement(options)));\n });\n }\n /**\n * Waits for the zone to stabilize, then focuses\n * the last tabbable element within the focus trap region.\n * @returns Returns a promise that resolves with a boolean, depending\n * on whether focus was moved successfully.\n */\n focusLastTabbableElementWhenReady(options) {\n return new Promise(resolve => {\n this._executeOnStable(() => resolve(this.focusLastTabbableElement(options)));\n });\n }\n /**\n * Get the specified boundary element of the trapped region.\n * @param bound The boundary to get (start or end of trapped region).\n * @returns The boundary element.\n */\n _getRegionBoundary(bound) {\n // Contains the deprecated version of selector, for temporary backwards comparability.\n const markers = this._element.querySelectorAll(`[cdk-focus-region-${bound}], ` + `[cdkFocusRegion${bound}], ` + `[cdk-focus-${bound}]`);\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n for (let i = 0; i < markers.length; i++) {\n // @breaking-change 8.0.0\n if (markers[i].hasAttribute(`cdk-focus-${bound}`)) {\n console.warn(`Found use of deprecated attribute 'cdk-focus-${bound}', ` +\n `use 'cdkFocusRegion${bound}' instead. The deprecated ` +\n `attribute will be removed in 8.0.0.`, markers[i]);\n }\n else if (markers[i].hasAttribute(`cdk-focus-region-${bound}`)) {\n console.warn(`Found use of deprecated attribute 'cdk-focus-region-${bound}', ` +\n `use 'cdkFocusRegion${bound}' instead. The deprecated attribute ` +\n `will be removed in 8.0.0.`, markers[i]);\n }\n }\n }\n if (bound == 'start') {\n return markers.length ? markers[0] : this._getFirstTabbableElement(this._element);\n }\n return markers.length\n ? markers[markers.length - 1]\n : this._getLastTabbableElement(this._element);\n }\n /**\n * Focuses the element that should be focused when the focus trap is initialized.\n * @returns Whether focus was moved successfully.\n */\n focusInitialElement(options) {\n // Contains the deprecated version of selector, for temporary backwards comparability.\n const redirectToElement = this._element.querySelector(`[cdk-focus-initial], ` + `[cdkFocusInitial]`);\n if (redirectToElement) {\n // @breaking-change 8.0.0\n if ((typeof ngDevMode === 'undefined' || ngDevMode) &&\n redirectToElement.hasAttribute(`cdk-focus-initial`)) {\n console.warn(`Found use of deprecated attribute 'cdk-focus-initial', ` +\n `use 'cdkFocusInitial' instead. The deprecated attribute ` +\n `will be removed in 8.0.0`, redirectToElement);\n }\n // Warn the consumer if the element they've pointed to\n // isn't focusable, when not in production mode.\n if ((typeof ngDevMode === 'undefined' || ngDevMode) &&\n !this._checker.isFocusable(redirectToElement)) {\n console.warn(`Element matching '[cdkFocusInitial]' is not focusable.`, redirectToElement);\n }\n if (!this._checker.isFocusable(redirectToElement)) {\n const focusableChild = this._getFirstTabbableElement(redirectToElement);\n focusableChild === null || focusableChild === void 0 ? void 0 : focusableChild.focus(options);\n return !!focusableChild;\n }\n redirectToElement.focus(options);\n return true;\n }\n return this.focusFirstTabbableElement(options);\n }\n /**\n * Focuses the first tabbable element within the focus trap region.\n * @returns Whether focus was moved successfully.\n */\n focusFirstTabbableElement(options) {\n const redirectToElement = this._getRegionBoundary('start');\n if (redirectToElement) {\n redirectToElement.focus(options);\n }\n return !!redirectToElement;\n }\n /**\n * Focuses the last tabbable element within the focus trap region.\n * @returns Whether focus was moved successfully.\n */\n focusLastTabbableElement(options) {\n const redirectToElement = this._getRegionBoundary('end');\n if (redirectToElement) {\n redirectToElement.focus(options);\n }\n return !!redirectToElement;\n }\n /**\n * Checks whether the focus trap has successfully been attached.\n */\n hasAttached() {\n return this._hasAttached;\n }\n /** Get the first tabbable element from a DOM subtree (inclusive). */\n _getFirstTabbableElement(root) {\n if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n return root;\n }\n const children = root.children;\n for (let i = 0; i < children.length; i++) {\n const tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE\n ? this._getFirstTabbableElement(children[i])\n : null;\n if (tabbableChild) {\n return tabbableChild;\n }\n }\n return null;\n }\n /** Get the last tabbable element from a DOM subtree (inclusive). */\n _getLastTabbableElement(root) {\n if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n return root;\n }\n // Iterate in reverse DOM order.\n const children = root.children;\n for (let i = children.length - 1; i >= 0; i--) {\n const tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE\n ? this._getLastTabbableElement(children[i])\n : null;\n if (tabbableChild) {\n return tabbableChild;\n }\n }\n return null;\n }\n /** Creates an anchor element. */\n _createAnchor() {\n const anchor = this._document.createElement('div');\n this._toggleAnchorTabIndex(this._enabled, anchor);\n anchor.classList.add('cdk-visually-hidden');\n anchor.classList.add('cdk-focus-trap-anchor');\n anchor.setAttribute('aria-hidden', 'true');\n return anchor;\n }\n /**\n * Toggles the `tabindex` of an anchor, based on the enabled state of the focus trap.\n * @param isEnabled Whether the focus trap is enabled.\n * @param anchor Anchor on which to toggle the tabindex.\n */\n _toggleAnchorTabIndex(isEnabled, anchor) {\n // Remove the tabindex completely, rather than setting it to -1, because if the\n // element has a tabindex, the user might still hit it when navigating with the arrow keys.\n isEnabled ? anchor.setAttribute('tabindex', '0') : anchor.removeAttribute('tabindex');\n }\n /**\n * Toggles the`tabindex` of both anchors to either trap Tab focus or allow it to escape.\n * @param enabled: Whether the anchors should trap Tab.\n */\n toggleAnchors(enabled) {\n if (this._startAnchor && this._endAnchor) {\n this._toggleAnchorTabIndex(enabled, this._startAnchor);\n this._toggleAnchorTabIndex(enabled, this._endAnchor);\n }\n }\n /** Executes a function when the zone is stable. */\n _executeOnStable(fn) {\n if (this._ngZone.isStable) {\n fn();\n }\n else {\n this._ngZone.onStable.pipe(take(1)).subscribe(fn);\n }\n }\n}\n/**\n * Factory that allows easy instantiation of focus traps.\n * @deprecated Use `ConfigurableFocusTrapFactory` instead.\n * @breaking-change 11.0.0\n */\nclass FocusTrapFactory {\n constructor(_checker, _ngZone, _document) {\n this._checker = _checker;\n this._ngZone = _ngZone;\n this._document = _document;\n }\n /**\n * Creates a focus-trapped region around the given element.\n * @param element The element around which focus will be trapped.\n * @param deferCaptureElements Defers the creation of focus-capturing elements to be done\n * manually by the user.\n * @returns The created focus trap instance.\n */\n create(element, deferCaptureElements = false) {\n return new FocusTrap(element, this._checker, this._ngZone, this._document, deferCaptureElements);\n }\n}\nFocusTrapFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusTrapFactory, deps: [{ token: InteractivityChecker }, { token: i0.NgZone }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });\nFocusTrapFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusTrapFactory, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusTrapFactory, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: InteractivityChecker }, { type: i0.NgZone }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }];\n } });\n/** Directive for trapping focus within a region. */\nclass CdkTrapFocus {\n constructor(_elementRef, _focusTrapFactory, \n /**\n * @deprecated No longer being used. To be removed.\n * @breaking-change 13.0.0\n */\n _document) {\n this._elementRef = _elementRef;\n this._focusTrapFactory = _focusTrapFactory;\n /** Previously focused element to restore focus to upon destroy when using autoCapture. */\n this._previouslyFocusedElement = null;\n this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true);\n }\n /** Whether the focus trap is active. */\n get enabled() {\n return this.focusTrap.enabled;\n }\n set enabled(value) {\n this.focusTrap.enabled = coerceBooleanProperty(value);\n }\n /**\n * Whether the directive should automatically move focus into the trapped region upon\n * initialization and return focus to the previous activeElement upon destruction.\n */\n get autoCapture() {\n return this._autoCapture;\n }\n set autoCapture(value) {\n this._autoCapture = coerceBooleanProperty(value);\n }\n ngOnDestroy() {\n this.focusTrap.destroy();\n // If we stored a previously focused element when using autoCapture, return focus to that\n // element now that the trapped region is being destroyed.\n if (this._previouslyFocusedElement) {\n this._previouslyFocusedElement.focus();\n this._previouslyFocusedElement = null;\n }\n }\n ngAfterContentInit() {\n this.focusTrap.attachAnchors();\n if (this.autoCapture) {\n this._captureFocus();\n }\n }\n ngDoCheck() {\n if (!this.focusTrap.hasAttached()) {\n this.focusTrap.attachAnchors();\n }\n }\n ngOnChanges(changes) {\n const autoCaptureChange = changes['autoCapture'];\n if (autoCaptureChange &&\n !autoCaptureChange.firstChange &&\n this.autoCapture &&\n this.focusTrap.hasAttached()) {\n this._captureFocus();\n }\n }\n _captureFocus() {\n this._previouslyFocusedElement = _getFocusedElementPierceShadowDom();\n this.focusTrap.focusInitialElementWhenReady();\n }\n}\nCdkTrapFocus.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkTrapFocus, deps: [{ token: i0.ElementRef }, { token: FocusTrapFactory }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });\nCdkTrapFocus.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkTrapFocus, selector: \"[cdkTrapFocus]\", inputs: { enabled: [\"cdkTrapFocus\", \"enabled\"], autoCapture: [\"cdkTrapFocusAutoCapture\", \"autoCapture\"] }, exportAs: [\"cdkTrapFocus\"], usesOnChanges: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkTrapFocus, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkTrapFocus]',\n exportAs: 'cdkTrapFocus',\n }]\n }], ctorParameters: function () {\n return [{ type: i0.ElementRef }, { type: FocusTrapFactory }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }];\n }, propDecorators: { enabled: [{\n type: Input,\n args: ['cdkTrapFocus']\n }], autoCapture: [{\n type: Input,\n args: ['cdkTrapFocusAutoCapture']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Class that allows for trapping focus within a DOM element.\n *\n * This class uses a strategy pattern that determines how it traps focus.\n * See FocusTrapInertStrategy.\n */\nclass ConfigurableFocusTrap extends FocusTrap {\n constructor(_element, _checker, _ngZone, _document, _focusTrapManager, _inertStrategy, config) {\n super(_element, _checker, _ngZone, _document, config.defer);\n this._focusTrapManager = _focusTrapManager;\n this._inertStrategy = _inertStrategy;\n this._focusTrapManager.register(this);\n }\n /** Whether the FocusTrap is enabled. */\n get enabled() {\n return this._enabled;\n }\n set enabled(value) {\n this._enabled = value;\n if (this._enabled) {\n this._focusTrapManager.register(this);\n }\n else {\n this._focusTrapManager.deregister(this);\n }\n }\n /** Notifies the FocusTrapManager that this FocusTrap will be destroyed. */\n destroy() {\n this._focusTrapManager.deregister(this);\n super.destroy();\n }\n /** @docs-private Implemented as part of ManagedFocusTrap. */\n _enable() {\n this._inertStrategy.preventFocus(this);\n this.toggleAnchors(true);\n }\n /** @docs-private Implemented as part of ManagedFocusTrap. */\n _disable() {\n this._inertStrategy.allowFocus(this);\n this.toggleAnchors(false);\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** The injection token used to specify the inert strategy. */\nconst FOCUS_TRAP_INERT_STRATEGY = new InjectionToken('FOCUS_TRAP_INERT_STRATEGY');\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Lightweight FocusTrapInertStrategy that adds a document focus event\n * listener to redirect focus back inside the FocusTrap.\n */\nclass EventListenerFocusTrapInertStrategy {\n constructor() {\n /** Focus event handler. */\n this._listener = null;\n }\n /** Adds a document event listener that keeps focus inside the FocusTrap. */\n preventFocus(focusTrap) {\n // Ensure there's only one listener per document\n if (this._listener) {\n focusTrap._document.removeEventListener('focus', this._listener, true);\n }\n this._listener = (e) => this._trapFocus(focusTrap, e);\n focusTrap._ngZone.runOutsideAngular(() => {\n focusTrap._document.addEventListener('focus', this._listener, true);\n });\n }\n /** Removes the event listener added in preventFocus. */\n allowFocus(focusTrap) {\n if (!this._listener) {\n return;\n }\n focusTrap._document.removeEventListener('focus', this._listener, true);\n this._listener = null;\n }\n /**\n * Refocuses the first element in the FocusTrap if the focus event target was outside\n * the FocusTrap.\n *\n * This is an event listener callback. The event listener is added in runOutsideAngular,\n * so all this code runs outside Angular as well.\n */\n _trapFocus(focusTrap, event) {\n var _a;\n const target = event.target;\n const focusTrapRoot = focusTrap._element;\n // Don't refocus if target was in an overlay, because the overlay might be associated\n // with an element inside the FocusTrap, ex. mat-select.\n if (target && !focusTrapRoot.contains(target) && !((_a = target.closest) === null || _a === void 0 ? void 0 : _a.call(target, 'div.cdk-overlay-pane'))) {\n // Some legacy FocusTrap usages have logic that focuses some element on the page\n // just before FocusTrap is destroyed. For backwards compatibility, wait\n // to be sure FocusTrap is still enabled before refocusing.\n setTimeout(() => {\n // Check whether focus wasn't put back into the focus trap while the timeout was pending.\n if (focusTrap.enabled && !focusTrapRoot.contains(focusTrap._document.activeElement)) {\n focusTrap.focusFirstTabbableElement();\n }\n });\n }\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Injectable that ensures only the most recently enabled FocusTrap is active. */\nclass FocusTrapManager {\n constructor() {\n // A stack of the FocusTraps on the page. Only the FocusTrap at the\n // top of the stack is active.\n this._focusTrapStack = [];\n }\n /**\n * Disables the FocusTrap at the top of the stack, and then pushes\n * the new FocusTrap onto the stack.\n */\n register(focusTrap) {\n // Dedupe focusTraps that register multiple times.\n this._focusTrapStack = this._focusTrapStack.filter(ft => ft !== focusTrap);\n let stack = this._focusTrapStack;\n if (stack.length) {\n stack[stack.length - 1]._disable();\n }\n stack.push(focusTrap);\n focusTrap._enable();\n }\n /**\n * Removes the FocusTrap from the stack, and activates the\n * FocusTrap that is the new top of the stack.\n */\n deregister(focusTrap) {\n focusTrap._disable();\n const stack = this._focusTrapStack;\n const i = stack.indexOf(focusTrap);\n if (i !== -1) {\n stack.splice(i, 1);\n if (stack.length) {\n stack[stack.length - 1]._enable();\n }\n }\n }\n}\nFocusTrapManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusTrapManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\nFocusTrapManager.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusTrapManager, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusTrapManager, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Factory that allows easy instantiation of configurable focus traps. */\nclass ConfigurableFocusTrapFactory {\n constructor(_checker, _ngZone, _focusTrapManager, _document, _inertStrategy) {\n this._checker = _checker;\n this._ngZone = _ngZone;\n this._focusTrapManager = _focusTrapManager;\n this._document = _document;\n // TODO split up the strategies into different modules, similar to DateAdapter.\n this._inertStrategy = _inertStrategy || new EventListenerFocusTrapInertStrategy();\n }\n create(element, config = { defer: false }) {\n let configObject;\n if (typeof config === 'boolean') {\n configObject = { defer: config };\n }\n else {\n configObject = config;\n }\n return new ConfigurableFocusTrap(element, this._checker, this._ngZone, this._document, this._focusTrapManager, this._inertStrategy, configObject);\n }\n}\nConfigurableFocusTrapFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ConfigurableFocusTrapFactory, deps: [{ token: InteractivityChecker }, { token: i0.NgZone }, { token: FocusTrapManager }, { token: DOCUMENT }, { token: FOCUS_TRAP_INERT_STRATEGY, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nConfigurableFocusTrapFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ConfigurableFocusTrapFactory, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ConfigurableFocusTrapFactory, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: InteractivityChecker }, { type: i0.NgZone }, { type: FocusTrapManager }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [FOCUS_TRAP_INERT_STRATEGY]\n }] }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Gets whether an event could be a faked `mousedown` event dispatched by a screen reader. */\nfunction isFakeMousedownFromScreenReader(event) {\n // Some screen readers will dispatch a fake `mousedown` event when pressing enter or space on\n // a clickable element. We can distinguish these events when both `offsetX` and `offsetY` are\n // zero or `event.buttons` is zero, depending on the browser:\n // - `event.buttons` works on Firefox, but fails on Chrome.\n // - `offsetX` and `offsetY` work on Chrome, but fail on Firefox.\n // Note that there's an edge case where the user could click the 0x0 spot of the\n // screen themselves, but that is unlikely to contain interactive elements.\n return event.buttons === 0 || (event.offsetX === 0 && event.offsetY === 0);\n}\n/** Gets whether an event could be a faked `touchstart` event dispatched by a screen reader. */\nfunction isFakeTouchstartFromScreenReader(event) {\n const touch = (event.touches && event.touches[0]) || (event.changedTouches && event.changedTouches[0]);\n // A fake `touchstart` can be distinguished from a real one by looking at the `identifier`\n // which is typically >= 0 on a real device versus -1 from a screen reader. Just to be safe,\n // we can also look at `radiusX` and `radiusY`. This behavior was observed against a Windows 10\n // device with a touch screen running NVDA v2020.4 and Firefox 85 or Chrome 88.\n return (!!touch &&\n touch.identifier === -1 &&\n (touch.radiusX == null || touch.radiusX === 1) &&\n (touch.radiusY == null || touch.radiusY === 1));\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Injectable options for the InputModalityDetector. These are shallowly merged with the default\n * options.\n */\nconst INPUT_MODALITY_DETECTOR_OPTIONS = new InjectionToken('cdk-input-modality-detector-options');\n/**\n * Default options for the InputModalityDetector.\n *\n * Modifier keys are ignored by default (i.e. when pressed won't cause the service to detect\n * keyboard input modality) for two reasons:\n *\n * 1. Modifier keys are commonly used with mouse to perform actions such as 'right click' or 'open\n * in new tab', and are thus less representative of actual keyboard interaction.\n * 2. VoiceOver triggers some keyboard events when linearly navigating with Control + Option (but\n * confusingly not with Caps Lock). Thus, to have parity with other screen readers, we ignore\n * these keys so as to not update the input modality.\n *\n * Note that we do not by default ignore the right Meta key on Safari because it has the same key\n * code as the ContextMenu key on other browsers. When we switch to using event.key, we can\n * distinguish between the two.\n */\nconst INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS = {\n ignoreKeys: [ALT, CONTROL, MAC_META, META, SHIFT],\n};\n/**\n * The amount of time needed to pass after a touchstart event in order for a subsequent mousedown\n * event to be attributed as mouse and not touch.\n *\n * This is the value used by AngularJS Material. Through trial and error (on iPhone 6S) they found\n * that a value of around 650ms seems appropriate.\n */\nconst TOUCH_BUFFER_MS = 650;\n/**\n * Event listener options that enable capturing and also mark the listener as passive if the browser\n * supports it.\n */\nconst modalityEventListenerOptions = normalizePassiveListenerOptions({\n passive: true,\n capture: true,\n});\n/**\n * Service that detects the user's input modality.\n *\n * This service does not update the input modality when a user navigates with a screen reader\n * (e.g. linear navigation with VoiceOver, object navigation / browse mode with NVDA, virtual PC\n * cursor mode with JAWS). This is in part due to technical limitations (i.e. keyboard events do not\n * fire as expected in these modes) but is also arguably the correct behavior. Navigating with a\n * screen reader is akin to visually scanning a page, and should not be interpreted as actual user\n * input interaction.\n *\n * When a user is not navigating but *interacting* with a screen reader, this service attempts to\n * update the input modality to keyboard, but in general this service's behavior is largely\n * undefined.\n */\nclass InputModalityDetector {\n constructor(_platform, ngZone, document, options) {\n this._platform = _platform;\n /**\n * The most recently detected input modality event target. Is null if no input modality has been\n * detected or if the associated event target is null for some unknown reason.\n */\n this._mostRecentTarget = null;\n /** The underlying BehaviorSubject that emits whenever an input modality is detected. */\n this._modality = new BehaviorSubject(null);\n /**\n * The timestamp of the last touch input modality. Used to determine whether mousedown events\n * should be attributed to mouse or touch.\n */\n this._lastTouchMs = 0;\n /**\n * Handles keydown events. Must be an arrow function in order to preserve the context when it gets\n * bound.\n */\n this._onKeydown = (event) => {\n var _a, _b;\n // If this is one of the keys we should ignore, then ignore it and don't update the input\n // modality to keyboard.\n if ((_b = (_a = this._options) === null || _a === void 0 ? void 0 : _a.ignoreKeys) === null || _b === void 0 ? void 0 : _b.some(keyCode => keyCode === event.keyCode)) {\n return;\n }\n this._modality.next('keyboard');\n this._mostRecentTarget = _getEventTarget(event);\n };\n /**\n * Handles mousedown events. Must be an arrow function in order to preserve the context when it\n * gets bound.\n */\n this._onMousedown = (event) => {\n // Touches trigger both touch and mouse events, so we need to distinguish between mouse events\n // that were triggered via mouse vs touch. To do so, check if the mouse event occurs closely\n // after the previous touch event.\n if (Date.now() - this._lastTouchMs < TOUCH_BUFFER_MS) {\n return;\n }\n // Fake mousedown events are fired by some screen readers when controls are activated by the\n // screen reader. Attribute them to keyboard input modality.\n this._modality.next(isFakeMousedownFromScreenReader(event) ? 'keyboard' : 'mouse');\n this._mostRecentTarget = _getEventTarget(event);\n };\n /**\n * Handles touchstart events. Must be an arrow function in order to preserve the context when it\n * gets bound.\n */\n this._onTouchstart = (event) => {\n // Same scenario as mentioned in _onMousedown, but on touch screen devices, fake touchstart\n // events are fired. Again, attribute to keyboard input modality.\n if (isFakeTouchstartFromScreenReader(event)) {\n this._modality.next('keyboard');\n return;\n }\n // Store the timestamp of this touch event, as it's used to distinguish between mouse events\n // triggered via mouse vs touch.\n this._lastTouchMs = Date.now();\n this._modality.next('touch');\n this._mostRecentTarget = _getEventTarget(event);\n };\n this._options = Object.assign(Object.assign({}, INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS), options);\n // Skip the first emission as it's null.\n this.modalityDetected = this._modality.pipe(skip(1));\n this.modalityChanged = this.modalityDetected.pipe(distinctUntilChanged());\n // If we're not in a browser, this service should do nothing, as there's no relevant input\n // modality to detect.\n if (_platform.isBrowser) {\n ngZone.runOutsideAngular(() => {\n document.addEventListener('keydown', this._onKeydown, modalityEventListenerOptions);\n document.addEventListener('mousedown', this._onMousedown, modalityEventListenerOptions);\n document.addEventListener('touchstart', this._onTouchstart, modalityEventListenerOptions);\n });\n }\n }\n /** The most recently detected input modality. */\n get mostRecentModality() {\n return this._modality.value;\n }\n ngOnDestroy() {\n this._modality.complete();\n if (this._platform.isBrowser) {\n document.removeEventListener('keydown', this._onKeydown, modalityEventListenerOptions);\n document.removeEventListener('mousedown', this._onMousedown, modalityEventListenerOptions);\n document.removeEventListener('touchstart', this._onTouchstart, modalityEventListenerOptions);\n }\n }\n}\nInputModalityDetector.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: InputModalityDetector, deps: [{ token: i1.Platform }, { token: i0.NgZone }, { token: DOCUMENT }, { token: INPUT_MODALITY_DETECTOR_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nInputModalityDetector.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: InputModalityDetector, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: InputModalityDetector, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: i1.Platform }, { type: i0.NgZone }, { type: Document, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [INPUT_MODALITY_DETECTOR_OPTIONS]\n }] }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst LIVE_ANNOUNCER_ELEMENT_TOKEN = new InjectionToken('liveAnnouncerElement', {\n providedIn: 'root',\n factory: LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY,\n});\n/** @docs-private */\nfunction LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY() {\n return null;\n}\n/** Injection token that can be used to configure the default options for the LiveAnnouncer. */\nconst LIVE_ANNOUNCER_DEFAULT_OPTIONS = new InjectionToken('LIVE_ANNOUNCER_DEFAULT_OPTIONS');\n\nclass LiveAnnouncer {\n constructor(elementToken, _ngZone, _document, _defaultOptions) {\n this._ngZone = _ngZone;\n this._defaultOptions = _defaultOptions;\n // We inject the live element and document as `any` because the constructor signature cannot\n // reference browser globals (HTMLElement, Document) on non-browser environments, since having\n // a class decorator causes TypeScript to preserve the constructor signature types.\n this._document = _document;\n this._liveElement = elementToken || this._createLiveElement();\n }\n announce(message, ...args) {\n const defaultOptions = this._defaultOptions;\n let politeness;\n let duration;\n if (args.length === 1 && typeof args[0] === 'number') {\n duration = args[0];\n }\n else {\n [politeness, duration] = args;\n }\n this.clear();\n clearTimeout(this._previousTimeout);\n if (!politeness) {\n politeness =\n defaultOptions && defaultOptions.politeness ? defaultOptions.politeness : 'polite';\n }\n if (duration == null && defaultOptions) {\n duration = defaultOptions.duration;\n }\n // TODO: ensure changing the politeness works on all environments we support.\n this._liveElement.setAttribute('aria-live', politeness);\n // This 100ms timeout is necessary for some browser + screen-reader combinations:\n // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.\n // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a\n // second time without clearing and then using a non-zero delay.\n // (using JAWS 17 at time of this writing).\n return this._ngZone.runOutsideAngular(() => {\n if (!this._currentPromise) {\n this._currentPromise = new Promise(resolve => (this._currentResolve = resolve));\n }\n clearTimeout(this._previousTimeout);\n this._previousTimeout = setTimeout(() => {\n this._liveElement.textContent = message;\n if (typeof duration === 'number') {\n this._previousTimeout = setTimeout(() => this.clear(), duration);\n }\n this._currentResolve();\n this._currentPromise = this._currentResolve = undefined;\n }, 100);\n return this._currentPromise;\n });\n }\n /**\n * Clears the current text from the announcer element. Can be used to prevent\n * screen readers from reading the text out again while the user is going\n * through the page landmarks.\n */\n clear() {\n if (this._liveElement) {\n this._liveElement.textContent = '';\n }\n }\n ngOnDestroy() {\n var _a, _b;\n clearTimeout(this._previousTimeout);\n (_a = this._liveElement) === null || _a === void 0 ? void 0 : _a.remove();\n this._liveElement = null;\n (_b = this._currentResolve) === null || _b === void 0 ? void 0 : _b.call(this);\n this._currentPromise = this._currentResolve = undefined;\n }\n _createLiveElement() {\n const elementClass = 'cdk-live-announcer-element';\n const previousElements = this._document.getElementsByClassName(elementClass);\n const liveEl = this._document.createElement('div');\n // Remove any old containers. This can happen when coming in from a server-side-rendered page.\n for (let i = 0; i < previousElements.length; i++) {\n previousElements[i].remove();\n }\n liveEl.classList.add(elementClass);\n liveEl.classList.add('cdk-visually-hidden');\n liveEl.setAttribute('aria-atomic', 'true');\n liveEl.setAttribute('aria-live', 'polite');\n this._document.body.appendChild(liveEl);\n return liveEl;\n }\n}\nLiveAnnouncer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: LiveAnnouncer, deps: [{ token: LIVE_ANNOUNCER_ELEMENT_TOKEN, optional: true }, { token: i0.NgZone }, { token: DOCUMENT }, { token: LIVE_ANNOUNCER_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nLiveAnnouncer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: LiveAnnouncer, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: LiveAnnouncer, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [LIVE_ANNOUNCER_ELEMENT_TOKEN]\n }] }, { type: i0.NgZone }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [LIVE_ANNOUNCER_DEFAULT_OPTIONS]\n }] }];\n } });\n/**\n * A directive that works similarly to aria-live, but uses the LiveAnnouncer to ensure compatibility\n * with a wider range of browsers and screen readers.\n */\nclass CdkAriaLive {\n constructor(_elementRef, _liveAnnouncer, _contentObserver, _ngZone) {\n this._elementRef = _elementRef;\n this._liveAnnouncer = _liveAnnouncer;\n this._contentObserver = _contentObserver;\n this._ngZone = _ngZone;\n this._politeness = 'polite';\n }\n /** The aria-live politeness level to use when announcing messages. */\n get politeness() {\n return this._politeness;\n }\n set politeness(value) {\n this._politeness = value === 'off' || value === 'assertive' ? value : 'polite';\n if (this._politeness === 'off') {\n if (this._subscription) {\n this._subscription.unsubscribe();\n this._subscription = null;\n }\n }\n else if (!this._subscription) {\n this._subscription = this._ngZone.runOutsideAngular(() => {\n return this._contentObserver.observe(this._elementRef).subscribe(() => {\n // Note that we use textContent here, rather than innerText, in order to avoid a reflow.\n const elementText = this._elementRef.nativeElement.textContent;\n // The `MutationObserver` fires also for attribute\n // changes which we don't want to announce.\n if (elementText !== this._previousAnnouncedText) {\n this._liveAnnouncer.announce(elementText, this._politeness);\n this._previousAnnouncedText = elementText;\n }\n });\n });\n }\n }\n ngOnDestroy() {\n if (this._subscription) {\n this._subscription.unsubscribe();\n }\n }\n}\nCdkAriaLive.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkAriaLive, deps: [{ token: i0.ElementRef }, { token: LiveAnnouncer }, { token: i1$1.ContentObserver }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });\nCdkAriaLive.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkAriaLive, selector: \"[cdkAriaLive]\", inputs: { politeness: [\"cdkAriaLive\", \"politeness\"] }, exportAs: [\"cdkAriaLive\"], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkAriaLive, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkAriaLive]',\n exportAs: 'cdkAriaLive',\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: LiveAnnouncer }, { type: i1$1.ContentObserver }, { type: i0.NgZone }]; }, propDecorators: { politeness: [{\n type: Input,\n args: ['cdkAriaLive']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** InjectionToken for FocusMonitorOptions. */\nconst FOCUS_MONITOR_DEFAULT_OPTIONS = new InjectionToken('cdk-focus-monitor-default-options');\n/**\n * Event listener options that enable capturing and also\n * mark the listener as passive if the browser supports it.\n */\nconst captureEventListenerOptions = normalizePassiveListenerOptions({\n passive: true,\n capture: true,\n});\n/** Monitors mouse and keyboard events to determine the cause of focus events. */\nclass FocusMonitor {\n constructor(_ngZone, _platform, _inputModalityDetector, \n /** @breaking-change 11.0.0 make document required */\n document, options) {\n this._ngZone = _ngZone;\n this._platform = _platform;\n this._inputModalityDetector = _inputModalityDetector;\n /** The focus origin that the next focus event is a result of. */\n this._origin = null;\n /** Whether the window has just been focused. */\n this._windowFocused = false;\n /**\n * Whether the origin was determined via a touch interaction. Necessary as properly attributing\n * focus events to touch interactions requires special logic.\n */\n this._originFromTouchInteraction = false;\n /** Map of elements being monitored to their info. */\n this._elementInfo = new Map();\n /** The number of elements currently being monitored. */\n this._monitoredElementCount = 0;\n /**\n * Keeps track of the root nodes to which we've currently bound a focus/blur handler,\n * as well as the number of monitored elements that they contain. We have to treat focus/blur\n * handlers differently from the rest of the events, because the browser won't emit events\n * to the document when focus moves inside of a shadow root.\n */\n this._rootNodeFocusListenerCount = new Map();\n /**\n * Event listener for `focus` events on the window.\n * Needs to be an arrow function in order to preserve the context when it gets bound.\n */\n this._windowFocusListener = () => {\n // Make a note of when the window regains focus, so we can\n // restore the origin info for the focused element.\n this._windowFocused = true;\n this._windowFocusTimeoutId = window.setTimeout(() => (this._windowFocused = false));\n };\n /** Subject for stopping our InputModalityDetector subscription. */\n this._stopInputModalityDetector = new Subject();\n /**\n * Event listener for `focus` and 'blur' events on the document.\n * Needs to be an arrow function in order to preserve the context when it gets bound.\n */\n this._rootNodeFocusAndBlurListener = (event) => {\n const target = _getEventTarget(event);\n const handler = event.type === 'focus' ? this._onFocus : this._onBlur;\n // We need to walk up the ancestor chain in order to support `checkChildren`.\n for (let element = target; element; element = element.parentElement) {\n handler.call(this, event, element);\n }\n };\n this._document = document;\n this._detectionMode = (options === null || options === void 0 ? void 0 : options.detectionMode) || 0 /* IMMEDIATE */;\n }\n monitor(element, checkChildren = false) {\n const nativeElement = coerceElement(element);\n // Do nothing if we're not on the browser platform or the passed in node isn't an element.\n if (!this._platform.isBrowser || nativeElement.nodeType !== 1) {\n return of(null);\n }\n // If the element is inside the shadow DOM, we need to bind our focus/blur listeners to\n // the shadow root, rather than the `document`, because the browser won't emit focus events\n // to the `document`, if focus is moving within the same shadow root.\n const rootNode = _getShadowRoot(nativeElement) || this._getDocument();\n const cachedInfo = this._elementInfo.get(nativeElement);\n // Check if we're already monitoring this element.\n if (cachedInfo) {\n if (checkChildren) {\n // TODO(COMP-318): this can be problematic, because it'll turn all non-checkChildren\n // observers into ones that behave as if `checkChildren` was turned on. We need a more\n // robust solution.\n cachedInfo.checkChildren = true;\n }\n return cachedInfo.subject;\n }\n // Create monitored element info.\n const info = {\n checkChildren: checkChildren,\n subject: new Subject(),\n rootNode,\n };\n this._elementInfo.set(nativeElement, info);\n this._registerGlobalListeners(info);\n return info.subject;\n }\n stopMonitoring(element) {\n const nativeElement = coerceElement(element);\n const elementInfo = this._elementInfo.get(nativeElement);\n if (elementInfo) {\n elementInfo.subject.complete();\n this._setClasses(nativeElement);\n this._elementInfo.delete(nativeElement);\n this._removeGlobalListeners(elementInfo);\n }\n }\n focusVia(element, origin, options) {\n const nativeElement = coerceElement(element);\n const focusedElement = this._getDocument().activeElement;\n // If the element is focused already, calling `focus` again won't trigger the event listener\n // which means that the focus classes won't be updated. If that's the case, update the classes\n // directly without waiting for an event.\n if (nativeElement === focusedElement) {\n this._getClosestElementsInfo(nativeElement).forEach(([currentElement, info]) => this._originChanged(currentElement, origin, info));\n }\n else {\n this._setOrigin(origin);\n // `focus` isn't available on the server\n if (typeof nativeElement.focus === 'function') {\n nativeElement.focus(options);\n }\n }\n }\n ngOnDestroy() {\n this._elementInfo.forEach((_info, element) => this.stopMonitoring(element));\n }\n /** Access injected document if available or fallback to global document reference */\n _getDocument() {\n return this._document || document;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n const doc = this._getDocument();\n return doc.defaultView || window;\n }\n _getFocusOrigin(focusEventTarget) {\n if (this._origin) {\n // If the origin was realized via a touch interaction, we need to perform additional checks\n // to determine whether the focus origin should be attributed to touch or program.\n if (this._originFromTouchInteraction) {\n return this._shouldBeAttributedToTouch(focusEventTarget) ? 'touch' : 'program';\n }\n else {\n return this._origin;\n }\n }\n // If the window has just regained focus, we can restore the most recent origin from before the\n // window blurred. Otherwise, we've reached the point where we can't identify the source of the\n // focus. This typically means one of two things happened:\n //\n // 1) The element was programmatically focused, or\n // 2) The element was focused via screen reader navigation (which generally doesn't fire\n // events).\n //\n // Because we can't distinguish between these two cases, we default to setting `program`.\n return this._windowFocused && this._lastFocusOrigin ? this._lastFocusOrigin : 'program';\n }\n /**\n * Returns whether the focus event should be attributed to touch. Recall that in IMMEDIATE mode, a\n * touch origin isn't immediately reset at the next tick (see _setOrigin). This means that when we\n * handle a focus event following a touch interaction, we need to determine whether (1) the focus\n * event was directly caused by the touch interaction or (2) the focus event was caused by a\n * subsequent programmatic focus call triggered by the touch interaction.\n * @param focusEventTarget The target of the focus event under examination.\n */\n _shouldBeAttributedToTouch(focusEventTarget) {\n // Please note that this check is not perfect. Consider the following edge case:\n //\n //
\n //
\n //
\n //\n // Suppose there is a FocusMonitor in IMMEDIATE mode attached to #parent. When the user touches\n // #child, #parent is programmatically focused. This code will attribute the focus to touch\n // instead of program. This is a relatively minor edge-case that can be worked around by using\n // focusVia(parent, 'program') to focus #parent.\n return (this._detectionMode === 1 /* EVENTUAL */ ||\n !!(focusEventTarget === null || focusEventTarget === void 0 ? void 0 : focusEventTarget.contains(this._inputModalityDetector._mostRecentTarget)));\n }\n /**\n * Sets the focus classes on the element based on the given focus origin.\n * @param element The element to update the classes on.\n * @param origin The focus origin.\n */\n _setClasses(element, origin) {\n element.classList.toggle('cdk-focused', !!origin);\n element.classList.toggle('cdk-touch-focused', origin === 'touch');\n element.classList.toggle('cdk-keyboard-focused', origin === 'keyboard');\n element.classList.toggle('cdk-mouse-focused', origin === 'mouse');\n element.classList.toggle('cdk-program-focused', origin === 'program');\n }\n /**\n * Updates the focus origin. If we're using immediate detection mode, we schedule an async\n * function to clear the origin at the end of a timeout. The duration of the timeout depends on\n * the origin being set.\n * @param origin The origin to set.\n * @param isFromInteraction Whether we are setting the origin from an interaction event.\n */\n _setOrigin(origin, isFromInteraction = false) {\n this._ngZone.runOutsideAngular(() => {\n this._origin = origin;\n this._originFromTouchInteraction = origin === 'touch' && isFromInteraction;\n // If we're in IMMEDIATE mode, reset the origin at the next tick (or in `TOUCH_BUFFER_MS` ms\n // for a touch event). We reset the origin at the next tick because Firefox focuses one tick\n // after the interaction event. We wait `TOUCH_BUFFER_MS` ms before resetting the origin for\n // a touch event because when a touch event is fired, the associated focus event isn't yet in\n // the event queue. Before doing so, clear any pending timeouts.\n if (this._detectionMode === 0 /* IMMEDIATE */) {\n clearTimeout(this._originTimeoutId);\n const ms = this._originFromTouchInteraction ? TOUCH_BUFFER_MS : 1;\n this._originTimeoutId = setTimeout(() => (this._origin = null), ms);\n }\n });\n }\n /**\n * Handles focus events on a registered element.\n * @param event The focus event.\n * @param element The monitored element.\n */\n _onFocus(event, element) {\n // NOTE(mmalerba): We currently set the classes based on the focus origin of the most recent\n // focus event affecting the monitored element. If we want to use the origin of the first event\n // instead we should check for the cdk-focused class here and return if the element already has\n // it. (This only matters for elements that have includesChildren = true).\n // If we are not counting child-element-focus as focused, make sure that the event target is the\n // monitored element itself.\n const elementInfo = this._elementInfo.get(element);\n const focusEventTarget = _getEventTarget(event);\n if (!elementInfo || (!elementInfo.checkChildren && element !== focusEventTarget)) {\n return;\n }\n this._originChanged(element, this._getFocusOrigin(focusEventTarget), elementInfo);\n }\n /**\n * Handles blur events on a registered element.\n * @param event The blur event.\n * @param element The monitored element.\n */\n _onBlur(event, element) {\n // If we are counting child-element-focus as focused, make sure that we aren't just blurring in\n // order to focus another child of the monitored element.\n const elementInfo = this._elementInfo.get(element);\n if (!elementInfo ||\n (elementInfo.checkChildren &&\n event.relatedTarget instanceof Node &&\n element.contains(event.relatedTarget))) {\n return;\n }\n this._setClasses(element);\n this._emitOrigin(elementInfo.subject, null);\n }\n _emitOrigin(subject, origin) {\n this._ngZone.run(() => subject.next(origin));\n }\n _registerGlobalListeners(elementInfo) {\n if (!this._platform.isBrowser) {\n return;\n }\n const rootNode = elementInfo.rootNode;\n const rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode) || 0;\n if (!rootNodeFocusListeners) {\n this._ngZone.runOutsideAngular(() => {\n rootNode.addEventListener('focus', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n rootNode.addEventListener('blur', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n });\n }\n this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners + 1);\n // Register global listeners when first element is monitored.\n if (++this._monitoredElementCount === 1) {\n // Note: we listen to events in the capture phase so we\n // can detect them even if the user stops propagation.\n this._ngZone.runOutsideAngular(() => {\n const window = this._getWindow();\n window.addEventListener('focus', this._windowFocusListener);\n });\n // The InputModalityDetector is also just a collection of global listeners.\n this._inputModalityDetector.modalityDetected\n .pipe(takeUntil(this._stopInputModalityDetector))\n .subscribe(modality => {\n this._setOrigin(modality, true /* isFromInteraction */);\n });\n }\n }\n _removeGlobalListeners(elementInfo) {\n const rootNode = elementInfo.rootNode;\n if (this._rootNodeFocusListenerCount.has(rootNode)) {\n const rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode);\n if (rootNodeFocusListeners > 1) {\n this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners - 1);\n }\n else {\n rootNode.removeEventListener('focus', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n rootNode.removeEventListener('blur', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n this._rootNodeFocusListenerCount.delete(rootNode);\n }\n }\n // Unregister global listeners when last element is unmonitored.\n if (!--this._monitoredElementCount) {\n const window = this._getWindow();\n window.removeEventListener('focus', this._windowFocusListener);\n // Equivalently, stop our InputModalityDetector subscription.\n this._stopInputModalityDetector.next();\n // Clear timeouts for all potentially pending timeouts to prevent the leaks.\n clearTimeout(this._windowFocusTimeoutId);\n clearTimeout(this._originTimeoutId);\n }\n }\n /** Updates all the state on an element once its focus origin has changed. */\n _originChanged(element, origin, elementInfo) {\n this._setClasses(element, origin);\n this._emitOrigin(elementInfo.subject, origin);\n this._lastFocusOrigin = origin;\n }\n /**\n * Collects the `MonitoredElementInfo` of a particular element and\n * all of its ancestors that have enabled `checkChildren`.\n * @param element Element from which to start the search.\n */\n _getClosestElementsInfo(element) {\n const results = [];\n this._elementInfo.forEach((info, currentElement) => {\n if (currentElement === element || (info.checkChildren && currentElement.contains(element))) {\n results.push([currentElement, info]);\n }\n });\n return results;\n }\n}\nFocusMonitor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusMonitor, deps: [{ token: i0.NgZone }, { token: i1.Platform }, { token: InputModalityDetector }, { token: DOCUMENT, optional: true }, { token: FOCUS_MONITOR_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nFocusMonitor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusMonitor, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FocusMonitor, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: i0.NgZone }, { type: i1.Platform }, { type: InputModalityDetector }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [FOCUS_MONITOR_DEFAULT_OPTIONS]\n }] }];\n } });\n/**\n * Directive that determines how a particular element was focused (via keyboard, mouse, touch, or\n * programmatically) and adds corresponding classes to the element.\n *\n * There are two variants of this directive:\n * 1) cdkMonitorElementFocus: does not consider an element to be focused if one of its children is\n * focused.\n * 2) cdkMonitorSubtreeFocus: considers an element focused if it or any of its children are focused.\n */\nclass CdkMonitorFocus {\n constructor(_elementRef, _focusMonitor) {\n this._elementRef = _elementRef;\n this._focusMonitor = _focusMonitor;\n this.cdkFocusChange = new EventEmitter();\n }\n ngAfterViewInit() {\n const element = this._elementRef.nativeElement;\n this._monitorSubscription = this._focusMonitor\n .monitor(element, element.nodeType === 1 && element.hasAttribute('cdkMonitorSubtreeFocus'))\n .subscribe(origin => this.cdkFocusChange.emit(origin));\n }\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n if (this._monitorSubscription) {\n this._monitorSubscription.unsubscribe();\n }\n }\n}\nCdkMonitorFocus.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkMonitorFocus, deps: [{ token: i0.ElementRef }, { token: FocusMonitor }], target: i0.ɵɵFactoryTarget.Directive });\nCdkMonitorFocus.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkMonitorFocus, selector: \"[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]\", outputs: { cdkFocusChange: \"cdkFocusChange\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkMonitorFocus, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]',\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: FocusMonitor }]; }, propDecorators: { cdkFocusChange: [{\n type: Output\n }] } });\n\n/** CSS class applied to the document body when in black-on-white high-contrast mode. */\nconst BLACK_ON_WHITE_CSS_CLASS = 'cdk-high-contrast-black-on-white';\n/** CSS class applied to the document body when in white-on-black high-contrast mode. */\nconst WHITE_ON_BLACK_CSS_CLASS = 'cdk-high-contrast-white-on-black';\n/** CSS class applied to the document body when in high-contrast mode. */\nconst HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS = 'cdk-high-contrast-active';\n/**\n * Service to determine whether the browser is currently in a high-contrast-mode environment.\n *\n * Microsoft Windows supports an accessibility feature called \"High Contrast Mode\". This mode\n * changes the appearance of all applications, including web applications, to dramatically increase\n * contrast.\n *\n * IE, Edge, and Firefox currently support this mode. Chrome does not support Windows High Contrast\n * Mode. This service does not detect high-contrast mode as added by the Chrome \"High Contrast\"\n * browser extension.\n */\nclass HighContrastModeDetector {\n constructor(_platform, document) {\n this._platform = _platform;\n this._document = document;\n }\n /** Gets the current high-contrast-mode for the page. */\n getHighContrastMode() {\n if (!this._platform.isBrowser) {\n return 0 /* NONE */;\n }\n // Create a test element with an arbitrary background-color that is neither black nor\n // white; high-contrast mode will coerce the color to either black or white. Also ensure that\n // appending the test element to the DOM does not affect layout by absolutely positioning it\n const testElement = this._document.createElement('div');\n testElement.style.backgroundColor = 'rgb(1,2,3)';\n testElement.style.position = 'absolute';\n this._document.body.appendChild(testElement);\n // Get the computed style for the background color, collapsing spaces to normalize between\n // browsers. Once we get this color, we no longer need the test element. Access the `window`\n // via the document so we can fake it in tests. Note that we have extra null checks, because\n // this logic will likely run during app bootstrap and throwing can break the entire app.\n const documentWindow = this._document.defaultView || window;\n const computedStyle = documentWindow && documentWindow.getComputedStyle\n ? documentWindow.getComputedStyle(testElement)\n : null;\n const computedColor = ((computedStyle && computedStyle.backgroundColor) || '').replace(/ /g, '');\n testElement.remove();\n switch (computedColor) {\n case 'rgb(0,0,0)':\n return 2 /* WHITE_ON_BLACK */;\n case 'rgb(255,255,255)':\n return 1 /* BLACK_ON_WHITE */;\n }\n return 0 /* NONE */;\n }\n /** Applies CSS classes indicating high-contrast mode to document body (browser-only). */\n _applyBodyHighContrastModeCssClasses() {\n if (!this._hasCheckedHighContrastMode && this._platform.isBrowser && this._document.body) {\n const bodyClasses = this._document.body.classList;\n // IE11 doesn't support `classList` operations with multiple arguments\n bodyClasses.remove(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);\n bodyClasses.remove(BLACK_ON_WHITE_CSS_CLASS);\n bodyClasses.remove(WHITE_ON_BLACK_CSS_CLASS);\n this._hasCheckedHighContrastMode = true;\n const mode = this.getHighContrastMode();\n if (mode === 1 /* BLACK_ON_WHITE */) {\n bodyClasses.add(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);\n bodyClasses.add(BLACK_ON_WHITE_CSS_CLASS);\n }\n else if (mode === 2 /* WHITE_ON_BLACK */) {\n bodyClasses.add(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);\n bodyClasses.add(WHITE_ON_BLACK_CSS_CLASS);\n }\n }\n }\n}\nHighContrastModeDetector.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: HighContrastModeDetector, deps: [{ token: i1.Platform }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });\nHighContrastModeDetector.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: HighContrastModeDetector, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: HighContrastModeDetector, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: i1.Platform }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass A11yModule {\n constructor(highContrastModeDetector) {\n highContrastModeDetector._applyBodyHighContrastModeCssClasses();\n }\n}\nA11yModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: A11yModule, deps: [{ token: HighContrastModeDetector }], target: i0.ɵɵFactoryTarget.NgModule });\nA11yModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: A11yModule, declarations: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus], imports: [ObserversModule], exports: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus] });\nA11yModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: A11yModule, imports: [[ObserversModule]] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: A11yModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [ObserversModule],\n declarations: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus],\n exports: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus],\n }]\n }], ctorParameters: function () { return [{ type: HighContrastModeDetector }]; } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { A11yModule, ActiveDescendantKeyManager, AriaDescriber, CDK_DESCRIBEDBY_HOST_ATTRIBUTE, CDK_DESCRIBEDBY_ID_PREFIX, CdkAriaLive, CdkMonitorFocus, CdkTrapFocus, ConfigurableFocusTrap, ConfigurableFocusTrapFactory, EventListenerFocusTrapInertStrategy, FOCUS_MONITOR_DEFAULT_OPTIONS, FOCUS_TRAP_INERT_STRATEGY, FocusKeyManager, FocusMonitor, FocusTrap, FocusTrapFactory, HighContrastModeDetector, INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS, INPUT_MODALITY_DETECTOR_OPTIONS, InputModalityDetector, InteractivityChecker, IsFocusableConfig, LIVE_ANNOUNCER_DEFAULT_OPTIONS, LIVE_ANNOUNCER_ELEMENT_TOKEN, LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY, ListKeyManager, LiveAnnouncer, MESSAGES_CONTAINER_ID, isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, inject, EventEmitter, Injectable, Optional, Inject, Directive, Output, Input, NgModule } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Injection token used to inject the document into Directionality.\n * This is used so that the value can be faked in tests.\n *\n * We can't use the real document in tests because changing the real `dir` causes geometry-based\n * tests in Safari to fail.\n *\n * We also can't re-provide the DOCUMENT token from platform-brower because the unit tests\n * themselves use things like `querySelector` in test code.\n *\n * This token is defined in a separate file from Directionality as a workaround for\n * https://github.com/angular/angular/issues/22559\n *\n * @docs-private\n */\nconst DIR_DOCUMENT = new InjectionToken('cdk-dir-doc', {\n providedIn: 'root',\n factory: DIR_DOCUMENT_FACTORY,\n});\n/** @docs-private */\nfunction DIR_DOCUMENT_FACTORY() {\n return inject(DOCUMENT);\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Regex that matches locales with an RTL script. Taken from `goog.i18n.bidi.isRtlLanguage`. */\nconst RTL_LOCALE_PATTERN = /^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;\n/** Resolves a string value to a specific direction. */\nfunction _resolveDirectionality(rawValue) {\n const value = (rawValue === null || rawValue === void 0 ? void 0 : rawValue.toLowerCase()) || '';\n if (value === 'auto' && typeof navigator !== 'undefined' && (navigator === null || navigator === void 0 ? void 0 : navigator.language)) {\n return RTL_LOCALE_PATTERN.test(navigator.language) ? 'rtl' : 'ltr';\n }\n return value === 'rtl' ? 'rtl' : 'ltr';\n}\n/**\n * The directionality (LTR / RTL) context for the application (or a subtree of it).\n * Exposes the current direction and a stream of direction changes.\n */\nclass Directionality {\n constructor(_document) {\n /** The current 'ltr' or 'rtl' value. */\n this.value = 'ltr';\n /** Stream that emits whenever the 'ltr' / 'rtl' state changes. */\n this.change = new EventEmitter();\n if (_document) {\n const bodyDir = _document.body ? _document.body.dir : null;\n const htmlDir = _document.documentElement ? _document.documentElement.dir : null;\n this.value = _resolveDirectionality(bodyDir || htmlDir || 'ltr');\n }\n }\n ngOnDestroy() {\n this.change.complete();\n }\n}\nDirectionality.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Directionality, deps: [{ token: DIR_DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nDirectionality.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Directionality, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Directionality, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DIR_DOCUMENT]\n }] }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Directive to listen for changes of direction of part of the DOM.\n *\n * Provides itself as Directionality such that descendant directives only need to ever inject\n * Directionality to get the closest direction.\n */\nclass Dir {\n constructor() {\n /** Normalized direction that accounts for invalid/unsupported values. */\n this._dir = 'ltr';\n /** Whether the `value` has been set to its initial value. */\n this._isInitialized = false;\n /** Event emitted when the direction changes. */\n this.change = new EventEmitter();\n }\n /** @docs-private */\n get dir() {\n return this._dir;\n }\n set dir(value) {\n const previousValue = this._dir;\n // Note: `_resolveDirectionality` resolves the language based on the browser's language,\n // whereas the browser does it based on the content of the element. Since doing so based\n // on the content can be expensive, for now we're doing the simpler matching.\n this._dir = _resolveDirectionality(value);\n this._rawDir = value;\n if (previousValue !== this._dir && this._isInitialized) {\n this.change.emit(this._dir);\n }\n }\n /** Current layout direction of the element. */\n get value() {\n return this.dir;\n }\n /** Initialize once default value has been set. */\n ngAfterContentInit() {\n this._isInitialized = true;\n }\n ngOnDestroy() {\n this.change.complete();\n }\n}\nDir.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Dir, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nDir.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: Dir, selector: \"[dir]\", inputs: { dir: \"dir\" }, outputs: { change: \"dirChange\" }, host: { properties: { \"attr.dir\": \"_rawDir\" } }, providers: [{ provide: Directionality, useExisting: Dir }], exportAs: [\"dir\"], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Dir, decorators: [{\n type: Directive,\n args: [{\n selector: '[dir]',\n providers: [{ provide: Directionality, useExisting: Dir }],\n host: { '[attr.dir]': '_rawDir' },\n exportAs: 'dir',\n }]\n }], propDecorators: { change: [{\n type: Output,\n args: ['dirChange']\n }], dir: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass BidiModule {\n}\nBidiModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: BidiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nBidiModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: BidiModule, declarations: [Dir], exports: [Dir] });\nBidiModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: BidiModule });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: BidiModule, decorators: [{\n type: NgModule,\n args: [{\n exports: [Dir],\n declarations: [Dir],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BidiModule, DIR_DOCUMENT, Dir, Directionality };\n","import { ElementRef } from '@angular/core';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Coerces a data-bound value (typically a string) to a boolean. */\nfunction coerceBooleanProperty(value) {\n return value != null && `${value}` !== 'false';\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction coerceNumberProperty(value, fallbackValue = 0) {\n return _isNumberValue(value) ? Number(value) : fallbackValue;\n}\n/**\n * Whether the provided value is considered a number.\n * @docs-private\n */\nfunction _isNumberValue(value) {\n // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,\n // and other non-number values as NaN, where Number just uses 0) but it considers the string\n // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.\n return !isNaN(parseFloat(value)) && !isNaN(Number(value));\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction coerceArray(value) {\n return Array.isArray(value) ? value : [value];\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Coerces a value to a CSS pixel value. */\nfunction coerceCssPixelValue(value) {\n if (value == null) {\n return '';\n }\n return typeof value === 'string' ? value : `${value}px`;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Coerces an ElementRef or an Element into an element.\n * Useful for APIs that can accept either a ref or the native element itself.\n */\nfunction coerceElement(elementOrRef) {\n return elementOrRef instanceof ElementRef ? elementOrRef.nativeElement : elementOrRef;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Coerces a value to an array of trimmed non-empty strings.\n * Any input that is not an array, `null` or `undefined` will be turned into a string\n * via `toString()` and subsequently split with the given separator.\n * `null` and `undefined` will result in an empty array.\n * This results in the following outcomes:\n * - `null` -> `[]`\n * - `[null]` -> `[\"null\"]`\n * - `[\"a\", \"b \", \" \"]` -> `[\"a\", \"b\"]`\n * - `[1, [2, 3]]` -> `[\"1\", \"2,3\"]`\n * - `[{ a: 0 }]` -> `[\"[object Object]\"]`\n * - `{ a: 0 }` -> `[\"[object\", \"Object]\"]`\n *\n * Useful for defining CSS classes or table columns.\n * @param value the value to coerce into an array of strings\n * @param separator split-separator if value isn't an array\n */\nfunction coerceStringArray(value, separator = /\\s+/) {\n const result = [];\n if (value != null) {\n const sourceValues = Array.isArray(value) ? value : `${value}`.split(separator);\n for (const sourceValue of sourceValues) {\n const trimmedString = `${sourceValue}`.trim();\n if (trimmedString) {\n result.push(trimmedString);\n }\n }\n }\n return result;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport { _isNumberValue, coerceArray, coerceBooleanProperty, coerceCssPixelValue, coerceElement, coerceNumberProperty, coerceStringArray };\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst MAC_ENTER = 3;\nconst BACKSPACE = 8;\nconst TAB = 9;\nconst NUM_CENTER = 12;\nconst ENTER = 13;\nconst SHIFT = 16;\nconst CONTROL = 17;\nconst ALT = 18;\nconst PAUSE = 19;\nconst CAPS_LOCK = 20;\nconst ESCAPE = 27;\nconst SPACE = 32;\nconst PAGE_UP = 33;\nconst PAGE_DOWN = 34;\nconst END = 35;\nconst HOME = 36;\nconst LEFT_ARROW = 37;\nconst UP_ARROW = 38;\nconst RIGHT_ARROW = 39;\nconst DOWN_ARROW = 40;\nconst PLUS_SIGN = 43;\nconst PRINT_SCREEN = 44;\nconst INSERT = 45;\nconst DELETE = 46;\nconst ZERO = 48;\nconst ONE = 49;\nconst TWO = 50;\nconst THREE = 51;\nconst FOUR = 52;\nconst FIVE = 53;\nconst SIX = 54;\nconst SEVEN = 55;\nconst EIGHT = 56;\nconst NINE = 57;\nconst FF_SEMICOLON = 59; // Firefox (Gecko) fires this for semicolon instead of 186\nconst FF_EQUALS = 61; // Firefox (Gecko) fires this for equals instead of 187\nconst QUESTION_MARK = 63;\nconst AT_SIGN = 64;\nconst A = 65;\nconst B = 66;\nconst C = 67;\nconst D = 68;\nconst E = 69;\nconst F = 70;\nconst G = 71;\nconst H = 72;\nconst I = 73;\nconst J = 74;\nconst K = 75;\nconst L = 76;\nconst M = 77;\nconst N = 78;\nconst O = 79;\nconst P = 80;\nconst Q = 81;\nconst R = 82;\nconst S = 83;\nconst T = 84;\nconst U = 85;\nconst V = 86;\nconst W = 87;\nconst X = 88;\nconst Y = 89;\nconst Z = 90;\nconst META = 91; // WIN_KEY_LEFT\nconst MAC_WK_CMD_LEFT = 91;\nconst MAC_WK_CMD_RIGHT = 93;\nconst CONTEXT_MENU = 93;\nconst NUMPAD_ZERO = 96;\nconst NUMPAD_ONE = 97;\nconst NUMPAD_TWO = 98;\nconst NUMPAD_THREE = 99;\nconst NUMPAD_FOUR = 100;\nconst NUMPAD_FIVE = 101;\nconst NUMPAD_SIX = 102;\nconst NUMPAD_SEVEN = 103;\nconst NUMPAD_EIGHT = 104;\nconst NUMPAD_NINE = 105;\nconst NUMPAD_MULTIPLY = 106;\nconst NUMPAD_PLUS = 107;\nconst NUMPAD_MINUS = 109;\nconst NUMPAD_PERIOD = 110;\nconst NUMPAD_DIVIDE = 111;\nconst F1 = 112;\nconst F2 = 113;\nconst F3 = 114;\nconst F4 = 115;\nconst F5 = 116;\nconst F6 = 117;\nconst F7 = 118;\nconst F8 = 119;\nconst F9 = 120;\nconst F10 = 121;\nconst F11 = 122;\nconst F12 = 123;\nconst NUM_LOCK = 144;\nconst SCROLL_LOCK = 145;\nconst FIRST_MEDIA = 166;\nconst FF_MINUS = 173;\nconst MUTE = 173; // Firefox (Gecko) fires 181 for MUTE\nconst VOLUME_DOWN = 174; // Firefox (Gecko) fires 182 for VOLUME_DOWN\nconst VOLUME_UP = 175; // Firefox (Gecko) fires 183 for VOLUME_UP\nconst FF_MUTE = 181;\nconst FF_VOLUME_DOWN = 182;\nconst LAST_MEDIA = 183;\nconst FF_VOLUME_UP = 183;\nconst SEMICOLON = 186; // Firefox (Gecko) fires 59 for SEMICOLON\nconst EQUALS = 187; // Firefox (Gecko) fires 61 for EQUALS\nconst COMMA = 188;\nconst DASH = 189; // Firefox (Gecko) fires 173 for DASH/MINUS\nconst PERIOD = 190;\nconst SLASH = 191;\nconst APOSTROPHE = 192;\nconst TILDE = 192;\nconst OPEN_SQUARE_BRACKET = 219;\nconst BACKSLASH = 220;\nconst CLOSE_SQUARE_BRACKET = 221;\nconst SINGLE_QUOTE = 222;\nconst MAC_META = 224;\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Checks whether a modifier key is pressed.\n * @param event Event to be checked.\n */\nfunction hasModifierKey(event, ...modifiers) {\n if (modifiers.length) {\n return modifiers.some(modifier => event[modifier]);\n }\n return event.altKey || event.shiftKey || event.ctrlKey || event.metaKey;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { A, ALT, APOSTROPHE, AT_SIGN, B, BACKSLASH, BACKSPACE, C, CAPS_LOCK, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, D, DASH, DELETE, DOWN_ARROW, E, EIGHT, END, ENTER, EQUALS, ESCAPE, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FOUR, G, H, HOME, I, INSERT, J, K, L, LAST_MEDIA, LEFT_ARROW, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, META, MUTE, N, NINE, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PAUSE, PERIOD, PLUS_SIGN, PRINT_SCREEN, Q, QUESTION_MARK, R, RIGHT_ARROW, S, SCROLL_LOCK, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, T, TAB, THREE, TILDE, TWO, U, UP_ARROW, V, VOLUME_DOWN, VOLUME_UP, W, X, Y, Z, ZERO, hasModifierKey };\n","import { coerceElement, coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport * as i0 from '@angular/core';\nimport { Injectable, EventEmitter, Directive, Output, Input, NgModule } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Factory that creates a new MutationObserver and allows us to stub it out in unit tests.\n * @docs-private\n */\nclass MutationObserverFactory {\n create(callback) {\n return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);\n }\n}\nMutationObserverFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MutationObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\nMutationObserverFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MutationObserverFactory, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MutationObserverFactory, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n/** An injectable service that allows watching elements for changes to their content. */\nclass ContentObserver {\n constructor(_mutationObserverFactory) {\n this._mutationObserverFactory = _mutationObserverFactory;\n /** Keeps track of the existing MutationObservers so they can be reused. */\n this._observedElements = new Map();\n }\n ngOnDestroy() {\n this._observedElements.forEach((_, element) => this._cleanupObserver(element));\n }\n observe(elementOrRef) {\n const element = coerceElement(elementOrRef);\n return new Observable((observer) => {\n const stream = this._observeElement(element);\n const subscription = stream.subscribe(observer);\n return () => {\n subscription.unsubscribe();\n this._unobserveElement(element);\n };\n });\n }\n /**\n * Observes the given element by using the existing MutationObserver if available, or creating a\n * new one if not.\n */\n _observeElement(element) {\n if (!this._observedElements.has(element)) {\n const stream = new Subject();\n const observer = this._mutationObserverFactory.create(mutations => stream.next(mutations));\n if (observer) {\n observer.observe(element, {\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n this._observedElements.set(element, { observer, stream, count: 1 });\n }\n else {\n this._observedElements.get(element).count++;\n }\n return this._observedElements.get(element).stream;\n }\n /**\n * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is\n * observing this element.\n */\n _unobserveElement(element) {\n if (this._observedElements.has(element)) {\n this._observedElements.get(element).count--;\n if (!this._observedElements.get(element).count) {\n this._cleanupObserver(element);\n }\n }\n }\n /** Clean up the underlying MutationObserver for the specified element. */\n _cleanupObserver(element) {\n if (this._observedElements.has(element)) {\n const { observer, stream } = this._observedElements.get(element);\n if (observer) {\n observer.disconnect();\n }\n stream.complete();\n this._observedElements.delete(element);\n }\n }\n}\nContentObserver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ContentObserver, deps: [{ token: MutationObserverFactory }], target: i0.ɵɵFactoryTarget.Injectable });\nContentObserver.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ContentObserver, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ContentObserver, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () { return [{ type: MutationObserverFactory }]; } });\n/**\n * Directive that triggers a callback whenever the content of\n * its associated element has changed.\n */\nclass CdkObserveContent {\n constructor(_contentObserver, _elementRef, _ngZone) {\n this._contentObserver = _contentObserver;\n this._elementRef = _elementRef;\n this._ngZone = _ngZone;\n /** Event emitted for each change in the element's content. */\n this.event = new EventEmitter();\n this._disabled = false;\n this._currentSubscription = null;\n }\n /**\n * Whether observing content is disabled. This option can be used\n * to disconnect the underlying MutationObserver until it is needed.\n */\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n this._disabled ? this._unsubscribe() : this._subscribe();\n }\n /** Debounce interval for emitting the changes. */\n get debounce() {\n return this._debounce;\n }\n set debounce(value) {\n this._debounce = coerceNumberProperty(value);\n this._subscribe();\n }\n ngAfterContentInit() {\n if (!this._currentSubscription && !this.disabled) {\n this._subscribe();\n }\n }\n ngOnDestroy() {\n this._unsubscribe();\n }\n _subscribe() {\n this._unsubscribe();\n const stream = this._contentObserver.observe(this._elementRef);\n // TODO(mmalerba): We shouldn't be emitting on this @Output() outside the zone.\n // Consider brining it back inside the zone next time we're making breaking changes.\n // Bringing it back inside can cause things like infinite change detection loops and changed\n // after checked errors if people's code isn't handling it properly.\n this._ngZone.runOutsideAngular(() => {\n this._currentSubscription = (this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream).subscribe(this.event);\n });\n }\n _unsubscribe() {\n var _a;\n (_a = this._currentSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();\n }\n}\nCdkObserveContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkObserveContent, deps: [{ token: ContentObserver }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });\nCdkObserveContent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkObserveContent, selector: \"[cdkObserveContent]\", inputs: { disabled: [\"cdkObserveContentDisabled\", \"disabled\"], debounce: \"debounce\" }, outputs: { event: \"cdkObserveContent\" }, exportAs: [\"cdkObserveContent\"], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkObserveContent, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkObserveContent]',\n exportAs: 'cdkObserveContent',\n }]\n }], ctorParameters: function () { return [{ type: ContentObserver }, { type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { event: [{\n type: Output,\n args: ['cdkObserveContent']\n }], disabled: [{\n type: Input,\n args: ['cdkObserveContentDisabled']\n }], debounce: [{\n type: Input\n }] } });\nclass ObserversModule {\n}\nObserversModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ObserversModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nObserversModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ObserversModule, declarations: [CdkObserveContent], exports: [CdkObserveContent] });\nObserversModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ObserversModule, providers: [MutationObserverFactory] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ObserversModule, decorators: [{\n type: NgModule,\n args: [{\n exports: [CdkObserveContent],\n declarations: [CdkObserveContent],\n providers: [MutationObserverFactory],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CdkObserveContent, ContentObserver, MutationObserverFactory, ObserversModule };\n","import * as i1 from '@angular/cdk/scrolling';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nexport { CdkScrollable, ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';\nimport * as i6 from '@angular/common';\nimport { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Injectable, Inject, ElementRef, Optional, ApplicationRef, InjectionToken, Directive, EventEmitter, Input, Output, NgModule } from '@angular/core';\nimport { coerceCssPixelValue, coerceArray, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport * as i1$1 from '@angular/cdk/platform';\nimport { supportsScrollBehavior, _isTestEnvironment, _getEventTarget } from '@angular/cdk/platform';\nimport * as i5 from '@angular/cdk/bidi';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport { DomPortalOutlet, TemplatePortal, PortalModule } from '@angular/cdk/portal';\nimport { Subject, Subscription, merge } from 'rxjs';\nimport { take, takeUntil, takeWhile } from 'rxjs/operators';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst scrollBehaviorSupported = supportsScrollBehavior();\n/**\n * Strategy that will prevent the user from scrolling while the overlay is visible.\n */\nclass BlockScrollStrategy {\n constructor(_viewportRuler, document) {\n this._viewportRuler = _viewportRuler;\n this._previousHTMLStyles = { top: '', left: '' };\n this._isEnabled = false;\n this._document = document;\n }\n /** Attaches this scroll strategy to an overlay. */\n attach() { }\n /** Blocks page-level scroll while the attached overlay is open. */\n enable() {\n if (this._canBeEnabled()) {\n const root = this._document.documentElement;\n this._previousScrollPosition = this._viewportRuler.getViewportScrollPosition();\n // Cache the previous inline styles in case the user had set them.\n this._previousHTMLStyles.left = root.style.left || '';\n this._previousHTMLStyles.top = root.style.top || '';\n // Note: we're using the `html` node, instead of the `body`, because the `body` may\n // have the user agent margin, whereas the `html` is guaranteed not to have one.\n root.style.left = coerceCssPixelValue(-this._previousScrollPosition.left);\n root.style.top = coerceCssPixelValue(-this._previousScrollPosition.top);\n root.classList.add('cdk-global-scrollblock');\n this._isEnabled = true;\n }\n }\n /** Unblocks page-level scroll while the attached overlay is open. */\n disable() {\n if (this._isEnabled) {\n const html = this._document.documentElement;\n const body = this._document.body;\n const htmlStyle = html.style;\n const bodyStyle = body.style;\n const previousHtmlScrollBehavior = htmlStyle.scrollBehavior || '';\n const previousBodyScrollBehavior = bodyStyle.scrollBehavior || '';\n this._isEnabled = false;\n htmlStyle.left = this._previousHTMLStyles.left;\n htmlStyle.top = this._previousHTMLStyles.top;\n html.classList.remove('cdk-global-scrollblock');\n // Disable user-defined smooth scrolling temporarily while we restore the scroll position.\n // See https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior\n // Note that we don't mutate the property if the browser doesn't support `scroll-behavior`,\n // because it can throw off feature detections in `supportsScrollBehavior` which\n // checks for `'scrollBehavior' in documentElement.style`.\n if (scrollBehaviorSupported) {\n htmlStyle.scrollBehavior = bodyStyle.scrollBehavior = 'auto';\n }\n window.scroll(this._previousScrollPosition.left, this._previousScrollPosition.top);\n if (scrollBehaviorSupported) {\n htmlStyle.scrollBehavior = previousHtmlScrollBehavior;\n bodyStyle.scrollBehavior = previousBodyScrollBehavior;\n }\n }\n }\n _canBeEnabled() {\n // Since the scroll strategies can't be singletons, we have to use a global CSS class\n // (`cdk-global-scrollblock`) to make sure that we don't try to disable global\n // scrolling multiple times.\n const html = this._document.documentElement;\n if (html.classList.contains('cdk-global-scrollblock') || this._isEnabled) {\n return false;\n }\n const body = this._document.body;\n const viewport = this._viewportRuler.getViewportSize();\n return body.scrollHeight > viewport.height || body.scrollWidth > viewport.width;\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Returns an error to be thrown when attempting to attach an already-attached scroll strategy.\n */\nfunction getMatScrollStrategyAlreadyAttachedError() {\n return Error(`Scroll strategy has already been attached.`);\n}\n\n/**\n * Strategy that will close the overlay as soon as the user starts scrolling.\n */\nclass CloseScrollStrategy {\n constructor(_scrollDispatcher, _ngZone, _viewportRuler, _config) {\n this._scrollDispatcher = _scrollDispatcher;\n this._ngZone = _ngZone;\n this._viewportRuler = _viewportRuler;\n this._config = _config;\n this._scrollSubscription = null;\n /** Detaches the overlay ref and disables the scroll strategy. */\n this._detach = () => {\n this.disable();\n if (this._overlayRef.hasAttached()) {\n this._ngZone.run(() => this._overlayRef.detach());\n }\n };\n }\n /** Attaches this scroll strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatScrollStrategyAlreadyAttachedError();\n }\n this._overlayRef = overlayRef;\n }\n /** Enables the closing of the attached overlay on scroll. */\n enable() {\n if (this._scrollSubscription) {\n return;\n }\n const stream = this._scrollDispatcher.scrolled(0);\n if (this._config && this._config.threshold && this._config.threshold > 1) {\n this._initialScrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n this._scrollSubscription = stream.subscribe(() => {\n const scrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n if (Math.abs(scrollPosition - this._initialScrollPosition) > this._config.threshold) {\n this._detach();\n }\n else {\n this._overlayRef.updatePosition();\n }\n });\n }\n else {\n this._scrollSubscription = stream.subscribe(this._detach);\n }\n }\n /** Disables the closing the attached overlay on scroll. */\n disable() {\n if (this._scrollSubscription) {\n this._scrollSubscription.unsubscribe();\n this._scrollSubscription = null;\n }\n }\n detach() {\n this.disable();\n this._overlayRef = null;\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Scroll strategy that doesn't do anything. */\nclass NoopScrollStrategy {\n /** Does nothing, as this scroll strategy is a no-op. */\n enable() { }\n /** Does nothing, as this scroll strategy is a no-op. */\n disable() { }\n /** Does nothing, as this scroll strategy is a no-op. */\n attach() { }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Gets whether an element is scrolled outside of view by any of its parent scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is scrolled out of view\n * @docs-private\n */\nfunction isElementScrolledOutsideView(element, scrollContainers) {\n return scrollContainers.some(containerBounds => {\n const outsideAbove = element.bottom < containerBounds.top;\n const outsideBelow = element.top > containerBounds.bottom;\n const outsideLeft = element.right < containerBounds.left;\n const outsideRight = element.left > containerBounds.right;\n return outsideAbove || outsideBelow || outsideLeft || outsideRight;\n });\n}\n/**\n * Gets whether an element is clipped by any of its scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is clipped\n * @docs-private\n */\nfunction isElementClippedByScrolling(element, scrollContainers) {\n return scrollContainers.some(scrollContainerRect => {\n const clippedAbove = element.top < scrollContainerRect.top;\n const clippedBelow = element.bottom > scrollContainerRect.bottom;\n const clippedLeft = element.left < scrollContainerRect.left;\n const clippedRight = element.right > scrollContainerRect.right;\n return clippedAbove || clippedBelow || clippedLeft || clippedRight;\n });\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Strategy that will update the element position as the user is scrolling.\n */\nclass RepositionScrollStrategy {\n constructor(_scrollDispatcher, _viewportRuler, _ngZone, _config) {\n this._scrollDispatcher = _scrollDispatcher;\n this._viewportRuler = _viewportRuler;\n this._ngZone = _ngZone;\n this._config = _config;\n this._scrollSubscription = null;\n }\n /** Attaches this scroll strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatScrollStrategyAlreadyAttachedError();\n }\n this._overlayRef = overlayRef;\n }\n /** Enables repositioning of the attached overlay on scroll. */\n enable() {\n if (!this._scrollSubscription) {\n const throttle = this._config ? this._config.scrollThrottle : 0;\n this._scrollSubscription = this._scrollDispatcher.scrolled(throttle).subscribe(() => {\n this._overlayRef.updatePosition();\n // TODO(crisbeto): make `close` on by default once all components can handle it.\n if (this._config && this._config.autoClose) {\n const overlayRect = this._overlayRef.overlayElement.getBoundingClientRect();\n const { width, height } = this._viewportRuler.getViewportSize();\n // TODO(crisbeto): include all ancestor scroll containers here once\n // we have a way of exposing the trigger element to the scroll strategy.\n const parentRects = [{ width, height, bottom: height, right: width, top: 0, left: 0 }];\n if (isElementScrolledOutsideView(overlayRect, parentRects)) {\n this.disable();\n this._ngZone.run(() => this._overlayRef.detach());\n }\n }\n });\n }\n }\n /** Disables repositioning of the attached overlay on scroll. */\n disable() {\n if (this._scrollSubscription) {\n this._scrollSubscription.unsubscribe();\n this._scrollSubscription = null;\n }\n }\n detach() {\n this.disable();\n this._overlayRef = null;\n }\n}\n\n/**\n * Options for how an overlay will handle scrolling.\n *\n * Users can provide a custom value for `ScrollStrategyOptions` to replace the default\n * behaviors. This class primarily acts as a factory for ScrollStrategy instances.\n */\nclass ScrollStrategyOptions {\n constructor(_scrollDispatcher, _viewportRuler, _ngZone, document) {\n this._scrollDispatcher = _scrollDispatcher;\n this._viewportRuler = _viewportRuler;\n this._ngZone = _ngZone;\n /** Do nothing on scroll. */\n this.noop = () => new NoopScrollStrategy();\n /**\n * Close the overlay as soon as the user scrolls.\n * @param config Configuration to be used inside the scroll strategy.\n */\n this.close = (config) => new CloseScrollStrategy(this._scrollDispatcher, this._ngZone, this._viewportRuler, config);\n /** Block scrolling. */\n this.block = () => new BlockScrollStrategy(this._viewportRuler, this._document);\n /**\n * Update the overlay's position on scroll.\n * @param config Configuration to be used inside the scroll strategy.\n * Allows debouncing the reposition calls.\n */\n this.reposition = (config) => new RepositionScrollStrategy(this._scrollDispatcher, this._viewportRuler, this._ngZone, config);\n this._document = document;\n }\n}\nScrollStrategyOptions.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollStrategyOptions, deps: [{ token: i1.ScrollDispatcher }, { token: i1.ViewportRuler }, { token: i0.NgZone }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });\nScrollStrategyOptions.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollStrategyOptions, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollStrategyOptions, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: i1.ScrollDispatcher }, { type: i1.ViewportRuler }, { type: i0.NgZone }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Initial configuration used when creating an overlay. */\nclass OverlayConfig {\n constructor(config) {\n /** Strategy to be used when handling scroll events while the overlay is open. */\n this.scrollStrategy = new NoopScrollStrategy();\n /** Custom class to add to the overlay pane. */\n this.panelClass = '';\n /** Whether the overlay has a backdrop. */\n this.hasBackdrop = false;\n /** Custom class to add to the backdrop */\n this.backdropClass = 'cdk-overlay-dark-backdrop';\n /**\n * Whether the overlay should be disposed of when the user goes backwards/forwards in history.\n * Note that this usually doesn't include clicking on links (unless the user is using\n * the `HashLocationStrategy`).\n */\n this.disposeOnNavigation = false;\n if (config) {\n // Use `Iterable` instead of `Array` because TypeScript, as of 3.6.3,\n // loses the array generic type in the `for of`. But we *also* have to use `Array` because\n // typescript won't iterate over an `Iterable` unless you compile with `--downlevelIteration`\n const configKeys = Object.keys(config);\n for (const key of configKeys) {\n if (config[key] !== undefined) {\n // TypeScript, as of version 3.5, sees the left-hand-side of this expression\n // as \"I don't know *which* key this is, so the only valid value is the intersection\n // of all the posible values.\" In this case, that happens to be `undefined`. TypeScript\n // is not smart enough to see that the right-hand-side is actually an access of the same\n // exact type with the same exact key, meaning that the value type must be identical.\n // So we use `any` to work around this.\n this[key] = config[key];\n }\n }\n }\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** The points of the origin element and the overlay element to connect. */\nclass ConnectionPositionPair {\n constructor(origin, overlay, \n /** Offset along the X axis. */\n offsetX, \n /** Offset along the Y axis. */\n offsetY, \n /** Class(es) to be applied to the panel while this position is active. */\n panelClass) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n this.panelClass = panelClass;\n this.originX = origin.originX;\n this.originY = origin.originY;\n this.overlayX = overlay.overlayX;\n this.overlayY = overlay.overlayY;\n }\n}\n/**\n * Set of properties regarding the position of the origin and overlay relative to the viewport\n * with respect to the containing Scrollable elements.\n *\n * The overlay and origin are clipped if any part of their bounding client rectangle exceeds the\n * bounds of any one of the strategy's Scrollable's bounding client rectangle.\n *\n * The overlay and origin are outside view if there is no overlap between their bounding client\n * rectangle and any one of the strategy's Scrollable's bounding client rectangle.\n *\n * ----------- -----------\n * | outside | | clipped |\n * | view | --------------------------\n * | | | | | |\n * ---------- | ----------- |\n * -------------------------- | |\n * | | | Scrollable |\n * | | | |\n * | | --------------------------\n * | Scrollable |\n * | |\n * --------------------------\n *\n * @docs-private\n */\nclass ScrollingVisibility {\n}\n/** The change event emitted by the strategy when a fallback position is used. */\nclass ConnectedOverlayPositionChange {\n constructor(\n /** The position used as a result of this change. */\n connectionPair, \n /** @docs-private */\n scrollableViewProperties) {\n this.connectionPair = connectionPair;\n this.scrollableViewProperties = scrollableViewProperties;\n }\n}\n/**\n * Validates whether a vertical position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nfunction validateVerticalPosition(property, value) {\n if (value !== 'top' && value !== 'bottom' && value !== 'center') {\n throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` +\n `Expected \"top\", \"bottom\" or \"center\".`);\n }\n}\n/**\n * Validates whether a horizontal position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nfunction validateHorizontalPosition(property, value) {\n if (value !== 'start' && value !== 'end' && value !== 'center') {\n throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` +\n `Expected \"start\", \"end\" or \"center\".`);\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Reference to an overlay that has been created with the Overlay service.\n * Used to manipulate or dispose of said overlay.\n */\nclass OverlayRef {\n constructor(_portalOutlet, _host, _pane, _config, _ngZone, _keyboardDispatcher, _document, _location, _outsideClickDispatcher) {\n this._portalOutlet = _portalOutlet;\n this._host = _host;\n this._pane = _pane;\n this._config = _config;\n this._ngZone = _ngZone;\n this._keyboardDispatcher = _keyboardDispatcher;\n this._document = _document;\n this._location = _location;\n this._outsideClickDispatcher = _outsideClickDispatcher;\n this._backdropElement = null;\n this._backdropClick = new Subject();\n this._attachments = new Subject();\n this._detachments = new Subject();\n this._locationChanges = Subscription.EMPTY;\n this._backdropClickHandler = (event) => this._backdropClick.next(event);\n this._backdropTransitionendHandler = (event) => {\n this._disposeBackdrop(event.target);\n };\n /** Stream of keydown events dispatched to this overlay. */\n this._keydownEvents = new Subject();\n /** Stream of mouse outside events dispatched to this overlay. */\n this._outsidePointerEvents = new Subject();\n if (_config.scrollStrategy) {\n this._scrollStrategy = _config.scrollStrategy;\n this._scrollStrategy.attach(this);\n }\n this._positionStrategy = _config.positionStrategy;\n }\n /** The overlay's HTML element */\n get overlayElement() {\n return this._pane;\n }\n /** The overlay's backdrop HTML element. */\n get backdropElement() {\n return this._backdropElement;\n }\n /**\n * Wrapper around the panel element. Can be used for advanced\n * positioning where a wrapper with specific styling is\n * required around the overlay pane.\n */\n get hostElement() {\n return this._host;\n }\n /**\n * Attaches content, given via a Portal, to the overlay.\n * If the overlay is configured to have a backdrop, it will be created.\n *\n * @param portal Portal instance to which to attach the overlay.\n * @returns The portal attachment result.\n */\n attach(portal) {\n // Insert the host into the DOM before attaching the portal, otherwise\n // the animations module will skip animations on repeat attachments.\n if (!this._host.parentElement && this._previousHostParent) {\n this._previousHostParent.appendChild(this._host);\n }\n const attachResult = this._portalOutlet.attach(portal);\n if (this._positionStrategy) {\n this._positionStrategy.attach(this);\n }\n this._updateStackingOrder();\n this._updateElementSize();\n this._updateElementDirection();\n if (this._scrollStrategy) {\n this._scrollStrategy.enable();\n }\n // Update the position once the zone is stable so that the overlay will be fully rendered\n // before attempting to position it, as the position may depend on the size of the rendered\n // content.\n this._ngZone.onStable.pipe(take(1)).subscribe(() => {\n // The overlay could've been detached before the zone has stabilized.\n if (this.hasAttached()) {\n this.updatePosition();\n }\n });\n // Enable pointer events for the overlay pane element.\n this._togglePointerEvents(true);\n if (this._config.hasBackdrop) {\n this._attachBackdrop();\n }\n if (this._config.panelClass) {\n this._toggleClasses(this._pane, this._config.panelClass, true);\n }\n // Only emit the `attachments` event once all other setup is done.\n this._attachments.next();\n // Track this overlay by the keyboard dispatcher\n this._keyboardDispatcher.add(this);\n if (this._config.disposeOnNavigation) {\n this._locationChanges = this._location.subscribe(() => this.dispose());\n }\n this._outsideClickDispatcher.add(this);\n return attachResult;\n }\n /**\n * Detaches an overlay from a portal.\n * @returns The portal detachment result.\n */\n detach() {\n if (!this.hasAttached()) {\n return;\n }\n this.detachBackdrop();\n // When the overlay is detached, the pane element should disable pointer events.\n // This is necessary because otherwise the pane element will cover the page and disable\n // pointer events therefore. Depends on the position strategy and the applied pane boundaries.\n this._togglePointerEvents(false);\n if (this._positionStrategy && this._positionStrategy.detach) {\n this._positionStrategy.detach();\n }\n if (this._scrollStrategy) {\n this._scrollStrategy.disable();\n }\n const detachmentResult = this._portalOutlet.detach();\n // Only emit after everything is detached.\n this._detachments.next();\n // Remove this overlay from keyboard dispatcher tracking.\n this._keyboardDispatcher.remove(this);\n // Keeping the host element in the DOM can cause scroll jank, because it still gets\n // rendered, even though it's transparent and unclickable which is why we remove it.\n this._detachContentWhenStable();\n this._locationChanges.unsubscribe();\n this._outsideClickDispatcher.remove(this);\n return detachmentResult;\n }\n /** Cleans up the overlay from the DOM. */\n dispose() {\n var _a;\n const isAttached = this.hasAttached();\n if (this._positionStrategy) {\n this._positionStrategy.dispose();\n }\n this._disposeScrollStrategy();\n this._disposeBackdrop(this._backdropElement);\n this._locationChanges.unsubscribe();\n this._keyboardDispatcher.remove(this);\n this._portalOutlet.dispose();\n this._attachments.complete();\n this._backdropClick.complete();\n this._keydownEvents.complete();\n this._outsidePointerEvents.complete();\n this._outsideClickDispatcher.remove(this);\n (_a = this._host) === null || _a === void 0 ? void 0 : _a.remove();\n this._previousHostParent = this._pane = this._host = null;\n if (isAttached) {\n this._detachments.next();\n }\n this._detachments.complete();\n }\n /** Whether the overlay has attached content. */\n hasAttached() {\n return this._portalOutlet.hasAttached();\n }\n /** Gets an observable that emits when the backdrop has been clicked. */\n backdropClick() {\n return this._backdropClick;\n }\n /** Gets an observable that emits when the overlay has been attached. */\n attachments() {\n return this._attachments;\n }\n /** Gets an observable that emits when the overlay has been detached. */\n detachments() {\n return this._detachments;\n }\n /** Gets an observable of keydown events targeted to this overlay. */\n keydownEvents() {\n return this._keydownEvents;\n }\n /** Gets an observable of pointer events targeted outside this overlay. */\n outsidePointerEvents() {\n return this._outsidePointerEvents;\n }\n /** Gets the current overlay configuration, which is immutable. */\n getConfig() {\n return this._config;\n }\n /** Updates the position of the overlay based on the position strategy. */\n updatePosition() {\n if (this._positionStrategy) {\n this._positionStrategy.apply();\n }\n }\n /** Switches to a new position strategy and updates the overlay position. */\n updatePositionStrategy(strategy) {\n if (strategy === this._positionStrategy) {\n return;\n }\n if (this._positionStrategy) {\n this._positionStrategy.dispose();\n }\n this._positionStrategy = strategy;\n if (this.hasAttached()) {\n strategy.attach(this);\n this.updatePosition();\n }\n }\n /** Update the size properties of the overlay. */\n updateSize(sizeConfig) {\n this._config = Object.assign(Object.assign({}, this._config), sizeConfig);\n this._updateElementSize();\n }\n /** Sets the LTR/RTL direction for the overlay. */\n setDirection(dir) {\n this._config = Object.assign(Object.assign({}, this._config), { direction: dir });\n this._updateElementDirection();\n }\n /** Add a CSS class or an array of classes to the overlay pane. */\n addPanelClass(classes) {\n if (this._pane) {\n this._toggleClasses(this._pane, classes, true);\n }\n }\n /** Remove a CSS class or an array of classes from the overlay pane. */\n removePanelClass(classes) {\n if (this._pane) {\n this._toggleClasses(this._pane, classes, false);\n }\n }\n /**\n * Returns the layout direction of the overlay panel.\n */\n getDirection() {\n const direction = this._config.direction;\n if (!direction) {\n return 'ltr';\n }\n return typeof direction === 'string' ? direction : direction.value;\n }\n /** Switches to a new scroll strategy. */\n updateScrollStrategy(strategy) {\n if (strategy === this._scrollStrategy) {\n return;\n }\n this._disposeScrollStrategy();\n this._scrollStrategy = strategy;\n if (this.hasAttached()) {\n strategy.attach(this);\n strategy.enable();\n }\n }\n /** Updates the text direction of the overlay panel. */\n _updateElementDirection() {\n this._host.setAttribute('dir', this.getDirection());\n }\n /** Updates the size of the overlay element based on the overlay config. */\n _updateElementSize() {\n if (!this._pane) {\n return;\n }\n const style = this._pane.style;\n style.width = coerceCssPixelValue(this._config.width);\n style.height = coerceCssPixelValue(this._config.height);\n style.minWidth = coerceCssPixelValue(this._config.minWidth);\n style.minHeight = coerceCssPixelValue(this._config.minHeight);\n style.maxWidth = coerceCssPixelValue(this._config.maxWidth);\n style.maxHeight = coerceCssPixelValue(this._config.maxHeight);\n }\n /** Toggles the pointer events for the overlay pane element. */\n _togglePointerEvents(enablePointer) {\n this._pane.style.pointerEvents = enablePointer ? '' : 'none';\n }\n /** Attaches a backdrop for this overlay. */\n _attachBackdrop() {\n const showingClass = 'cdk-overlay-backdrop-showing';\n this._backdropElement = this._document.createElement('div');\n this._backdropElement.classList.add('cdk-overlay-backdrop');\n if (this._config.backdropClass) {\n this._toggleClasses(this._backdropElement, this._config.backdropClass, true);\n }\n // Insert the backdrop before the pane in the DOM order,\n // in order to handle stacked overlays properly.\n this._host.parentElement.insertBefore(this._backdropElement, this._host);\n // Forward backdrop clicks such that the consumer of the overlay can perform whatever\n // action desired when such a click occurs (usually closing the overlay).\n this._backdropElement.addEventListener('click', this._backdropClickHandler);\n // Add class to fade-in the backdrop after one frame.\n if (typeof requestAnimationFrame !== 'undefined') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => {\n if (this._backdropElement) {\n this._backdropElement.classList.add(showingClass);\n }\n });\n });\n }\n else {\n this._backdropElement.classList.add(showingClass);\n }\n }\n /**\n * Updates the stacking order of the element, moving it to the top if necessary.\n * This is required in cases where one overlay was detached, while another one,\n * that should be behind it, was destroyed. The next time both of them are opened,\n * the stacking will be wrong, because the detached element's pane will still be\n * in its original DOM position.\n */\n _updateStackingOrder() {\n if (this._host.nextSibling) {\n this._host.parentNode.appendChild(this._host);\n }\n }\n /** Detaches the backdrop (if any) associated with the overlay. */\n detachBackdrop() {\n const backdropToDetach = this._backdropElement;\n if (!backdropToDetach) {\n return;\n }\n backdropToDetach.classList.remove('cdk-overlay-backdrop-showing');\n this._ngZone.runOutsideAngular(() => {\n backdropToDetach.addEventListener('transitionend', this._backdropTransitionendHandler);\n });\n // If the backdrop doesn't have a transition, the `transitionend` event won't fire.\n // In this case we make it unclickable and we try to remove it after a delay.\n backdropToDetach.style.pointerEvents = 'none';\n // Run this outside the Angular zone because there's nothing that Angular cares about.\n // If it were to run inside the Angular zone, every test that used Overlay would have to be\n // either async or fakeAsync.\n this._backdropTimeout = this._ngZone.runOutsideAngular(() => setTimeout(() => {\n this._disposeBackdrop(backdropToDetach);\n }, 500));\n }\n /** Toggles a single CSS class or an array of classes on an element. */\n _toggleClasses(element, cssClasses, isAdd) {\n const classes = coerceArray(cssClasses || []).filter(c => !!c);\n if (classes.length) {\n isAdd ? element.classList.add(...classes) : element.classList.remove(...classes);\n }\n }\n /** Detaches the overlay content next time the zone stabilizes. */\n _detachContentWhenStable() {\n // Normally we wouldn't have to explicitly run this outside the `NgZone`, however\n // if the consumer is using `zone-patch-rxjs`, the `Subscription.unsubscribe` call will\n // be patched to run inside the zone, which will throw us into an infinite loop.\n this._ngZone.runOutsideAngular(() => {\n // We can't remove the host here immediately, because the overlay pane's content\n // might still be animating. This stream helps us avoid interrupting the animation\n // by waiting for the pane to become empty.\n const subscription = this._ngZone.onStable\n .pipe(takeUntil(merge(this._attachments, this._detachments)))\n .subscribe(() => {\n // Needs a couple of checks for the pane and host, because\n // they may have been removed by the time the zone stabilizes.\n if (!this._pane || !this._host || this._pane.children.length === 0) {\n if (this._pane && this._config.panelClass) {\n this._toggleClasses(this._pane, this._config.panelClass, false);\n }\n if (this._host && this._host.parentElement) {\n this._previousHostParent = this._host.parentElement;\n this._host.remove();\n }\n subscription.unsubscribe();\n }\n });\n });\n }\n /** Disposes of a scroll strategy. */\n _disposeScrollStrategy() {\n const scrollStrategy = this._scrollStrategy;\n if (scrollStrategy) {\n scrollStrategy.disable();\n if (scrollStrategy.detach) {\n scrollStrategy.detach();\n }\n }\n }\n /** Removes a backdrop element from the DOM. */\n _disposeBackdrop(backdrop) {\n if (backdrop) {\n backdrop.removeEventListener('click', this._backdropClickHandler);\n backdrop.removeEventListener('transitionend', this._backdropTransitionendHandler);\n backdrop.remove();\n // It is possible that a new portal has been attached to this overlay since we started\n // removing the backdrop. If that is the case, only clear the backdrop reference if it\n // is still the same instance that we started to remove.\n if (this._backdropElement === backdrop) {\n this._backdropElement = null;\n }\n }\n if (this._backdropTimeout) {\n clearTimeout(this._backdropTimeout);\n this._backdropTimeout = undefined;\n }\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Container inside which all overlays will render. */\nclass OverlayContainer {\n constructor(document, _platform) {\n this._platform = _platform;\n this._document = document;\n }\n ngOnDestroy() {\n var _a;\n (_a = this._containerElement) === null || _a === void 0 ? void 0 : _a.remove();\n }\n /**\n * This method returns the overlay container element. It will lazily\n * create the element the first time it is called to facilitate using\n * the container in non-browser environments.\n * @returns the container element\n */\n getContainerElement() {\n if (!this._containerElement) {\n this._createContainer();\n }\n return this._containerElement;\n }\n /**\n * Create the overlay container element, which is simply a div\n * with the 'cdk-overlay-container' class on the document body.\n */\n _createContainer() {\n const containerClass = 'cdk-overlay-container';\n // TODO(crisbeto): remove the testing check once we have an overlay testing\n // module or Angular starts tearing down the testing `NgModule`. See:\n // https://github.com/angular/angular/issues/18831\n if (this._platform.isBrowser || _isTestEnvironment()) {\n const oppositePlatformContainers = this._document.querySelectorAll(`.${containerClass}[platform=\"server\"], ` + `.${containerClass}[platform=\"test\"]`);\n // Remove any old containers from the opposite platform.\n // This can happen when transitioning from the server to the client.\n for (let i = 0; i < oppositePlatformContainers.length; i++) {\n oppositePlatformContainers[i].remove();\n }\n }\n const container = this._document.createElement('div');\n container.classList.add(containerClass);\n // A long time ago we kept adding new overlay containers whenever a new app was instantiated,\n // but at some point we added logic which clears the duplicate ones in order to avoid leaks.\n // The new logic was a little too aggressive since it was breaking some legitimate use cases.\n // To mitigate the problem we made it so that only containers from a different platform are\n // cleared, but the side-effect was that people started depending on the overly-aggressive\n // logic to clean up their tests for them. Until we can introduce an overlay-specific testing\n // module which does the cleanup, we try to detect that we're in a test environment and we\n // always clear the container. See #17006.\n // TODO(crisbeto): remove the test environment check once we have an overlay testing module.\n if (_isTestEnvironment()) {\n container.setAttribute('platform', 'test');\n }\n else if (!this._platform.isBrowser) {\n container.setAttribute('platform', 'server');\n }\n this._document.body.appendChild(container);\n this._containerElement = container;\n }\n}\nOverlayContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayContainer, deps: [{ token: DOCUMENT }, { token: i1$1.Platform }], target: i0.ɵɵFactoryTarget.Injectable });\nOverlayContainer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayContainer, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayContainer, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i1$1.Platform }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// TODO: refactor clipping detection into a separate thing (part of scrolling module)\n// TODO: doesn't handle both flexible width and height when it has to scroll along both axis.\n/** Class to be added to the overlay bounding box. */\nconst boundingBoxClass = 'cdk-overlay-connected-position-bounding-box';\n/** Regex used to split a string on its CSS units. */\nconst cssUnitPattern = /([A-Za-z%]+)$/;\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * implicit position relative some origin element. The relative position is defined in terms of\n * a point on the origin element that is connected to a point on the overlay element. For example,\n * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner\n * of the overlay.\n */\nclass FlexibleConnectedPositionStrategy {\n constructor(connectedTo, _viewportRuler, _document, _platform, _overlayContainer) {\n this._viewportRuler = _viewportRuler;\n this._document = _document;\n this._platform = _platform;\n this._overlayContainer = _overlayContainer;\n /** Last size used for the bounding box. Used to avoid resizing the overlay after open. */\n this._lastBoundingBoxSize = { width: 0, height: 0 };\n /** Whether the overlay was pushed in a previous positioning. */\n this._isPushed = false;\n /** Whether the overlay can be pushed on-screen on the initial open. */\n this._canPush = true;\n /** Whether the overlay can grow via flexible width/height after the initial open. */\n this._growAfterOpen = false;\n /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n this._hasFlexibleDimensions = true;\n /** Whether the overlay position is locked. */\n this._positionLocked = false;\n /** Amount of space that must be maintained between the overlay and the edge of the viewport. */\n this._viewportMargin = 0;\n /** The Scrollable containers used to check scrollable view properties on position change. */\n this._scrollables = [];\n /** Ordered list of preferred positions, from most to least desirable. */\n this._preferredPositions = [];\n /** Subject that emits whenever the position changes. */\n this._positionChanges = new Subject();\n /** Subscription to viewport size changes. */\n this._resizeSubscription = Subscription.EMPTY;\n /** Default offset for the overlay along the x axis. */\n this._offsetX = 0;\n /** Default offset for the overlay along the y axis. */\n this._offsetY = 0;\n /** Keeps track of the CSS classes that the position strategy has applied on the overlay panel. */\n this._appliedPanelClasses = [];\n /** Observable sequence of position changes. */\n this.positionChanges = this._positionChanges;\n this.setOrigin(connectedTo);\n }\n /** Ordered list of preferred positions, from most to least desirable. */\n get positions() {\n return this._preferredPositions;\n }\n /** Attaches this position strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef &&\n overlayRef !== this._overlayRef &&\n (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('This position strategy is already attached to an overlay');\n }\n this._validatePositions();\n overlayRef.hostElement.classList.add(boundingBoxClass);\n this._overlayRef = overlayRef;\n this._boundingBox = overlayRef.hostElement;\n this._pane = overlayRef.overlayElement;\n this._isDisposed = false;\n this._isInitialRender = true;\n this._lastPosition = null;\n this._resizeSubscription.unsubscribe();\n this._resizeSubscription = this._viewportRuler.change().subscribe(() => {\n // When the window is resized, we want to trigger the next reposition as if it\n // was an initial render, in order for the strategy to pick a new optimal position,\n // otherwise position locking will cause it to stay at the old one.\n this._isInitialRender = true;\n this.apply();\n });\n }\n /**\n * Updates the position of the overlay element, using whichever preferred position relative\n * to the origin best fits on-screen.\n *\n * The selection of a position goes as follows:\n * - If any positions fit completely within the viewport as-is,\n * choose the first position that does so.\n * - If flexible dimensions are enabled and at least one satifies the given minimum width/height,\n * choose the position with the greatest available size modified by the positions' weight.\n * - If pushing is enabled, take the position that went off-screen the least and push it\n * on-screen.\n * - If none of the previous criteria were met, use the position that goes off-screen the least.\n * @docs-private\n */\n apply() {\n // We shouldn't do anything if the strategy was disposed or we're on the server.\n if (this._isDisposed || !this._platform.isBrowser) {\n return;\n }\n // If the position has been applied already (e.g. when the overlay was opened) and the\n // consumer opted into locking in the position, re-use the old position, in order to\n // prevent the overlay from jumping around.\n if (!this._isInitialRender && this._positionLocked && this._lastPosition) {\n this.reapplyLastPosition();\n return;\n }\n this._clearPanelClasses();\n this._resetOverlayElementStyles();\n this._resetBoundingBoxStyles();\n // We need the bounding rects for the origin, the overlay and the container to determine how to position\n // the overlay relative to the origin.\n // We use the viewport rect to determine whether a position would go off-screen.\n this._viewportRect = this._getNarrowedViewportRect();\n this._originRect = this._getOriginRect();\n this._overlayRect = this._pane.getBoundingClientRect();\n this._containerRect = this._overlayContainer.getContainerElement().getBoundingClientRect();\n const originRect = this._originRect;\n const overlayRect = this._overlayRect;\n const viewportRect = this._viewportRect;\n const containerRect = this._containerRect;\n // Positions where the overlay will fit with flexible dimensions.\n const flexibleFits = [];\n // Fallback if none of the preferred positions fit within the viewport.\n let fallback;\n // Go through each of the preferred positions looking for a good fit.\n // If a good fit is found, it will be applied immediately.\n for (let pos of this._preferredPositions) {\n // Get the exact (x, y) coordinate for the point-of-origin on the origin element.\n let originPoint = this._getOriginPoint(originRect, containerRect, pos);\n // From that point-of-origin, get the exact (x, y) coordinate for the top-left corner of the\n // overlay in this position. We use the top-left corner for calculations and later translate\n // this into an appropriate (top, left, bottom, right) style.\n let overlayPoint = this._getOverlayPoint(originPoint, overlayRect, pos);\n // Calculate how well the overlay would fit into the viewport with this point.\n let overlayFit = this._getOverlayFit(overlayPoint, overlayRect, viewportRect, pos);\n // If the overlay, without any further work, fits into the viewport, use this position.\n if (overlayFit.isCompletelyWithinViewport) {\n this._isPushed = false;\n this._applyPosition(pos, originPoint);\n return;\n }\n // If the overlay has flexible dimensions, we can use this position\n // so long as there's enough space for the minimum dimensions.\n if (this._canFitWithFlexibleDimensions(overlayFit, overlayPoint, viewportRect)) {\n // Save positions where the overlay will fit with flexible dimensions. We will use these\n // if none of the positions fit *without* flexible dimensions.\n flexibleFits.push({\n position: pos,\n origin: originPoint,\n overlayRect,\n boundingBoxRect: this._calculateBoundingBoxRect(originPoint, pos),\n });\n continue;\n }\n // If the current preferred position does not fit on the screen, remember the position\n // if it has more visible area on-screen than we've seen and move onto the next preferred\n // position.\n if (!fallback || fallback.overlayFit.visibleArea < overlayFit.visibleArea) {\n fallback = { overlayFit, overlayPoint, originPoint, position: pos, overlayRect };\n }\n }\n // If there are any positions where the overlay would fit with flexible dimensions, choose the\n // one that has the greatest area available modified by the position's weight\n if (flexibleFits.length) {\n let bestFit = null;\n let bestScore = -1;\n for (const fit of flexibleFits) {\n const score = fit.boundingBoxRect.width * fit.boundingBoxRect.height * (fit.position.weight || 1);\n if (score > bestScore) {\n bestScore = score;\n bestFit = fit;\n }\n }\n this._isPushed = false;\n this._applyPosition(bestFit.position, bestFit.origin);\n return;\n }\n // When none of the preferred positions fit within the viewport, take the position\n // that went off-screen the least and attempt to push it on-screen.\n if (this._canPush) {\n // TODO(jelbourn): after pushing, the opening \"direction\" of the overlay might not make sense.\n this._isPushed = true;\n this._applyPosition(fallback.position, fallback.originPoint);\n return;\n }\n // All options for getting the overlay within the viewport have been exhausted, so go with the\n // position that went off-screen the least.\n this._applyPosition(fallback.position, fallback.originPoint);\n }\n detach() {\n this._clearPanelClasses();\n this._lastPosition = null;\n this._previousPushAmount = null;\n this._resizeSubscription.unsubscribe();\n }\n /** Cleanup after the element gets destroyed. */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n // We can't use `_resetBoundingBoxStyles` here, because it resets\n // some properties to zero, rather than removing them.\n if (this._boundingBox) {\n extendStyles(this._boundingBox.style, {\n top: '',\n left: '',\n right: '',\n bottom: '',\n height: '',\n width: '',\n alignItems: '',\n justifyContent: '',\n });\n }\n if (this._pane) {\n this._resetOverlayElementStyles();\n }\n if (this._overlayRef) {\n this._overlayRef.hostElement.classList.remove(boundingBoxClass);\n }\n this.detach();\n this._positionChanges.complete();\n this._overlayRef = this._boundingBox = null;\n this._isDisposed = true;\n }\n /**\n * This re-aligns the overlay element with the trigger in its last calculated position,\n * even if a position higher in the \"preferred positions\" list would now fit. This\n * allows one to re-align the panel without changing the orientation of the panel.\n */\n reapplyLastPosition() {\n if (this._isDisposed || !this._platform.isBrowser) {\n return;\n }\n const lastPosition = this._lastPosition;\n if (lastPosition) {\n this._originRect = this._getOriginRect();\n this._overlayRect = this._pane.getBoundingClientRect();\n this._viewportRect = this._getNarrowedViewportRect();\n this._containerRect = this._overlayContainer.getContainerElement().getBoundingClientRect();\n const originPoint = this._getOriginPoint(this._originRect, this._containerRect, lastPosition);\n this._applyPosition(lastPosition, originPoint);\n }\n else {\n this.apply();\n }\n }\n /**\n * Sets the list of Scrollable containers that host the origin element so that\n * on reposition we can evaluate if it or the overlay has been clipped or outside view. Every\n * Scrollable must be an ancestor element of the strategy's origin element.\n */\n withScrollableContainers(scrollables) {\n this._scrollables = scrollables;\n return this;\n }\n /**\n * Adds new preferred positions.\n * @param positions List of positions options for this overlay.\n */\n withPositions(positions) {\n this._preferredPositions = positions;\n // If the last calculated position object isn't part of the positions anymore, clear\n // it in order to avoid it being picked up if the consumer tries to re-apply.\n if (positions.indexOf(this._lastPosition) === -1) {\n this._lastPosition = null;\n }\n this._validatePositions();\n return this;\n }\n /**\n * Sets a minimum distance the overlay may be positioned to the edge of the viewport.\n * @param margin Required margin between the overlay and the viewport edge in pixels.\n */\n withViewportMargin(margin) {\n this._viewportMargin = margin;\n return this;\n }\n /** Sets whether the overlay's width and height can be constrained to fit within the viewport. */\n withFlexibleDimensions(flexibleDimensions = true) {\n this._hasFlexibleDimensions = flexibleDimensions;\n return this;\n }\n /** Sets whether the overlay can grow after the initial open via flexible width/height. */\n withGrowAfterOpen(growAfterOpen = true) {\n this._growAfterOpen = growAfterOpen;\n return this;\n }\n /** Sets whether the overlay can be pushed on-screen if none of the provided positions fit. */\n withPush(canPush = true) {\n this._canPush = canPush;\n return this;\n }\n /**\n * Sets whether the overlay's position should be locked in after it is positioned\n * initially. When an overlay is locked in, it won't attempt to reposition itself\n * when the position is re-applied (e.g. when the user scrolls away).\n * @param isLocked Whether the overlay should locked in.\n */\n withLockedPosition(isLocked = true) {\n this._positionLocked = isLocked;\n return this;\n }\n /**\n * Sets the origin, relative to which to position the overlay.\n * Using an element origin is useful for building components that need to be positioned\n * relatively to a trigger (e.g. dropdown menus or tooltips), whereas using a point can be\n * used for cases like contextual menus which open relative to the user's pointer.\n * @param origin Reference to the new origin.\n */\n setOrigin(origin) {\n this._origin = origin;\n return this;\n }\n /**\n * Sets the default offset for the overlay's connection point on the x-axis.\n * @param offset New offset in the X axis.\n */\n withDefaultOffsetX(offset) {\n this._offsetX = offset;\n return this;\n }\n /**\n * Sets the default offset for the overlay's connection point on the y-axis.\n * @param offset New offset in the Y axis.\n */\n withDefaultOffsetY(offset) {\n this._offsetY = offset;\n return this;\n }\n /**\n * Configures that the position strategy should set a `transform-origin` on some elements\n * inside the overlay, depending on the current position that is being applied. This is\n * useful for the cases where the origin of an animation can change depending on the\n * alignment of the overlay.\n * @param selector CSS selector that will be used to find the target\n * elements onto which to set the transform origin.\n */\n withTransformOriginOn(selector) {\n this._transformOriginSelector = selector;\n return this;\n }\n /**\n * Gets the (x, y) coordinate of a connection point on the origin based on a relative position.\n */\n _getOriginPoint(originRect, containerRect, pos) {\n let x;\n if (pos.originX == 'center') {\n // Note: when centering we should always use the `left`\n // offset, otherwise the position will be wrong in RTL.\n x = originRect.left + originRect.width / 2;\n }\n else {\n const startX = this._isRtl() ? originRect.right : originRect.left;\n const endX = this._isRtl() ? originRect.left : originRect.right;\n x = pos.originX == 'start' ? startX : endX;\n }\n // When zooming in Safari the container rectangle contains negative values for the position\n // and we need to re-add them to the calculated coordinates.\n if (containerRect.left < 0) {\n x -= containerRect.left;\n }\n let y;\n if (pos.originY == 'center') {\n y = originRect.top + originRect.height / 2;\n }\n else {\n y = pos.originY == 'top' ? originRect.top : originRect.bottom;\n }\n // Normally the containerRect's top value would be zero, however when the overlay is attached to an input\n // (e.g. in an autocomplete), mobile browsers will shift everything in order to put the input in the middle\n // of the screen and to make space for the virtual keyboard. We need to account for this offset,\n // otherwise our positioning will be thrown off.\n // Additionally, when zooming in Safari this fixes the vertical position.\n if (containerRect.top < 0) {\n y -= containerRect.top;\n }\n return { x, y };\n }\n /**\n * Gets the (x, y) coordinate of the top-left corner of the overlay given a given position and\n * origin point to which the overlay should be connected.\n */\n _getOverlayPoint(originPoint, overlayRect, pos) {\n // Calculate the (overlayStartX, overlayStartY), the start of the\n // potential overlay position relative to the origin point.\n let overlayStartX;\n if (pos.overlayX == 'center') {\n overlayStartX = -overlayRect.width / 2;\n }\n else if (pos.overlayX === 'start') {\n overlayStartX = this._isRtl() ? -overlayRect.width : 0;\n }\n else {\n overlayStartX = this._isRtl() ? 0 : -overlayRect.width;\n }\n let overlayStartY;\n if (pos.overlayY == 'center') {\n overlayStartY = -overlayRect.height / 2;\n }\n else {\n overlayStartY = pos.overlayY == 'top' ? 0 : -overlayRect.height;\n }\n // The (x, y) coordinates of the overlay.\n return {\n x: originPoint.x + overlayStartX,\n y: originPoint.y + overlayStartY,\n };\n }\n /** Gets how well an overlay at the given point will fit within the viewport. */\n _getOverlayFit(point, rawOverlayRect, viewport, position) {\n // Round the overlay rect when comparing against the\n // viewport, because the viewport is always rounded.\n const overlay = getRoundedBoundingClientRect(rawOverlayRect);\n let { x, y } = point;\n let offsetX = this._getOffset(position, 'x');\n let offsetY = this._getOffset(position, 'y');\n // Account for the offsets since they could push the overlay out of the viewport.\n if (offsetX) {\n x += offsetX;\n }\n if (offsetY) {\n y += offsetY;\n }\n // How much the overlay would overflow at this position, on each side.\n let leftOverflow = 0 - x;\n let rightOverflow = x + overlay.width - viewport.width;\n let topOverflow = 0 - y;\n let bottomOverflow = y + overlay.height - viewport.height;\n // Visible parts of the element on each axis.\n let visibleWidth = this._subtractOverflows(overlay.width, leftOverflow, rightOverflow);\n let visibleHeight = this._subtractOverflows(overlay.height, topOverflow, bottomOverflow);\n let visibleArea = visibleWidth * visibleHeight;\n return {\n visibleArea,\n isCompletelyWithinViewport: overlay.width * overlay.height === visibleArea,\n fitsInViewportVertically: visibleHeight === overlay.height,\n fitsInViewportHorizontally: visibleWidth == overlay.width,\n };\n }\n /**\n * Whether the overlay can fit within the viewport when it may resize either its width or height.\n * @param fit How well the overlay fits in the viewport at some position.\n * @param point The (x, y) coordinates of the overlay at some position.\n * @param viewport The geometry of the viewport.\n */\n _canFitWithFlexibleDimensions(fit, point, viewport) {\n if (this._hasFlexibleDimensions) {\n const availableHeight = viewport.bottom - point.y;\n const availableWidth = viewport.right - point.x;\n const minHeight = getPixelValue(this._overlayRef.getConfig().minHeight);\n const minWidth = getPixelValue(this._overlayRef.getConfig().minWidth);\n const verticalFit = fit.fitsInViewportVertically || (minHeight != null && minHeight <= availableHeight);\n const horizontalFit = fit.fitsInViewportHorizontally || (minWidth != null && minWidth <= availableWidth);\n return verticalFit && horizontalFit;\n }\n return false;\n }\n /**\n * Gets the point at which the overlay can be \"pushed\" on-screen. If the overlay is larger than\n * the viewport, the top-left corner will be pushed on-screen (with overflow occuring on the\n * right and bottom).\n *\n * @param start Starting point from which the overlay is pushed.\n * @param rawOverlayRect Dimensions of the overlay.\n * @param scrollPosition Current viewport scroll position.\n * @returns The point at which to position the overlay after pushing. This is effectively a new\n * originPoint.\n */\n _pushOverlayOnScreen(start, rawOverlayRect, scrollPosition) {\n // If the position is locked and we've pushed the overlay already, reuse the previous push\n // amount, rather than pushing it again. If we were to continue pushing, the element would\n // remain in the viewport, which goes against the expectations when position locking is enabled.\n if (this._previousPushAmount && this._positionLocked) {\n return {\n x: start.x + this._previousPushAmount.x,\n y: start.y + this._previousPushAmount.y,\n };\n }\n // Round the overlay rect when comparing against the\n // viewport, because the viewport is always rounded.\n const overlay = getRoundedBoundingClientRect(rawOverlayRect);\n const viewport = this._viewportRect;\n // Determine how much the overlay goes outside the viewport on each\n // side, which we'll use to decide which direction to push it.\n const overflowRight = Math.max(start.x + overlay.width - viewport.width, 0);\n const overflowBottom = Math.max(start.y + overlay.height - viewport.height, 0);\n const overflowTop = Math.max(viewport.top - scrollPosition.top - start.y, 0);\n const overflowLeft = Math.max(viewport.left - scrollPosition.left - start.x, 0);\n // Amount by which to push the overlay in each axis such that it remains on-screen.\n let pushX = 0;\n let pushY = 0;\n // If the overlay fits completely within the bounds of the viewport, push it from whichever\n // direction is goes off-screen. Otherwise, push the top-left corner such that its in the\n // viewport and allow for the trailing end of the overlay to go out of bounds.\n if (overlay.width <= viewport.width) {\n pushX = overflowLeft || -overflowRight;\n }\n else {\n pushX = start.x < this._viewportMargin ? viewport.left - scrollPosition.left - start.x : 0;\n }\n if (overlay.height <= viewport.height) {\n pushY = overflowTop || -overflowBottom;\n }\n else {\n pushY = start.y < this._viewportMargin ? viewport.top - scrollPosition.top - start.y : 0;\n }\n this._previousPushAmount = { x: pushX, y: pushY };\n return {\n x: start.x + pushX,\n y: start.y + pushY,\n };\n }\n /**\n * Applies a computed position to the overlay and emits a position change.\n * @param position The position preference\n * @param originPoint The point on the origin element where the overlay is connected.\n */\n _applyPosition(position, originPoint) {\n this._setTransformOrigin(position);\n this._setOverlayElementStyles(originPoint, position);\n this._setBoundingBoxStyles(originPoint, position);\n if (position.panelClass) {\n this._addPanelClasses(position.panelClass);\n }\n // Save the last connected position in case the position needs to be re-calculated.\n this._lastPosition = position;\n // Notify that the position has been changed along with its change properties.\n // We only emit if we've got any subscriptions, because the scroll visibility\n // calculcations can be somewhat expensive.\n if (this._positionChanges.observers.length) {\n const scrollableViewProperties = this._getScrollVisibility();\n const changeEvent = new ConnectedOverlayPositionChange(position, scrollableViewProperties);\n this._positionChanges.next(changeEvent);\n }\n this._isInitialRender = false;\n }\n /** Sets the transform origin based on the configured selector and the passed-in position. */\n _setTransformOrigin(position) {\n if (!this._transformOriginSelector) {\n return;\n }\n const elements = this._boundingBox.querySelectorAll(this._transformOriginSelector);\n let xOrigin;\n let yOrigin = position.overlayY;\n if (position.overlayX === 'center') {\n xOrigin = 'center';\n }\n else if (this._isRtl()) {\n xOrigin = position.overlayX === 'start' ? 'right' : 'left';\n }\n else {\n xOrigin = position.overlayX === 'start' ? 'left' : 'right';\n }\n for (let i = 0; i < elements.length; i++) {\n elements[i].style.transformOrigin = `${xOrigin} ${yOrigin}`;\n }\n }\n /**\n * Gets the position and size of the overlay's sizing container.\n *\n * This method does no measuring and applies no styles so that we can cheaply compute the\n * bounds for all positions and choose the best fit based on these results.\n */\n _calculateBoundingBoxRect(origin, position) {\n const viewport = this._viewportRect;\n const isRtl = this._isRtl();\n let height, top, bottom;\n if (position.overlayY === 'top') {\n // Overlay is opening \"downward\" and thus is bound by the bottom viewport edge.\n top = origin.y;\n height = viewport.height - top + this._viewportMargin;\n }\n else if (position.overlayY === 'bottom') {\n // Overlay is opening \"upward\" and thus is bound by the top viewport edge. We need to add\n // the viewport margin back in, because the viewport rect is narrowed down to remove the\n // margin, whereas the `origin` position is calculated based on its `ClientRect`.\n bottom = viewport.height - origin.y + this._viewportMargin * 2;\n height = viewport.height - bottom + this._viewportMargin;\n }\n else {\n // If neither top nor bottom, it means that the overlay is vertically centered on the\n // origin point. Note that we want the position relative to the viewport, rather than\n // the page, which is why we don't use something like `viewport.bottom - origin.y` and\n // `origin.y - viewport.top`.\n const smallestDistanceToViewportEdge = Math.min(viewport.bottom - origin.y + viewport.top, origin.y);\n const previousHeight = this._lastBoundingBoxSize.height;\n height = smallestDistanceToViewportEdge * 2;\n top = origin.y - smallestDistanceToViewportEdge;\n if (height > previousHeight && !this._isInitialRender && !this._growAfterOpen) {\n top = origin.y - previousHeight / 2;\n }\n }\n // The overlay is opening 'right-ward' (the content flows to the right).\n const isBoundedByRightViewportEdge = (position.overlayX === 'start' && !isRtl) || (position.overlayX === 'end' && isRtl);\n // The overlay is opening 'left-ward' (the content flows to the left).\n const isBoundedByLeftViewportEdge = (position.overlayX === 'end' && !isRtl) || (position.overlayX === 'start' && isRtl);\n let width, left, right;\n if (isBoundedByLeftViewportEdge) {\n right = viewport.width - origin.x + this._viewportMargin;\n width = origin.x - this._viewportMargin;\n }\n else if (isBoundedByRightViewportEdge) {\n left = origin.x;\n width = viewport.right - origin.x;\n }\n else {\n // If neither start nor end, it means that the overlay is horizontally centered on the\n // origin point. Note that we want the position relative to the viewport, rather than\n // the page, which is why we don't use something like `viewport.right - origin.x` and\n // `origin.x - viewport.left`.\n const smallestDistanceToViewportEdge = Math.min(viewport.right - origin.x + viewport.left, origin.x);\n const previousWidth = this._lastBoundingBoxSize.width;\n width = smallestDistanceToViewportEdge * 2;\n left = origin.x - smallestDistanceToViewportEdge;\n if (width > previousWidth && !this._isInitialRender && !this._growAfterOpen) {\n left = origin.x - previousWidth / 2;\n }\n }\n return { top: top, left: left, bottom: bottom, right: right, width, height };\n }\n /**\n * Sets the position and size of the overlay's sizing wrapper. The wrapper is positioned on the\n * origin's connection point and stetches to the bounds of the viewport.\n *\n * @param origin The point on the origin element where the overlay is connected.\n * @param position The position preference\n */\n _setBoundingBoxStyles(origin, position) {\n const boundingBoxRect = this._calculateBoundingBoxRect(origin, position);\n // It's weird if the overlay *grows* while scrolling, so we take the last size into account\n // when applying a new size.\n if (!this._isInitialRender && !this._growAfterOpen) {\n boundingBoxRect.height = Math.min(boundingBoxRect.height, this._lastBoundingBoxSize.height);\n boundingBoxRect.width = Math.min(boundingBoxRect.width, this._lastBoundingBoxSize.width);\n }\n const styles = {};\n if (this._hasExactPosition()) {\n styles.top = styles.left = '0';\n styles.bottom = styles.right = styles.maxHeight = styles.maxWidth = '';\n styles.width = styles.height = '100%';\n }\n else {\n const maxHeight = this._overlayRef.getConfig().maxHeight;\n const maxWidth = this._overlayRef.getConfig().maxWidth;\n styles.height = coerceCssPixelValue(boundingBoxRect.height);\n styles.top = coerceCssPixelValue(boundingBoxRect.top);\n styles.bottom = coerceCssPixelValue(boundingBoxRect.bottom);\n styles.width = coerceCssPixelValue(boundingBoxRect.width);\n styles.left = coerceCssPixelValue(boundingBoxRect.left);\n styles.right = coerceCssPixelValue(boundingBoxRect.right);\n // Push the pane content towards the proper direction.\n if (position.overlayX === 'center') {\n styles.alignItems = 'center';\n }\n else {\n styles.alignItems = position.overlayX === 'end' ? 'flex-end' : 'flex-start';\n }\n if (position.overlayY === 'center') {\n styles.justifyContent = 'center';\n }\n else {\n styles.justifyContent = position.overlayY === 'bottom' ? 'flex-end' : 'flex-start';\n }\n if (maxHeight) {\n styles.maxHeight = coerceCssPixelValue(maxHeight);\n }\n if (maxWidth) {\n styles.maxWidth = coerceCssPixelValue(maxWidth);\n }\n }\n this._lastBoundingBoxSize = boundingBoxRect;\n extendStyles(this._boundingBox.style, styles);\n }\n /** Resets the styles for the bounding box so that a new positioning can be computed. */\n _resetBoundingBoxStyles() {\n extendStyles(this._boundingBox.style, {\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n height: '',\n width: '',\n alignItems: '',\n justifyContent: '',\n });\n }\n /** Resets the styles for the overlay pane so that a new positioning can be computed. */\n _resetOverlayElementStyles() {\n extendStyles(this._pane.style, {\n top: '',\n left: '',\n bottom: '',\n right: '',\n position: '',\n transform: '',\n });\n }\n /** Sets positioning styles to the overlay element. */\n _setOverlayElementStyles(originPoint, position) {\n const styles = {};\n const hasExactPosition = this._hasExactPosition();\n const hasFlexibleDimensions = this._hasFlexibleDimensions;\n const config = this._overlayRef.getConfig();\n if (hasExactPosition) {\n const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n extendStyles(styles, this._getExactOverlayY(position, originPoint, scrollPosition));\n extendStyles(styles, this._getExactOverlayX(position, originPoint, scrollPosition));\n }\n else {\n styles.position = 'static';\n }\n // Use a transform to apply the offsets. We do this because the `center` positions rely on\n // being in the normal flex flow and setting a `top` / `left` at all will completely throw\n // off the position. We also can't use margins, because they won't have an effect in some\n // cases where the element doesn't have anything to \"push off of\". Finally, this works\n // better both with flexible and non-flexible positioning.\n let transformString = '';\n let offsetX = this._getOffset(position, 'x');\n let offsetY = this._getOffset(position, 'y');\n if (offsetX) {\n transformString += `translateX(${offsetX}px) `;\n }\n if (offsetY) {\n transformString += `translateY(${offsetY}px)`;\n }\n styles.transform = transformString.trim();\n // If a maxWidth or maxHeight is specified on the overlay, we remove them. We do this because\n // we need these values to both be set to \"100%\" for the automatic flexible sizing to work.\n // The maxHeight and maxWidth are set on the boundingBox in order to enforce the constraint.\n // Note that this doesn't apply when we have an exact position, in which case we do want to\n // apply them because they'll be cleared from the bounding box.\n if (config.maxHeight) {\n if (hasExactPosition) {\n styles.maxHeight = coerceCssPixelValue(config.maxHeight);\n }\n else if (hasFlexibleDimensions) {\n styles.maxHeight = '';\n }\n }\n if (config.maxWidth) {\n if (hasExactPosition) {\n styles.maxWidth = coerceCssPixelValue(config.maxWidth);\n }\n else if (hasFlexibleDimensions) {\n styles.maxWidth = '';\n }\n }\n extendStyles(this._pane.style, styles);\n }\n /** Gets the exact top/bottom for the overlay when not using flexible sizing or when pushing. */\n _getExactOverlayY(position, originPoint, scrollPosition) {\n // Reset any existing styles. This is necessary in case the\n // preferred position has changed since the last `apply`.\n let styles = { top: '', bottom: '' };\n let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n if (this._isPushed) {\n overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n }\n // We want to set either `top` or `bottom` based on whether the overlay wants to appear\n // above or below the origin and the direction in which the element will expand.\n if (position.overlayY === 'bottom') {\n // When using `bottom`, we adjust the y position such that it is the distance\n // from the bottom of the viewport rather than the top.\n const documentHeight = this._document.documentElement.clientHeight;\n styles.bottom = `${documentHeight - (overlayPoint.y + this._overlayRect.height)}px`;\n }\n else {\n styles.top = coerceCssPixelValue(overlayPoint.y);\n }\n return styles;\n }\n /** Gets the exact left/right for the overlay when not using flexible sizing or when pushing. */\n _getExactOverlayX(position, originPoint, scrollPosition) {\n // Reset any existing styles. This is necessary in case the preferred position has\n // changed since the last `apply`.\n let styles = { left: '', right: '' };\n let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n if (this._isPushed) {\n overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n }\n // We want to set either `left` or `right` based on whether the overlay wants to appear \"before\"\n // or \"after\" the origin, which determines the direction in which the element will expand.\n // For the horizontal axis, the meaning of \"before\" and \"after\" change based on whether the\n // page is in RTL or LTR.\n let horizontalStyleProperty;\n if (this._isRtl()) {\n horizontalStyleProperty = position.overlayX === 'end' ? 'left' : 'right';\n }\n else {\n horizontalStyleProperty = position.overlayX === 'end' ? 'right' : 'left';\n }\n // When we're setting `right`, we adjust the x position such that it is the distance\n // from the right edge of the viewport rather than the left edge.\n if (horizontalStyleProperty === 'right') {\n const documentWidth = this._document.documentElement.clientWidth;\n styles.right = `${documentWidth - (overlayPoint.x + this._overlayRect.width)}px`;\n }\n else {\n styles.left = coerceCssPixelValue(overlayPoint.x);\n }\n return styles;\n }\n /**\n * Gets the view properties of the trigger and overlay, including whether they are clipped\n * or completely outside the view of any of the strategy's scrollables.\n */\n _getScrollVisibility() {\n // Note: needs fresh rects since the position could've changed.\n const originBounds = this._getOriginRect();\n const overlayBounds = this._pane.getBoundingClientRect();\n // TODO(jelbourn): instead of needing all of the client rects for these scrolling containers\n // every time, we should be able to use the scrollTop of the containers if the size of those\n // containers hasn't changed.\n const scrollContainerBounds = this._scrollables.map(scrollable => {\n return scrollable.getElementRef().nativeElement.getBoundingClientRect();\n });\n return {\n isOriginClipped: isElementClippedByScrolling(originBounds, scrollContainerBounds),\n isOriginOutsideView: isElementScrolledOutsideView(originBounds, scrollContainerBounds),\n isOverlayClipped: isElementClippedByScrolling(overlayBounds, scrollContainerBounds),\n isOverlayOutsideView: isElementScrolledOutsideView(overlayBounds, scrollContainerBounds),\n };\n }\n /** Subtracts the amount that an element is overflowing on an axis from its length. */\n _subtractOverflows(length, ...overflows) {\n return overflows.reduce((currentValue, currentOverflow) => {\n return currentValue - Math.max(currentOverflow, 0);\n }, length);\n }\n /** Narrows the given viewport rect by the current _viewportMargin. */\n _getNarrowedViewportRect() {\n // We recalculate the viewport rect here ourselves, rather than using the ViewportRuler,\n // because we want to use the `clientWidth` and `clientHeight` as the base. The difference\n // being that the client properties don't include the scrollbar, as opposed to `innerWidth`\n // and `innerHeight` that do. This is necessary, because the overlay container uses\n // 100% `width` and `height` which don't include the scrollbar either.\n const width = this._document.documentElement.clientWidth;\n const height = this._document.documentElement.clientHeight;\n const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n return {\n top: scrollPosition.top + this._viewportMargin,\n left: scrollPosition.left + this._viewportMargin,\n right: scrollPosition.left + width - this._viewportMargin,\n bottom: scrollPosition.top + height - this._viewportMargin,\n width: width - 2 * this._viewportMargin,\n height: height - 2 * this._viewportMargin,\n };\n }\n /** Whether the we're dealing with an RTL context */\n _isRtl() {\n return this._overlayRef.getDirection() === 'rtl';\n }\n /** Determines whether the overlay uses exact or flexible positioning. */\n _hasExactPosition() {\n return !this._hasFlexibleDimensions || this._isPushed;\n }\n /** Retrieves the offset of a position along the x or y axis. */\n _getOffset(position, axis) {\n if (axis === 'x') {\n // We don't do something like `position['offset' + axis]` in\n // order to avoid breking minifiers that rename properties.\n return position.offsetX == null ? this._offsetX : position.offsetX;\n }\n return position.offsetY == null ? this._offsetY : position.offsetY;\n }\n /** Validates that the current position match the expected values. */\n _validatePositions() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this._preferredPositions.length) {\n throw Error('FlexibleConnectedPositionStrategy: At least one position is required.');\n }\n // TODO(crisbeto): remove these once Angular's template type\n // checking is advanced enough to catch these cases.\n this._preferredPositions.forEach(pair => {\n validateHorizontalPosition('originX', pair.originX);\n validateVerticalPosition('originY', pair.originY);\n validateHorizontalPosition('overlayX', pair.overlayX);\n validateVerticalPosition('overlayY', pair.overlayY);\n });\n }\n }\n /** Adds a single CSS class or an array of classes on the overlay panel. */\n _addPanelClasses(cssClasses) {\n if (this._pane) {\n coerceArray(cssClasses).forEach(cssClass => {\n if (cssClass !== '' && this._appliedPanelClasses.indexOf(cssClass) === -1) {\n this._appliedPanelClasses.push(cssClass);\n this._pane.classList.add(cssClass);\n }\n });\n }\n }\n /** Clears the classes that the position strategy has applied from the overlay panel. */\n _clearPanelClasses() {\n if (this._pane) {\n this._appliedPanelClasses.forEach(cssClass => {\n this._pane.classList.remove(cssClass);\n });\n this._appliedPanelClasses = [];\n }\n }\n /** Returns the ClientRect of the current origin. */\n _getOriginRect() {\n const origin = this._origin;\n if (origin instanceof ElementRef) {\n return origin.nativeElement.getBoundingClientRect();\n }\n // Check for Element so SVG elements are also supported.\n if (origin instanceof Element) {\n return origin.getBoundingClientRect();\n }\n const width = origin.width || 0;\n const height = origin.height || 0;\n // If the origin is a point, return a client rect as if it was a 0x0 element at the point.\n return {\n top: origin.y,\n bottom: origin.y + height,\n left: origin.x,\n right: origin.x + width,\n height,\n width,\n };\n }\n}\n/** Shallow-extends a stylesheet object with another stylesheet object. */\nfunction extendStyles(destination, source) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n destination[key] = source[key];\n }\n }\n return destination;\n}\n/**\n * Extracts the pixel value as a number from a value, if it's a number\n * or a CSS pixel string (e.g. `1337px`). Otherwise returns null.\n */\nfunction getPixelValue(input) {\n if (typeof input !== 'number' && input != null) {\n const [value, units] = input.split(cssUnitPattern);\n return !units || units === 'px' ? parseFloat(value) : null;\n }\n return input || null;\n}\n/**\n * Gets a version of an element's bounding `ClientRect` where all the values are rounded down to\n * the nearest pixel. This allows us to account for the cases where there may be sub-pixel\n * deviations in the `ClientRect` returned by the browser (e.g. when zoomed in with a percentage\n * size, see #21350).\n */\nfunction getRoundedBoundingClientRect(clientRect) {\n return {\n top: Math.floor(clientRect.top),\n right: Math.floor(clientRect.right),\n bottom: Math.floor(clientRect.bottom),\n left: Math.floor(clientRect.left),\n width: Math.floor(clientRect.width),\n height: Math.floor(clientRect.height),\n };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Class to be added to the overlay pane wrapper. */\nconst wrapperClass = 'cdk-global-overlay-wrapper';\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * explicit position relative to the browser's viewport. We use flexbox, instead of\n * transforms, in order to avoid issues with subpixel rendering which can cause the\n * element to become blurry.\n */\nclass GlobalPositionStrategy {\n constructor() {\n this._cssPosition = 'static';\n this._topOffset = '';\n this._bottomOffset = '';\n this._leftOffset = '';\n this._rightOffset = '';\n this._alignItems = '';\n this._justifyContent = '';\n this._width = '';\n this._height = '';\n }\n attach(overlayRef) {\n const config = overlayRef.getConfig();\n this._overlayRef = overlayRef;\n if (this._width && !config.width) {\n overlayRef.updateSize({ width: this._width });\n }\n if (this._height && !config.height) {\n overlayRef.updateSize({ height: this._height });\n }\n overlayRef.hostElement.classList.add(wrapperClass);\n this._isDisposed = false;\n }\n /**\n * Sets the top position of the overlay. Clears any previously set vertical position.\n * @param value New top offset.\n */\n top(value = '') {\n this._bottomOffset = '';\n this._topOffset = value;\n this._alignItems = 'flex-start';\n return this;\n }\n /**\n * Sets the left position of the overlay. Clears any previously set horizontal position.\n * @param value New left offset.\n */\n left(value = '') {\n this._rightOffset = '';\n this._leftOffset = value;\n this._justifyContent = 'flex-start';\n return this;\n }\n /**\n * Sets the bottom position of the overlay. Clears any previously set vertical position.\n * @param value New bottom offset.\n */\n bottom(value = '') {\n this._topOffset = '';\n this._bottomOffset = value;\n this._alignItems = 'flex-end';\n return this;\n }\n /**\n * Sets the right position of the overlay. Clears any previously set horizontal position.\n * @param value New right offset.\n */\n right(value = '') {\n this._leftOffset = '';\n this._rightOffset = value;\n this._justifyContent = 'flex-end';\n return this;\n }\n /**\n * Sets the overlay width and clears any previously set width.\n * @param value New width for the overlay\n * @deprecated Pass the `width` through the `OverlayConfig`.\n * @breaking-change 8.0.0\n */\n width(value = '') {\n if (this._overlayRef) {\n this._overlayRef.updateSize({ width: value });\n }\n else {\n this._width = value;\n }\n return this;\n }\n /**\n * Sets the overlay height and clears any previously set height.\n * @param value New height for the overlay\n * @deprecated Pass the `height` through the `OverlayConfig`.\n * @breaking-change 8.0.0\n */\n height(value = '') {\n if (this._overlayRef) {\n this._overlayRef.updateSize({ height: value });\n }\n else {\n this._height = value;\n }\n return this;\n }\n /**\n * Centers the overlay horizontally with an optional offset.\n * Clears any previously set horizontal position.\n *\n * @param offset Overlay offset from the horizontal center.\n */\n centerHorizontally(offset = '') {\n this.left(offset);\n this._justifyContent = 'center';\n return this;\n }\n /**\n * Centers the overlay vertically with an optional offset.\n * Clears any previously set vertical position.\n *\n * @param offset Overlay offset from the vertical center.\n */\n centerVertically(offset = '') {\n this.top(offset);\n this._alignItems = 'center';\n return this;\n }\n /**\n * Apply the position to the element.\n * @docs-private\n */\n apply() {\n // Since the overlay ref applies the strategy asynchronously, it could\n // have been disposed before it ends up being applied. If that is the\n // case, we shouldn't do anything.\n if (!this._overlayRef || !this._overlayRef.hasAttached()) {\n return;\n }\n const styles = this._overlayRef.overlayElement.style;\n const parentStyles = this._overlayRef.hostElement.style;\n const config = this._overlayRef.getConfig();\n const { width, height, maxWidth, maxHeight } = config;\n const shouldBeFlushHorizontally = (width === '100%' || width === '100vw') &&\n (!maxWidth || maxWidth === '100%' || maxWidth === '100vw');\n const shouldBeFlushVertically = (height === '100%' || height === '100vh') &&\n (!maxHeight || maxHeight === '100%' || maxHeight === '100vh');\n styles.position = this._cssPosition;\n styles.marginLeft = shouldBeFlushHorizontally ? '0' : this._leftOffset;\n styles.marginTop = shouldBeFlushVertically ? '0' : this._topOffset;\n styles.marginBottom = this._bottomOffset;\n styles.marginRight = this._rightOffset;\n if (shouldBeFlushHorizontally) {\n parentStyles.justifyContent = 'flex-start';\n }\n else if (this._justifyContent === 'center') {\n parentStyles.justifyContent = 'center';\n }\n else if (this._overlayRef.getConfig().direction === 'rtl') {\n // In RTL the browser will invert `flex-start` and `flex-end` automatically, but we\n // don't want that because our positioning is explicitly `left` and `right`, hence\n // why we do another inversion to ensure that the overlay stays in the same position.\n // TODO: reconsider this if we add `start` and `end` methods.\n if (this._justifyContent === 'flex-start') {\n parentStyles.justifyContent = 'flex-end';\n }\n else if (this._justifyContent === 'flex-end') {\n parentStyles.justifyContent = 'flex-start';\n }\n }\n else {\n parentStyles.justifyContent = this._justifyContent;\n }\n parentStyles.alignItems = shouldBeFlushVertically ? 'flex-start' : this._alignItems;\n }\n /**\n * Cleans up the DOM changes from the position strategy.\n * @docs-private\n */\n dispose() {\n if (this._isDisposed || !this._overlayRef) {\n return;\n }\n const styles = this._overlayRef.overlayElement.style;\n const parent = this._overlayRef.hostElement;\n const parentStyles = parent.style;\n parent.classList.remove(wrapperClass);\n parentStyles.justifyContent =\n parentStyles.alignItems =\n styles.marginTop =\n styles.marginBottom =\n styles.marginLeft =\n styles.marginRight =\n styles.position =\n '';\n this._overlayRef = null;\n this._isDisposed = true;\n }\n}\n\n/** Builder for overlay position strategy. */\nclass OverlayPositionBuilder {\n constructor(_viewportRuler, _document, _platform, _overlayContainer) {\n this._viewportRuler = _viewportRuler;\n this._document = _document;\n this._platform = _platform;\n this._overlayContainer = _overlayContainer;\n }\n /**\n * Creates a global position strategy.\n */\n global() {\n return new GlobalPositionStrategy();\n }\n /**\n * Creates a flexible position strategy.\n * @param origin Origin relative to which to position the overlay.\n */\n flexibleConnectedTo(origin) {\n return new FlexibleConnectedPositionStrategy(origin, this._viewportRuler, this._document, this._platform, this._overlayContainer);\n }\n}\nOverlayPositionBuilder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayPositionBuilder, deps: [{ token: i1.ViewportRuler }, { token: DOCUMENT }, { token: i1$1.Platform }, { token: OverlayContainer }], target: i0.ɵɵFactoryTarget.Injectable });\nOverlayPositionBuilder.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayPositionBuilder, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayPositionBuilder, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: i1.ViewportRuler }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i1$1.Platform }, { type: OverlayContainer }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Service for dispatching events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nclass BaseOverlayDispatcher {\n constructor(document) {\n /** Currently attached overlays in the order they were attached. */\n this._attachedOverlays = [];\n this._document = document;\n }\n ngOnDestroy() {\n this.detach();\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n // Ensure that we don't get the same overlay multiple times.\n this.remove(overlayRef);\n this._attachedOverlays.push(overlayRef);\n }\n /** Remove an overlay from the list of attached overlay refs. */\n remove(overlayRef) {\n const index = this._attachedOverlays.indexOf(overlayRef);\n if (index > -1) {\n this._attachedOverlays.splice(index, 1);\n }\n // Remove the global listener once there are no more overlays.\n if (this._attachedOverlays.length === 0) {\n this.detach();\n }\n }\n}\nBaseOverlayDispatcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: BaseOverlayDispatcher, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });\nBaseOverlayDispatcher.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: BaseOverlayDispatcher, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: BaseOverlayDispatcher, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Service for dispatching keyboard events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nclass OverlayKeyboardDispatcher extends BaseOverlayDispatcher {\n constructor(document, \n /** @breaking-change 14.0.0 _ngZone will be required. */\n _ngZone) {\n super(document);\n this._ngZone = _ngZone;\n /** Keyboard event listener that will be attached to the body. */\n this._keydownListener = (event) => {\n const overlays = this._attachedOverlays;\n for (let i = overlays.length - 1; i > -1; i--) {\n // Dispatch the keydown event to the top overlay which has subscribers to its keydown events.\n // We want to target the most recent overlay, rather than trying to match where the event came\n // from, because some components might open an overlay, but keep focus on a trigger element\n // (e.g. for select and autocomplete). We skip overlays without keydown event subscriptions,\n // because we don't want overlays that don't handle keyboard events to block the ones below\n // them that do.\n if (overlays[i]._keydownEvents.observers.length > 0) {\n const keydownEvents = overlays[i]._keydownEvents;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.run(() => keydownEvents.next(event));\n }\n else {\n keydownEvents.next(event);\n }\n break;\n }\n }\n };\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n super.add(overlayRef);\n // Lazily start dispatcher once first overlay is added\n if (!this._isAttached) {\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.runOutsideAngular(() => this._document.body.addEventListener('keydown', this._keydownListener));\n }\n else {\n this._document.body.addEventListener('keydown', this._keydownListener);\n }\n this._isAttached = true;\n }\n }\n /** Detaches the global keyboard event listener. */\n detach() {\n if (this._isAttached) {\n this._document.body.removeEventListener('keydown', this._keydownListener);\n this._isAttached = false;\n }\n }\n}\nOverlayKeyboardDispatcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayKeyboardDispatcher, deps: [{ token: DOCUMENT }, { token: i0.NgZone, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nOverlayKeyboardDispatcher.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayKeyboardDispatcher, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayKeyboardDispatcher, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i0.NgZone, decorators: [{\n type: Optional\n }] }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Service for dispatching mouse click events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nclass OverlayOutsideClickDispatcher extends BaseOverlayDispatcher {\n constructor(document, _platform, \n /** @breaking-change 14.0.0 _ngZone will be required. */\n _ngZone) {\n super(document);\n this._platform = _platform;\n this._ngZone = _ngZone;\n this._cursorStyleIsSet = false;\n /** Store pointerdown event target to track origin of click. */\n this._pointerDownListener = (event) => {\n this._pointerDownEventTarget = _getEventTarget(event);\n };\n /** Click event listener that will be attached to the body propagate phase. */\n this._clickListener = (event) => {\n const target = _getEventTarget(event);\n // In case of a click event, we want to check the origin of the click\n // (e.g. in case where a user starts a click inside the overlay and\n // releases the click outside of it).\n // This is done by using the event target of the preceding pointerdown event.\n // Every click event caused by a pointer device has a preceding pointerdown\n // event, unless the click was programmatically triggered (e.g. in a unit test).\n const origin = event.type === 'click' && this._pointerDownEventTarget\n ? this._pointerDownEventTarget\n : target;\n // Reset the stored pointerdown event target, to avoid having it interfere\n // in subsequent events.\n this._pointerDownEventTarget = null;\n // We copy the array because the original may be modified asynchronously if the\n // outsidePointerEvents listener decides to detach overlays resulting in index errors inside\n // the for loop.\n const overlays = this._attachedOverlays.slice();\n // Dispatch the mouse event to the top overlay which has subscribers to its mouse events.\n // We want to target all overlays for which the click could be considered as outside click.\n // As soon as we reach an overlay for which the click is not outside click we break off\n // the loop.\n for (let i = overlays.length - 1; i > -1; i--) {\n const overlayRef = overlays[i];\n if (overlayRef._outsidePointerEvents.observers.length < 1 || !overlayRef.hasAttached()) {\n continue;\n }\n // If it's a click inside the overlay, just break - we should do nothing\n // If it's an outside click (both origin and target of the click) dispatch the mouse event,\n // and proceed with the next overlay\n if (overlayRef.overlayElement.contains(target) ||\n overlayRef.overlayElement.contains(origin)) {\n break;\n }\n const outsidePointerEvents = overlayRef._outsidePointerEvents;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.run(() => outsidePointerEvents.next(event));\n }\n else {\n outsidePointerEvents.next(event);\n }\n }\n };\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n super.add(overlayRef);\n // Safari on iOS does not generate click events for non-interactive\n // elements. However, we want to receive a click for any element outside\n // the overlay. We can force a \"clickable\" state by setting\n // `cursor: pointer` on the document body. See:\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event#Safari_Mobile\n // https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html\n if (!this._isAttached) {\n const body = this._document.body;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.runOutsideAngular(() => this._addEventListeners(body));\n }\n else {\n this._addEventListeners(body);\n }\n // click event is not fired on iOS. To make element \"clickable\" we are\n // setting the cursor to pointer\n if (this._platform.IOS && !this._cursorStyleIsSet) {\n this._cursorOriginalValue = body.style.cursor;\n body.style.cursor = 'pointer';\n this._cursorStyleIsSet = true;\n }\n this._isAttached = true;\n }\n }\n /** Detaches the global keyboard event listener. */\n detach() {\n if (this._isAttached) {\n const body = this._document.body;\n body.removeEventListener('pointerdown', this._pointerDownListener, true);\n body.removeEventListener('click', this._clickListener, true);\n body.removeEventListener('auxclick', this._clickListener, true);\n body.removeEventListener('contextmenu', this._clickListener, true);\n if (this._platform.IOS && this._cursorStyleIsSet) {\n body.style.cursor = this._cursorOriginalValue;\n this._cursorStyleIsSet = false;\n }\n this._isAttached = false;\n }\n }\n _addEventListeners(body) {\n body.addEventListener('pointerdown', this._pointerDownListener, true);\n body.addEventListener('click', this._clickListener, true);\n body.addEventListener('auxclick', this._clickListener, true);\n body.addEventListener('contextmenu', this._clickListener, true);\n }\n}\nOverlayOutsideClickDispatcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayOutsideClickDispatcher, deps: [{ token: DOCUMENT }, { token: i1$1.Platform }, { token: i0.NgZone, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nOverlayOutsideClickDispatcher.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayOutsideClickDispatcher, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayOutsideClickDispatcher, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i1$1.Platform }, { type: i0.NgZone, decorators: [{\n type: Optional\n }] }];\n } });\n\n/** Next overlay unique ID. */\nlet nextUniqueId = 0;\n// Note that Overlay is *not* scoped to the app root because of the ComponentFactoryResolver\n// which needs to be different depending on where OverlayModule is imported.\n/**\n * Service to create Overlays. Overlays are dynamically added pieces of floating UI, meant to be\n * used as a low-level building block for other components. Dialogs, tooltips, menus,\n * selects, etc. can all be built using overlays. The service should primarily be used by authors\n * of re-usable components rather than developers building end-user applications.\n *\n * An overlay *is* a PortalOutlet, so any kind of Portal can be loaded into one.\n */\nclass Overlay {\n constructor(\n /** Scrolling strategies that can be used when creating an overlay. */\n scrollStrategies, _overlayContainer, _componentFactoryResolver, _positionBuilder, _keyboardDispatcher, _injector, _ngZone, _document, _directionality, _location, _outsideClickDispatcher) {\n this.scrollStrategies = scrollStrategies;\n this._overlayContainer = _overlayContainer;\n this._componentFactoryResolver = _componentFactoryResolver;\n this._positionBuilder = _positionBuilder;\n this._keyboardDispatcher = _keyboardDispatcher;\n this._injector = _injector;\n this._ngZone = _ngZone;\n this._document = _document;\n this._directionality = _directionality;\n this._location = _location;\n this._outsideClickDispatcher = _outsideClickDispatcher;\n }\n /**\n * Creates an overlay.\n * @param config Configuration applied to the overlay.\n * @returns Reference to the created overlay.\n */\n create(config) {\n const host = this._createHostElement();\n const pane = this._createPaneElement(host);\n const portalOutlet = this._createPortalOutlet(pane);\n const overlayConfig = new OverlayConfig(config);\n overlayConfig.direction = overlayConfig.direction || this._directionality.value;\n return new OverlayRef(portalOutlet, host, pane, overlayConfig, this._ngZone, this._keyboardDispatcher, this._document, this._location, this._outsideClickDispatcher);\n }\n /**\n * Gets a position builder that can be used, via fluent API,\n * to construct and configure a position strategy.\n * @returns An overlay position builder.\n */\n position() {\n return this._positionBuilder;\n }\n /**\n * Creates the DOM element for an overlay and appends it to the overlay container.\n * @returns Newly-created pane element\n */\n _createPaneElement(host) {\n const pane = this._document.createElement('div');\n pane.id = `cdk-overlay-${nextUniqueId++}`;\n pane.classList.add('cdk-overlay-pane');\n host.appendChild(pane);\n return pane;\n }\n /**\n * Creates the host element that wraps around an overlay\n * and can be used for advanced positioning.\n * @returns Newly-create host element.\n */\n _createHostElement() {\n const host = this._document.createElement('div');\n this._overlayContainer.getContainerElement().appendChild(host);\n return host;\n }\n /**\n * Create a DomPortalOutlet into which the overlay content can be loaded.\n * @param pane The DOM element to turn into a portal outlet.\n * @returns A portal outlet for the given DOM element.\n */\n _createPortalOutlet(pane) {\n // We have to resolve the ApplicationRef later in order to allow people\n // to use overlay-based providers during app initialization.\n if (!this._appRef) {\n this._appRef = this._injector.get(ApplicationRef);\n }\n return new DomPortalOutlet(pane, this._componentFactoryResolver, this._appRef, this._injector, this._document);\n }\n}\nOverlay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Overlay, deps: [{ token: ScrollStrategyOptions }, { token: OverlayContainer }, { token: i0.ComponentFactoryResolver }, { token: OverlayPositionBuilder }, { token: OverlayKeyboardDispatcher }, { token: i0.Injector }, { token: i0.NgZone }, { token: DOCUMENT }, { token: i5.Directionality }, { token: i6.Location }, { token: OverlayOutsideClickDispatcher }], target: i0.ɵɵFactoryTarget.Injectable });\nOverlay.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Overlay });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Overlay, decorators: [{\n type: Injectable\n }], ctorParameters: function () {\n return [{ type: ScrollStrategyOptions }, { type: OverlayContainer }, { type: i0.ComponentFactoryResolver }, { type: OverlayPositionBuilder }, { type: OverlayKeyboardDispatcher }, { type: i0.Injector }, { type: i0.NgZone }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i5.Directionality }, { type: i6.Location }, { type: OverlayOutsideClickDispatcher }];\n } });\n\n/** Default set of positions for the overlay. Follows the behavior of a dropdown. */\nconst defaultPositionList = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n },\n];\n/** Injection token that determines the scroll handling while the connected overlay is open. */\nconst CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY = new InjectionToken('cdk-connected-overlay-scroll-strategy');\n/**\n * Directive applied to an element to make it usable as an origin for an Overlay using a\n * ConnectedPositionStrategy.\n */\nclass CdkOverlayOrigin {\n constructor(\n /** Reference to the element on which the directive is applied. */\n elementRef) {\n this.elementRef = elementRef;\n }\n}\nCdkOverlayOrigin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkOverlayOrigin, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });\nCdkOverlayOrigin.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkOverlayOrigin, selector: \"[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]\", exportAs: [\"cdkOverlayOrigin\"], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkOverlayOrigin, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]',\n exportAs: 'cdkOverlayOrigin',\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });\n/**\n * Directive to facilitate declarative creation of an\n * Overlay using a FlexibleConnectedPositionStrategy.\n */\nclass CdkConnectedOverlay {\n // TODO(jelbourn): inputs for size, scroll behavior, animation, etc.\n constructor(_overlay, templateRef, viewContainerRef, scrollStrategyFactory, _dir) {\n this._overlay = _overlay;\n this._dir = _dir;\n this._hasBackdrop = false;\n this._lockPosition = false;\n this._growAfterOpen = false;\n this._flexibleDimensions = false;\n this._push = false;\n this._backdropSubscription = Subscription.EMPTY;\n this._attachSubscription = Subscription.EMPTY;\n this._detachSubscription = Subscription.EMPTY;\n this._positionSubscription = Subscription.EMPTY;\n /** Margin between the overlay and the viewport edges. */\n this.viewportMargin = 0;\n /** Whether the overlay is open. */\n this.open = false;\n /** Whether the overlay can be closed by user interaction. */\n this.disableClose = false;\n /** Event emitted when the backdrop is clicked. */\n this.backdropClick = new EventEmitter();\n /** Event emitted when the position has changed. */\n this.positionChange = new EventEmitter();\n /** Event emitted when the overlay has been attached. */\n this.attach = new EventEmitter();\n /** Event emitted when the overlay has been detached. */\n this.detach = new EventEmitter();\n /** Emits when there are keyboard events that are targeted at the overlay. */\n this.overlayKeydown = new EventEmitter();\n /** Emits when there are mouse outside click events that are targeted at the overlay. */\n this.overlayOutsideClick = new EventEmitter();\n this._templatePortal = new TemplatePortal(templateRef, viewContainerRef);\n this._scrollStrategyFactory = scrollStrategyFactory;\n this.scrollStrategy = this._scrollStrategyFactory();\n }\n /** The offset in pixels for the overlay connection point on the x-axis */\n get offsetX() {\n return this._offsetX;\n }\n set offsetX(offsetX) {\n this._offsetX = offsetX;\n if (this._position) {\n this._updatePositionStrategy(this._position);\n }\n }\n /** The offset in pixels for the overlay connection point on the y-axis */\n get offsetY() {\n return this._offsetY;\n }\n set offsetY(offsetY) {\n this._offsetY = offsetY;\n if (this._position) {\n this._updatePositionStrategy(this._position);\n }\n }\n /** Whether or not the overlay should attach a backdrop. */\n get hasBackdrop() {\n return this._hasBackdrop;\n }\n set hasBackdrop(value) {\n this._hasBackdrop = coerceBooleanProperty(value);\n }\n /** Whether or not the overlay should be locked when scrolling. */\n get lockPosition() {\n return this._lockPosition;\n }\n set lockPosition(value) {\n this._lockPosition = coerceBooleanProperty(value);\n }\n /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n get flexibleDimensions() {\n return this._flexibleDimensions;\n }\n set flexibleDimensions(value) {\n this._flexibleDimensions = coerceBooleanProperty(value);\n }\n /** Whether the overlay can grow after the initial open when flexible positioning is turned on. */\n get growAfterOpen() {\n return this._growAfterOpen;\n }\n set growAfterOpen(value) {\n this._growAfterOpen = coerceBooleanProperty(value);\n }\n /** Whether the overlay can be pushed on-screen if none of the provided positions fit. */\n get push() {\n return this._push;\n }\n set push(value) {\n this._push = coerceBooleanProperty(value);\n }\n /** The associated overlay reference. */\n get overlayRef() {\n return this._overlayRef;\n }\n /** The element's layout direction. */\n get dir() {\n return this._dir ? this._dir.value : 'ltr';\n }\n ngOnDestroy() {\n this._attachSubscription.unsubscribe();\n this._detachSubscription.unsubscribe();\n this._backdropSubscription.unsubscribe();\n this._positionSubscription.unsubscribe();\n if (this._overlayRef) {\n this._overlayRef.dispose();\n }\n }\n ngOnChanges(changes) {\n if (this._position) {\n this._updatePositionStrategy(this._position);\n this._overlayRef.updateSize({\n width: this.width,\n minWidth: this.minWidth,\n height: this.height,\n minHeight: this.minHeight,\n });\n if (changes['origin'] && this.open) {\n this._position.apply();\n }\n }\n if (changes['open']) {\n this.open ? this._attachOverlay() : this._detachOverlay();\n }\n }\n /** Creates an overlay */\n _createOverlay() {\n if (!this.positions || !this.positions.length) {\n this.positions = defaultPositionList;\n }\n const overlayRef = (this._overlayRef = this._overlay.create(this._buildConfig()));\n this._attachSubscription = overlayRef.attachments().subscribe(() => this.attach.emit());\n this._detachSubscription = overlayRef.detachments().subscribe(() => this.detach.emit());\n overlayRef.keydownEvents().subscribe((event) => {\n this.overlayKeydown.next(event);\n if (event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event)) {\n event.preventDefault();\n this._detachOverlay();\n }\n });\n this._overlayRef.outsidePointerEvents().subscribe((event) => {\n this.overlayOutsideClick.next(event);\n });\n }\n /** Builds the overlay config based on the directive's inputs */\n _buildConfig() {\n const positionStrategy = (this._position =\n this.positionStrategy || this._createPositionStrategy());\n const overlayConfig = new OverlayConfig({\n direction: this._dir,\n positionStrategy,\n scrollStrategy: this.scrollStrategy,\n hasBackdrop: this.hasBackdrop,\n });\n if (this.width || this.width === 0) {\n overlayConfig.width = this.width;\n }\n if (this.height || this.height === 0) {\n overlayConfig.height = this.height;\n }\n if (this.minWidth || this.minWidth === 0) {\n overlayConfig.minWidth = this.minWidth;\n }\n if (this.minHeight || this.minHeight === 0) {\n overlayConfig.minHeight = this.minHeight;\n }\n if (this.backdropClass) {\n overlayConfig.backdropClass = this.backdropClass;\n }\n if (this.panelClass) {\n overlayConfig.panelClass = this.panelClass;\n }\n return overlayConfig;\n }\n /** Updates the state of a position strategy, based on the values of the directive inputs. */\n _updatePositionStrategy(positionStrategy) {\n const positions = this.positions.map(currentPosition => ({\n originX: currentPosition.originX,\n originY: currentPosition.originY,\n overlayX: currentPosition.overlayX,\n overlayY: currentPosition.overlayY,\n offsetX: currentPosition.offsetX || this.offsetX,\n offsetY: currentPosition.offsetY || this.offsetY,\n panelClass: currentPosition.panelClass || undefined,\n }));\n return positionStrategy\n .setOrigin(this._getFlexibleConnectedPositionStrategyOrigin())\n .withPositions(positions)\n .withFlexibleDimensions(this.flexibleDimensions)\n .withPush(this.push)\n .withGrowAfterOpen(this.growAfterOpen)\n .withViewportMargin(this.viewportMargin)\n .withLockedPosition(this.lockPosition)\n .withTransformOriginOn(this.transformOriginSelector);\n }\n /** Returns the position strategy of the overlay to be set on the overlay config */\n _createPositionStrategy() {\n const strategy = this._overlay\n .position()\n .flexibleConnectedTo(this._getFlexibleConnectedPositionStrategyOrigin());\n this._updatePositionStrategy(strategy);\n return strategy;\n }\n _getFlexibleConnectedPositionStrategyOrigin() {\n if (this.origin instanceof CdkOverlayOrigin) {\n return this.origin.elementRef;\n }\n else {\n return this.origin;\n }\n }\n /** Attaches the overlay and subscribes to backdrop clicks if backdrop exists */\n _attachOverlay() {\n if (!this._overlayRef) {\n this._createOverlay();\n }\n else {\n // Update the overlay size, in case the directive's inputs have changed\n this._overlayRef.getConfig().hasBackdrop = this.hasBackdrop;\n }\n if (!this._overlayRef.hasAttached()) {\n this._overlayRef.attach(this._templatePortal);\n }\n if (this.hasBackdrop) {\n this._backdropSubscription = this._overlayRef.backdropClick().subscribe(event => {\n this.backdropClick.emit(event);\n });\n }\n else {\n this._backdropSubscription.unsubscribe();\n }\n this._positionSubscription.unsubscribe();\n // Only subscribe to `positionChanges` if requested, because putting\n // together all the information for it can be expensive.\n if (this.positionChange.observers.length > 0) {\n this._positionSubscription = this._position.positionChanges\n .pipe(takeWhile(() => this.positionChange.observers.length > 0))\n .subscribe(position => {\n this.positionChange.emit(position);\n if (this.positionChange.observers.length === 0) {\n this._positionSubscription.unsubscribe();\n }\n });\n }\n }\n /** Detaches the overlay and unsubscribes to backdrop clicks if backdrop exists */\n _detachOverlay() {\n if (this._overlayRef) {\n this._overlayRef.detach();\n }\n this._backdropSubscription.unsubscribe();\n this._positionSubscription.unsubscribe();\n }\n}\nCdkConnectedOverlay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkConnectedOverlay, deps: [{ token: Overlay }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY }, { token: i5.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nCdkConnectedOverlay.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkConnectedOverlay, selector: \"[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]\", inputs: { origin: [\"cdkConnectedOverlayOrigin\", \"origin\"], positions: [\"cdkConnectedOverlayPositions\", \"positions\"], positionStrategy: [\"cdkConnectedOverlayPositionStrategy\", \"positionStrategy\"], offsetX: [\"cdkConnectedOverlayOffsetX\", \"offsetX\"], offsetY: [\"cdkConnectedOverlayOffsetY\", \"offsetY\"], width: [\"cdkConnectedOverlayWidth\", \"width\"], height: [\"cdkConnectedOverlayHeight\", \"height\"], minWidth: [\"cdkConnectedOverlayMinWidth\", \"minWidth\"], minHeight: [\"cdkConnectedOverlayMinHeight\", \"minHeight\"], backdropClass: [\"cdkConnectedOverlayBackdropClass\", \"backdropClass\"], panelClass: [\"cdkConnectedOverlayPanelClass\", \"panelClass\"], viewportMargin: [\"cdkConnectedOverlayViewportMargin\", \"viewportMargin\"], scrollStrategy: [\"cdkConnectedOverlayScrollStrategy\", \"scrollStrategy\"], open: [\"cdkConnectedOverlayOpen\", \"open\"], disableClose: [\"cdkConnectedOverlayDisableClose\", \"disableClose\"], transformOriginSelector: [\"cdkConnectedOverlayTransformOriginOn\", \"transformOriginSelector\"], hasBackdrop: [\"cdkConnectedOverlayHasBackdrop\", \"hasBackdrop\"], lockPosition: [\"cdkConnectedOverlayLockPosition\", \"lockPosition\"], flexibleDimensions: [\"cdkConnectedOverlayFlexibleDimensions\", \"flexibleDimensions\"], growAfterOpen: [\"cdkConnectedOverlayGrowAfterOpen\", \"growAfterOpen\"], push: [\"cdkConnectedOverlayPush\", \"push\"] }, outputs: { backdropClick: \"backdropClick\", positionChange: \"positionChange\", attach: \"attach\", detach: \"detach\", overlayKeydown: \"overlayKeydown\", overlayOutsideClick: \"overlayOutsideClick\" }, exportAs: [\"cdkConnectedOverlay\"], usesOnChanges: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkConnectedOverlay, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]',\n exportAs: 'cdkConnectedOverlay',\n }]\n }], ctorParameters: function () {\n return [{ type: Overlay }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY]\n }] }, { type: i5.Directionality, decorators: [{\n type: Optional\n }] }];\n }, propDecorators: { origin: [{\n type: Input,\n args: ['cdkConnectedOverlayOrigin']\n }], positions: [{\n type: Input,\n args: ['cdkConnectedOverlayPositions']\n }], positionStrategy: [{\n type: Input,\n args: ['cdkConnectedOverlayPositionStrategy']\n }], offsetX: [{\n type: Input,\n args: ['cdkConnectedOverlayOffsetX']\n }], offsetY: [{\n type: Input,\n args: ['cdkConnectedOverlayOffsetY']\n }], width: [{\n type: Input,\n args: ['cdkConnectedOverlayWidth']\n }], height: [{\n type: Input,\n args: ['cdkConnectedOverlayHeight']\n }], minWidth: [{\n type: Input,\n args: ['cdkConnectedOverlayMinWidth']\n }], minHeight: [{\n type: Input,\n args: ['cdkConnectedOverlayMinHeight']\n }], backdropClass: [{\n type: Input,\n args: ['cdkConnectedOverlayBackdropClass']\n }], panelClass: [{\n type: Input,\n args: ['cdkConnectedOverlayPanelClass']\n }], viewportMargin: [{\n type: Input,\n args: ['cdkConnectedOverlayViewportMargin']\n }], scrollStrategy: [{\n type: Input,\n args: ['cdkConnectedOverlayScrollStrategy']\n }], open: [{\n type: Input,\n args: ['cdkConnectedOverlayOpen']\n }], disableClose: [{\n type: Input,\n args: ['cdkConnectedOverlayDisableClose']\n }], transformOriginSelector: [{\n type: Input,\n args: ['cdkConnectedOverlayTransformOriginOn']\n }], hasBackdrop: [{\n type: Input,\n args: ['cdkConnectedOverlayHasBackdrop']\n }], lockPosition: [{\n type: Input,\n args: ['cdkConnectedOverlayLockPosition']\n }], flexibleDimensions: [{\n type: Input,\n args: ['cdkConnectedOverlayFlexibleDimensions']\n }], growAfterOpen: [{\n type: Input,\n args: ['cdkConnectedOverlayGrowAfterOpen']\n }], push: [{\n type: Input,\n args: ['cdkConnectedOverlayPush']\n }], backdropClick: [{\n type: Output\n }], positionChange: [{\n type: Output\n }], attach: [{\n type: Output\n }], detach: [{\n type: Output\n }], overlayKeydown: [{\n type: Output\n }], overlayOutsideClick: [{\n type: Output\n }] } });\n/** @docs-private */\nfunction CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {\n return () => overlay.scrollStrategies.reposition();\n}\n/** @docs-private */\nconst CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER = {\n provide: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY,\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass OverlayModule {\n}\nOverlayModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nOverlayModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayModule, declarations: [CdkConnectedOverlay, CdkOverlayOrigin], imports: [BidiModule, PortalModule, ScrollingModule], exports: [CdkConnectedOverlay, CdkOverlayOrigin, ScrollingModule] });\nOverlayModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayModule, providers: [Overlay, CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER], imports: [[BidiModule, PortalModule, ScrollingModule], ScrollingModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: OverlayModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [BidiModule, PortalModule, ScrollingModule],\n exports: [CdkConnectedOverlay, CdkOverlayOrigin, ScrollingModule],\n declarations: [CdkConnectedOverlay, CdkOverlayOrigin],\n providers: [Overlay, CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Alternative to OverlayContainer that supports correct displaying of overlay elements in\n * Fullscreen mode\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen\n *\n * Should be provided in the root component.\n */\nclass FullscreenOverlayContainer extends OverlayContainer {\n constructor(_document, platform) {\n super(_document, platform);\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n if (this._fullScreenEventName && this._fullScreenListener) {\n this._document.removeEventListener(this._fullScreenEventName, this._fullScreenListener);\n }\n }\n _createContainer() {\n super._createContainer();\n this._adjustParentForFullscreenChange();\n this._addFullscreenChangeListener(() => this._adjustParentForFullscreenChange());\n }\n _adjustParentForFullscreenChange() {\n if (!this._containerElement) {\n return;\n }\n const fullscreenElement = this.getFullscreenElement();\n const parent = fullscreenElement || this._document.body;\n parent.appendChild(this._containerElement);\n }\n _addFullscreenChangeListener(fn) {\n const eventName = this._getEventName();\n if (eventName) {\n if (this._fullScreenListener) {\n this._document.removeEventListener(eventName, this._fullScreenListener);\n }\n this._document.addEventListener(eventName, fn);\n this._fullScreenListener = fn;\n }\n }\n _getEventName() {\n if (!this._fullScreenEventName) {\n const _document = this._document;\n if (_document.fullscreenEnabled) {\n this._fullScreenEventName = 'fullscreenchange';\n }\n else if (_document.webkitFullscreenEnabled) {\n this._fullScreenEventName = 'webkitfullscreenchange';\n }\n else if (_document.mozFullScreenEnabled) {\n this._fullScreenEventName = 'mozfullscreenchange';\n }\n else if (_document.msFullscreenEnabled) {\n this._fullScreenEventName = 'MSFullscreenChange';\n }\n }\n return this._fullScreenEventName;\n }\n /**\n * When the page is put into fullscreen mode, a specific element is specified.\n * Only that element and its children are visible when in fullscreen mode.\n */\n getFullscreenElement() {\n const _document = this._document;\n return (_document.fullscreenElement ||\n _document.webkitFullscreenElement ||\n _document.mozFullScreenElement ||\n _document.msFullscreenElement ||\n null);\n }\n}\nFullscreenOverlayContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FullscreenOverlayContainer, deps: [{ token: DOCUMENT }, { token: i1$1.Platform }], target: i0.ɵɵFactoryTarget.Injectable });\nFullscreenOverlayContainer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FullscreenOverlayContainer, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: FullscreenOverlayContainer, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i1$1.Platform }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BlockScrollStrategy, CdkConnectedOverlay, CdkOverlayOrigin, CloseScrollStrategy, ConnectedOverlayPositionChange, ConnectionPositionPair, FlexibleConnectedPositionStrategy, FullscreenOverlayContainer, GlobalPositionStrategy, NoopScrollStrategy, Overlay, OverlayConfig, OverlayContainer, OverlayKeyboardDispatcher, OverlayModule, OverlayOutsideClickDispatcher, OverlayPositionBuilder, OverlayRef, RepositionScrollStrategy, ScrollStrategyOptions, ScrollingVisibility, validateHorizontalPosition, validateVerticalPosition };\n","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function takeWhile(predicate, inclusive = false) {\n return operate((source, subscriber) => {\n let index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, (value) => {\n const result = predicate(value, index++);\n (result || inclusive) && subscriber.next(value);\n !result && subscriber.complete();\n }));\n });\n}\n","import * as i0 from '@angular/core';\nimport { PLATFORM_ID, Injectable, Inject, NgModule } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Whether the current platform supports the V8 Break Iterator. The V8 check\n// is necessary to detect all Blink based browsers.\nlet hasV8BreakIterator;\n// We need a try/catch around the reference to `Intl`, because accessing it in some cases can\n// cause IE to throw. These cases are tied to particular versions of Windows and can happen if\n// the consumer is providing a polyfilled `Map`. See:\n// https://github.com/Microsoft/ChakraCore/issues/3189\n// https://github.com/angular/components/issues/15687\ntry {\n hasV8BreakIterator = typeof Intl !== 'undefined' && Intl.v8BreakIterator;\n}\ncatch (_a) {\n hasV8BreakIterator = false;\n}\n/**\n * Service to detect the current platform by comparing the userAgent strings and\n * checking browser-specific global properties.\n */\nclass Platform {\n constructor(_platformId) {\n this._platformId = _platformId;\n // We want to use the Angular platform check because if the Document is shimmed\n // without the navigator, the following checks will fail. This is preferred because\n // sometimes the Document may be shimmed without the user's knowledge or intention\n /** Whether the Angular application is being rendered in the browser. */\n this.isBrowser = this._platformId\n ? isPlatformBrowser(this._platformId)\n : typeof document === 'object' && !!document;\n /** Whether the current browser is Microsoft Edge. */\n this.EDGE = this.isBrowser && /(edge)/i.test(navigator.userAgent);\n /** Whether the current rendering engine is Microsoft Trident. */\n this.TRIDENT = this.isBrowser && /(msie|trident)/i.test(navigator.userAgent);\n // EdgeHTML and Trident mock Blink specific things and need to be excluded from this check.\n /** Whether the current rendering engine is Blink. */\n this.BLINK = this.isBrowser &&\n !!(window.chrome || hasV8BreakIterator) &&\n typeof CSS !== 'undefined' &&\n !this.EDGE &&\n !this.TRIDENT;\n // Webkit is part of the userAgent in EdgeHTML, Blink and Trident. Therefore we need to\n // ensure that Webkit runs standalone and is not used as another engine's base.\n /** Whether the current rendering engine is WebKit. */\n this.WEBKIT = this.isBrowser &&\n /AppleWebKit/i.test(navigator.userAgent) &&\n !this.BLINK &&\n !this.EDGE &&\n !this.TRIDENT;\n /** Whether the current platform is Apple iOS. */\n this.IOS = this.isBrowser && /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);\n // It's difficult to detect the plain Gecko engine, because most of the browsers identify\n // them self as Gecko-like browsers and modify the userAgent's according to that.\n // Since we only cover one explicit Firefox case, we can simply check for Firefox\n // instead of having an unstable check for Gecko.\n /** Whether the current browser is Firefox. */\n this.FIREFOX = this.isBrowser && /(firefox|minefield)/i.test(navigator.userAgent);\n /** Whether the current platform is Android. */\n // Trident on mobile adds the android platform to the userAgent to trick detections.\n this.ANDROID = this.isBrowser && /android/i.test(navigator.userAgent) && !this.TRIDENT;\n // Safari browsers will include the Safari keyword in their userAgent. Some browsers may fake\n // this and just place the Safari keyword in the userAgent. To be more safe about Safari every\n // Safari browser should also use Webkit as its layout engine.\n /** Whether the current browser is Safari. */\n this.SAFARI = this.isBrowser && /safari/i.test(navigator.userAgent) && this.WEBKIT;\n }\n}\nPlatform.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Platform, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });\nPlatform.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Platform, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: Platform, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: Object, decorators: [{\n type: Inject,\n args: [PLATFORM_ID]\n }] }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass PlatformModule {\n}\nPlatformModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PlatformModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nPlatformModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PlatformModule });\nPlatformModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PlatformModule });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PlatformModule, decorators: [{\n type: NgModule,\n args: [{}]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Cached result Set of input types support by the current browser. */\nlet supportedInputTypes;\n/** Types of `` that *might* be supported. */\nconst candidateInputTypes = [\n // `color` must come first. Chrome 56 shows a warning if we change the type to `color` after\n // first changing it to something else:\n // The specified value \"\" does not conform to the required format.\n // The format is \"#rrggbb\" where rr, gg, bb are two-digit hexadecimal numbers.\n 'color',\n 'button',\n 'checkbox',\n 'date',\n 'datetime-local',\n 'email',\n 'file',\n 'hidden',\n 'image',\n 'month',\n 'number',\n 'password',\n 'radio',\n 'range',\n 'reset',\n 'search',\n 'submit',\n 'tel',\n 'text',\n 'time',\n 'url',\n 'week',\n];\n/** @returns The input types supported by this browser. */\nfunction getSupportedInputTypes() {\n // Result is cached.\n if (supportedInputTypes) {\n return supportedInputTypes;\n }\n // We can't check if an input type is not supported until we're on the browser, so say that\n // everything is supported when not on the browser. We don't use `Platform` here since it's\n // just a helper function and can't inject it.\n if (typeof document !== 'object' || !document) {\n supportedInputTypes = new Set(candidateInputTypes);\n return supportedInputTypes;\n }\n let featureTestInput = document.createElement('input');\n supportedInputTypes = new Set(candidateInputTypes.filter(value => {\n featureTestInput.setAttribute('type', value);\n return featureTestInput.type === value;\n }));\n return supportedInputTypes;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Cached result of whether the user's browser supports passive event listeners. */\nlet supportsPassiveEvents;\n/**\n * Checks whether the user's browser supports passive event listeners.\n * See: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n */\nfunction supportsPassiveEventListeners() {\n if (supportsPassiveEvents == null && typeof window !== 'undefined') {\n try {\n window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\n get: () => (supportsPassiveEvents = true),\n }));\n }\n finally {\n supportsPassiveEvents = supportsPassiveEvents || false;\n }\n }\n return supportsPassiveEvents;\n}\n/**\n * Normalizes an `AddEventListener` object to something that can be passed\n * to `addEventListener` on any browser, no matter whether it supports the\n * `options` parameter.\n * @param options Object to be normalized.\n */\nfunction normalizePassiveListenerOptions(options) {\n return supportsPassiveEventListeners() ? options : !!options.capture;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Cached result of the way the browser handles the horizontal scroll axis in RTL mode. */\nlet rtlScrollAxisType;\n/** Cached result of the check that indicates whether the browser supports scroll behaviors. */\nlet scrollBehaviorSupported;\n/** Check whether the browser supports scroll behaviors. */\nfunction supportsScrollBehavior() {\n if (scrollBehaviorSupported == null) {\n // If we're not in the browser, it can't be supported. Also check for `Element`, because\n // some projects stub out the global `document` during SSR which can throw us off.\n if (typeof document !== 'object' || !document || typeof Element !== 'function' || !Element) {\n scrollBehaviorSupported = false;\n return scrollBehaviorSupported;\n }\n // If the element can have a `scrollBehavior` style, we can be sure that it's supported.\n if ('scrollBehavior' in document.documentElement.style) {\n scrollBehaviorSupported = true;\n }\n else {\n // At this point we have 3 possibilities: `scrollTo` isn't supported at all, it's\n // supported but it doesn't handle scroll behavior, or it has been polyfilled.\n const scrollToFunction = Element.prototype.scrollTo;\n if (scrollToFunction) {\n // We can detect if the function has been polyfilled by calling `toString` on it. Native\n // functions are obfuscated using `[native code]`, whereas if it was overwritten we'd get\n // the actual function source. Via https://davidwalsh.name/detect-native-function. Consider\n // polyfilled functions as supporting scroll behavior.\n scrollBehaviorSupported = !/\\{\\s*\\[native code\\]\\s*\\}/.test(scrollToFunction.toString());\n }\n else {\n scrollBehaviorSupported = false;\n }\n }\n }\n return scrollBehaviorSupported;\n}\n/**\n * Checks the type of RTL scroll axis used by this browser. As of time of writing, Chrome is NORMAL,\n * Firefox & Safari are NEGATED, and IE & Edge are INVERTED.\n */\nfunction getRtlScrollAxisType() {\n // We can't check unless we're on the browser. Just assume 'normal' if we're not.\n if (typeof document !== 'object' || !document) {\n return 0 /* NORMAL */;\n }\n if (rtlScrollAxisType == null) {\n // Create a 1px wide scrolling container and a 2px wide content element.\n const scrollContainer = document.createElement('div');\n const containerStyle = scrollContainer.style;\n scrollContainer.dir = 'rtl';\n containerStyle.width = '1px';\n containerStyle.overflow = 'auto';\n containerStyle.visibility = 'hidden';\n containerStyle.pointerEvents = 'none';\n containerStyle.position = 'absolute';\n const content = document.createElement('div');\n const contentStyle = content.style;\n contentStyle.width = '2px';\n contentStyle.height = '1px';\n scrollContainer.appendChild(content);\n document.body.appendChild(scrollContainer);\n rtlScrollAxisType = 0 /* NORMAL */;\n // The viewport starts scrolled all the way to the right in RTL mode. If we are in a NORMAL\n // browser this would mean that the scrollLeft should be 1. If it's zero instead we know we're\n // dealing with one of the other two types of browsers.\n if (scrollContainer.scrollLeft === 0) {\n // In a NEGATED browser the scrollLeft is always somewhere in [-maxScrollAmount, 0]. For an\n // INVERTED browser it is always somewhere in [0, maxScrollAmount]. We can determine which by\n // setting to the scrollLeft to 1. This is past the max for a NEGATED browser, so it will\n // return 0 when we read it again.\n scrollContainer.scrollLeft = 1;\n rtlScrollAxisType =\n scrollContainer.scrollLeft === 0 ? 1 /* NEGATED */ : 2 /* INVERTED */;\n }\n scrollContainer.remove();\n }\n return rtlScrollAxisType;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet shadowDomIsSupported;\n/** Checks whether the user's browser support Shadow DOM. */\nfunction _supportsShadowDom() {\n if (shadowDomIsSupported == null) {\n const head = typeof document !== 'undefined' ? document.head : null;\n shadowDomIsSupported = !!(head && (head.createShadowRoot || head.attachShadow));\n }\n return shadowDomIsSupported;\n}\n/** Gets the shadow root of an element, if supported and the element is inside the Shadow DOM. */\nfunction _getShadowRoot(element) {\n if (_supportsShadowDom()) {\n const rootNode = element.getRootNode ? element.getRootNode() : null;\n // Note that this should be caught by `_supportsShadowDom`, but some\n // teams have been able to hit this code path on unsupported browsers.\n if (typeof ShadowRoot !== 'undefined' && ShadowRoot && rootNode instanceof ShadowRoot) {\n return rootNode;\n }\n }\n return null;\n}\n/**\n * Gets the currently-focused element on the page while\n * also piercing through Shadow DOM boundaries.\n */\nfunction _getFocusedElementPierceShadowDom() {\n let activeElement = typeof document !== 'undefined' && document\n ? document.activeElement\n : null;\n while (activeElement && activeElement.shadowRoot) {\n const newActiveElement = activeElement.shadowRoot.activeElement;\n if (newActiveElement === activeElement) {\n break;\n }\n else {\n activeElement = newActiveElement;\n }\n }\n return activeElement;\n}\n/** Gets the target of an event while accounting for Shadow DOM. */\nfunction _getEventTarget(event) {\n // If an event is bound outside the Shadow DOM, the `event.target` will\n // point to the shadow root so we have to use `composedPath` instead.\n return (event.composedPath ? event.composedPath()[0] : event.target);\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Gets whether the code is currently running in a test environment. */\nfunction _isTestEnvironment() {\n // We can't use `declare const` because it causes conflicts inside Google with the real typings\n // for these symbols and we can't read them off the global object, because they don't appear to\n // be attached there for some runners like Jest.\n // (see: https://github.com/angular/components/issues/23365#issuecomment-938146643)\n return (\n // @ts-ignore\n (typeof __karma__ !== 'undefined' && !!__karma__) ||\n // @ts-ignore\n (typeof jasmine !== 'undefined' && !!jasmine) ||\n // @ts-ignore\n (typeof jest !== 'undefined' && !!jest) ||\n // @ts-ignore\n (typeof Mocha !== 'undefined' && !!Mocha));\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { Platform, PlatformModule, _getEventTarget, _getFocusedElementPierceShadowDom, _getShadowRoot, _isTestEnvironment, _supportsShadowDom, getRtlScrollAxisType, getSupportedInputTypes, normalizePassiveListenerOptions, supportsPassiveEventListeners, supportsScrollBehavior };\n","import * as i0 from '@angular/core';\nimport { ElementRef, Injector, Directive, EventEmitter, Inject, Output, NgModule } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Throws an exception when attempting to attach a null portal to a host.\n * @docs-private\n */\nfunction throwNullPortalError() {\n throw Error('Must provide a portal to attach');\n}\n/**\n * Throws an exception when attempting to attach a portal to a host that is already attached.\n * @docs-private\n */\nfunction throwPortalAlreadyAttachedError() {\n throw Error('Host already has a portal attached');\n}\n/**\n * Throws an exception when attempting to attach a portal to an already-disposed host.\n * @docs-private\n */\nfunction throwPortalOutletAlreadyDisposedError() {\n throw Error('This PortalOutlet has already been disposed');\n}\n/**\n * Throws an exception when attempting to attach an unknown portal type.\n * @docs-private\n */\nfunction throwUnknownPortalTypeError() {\n throw Error('Attempting to attach an unknown Portal type. BasePortalOutlet accepts either ' +\n 'a ComponentPortal or a TemplatePortal.');\n}\n/**\n * Throws an exception when attempting to attach a portal to a null host.\n * @docs-private\n */\nfunction throwNullPortalOutletError() {\n throw Error('Attempting to attach a portal to a null PortalOutlet');\n}\n/**\n * Throws an exception when attempting to detach a portal that is not attached.\n * @docs-private\n */\nfunction throwNoPortalAttachedError() {\n throw Error('Attempting to detach a portal that is not attached to a host');\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * A `Portal` is something that you want to render somewhere else.\n * It can be attach to / detached from a `PortalOutlet`.\n */\nclass Portal {\n /** Attach this portal to a host. */\n attach(host) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (host == null) {\n throwNullPortalOutletError();\n }\n if (host.hasAttached()) {\n throwPortalAlreadyAttachedError();\n }\n }\n this._attachedHost = host;\n return host.attach(this);\n }\n /** Detach this portal from its host */\n detach() {\n let host = this._attachedHost;\n if (host != null) {\n this._attachedHost = null;\n host.detach();\n }\n else if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throwNoPortalAttachedError();\n }\n }\n /** Whether this portal is attached to a host. */\n get isAttached() {\n return this._attachedHost != null;\n }\n /**\n * Sets the PortalOutlet reference without performing `attach()`. This is used directly by\n * the PortalOutlet when it is performing an `attach()` or `detach()`.\n */\n setAttachedHost(host) {\n this._attachedHost = host;\n }\n}\n/**\n * A `ComponentPortal` is a portal that instantiates some Component upon attachment.\n */\nclass ComponentPortal extends Portal {\n constructor(component, viewContainerRef, injector, componentFactoryResolver) {\n super();\n this.component = component;\n this.viewContainerRef = viewContainerRef;\n this.injector = injector;\n this.componentFactoryResolver = componentFactoryResolver;\n }\n}\n/**\n * A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).\n */\nclass TemplatePortal extends Portal {\n constructor(template, viewContainerRef, context) {\n super();\n this.templateRef = template;\n this.viewContainerRef = viewContainerRef;\n this.context = context;\n }\n get origin() {\n return this.templateRef.elementRef;\n }\n /**\n * Attach the portal to the provided `PortalOutlet`.\n * When a context is provided it will override the `context` property of the `TemplatePortal`\n * instance.\n */\n attach(host, context = this.context) {\n this.context = context;\n return super.attach(host);\n }\n detach() {\n this.context = undefined;\n return super.detach();\n }\n}\n/**\n * A `DomPortal` is a portal whose DOM element will be taken from its current position\n * in the DOM and moved into a portal outlet, when it is attached. On detach, the content\n * will be restored to its original position.\n */\nclass DomPortal extends Portal {\n constructor(element) {\n super();\n this.element = element instanceof ElementRef ? element.nativeElement : element;\n }\n}\n/**\n * Partial implementation of PortalOutlet that handles attaching\n * ComponentPortal and TemplatePortal.\n */\nclass BasePortalOutlet {\n constructor() {\n /** Whether this host has already been permanently disposed. */\n this._isDisposed = false;\n // @breaking-change 10.0.0 `attachDomPortal` to become a required abstract method.\n this.attachDomPortal = null;\n }\n /** Whether this host has an attached portal. */\n hasAttached() {\n return !!this._attachedPortal;\n }\n /** Attaches a portal. */\n attach(portal) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!portal) {\n throwNullPortalError();\n }\n if (this.hasAttached()) {\n throwPortalAlreadyAttachedError();\n }\n if (this._isDisposed) {\n throwPortalOutletAlreadyDisposedError();\n }\n }\n if (portal instanceof ComponentPortal) {\n this._attachedPortal = portal;\n return this.attachComponentPortal(portal);\n }\n else if (portal instanceof TemplatePortal) {\n this._attachedPortal = portal;\n return this.attachTemplatePortal(portal);\n // @breaking-change 10.0.0 remove null check for `this.attachDomPortal`.\n }\n else if (this.attachDomPortal && portal instanceof DomPortal) {\n this._attachedPortal = portal;\n return this.attachDomPortal(portal);\n }\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throwUnknownPortalTypeError();\n }\n }\n /** Detaches a previously attached portal. */\n detach() {\n if (this._attachedPortal) {\n this._attachedPortal.setAttachedHost(null);\n this._attachedPortal = null;\n }\n this._invokeDisposeFn();\n }\n /** Permanently dispose of this portal host. */\n dispose() {\n if (this.hasAttached()) {\n this.detach();\n }\n this._invokeDisposeFn();\n this._isDisposed = true;\n }\n /** @docs-private */\n setDisposeFn(fn) {\n this._disposeFn = fn;\n }\n _invokeDisposeFn() {\n if (this._disposeFn) {\n this._disposeFn();\n this._disposeFn = null;\n }\n }\n}\n/**\n * @deprecated Use `BasePortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass BasePortalHost extends BasePortalOutlet {\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * A PortalOutlet for attaching portals to an arbitrary DOM element outside of the Angular\n * application context.\n */\nclass DomPortalOutlet extends BasePortalOutlet {\n /**\n * @param outletElement Element into which the content is projected.\n * @param _componentFactoryResolver Used to resolve the component factory.\n * Only required when attaching component portals.\n * @param _appRef Reference to the application. Only used in component portals when there\n * is no `ViewContainerRef` available.\n * @param _defaultInjector Injector to use as a fallback when the portal being attached doesn't\n * have one. Only used for component portals.\n * @param _document Reference to the document. Used when attaching a DOM portal. Will eventually\n * become a required parameter.\n */\n constructor(\n /** Element into which the content is projected. */\n outletElement, _componentFactoryResolver, _appRef, _defaultInjector, \n /**\n * @deprecated `_document` Parameter to be made required.\n * @breaking-change 10.0.0\n */\n _document) {\n super();\n this.outletElement = outletElement;\n this._componentFactoryResolver = _componentFactoryResolver;\n this._appRef = _appRef;\n this._defaultInjector = _defaultInjector;\n /**\n * Attaches a DOM portal by transferring its content into the outlet.\n * @param portal Portal to be attached.\n * @deprecated To be turned into a method.\n * @breaking-change 10.0.0\n */\n this.attachDomPortal = (portal) => {\n // @breaking-change 10.0.0 Remove check and error once the\n // `_document` constructor parameter is required.\n if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Cannot attach DOM portal without _document constructor parameter');\n }\n const element = portal.element;\n if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('DOM portal content must be attached to a parent node.');\n }\n // Anchor used to save the element's previous position so\n // that we can restore it when the portal is detached.\n const anchorNode = this._document.createComment('dom-portal');\n element.parentNode.insertBefore(anchorNode, element);\n this.outletElement.appendChild(element);\n this._attachedPortal = portal;\n super.setDisposeFn(() => {\n // We can't use `replaceWith` here because IE doesn't support it.\n if (anchorNode.parentNode) {\n anchorNode.parentNode.replaceChild(element, anchorNode);\n }\n });\n };\n this._document = _document;\n }\n /**\n * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.\n * @param portal Portal to be attached\n * @returns Reference to the created component.\n */\n attachComponentPortal(portal) {\n const resolver = (portal.componentFactoryResolver || this._componentFactoryResolver);\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !resolver) {\n throw Error('Cannot attach component portal to outlet without a ComponentFactoryResolver.');\n }\n const componentFactory = resolver.resolveComponentFactory(portal.component);\n let componentRef;\n // If the portal specifies a ViewContainerRef, we will use that as the attachment point\n // for the component (in terms of Angular's component tree, not rendering).\n // When the ViewContainerRef is missing, we use the factory to create the component directly\n // and then manually attach the view to the application.\n if (portal.viewContainerRef) {\n componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.injector);\n this.setDisposeFn(() => componentRef.destroy());\n }\n else {\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._appRef) {\n throw Error('Cannot attach component portal to outlet without an ApplicationRef.');\n }\n componentRef = componentFactory.create(portal.injector || this._defaultInjector || Injector.NULL);\n this._appRef.attachView(componentRef.hostView);\n this.setDisposeFn(() => {\n // Verify that the ApplicationRef has registered views before trying to detach a host view.\n // This check also protects the `detachView` from being called on a destroyed ApplicationRef.\n if (this._appRef.viewCount > 0) {\n this._appRef.detachView(componentRef.hostView);\n }\n componentRef.destroy();\n });\n }\n // At this point the component has been instantiated, so we move it to the location in the DOM\n // where we want it to be rendered.\n this.outletElement.appendChild(this._getComponentRootNode(componentRef));\n this._attachedPortal = portal;\n return componentRef;\n }\n /**\n * Attaches a template portal to the DOM as an embedded view.\n * @param portal Portal to be attached.\n * @returns Reference to the created embedded view.\n */\n attachTemplatePortal(portal) {\n let viewContainer = portal.viewContainerRef;\n let viewRef = viewContainer.createEmbeddedView(portal.templateRef, portal.context);\n // The method `createEmbeddedView` will add the view as a child of the viewContainer.\n // But for the DomPortalOutlet the view can be added everywhere in the DOM\n // (e.g Overlay Container) To move the view to the specified host element. We just\n // re-append the existing root nodes.\n viewRef.rootNodes.forEach(rootNode => this.outletElement.appendChild(rootNode));\n // Note that we want to detect changes after the nodes have been moved so that\n // any directives inside the portal that are looking at the DOM inside a lifecycle\n // hook won't be invoked too early.\n viewRef.detectChanges();\n this.setDisposeFn(() => {\n let index = viewContainer.indexOf(viewRef);\n if (index !== -1) {\n viewContainer.remove(index);\n }\n });\n this._attachedPortal = portal;\n // TODO(jelbourn): Return locals from view.\n return viewRef;\n }\n /**\n * Clears out a portal from the DOM.\n */\n dispose() {\n super.dispose();\n this.outletElement.remove();\n }\n /** Gets the root HTMLElement for an instantiated component. */\n _getComponentRootNode(componentRef) {\n return componentRef.hostView.rootNodes[0];\n }\n}\n/**\n * @deprecated Use `DomPortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass DomPortalHost extends DomPortalOutlet {\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal,\n * the directive instance itself can be attached to a host, enabling declarative use of portals.\n */\nclass CdkPortal extends TemplatePortal {\n constructor(templateRef, viewContainerRef) {\n super(templateRef, viewContainerRef);\n }\n}\nCdkPortal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkPortal, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });\nCdkPortal.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkPortal, selector: \"[cdkPortal]\", exportAs: [\"cdkPortal\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkPortal, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkPortal]',\n exportAs: 'cdkPortal',\n }]\n }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }]; } });\n/**\n * @deprecated Use `CdkPortal` instead.\n * @breaking-change 9.0.0\n */\nclass TemplatePortalDirective extends CdkPortal {\n}\nTemplatePortalDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: TemplatePortalDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });\nTemplatePortalDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: TemplatePortalDirective, selector: \"[cdk-portal], [portal]\", providers: [\n {\n provide: CdkPortal,\n useExisting: TemplatePortalDirective,\n },\n ], exportAs: [\"cdkPortal\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: TemplatePortalDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdk-portal], [portal]',\n exportAs: 'cdkPortal',\n providers: [\n {\n provide: CdkPortal,\n useExisting: TemplatePortalDirective,\n },\n ],\n }]\n }] });\n/**\n * Directive version of a PortalOutlet. Because the directive *is* a PortalOutlet, portals can be\n * directly attached to it, enabling declarative use.\n *\n * Usage:\n * ``\n */\nclass CdkPortalOutlet extends BasePortalOutlet {\n constructor(_componentFactoryResolver, _viewContainerRef, \n /**\n * @deprecated `_document` parameter to be made required.\n * @breaking-change 9.0.0\n */\n _document) {\n super();\n this._componentFactoryResolver = _componentFactoryResolver;\n this._viewContainerRef = _viewContainerRef;\n /** Whether the portal component is initialized. */\n this._isInitialized = false;\n /** Emits when a portal is attached to the outlet. */\n this.attached = new EventEmitter();\n /**\n * Attaches the given DomPortal to this PortalHost by moving all of the portal content into it.\n * @param portal Portal to be attached.\n * @deprecated To be turned into a method.\n * @breaking-change 10.0.0\n */\n this.attachDomPortal = (portal) => {\n // @breaking-change 9.0.0 Remove check and error once the\n // `_document` constructor parameter is required.\n if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Cannot attach DOM portal without _document constructor parameter');\n }\n const element = portal.element;\n if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('DOM portal content must be attached to a parent node.');\n }\n // Anchor used to save the element's previous position so\n // that we can restore it when the portal is detached.\n const anchorNode = this._document.createComment('dom-portal');\n portal.setAttachedHost(this);\n element.parentNode.insertBefore(anchorNode, element);\n this._getRootNode().appendChild(element);\n this._attachedPortal = portal;\n super.setDisposeFn(() => {\n if (anchorNode.parentNode) {\n anchorNode.parentNode.replaceChild(element, anchorNode);\n }\n });\n };\n this._document = _document;\n }\n /** Portal associated with the Portal outlet. */\n get portal() {\n return this._attachedPortal;\n }\n set portal(portal) {\n // Ignore the cases where the `portal` is set to a falsy value before the lifecycle hooks have\n // run. This handles the cases where the user might do something like `
`\n // and attach a portal programmatically in the parent component. When Angular does the first CD\n // round, it will fire the setter with empty string, causing the user's content to be cleared.\n if (this.hasAttached() && !portal && !this._isInitialized) {\n return;\n }\n if (this.hasAttached()) {\n super.detach();\n }\n if (portal) {\n super.attach(portal);\n }\n this._attachedPortal = portal || null;\n }\n /** Component or view reference that is attached to the portal. */\n get attachedRef() {\n return this._attachedRef;\n }\n ngOnInit() {\n this._isInitialized = true;\n }\n ngOnDestroy() {\n super.dispose();\n this._attachedPortal = null;\n this._attachedRef = null;\n }\n /**\n * Attach the given ComponentPortal to this PortalOutlet using the ComponentFactoryResolver.\n *\n * @param portal Portal to be attached to the portal outlet.\n * @returns Reference to the created component.\n */\n attachComponentPortal(portal) {\n portal.setAttachedHost(this);\n // If the portal specifies an origin, use that as the logical location of the component\n // in the application tree. Otherwise use the location of this PortalOutlet.\n const viewContainerRef = portal.viewContainerRef != null ? portal.viewContainerRef : this._viewContainerRef;\n const resolver = portal.componentFactoryResolver || this._componentFactoryResolver;\n const componentFactory = resolver.resolveComponentFactory(portal.component);\n const ref = viewContainerRef.createComponent(componentFactory, viewContainerRef.length, portal.injector || viewContainerRef.injector);\n // If we're using a view container that's different from the injected one (e.g. when the portal\n // specifies its own) we need to move the component into the outlet, otherwise it'll be rendered\n // inside of the alternate view container.\n if (viewContainerRef !== this._viewContainerRef) {\n this._getRootNode().appendChild(ref.hostView.rootNodes[0]);\n }\n super.setDisposeFn(() => ref.destroy());\n this._attachedPortal = portal;\n this._attachedRef = ref;\n this.attached.emit(ref);\n return ref;\n }\n /**\n * Attach the given TemplatePortal to this PortalHost as an embedded View.\n * @param portal Portal to be attached.\n * @returns Reference to the created embedded view.\n */\n attachTemplatePortal(portal) {\n portal.setAttachedHost(this);\n const viewRef = this._viewContainerRef.createEmbeddedView(portal.templateRef, portal.context);\n super.setDisposeFn(() => this._viewContainerRef.clear());\n this._attachedPortal = portal;\n this._attachedRef = viewRef;\n this.attached.emit(viewRef);\n return viewRef;\n }\n /** Gets the root node of the portal outlet. */\n _getRootNode() {\n const nativeElement = this._viewContainerRef.element.nativeElement;\n // The directive could be set on a template which will result in a comment\n // node being the root. Use the comment's parent node if that is the case.\n return (nativeElement.nodeType === nativeElement.ELEMENT_NODE\n ? nativeElement\n : nativeElement.parentNode);\n }\n}\nCdkPortalOutlet.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkPortalOutlet, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.ViewContainerRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });\nCdkPortalOutlet.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkPortalOutlet, selector: \"[cdkPortalOutlet]\", inputs: { portal: [\"cdkPortalOutlet\", \"portal\"] }, outputs: { attached: \"attached\" }, exportAs: [\"cdkPortalOutlet\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkPortalOutlet, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkPortalOutlet]',\n exportAs: 'cdkPortalOutlet',\n inputs: ['portal: cdkPortalOutlet'],\n }]\n }], ctorParameters: function () {\n return [{ type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }];\n }, propDecorators: { attached: [{\n type: Output\n }] } });\n/**\n * @deprecated Use `CdkPortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass PortalHostDirective extends CdkPortalOutlet {\n}\nPortalHostDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PortalHostDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });\nPortalHostDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: PortalHostDirective, selector: \"[cdkPortalHost], [portalHost]\", inputs: { portal: [\"cdkPortalHost\", \"portal\"] }, providers: [\n {\n provide: CdkPortalOutlet,\n useExisting: PortalHostDirective,\n },\n ], exportAs: [\"cdkPortalHost\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PortalHostDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkPortalHost], [portalHost]',\n exportAs: 'cdkPortalHost',\n inputs: ['portal: cdkPortalHost'],\n providers: [\n {\n provide: CdkPortalOutlet,\n useExisting: PortalHostDirective,\n },\n ],\n }]\n }] });\nclass PortalModule {\n}\nPortalModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PortalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nPortalModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PortalModule, declarations: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective], exports: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective] });\nPortalModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PortalModule });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: PortalModule, decorators: [{\n type: NgModule,\n args: [{\n exports: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective],\n declarations: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Custom injector to be used when providing custom\n * injection tokens to components inside a portal.\n * @docs-private\n * @deprecated Use `Injector.create` instead.\n * @breaking-change 11.0.0\n */\nclass PortalInjector {\n constructor(_parentInjector, _customTokens) {\n this._parentInjector = _parentInjector;\n this._customTokens = _customTokens;\n }\n get(token, notFoundValue) {\n const value = this._customTokens.get(token);\n if (typeof value !== 'undefined') {\n return value;\n }\n return this._parentInjector.get(token, notFoundValue);\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BasePortalHost, BasePortalOutlet, CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortal, DomPortalHost, DomPortalOutlet, Portal, PortalHostDirective, PortalInjector, PortalModule, TemplatePortal, TemplatePortalDirective };\n","import { coerceNumberProperty, coerceElement, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, forwardRef, Directive, Input, Injectable, Optional, Inject, Component, ViewEncapsulation, ChangeDetectionStrategy, Output, ViewChild, SkipSelf, NgModule } from '@angular/core';\nimport { Subject, of, Observable, fromEvent, animationFrameScheduler, asapScheduler, Subscription, isObservable } from 'rxjs';\nimport { distinctUntilChanged, auditTime, filter, takeUntil, startWith, pairwise, switchMap, shareReplay } from 'rxjs/operators';\nimport { DOCUMENT } from '@angular/common';\nimport * as i1 from '@angular/cdk/platform';\nimport { getRtlScrollAxisType, supportsScrollBehavior } from '@angular/cdk/platform';\nimport * as i2 from '@angular/cdk/bidi';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport * as i2$1 from '@angular/cdk/collections';\nimport { isDataSource, ArrayDataSource, _VIEW_REPEATER_STRATEGY, _RecycleViewRepeaterStrategy } from '@angular/cdk/collections';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** The injection token used to specify the virtual scrolling strategy. */\nconst VIRTUAL_SCROLL_STRATEGY = new InjectionToken('VIRTUAL_SCROLL_STRATEGY');\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Virtual scrolling strategy for lists with items of known fixed size. */\nclass FixedSizeVirtualScrollStrategy {\n /**\n * @param itemSize The size of the items in the virtually scrolling list.\n * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n */\n constructor(itemSize, minBufferPx, maxBufferPx) {\n this._scrolledIndexChange = new Subject();\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n this.scrolledIndexChange = this._scrolledIndexChange.pipe(distinctUntilChanged());\n /** The attached viewport. */\n this._viewport = null;\n this._itemSize = itemSize;\n this._minBufferPx = minBufferPx;\n this._maxBufferPx = maxBufferPx;\n }\n /**\n * Attaches this scroll strategy to a viewport.\n * @param viewport The viewport to attach this strategy to.\n */\n attach(viewport) {\n this._viewport = viewport;\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** Detaches this scroll strategy from the currently attached viewport. */\n detach() {\n this._scrolledIndexChange.complete();\n this._viewport = null;\n }\n /**\n * Update the item size and buffer size.\n * @param itemSize The size of the items in the virtually scrolling list.\n * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n */\n updateItemAndBufferSize(itemSize, minBufferPx, maxBufferPx) {\n if (maxBufferPx < minBufferPx && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('CDK virtual scroll: maxBufferPx must be greater than or equal to minBufferPx');\n }\n this._itemSize = itemSize;\n this._minBufferPx = minBufferPx;\n this._maxBufferPx = maxBufferPx;\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onContentScrolled() {\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onDataLengthChanged() {\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onContentRendered() {\n /* no-op */\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onRenderedOffsetChanged() {\n /* no-op */\n }\n /**\n * Scroll to the offset for the given index.\n * @param index The index of the element to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling.\n */\n scrollToIndex(index, behavior) {\n if (this._viewport) {\n this._viewport.scrollToOffset(index * this._itemSize, behavior);\n }\n }\n /** Update the viewport's total content size. */\n _updateTotalContentSize() {\n if (!this._viewport) {\n return;\n }\n this._viewport.setTotalContentSize(this._viewport.getDataLength() * this._itemSize);\n }\n /** Update the viewport's rendered range. */\n _updateRenderedRange() {\n if (!this._viewport) {\n return;\n }\n const renderedRange = this._viewport.getRenderedRange();\n const newRange = { start: renderedRange.start, end: renderedRange.end };\n const viewportSize = this._viewport.getViewportSize();\n const dataLength = this._viewport.getDataLength();\n let scrollOffset = this._viewport.measureScrollOffset();\n // Prevent NaN as result when dividing by zero.\n let firstVisibleIndex = this._itemSize > 0 ? scrollOffset / this._itemSize : 0;\n // If user scrolls to the bottom of the list and data changes to a smaller list\n if (newRange.end > dataLength) {\n // We have to recalculate the first visible index based on new data length and viewport size.\n const maxVisibleItems = Math.ceil(viewportSize / this._itemSize);\n const newVisibleIndex = Math.max(0, Math.min(firstVisibleIndex, dataLength - maxVisibleItems));\n // If first visible index changed we must update scroll offset to handle start/end buffers\n // Current range must also be adjusted to cover the new position (bottom of new list).\n if (firstVisibleIndex != newVisibleIndex) {\n firstVisibleIndex = newVisibleIndex;\n scrollOffset = newVisibleIndex * this._itemSize;\n newRange.start = Math.floor(firstVisibleIndex);\n }\n newRange.end = Math.max(0, Math.min(dataLength, newRange.start + maxVisibleItems));\n }\n const startBuffer = scrollOffset - newRange.start * this._itemSize;\n if (startBuffer < this._minBufferPx && newRange.start != 0) {\n const expandStart = Math.ceil((this._maxBufferPx - startBuffer) / this._itemSize);\n newRange.start = Math.max(0, newRange.start - expandStart);\n newRange.end = Math.min(dataLength, Math.ceil(firstVisibleIndex + (viewportSize + this._minBufferPx) / this._itemSize));\n }\n else {\n const endBuffer = newRange.end * this._itemSize - (scrollOffset + viewportSize);\n if (endBuffer < this._minBufferPx && newRange.end != dataLength) {\n const expandEnd = Math.ceil((this._maxBufferPx - endBuffer) / this._itemSize);\n if (expandEnd > 0) {\n newRange.end = Math.min(dataLength, newRange.end + expandEnd);\n newRange.start = Math.max(0, Math.floor(firstVisibleIndex - this._minBufferPx / this._itemSize));\n }\n }\n }\n this._viewport.setRenderedRange(newRange);\n this._viewport.setRenderedContentOffset(this._itemSize * newRange.start);\n this._scrolledIndexChange.next(Math.floor(firstVisibleIndex));\n }\n}\n/**\n * Provider factory for `FixedSizeVirtualScrollStrategy` that simply extracts the already created\n * `FixedSizeVirtualScrollStrategy` from the given directive.\n * @param fixedSizeDir The instance of `CdkFixedSizeVirtualScroll` to extract the\n * `FixedSizeVirtualScrollStrategy` from.\n */\nfunction _fixedSizeVirtualScrollStrategyFactory(fixedSizeDir) {\n return fixedSizeDir._scrollStrategy;\n}\n/** A virtual scroll strategy that supports fixed-size items. */\nclass CdkFixedSizeVirtualScroll {\n constructor() {\n this._itemSize = 20;\n this._minBufferPx = 100;\n this._maxBufferPx = 200;\n /** The scroll strategy used by this directive. */\n this._scrollStrategy = new FixedSizeVirtualScrollStrategy(this.itemSize, this.minBufferPx, this.maxBufferPx);\n }\n /** The size of the items in the list (in pixels). */\n get itemSize() {\n return this._itemSize;\n }\n set itemSize(value) {\n this._itemSize = coerceNumberProperty(value);\n }\n /**\n * The minimum amount of buffer rendered beyond the viewport (in pixels).\n * If the amount of buffer dips below this number, more items will be rendered. Defaults to 100px.\n */\n get minBufferPx() {\n return this._minBufferPx;\n }\n set minBufferPx(value) {\n this._minBufferPx = coerceNumberProperty(value);\n }\n /**\n * The number of pixels worth of buffer to render for when rendering new items. Defaults to 200px.\n */\n get maxBufferPx() {\n return this._maxBufferPx;\n }\n set maxBufferPx(value) {\n this._maxBufferPx = coerceNumberProperty(value);\n }\n ngOnChanges() {\n this._scrollStrategy.updateItemAndBufferSize(this.itemSize, this.minBufferPx, this.maxBufferPx);\n }\n}\nCdkFixedSizeVirtualScroll.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkFixedSizeVirtualScroll, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nCdkFixedSizeVirtualScroll.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkFixedSizeVirtualScroll, selector: \"cdk-virtual-scroll-viewport[itemSize]\", inputs: { itemSize: \"itemSize\", minBufferPx: \"minBufferPx\", maxBufferPx: \"maxBufferPx\" }, providers: [\n {\n provide: VIRTUAL_SCROLL_STRATEGY,\n useFactory: _fixedSizeVirtualScrollStrategyFactory,\n deps: [forwardRef(() => CdkFixedSizeVirtualScroll)],\n },\n ], usesOnChanges: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkFixedSizeVirtualScroll, decorators: [{\n type: Directive,\n args: [{\n selector: 'cdk-virtual-scroll-viewport[itemSize]',\n providers: [\n {\n provide: VIRTUAL_SCROLL_STRATEGY,\n useFactory: _fixedSizeVirtualScrollStrategyFactory,\n deps: [forwardRef(() => CdkFixedSizeVirtualScroll)],\n },\n ],\n }]\n }], propDecorators: { itemSize: [{\n type: Input\n }], minBufferPx: [{\n type: Input\n }], maxBufferPx: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Time in ms to throttle the scrolling events by default. */\nconst DEFAULT_SCROLL_TIME = 20;\n/**\n * Service contained all registered Scrollable references and emits an event when any one of the\n * Scrollable references emit a scrolled event.\n */\nclass ScrollDispatcher {\n constructor(_ngZone, _platform, document) {\n this._ngZone = _ngZone;\n this._platform = _platform;\n /** Subject for notifying that a registered scrollable reference element has been scrolled. */\n this._scrolled = new Subject();\n /** Keeps track of the global `scroll` and `resize` subscriptions. */\n this._globalSubscription = null;\n /** Keeps track of the amount of subscriptions to `scrolled`. Used for cleaning up afterwards. */\n this._scrolledCount = 0;\n /**\n * Map of all the scrollable references that are registered with the service and their\n * scroll event subscriptions.\n */\n this.scrollContainers = new Map();\n this._document = document;\n }\n /**\n * Registers a scrollable instance with the service and listens for its scrolled events. When the\n * scrollable is scrolled, the service emits the event to its scrolled observable.\n * @param scrollable Scrollable instance to be registered.\n */\n register(scrollable) {\n if (!this.scrollContainers.has(scrollable)) {\n this.scrollContainers.set(scrollable, scrollable.elementScrolled().subscribe(() => this._scrolled.next(scrollable)));\n }\n }\n /**\n * Deregisters a Scrollable reference and unsubscribes from its scroll event observable.\n * @param scrollable Scrollable instance to be deregistered.\n */\n deregister(scrollable) {\n const scrollableReference = this.scrollContainers.get(scrollable);\n if (scrollableReference) {\n scrollableReference.unsubscribe();\n this.scrollContainers.delete(scrollable);\n }\n }\n /**\n * Returns an observable that emits an event whenever any of the registered Scrollable\n * references (or window, document, or body) fire a scrolled event. Can provide a time in ms\n * to override the default \"throttle\" time.\n *\n * **Note:** in order to avoid hitting change detection for every scroll event,\n * all of the events emitted from this stream will be run outside the Angular zone.\n * If you need to update any data bindings as a result of a scroll event, you have\n * to run the callback using `NgZone.run`.\n */\n scrolled(auditTimeInMs = DEFAULT_SCROLL_TIME) {\n if (!this._platform.isBrowser) {\n return of();\n }\n return new Observable((observer) => {\n if (!this._globalSubscription) {\n this._addGlobalListener();\n }\n // In the case of a 0ms delay, use an observable without auditTime\n // since it does add a perceptible delay in processing overhead.\n const subscription = auditTimeInMs > 0\n ? this._scrolled.pipe(auditTime(auditTimeInMs)).subscribe(observer)\n : this._scrolled.subscribe(observer);\n this._scrolledCount++;\n return () => {\n subscription.unsubscribe();\n this._scrolledCount--;\n if (!this._scrolledCount) {\n this._removeGlobalListener();\n }\n };\n });\n }\n ngOnDestroy() {\n this._removeGlobalListener();\n this.scrollContainers.forEach((_, container) => this.deregister(container));\n this._scrolled.complete();\n }\n /**\n * Returns an observable that emits whenever any of the\n * scrollable ancestors of an element are scrolled.\n * @param elementOrElementRef Element whose ancestors to listen for.\n * @param auditTimeInMs Time to throttle the scroll events.\n */\n ancestorScrolled(elementOrElementRef, auditTimeInMs) {\n const ancestors = this.getAncestorScrollContainers(elementOrElementRef);\n return this.scrolled(auditTimeInMs).pipe(filter(target => {\n return !target || ancestors.indexOf(target) > -1;\n }));\n }\n /** Returns all registered Scrollables that contain the provided element. */\n getAncestorScrollContainers(elementOrElementRef) {\n const scrollingContainers = [];\n this.scrollContainers.forEach((_subscription, scrollable) => {\n if (this._scrollableContainsElement(scrollable, elementOrElementRef)) {\n scrollingContainers.push(scrollable);\n }\n });\n return scrollingContainers;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n return this._document.defaultView || window;\n }\n /** Returns true if the element is contained within the provided Scrollable. */\n _scrollableContainsElement(scrollable, elementOrElementRef) {\n let element = coerceElement(elementOrElementRef);\n let scrollableElement = scrollable.getElementRef().nativeElement;\n // Traverse through the element parents until we reach null, checking if any of the elements\n // are the scrollable's element.\n do {\n if (element == scrollableElement) {\n return true;\n }\n } while ((element = element.parentElement));\n return false;\n }\n /** Sets up the global scroll listeners. */\n _addGlobalListener() {\n this._globalSubscription = this._ngZone.runOutsideAngular(() => {\n const window = this._getWindow();\n return fromEvent(window.document, 'scroll').subscribe(() => this._scrolled.next());\n });\n }\n /** Cleans up the global scroll listener. */\n _removeGlobalListener() {\n if (this._globalSubscription) {\n this._globalSubscription.unsubscribe();\n this._globalSubscription = null;\n }\n }\n}\nScrollDispatcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollDispatcher, deps: [{ token: i0.NgZone }, { token: i1.Platform }, { token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nScrollDispatcher.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollDispatcher, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollDispatcher, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: i0.NgZone }, { type: i1.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }];\n } });\n\n/**\n * Sends an event when the directive's element is scrolled. Registers itself with the\n * ScrollDispatcher service to include itself as part of its collection of scrolling events that it\n * can be listened to through the service.\n */\nclass CdkScrollable {\n constructor(elementRef, scrollDispatcher, ngZone, dir) {\n this.elementRef = elementRef;\n this.scrollDispatcher = scrollDispatcher;\n this.ngZone = ngZone;\n this.dir = dir;\n this._destroyed = new Subject();\n this._elementScrolled = new Observable((observer) => this.ngZone.runOutsideAngular(() => fromEvent(this.elementRef.nativeElement, 'scroll')\n .pipe(takeUntil(this._destroyed))\n .subscribe(observer)));\n }\n ngOnInit() {\n this.scrollDispatcher.register(this);\n }\n ngOnDestroy() {\n this.scrollDispatcher.deregister(this);\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** Returns observable that emits when a scroll event is fired on the host element. */\n elementScrolled() {\n return this._elementScrolled;\n }\n /** Gets the ElementRef for the viewport. */\n getElementRef() {\n return this.elementRef;\n }\n /**\n * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo\n * method, since browsers are not consistent about what scrollLeft means in RTL. For this method\n * left and right always refer to the left and right side of the scrolling container irrespective\n * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n * in an RTL context.\n * @param options specified the offsets to scroll to.\n */\n scrollTo(options) {\n const el = this.elementRef.nativeElement;\n const isRtl = this.dir && this.dir.value == 'rtl';\n // Rewrite start & end offsets as right or left offsets.\n if (options.left == null) {\n options.left = isRtl ? options.end : options.start;\n }\n if (options.right == null) {\n options.right = isRtl ? options.start : options.end;\n }\n // Rewrite the bottom offset as a top offset.\n if (options.bottom != null) {\n options.top =\n el.scrollHeight - el.clientHeight - options.bottom;\n }\n // Rewrite the right offset as a left offset.\n if (isRtl && getRtlScrollAxisType() != 0 /* NORMAL */) {\n if (options.left != null) {\n options.right =\n el.scrollWidth - el.clientWidth - options.left;\n }\n if (getRtlScrollAxisType() == 2 /* INVERTED */) {\n options.left = options.right;\n }\n else if (getRtlScrollAxisType() == 1 /* NEGATED */) {\n options.left = options.right ? -options.right : options.right;\n }\n }\n else {\n if (options.right != null) {\n options.left =\n el.scrollWidth - el.clientWidth - options.right;\n }\n }\n this._applyScrollToOptions(options);\n }\n _applyScrollToOptions(options) {\n const el = this.elementRef.nativeElement;\n if (supportsScrollBehavior()) {\n el.scrollTo(options);\n }\n else {\n if (options.top != null) {\n el.scrollTop = options.top;\n }\n if (options.left != null) {\n el.scrollLeft = options.left;\n }\n }\n }\n /**\n * Measures the scroll offset relative to the specified edge of the viewport. This method can be\n * used instead of directly checking scrollLeft or scrollTop, since browsers are not consistent\n * about what scrollLeft means in RTL. The values returned by this method are normalized such that\n * left and right always refer to the left and right side of the scrolling container irrespective\n * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n * in an RTL context.\n * @param from The edge to measure from.\n */\n measureScrollOffset(from) {\n const LEFT = 'left';\n const RIGHT = 'right';\n const el = this.elementRef.nativeElement;\n if (from == 'top') {\n return el.scrollTop;\n }\n if (from == 'bottom') {\n return el.scrollHeight - el.clientHeight - el.scrollTop;\n }\n // Rewrite start & end as left or right offsets.\n const isRtl = this.dir && this.dir.value == 'rtl';\n if (from == 'start') {\n from = isRtl ? RIGHT : LEFT;\n }\n else if (from == 'end') {\n from = isRtl ? LEFT : RIGHT;\n }\n if (isRtl && getRtlScrollAxisType() == 2 /* INVERTED */) {\n // For INVERTED, scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and\n // 0 when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n }\n else {\n return el.scrollLeft;\n }\n }\n else if (isRtl && getRtlScrollAxisType() == 1 /* NEGATED */) {\n // For NEGATED, scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and\n // 0 when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollLeft + el.scrollWidth - el.clientWidth;\n }\n else {\n return -el.scrollLeft;\n }\n }\n else {\n // For NORMAL, as well as non-RTL contexts, scrollLeft is 0 when scrolled all the way left and\n // (scrollWidth - clientWidth) when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollLeft;\n }\n else {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n }\n }\n }\n}\nCdkScrollable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkScrollable, deps: [{ token: i0.ElementRef }, { token: ScrollDispatcher }, { token: i0.NgZone }, { token: i2.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nCdkScrollable.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkScrollable, selector: \"[cdk-scrollable], [cdkScrollable]\", ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkScrollable, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdk-scrollable], [cdkScrollable]',\n }]\n }], ctorParameters: function () {\n return [{ type: i0.ElementRef }, { type: ScrollDispatcher }, { type: i0.NgZone }, { type: i2.Directionality, decorators: [{\n type: Optional\n }] }];\n } });\n\n/** Time in ms to throttle the resize events by default. */\nconst DEFAULT_RESIZE_TIME = 20;\n/**\n * Simple utility for getting the bounds of the browser viewport.\n * @docs-private\n */\nclass ViewportRuler {\n constructor(_platform, ngZone, document) {\n this._platform = _platform;\n /** Stream of viewport change events. */\n this._change = new Subject();\n /** Event listener that will be used to handle the viewport change events. */\n this._changeListener = (event) => {\n this._change.next(event);\n };\n this._document = document;\n ngZone.runOutsideAngular(() => {\n if (_platform.isBrowser) {\n const window = this._getWindow();\n // Note that bind the events ourselves, rather than going through something like RxJS's\n // `fromEvent` so that we can ensure that they're bound outside of the NgZone.\n window.addEventListener('resize', this._changeListener);\n window.addEventListener('orientationchange', this._changeListener);\n }\n // Clear the cached position so that the viewport is re-measured next time it is required.\n // We don't need to keep track of the subscription, because it is completed on destroy.\n this.change().subscribe(() => (this._viewportSize = null));\n });\n }\n ngOnDestroy() {\n if (this._platform.isBrowser) {\n const window = this._getWindow();\n window.removeEventListener('resize', this._changeListener);\n window.removeEventListener('orientationchange', this._changeListener);\n }\n this._change.complete();\n }\n /** Returns the viewport's width and height. */\n getViewportSize() {\n if (!this._viewportSize) {\n this._updateViewportSize();\n }\n const output = { width: this._viewportSize.width, height: this._viewportSize.height };\n // If we're not on a browser, don't cache the size since it'll be mocked out anyway.\n if (!this._platform.isBrowser) {\n this._viewportSize = null;\n }\n return output;\n }\n /** Gets a ClientRect for the viewport's bounds. */\n getViewportRect() {\n // Use the document element's bounding rect rather than the window scroll properties\n // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n // can disagree when the page is pinch-zoomed (on devices that support touch).\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n // We use the documentElement instead of the body because, by default (without a css reset)\n // browsers typically give the document body an 8px margin, which is not included in\n // getBoundingClientRect().\n const scrollPosition = this.getViewportScrollPosition();\n const { width, height } = this.getViewportSize();\n return {\n top: scrollPosition.top,\n left: scrollPosition.left,\n bottom: scrollPosition.top + height,\n right: scrollPosition.left + width,\n height,\n width,\n };\n }\n /** Gets the (top, left) scroll position of the viewport. */\n getViewportScrollPosition() {\n // While we can get a reference to the fake document\n // during SSR, it doesn't have getBoundingClientRect.\n if (!this._platform.isBrowser) {\n return { top: 0, left: 0 };\n }\n // The top-left-corner of the viewport is determined by the scroll position of the document\n // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n // `document.documentElement` works consistently, where the `top` and `left` values will\n // equal negative the scroll position.\n const document = this._document;\n const window = this._getWindow();\n const documentElement = document.documentElement;\n const documentRect = documentElement.getBoundingClientRect();\n const top = -documentRect.top ||\n document.body.scrollTop ||\n window.scrollY ||\n documentElement.scrollTop ||\n 0;\n const left = -documentRect.left ||\n document.body.scrollLeft ||\n window.scrollX ||\n documentElement.scrollLeft ||\n 0;\n return { top, left };\n }\n /**\n * Returns a stream that emits whenever the size of the viewport changes.\n * This stream emits outside of the Angular zone.\n * @param throttleTime Time in milliseconds to throttle the stream.\n */\n change(throttleTime = DEFAULT_RESIZE_TIME) {\n return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n return this._document.defaultView || window;\n }\n /** Updates the cached viewport size. */\n _updateViewportSize() {\n const window = this._getWindow();\n this._viewportSize = this._platform.isBrowser\n ? { width: window.innerWidth, height: window.innerHeight }\n : { width: 0, height: 0 };\n }\n}\nViewportRuler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ViewportRuler, deps: [{ token: i1.Platform }, { token: i0.NgZone }, { token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });\nViewportRuler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ViewportRuler, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ViewportRuler, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: function () {\n return [{ type: i1.Platform }, { type: i0.NgZone }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }];\n } });\n\n/** Checks if the given ranges are equal. */\nfunction rangesEqual(r1, r2) {\n return r1.start == r2.start && r1.end == r2.end;\n}\n/**\n * Scheduler to be used for scroll events. Needs to fall back to\n * something that doesn't rely on requestAnimationFrame on environments\n * that don't support it (e.g. server-side rendering).\n */\nconst SCROLL_SCHEDULER = typeof requestAnimationFrame !== 'undefined' ? animationFrameScheduler : asapScheduler;\n/** A viewport that virtualizes its scrolling with the help of `CdkVirtualForOf`. */\nclass CdkVirtualScrollViewport extends CdkScrollable {\n constructor(elementRef, _changeDetectorRef, ngZone, _scrollStrategy, dir, scrollDispatcher, viewportRuler) {\n super(elementRef, scrollDispatcher, ngZone, dir);\n this.elementRef = elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._scrollStrategy = _scrollStrategy;\n /** Emits when the viewport is detached from a CdkVirtualForOf. */\n this._detachedSubject = new Subject();\n /** Emits when the rendered range changes. */\n this._renderedRangeSubject = new Subject();\n this._orientation = 'vertical';\n this._appendOnly = false;\n // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll\n // strategy lazily (i.e. only if the user is actually listening to the events). We do this because\n // depending on how the strategy calculates the scrolled index, it may come at a cost to\n // performance.\n /** Emits when the index of the first element visible in the viewport changes. */\n this.scrolledIndexChange = new Observable((observer) => this._scrollStrategy.scrolledIndexChange.subscribe(index => Promise.resolve().then(() => this.ngZone.run(() => observer.next(index)))));\n /** A stream that emits whenever the rendered range changes. */\n this.renderedRangeStream = this._renderedRangeSubject;\n /**\n * The total size of all content (in pixels), including content that is not currently rendered.\n */\n this._totalContentSize = 0;\n /** A string representing the `style.width` property value to be used for the spacer element. */\n this._totalContentWidth = '';\n /** A string representing the `style.height` property value to be used for the spacer element. */\n this._totalContentHeight = '';\n /** The currently rendered range of indices. */\n this._renderedRange = { start: 0, end: 0 };\n /** The length of the data bound to this viewport (in number of items). */\n this._dataLength = 0;\n /** The size of the viewport (in pixels). */\n this._viewportSize = 0;\n /** The last rendered content offset that was set. */\n this._renderedContentOffset = 0;\n /**\n * Whether the last rendered content offset was to the end of the content (and therefore needs to\n * be rewritten as an offset to the start of the content).\n */\n this._renderedContentOffsetNeedsRewrite = false;\n /** Whether there is a pending change detection cycle. */\n this._isChangeDetectionPending = false;\n /** A list of functions to run after the next change detection cycle. */\n this._runAfterChangeDetection = [];\n /** Subscription to changes in the viewport size. */\n this._viewportChanges = Subscription.EMPTY;\n if (!_scrollStrategy && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Error: cdk-virtual-scroll-viewport requires the \"itemSize\" property to be set.');\n }\n this._viewportChanges = viewportRuler.change().subscribe(() => {\n this.checkViewportSize();\n });\n }\n /** The direction the viewport scrolls. */\n get orientation() {\n return this._orientation;\n }\n set orientation(orientation) {\n if (this._orientation !== orientation) {\n this._orientation = orientation;\n this._calculateSpacerSize();\n }\n }\n /**\n * Whether rendered items should persist in the DOM after scrolling out of view. By default, items\n * will be removed.\n */\n get appendOnly() {\n return this._appendOnly;\n }\n set appendOnly(value) {\n this._appendOnly = coerceBooleanProperty(value);\n }\n ngOnInit() {\n super.ngOnInit();\n // It's still too early to measure the viewport at this point. Deferring with a promise allows\n // the Viewport to be rendered with the correct size before we measure. We run this outside the\n // zone to avoid causing more change detection cycles. We handle the change detection loop\n // ourselves instead.\n this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n this._measureViewportSize();\n this._scrollStrategy.attach(this);\n this.elementScrolled()\n .pipe(\n // Start off with a fake scroll event so we properly detect our initial position.\n startWith(null), \n // Collect multiple events into one until the next animation frame. This way if\n // there are multiple scroll events in the same frame we only need to recheck\n // our layout once.\n auditTime(0, SCROLL_SCHEDULER))\n .subscribe(() => this._scrollStrategy.onContentScrolled());\n this._markChangeDetectionNeeded();\n }));\n }\n ngOnDestroy() {\n this.detach();\n this._scrollStrategy.detach();\n // Complete all subjects\n this._renderedRangeSubject.complete();\n this._detachedSubject.complete();\n this._viewportChanges.unsubscribe();\n super.ngOnDestroy();\n }\n /** Attaches a `CdkVirtualScrollRepeater` to this viewport. */\n attach(forOf) {\n if (this._forOf && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('CdkVirtualScrollViewport is already attached.');\n }\n // Subscribe to the data stream of the CdkVirtualForOf to keep track of when the data length\n // changes. Run outside the zone to avoid triggering change detection, since we're managing the\n // change detection loop ourselves.\n this.ngZone.runOutsideAngular(() => {\n this._forOf = forOf;\n this._forOf.dataStream.pipe(takeUntil(this._detachedSubject)).subscribe(data => {\n const newLength = data.length;\n if (newLength !== this._dataLength) {\n this._dataLength = newLength;\n this._scrollStrategy.onDataLengthChanged();\n }\n this._doChangeDetection();\n });\n });\n }\n /** Detaches the current `CdkVirtualForOf`. */\n detach() {\n this._forOf = null;\n this._detachedSubject.next();\n }\n /** Gets the length of the data bound to this viewport (in number of items). */\n getDataLength() {\n return this._dataLength;\n }\n /** Gets the size of the viewport (in pixels). */\n getViewportSize() {\n return this._viewportSize;\n }\n // TODO(mmalerba): This is technically out of sync with what's really rendered until a render\n // cycle happens. I'm being careful to only call it after the render cycle is complete and before\n // setting it to something else, but its error prone and should probably be split into\n // `pendingRange` and `renderedRange`, the latter reflecting whats actually in the DOM.\n /** Get the current rendered range of items. */\n getRenderedRange() {\n return this._renderedRange;\n }\n /**\n * Sets the total size of all content (in pixels), including content that is not currently\n * rendered.\n */\n setTotalContentSize(size) {\n if (this._totalContentSize !== size) {\n this._totalContentSize = size;\n this._calculateSpacerSize();\n this._markChangeDetectionNeeded();\n }\n }\n /** Sets the currently rendered range of indices. */\n setRenderedRange(range) {\n if (!rangesEqual(this._renderedRange, range)) {\n if (this.appendOnly) {\n range = { start: 0, end: Math.max(this._renderedRange.end, range.end) };\n }\n this._renderedRangeSubject.next((this._renderedRange = range));\n this._markChangeDetectionNeeded(() => this._scrollStrategy.onContentRendered());\n }\n }\n /**\n * Gets the offset from the start of the viewport to the start of the rendered data (in pixels).\n */\n getOffsetToRenderedContentStart() {\n return this._renderedContentOffsetNeedsRewrite ? null : this._renderedContentOffset;\n }\n /**\n * Sets the offset from the start of the viewport to either the start or end of the rendered data\n * (in pixels).\n */\n setRenderedContentOffset(offset, to = 'to-start') {\n // For a horizontal viewport in a right-to-left language we need to translate along the x-axis\n // in the negative direction.\n const isRtl = this.dir && this.dir.value == 'rtl';\n const isHorizontal = this.orientation == 'horizontal';\n const axis = isHorizontal ? 'X' : 'Y';\n const axisDirection = isHorizontal && isRtl ? -1 : 1;\n let transform = `translate${axis}(${Number(axisDirection * offset)}px)`;\n // in appendOnly, we always start from the top\n offset = this.appendOnly && to === 'to-start' ? 0 : offset;\n this._renderedContentOffset = offset;\n if (to === 'to-end') {\n transform += ` translate${axis}(-100%)`;\n // The viewport should rewrite this as a `to-start` offset on the next render cycle. Otherwise\n // elements will appear to expand in the wrong direction (e.g. `mat-expansion-panel` would\n // expand upward).\n this._renderedContentOffsetNeedsRewrite = true;\n }\n if (this._renderedContentTransform != transform) {\n // We know this value is safe because we parse `offset` with `Number()` before passing it\n // into the string.\n this._renderedContentTransform = transform;\n this._markChangeDetectionNeeded(() => {\n if (this._renderedContentOffsetNeedsRewrite) {\n this._renderedContentOffset -= this.measureRenderedContentSize();\n this._renderedContentOffsetNeedsRewrite = false;\n this.setRenderedContentOffset(this._renderedContentOffset);\n }\n else {\n this._scrollStrategy.onRenderedOffsetChanged();\n }\n });\n }\n }\n /**\n * Scrolls to the given offset from the start of the viewport. Please note that this is not always\n * the same as setting `scrollTop` or `scrollLeft`. In a horizontal viewport with right-to-left\n * direction, this would be the equivalent of setting a fictional `scrollRight` property.\n * @param offset The offset to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n */\n scrollToOffset(offset, behavior = 'auto') {\n const options = { behavior };\n if (this.orientation === 'horizontal') {\n options.start = offset;\n }\n else {\n options.top = offset;\n }\n this.scrollTo(options);\n }\n /**\n * Scrolls to the offset for the given index.\n * @param index The index of the element to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n */\n scrollToIndex(index, behavior = 'auto') {\n this._scrollStrategy.scrollToIndex(index, behavior);\n }\n /**\n * Gets the current scroll offset from the start of the viewport (in pixels).\n * @param from The edge to measure the offset from. Defaults to 'top' in vertical mode and 'start'\n * in horizontal mode.\n */\n measureScrollOffset(from) {\n return from\n ? super.measureScrollOffset(from)\n : super.measureScrollOffset(this.orientation === 'horizontal' ? 'start' : 'top');\n }\n /** Measure the combined size of all of the rendered items. */\n measureRenderedContentSize() {\n const contentEl = this._contentWrapper.nativeElement;\n return this.orientation === 'horizontal' ? contentEl.offsetWidth : contentEl.offsetHeight;\n }\n /**\n * Measure the total combined size of the given range. Throws if the range includes items that are\n * not rendered.\n */\n measureRangeSize(range) {\n if (!this._forOf) {\n return 0;\n }\n return this._forOf.measureRangeSize(range, this.orientation);\n }\n /** Update the viewport dimensions and re-render. */\n checkViewportSize() {\n // TODO: Cleanup later when add logic for handling content resize\n this._measureViewportSize();\n this._scrollStrategy.onDataLengthChanged();\n }\n /** Measure the viewport size. */\n _measureViewportSize() {\n const viewportEl = this.elementRef.nativeElement;\n this._viewportSize =\n this.orientation === 'horizontal' ? viewportEl.clientWidth : viewportEl.clientHeight;\n }\n /** Queue up change detection to run. */\n _markChangeDetectionNeeded(runAfter) {\n if (runAfter) {\n this._runAfterChangeDetection.push(runAfter);\n }\n // Use a Promise to batch together calls to `_doChangeDetection`. This way if we set a bunch of\n // properties sequentially we only have to run `_doChangeDetection` once at the end.\n if (!this._isChangeDetectionPending) {\n this._isChangeDetectionPending = true;\n this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n this._doChangeDetection();\n }));\n }\n }\n /** Run change detection. */\n _doChangeDetection() {\n this._isChangeDetectionPending = false;\n // Apply the content transform. The transform can't be set via an Angular binding because\n // bypassSecurityTrustStyle is banned in Google. However the value is safe, it's composed of\n // string literals, a variable that can only be 'X' or 'Y', and user input that is run through\n // the `Number` function first to coerce it to a numeric value.\n this._contentWrapper.nativeElement.style.transform = this._renderedContentTransform;\n // Apply changes to Angular bindings. Note: We must call `markForCheck` to run change detection\n // from the root, since the repeated items are content projected in. Calling `detectChanges`\n // instead does not properly check the projected content.\n this.ngZone.run(() => this._changeDetectorRef.markForCheck());\n const runAfterChangeDetection = this._runAfterChangeDetection;\n this._runAfterChangeDetection = [];\n for (const fn of runAfterChangeDetection) {\n fn();\n }\n }\n /** Calculates the `style.width` and `style.height` for the spacer element. */\n _calculateSpacerSize() {\n this._totalContentHeight =\n this.orientation === 'horizontal' ? '' : `${this._totalContentSize}px`;\n this._totalContentWidth =\n this.orientation === 'horizontal' ? `${this._totalContentSize}px` : '';\n }\n}\nCdkVirtualScrollViewport.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkVirtualScrollViewport, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: VIRTUAL_SCROLL_STRATEGY, optional: true }, { token: i2.Directionality, optional: true }, { token: ScrollDispatcher }, { token: ViewportRuler }], target: i0.ɵɵFactoryTarget.Component });\nCdkVirtualScrollViewport.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkVirtualScrollViewport, selector: \"cdk-virtual-scroll-viewport\", inputs: { orientation: \"orientation\", appendOnly: \"appendOnly\" }, outputs: { scrolledIndexChange: \"scrolledIndexChange\" }, host: { properties: { \"class.cdk-virtual-scroll-orientation-horizontal\": \"orientation === \\\"horizontal\\\"\", \"class.cdk-virtual-scroll-orientation-vertical\": \"orientation !== \\\"horizontal\\\"\" }, classAttribute: \"cdk-virtual-scroll-viewport\" }, providers: [\n {\n provide: CdkScrollable,\n useExisting: CdkVirtualScrollViewport,\n },\n ], viewQueries: [{ propertyName: \"_contentWrapper\", first: true, predicate: [\"contentWrapper\"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: \"\\n
\\n \\n
\\n\\n
\\n\", styles: [\"cdk-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict;transform:translateZ(0);will-change:scroll-position;-webkit-overflow-scrolling:touch}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0}[dir=rtl] .cdk-virtual-scroll-spacer{right:0;left:auto;transform-origin:100% 0}\\n\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkVirtualScrollViewport, decorators: [{\n type: Component,\n args: [{ selector: 'cdk-virtual-scroll-viewport', host: {\n 'class': 'cdk-virtual-scroll-viewport',\n '[class.cdk-virtual-scroll-orientation-horizontal]': 'orientation === \"horizontal\"',\n '[class.cdk-virtual-scroll-orientation-vertical]': 'orientation !== \"horizontal\"',\n }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [\n {\n provide: CdkScrollable,\n useExisting: CdkVirtualScrollViewport,\n },\n ], template: \"\\n
\\n \\n
\\n\\n
\\n\", styles: [\"cdk-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict;transform:translateZ(0);will-change:scroll-position;-webkit-overflow-scrolling:touch}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0}[dir=rtl] .cdk-virtual-scroll-spacer{right:0;left:auto;transform-origin:100% 0}\\n\"] }]\n }], ctorParameters: function () {\n return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [VIRTUAL_SCROLL_STRATEGY]\n }] }, { type: i2.Directionality, decorators: [{\n type: Optional\n }] }, { type: ScrollDispatcher }, { type: ViewportRuler }];\n }, propDecorators: { orientation: [{\n type: Input\n }], appendOnly: [{\n type: Input\n }], scrolledIndexChange: [{\n type: Output\n }], _contentWrapper: [{\n type: ViewChild,\n args: ['contentWrapper', { static: true }]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Helper to extract the offset of a DOM Node in a certain direction. */\nfunction getOffset(orientation, direction, node) {\n const el = node;\n if (!el.getBoundingClientRect) {\n return 0;\n }\n const rect = el.getBoundingClientRect();\n if (orientation === 'horizontal') {\n return direction === 'start' ? rect.left : rect.right;\n }\n return direction === 'start' ? rect.top : rect.bottom;\n}\n/**\n * A directive similar to `ngForOf` to be used for rendering data inside a virtual scrolling\n * container.\n */\nclass CdkVirtualForOf {\n constructor(\n /** The view container to add items to. */\n _viewContainerRef, \n /** The template to use when stamping out new items. */\n _template, \n /** The set of available differs. */\n _differs, \n /** The strategy used to render items in the virtual scroll viewport. */\n _viewRepeater, \n /** The virtual scrolling viewport that these items are being rendered in. */\n _viewport, ngZone) {\n this._viewContainerRef = _viewContainerRef;\n this._template = _template;\n this._differs = _differs;\n this._viewRepeater = _viewRepeater;\n this._viewport = _viewport;\n /** Emits when the rendered view of the data changes. */\n this.viewChange = new Subject();\n /** Subject that emits when a new DataSource instance is given. */\n this._dataSourceChanges = new Subject();\n /** Emits whenever the data in the current DataSource changes. */\n this.dataStream = this._dataSourceChanges.pipe(\n // Start off with null `DataSource`.\n startWith(null), \n // Bundle up the previous and current data sources so we can work with both.\n pairwise(), \n // Use `_changeDataSource` to disconnect from the previous data source and connect to the\n // new one, passing back a stream of data changes which we run through `switchMap` to give\n // us a data stream that emits the latest data from whatever the current `DataSource` is.\n switchMap(([prev, cur]) => this._changeDataSource(prev, cur)), \n // Replay the last emitted data when someone subscribes.\n shareReplay(1));\n /** The differ used to calculate changes to the data. */\n this._differ = null;\n /** Whether the rendered data should be updated during the next ngDoCheck cycle. */\n this._needsUpdate = false;\n this._destroyed = new Subject();\n this.dataStream.subscribe(data => {\n this._data = data;\n this._onRenderedDataChange();\n });\n this._viewport.renderedRangeStream.pipe(takeUntil(this._destroyed)).subscribe(range => {\n this._renderedRange = range;\n if (this.viewChange.observers.length) {\n ngZone.run(() => this.viewChange.next(this._renderedRange));\n }\n this._onRenderedDataChange();\n });\n this._viewport.attach(this);\n }\n /** The DataSource to display. */\n get cdkVirtualForOf() {\n return this._cdkVirtualForOf;\n }\n set cdkVirtualForOf(value) {\n this._cdkVirtualForOf = value;\n if (isDataSource(value)) {\n this._dataSourceChanges.next(value);\n }\n else {\n // If value is an an NgIterable, convert it to an array.\n this._dataSourceChanges.next(new ArrayDataSource(isObservable(value) ? value : Array.from(value || [])));\n }\n }\n /**\n * The `TrackByFunction` to use for tracking changes. The `TrackByFunction` takes the index and\n * the item and produces a value to be used as the item's identity when tracking changes.\n */\n get cdkVirtualForTrackBy() {\n return this._cdkVirtualForTrackBy;\n }\n set cdkVirtualForTrackBy(fn) {\n this._needsUpdate = true;\n this._cdkVirtualForTrackBy = fn\n ? (index, item) => fn(index + (this._renderedRange ? this._renderedRange.start : 0), item)\n : undefined;\n }\n /** The template used to stamp out new elements. */\n set cdkVirtualForTemplate(value) {\n if (value) {\n this._needsUpdate = true;\n this._template = value;\n }\n }\n /**\n * The size of the cache used to store templates that are not being used for re-use later.\n * Setting the cache size to `0` will disable caching. Defaults to 20 templates.\n */\n get cdkVirtualForTemplateCacheSize() {\n return this._viewRepeater.viewCacheSize;\n }\n set cdkVirtualForTemplateCacheSize(size) {\n this._viewRepeater.viewCacheSize = coerceNumberProperty(size);\n }\n /**\n * Measures the combined size (width for horizontal orientation, height for vertical) of all items\n * in the specified range. Throws an error if the range includes items that are not currently\n * rendered.\n */\n measureRangeSize(range, orientation) {\n if (range.start >= range.end) {\n return 0;\n }\n if ((range.start < this._renderedRange.start || range.end > this._renderedRange.end) &&\n (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`Error: attempted to measure an item that isn't rendered.`);\n }\n // The index into the list of rendered views for the first item in the range.\n const renderedStartIndex = range.start - this._renderedRange.start;\n // The length of the range we're measuring.\n const rangeLen = range.end - range.start;\n // Loop over all the views, find the first and land node and compute the size by subtracting\n // the top of the first node from the bottom of the last one.\n let firstNode;\n let lastNode;\n // Find the first node by starting from the beginning and going forwards.\n for (let i = 0; i < rangeLen; i++) {\n const view = this._viewContainerRef.get(i + renderedStartIndex);\n if (view && view.rootNodes.length) {\n firstNode = lastNode = view.rootNodes[0];\n break;\n }\n }\n // Find the last node by starting from the end and going backwards.\n for (let i = rangeLen - 1; i > -1; i--) {\n const view = this._viewContainerRef.get(i + renderedStartIndex);\n if (view && view.rootNodes.length) {\n lastNode = view.rootNodes[view.rootNodes.length - 1];\n break;\n }\n }\n return firstNode && lastNode\n ? getOffset(orientation, 'end', lastNode) - getOffset(orientation, 'start', firstNode)\n : 0;\n }\n ngDoCheck() {\n if (this._differ && this._needsUpdate) {\n // TODO(mmalerba): We should differentiate needs update due to scrolling and a new portion of\n // this list being rendered (can use simpler algorithm) vs needs update due to data actually\n // changing (need to do this diff).\n const changes = this._differ.diff(this._renderedItems);\n if (!changes) {\n this._updateContext();\n }\n else {\n this._applyChanges(changes);\n }\n this._needsUpdate = false;\n }\n }\n ngOnDestroy() {\n this._viewport.detach();\n this._dataSourceChanges.next(undefined);\n this._dataSourceChanges.complete();\n this.viewChange.complete();\n this._destroyed.next();\n this._destroyed.complete();\n this._viewRepeater.detach();\n }\n /** React to scroll state changes in the viewport. */\n _onRenderedDataChange() {\n if (!this._renderedRange) {\n return;\n }\n this._renderedItems = this._data.slice(this._renderedRange.start, this._renderedRange.end);\n if (!this._differ) {\n // Use a wrapper function for the `trackBy` so any new values are\n // picked up automatically without having to recreate the differ.\n this._differ = this._differs.find(this._renderedItems).create((index, item) => {\n return this.cdkVirtualForTrackBy ? this.cdkVirtualForTrackBy(index, item) : item;\n });\n }\n this._needsUpdate = true;\n }\n /** Swap out one `DataSource` for another. */\n _changeDataSource(oldDs, newDs) {\n if (oldDs) {\n oldDs.disconnect(this);\n }\n this._needsUpdate = true;\n return newDs ? newDs.connect(this) : of();\n }\n /** Update the `CdkVirtualForOfContext` for all views. */\n _updateContext() {\n const count = this._data.length;\n let i = this._viewContainerRef.length;\n while (i--) {\n const view = this._viewContainerRef.get(i);\n view.context.index = this._renderedRange.start + i;\n view.context.count = count;\n this._updateComputedContextProperties(view.context);\n view.detectChanges();\n }\n }\n /** Apply changes to the DOM. */\n _applyChanges(changes) {\n this._viewRepeater.applyChanges(changes, this._viewContainerRef, (record, _adjustedPreviousIndex, currentIndex) => this._getEmbeddedViewArgs(record, currentIndex), record => record.item);\n // Update $implicit for any items that had an identity change.\n changes.forEachIdentityChange((record) => {\n const view = this._viewContainerRef.get(record.currentIndex);\n view.context.$implicit = record.item;\n });\n // Update the context variables on all items.\n const count = this._data.length;\n let i = this._viewContainerRef.length;\n while (i--) {\n const view = this._viewContainerRef.get(i);\n view.context.index = this._renderedRange.start + i;\n view.context.count = count;\n this._updateComputedContextProperties(view.context);\n }\n }\n /** Update the computed properties on the `CdkVirtualForOfContext`. */\n _updateComputedContextProperties(context) {\n context.first = context.index === 0;\n context.last = context.index === context.count - 1;\n context.even = context.index % 2 === 0;\n context.odd = !context.even;\n }\n _getEmbeddedViewArgs(record, index) {\n // Note that it's important that we insert the item directly at the proper index,\n // rather than inserting it and the moving it in place, because if there's a directive\n // on the same node that injects the `ViewContainerRef`, Angular will insert another\n // comment node which can throw off the move when it's being repeated for all items.\n return {\n templateRef: this._template,\n context: {\n $implicit: record.item,\n // It's guaranteed that the iterable is not \"undefined\" or \"null\" because we only\n // generate views for elements if the \"cdkVirtualForOf\" iterable has elements.\n cdkVirtualForOf: this._cdkVirtualForOf,\n index: -1,\n count: -1,\n first: false,\n last: false,\n odd: false,\n even: false,\n },\n index,\n };\n }\n}\nCdkVirtualForOf.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkVirtualForOf, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }, { token: i0.IterableDiffers }, { token: _VIEW_REPEATER_STRATEGY }, { token: CdkVirtualScrollViewport, skipSelf: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });\nCdkVirtualForOf.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: CdkVirtualForOf, selector: \"[cdkVirtualFor][cdkVirtualForOf]\", inputs: { cdkVirtualForOf: \"cdkVirtualForOf\", cdkVirtualForTrackBy: \"cdkVirtualForTrackBy\", cdkVirtualForTemplate: \"cdkVirtualForTemplate\", cdkVirtualForTemplateCacheSize: \"cdkVirtualForTemplateCacheSize\" }, providers: [{ provide: _VIEW_REPEATER_STRATEGY, useClass: _RecycleViewRepeaterStrategy }], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkVirtualForOf, decorators: [{\n type: Directive,\n args: [{\n selector: '[cdkVirtualFor][cdkVirtualForOf]',\n providers: [{ provide: _VIEW_REPEATER_STRATEGY, useClass: _RecycleViewRepeaterStrategy }],\n }]\n }], ctorParameters: function () {\n return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }, { type: i0.IterableDiffers }, { type: i2$1._RecycleViewRepeaterStrategy, decorators: [{\n type: Inject,\n args: [_VIEW_REPEATER_STRATEGY]\n }] }, { type: CdkVirtualScrollViewport, decorators: [{\n type: SkipSelf\n }] }, { type: i0.NgZone }];\n }, propDecorators: { cdkVirtualForOf: [{\n type: Input\n }], cdkVirtualForTrackBy: [{\n type: Input\n }], cdkVirtualForTemplate: [{\n type: Input\n }], cdkVirtualForTemplateCacheSize: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass CdkScrollableModule {\n}\nCdkScrollableModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkScrollableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nCdkScrollableModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkScrollableModule, declarations: [CdkScrollable], exports: [CdkScrollable] });\nCdkScrollableModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkScrollableModule });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: CdkScrollableModule, decorators: [{\n type: NgModule,\n args: [{\n exports: [CdkScrollable],\n declarations: [CdkScrollable],\n }]\n }] });\n/**\n * @docs-primary-export\n */\nclass ScrollingModule {\n}\nScrollingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nScrollingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollingModule, declarations: [CdkFixedSizeVirtualScroll, CdkVirtualForOf, CdkVirtualScrollViewport], imports: [BidiModule, CdkScrollableModule], exports: [BidiModule, CdkScrollableModule, CdkFixedSizeVirtualScroll,\n CdkVirtualForOf,\n CdkVirtualScrollViewport] });\nScrollingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollingModule, imports: [[BidiModule, CdkScrollableModule], BidiModule, CdkScrollableModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ScrollingModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [BidiModule, CdkScrollableModule],\n exports: [\n BidiModule,\n CdkScrollableModule,\n CdkFixedSizeVirtualScroll,\n CdkVirtualForOf,\n CdkVirtualScrollViewport,\n ],\n declarations: [CdkFixedSizeVirtualScroll, CdkVirtualForOf, CdkVirtualScrollViewport],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CdkFixedSizeVirtualScroll, CdkScrollable, CdkScrollableModule, CdkVirtualForOf, CdkVirtualScrollViewport, DEFAULT_RESIZE_TIME, DEFAULT_SCROLL_TIME, FixedSizeVirtualScrollStrategy, ScrollDispatcher, ScrollingModule, VIRTUAL_SCROLL_STRATEGY, ViewportRuler, _fixedSizeVirtualScrollStrategyFactory };\n","import * as i0 from '@angular/core';\nimport { Component, ViewEncapsulation, ChangeDetectionStrategy, Optional, Inject, ViewChild, Input, NgModule } from '@angular/core';\nimport * as i2 from '@angular/material/core';\nimport { mixinColor, mixinDisabled, mixinDisableRipple, MatRipple, MatRippleModule, MatCommonModule } from '@angular/material/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport * as i1 from '@angular/cdk/a11y';\n\n/** Default color palette for round buttons (mat-fab and mat-mini-fab) */\nconst DEFAULT_ROUND_BUTTON_COLOR = 'accent';\n/**\n * List of classes to add to MatButton instances based on host attributes to\n * style as different variants.\n */\nconst BUTTON_HOST_ATTRIBUTES = [\n 'mat-button',\n 'mat-flat-button',\n 'mat-icon-button',\n 'mat-raised-button',\n 'mat-stroked-button',\n 'mat-mini-fab',\n 'mat-fab',\n];\n// Boilerplate for applying mixins to MatButton.\nconst _MatButtonBase = mixinColor(mixinDisabled(mixinDisableRipple(class {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n})));\n/**\n * Material design button.\n */\nclass MatButton extends _MatButtonBase {\n constructor(elementRef, _focusMonitor, _animationMode) {\n super(elementRef);\n this._focusMonitor = _focusMonitor;\n this._animationMode = _animationMode;\n /** Whether the button is round. */\n this.isRoundButton = this._hasHostAttributes('mat-fab', 'mat-mini-fab');\n /** Whether the button is icon button. */\n this.isIconButton = this._hasHostAttributes('mat-icon-button');\n // For each of the variant selectors that is present in the button's host\n // attributes, add the correct corresponding class.\n for (const attr of BUTTON_HOST_ATTRIBUTES) {\n if (this._hasHostAttributes(attr)) {\n this._getHostElement().classList.add(attr);\n }\n }\n // Add a class that applies to all buttons. This makes it easier to target if somebody\n // wants to target all Material buttons. We do it here rather than `host` to ensure that\n // the class is applied to derived classes.\n elementRef.nativeElement.classList.add('mat-button-base');\n if (this.isRoundButton) {\n this.color = DEFAULT_ROUND_BUTTON_COLOR;\n }\n }\n ngAfterViewInit() {\n this._focusMonitor.monitor(this._elementRef, true);\n }\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n /** Focuses the button. */\n focus(origin, options) {\n if (origin) {\n this._focusMonitor.focusVia(this._getHostElement(), origin, options);\n }\n else {\n this._getHostElement().focus(options);\n }\n }\n _getHostElement() {\n return this._elementRef.nativeElement;\n }\n _isRippleDisabled() {\n return this.disableRipple || this.disabled;\n }\n /** Gets whether the button has one of the given attributes. */\n _hasHostAttributes(...attributes) {\n return attributes.some(attribute => this._getHostElement().hasAttribute(attribute));\n }\n}\nMatButton.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatButton, deps: [{ token: i0.ElementRef }, { token: i1.FocusMonitor }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatButton.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"12.0.0\", version: \"13.3.0\", type: MatButton, selector: \"button[mat-button], button[mat-raised-button], button[mat-icon-button],\\n button[mat-fab], button[mat-mini-fab], button[mat-stroked-button],\\n button[mat-flat-button]\", inputs: { disabled: \"disabled\", disableRipple: \"disableRipple\", color: \"color\" }, host: { properties: { \"attr.disabled\": \"disabled || null\", \"class._mat-animation-noopable\": \"_animationMode === \\\"NoopAnimations\\\"\", \"class.mat-button-disabled\": \"disabled\" }, classAttribute: \"mat-focus-indicator\" }, viewQueries: [{ propertyName: \"ripple\", first: true, predicate: MatRipple, descendants: true }], exportAs: [\"matButton\"], usesInheritance: true, ngImport: i0, template: \"\\n\\n\\n\", styles: [\".mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{opacity:0}.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:.04}@media(hover: none){.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:0}}.mat-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-button.mat-button-disabled,.mat-icon-button.mat-button-disabled,.mat-stroked-button.mat-button-disabled,.mat-flat-button.mat-button-disabled{cursor:default}.mat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-button.cdk-program-focused .mat-button-focus-overlay,.mat-icon-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-icon-button.cdk-program-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-program-focused .mat-button-focus-overlay,.mat-flat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-flat-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-raised-button::-moz-focus-inner{border:0}.mat-raised-button.mat-button-disabled{cursor:default}.mat-raised-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-raised-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-raised-button::-moz-focus-inner{border:0}._mat-animation-noopable.mat-raised-button{transition:none;animation:none}.mat-stroked-button{border:1px solid currentColor;padding:0 15px;line-height:34px}.mat-stroked-button .mat-button-ripple.mat-ripple,.mat-stroked-button .mat-button-focus-overlay{top:-1px;left:-1px;right:-1px;bottom:-1px}.mat-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab::-moz-focus-inner{border:0}.mat-fab.mat-button-disabled{cursor:default}.mat-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-fab{transition:none;animation:none}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab::-moz-focus-inner{border:0}.mat-mini-fab.mat-button-disabled{cursor:default}.mat-mini-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-mini-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-mini-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-mini-fab{transition:none;animation:none}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button i,.mat-icon-button .mat-icon{line-height:24px}.mat-button-ripple.mat-ripple,.mat-button-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-button-ripple.mat-ripple:not(:empty){transform:translateZ(0)}.mat-button-focus-overlay{opacity:0;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1),background-color 200ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-button-focus-overlay{transition:none}.mat-button-ripple-round{border-radius:50%;z-index:1}.mat-button .mat-button-wrapper>*,.mat-flat-button .mat-button-wrapper>*,.mat-stroked-button .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*{vertical-align:middle}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;font-size:inherit;width:2.5em;height:2.5em}.cdk-high-contrast-active .mat-button,.cdk-high-contrast-active .mat-flat-button,.cdk-high-contrast-active .mat-raised-button,.cdk-high-contrast-active .mat-icon-button,.cdk-high-contrast-active .mat-fab,.cdk-high-contrast-active .mat-mini-fab{outline:solid 1px}.cdk-high-contrast-active .mat-button-base.cdk-keyboard-focused,.cdk-high-contrast-active .mat-button-base.cdk-program-focused{outline:solid 3px}\\n\"], directives: [{ type: i2.MatRipple, selector: \"[mat-ripple], [matRipple]\", inputs: [\"matRippleColor\", \"matRippleUnbounded\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\", \"matRippleDisabled\", \"matRippleTrigger\"], exportAs: [\"matRipple\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatButton, decorators: [{\n type: Component,\n args: [{ selector: `button[mat-button], button[mat-raised-button], button[mat-icon-button],\n button[mat-fab], button[mat-mini-fab], button[mat-stroked-button],\n button[mat-flat-button]`, exportAs: 'matButton', host: {\n '[attr.disabled]': 'disabled || null',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n // Add a class for disabled button styling instead of the using attribute\n // selector or pseudo-selector. This allows users to create focusabled\n // disabled buttons without recreating the styles.\n '[class.mat-button-disabled]': 'disabled',\n 'class': 'mat-focus-indicator',\n }, inputs: ['disabled', 'disableRipple', 'color'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n\\n\\n\", styles: [\".mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{opacity:0}.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:.04}@media(hover: none){.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:0}}.mat-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-button.mat-button-disabled,.mat-icon-button.mat-button-disabled,.mat-stroked-button.mat-button-disabled,.mat-flat-button.mat-button-disabled{cursor:default}.mat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-button.cdk-program-focused .mat-button-focus-overlay,.mat-icon-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-icon-button.cdk-program-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-program-focused .mat-button-focus-overlay,.mat-flat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-flat-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-raised-button::-moz-focus-inner{border:0}.mat-raised-button.mat-button-disabled{cursor:default}.mat-raised-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-raised-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-raised-button::-moz-focus-inner{border:0}._mat-animation-noopable.mat-raised-button{transition:none;animation:none}.mat-stroked-button{border:1px solid currentColor;padding:0 15px;line-height:34px}.mat-stroked-button .mat-button-ripple.mat-ripple,.mat-stroked-button .mat-button-focus-overlay{top:-1px;left:-1px;right:-1px;bottom:-1px}.mat-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab::-moz-focus-inner{border:0}.mat-fab.mat-button-disabled{cursor:default}.mat-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-fab{transition:none;animation:none}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab::-moz-focus-inner{border:0}.mat-mini-fab.mat-button-disabled{cursor:default}.mat-mini-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-mini-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-mini-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-mini-fab{transition:none;animation:none}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button i,.mat-icon-button .mat-icon{line-height:24px}.mat-button-ripple.mat-ripple,.mat-button-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-button-ripple.mat-ripple:not(:empty){transform:translateZ(0)}.mat-button-focus-overlay{opacity:0;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1),background-color 200ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-button-focus-overlay{transition:none}.mat-button-ripple-round{border-radius:50%;z-index:1}.mat-button .mat-button-wrapper>*,.mat-flat-button .mat-button-wrapper>*,.mat-stroked-button .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*{vertical-align:middle}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;font-size:inherit;width:2.5em;height:2.5em}.cdk-high-contrast-active .mat-button,.cdk-high-contrast-active .mat-flat-button,.cdk-high-contrast-active .mat-raised-button,.cdk-high-contrast-active .mat-icon-button,.cdk-high-contrast-active .mat-fab,.cdk-high-contrast-active .mat-mini-fab{outline:solid 1px}.cdk-high-contrast-active .mat-button-base.cdk-keyboard-focused,.cdk-high-contrast-active .mat-button-base.cdk-program-focused{outline:solid 3px}\\n\"] }]\n }], ctorParameters: function () {\n return [{ type: i0.ElementRef }, { type: i1.FocusMonitor }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }];\n }, propDecorators: { ripple: [{\n type: ViewChild,\n args: [MatRipple]\n }] } });\n/**\n * Material design anchor button.\n */\nclass MatAnchor extends MatButton {\n constructor(focusMonitor, elementRef, animationMode, \n /** @breaking-change 14.0.0 _ngZone will be required. */\n _ngZone) {\n super(elementRef, focusMonitor, animationMode);\n this._ngZone = _ngZone;\n this._haltDisabledEvents = (event) => {\n // A disabled button shouldn't apply any actions\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n }\n ngAfterViewInit() {\n super.ngAfterViewInit();\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.runOutsideAngular(() => {\n this._elementRef.nativeElement.addEventListener('click', this._haltDisabledEvents);\n });\n }\n else {\n this._elementRef.nativeElement.addEventListener('click', this._haltDisabledEvents);\n }\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n this._elementRef.nativeElement.removeEventListener('click', this._haltDisabledEvents);\n }\n}\nMatAnchor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatAnchor, deps: [{ token: i1.FocusMonitor }, { token: i0.ElementRef }, { token: ANIMATION_MODULE_TYPE, optional: true }, { token: i0.NgZone, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatAnchor.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"12.0.0\", version: \"13.3.0\", type: MatAnchor, selector: \"a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab],\\n a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]\", inputs: { disabled: \"disabled\", disableRipple: \"disableRipple\", color: \"color\", tabIndex: \"tabIndex\" }, host: { properties: { \"attr.tabindex\": \"disabled ? -1 : tabIndex\", \"attr.disabled\": \"disabled || null\", \"attr.aria-disabled\": \"disabled.toString()\", \"class._mat-animation-noopable\": \"_animationMode === \\\"NoopAnimations\\\"\", \"class.mat-button-disabled\": \"disabled\" }, classAttribute: \"mat-focus-indicator\" }, exportAs: [\"matButton\", \"matAnchor\"], usesInheritance: true, ngImport: i0, template: \"\\n\\n\\n\", styles: [\".mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{opacity:0}.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:.04}@media(hover: none){.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:0}}.mat-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-button.mat-button-disabled,.mat-icon-button.mat-button-disabled,.mat-stroked-button.mat-button-disabled,.mat-flat-button.mat-button-disabled{cursor:default}.mat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-button.cdk-program-focused .mat-button-focus-overlay,.mat-icon-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-icon-button.cdk-program-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-program-focused .mat-button-focus-overlay,.mat-flat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-flat-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-raised-button::-moz-focus-inner{border:0}.mat-raised-button.mat-button-disabled{cursor:default}.mat-raised-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-raised-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-raised-button::-moz-focus-inner{border:0}._mat-animation-noopable.mat-raised-button{transition:none;animation:none}.mat-stroked-button{border:1px solid currentColor;padding:0 15px;line-height:34px}.mat-stroked-button .mat-button-ripple.mat-ripple,.mat-stroked-button .mat-button-focus-overlay{top:-1px;left:-1px;right:-1px;bottom:-1px}.mat-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab::-moz-focus-inner{border:0}.mat-fab.mat-button-disabled{cursor:default}.mat-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-fab{transition:none;animation:none}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab::-moz-focus-inner{border:0}.mat-mini-fab.mat-button-disabled{cursor:default}.mat-mini-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-mini-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-mini-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-mini-fab{transition:none;animation:none}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button i,.mat-icon-button .mat-icon{line-height:24px}.mat-button-ripple.mat-ripple,.mat-button-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-button-ripple.mat-ripple:not(:empty){transform:translateZ(0)}.mat-button-focus-overlay{opacity:0;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1),background-color 200ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-button-focus-overlay{transition:none}.mat-button-ripple-round{border-radius:50%;z-index:1}.mat-button .mat-button-wrapper>*,.mat-flat-button .mat-button-wrapper>*,.mat-stroked-button .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*{vertical-align:middle}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;font-size:inherit;width:2.5em;height:2.5em}.cdk-high-contrast-active .mat-button,.cdk-high-contrast-active .mat-flat-button,.cdk-high-contrast-active .mat-raised-button,.cdk-high-contrast-active .mat-icon-button,.cdk-high-contrast-active .mat-fab,.cdk-high-contrast-active .mat-mini-fab{outline:solid 1px}.cdk-high-contrast-active .mat-button-base.cdk-keyboard-focused,.cdk-high-contrast-active .mat-button-base.cdk-program-focused{outline:solid 3px}\\n\"], directives: [{ type: i2.MatRipple, selector: \"[mat-ripple], [matRipple]\", inputs: [\"matRippleColor\", \"matRippleUnbounded\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\", \"matRippleDisabled\", \"matRippleTrigger\"], exportAs: [\"matRipple\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatAnchor, decorators: [{\n type: Component,\n args: [{ selector: `a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab],\n a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]`, exportAs: 'matButton, matAnchor', host: {\n // Note that we ignore the user-specified tabindex when it's disabled for\n // consistency with the `mat-button` applied on native buttons where even\n // though they have an index, they're not tabbable.\n '[attr.tabindex]': 'disabled ? -1 : tabIndex',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '[class.mat-button-disabled]': 'disabled',\n 'class': 'mat-focus-indicator',\n }, inputs: ['disabled', 'disableRipple', 'color'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n\\n\\n\", styles: [\".mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{opacity:0}.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:.04}@media(hover: none){.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:0}}.mat-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-button.mat-button-disabled,.mat-icon-button.mat-button-disabled,.mat-stroked-button.mat-button-disabled,.mat-flat-button.mat-button-disabled{cursor:default}.mat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-button.cdk-program-focused .mat-button-focus-overlay,.mat-icon-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-icon-button.cdk-program-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-program-focused .mat-button-focus-overlay,.mat-flat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-flat-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-raised-button::-moz-focus-inner{border:0}.mat-raised-button.mat-button-disabled{cursor:default}.mat-raised-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-raised-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-raised-button::-moz-focus-inner{border:0}._mat-animation-noopable.mat-raised-button{transition:none;animation:none}.mat-stroked-button{border:1px solid currentColor;padding:0 15px;line-height:34px}.mat-stroked-button .mat-button-ripple.mat-ripple,.mat-stroked-button .mat-button-focus-overlay{top:-1px;left:-1px;right:-1px;bottom:-1px}.mat-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab::-moz-focus-inner{border:0}.mat-fab.mat-button-disabled{cursor:default}.mat-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-fab{transition:none;animation:none}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab::-moz-focus-inner{border:0}.mat-mini-fab.mat-button-disabled{cursor:default}.mat-mini-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-mini-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-mini-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-mini-fab{transition:none;animation:none}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button i,.mat-icon-button .mat-icon{line-height:24px}.mat-button-ripple.mat-ripple,.mat-button-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-button-ripple.mat-ripple:not(:empty){transform:translateZ(0)}.mat-button-focus-overlay{opacity:0;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1),background-color 200ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-button-focus-overlay{transition:none}.mat-button-ripple-round{border-radius:50%;z-index:1}.mat-button .mat-button-wrapper>*,.mat-flat-button .mat-button-wrapper>*,.mat-stroked-button .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*{vertical-align:middle}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;font-size:inherit;width:2.5em;height:2.5em}.cdk-high-contrast-active .mat-button,.cdk-high-contrast-active .mat-flat-button,.cdk-high-contrast-active .mat-raised-button,.cdk-high-contrast-active .mat-icon-button,.cdk-high-contrast-active .mat-fab,.cdk-high-contrast-active .mat-mini-fab{outline:solid 1px}.cdk-high-contrast-active .mat-button-base.cdk-keyboard-focused,.cdk-high-contrast-active .mat-button-base.cdk-program-focused{outline:solid 3px}\\n\"] }]\n }], ctorParameters: function () {\n return [{ type: i1.FocusMonitor }, { type: i0.ElementRef }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }, { type: i0.NgZone, decorators: [{\n type: Optional\n }] }];\n }, propDecorators: { tabIndex: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatButtonModule {\n}\nMatButtonModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatButtonModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatButtonModule, declarations: [MatButton, MatAnchor], imports: [MatRippleModule, MatCommonModule], exports: [MatButton, MatAnchor, MatCommonModule] });\nMatButtonModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatButtonModule, imports: [[MatRippleModule, MatCommonModule], MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatButtonModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatRippleModule, MatCommonModule],\n exports: [MatButton, MatAnchor, MatCommonModule],\n declarations: [MatButton, MatAnchor],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MatAnchor, MatButton, MatButtonModule };\n","import * as i0 from '@angular/core';\nimport { Version, InjectionToken, NgModule, Optional, Inject, inject, LOCALE_ID, Injectable, Directive, Input, Component, ViewEncapsulation, ChangeDetectionStrategy, EventEmitter, Output } from '@angular/core';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport { VERSION as VERSION$1 } from '@angular/cdk';\nimport * as i3 from '@angular/common';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport * as i1$1 from '@angular/cdk/platform';\nimport { _isTestEnvironment, normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport * as i1 from '@angular/cdk/a11y';\nimport { isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty, coerceNumberProperty, coerceElement } from '@angular/cdk/coercion';\nimport { Subject, Observable } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { ENTER, SPACE, hasModifierKey } from '@angular/cdk/keycodes';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Current version of Angular Material. */\nconst VERSION = new Version('13.3.9');\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** @docs-private */\nclass AnimationCurves {\n}\nAnimationCurves.STANDARD_CURVE = 'cubic-bezier(0.4,0.0,0.2,1)';\nAnimationCurves.DECELERATION_CURVE = 'cubic-bezier(0.0,0.0,0.2,1)';\nAnimationCurves.ACCELERATION_CURVE = 'cubic-bezier(0.4,0.0,1,1)';\nAnimationCurves.SHARP_CURVE = 'cubic-bezier(0.4,0.0,0.6,1)';\n/** @docs-private */\nclass AnimationDurations {\n}\nAnimationDurations.COMPLEX = '375ms';\nAnimationDurations.ENTERING = '225ms';\nAnimationDurations.EXITING = '195ms';\n\n/** @docs-private */\nfunction MATERIAL_SANITY_CHECKS_FACTORY() {\n return true;\n}\n/** Injection token that configures whether the Material sanity checks are enabled. */\nconst MATERIAL_SANITY_CHECKS = new InjectionToken('mat-sanity-checks', {\n providedIn: 'root',\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\n});\n/**\n * Module that captures anything that should be loaded and/or run for *all* Angular Material\n * components. This includes Bidi, etc.\n *\n * This module should be imported to each top-level component module (e.g., MatTabsModule).\n */\nclass MatCommonModule {\n constructor(highContrastModeDetector, _sanityChecks, _document) {\n this._sanityChecks = _sanityChecks;\n this._document = _document;\n /** Whether we've done the global sanity checks (e.g. a theme is loaded, there is a doctype). */\n this._hasDoneGlobalChecks = false;\n // While A11yModule also does this, we repeat it here to avoid importing A11yModule\n // in MatCommonModule.\n highContrastModeDetector._applyBodyHighContrastModeCssClasses();\n if (!this._hasDoneGlobalChecks) {\n this._hasDoneGlobalChecks = true;\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (this._checkIsEnabled('doctype')) {\n _checkDoctypeIsDefined(this._document);\n }\n if (this._checkIsEnabled('theme')) {\n _checkThemeIsPresent(this._document);\n }\n if (this._checkIsEnabled('version')) {\n _checkCdkVersionMatch();\n }\n }\n }\n }\n /** Gets whether a specific sanity check is enabled. */\n _checkIsEnabled(name) {\n if (_isTestEnvironment()) {\n return false;\n }\n if (typeof this._sanityChecks === 'boolean') {\n return this._sanityChecks;\n }\n return !!this._sanityChecks[name];\n }\n}\nMatCommonModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatCommonModule, deps: [{ token: i1.HighContrastModeDetector }, { token: MATERIAL_SANITY_CHECKS, optional: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.NgModule });\nMatCommonModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatCommonModule, imports: [BidiModule], exports: [BidiModule] });\nMatCommonModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatCommonModule, imports: [[BidiModule], BidiModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatCommonModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [BidiModule],\n exports: [BidiModule],\n }]\n }], ctorParameters: function () {\n return [{ type: i1.HighContrastModeDetector }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MATERIAL_SANITY_CHECKS]\n }] }, { type: Document, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }];\n } });\n/** Checks that the page has a doctype. */\nfunction _checkDoctypeIsDefined(doc) {\n if (!doc.doctype) {\n console.warn('Current document does not have a doctype. This may cause ' +\n 'some Angular Material components not to behave as expected.');\n }\n}\n/** Checks that a theme has been included. */\nfunction _checkThemeIsPresent(doc) {\n // We need to assert that the `body` is defined, because these checks run very early\n // and the `body` won't be defined if the consumer put their scripts in the `head`.\n if (!doc.body || typeof getComputedStyle !== 'function') {\n return;\n }\n const testElement = doc.createElement('div');\n testElement.classList.add('mat-theme-loaded-marker');\n doc.body.appendChild(testElement);\n const computedStyle = getComputedStyle(testElement);\n // In some situations the computed style of the test element can be null. For example in\n // Firefox, the computed style is null if an application is running inside of a hidden iframe.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n if (computedStyle && computedStyle.display !== 'none') {\n console.warn('Could not find Angular Material core theme. Most Material ' +\n 'components may not work as expected. For more info refer ' +\n 'to the theming guide: https://material.angular.io/guide/theming');\n }\n testElement.remove();\n}\n/** Checks whether the Material version matches the CDK version. */\nfunction _checkCdkVersionMatch() {\n if (VERSION.full !== VERSION$1.full) {\n console.warn('The Angular Material version (' +\n VERSION.full +\n ') does not match ' +\n 'the Angular CDK version (' +\n VERSION$1.full +\n ').\\n' +\n 'Please ensure the versions of these two packages exactly match.');\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction mixinDisabled(base) {\n return class extends base {\n constructor(...args) {\n super(...args);\n this._disabled = false;\n }\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n }\n };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction mixinColor(base, defaultColor) {\n return class extends base {\n constructor(...args) {\n super(...args);\n this.defaultColor = defaultColor;\n // Set the default color that can be specified from the mixin.\n this.color = defaultColor;\n }\n get color() {\n return this._color;\n }\n set color(value) {\n const colorPalette = value || this.defaultColor;\n if (colorPalette !== this._color) {\n if (this._color) {\n this._elementRef.nativeElement.classList.remove(`mat-${this._color}`);\n }\n if (colorPalette) {\n this._elementRef.nativeElement.classList.add(`mat-${colorPalette}`);\n }\n this._color = colorPalette;\n }\n }\n };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction mixinDisableRipple(base) {\n return class extends base {\n constructor(...args) {\n super(...args);\n this._disableRipple = false;\n }\n /** Whether the ripple effect is disabled or not. */\n get disableRipple() {\n return this._disableRipple;\n }\n set disableRipple(value) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction mixinTabIndex(base, defaultTabIndex = 0) {\n return class extends base {\n constructor(...args) {\n super(...args);\n this._tabIndex = defaultTabIndex;\n this.defaultTabIndex = defaultTabIndex;\n }\n get tabIndex() {\n return this.disabled ? -1 : this._tabIndex;\n }\n set tabIndex(value) {\n // If the specified tabIndex value is null or undefined, fall back to the default value.\n this._tabIndex = value != null ? coerceNumberProperty(value) : this.defaultTabIndex;\n }\n };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction mixinErrorState(base) {\n return class extends base {\n constructor(...args) {\n super(...args);\n // This class member exists as an interop with `MatFormFieldControl` which expects\n // a public `stateChanges` observable to emit whenever the form field should be updated.\n // The description is not specifically mentioning the error state, as classes using this\n // mixin can/should emit an event in other cases too.\n /** Emits whenever the component state changes. */\n this.stateChanges = new Subject();\n /** Whether the component is in an error state. */\n this.errorState = false;\n }\n /** Updates the error state based on the provided error state matcher. */\n updateErrorState() {\n const oldState = this.errorState;\n const parent = this._parentFormGroup || this._parentForm;\n const matcher = this.errorStateMatcher || this._defaultErrorStateMatcher;\n const control = this.ngControl ? this.ngControl.control : null;\n const newState = matcher.isErrorState(control, parent);\n if (newState !== oldState) {\n this.errorState = newState;\n this.stateChanges.next();\n }\n }\n };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Mixin to augment a directive with an initialized property that will emits when ngOnInit ends. */\nfunction mixinInitialized(base) {\n return class extends base {\n constructor(...args) {\n super(...args);\n /** Whether this directive has been marked as initialized. */\n this._isInitialized = false;\n /**\n * List of subscribers that subscribed before the directive was initialized. Should be notified\n * during _markInitialized. Set to null after pending subscribers are notified, and should\n * not expect to be populated after.\n */\n this._pendingSubscribers = [];\n /**\n * Observable stream that emits when the directive initializes. If already initialized, the\n * subscriber is stored to be notified once _markInitialized is called.\n */\n this.initialized = new Observable(subscriber => {\n // If initialized, immediately notify the subscriber. Otherwise store the subscriber to notify\n // when _markInitialized is called.\n if (this._isInitialized) {\n this._notifySubscriber(subscriber);\n }\n else {\n this._pendingSubscribers.push(subscriber);\n }\n });\n }\n /**\n * Marks the state as initialized and notifies pending subscribers. Should be called at the end\n * of ngOnInit.\n * @docs-private\n */\n _markInitialized() {\n if (this._isInitialized && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('This directive has already been marked as initialized and ' +\n 'should not be called twice.');\n }\n this._isInitialized = true;\n this._pendingSubscribers.forEach(this._notifySubscriber);\n this._pendingSubscribers = null;\n }\n /** Emits and completes the subscriber stream (should only emit once). */\n _notifySubscriber(subscriber) {\n subscriber.next();\n subscriber.complete();\n }\n };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** InjectionToken for datepicker that can be used to override default locale code. */\nconst MAT_DATE_LOCALE = new InjectionToken('MAT_DATE_LOCALE', {\n providedIn: 'root',\n factory: MAT_DATE_LOCALE_FACTORY,\n});\n/** @docs-private */\nfunction MAT_DATE_LOCALE_FACTORY() {\n return inject(LOCALE_ID);\n}\n/** Adapts type `D` to be usable as a date by cdk-based components that work with dates. */\nclass DateAdapter {\n constructor() {\n this._localeChanges = new Subject();\n /** A stream that emits when the locale changes. */\n this.localeChanges = this._localeChanges;\n }\n /**\n * Given a potential date object, returns that same date object if it is\n * a valid date, or `null` if it's not a valid date.\n * @param obj The object to check.\n * @returns A date or `null`.\n */\n getValidDateOrNull(obj) {\n return this.isDateInstance(obj) && this.isValid(obj) ? obj : null;\n }\n /**\n * Attempts to deserialize a value to a valid date object. This is different from parsing in that\n * deserialize should only accept non-ambiguous, locale-independent formats (e.g. a ISO 8601\n * string). The default implementation does not allow any deserialization, it simply checks that\n * the given value is already a valid date object or null. The `` will call this\n * method on all of its `@Input()` properties that accept dates. It is therefore possible to\n * support passing values from your backend directly to these properties by overriding this method\n * to also deserialize the format used by your backend.\n * @param value The value to be deserialized into a date object.\n * @returns The deserialized date object, either a valid date, null if the value can be\n * deserialized into a null date (e.g. the empty string), or an invalid date.\n */\n deserialize(value) {\n if (value == null || (this.isDateInstance(value) && this.isValid(value))) {\n return value;\n }\n return this.invalid();\n }\n /**\n * Sets the locale used for all dates.\n * @param locale The new locale.\n */\n setLocale(locale) {\n this.locale = locale;\n this._localeChanges.next();\n }\n /**\n * Compares two dates.\n * @param first The first date to compare.\n * @param second The second date to compare.\n * @returns 0 if the dates are equal, a number less than 0 if the first date is earlier,\n * a number greater than 0 if the first date is later.\n */\n compareDate(first, second) {\n return (this.getYear(first) - this.getYear(second) ||\n this.getMonth(first) - this.getMonth(second) ||\n this.getDate(first) - this.getDate(second));\n }\n /**\n * Checks if two dates are equal.\n * @param first The first date to check.\n * @param second The second date to check.\n * @returns Whether the two dates are equal.\n * Null dates are considered equal to other null dates.\n */\n sameDate(first, second) {\n if (first && second) {\n let firstValid = this.isValid(first);\n let secondValid = this.isValid(second);\n if (firstValid && secondValid) {\n return !this.compareDate(first, second);\n }\n return firstValid == secondValid;\n }\n return first == second;\n }\n /**\n * Clamp the given date between min and max dates.\n * @param date The date to clamp.\n * @param min The minimum value to allow. If null or omitted no min is enforced.\n * @param max The maximum value to allow. If null or omitted no max is enforced.\n * @returns `min` if `date` is less than `min`, `max` if date is greater than `max`,\n * otherwise `date`.\n */\n clampDate(date, min, max) {\n if (min && this.compareDate(date, min) < 0) {\n return min;\n }\n if (max && this.compareDate(date, max) > 0) {\n return max;\n }\n return date;\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst MAT_DATE_FORMATS = new InjectionToken('mat-date-formats');\n\n/**\n * Matches strings that have the form of a valid RFC 3339 string\n * (https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\n * because the regex will match strings an with out of bounds month, date, etc.\n */\nconst ISO_8601_REGEX = /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|(?:(?:\\+|-)\\d{2}:\\d{2}))?)?$/;\n/** Creates an array and fills it with values. */\nfunction range(length, valueFunction) {\n const valuesArray = Array(length);\n for (let i = 0; i < length; i++) {\n valuesArray[i] = valueFunction(i);\n }\n return valuesArray;\n}\n/** Adapts the native JS Date for use with cdk-based components that work with dates. */\nclass NativeDateAdapter extends DateAdapter {\n constructor(matDateLocale, \n /**\n * @deprecated No longer being used. To be removed.\n * @breaking-change 14.0.0\n */\n _platform) {\n super();\n /**\n * @deprecated No longer being used. To be removed.\n * @breaking-change 14.0.0\n */\n this.useUtcForDisplay = false;\n super.setLocale(matDateLocale);\n }\n getYear(date) {\n return date.getFullYear();\n }\n getMonth(date) {\n return date.getMonth();\n }\n getDate(date) {\n return date.getDate();\n }\n getDayOfWeek(date) {\n return date.getDay();\n }\n getMonthNames(style) {\n const dtf = new Intl.DateTimeFormat(this.locale, { month: style, timeZone: 'utc' });\n return range(12, i => this._format(dtf, new Date(2017, i, 1)));\n }\n getDateNames() {\n const dtf = new Intl.DateTimeFormat(this.locale, { day: 'numeric', timeZone: 'utc' });\n return range(31, i => this._format(dtf, new Date(2017, 0, i + 1)));\n }\n getDayOfWeekNames(style) {\n const dtf = new Intl.DateTimeFormat(this.locale, { weekday: style, timeZone: 'utc' });\n return range(7, i => this._format(dtf, new Date(2017, 0, i + 1)));\n }\n getYearName(date) {\n const dtf = new Intl.DateTimeFormat(this.locale, { year: 'numeric', timeZone: 'utc' });\n return this._format(dtf, date);\n }\n getFirstDayOfWeek() {\n // We can't tell using native JS Date what the first day of the week is, we default to Sunday.\n return 0;\n }\n getNumDaysInMonth(date) {\n return this.getDate(this._createDateWithOverflow(this.getYear(date), this.getMonth(date) + 1, 0));\n }\n clone(date) {\n return new Date(date.getTime());\n }\n createDate(year, month, date) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // Check for invalid month and date (except upper bound on date which we have to check after\n // creating the Date).\n if (month < 0 || month > 11) {\n throw Error(`Invalid month index \"${month}\". Month index has to be between 0 and 11.`);\n }\n if (date < 1) {\n throw Error(`Invalid date \"${date}\". Date has to be greater than 0.`);\n }\n }\n let result = this._createDateWithOverflow(year, month, date);\n // Check that the date wasn't above the upper bound for the month, causing the month to overflow\n if (result.getMonth() != month && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`Invalid date \"${date}\" for month with index \"${month}\".`);\n }\n return result;\n }\n today() {\n return new Date();\n }\n parse(value) {\n // We have no way using the native JS Date to set the parse format or locale, so we ignore these\n // parameters.\n if (typeof value == 'number') {\n return new Date(value);\n }\n return value ? new Date(Date.parse(value)) : null;\n }\n format(date, displayFormat) {\n if (!this.isValid(date)) {\n throw Error('NativeDateAdapter: Cannot format invalid date.');\n }\n const dtf = new Intl.DateTimeFormat(this.locale, Object.assign(Object.assign({}, displayFormat), { timeZone: 'utc' }));\n return this._format(dtf, date);\n }\n addCalendarYears(date, years) {\n return this.addCalendarMonths(date, years * 12);\n }\n addCalendarMonths(date, months) {\n let newDate = this._createDateWithOverflow(this.getYear(date), this.getMonth(date) + months, this.getDate(date));\n // It's possible to wind up in the wrong month if the original month has more days than the new\n // month. In this case we want to go to the last day of the desired month.\n // Note: the additional + 12 % 12 ensures we end up with a positive number, since JS % doesn't\n // guarantee this.\n if (this.getMonth(newDate) != (((this.getMonth(date) + months) % 12) + 12) % 12) {\n newDate = this._createDateWithOverflow(this.getYear(newDate), this.getMonth(newDate), 0);\n }\n return newDate;\n }\n addCalendarDays(date, days) {\n return this._createDateWithOverflow(this.getYear(date), this.getMonth(date), this.getDate(date) + days);\n }\n toIso8601(date) {\n return [\n date.getUTCFullYear(),\n this._2digit(date.getUTCMonth() + 1),\n this._2digit(date.getUTCDate()),\n ].join('-');\n }\n /**\n * Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings\n * (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an\n * invalid date for all other values.\n */\n deserialize(value) {\n if (typeof value === 'string') {\n if (!value) {\n return null;\n }\n // The `Date` constructor accepts formats other than ISO 8601, so we need to make sure the\n // string is the right format first.\n if (ISO_8601_REGEX.test(value)) {\n let date = new Date(value);\n if (this.isValid(date)) {\n return date;\n }\n }\n }\n return super.deserialize(value);\n }\n isDateInstance(obj) {\n return obj instanceof Date;\n }\n isValid(date) {\n return !isNaN(date.getTime());\n }\n invalid() {\n return new Date(NaN);\n }\n /** Creates a date but allows the month and date to overflow. */\n _createDateWithOverflow(year, month, date) {\n // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.\n // To work around this we use `setFullYear` and `setHours` instead.\n const d = new Date();\n d.setFullYear(year, month, date);\n d.setHours(0, 0, 0, 0);\n return d;\n }\n /**\n * Pads a number to make it two digits.\n * @param n The number to pad.\n * @returns The padded number.\n */\n _2digit(n) {\n return ('00' + n).slice(-2);\n }\n /**\n * When converting Date object to string, javascript built-in functions may return wrong\n * results because it applies its internal DST rules. The DST rules around the world change\n * very frequently, and the current valid rule is not always valid in previous years though.\n * We work around this problem building a new Date object which has its internal UTC\n * representation with the local date and time.\n * @param dtf Intl.DateTimeFormat object, containg the desired string format. It must have\n * timeZone set to 'utc' to work fine.\n * @param date Date from which we want to get the string representation according to dtf\n * @returns A Date object with its UTC representation based on the passed in date info\n */\n _format(dtf, date) {\n // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.\n // To work around this we use `setUTCFullYear` and `setUTCHours` instead.\n const d = new Date();\n d.setUTCFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n d.setUTCHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n return dtf.format(d);\n }\n}\nNativeDateAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: NativeDateAdapter, deps: [{ token: MAT_DATE_LOCALE, optional: true }, { token: i1$1.Platform }], target: i0.ɵɵFactoryTarget.Injectable });\nNativeDateAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: NativeDateAdapter });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: NativeDateAdapter, decorators: [{\n type: Injectable\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DATE_LOCALE]\n }] }, { type: i1$1.Platform }];\n } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst MAT_NATIVE_DATE_FORMATS = {\n parse: {\n dateInput: null,\n },\n display: {\n dateInput: { year: 'numeric', month: 'numeric', day: 'numeric' },\n monthYearLabel: { year: 'numeric', month: 'short' },\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\n },\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass NativeDateModule {\n}\nNativeDateModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: NativeDateModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nNativeDateModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: NativeDateModule });\nNativeDateModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: NativeDateModule, providers: [{ provide: DateAdapter, useClass: NativeDateAdapter }] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: NativeDateModule, decorators: [{\n type: NgModule,\n args: [{\n providers: [{ provide: DateAdapter, useClass: NativeDateAdapter }],\n }]\n }] });\nclass MatNativeDateModule {\n}\nMatNativeDateModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatNativeDateModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatNativeDateModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatNativeDateModule, imports: [NativeDateModule] });\nMatNativeDateModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatNativeDateModule, providers: [{ provide: MAT_DATE_FORMATS, useValue: MAT_NATIVE_DATE_FORMATS }], imports: [[NativeDateModule]] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatNativeDateModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [NativeDateModule],\n providers: [{ provide: MAT_DATE_FORMATS, useValue: MAT_NATIVE_DATE_FORMATS }],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Error state matcher that matches when a control is invalid and dirty. */\nclass ShowOnDirtyErrorStateMatcher {\n isErrorState(control, form) {\n return !!(control && control.invalid && (control.dirty || (form && form.submitted)));\n }\n}\nShowOnDirtyErrorStateMatcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ShowOnDirtyErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\nShowOnDirtyErrorStateMatcher.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ShowOnDirtyErrorStateMatcher });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ShowOnDirtyErrorStateMatcher, decorators: [{\n type: Injectable\n }] });\n/** Provider that defines how form controls behave with regards to displaying error messages. */\nclass ErrorStateMatcher {\n isErrorState(control, form) {\n return !!(control && control.invalid && (control.touched || (form && form.submitted)));\n }\n}\nErrorStateMatcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\nErrorStateMatcher.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ErrorStateMatcher, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: ErrorStateMatcher, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Shared directive to count lines inside a text area, such as a list item.\n * Line elements can be extracted with a @ContentChildren(MatLine) query, then\n * counted by checking the query list's length.\n */\nclass MatLine {\n}\nMatLine.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatLine, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatLine.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: MatLine, selector: \"[mat-line], [matLine]\", host: { classAttribute: \"mat-line\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatLine, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-line], [matLine]',\n host: { 'class': 'mat-line' },\n }]\n }] });\n/**\n * Helper that takes a query list of lines and sets the correct class on the host.\n * @docs-private\n */\nfunction setLines(lines, element, prefix = 'mat') {\n // Note: doesn't need to unsubscribe, because `changes`\n // gets completed by Angular when the view is destroyed.\n lines.changes.pipe(startWith(lines)).subscribe(({ length }) => {\n setClass(element, `${prefix}-2-line`, false);\n setClass(element, `${prefix}-3-line`, false);\n setClass(element, `${prefix}-multi-line`, false);\n if (length === 2 || length === 3) {\n setClass(element, `${prefix}-${length}-line`, true);\n }\n else if (length > 3) {\n setClass(element, `${prefix}-multi-line`, true);\n }\n });\n}\n/** Adds or removes a class from an element. */\nfunction setClass(element, className, isAdd) {\n element.nativeElement.classList.toggle(className, isAdd);\n}\nclass MatLineModule {\n}\nMatLineModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatLineModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatLineModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatLineModule, declarations: [MatLine], imports: [MatCommonModule], exports: [MatLine, MatCommonModule] });\nMatLineModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatLineModule, imports: [[MatCommonModule], MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatLineModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule],\n exports: [MatLine, MatCommonModule],\n declarations: [MatLine],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Reference to a previously launched ripple element.\n */\nclass RippleRef {\n constructor(_renderer, \n /** Reference to the ripple HTML element. */\n element, \n /** Ripple configuration used for the ripple. */\n config) {\n this._renderer = _renderer;\n this.element = element;\n this.config = config;\n /** Current state of the ripple. */\n this.state = 3 /* HIDDEN */;\n }\n /** Fades out the ripple element. */\n fadeOut() {\n this._renderer.fadeOutRipple(this);\n }\n}\n\n// TODO: import these values from `@material/ripple` eventually.\n/**\n * Default ripple animation configuration for ripples without an explicit\n * animation config specified.\n */\nconst defaultRippleAnimationConfig = {\n enterDuration: 225,\n exitDuration: 150,\n};\n/**\n * Timeout for ignoring mouse events. Mouse events will be temporary ignored after touch\n * events to avoid synthetic mouse events.\n */\nconst ignoreMouseEventsTimeout = 800;\n/** Options that apply to all the event listeners that are bound by the ripple renderer. */\nconst passiveEventOptions = normalizePassiveListenerOptions({ passive: true });\n/** Events that signal that the pointer is down. */\nconst pointerDownEvents = ['mousedown', 'touchstart'];\n/** Events that signal that the pointer is up. */\nconst pointerUpEvents = ['mouseup', 'mouseleave', 'touchend', 'touchcancel'];\n/**\n * Helper service that performs DOM manipulations. Not intended to be used outside this module.\n * The constructor takes a reference to the ripple directive's host element and a map of DOM\n * event handlers to be installed on the element that triggers ripple animations.\n * This will eventually become a custom renderer once Angular support exists.\n * @docs-private\n */\nclass RippleRenderer {\n constructor(_target, _ngZone, elementOrElementRef, platform) {\n this._target = _target;\n this._ngZone = _ngZone;\n /** Whether the pointer is currently down or not. */\n this._isPointerDown = false;\n /** Set of currently active ripple references. */\n this._activeRipples = new Set();\n /** Whether pointer-up event listeners have been registered. */\n this._pointerUpEventsRegistered = false;\n // Only do anything if we're on the browser.\n if (platform.isBrowser) {\n this._containerElement = coerceElement(elementOrElementRef);\n }\n }\n /**\n * Fades in a ripple at the given coordinates.\n * @param x Coordinate within the element, along the X axis at which to start the ripple.\n * @param y Coordinate within the element, along the Y axis at which to start the ripple.\n * @param config Extra ripple options.\n */\n fadeInRipple(x, y, config = {}) {\n const containerRect = (this._containerRect =\n this._containerRect || this._containerElement.getBoundingClientRect());\n const animationConfig = Object.assign(Object.assign({}, defaultRippleAnimationConfig), config.animation);\n if (config.centered) {\n x = containerRect.left + containerRect.width / 2;\n y = containerRect.top + containerRect.height / 2;\n }\n const radius = config.radius || distanceToFurthestCorner(x, y, containerRect);\n const offsetX = x - containerRect.left;\n const offsetY = y - containerRect.top;\n const duration = animationConfig.enterDuration;\n const ripple = document.createElement('div');\n ripple.classList.add('mat-ripple-element');\n ripple.style.left = `${offsetX - radius}px`;\n ripple.style.top = `${offsetY - radius}px`;\n ripple.style.height = `${radius * 2}px`;\n ripple.style.width = `${radius * 2}px`;\n // If a custom color has been specified, set it as inline style. If no color is\n // set, the default color will be applied through the ripple theme styles.\n if (config.color != null) {\n ripple.style.backgroundColor = config.color;\n }\n ripple.style.transitionDuration = `${duration}ms`;\n this._containerElement.appendChild(ripple);\n // By default the browser does not recalculate the styles of dynamically created\n // ripple elements. This is critical because then the `scale` would not animate properly.\n enforceStyleRecalculation(ripple);\n ripple.style.transform = 'scale(1)';\n // Exposed reference to the ripple that will be returned.\n const rippleRef = new RippleRef(this, ripple, config);\n rippleRef.state = 0 /* FADING_IN */;\n // Add the ripple reference to the list of all active ripples.\n this._activeRipples.add(rippleRef);\n if (!config.persistent) {\n this._mostRecentTransientRipple = rippleRef;\n }\n // Wait for the ripple element to be completely faded in.\n // Once it's faded in, the ripple can be hidden immediately if the mouse is released.\n this._runTimeoutOutsideZone(() => {\n const isMostRecentTransientRipple = rippleRef === this._mostRecentTransientRipple;\n rippleRef.state = 1 /* VISIBLE */;\n // When the timer runs out while the user has kept their pointer down, we want to\n // keep only the persistent ripples and the latest transient ripple. We do this,\n // because we don't want stacked transient ripples to appear after their enter\n // animation has finished.\n if (!config.persistent && (!isMostRecentTransientRipple || !this._isPointerDown)) {\n rippleRef.fadeOut();\n }\n }, duration);\n return rippleRef;\n }\n /** Fades out a ripple reference. */\n fadeOutRipple(rippleRef) {\n const wasActive = this._activeRipples.delete(rippleRef);\n if (rippleRef === this._mostRecentTransientRipple) {\n this._mostRecentTransientRipple = null;\n }\n // Clear out the cached bounding rect if we have no more ripples.\n if (!this._activeRipples.size) {\n this._containerRect = null;\n }\n // For ripples that are not active anymore, don't re-run the fade-out animation.\n if (!wasActive) {\n return;\n }\n const rippleEl = rippleRef.element;\n const animationConfig = Object.assign(Object.assign({}, defaultRippleAnimationConfig), rippleRef.config.animation);\n rippleEl.style.transitionDuration = `${animationConfig.exitDuration}ms`;\n rippleEl.style.opacity = '0';\n rippleRef.state = 2 /* FADING_OUT */;\n // Once the ripple faded out, the ripple can be safely removed from the DOM.\n this._runTimeoutOutsideZone(() => {\n rippleRef.state = 3 /* HIDDEN */;\n rippleEl.remove();\n }, animationConfig.exitDuration);\n }\n /** Fades out all currently active ripples. */\n fadeOutAll() {\n this._activeRipples.forEach(ripple => ripple.fadeOut());\n }\n /** Fades out all currently active non-persistent ripples. */\n fadeOutAllNonPersistent() {\n this._activeRipples.forEach(ripple => {\n if (!ripple.config.persistent) {\n ripple.fadeOut();\n }\n });\n }\n /** Sets up the trigger event listeners */\n setupTriggerEvents(elementOrElementRef) {\n const element = coerceElement(elementOrElementRef);\n if (!element || element === this._triggerElement) {\n return;\n }\n // Remove all previously registered event listeners from the trigger element.\n this._removeTriggerEvents();\n this._triggerElement = element;\n this._registerEvents(pointerDownEvents);\n }\n /**\n * Handles all registered events.\n * @docs-private\n */\n handleEvent(event) {\n if (event.type === 'mousedown') {\n this._onMousedown(event);\n }\n else if (event.type === 'touchstart') {\n this._onTouchStart(event);\n }\n else {\n this._onPointerUp();\n }\n // If pointer-up events haven't been registered yet, do so now.\n // We do this on-demand in order to reduce the total number of event listeners\n // registered by the ripples, which speeds up the rendering time for large UIs.\n if (!this._pointerUpEventsRegistered) {\n this._registerEvents(pointerUpEvents);\n this._pointerUpEventsRegistered = true;\n }\n }\n /** Function being called whenever the trigger is being pressed using mouse. */\n _onMousedown(event) {\n // Screen readers will fire fake mouse events for space/enter. Skip launching a\n // ripple in this case for consistency with the non-screen-reader experience.\n const isFakeMousedown = isFakeMousedownFromScreenReader(event);\n const isSyntheticEvent = this._lastTouchStartEvent &&\n Date.now() < this._lastTouchStartEvent + ignoreMouseEventsTimeout;\n if (!this._target.rippleDisabled && !isFakeMousedown && !isSyntheticEvent) {\n this._isPointerDown = true;\n this.fadeInRipple(event.clientX, event.clientY, this._target.rippleConfig);\n }\n }\n /** Function being called whenever the trigger is being pressed using touch. */\n _onTouchStart(event) {\n if (!this._target.rippleDisabled && !isFakeTouchstartFromScreenReader(event)) {\n // Some browsers fire mouse events after a `touchstart` event. Those synthetic mouse\n // events will launch a second ripple if we don't ignore mouse events for a specific\n // time after a touchstart event.\n this._lastTouchStartEvent = Date.now();\n this._isPointerDown = true;\n // Use `changedTouches` so we skip any touches where the user put\n // their finger down, but used another finger to tap the element again.\n const touches = event.changedTouches;\n for (let i = 0; i < touches.length; i++) {\n this.fadeInRipple(touches[i].clientX, touches[i].clientY, this._target.rippleConfig);\n }\n }\n }\n /** Function being called whenever the trigger is being released. */\n _onPointerUp() {\n if (!this._isPointerDown) {\n return;\n }\n this._isPointerDown = false;\n // Fade-out all ripples that are visible and not persistent.\n this._activeRipples.forEach(ripple => {\n // By default, only ripples that are completely visible will fade out on pointer release.\n // If the `terminateOnPointerUp` option is set, ripples that still fade in will also fade out.\n const isVisible = ripple.state === 1 /* VISIBLE */ ||\n (ripple.config.terminateOnPointerUp && ripple.state === 0 /* FADING_IN */);\n if (!ripple.config.persistent && isVisible) {\n ripple.fadeOut();\n }\n });\n }\n /** Runs a timeout outside of the Angular zone to avoid triggering the change detection. */\n _runTimeoutOutsideZone(fn, delay = 0) {\n this._ngZone.runOutsideAngular(() => setTimeout(fn, delay));\n }\n /** Registers event listeners for a given list of events. */\n _registerEvents(eventTypes) {\n this._ngZone.runOutsideAngular(() => {\n eventTypes.forEach(type => {\n this._triggerElement.addEventListener(type, this, passiveEventOptions);\n });\n });\n }\n /** Removes previously registered event listeners from the trigger element. */\n _removeTriggerEvents() {\n if (this._triggerElement) {\n pointerDownEvents.forEach(type => {\n this._triggerElement.removeEventListener(type, this, passiveEventOptions);\n });\n if (this._pointerUpEventsRegistered) {\n pointerUpEvents.forEach(type => {\n this._triggerElement.removeEventListener(type, this, passiveEventOptions);\n });\n }\n }\n }\n}\n/** Enforces a style recalculation of a DOM element by computing its styles. */\nfunction enforceStyleRecalculation(element) {\n // Enforce a style recalculation by calling `getComputedStyle` and accessing any property.\n // Calling `getPropertyValue` is important to let optimizers know that this is not a noop.\n // See: https://gist.github.com/paulirish/5d52fb081b3570c81e3a\n window.getComputedStyle(element).getPropertyValue('opacity');\n}\n/**\n * Returns the distance from the point (x, y) to the furthest corner of a rectangle.\n */\nfunction distanceToFurthestCorner(x, y, rect) {\n const distX = Math.max(Math.abs(x - rect.left), Math.abs(x - rect.right));\n const distY = Math.max(Math.abs(y - rect.top), Math.abs(y - rect.bottom));\n return Math.sqrt(distX * distX + distY * distY);\n}\n\n/** Injection token that can be used to specify the global ripple options. */\nconst MAT_RIPPLE_GLOBAL_OPTIONS = new InjectionToken('mat-ripple-global-options');\nclass MatRipple {\n constructor(_elementRef, ngZone, platform, globalOptions, _animationMode) {\n this._elementRef = _elementRef;\n this._animationMode = _animationMode;\n /**\n * If set, the radius in pixels of foreground ripples when fully expanded. If unset, the radius\n * will be the distance from the center of the ripple to the furthest corner of the host element's\n * bounding rectangle.\n */\n this.radius = 0;\n this._disabled = false;\n /** Whether ripple directive is initialized and the input bindings are set. */\n this._isInitialized = false;\n this._globalOptions = globalOptions || {};\n this._rippleRenderer = new RippleRenderer(this, ngZone, _elementRef, platform);\n }\n /**\n * Whether click events will not trigger the ripple. Ripples can be still launched manually\n * by using the `launch()` method.\n */\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n if (value) {\n this.fadeOutAllNonPersistent();\n }\n this._disabled = value;\n this._setupTriggerEventsIfEnabled();\n }\n /**\n * The element that triggers the ripple when click events are received.\n * Defaults to the directive's host element.\n */\n get trigger() {\n return this._trigger || this._elementRef.nativeElement;\n }\n set trigger(trigger) {\n this._trigger = trigger;\n this._setupTriggerEventsIfEnabled();\n }\n ngOnInit() {\n this._isInitialized = true;\n this._setupTriggerEventsIfEnabled();\n }\n ngOnDestroy() {\n this._rippleRenderer._removeTriggerEvents();\n }\n /** Fades out all currently showing ripple elements. */\n fadeOutAll() {\n this._rippleRenderer.fadeOutAll();\n }\n /** Fades out all currently showing non-persistent ripple elements. */\n fadeOutAllNonPersistent() {\n this._rippleRenderer.fadeOutAllNonPersistent();\n }\n /**\n * Ripple configuration from the directive's input values.\n * @docs-private Implemented as part of RippleTarget\n */\n get rippleConfig() {\n return {\n centered: this.centered,\n radius: this.radius,\n color: this.color,\n animation: Object.assign(Object.assign(Object.assign({}, this._globalOptions.animation), (this._animationMode === 'NoopAnimations' ? { enterDuration: 0, exitDuration: 0 } : {})), this.animation),\n terminateOnPointerUp: this._globalOptions.terminateOnPointerUp,\n };\n }\n /**\n * Whether ripples on pointer-down are disabled or not.\n * @docs-private Implemented as part of RippleTarget\n */\n get rippleDisabled() {\n return this.disabled || !!this._globalOptions.disabled;\n }\n /** Sets up the trigger event listeners if ripples are enabled. */\n _setupTriggerEventsIfEnabled() {\n if (!this.disabled && this._isInitialized) {\n this._rippleRenderer.setupTriggerEvents(this.trigger);\n }\n }\n /** Launches a manual ripple at the specified coordinated or just by the ripple config. */\n launch(configOrX, y = 0, config) {\n if (typeof configOrX === 'number') {\n return this._rippleRenderer.fadeInRipple(configOrX, y, Object.assign(Object.assign({}, this.rippleConfig), config));\n }\n else {\n return this._rippleRenderer.fadeInRipple(0, 0, Object.assign(Object.assign({}, this.rippleConfig), configOrX));\n }\n }\n}\nMatRipple.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatRipple, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i1$1.Platform }, { token: MAT_RIPPLE_GLOBAL_OPTIONS, optional: true }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatRipple.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: MatRipple, selector: \"[mat-ripple], [matRipple]\", inputs: { color: [\"matRippleColor\", \"color\"], unbounded: [\"matRippleUnbounded\", \"unbounded\"], centered: [\"matRippleCentered\", \"centered\"], radius: [\"matRippleRadius\", \"radius\"], animation: [\"matRippleAnimation\", \"animation\"], disabled: [\"matRippleDisabled\", \"disabled\"], trigger: [\"matRippleTrigger\", \"trigger\"] }, host: { properties: { \"class.mat-ripple-unbounded\": \"unbounded\" }, classAttribute: \"mat-ripple\" }, exportAs: [\"matRipple\"], ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatRipple, decorators: [{\n type: Directive,\n args: [{\n selector: '[mat-ripple], [matRipple]',\n exportAs: 'matRipple',\n host: {\n 'class': 'mat-ripple',\n '[class.mat-ripple-unbounded]': 'unbounded',\n },\n }]\n }], ctorParameters: function () {\n return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i1$1.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_RIPPLE_GLOBAL_OPTIONS]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }];\n }, propDecorators: { color: [{\n type: Input,\n args: ['matRippleColor']\n }], unbounded: [{\n type: Input,\n args: ['matRippleUnbounded']\n }], centered: [{\n type: Input,\n args: ['matRippleCentered']\n }], radius: [{\n type: Input,\n args: ['matRippleRadius']\n }], animation: [{\n type: Input,\n args: ['matRippleAnimation']\n }], disabled: [{\n type: Input,\n args: ['matRippleDisabled']\n }], trigger: [{\n type: Input,\n args: ['matRippleTrigger']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatRippleModule {\n}\nMatRippleModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatRippleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatRippleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatRippleModule, declarations: [MatRipple], imports: [MatCommonModule], exports: [MatRipple, MatCommonModule] });\nMatRippleModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatRippleModule, imports: [[MatCommonModule], MatCommonModule] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatRippleModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule],\n exports: [MatRipple, MatCommonModule],\n declarations: [MatRipple],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Component that shows a simplified checkbox without including any kind of \"real\" checkbox.\n * Meant to be used when the checkbox is purely decorative and a large number of them will be\n * included, such as for the options in a multi-select. Uses no SVGs or complex animations.\n * Note that theming is meant to be handled by the parent element, e.g.\n * `mat-primary .mat-pseudo-checkbox`.\n *\n * Note that this component will be completely invisible to screen-reader users. This is *not*\n * interchangeable with `` and should *not* be used if the user would directly\n * interact with the checkbox. The pseudo-checkbox should only be used as an implementation detail\n * of more complex components that appropriately handle selected / checked state.\n * @docs-private\n */\nclass MatPseudoCheckbox {\n constructor(_animationMode) {\n this._animationMode = _animationMode;\n /** Display state of the checkbox. */\n this.state = 'unchecked';\n /** Whether the checkbox is disabled. */\n this.disabled = false;\n }\n}\nMatPseudoCheckbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatPseudoCheckbox, deps: [{ token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatPseudoCheckbox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"12.0.0\", version: \"13.3.0\", type: MatPseudoCheckbox, selector: \"mat-pseudo-checkbox\", inputs: { state: \"state\", disabled: \"disabled\" }, host: { properties: { \"class.mat-pseudo-checkbox-indeterminate\": \"state === \\\"indeterminate\\\"\", \"class.mat-pseudo-checkbox-checked\": \"state === \\\"checked\\\"\", \"class.mat-pseudo-checkbox-disabled\": \"disabled\", \"class._mat-animation-noopable\": \"_animationMode === \\\"NoopAnimations\\\"\" }, classAttribute: \"mat-pseudo-checkbox\" }, ngImport: i0, template: '', isInline: true, styles: [\".mat-pseudo-checkbox{width:16px;height:16px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:\\\"\\\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border-color:transparent}._mat-animation-noopable.mat-pseudo-checkbox{transition:none;animation:none}._mat-animation-noopable.mat-pseudo-checkbox::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:5px;left:1px;width:10px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{top:2.4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}\\n\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatPseudoCheckbox, decorators: [{\n type: Component,\n args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'mat-pseudo-checkbox', template: '', host: {\n 'class': 'mat-pseudo-checkbox',\n '[class.mat-pseudo-checkbox-indeterminate]': 'state === \"indeterminate\"',\n '[class.mat-pseudo-checkbox-checked]': 'state === \"checked\"',\n '[class.mat-pseudo-checkbox-disabled]': 'disabled',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n }, styles: [\".mat-pseudo-checkbox{width:16px;height:16px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:\\\"\\\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border-color:transparent}._mat-animation-noopable.mat-pseudo-checkbox{transition:none;animation:none}._mat-animation-noopable.mat-pseudo-checkbox::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:5px;left:1px;width:10px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{top:2.4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}\\n\"] }]\n }], ctorParameters: function () {\n return [{ type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }];\n }, propDecorators: { state: [{\n type: Input\n }], disabled: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatPseudoCheckboxModule {\n}\nMatPseudoCheckboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatPseudoCheckboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatPseudoCheckboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatPseudoCheckboxModule, declarations: [MatPseudoCheckbox], imports: [MatCommonModule], exports: [MatPseudoCheckbox] });\nMatPseudoCheckboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatPseudoCheckboxModule, imports: [[MatCommonModule]] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatPseudoCheckboxModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule],\n exports: [MatPseudoCheckbox],\n declarations: [MatPseudoCheckbox],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Injection token used to provide the parent component to options.\n */\nconst MAT_OPTION_PARENT_COMPONENT = new InjectionToken('MAT_OPTION_PARENT_COMPONENT');\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Notes on the accessibility pattern used for `mat-optgroup`.\n// The option group has two different \"modes\": regular and inert. The regular mode uses the\n// recommended a11y pattern which has `role=\"group\"` on the group element with `aria-labelledby`\n// pointing to the label. This works for `mat-select`, but it seems to hit a bug for autocomplete\n// under VoiceOver where the group doesn't get read out at all. The bug appears to be that if\n// there's __any__ a11y-related attribute on the group (e.g. `role` or `aria-labelledby`),\n// VoiceOver on Safari won't read it out.\n// We've introduced the `inert` mode as a workaround. Under this mode, all a11y attributes are\n// removed from the group, and we get the screen reader to read out the group label by mirroring it\n// inside an invisible element in the option. This is sub-optimal, because the screen reader will\n// repeat the group label on each navigation, whereas the default pattern only reads the group when\n// the user enters a new group. The following alternate approaches were considered:\n// 1. Reading out the group label using the `LiveAnnouncer` solves the problem, but we can't control\n// when the text will be read out so sometimes it comes in too late or never if the user\n// navigates quickly.\n// 2. `{{ label }} \\n\\n\", styles: [\".mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;-webkit-user-select:none;user-select:none;cursor:default}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px;vertical-align:middle}.mat-optgroup-label .mat-icon svg{vertical-align:top}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}\\n\"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatOptgroup, decorators: [{\n type: Component,\n args: [{ selector: 'mat-optgroup', exportAs: 'matOptgroup', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, inputs: ['disabled'], host: {\n 'class': 'mat-optgroup',\n '[attr.role]': '_inert ? null : \"group\"',\n '[attr.aria-disabled]': '_inert ? null : disabled.toString()',\n '[attr.aria-labelledby]': '_inert ? null : _labelId',\n '[class.mat-optgroup-disabled]': 'disabled',\n }, providers: [{ provide: MAT_OPTGROUP, useExisting: MatOptgroup }], template: \"{{ label }} \\n\\n\", styles: [\".mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;-webkit-user-select:none;user-select:none;cursor:default}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px;vertical-align:middle}.mat-optgroup-label .mat-icon svg{vertical-align:top}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}\\n\"] }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n/** Event object emitted by MatOption when selected or deselected. */\nclass MatOptionSelectionChange {\n constructor(\n /** Reference to the option that emitted the event. */\n source, \n /** Whether the change in the option's value was a result of a user action. */\n isUserInput = false) {\n this.source = source;\n this.isUserInput = isUserInput;\n }\n}\nclass _MatOptionBase {\n constructor(_element, _changeDetectorRef, _parent, group) {\n this._element = _element;\n this._changeDetectorRef = _changeDetectorRef;\n this._parent = _parent;\n this.group = group;\n this._selected = false;\n this._active = false;\n this._disabled = false;\n this._mostRecentViewValue = '';\n /** The unique ID of the option. */\n this.id = `mat-option-${_uniqueIdCounter++}`;\n /** Event emitted when the option is selected or deselected. */\n // tslint:disable-next-line:no-output-on-prefix\n this.onSelectionChange = new EventEmitter();\n /** Emits when the state of the option changes and any parents have to be notified. */\n this._stateChanges = new Subject();\n }\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() {\n return this._parent && this._parent.multiple;\n }\n /** Whether or not the option is currently selected. */\n get selected() {\n return this._selected;\n }\n /** Whether the option is disabled. */\n get disabled() {\n return (this.group && this.group.disabled) || this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n }\n /** Whether ripples for the option are disabled. */\n get disableRipple() {\n return !!(this._parent && this._parent.disableRipple);\n }\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active() {\n return this._active;\n }\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValue() {\n // TODO(kara): Add input property alternative for node envs.\n return (this._getHostElement().textContent || '').trim();\n }\n /** Selects the option. */\n select() {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n /** Deselects the option. */\n deselect() {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n /** Sets focus onto this option. */\n focus(_origin, options) {\n // Note that we aren't using `_origin`, but we need to keep it because some internal consumers\n // use `MatOption` in a `FocusKeyManager` and we need it to match `FocusableOption`.\n const element = this._getHostElement();\n if (typeof element.focus === 'function') {\n element.focus(options);\n }\n }\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles() {\n if (!this._active) {\n this._active = true;\n this._changeDetectorRef.markForCheck();\n }\n }\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles() {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel() {\n return this.viewValue;\n }\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event) {\n if ((event.keyCode === ENTER || event.keyCode === SPACE) && !hasModifierKey(event)) {\n this._selectViaInteraction();\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\n }\n /**\n * `Selects the option while indicating the selection came from the user. Used to\n * determine if the select's view -> model callback should be invoked.`\n */\n _selectViaInteraction() {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n /**\n * Gets the `aria-selected` value for the option. We explicitly omit the `aria-selected`\n * attribute from single-selection, unselected options. Including the `aria-selected=\"false\"`\n * attributes adds a significant amount of noise to screen-reader users without providing useful\n * information.\n */\n _getAriaSelected() {\n return this.selected || (this.multiple ? false : null);\n }\n /** Returns the correct tabindex for the option depending on disabled state. */\n _getTabIndex() {\n return this.disabled ? '-1' : '0';\n }\n /** Gets the host DOM element. */\n _getHostElement() {\n return this._element.nativeElement;\n }\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `mat-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n if (viewValue !== this._mostRecentViewValue) {\n this._mostRecentViewValue = viewValue;\n this._stateChanges.next();\n }\n }\n }\n ngOnDestroy() {\n this._stateChanges.complete();\n }\n /** Emits the selection change event. */\n _emitSelectionChangeEvent(isUserInput = false) {\n this.onSelectionChange.emit(new MatOptionSelectionChange(this, isUserInput));\n }\n}\n_MatOptionBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: _MatOptionBase, deps: \"invalid\", target: i0.ɵɵFactoryTarget.Directive });\n_MatOptionBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"12.0.0\", version: \"13.3.0\", type: _MatOptionBase, inputs: { value: \"value\", id: \"id\", disabled: \"disabled\" }, outputs: { onSelectionChange: \"onSelectionChange\" }, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: _MatOptionBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined }, { type: _MatOptgroupBase }]; }, propDecorators: { value: [{\n type: Input\n }], id: [{\n type: Input\n }], disabled: [{\n type: Input\n }], onSelectionChange: [{\n type: Output\n }] } });\n/**\n * Single option inside of a `` element.\n */\nclass MatOption extends _MatOptionBase {\n constructor(element, changeDetectorRef, parent, group) {\n super(element, changeDetectorRef, parent, group);\n }\n}\nMatOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatOption, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: MAT_OPTION_PARENT_COMPONENT, optional: true }, { token: MAT_OPTGROUP, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatOption.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"12.0.0\", version: \"13.3.0\", type: MatOption, selector: \"mat-option\", host: { attributes: { \"role\": \"option\" }, listeners: { \"click\": \"_selectViaInteraction()\", \"keydown\": \"_handleKeydown($event)\" }, properties: { \"attr.tabindex\": \"_getTabIndex()\", \"class.mat-selected\": \"selected\", \"class.mat-option-multiple\": \"multiple\", \"class.mat-active\": \"active\", \"id\": \"id\", \"attr.aria-selected\": \"_getAriaSelected()\", \"attr.aria-disabled\": \"disabled.toString()\", \"class.mat-option-disabled\": \"disabled\" }, classAttribute: \"mat-option mat-focus-indicator\" }, exportAs: [\"matOption\"], usesInheritance: true, ngImport: i0, template: \"\\n\\n\\n\\n\\n({{ group.label }})\\n\\n
\\n
\\n\", styles: [\".mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative;cursor:pointer;outline:none;display:flex;flex-direction:row;max-width:100%;box-sizing:border-box;align-items:center;-webkit-tap-highlight-color:transparent}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px;vertical-align:middle}.mat-option .mat-icon svg{vertical-align:top}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.cdk-high-contrast-active .mat-option{margin:0 1px}.cdk-high-contrast-active .mat-option.mat-active{border:solid 1px currentColor;margin:0}.cdk-high-contrast-active .mat-option[aria-disabled=true]{opacity:.5}.mat-option-text{display:inline-block;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option .mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}\\n\"], components: [{ type: MatPseudoCheckbox, selector: \"mat-pseudo-checkbox\", inputs: [\"state\", \"disabled\"] }], directives: [{ type: i3.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { type: MatRipple, selector: \"[mat-ripple], [matRipple]\", inputs: [\"matRippleColor\", \"matRippleUnbounded\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\", \"matRippleDisabled\", \"matRippleTrigger\"], exportAs: [\"matRipple\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatOption, decorators: [{\n type: Component,\n args: [{ selector: 'mat-option', exportAs: 'matOption', host: {\n 'role': 'option',\n '[attr.tabindex]': '_getTabIndex()',\n '[class.mat-selected]': 'selected',\n '[class.mat-option-multiple]': 'multiple',\n '[class.mat-active]': 'active',\n '[id]': 'id',\n '[attr.aria-selected]': '_getAriaSelected()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class.mat-option-disabled]': 'disabled',\n '(click)': '_selectViaInteraction()',\n '(keydown)': '_handleKeydown($event)',\n 'class': 'mat-option mat-focus-indicator',\n }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n\\n\\n\\n\\n({{ group.label }})\\n\\n
\\n
\\n\", styles: [\".mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative;cursor:pointer;outline:none;display:flex;flex-direction:row;max-width:100%;box-sizing:border-box;align-items:center;-webkit-tap-highlight-color:transparent}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px;vertical-align:middle}.mat-option .mat-icon svg{vertical-align:top}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.cdk-high-contrast-active .mat-option{margin:0 1px}.cdk-high-contrast-active .mat-option.mat-active{border:solid 1px currentColor;margin:0}.cdk-high-contrast-active .mat-option[aria-disabled=true]{opacity:.5}.mat-option-text{display:inline-block;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option .mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}\\n\"] }]\n }], ctorParameters: function () {\n return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_OPTION_PARENT_COMPONENT]\n }] }, { type: MatOptgroup, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_OPTGROUP]\n }] }];\n } });\n/**\n * Counts the amount of option group labels that precede the specified option.\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nfunction _countGroupLabelsBeforeOption(optionIndex, options, optionGroups) {\n if (optionGroups.length) {\n let optionsArray = options.toArray();\n let groups = optionGroups.toArray();\n let groupCounter = 0;\n for (let i = 0; i < optionIndex + 1; i++) {\n if (optionsArray[i].group && optionsArray[i].group === groups[groupCounter]) {\n groupCounter++;\n }\n }\n return groupCounter;\n }\n return 0;\n}\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n * @param optionOffset Offset of the option from the top of the panel.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nfunction _getOptionScrollPosition(optionOffset, optionHeight, currentScrollPosition, panelHeight) {\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n return currentScrollPosition;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatOptionModule {\n}\nMatOptionModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatOptionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\nMatOptionModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatOptionModule, declarations: [MatOption, MatOptgroup], imports: [MatRippleModule, CommonModule, MatCommonModule, MatPseudoCheckboxModule], exports: [MatOption, MatOptgroup] });\nMatOptionModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatOptionModule, imports: [[MatRippleModule, CommonModule, MatCommonModule, MatPseudoCheckboxModule]] });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"13.3.0\", ngImport: i0, type: MatOptionModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [MatRippleModule, CommonModule, MatCommonModule, MatPseudoCheckboxModule],\n exports: [MatOption, MatOptgroup],\n declarations: [MatOption, MatOptgroup],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AnimationCurves, AnimationDurations, DateAdapter, ErrorStateMatcher, MATERIAL_SANITY_CHECKS, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MAT_DATE_LOCALE_FACTORY, MAT_NATIVE_DATE_FORMATS, MAT_OPTGROUP, MAT_OPTION_PARENT_COMPONENT, MAT_RIPPLE_GLOBAL_OPTIONS, MatCommonModule, MatLine, MatLineModule, MatNativeDateModule, MatOptgroup, MatOption, MatOptionModule, MatOptionSelectionChange, MatPseudoCheckbox, MatPseudoCheckboxModule, MatRipple, MatRippleModule, NativeDateAdapter, NativeDateModule, RippleRef, RippleRenderer, ShowOnDirtyErrorStateMatcher, VERSION, _MatOptgroupBase, _MatOptionBase, _countGroupLabelsBeforeOption, _getOptionScrollPosition, defaultRippleAnimationConfig, mixinColor, mixinDisableRipple, mixinDisabled, mixinErrorState, mixinInitialized, mixinTabIndex, setLines };\n"]}