{"version":3,"sources":["node_modules/.pnpm/@angular+material-luxon-adapter@19.2.2_e3776d773b0cfe99c5ab30df924079bb/node_modules/@angular/material-luxon-adapter/fesm2022/material-luxon-adapter.mjs","node_modules/.pnpm/@angular+material@19.2.2_@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2._1ec6132a15a9a9d16e816a43fc7e352b/node_modules/@angular/material/fesm2022/button-toggle.mjs","node_modules/.pnpm/@angular+material@19.2.2_@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2._1ec6132a15a9a9d16e816a43fc7e352b/node_modules/@angular/material/fesm2022/checkbox.mjs","node_modules/.pnpm/@angular+material@19.2.2_@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2._1ec6132a15a9a9d16e816a43fc7e352b/node_modules/@angular/material/fesm2022/chips.mjs","node_modules/.pnpm/@angular+material@19.2.2_@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2._1ec6132a15a9a9d16e816a43fc7e352b/node_modules/@angular/material/fesm2022/divider.mjs","node_modules/.pnpm/@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2.1_rxjs@7.8.2_zone.js@0.15_b2427304c21b4e8e11e32c9e1280dd2b/node_modules/@angular/cdk/fesm2022/accordion.mjs","node_modules/.pnpm/@angular+material@19.2.2_@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2._1ec6132a15a9a9d16e816a43fc7e352b/node_modules/@angular/material/fesm2022/expansion.mjs","node_modules/.pnpm/@angular+material@19.2.2_@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2._1ec6132a15a9a9d16e816a43fc7e352b/node_modules/@angular/material/fesm2022/list.mjs","node_modules/.pnpm/@angular+material@19.2.2_@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2._1ec6132a15a9a9d16e816a43fc7e352b/node_modules/@angular/material/fesm2022/paginator.mjs","node_modules/.pnpm/@angular+material@19.2.2_@angular+cdk@19.2.2_@angular+common@19.2.1_@angular+core@19.2._1ec6132a15a9a9d16e816a43fc7e352b/node_modules/@angular/material/fesm2022/sidenav.mjs","src/app/app-material.module.ts","node_modules/.pnpm/ngx-infinite-scroll@19.0.0_@angular+common@19.2.1_@angular+core@19.2.1_rxjs@7.8.2_zone._d49d4e0d164ae4e3e248196c447d958d/node_modules/ngx-infinite-scroll/fesm2022/ngx-infinite-scroll.mjs","node_modules/.pnpm/@ctrl+ngx-emoji-mart@9.2.0_@angular+core@19.2.1_rxjs@7.8.2_zone.js@0.15.0_/node_modules/@ctrl/ngx-emoji-mart/fesm2022/ctrl-ngx-emoji-mart-ngx-emoji.mjs","node_modules/.pnpm/@ctrl+ngx-emoji-mart@9.2.0_@angular+core@19.2.1_rxjs@7.8.2_zone.js@0.15.0_/node_modules/@ctrl/ngx-emoji-mart/fesm2022/ctrl-ngx-emoji-mart.mjs","src/app/shared/about/about.component.ts","src/app/shared/about/about.component.html","src/app/shared/chip/chip.component.ts","src/app/shared/chip/chip.component.html","src/app/shared/send-invitation-modal/send-invitation-modal.component.ts","src/app/shared/send-invitation-modal/send-invitation-modal.component.html","src/app/shared/add-new-match/load-saved-match/load-saved-match.component.ts","src/app/shared/add-new-match/load-saved-match/load-saved-match.component.html","src/app/shared/add-new-match/new-match-players-mode/new-match-players-mode.component.ts","src/app/shared/add-new-match/new-match-players-mode/new-match-players-mode.component.html","src/app/shared/add-new-match/score-utils.ts","src/app/shared/add-new-match/match-score/match-score.component.ts","src/app/shared/add-new-match/match-score/match-score.component.html","src/app/shared/directives/fit-text.directive.ts","src/app/shared/add-new-match/match-course/match-course.component.ts","src/app/shared/add-new-match/match-course/match-course.component.html","src/app/shared/add-new-match/start-match-set/start-match-set.component.ts","src/app/shared/add-new-match/start-match-set/start-match-set.component.html","src/app/shared/add-new-match/add-new-match.component.ts","src/app/shared/add-new-match/add-new-match.component.html","src/app/shared/alerts/allow-push-notifications/allow-push-notifications.component.ts","src/app/shared/alerts/allow-push-notifications/allow-push-notifications.component.html","src/app/shared/alerts/update-in-progress-alert/update-in-progress-alert.component.ts","src/app/shared/alerts/update-in-progress-alert/update-in-progress-alert.component.html","src/app/shared/api-error-modal/api-error-modal.component.ts","src/app/shared/api-error-modal/api-error-modal.component.html","src/app/shared/bottom-menu-bar/bottom-menu-bar.component.ts","src/app/shared/bottom-menu-bar/bottom-menu-bar.component.html","src/app/shared/confirm-dialog/confirm-dialog.component.ts","src/app/shared/confirm-dialog/confirm-dialog.component.html","src/app/shared/loading-panel/loading-panel.component.ts","src/app/shared/loading-panel/loading-panel.component.html","src/app/shared/giph-modal/giph-modal.component.ts","src/app/shared/giph-modal/giph-modal.component.html","src/app/shared/match-box/comment-attachment/comment-attachment.component.ts","src/app/shared/match-box/comment-attachment/comment-attachment.component.html","src/app/shared/match-box/uploading-comment-attachment/uploading-comment-attachment.component.ts","src/app/shared/match-box/uploading-comment-attachment/uploading-comment-attachment.component.html","src/app/shared/match-box/upsert-comment/upsert-comment.component.ts","src/app/shared/match-box/upsert-comment/upsert-comment.component.html","src/app/shared/pipes/preserve-newline.pipe.ts","src/app/shared/match-box/comment/comment.component.ts","src/app/shared/match-box/comment/comment.component.html","src/app/shared/pipes/trophy-path.pipe.ts","src/app/shared/match-box/match-box-achievements/match-box-achievements.component.ts","src/app/shared/match-box/match-box-achievements/match-box-achievements.component.html","src/app/shared/match-box/match-box-elo-points/match-box-elo-points.component.ts","src/app/shared/match-box/match-box-elo-points/match-box-elo-points.component.html","src/app/shared/match-box/match-box-goals/match-box-goals.component.ts","src/app/shared/match-box/match-box-goals/match-box-goals.component.html","src/app/shared/match-box/match-box-header-one-against-one/match-box-header-one-against-one.component.ts","src/app/shared/match-box/match-box-header-one-against-one/match-box-header-one-against-one.component.html","src/app/shared/match-box/match-box-header-two-against-two/match-box-header-two-against-two.component.ts","src/app/shared/match-box/match-box-header-two-against-two/match-box-header-two-against-two.component.html","src/app/shared/match-box/match-box.component.ts","src/app/shared/match-box/match-box.component.html","src/app/shared/ongoing-match-box/ongoing-match-box-goals/ongoing-match-box-goals.component.ts","src/app/shared/ongoing-match-box/ongoing-match-box-goals/ongoing-match-box-goals.component.html","src/app/shared/ongoing-match-box/ongoing-match-box.component.ts","src/app/shared/ongoing-match-box/ongoing-match-box.component.html","src/app/shared/pipes/badge-number.pipe.ts","src/app/shared/season-select/season-select.component.ts","src/app/shared/season-select/season-select.component.html","src/app/shared/sidebar/match-invitation-card/match-invitation-add-comment/match-invitation-add-comment.component.ts","src/app/shared/sidebar/match-invitation-card/match-invitation-add-comment/match-invitation-add-comment.component.html","src/app/shared/sidebar/match-invitation-card/match-invitation-comment/match-invitation-comment.component.ts","src/app/shared/sidebar/match-invitation-card/match-invitation-comment/match-invitation-comment.component.html","src/app/shared/sidebar/match-invitation-card/match-invitation-card.component.ts","src/app/shared/sidebar/match-invitation-card/match-invitation-card.component.html","src/app/shared/sidebar/notification-card/notification-card.component.ts","src/app/shared/sidebar/notification-card/notification-card.component.html","src/app/shared/sidebar/sidebar.component.ts","src/app/shared/sidebar/sidebar.component.html","src/app/shared/switch-team-modal/switch-team-modal.component.ts","src/app/shared/switch-team-modal/switch-team-modal.component.html","src/app/shared/topbar/topbar.component.ts","src/app/shared/topbar/topbar.component.html","src/app/shared/shared.module.ts"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { InjectionToken, inject, Injectable, NgModule } from '@angular/core';\nimport { DateAdapter, MAT_DATE_LOCALE, MAT_DATE_FORMATS } from '@angular/material/core';\nimport { DateTime, Info } from 'luxon';\n\n/** InjectionToken for LuxonDateAdapter to configure options. */\nconst MAT_LUXON_DATE_ADAPTER_OPTIONS = /*#__PURE__*/new InjectionToken('MAT_LUXON_DATE_ADAPTER_OPTIONS', {\n providedIn: 'root',\n factory: MAT_LUXON_DATE_ADAPTER_OPTIONS_FACTORY\n});\n/** @docs-private */\nfunction MAT_LUXON_DATE_ADAPTER_OPTIONS_FACTORY() {\n return {\n useUtc: false,\n defaultOutputCalendar: 'gregory'\n };\n}\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 Luxon Dates for use with Angular Material. */\nlet LuxonDateAdapter = /*#__PURE__*/(() => {\n class LuxonDateAdapter extends DateAdapter {\n _useUTC;\n _firstDayOfWeek;\n _defaultOutputCalendar;\n constructor() {\n super();\n const dateLocale = inject(MAT_DATE_LOCALE, {\n optional: true\n });\n const options = inject(MAT_LUXON_DATE_ADAPTER_OPTIONS, {\n optional: true\n });\n this._useUTC = !!options?.useUtc;\n this._firstDayOfWeek = options?.firstDayOfWeek;\n this._defaultOutputCalendar = options?.defaultOutputCalendar || 'gregory';\n this.setLocale(dateLocale || DateTime.local().locale);\n }\n getYear(date) {\n return date.year;\n }\n getMonth(date) {\n // Luxon works with 1-indexed months whereas our code expects 0-indexed.\n return date.month - 1;\n }\n getDate(date) {\n return date.day;\n }\n getDayOfWeek(date) {\n return date.weekday;\n }\n getMonthNames(style) {\n // Adding outputCalendar option, because LuxonInfo doesn't get effected by LuxonSettings\n return Info.months(style, {\n locale: this.locale,\n outputCalendar: this._defaultOutputCalendar\n });\n }\n getDateNames() {\n // At the time of writing, Luxon doesn't offer similar\n // functionality so we have to fall back to the Intl API.\n const dtf = new Intl.DateTimeFormat(this.locale, {\n day: 'numeric',\n timeZone: 'utc'\n });\n // Format a UTC date in order to avoid DST issues.\n return range(31, i => dtf.format(DateTime.utc(2017, 1, i + 1).toJSDate()));\n }\n getDayOfWeekNames(style) {\n // Note that we shift the array once, because Luxon returns Monday as the\n // first day of the week, whereas our logic assumes that it's Sunday. See:\n // https://moment.github.io/luxon/api-docs/index.html#infoweekdays\n const days = Info.weekdays(style, {\n locale: this.locale\n });\n days.unshift(days.pop());\n return days;\n }\n getYearName(date) {\n return date.toFormat('yyyy', this._getOptions());\n }\n getFirstDayOfWeek() {\n return this._firstDayOfWeek ?? Info.getStartOfWeek({\n locale: this.locale\n });\n }\n getNumDaysInMonth(date) {\n return date.daysInMonth;\n }\n clone(date) {\n return DateTime.fromObject(date.toObject(), this._getOptions());\n }\n createDate(year, month, date) {\n const options = this._getOptions();\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 // Luxon uses 1-indexed months so we need to add one to the month.\n const result = this._useUTC ? DateTime.utc(year, month + 1, date, options) : DateTime.local(year, month + 1, date, options);\n if (!this.isValid(result)) {\n throw Error(`Invalid date \"${date}\". Reason: \"${result.invalidReason}\".`);\n }\n return result;\n }\n today() {\n const options = this._getOptions();\n return this._useUTC ? DateTime.utc(options) : DateTime.local(options);\n }\n parse(value, parseFormat) {\n const options = this._getOptions();\n if (typeof value == 'string' && value.length > 0) {\n const iso8601Date = DateTime.fromISO(value, options);\n if (this.isValid(iso8601Date)) {\n return iso8601Date;\n }\n const formats = Array.isArray(parseFormat) ? parseFormat : [parseFormat];\n if (!parseFormat.length) {\n throw Error('Formats array must not be empty.');\n }\n for (const format of formats) {\n const fromFormat = DateTime.fromFormat(value, format, options);\n if (this.isValid(fromFormat)) {\n return fromFormat;\n }\n }\n return this.invalid();\n } else if (typeof value === 'number') {\n return DateTime.fromMillis(value, options);\n } else if (value instanceof Date) {\n return DateTime.fromJSDate(value, options);\n } else if (value instanceof DateTime) {\n return DateTime.fromMillis(value.toMillis(), options);\n }\n return null;\n }\n format(date, displayFormat) {\n if (!this.isValid(date)) {\n throw Error('LuxonDateAdapter: Cannot format invalid date.');\n }\n if (this._useUTC) {\n return date.setLocale(this.locale).setZone('utc').toFormat(displayFormat);\n } else {\n return date.setLocale(this.locale).toFormat(displayFormat);\n }\n }\n addCalendarYears(date, years) {\n return date.reconfigure(this._getOptions()).plus({\n years\n });\n }\n addCalendarMonths(date, months) {\n return date.reconfigure(this._getOptions()).plus({\n months\n });\n }\n addCalendarDays(date, days) {\n return date.reconfigure(this._getOptions()).plus({\n days\n });\n }\n toIso8601(date) {\n return date.toISO();\n }\n /**\n * Returns the given value if given a valid Luxon or null. Deserializes valid ISO 8601 strings\n * (https://www.ietf.org/rfc/rfc3339.txt) and valid Date objects into valid DateTime and empty\n * string into null. Returns an invalid date for all other values.\n */\n deserialize(value) {\n const options = this._getOptions();\n let date;\n if (value instanceof Date) {\n date = DateTime.fromJSDate(value, options);\n }\n if (typeof value === 'string') {\n if (!value) {\n return null;\n }\n date = DateTime.fromISO(value, options);\n }\n if (date && this.isValid(date)) {\n return date;\n }\n return super.deserialize(value);\n }\n isDateInstance(obj) {\n return obj instanceof DateTime;\n }\n isValid(date) {\n return date.isValid;\n }\n invalid() {\n return DateTime.invalid('Invalid Luxon DateTime object.');\n }\n setTime(target, hours, minutes, seconds) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (hours < 0 || hours > 23) {\n throw Error(`Invalid hours \"${hours}\". Hours value must be between 0 and 23.`);\n }\n if (minutes < 0 || minutes > 59) {\n throw Error(`Invalid minutes \"${minutes}\". Minutes value must be between 0 and 59.`);\n }\n if (seconds < 0 || seconds > 59) {\n throw Error(`Invalid seconds \"${seconds}\". Seconds value must be between 0 and 59.`);\n }\n }\n return this.clone(target).set({\n hour: hours,\n minute: minutes,\n second: seconds,\n millisecond: 0\n });\n }\n getHours(date) {\n return date.hour;\n }\n getMinutes(date) {\n return date.minute;\n }\n getSeconds(date) {\n return date.second;\n }\n parseTime(value, parseFormat) {\n const result = this.parse(value, parseFormat);\n if ((!result || !this.isValid(result)) && typeof value === 'string') {\n // It seems like Luxon doesn't work well cross-browser for strings that have\n // additional characters around the time. Try parsing without those characters.\n return this.parse(value.replace(/[^0-9:(AM|PM)]/gi, ''), parseFormat) || result;\n }\n return result;\n }\n addSeconds(date, amount) {\n return date.reconfigure(this._getOptions()).plus({\n seconds: amount\n });\n }\n /** Gets the options that should be used when constructing a new `DateTime` object. */\n _getOptions() {\n return {\n zone: this._useUTC ? 'utc' : undefined,\n locale: this.locale,\n outputCalendar: this._defaultOutputCalendar\n };\n }\n static ɵfac = function LuxonDateAdapter_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || LuxonDateAdapter)();\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: LuxonDateAdapter,\n factory: LuxonDateAdapter.ɵfac\n });\n }\n return LuxonDateAdapter;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst MAT_LUXON_DATE_FORMATS = {\n parse: {\n dateInput: 'D',\n timeInput: 't'\n },\n display: {\n dateInput: 'D',\n timeInput: 't',\n monthYearLabel: 'LLL yyyy',\n dateA11yLabel: 'DD',\n monthYearA11yLabel: 'LLLL yyyy',\n timeOptionLabel: 't'\n }\n};\nlet LuxonDateModule = /*#__PURE__*/(() => {\n class LuxonDateModule {\n static ɵfac = function LuxonDateModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || LuxonDateModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: LuxonDateModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [{\n provide: DateAdapter,\n useClass: LuxonDateAdapter,\n deps: [MAT_DATE_LOCALE, MAT_LUXON_DATE_ADAPTER_OPTIONS]\n }]\n });\n }\n return LuxonDateModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatLuxonDateModule = /*#__PURE__*/(() => {\n class MatLuxonDateModule {\n static ɵfac = function MatLuxonDateModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatLuxonDateModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatLuxonDateModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [provideLuxonDateAdapter()]\n });\n }\n return MatLuxonDateModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction provideLuxonDateAdapter(formats = MAT_LUXON_DATE_FORMATS) {\n return [{\n provide: DateAdapter,\n useClass: LuxonDateAdapter,\n deps: [MAT_DATE_LOCALE, MAT_LUXON_DATE_ADAPTER_OPTIONS]\n }, {\n provide: MAT_DATE_FORMATS,\n useValue: formats\n }];\n}\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { LuxonDateAdapter, LuxonDateModule, MAT_LUXON_DATE_ADAPTER_OPTIONS, MAT_LUXON_DATE_ADAPTER_OPTIONS_FACTORY, MAT_LUXON_DATE_FORMATS, MatLuxonDateModule, provideLuxonDateAdapter };\n","import { _IdGenerator, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { RIGHT_ARROW, DOWN_ARROW, LEFT_ARROW, UP_ARROW, ENTER, SPACE } from '@angular/cdk/keycodes';\nimport { _CdkPrivateStyleLoader } from '@angular/cdk/private';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, forwardRef, inject, ChangeDetectorRef, EventEmitter, booleanAttribute, Directive, ContentChildren, Input, Output, ElementRef, ANIMATION_MODULE_TYPE, HostAttributeToken, Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, NgModule } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { _StructuralStylesLoader, MatRipple, MatPseudoCheckbox, MatCommonModule, MatRippleModule } from '@angular/material/core';\n\n/**\n * Injection token that can be used to configure the\n * default options for all button toggles within an app.\n */\nconst _c0 = [\"button\"];\nconst _c1 = [\"*\"];\nfunction MatButtonToggle_Conditional_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 2);\n i0.ɵɵelement(1, \"mat-pseudo-checkbox\", 6);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"disabled\", ctx_r1.disabled);\n }\n}\nconst MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS = /*#__PURE__*/new InjectionToken('MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS', {\n providedIn: 'root',\n factory: MAT_BUTTON_TOGGLE_GROUP_DEFAULT_OPTIONS_FACTORY\n});\nfunction MAT_BUTTON_TOGGLE_GROUP_DEFAULT_OPTIONS_FACTORY() {\n return {\n hideSingleSelectionIndicator: false,\n hideMultipleSelectionIndicator: false,\n disabledInteractive: false\n };\n}\n/**\n * Injection token that can be used to reference instances of `MatButtonToggleGroup`.\n * It serves as alternative token to the actual `MatButtonToggleGroup` class which\n * could cause unnecessary retention of the class and its component metadata.\n */\nconst MAT_BUTTON_TOGGLE_GROUP = /*#__PURE__*/new InjectionToken('MatButtonToggleGroup');\n/**\n * Provider Expression that allows mat-button-toggle-group to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)].\n * @docs-private\n */\nconst MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: /*#__PURE__*/forwardRef(() => MatButtonToggleGroup),\n multi: true\n};\n/** Change event object emitted by button toggle. */\nclass MatButtonToggleChange {\n source;\n value;\n constructor(/** The button toggle that emits the event. */\n source, /** The value assigned to the button toggle. */\n value) {\n this.source = source;\n this.value = value;\n }\n}\n/** Exclusive selection button toggle group that behaves like a radio-button group. */\nlet MatButtonToggleGroup = /*#__PURE__*/(() => {\n class MatButtonToggleGroup {\n _changeDetector = inject(ChangeDetectorRef);\n _dir = inject(Directionality, {\n optional: true\n });\n _multiple = false;\n _disabled = false;\n _disabledInteractive = false;\n _selectionModel;\n /**\n * Reference to the raw value that the consumer tried to assign. The real\n * value will exclude any values from this one that don't correspond to a\n * toggle. Useful for the cases where the value is assigned before the toggles\n * have been initialized or at the same that they're being swapped out.\n */\n _rawValue;\n /**\n * The method to be called in order to update ngModel.\n * Now `ngModel` binding is not supported in multiple selection mode.\n */\n _controlValueAccessorChangeFn = () => {};\n /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n _onTouched = () => {};\n /** Child button toggle buttons. */\n _buttonToggles;\n /** The appearance for all the buttons in the group. */\n appearance;\n /** `name` attribute for the underlying `input` element. */\n get name() {\n return this._name;\n }\n set name(value) {\n this._name = value;\n this._markButtonsForCheck();\n }\n _name = inject(_IdGenerator).getId('mat-button-toggle-group-');\n /** Whether the toggle group is vertical. */\n vertical;\n /** Value of the toggle group. */\n get value() {\n const selected = this._selectionModel ? this._selectionModel.selected : [];\n if (this.multiple) {\n return selected.map(toggle => toggle.value);\n }\n return selected[0] ? selected[0].value : undefined;\n }\n set value(newValue) {\n this._setSelectionByValue(newValue);\n this.valueChange.emit(this.value);\n }\n /**\n * Event that emits whenever the value of the group changes.\n * Used to facilitate two-way data binding.\n * @docs-private\n */\n valueChange = new EventEmitter();\n /** Selected button toggles in the group. */\n get selected() {\n const selected = this._selectionModel ? this._selectionModel.selected : [];\n return this.multiple ? selected : selected[0] || null;\n }\n /** Whether multiple button toggles can be selected. */\n get multiple() {\n return this._multiple;\n }\n set multiple(value) {\n this._multiple = value;\n this._markButtonsForCheck();\n }\n /** Whether multiple button toggle group is disabled. */\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = value;\n this._markButtonsForCheck();\n }\n /** Whether buttons in the group should be interactive while they're disabled. */\n get disabledInteractive() {\n return this._disabledInteractive;\n }\n set disabledInteractive(value) {\n this._disabledInteractive = value;\n this._markButtonsForCheck();\n }\n /** The layout direction of the toggle button group. */\n get dir() {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n /** Event emitted when the group's value changes. */\n change = new EventEmitter();\n /** Whether checkmark indicator for single-selection button toggle groups is hidden. */\n get hideSingleSelectionIndicator() {\n return this._hideSingleSelectionIndicator;\n }\n set hideSingleSelectionIndicator(value) {\n this._hideSingleSelectionIndicator = value;\n this._markButtonsForCheck();\n }\n _hideSingleSelectionIndicator;\n /** Whether checkmark indicator for multiple-selection button toggle groups is hidden. */\n get hideMultipleSelectionIndicator() {\n return this._hideMultipleSelectionIndicator;\n }\n set hideMultipleSelectionIndicator(value) {\n this._hideMultipleSelectionIndicator = value;\n this._markButtonsForCheck();\n }\n _hideMultipleSelectionIndicator;\n constructor() {\n const defaultOptions = inject(MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS, {\n optional: true\n });\n this.appearance = defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';\n this.hideSingleSelectionIndicator = defaultOptions?.hideSingleSelectionIndicator ?? false;\n this.hideMultipleSelectionIndicator = defaultOptions?.hideMultipleSelectionIndicator ?? false;\n }\n ngOnInit() {\n this._selectionModel = new SelectionModel(this.multiple, undefined, false);\n }\n ngAfterContentInit() {\n this._selectionModel.select(...this._buttonToggles.filter(toggle => toggle.checked));\n if (!this.multiple) {\n this._initializeTabIndex();\n }\n }\n /**\n * Sets the model value. Implemented as part of ControlValueAccessor.\n * @param value Value to be set to the model.\n */\n writeValue(value) {\n this.value = value;\n this._changeDetector.markForCheck();\n }\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn) {\n this._controlValueAccessorChangeFn = fn;\n }\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn) {\n this._onTouched = fn;\n }\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n }\n /** Handle keydown event calling to single-select button toggle. */\n _keydown(event) {\n if (this.multiple || this.disabled) {\n return;\n }\n const target = event.target;\n const buttonId = target.id;\n const index = this._buttonToggles.toArray().findIndex(toggle => {\n return toggle.buttonId === buttonId;\n });\n let nextButton = null;\n switch (event.keyCode) {\n case SPACE:\n case ENTER:\n nextButton = this._buttonToggles.get(index) || null;\n break;\n case UP_ARROW:\n nextButton = this._getNextButton(index, -1);\n break;\n case LEFT_ARROW:\n nextButton = this._getNextButton(index, this.dir === 'ltr' ? -1 : 1);\n break;\n case DOWN_ARROW:\n nextButton = this._getNextButton(index, 1);\n break;\n case RIGHT_ARROW:\n nextButton = this._getNextButton(index, this.dir === 'ltr' ? 1 : -1);\n break;\n default:\n return;\n }\n if (nextButton) {\n event.preventDefault();\n nextButton._onButtonClick();\n nextButton.focus();\n }\n }\n /** Dispatch change event with current selection and group value. */\n _emitChangeEvent(toggle) {\n const event = new MatButtonToggleChange(toggle, this.value);\n this._rawValue = event.value;\n this._controlValueAccessorChangeFn(event.value);\n this.change.emit(event);\n }\n /**\n * Syncs a button toggle's selected state with the model value.\n * @param toggle Toggle to be synced.\n * @param select Whether the toggle should be selected.\n * @param isUserInput Whether the change was a result of a user interaction.\n * @param deferEvents Whether to defer emitting the change events.\n */\n _syncButtonToggle(toggle, select, isUserInput = false, deferEvents = false) {\n // Deselect the currently-selected toggle, if we're in single-selection\n // mode and the button being toggled isn't selected at the moment.\n if (!this.multiple && this.selected && !toggle.checked) {\n this.selected.checked = false;\n }\n if (this._selectionModel) {\n if (select) {\n this._selectionModel.select(toggle);\n } else {\n this._selectionModel.deselect(toggle);\n }\n } else {\n deferEvents = true;\n }\n // We need to defer in some cases in order to avoid \"changed after checked errors\", however\n // the side-effect is that we may end up updating the model value out of sequence in others\n // The `deferEvents` flag allows us to decide whether to do it on a case-by-case basis.\n if (deferEvents) {\n Promise.resolve().then(() => this._updateModelValue(toggle, isUserInput));\n } else {\n this._updateModelValue(toggle, isUserInput);\n }\n }\n /** Checks whether a button toggle is selected. */\n _isSelected(toggle) {\n return this._selectionModel && this._selectionModel.isSelected(toggle);\n }\n /** Determines whether a button toggle should be checked on init. */\n _isPrechecked(toggle) {\n if (typeof this._rawValue === 'undefined') {\n return false;\n }\n if (this.multiple && Array.isArray(this._rawValue)) {\n return this._rawValue.some(value => toggle.value != null && value === toggle.value);\n }\n return toggle.value === this._rawValue;\n }\n /** Initializes the tabindex attribute using the radio pattern. */\n _initializeTabIndex() {\n this._buttonToggles.forEach(toggle => {\n toggle.tabIndex = -1;\n });\n if (this.selected) {\n this.selected.tabIndex = 0;\n } else {\n for (let i = 0; i < this._buttonToggles.length; i++) {\n const toggle = this._buttonToggles.get(i);\n if (!toggle.disabled) {\n toggle.tabIndex = 0;\n break;\n }\n }\n }\n this._markButtonsForCheck();\n }\n /** Obtain the subsequent toggle to which the focus shifts. */\n _getNextButton(startIndex, offset) {\n const items = this._buttonToggles;\n for (let i = 1; i <= items.length; i++) {\n const index = (startIndex + offset * i + items.length) % items.length;\n const item = items.get(index);\n if (item && !item.disabled) {\n return item;\n }\n }\n return null;\n }\n /** Updates the selection state of the toggles in the group based on a value. */\n _setSelectionByValue(value) {\n this._rawValue = value;\n if (!this._buttonToggles) {\n return;\n }\n const toggles = this._buttonToggles.toArray();\n if (this.multiple && value) {\n if (!Array.isArray(value) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Value must be an array in multiple-selection mode.');\n }\n this._clearSelection();\n value.forEach(currentValue => this._selectValue(currentValue, toggles));\n } else {\n this._clearSelection();\n this._selectValue(value, toggles);\n }\n // In single selection mode we need at least one enabled toggle to always be focusable.\n if (!this.multiple && toggles.every(toggle => toggle.tabIndex === -1)) {\n for (const toggle of toggles) {\n if (!toggle.disabled) {\n toggle.tabIndex = 0;\n break;\n }\n }\n }\n }\n /** Clears the selected toggles. */\n _clearSelection() {\n this._selectionModel.clear();\n this._buttonToggles.forEach(toggle => {\n toggle.checked = false;\n // If the button toggle is in single select mode, initialize the tabIndex.\n if (!this.multiple) {\n toggle.tabIndex = -1;\n }\n });\n }\n /** Selects a value if there's a toggle that corresponds to it. */\n _selectValue(value, toggles) {\n for (const toggle of toggles) {\n if (toggle.value === value) {\n toggle.checked = true;\n this._selectionModel.select(toggle);\n if (!this.multiple) {\n // If the button toggle is in single select mode, reset the tabIndex.\n toggle.tabIndex = 0;\n }\n break;\n }\n }\n }\n /** Syncs up the group's value with the model and emits the change event. */\n _updateModelValue(toggle, isUserInput) {\n // Only emit the change event for user input.\n if (isUserInput) {\n this._emitChangeEvent(toggle);\n }\n // Note: we emit this one no matter whether it was a user interaction, because\n // it is used by Angular to sync up the two-way data binding.\n this.valueChange.emit(this.value);\n }\n /** Marks all of the child button toggles to be checked. */\n _markButtonsForCheck() {\n this._buttonToggles?.forEach(toggle => toggle._markForCheck());\n }\n static ɵfac = function MatButtonToggleGroup_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatButtonToggleGroup)();\n };\n static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatButtonToggleGroup,\n selectors: [[\"mat-button-toggle-group\"]],\n contentQueries: function MatButtonToggleGroup_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.ɵɵcontentQuery(dirIndex, MatButtonToggle, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._buttonToggles = _t);\n }\n },\n hostAttrs: [1, \"mat-button-toggle-group\"],\n hostVars: 6,\n hostBindings: function MatButtonToggleGroup_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"keydown\", function MatButtonToggleGroup_keydown_HostBindingHandler($event) {\n return ctx._keydown($event);\n });\n }\n if (rf & 2) {\n i0.ɵɵattribute(\"role\", ctx.multiple ? \"group\" : \"radiogroup\")(\"aria-disabled\", ctx.disabled);\n i0.ɵɵclassProp(\"mat-button-toggle-vertical\", ctx.vertical)(\"mat-button-toggle-group-appearance-standard\", ctx.appearance === \"standard\");\n }\n },\n inputs: {\n appearance: \"appearance\",\n name: \"name\",\n vertical: [2, \"vertical\", \"vertical\", booleanAttribute],\n value: \"value\",\n multiple: [2, \"multiple\", \"multiple\", booleanAttribute],\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute],\n disabledInteractive: [2, \"disabledInteractive\", \"disabledInteractive\", booleanAttribute],\n hideSingleSelectionIndicator: [2, \"hideSingleSelectionIndicator\", \"hideSingleSelectionIndicator\", booleanAttribute],\n hideMultipleSelectionIndicator: [2, \"hideMultipleSelectionIndicator\", \"hideMultipleSelectionIndicator\", booleanAttribute]\n },\n outputs: {\n valueChange: \"valueChange\",\n change: \"change\"\n },\n exportAs: [\"matButtonToggleGroup\"],\n features: [i0.ɵɵProvidersFeature([MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR, {\n provide: MAT_BUTTON_TOGGLE_GROUP,\n useExisting: MatButtonToggleGroup\n }])]\n });\n }\n return MatButtonToggleGroup;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Single button inside of a toggle group. */\nlet MatButtonToggle = /*#__PURE__*/(() => {\n class MatButtonToggle {\n _changeDetectorRef = inject(ChangeDetectorRef);\n _elementRef = inject(ElementRef);\n _focusMonitor = inject(FocusMonitor);\n _idGenerator = inject(_IdGenerator);\n _animationMode = inject(ANIMATION_MODULE_TYPE, {\n optional: true\n });\n _checked = false;\n /**\n * Attached to the aria-label attribute of the host element. In most cases, aria-labelledby will\n * take precedence so this may be omitted.\n */\n ariaLabel;\n /**\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n */\n ariaLabelledby = null;\n /** Underlying native `button` element. */\n _buttonElement;\n /** The parent button toggle group (exclusive selection). Optional. */\n buttonToggleGroup;\n /** Unique ID for the underlying `button` element. */\n get buttonId() {\n return `${this.id}-button`;\n }\n /** The unique ID for this button toggle. */\n id;\n /** HTML's 'name' attribute used to group radios for unique selection. */\n name;\n /** MatButtonToggleGroup reads this to assign its own value. */\n value;\n /** Tabindex of the toggle. */\n get tabIndex() {\n return this._tabIndex;\n }\n set tabIndex(value) {\n if (value !== this._tabIndex) {\n this._tabIndex = value;\n this._markForCheck();\n }\n }\n _tabIndex;\n /** Whether ripples are disabled on the button toggle. */\n disableRipple;\n /** The appearance style of the button. */\n get appearance() {\n return this.buttonToggleGroup ? this.buttonToggleGroup.appearance : this._appearance;\n }\n set appearance(value) {\n this._appearance = value;\n }\n _appearance;\n /** Whether the button is checked. */\n get checked() {\n return this.buttonToggleGroup ? this.buttonToggleGroup._isSelected(this) : this._checked;\n }\n set checked(value) {\n if (value !== this._checked) {\n this._checked = value;\n if (this.buttonToggleGroup) {\n this.buttonToggleGroup._syncButtonToggle(this, this._checked);\n }\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Whether the button is disabled. */\n get disabled() {\n return this._disabled || this.buttonToggleGroup && this.buttonToggleGroup.disabled;\n }\n set disabled(value) {\n this._disabled = value;\n }\n _disabled = false;\n /** Whether the button should remain interactive when it is disabled. */\n get disabledInteractive() {\n return this._disabledInteractive || this.buttonToggleGroup !== null && this.buttonToggleGroup.disabledInteractive;\n }\n set disabledInteractive(value) {\n this._disabledInteractive = value;\n }\n _disabledInteractive;\n /** Event emitted when the group value changes. */\n change = new EventEmitter();\n constructor() {\n inject(_CdkPrivateStyleLoader).load(_StructuralStylesLoader);\n const toggleGroup = inject(MAT_BUTTON_TOGGLE_GROUP, {\n optional: true\n });\n const defaultTabIndex = inject(new HostAttributeToken('tabindex'), {\n optional: true\n }) || '';\n const defaultOptions = inject(MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS, {\n optional: true\n });\n this._tabIndex = parseInt(defaultTabIndex) || 0;\n this.buttonToggleGroup = toggleGroup;\n this.appearance = defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';\n this.disabledInteractive = defaultOptions?.disabledInteractive ?? false;\n }\n ngOnInit() {\n const group = this.buttonToggleGroup;\n this.id = this.id || this._idGenerator.getId('mat-button-toggle-');\n if (group) {\n if (group._isPrechecked(this)) {\n this.checked = true;\n } else if (group._isSelected(this) !== this._checked) {\n // As side effect of the circular dependency between the toggle group and the button,\n // we may end up in a state where the button is supposed to be checked on init, but it\n // isn't, because the checked value was assigned too early. This can happen when Ivy\n // assigns the static input value before the `ngOnInit` has run.\n group._syncButtonToggle(this, this._checked);\n }\n }\n }\n ngAfterViewInit() {\n // This serves two purposes:\n // 1. We don't want the animation to fire on the first render for pre-checked toggles so we\n // delay adding the class until the view is rendered.\n // 2. We don't want animation if the `NoopAnimationsModule` is provided.\n if (this._animationMode !== 'NoopAnimations') {\n this._elementRef.nativeElement.classList.add('mat-button-toggle-animations-enabled');\n }\n this._focusMonitor.monitor(this._elementRef, true);\n }\n ngOnDestroy() {\n const group = this.buttonToggleGroup;\n this._focusMonitor.stopMonitoring(this._elementRef);\n // Remove the toggle from the selection once it's destroyed. Needs to happen\n // on the next tick in order to avoid \"changed after checked\" errors.\n if (group && group._isSelected(this)) {\n group._syncButtonToggle(this, false, false, true);\n }\n }\n /** Focuses the button. */\n focus(options) {\n this._buttonElement.nativeElement.focus(options);\n }\n /** Checks the button toggle due to an interaction with the underlying native button. */\n _onButtonClick() {\n if (this.disabled) {\n return;\n }\n const newChecked = this.isSingleSelector() ? true : !this._checked;\n if (newChecked !== this._checked) {\n this._checked = newChecked;\n if (this.buttonToggleGroup) {\n this.buttonToggleGroup._syncButtonToggle(this, this._checked, true);\n this.buttonToggleGroup._onTouched();\n }\n }\n if (this.isSingleSelector()) {\n const focusable = this.buttonToggleGroup._buttonToggles.find(toggle => {\n return toggle.tabIndex === 0;\n });\n // Modify the tabindex attribute of the last focusable button toggle to -1.\n if (focusable) {\n focusable.tabIndex = -1;\n }\n // Modify the tabindex attribute of the presently selected button toggle to 0.\n this.tabIndex = 0;\n }\n // Emit a change event when it's the single selector\n this.change.emit(new MatButtonToggleChange(this, this.value));\n }\n /**\n * Marks the button toggle as needing checking for change detection.\n * This method is exposed because the parent button toggle group will directly\n * update bound properties of the radio button.\n */\n _markForCheck() {\n // When the group value changes, the button will not be notified.\n // Use `markForCheck` to explicit update button toggle's status.\n this._changeDetectorRef.markForCheck();\n }\n /** Gets the name that should be assigned to the inner DOM node. */\n _getButtonName() {\n if (this.isSingleSelector()) {\n return this.buttonToggleGroup.name;\n }\n return this.name || null;\n }\n /** Whether the toggle is in single selection mode. */\n isSingleSelector() {\n return this.buttonToggleGroup && !this.buttonToggleGroup.multiple;\n }\n static ɵfac = function MatButtonToggle_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatButtonToggle)();\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatButtonToggle,\n selectors: [[\"mat-button-toggle\"]],\n viewQuery: function MatButtonToggle_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c0, 5);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._buttonElement = _t.first);\n }\n },\n hostAttrs: [\"role\", \"presentation\", 1, \"mat-button-toggle\"],\n hostVars: 14,\n hostBindings: function MatButtonToggle_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"focus\", function MatButtonToggle_focus_HostBindingHandler() {\n return ctx.focus();\n });\n }\n if (rf & 2) {\n i0.ɵɵattribute(\"aria-label\", null)(\"aria-labelledby\", null)(\"id\", ctx.id)(\"name\", null);\n i0.ɵɵclassProp(\"mat-button-toggle-standalone\", !ctx.buttonToggleGroup)(\"mat-button-toggle-checked\", ctx.checked)(\"mat-button-toggle-disabled\", ctx.disabled)(\"mat-button-toggle-disabled-interactive\", ctx.disabledInteractive)(\"mat-button-toggle-appearance-standard\", ctx.appearance === \"standard\");\n }\n },\n inputs: {\n ariaLabel: [0, \"aria-label\", \"ariaLabel\"],\n ariaLabelledby: [0, \"aria-labelledby\", \"ariaLabelledby\"],\n id: \"id\",\n name: \"name\",\n value: \"value\",\n tabIndex: \"tabIndex\",\n disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute],\n appearance: \"appearance\",\n checked: [2, \"checked\", \"checked\", booleanAttribute],\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute],\n disabledInteractive: [2, \"disabledInteractive\", \"disabledInteractive\", booleanAttribute]\n },\n outputs: {\n change: \"change\"\n },\n exportAs: [\"matButtonToggle\"],\n ngContentSelectors: _c1,\n decls: 7,\n vars: 13,\n consts: [[\"button\", \"\"], [\"type\", \"button\", 1, \"mat-button-toggle-button\", \"mat-focus-indicator\", 3, \"click\", \"id\", \"disabled\"], [1, \"mat-button-toggle-checkbox-wrapper\"], [1, \"mat-button-toggle-label-content\"], [1, \"mat-button-toggle-focus-overlay\"], [\"matRipple\", \"\", 1, \"mat-button-toggle-ripple\", 3, \"matRippleTrigger\", \"matRippleDisabled\"], [\"state\", \"checked\", \"aria-hidden\", \"true\", \"appearance\", \"minimal\", 3, \"disabled\"]],\n template: function MatButtonToggle_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵprojectionDef();\n i0.ɵɵelementStart(0, \"button\", 1, 0);\n i0.ɵɵlistener(\"click\", function MatButtonToggle_Template_button_click_0_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx._onButtonClick());\n });\n i0.ɵɵtemplate(2, MatButtonToggle_Conditional_2_Template, 2, 1, \"div\", 2);\n i0.ɵɵelementStart(3, \"span\", 3);\n i0.ɵɵprojection(4);\n i0.ɵɵelementEnd()();\n i0.ɵɵelement(5, \"span\", 4)(6, \"span\", 5);\n }\n if (rf & 2) {\n const button_r3 = i0.ɵɵreference(1);\n i0.ɵɵproperty(\"id\", ctx.buttonId)(\"disabled\", ctx.disabled && !ctx.disabledInteractive || null);\n i0.ɵɵattribute(\"role\", ctx.isSingleSelector() ? \"radio\" : \"button\")(\"tabindex\", ctx.disabled && !ctx.disabledInteractive ? -1 : ctx.tabIndex)(\"aria-pressed\", !ctx.isSingleSelector() ? ctx.checked : null)(\"aria-checked\", ctx.isSingleSelector() ? ctx.checked : null)(\"name\", ctx._getButtonName())(\"aria-label\", ctx.ariaLabel)(\"aria-labelledby\", ctx.ariaLabelledby)(\"aria-disabled\", ctx.disabled && ctx.disabledInteractive ? \"true\" : null);\n i0.ɵɵadvance(2);\n i0.ɵɵconditional(ctx.buttonToggleGroup && (!ctx.buttonToggleGroup.multiple && !ctx.buttonToggleGroup.hideSingleSelectionIndicator || ctx.buttonToggleGroup.multiple && !ctx.buttonToggleGroup.hideMultipleSelectionIndicator) ? 2 : -1);\n i0.ɵɵadvance(4);\n i0.ɵɵproperty(\"matRippleTrigger\", button_r3)(\"matRippleDisabled\", ctx.disableRipple || ctx.disabled);\n }\n },\n dependencies: [MatRipple, MatPseudoCheckbox],\n styles: [\".mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);transform:translateZ(0);border-radius:var(--mat-legacy-button-toggle-shape)}.mat-button-toggle-standalone:not([class*=mat-elevation-z]),.mat-button-toggle-group:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}@media(forced-colors: active){.mat-button-toggle-standalone,.mat-button-toggle-group{outline:solid 1px}}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard .mat-pseudo-checkbox,.mat-button-toggle-group-appearance-standard .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-standard-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard:not([class*=mat-elevation-z]),.mat-button-toggle-group-appearance-standard:not([class*=mat-elevation-z]){box-shadow:none}@media(forced-colors: active){.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{outline:0}}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative;color:var(--mat-legacy-button-toggle-text-color);font-family:var(--mat-legacy-button-toggle-label-text-font);font-size:var(--mat-legacy-button-toggle-label-text-size);line-height:var(--mat-legacy-button-toggle-label-text-line-height);font-weight:var(--mat-legacy-button-toggle-label-text-weight);letter-spacing:var(--mat-legacy-button-toggle-label-text-tracking);--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-legacy-button-toggle-selected-state-text-color)}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-legacy-button-toggle-focus-state-layer-opacity)}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle-checkbox-wrapper{display:inline-block;justify-content:flex-start;align-items:center;width:0;height:18px;line-height:18px;overflow:hidden;box-sizing:border-box;position:absolute;top:50%;left:16px;transform:translate3d(0, -50%, 0)}[dir=rtl] .mat-button-toggle-checkbox-wrapper{left:auto;right:16px}.mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:12px}[dir=rtl] .mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:auto;right:12px}.mat-button-toggle-checked .mat-button-toggle-checkbox-wrapper{width:18px}.mat-button-toggle-animations-enabled .mat-button-toggle-checkbox-wrapper{transition:width 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-checkbox-wrapper{transition:none}.mat-button-toggle-checked{color:var(--mat-legacy-button-toggle-selected-state-text-color);background-color:var(--mat-legacy-button-toggle-selected-state-background-color)}.mat-button-toggle-disabled{pointer-events:none;color:var(--mat-legacy-button-toggle-disabled-state-text-color);background-color:var(--mat-legacy-button-toggle-disabled-state-background-color);--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color: var(--mat-legacy-button-toggle-disabled-state-text-color)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:var(--mat-legacy-button-toggle-disabled-selected-state-background-color)}.mat-button-toggle-disabled-interactive{pointer-events:auto}.mat-button-toggle-appearance-standard{color:var(--mat-standard-button-toggle-text-color, var(--mat-sys-on-surface));background-color:var(--mat-standard-button-toggle-background-color, transparent);font-family:var(--mat-standard-button-toggle-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-standard-button-toggle-label-text-size, var(--mat-sys-label-large-size));line-height:var(--mat-standard-button-toggle-label-text-line-height, var(--mat-sys-label-large-line-height));font-weight:var(--mat-standard-button-toggle-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-standard-button-toggle-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:none;border-top:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-standard-button-toggle-selected-state-background-color, var(--mat-sys-secondary-container))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-standard-button-toggle-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-standard-button-toggle-disabled-state-background-color, transparent)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color: var(--mat-standard-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-standard-button-toggle-disabled-selected-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-standard-button-toggle-state-layer-color, var(--mat-sys-on-surface))}.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-button-toggle-appearance-standard.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}@media(hover: none){.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;user-select:none;display:inline-block;padding:0 16px;line-height:var(--mat-legacy-button-toggle-height);position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px;line-height:var(--mat-standard-button-toggle-height, 40px)}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;pointer-events:none;opacity:0;background-color:var(--mat-legacy-button-toggle-state-layer-color)}@media(forced-colors: active){.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-animations-enabled .mat-button-toggle-button{transition:padding 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-button{transition:none}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:30px}[dir=rtl] .mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:0;padding-right:30px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-bottom-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-top-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n return MatButtonToggle;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatButtonToggleModule = /*#__PURE__*/(() => {\n class MatButtonToggleModule {\n static ɵfac = function MatButtonToggleModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatButtonToggleModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatButtonToggleModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule, MatRippleModule, MatButtonToggle, MatCommonModule]\n });\n }\n return MatButtonToggleModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS, MAT_BUTTON_TOGGLE_GROUP, MAT_BUTTON_TOGGLE_GROUP_DEFAULT_OPTIONS_FACTORY, MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR, MatButtonToggle, MatButtonToggleChange, MatButtonToggleGroup, MatButtonToggleModule };\n","import { _IdGenerator } from '@angular/cdk/a11y';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, forwardRef, inject, ElementRef, ChangeDetectorRef, NgZone, ANIMATION_MODULE_TYPE, EventEmitter, HostAttributeToken, booleanAttribute, numberAttribute, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, ViewChild, Directive, NgModule } from '@angular/core';\nimport { NG_VALUE_ACCESSOR, NG_VALIDATORS, CheckboxRequiredValidator } from '@angular/forms';\nimport { _StructuralStylesLoader, MatRipple, _MatInternalFormField, MatCommonModule } from '@angular/material/core';\nimport { _CdkPrivateStyleLoader } from '@angular/cdk/private';\n\n/** Injection token to be used to override the default options for `mat-checkbox`. */\nconst _c0 = [\"input\"];\nconst _c1 = [\"label\"];\nconst _c2 = [\"*\"];\nconst MAT_CHECKBOX_DEFAULT_OPTIONS = /*#__PURE__*/new InjectionToken('mat-checkbox-default-options', {\n providedIn: 'root',\n factory: MAT_CHECKBOX_DEFAULT_OPTIONS_FACTORY\n});\n/** @docs-private */\nfunction MAT_CHECKBOX_DEFAULT_OPTIONS_FACTORY() {\n return {\n color: 'accent',\n clickAction: 'check-indeterminate',\n disabledInteractive: false\n };\n}\n\n/**\n * Represents the different states that require custom transitions between them.\n * @docs-private\n */\nvar TransitionCheckState = /*#__PURE__*/function (TransitionCheckState) {\n /** The initial state of the component before any user interaction. */\n TransitionCheckState[TransitionCheckState[\"Init\"] = 0] = \"Init\";\n /** The state representing the component when it's becoming checked. */\n TransitionCheckState[TransitionCheckState[\"Checked\"] = 1] = \"Checked\";\n /** The state representing the component when it's becoming unchecked. */\n TransitionCheckState[TransitionCheckState[\"Unchecked\"] = 2] = \"Unchecked\";\n /** The state representing the component when it's becoming indeterminate. */\n TransitionCheckState[TransitionCheckState[\"Indeterminate\"] = 3] = \"Indeterminate\";\n return TransitionCheckState;\n}(TransitionCheckState || {});\n/**\n * @deprecated Will stop being exported.\n * @breaking-change 19.0.0\n */\nconst MAT_CHECKBOX_CONTROL_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: /*#__PURE__*/forwardRef(() => MatCheckbox),\n multi: true\n};\n/** Change event object emitted by checkbox. */\nclass MatCheckboxChange {\n /** The source checkbox of the event. */\n source;\n /** The new `checked` value of the checkbox. */\n checked;\n}\n// Default checkbox configuration.\nconst defaults = /*#__PURE__*/MAT_CHECKBOX_DEFAULT_OPTIONS_FACTORY();\nlet MatCheckbox = /*#__PURE__*/(() => {\n class MatCheckbox {\n _elementRef = inject(ElementRef);\n _changeDetectorRef = inject(ChangeDetectorRef);\n _ngZone = inject(NgZone);\n _animationMode = inject(ANIMATION_MODULE_TYPE, {\n optional: true\n });\n _options = inject(MAT_CHECKBOX_DEFAULT_OPTIONS, {\n optional: true\n });\n /** Focuses the checkbox. */\n focus() {\n this._inputElement.nativeElement.focus();\n }\n /** Creates the change event that will be emitted by the checkbox. */\n _createChangeEvent(isChecked) {\n const event = new MatCheckboxChange();\n event.source = this;\n event.checked = isChecked;\n return event;\n }\n /** Gets the element on which to add the animation CSS classes. */\n _getAnimationTargetElement() {\n return this._inputElement?.nativeElement;\n }\n /** CSS classes to add when transitioning between the different checkbox states. */\n _animationClasses = {\n uncheckedToChecked: 'mdc-checkbox--anim-unchecked-checked',\n uncheckedToIndeterminate: 'mdc-checkbox--anim-unchecked-indeterminate',\n checkedToUnchecked: 'mdc-checkbox--anim-checked-unchecked',\n checkedToIndeterminate: 'mdc-checkbox--anim-checked-indeterminate',\n indeterminateToChecked: 'mdc-checkbox--anim-indeterminate-checked',\n indeterminateToUnchecked: 'mdc-checkbox--anim-indeterminate-unchecked'\n };\n /**\n * Attached to the aria-label attribute of the host element. In most cases, aria-labelledby will\n * take precedence so this may be omitted.\n */\n ariaLabel = '';\n /**\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n */\n ariaLabelledby = null;\n /** The 'aria-describedby' attribute is read after the element's label and field type. */\n ariaDescribedby;\n /**\n * Users can specify the `aria-expanded` attribute which will be forwarded to the input element\n */\n ariaExpanded;\n /**\n * Users can specify the `aria-controls` attribute which will be forwarded to the input element\n */\n ariaControls;\n /** Users can specify the `aria-owns` attribute which will be forwarded to the input element */\n ariaOwns;\n _uniqueId;\n /** A unique id for the checkbox input. If none is supplied, it will be auto-generated. */\n id;\n /** Returns the unique id for the visual hidden input. */\n get inputId() {\n return `${this.id || this._uniqueId}-input`;\n }\n /** Whether the checkbox is required. */\n required;\n /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\n labelPosition = 'after';\n /** Name value will be applied to the input element if present */\n name = null;\n /** Event emitted when the checkbox's `checked` value changes. */\n change = new EventEmitter();\n /** Event emitted when the checkbox's `indeterminate` value changes. */\n indeterminateChange = new EventEmitter();\n /** The value attribute of the native input element */\n value;\n /** Whether the checkbox has a ripple. */\n disableRipple;\n /** The native `` element */\n _inputElement;\n /** The native `