{ "version": 3, "sources": ["apps/business-center-client/src/app/reputation/index.ts", "apps/business-center-client/src/app/shared/filter-service.service.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-filter-container.service.ts", "apps/business-center-client/src/app/metrics/helpers.ts", "apps/business-center-client/src/app/metrics/query.service.ts", "apps/business-center-client/src/app/metrics/account-group.service.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-geography-dialog/brand-geography-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-geography-dialog/brand-geography-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-group-dialog/brand-group-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-group-dialog/brand-group-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-location-dialog/brand-location-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-location-dialog/brand-location-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-source-dialog/brand-source-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-source-dialog/brand-source-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-taxonomy-dialog/brand-taxonomy-dialog.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-taxonomy-dialog/brand-taxonomy-dialog.component.html", "apps/business-center-client/src/app/brands/brand-filter-container/brand-filter-container.component.ts", "apps/business-center-client/src/app/brands/brand-filter-container/brand-filter-container.component.html"], "sourcesContent": ["export { ReputationService } from './reputation.service';\n", "import { Injectable } from '@angular/core';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport {\n FieldFilterOperator,\n FieldFilterOperatorFunction,\n Filter,\n PropertyType,\n} from '@vendasta/multi-location-analytics';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class FilterService {\n private filters$$ = new BehaviorSubject(new Array());\n public filters$: Observable;\n public sourceFilter$: Observable;\n private enabledSources$$: BehaviorSubject = new BehaviorSubject([]);\n public enabledSources$: Observable;\n private filteredSources$$: BehaviorSubject = new BehaviorSubject([]);\n public filteredSources$: Observable;\n public filtersQuantity$: Observable;\n private subgroup$$: BehaviorSubject = new BehaviorSubject(null);\n public subgroup$: Observable;\n\n constructor() {\n this.filters$ = this.filters$$.asObservable().pipe(map((r) => [...r]));\n this.enabledSources$ = this.enabledSources$$.asObservable();\n this.filteredSources$ = this.filteredSources$$.asObservable();\n this.subgroup$ = this.subgroup$$.asObservable();\n this.sourceFilter$ = combineLatest([this.enabledSources$$, this.filteredSources$]).pipe(\n map(([enabled, filtered]) => {\n if ((!filtered || filtered.length < 1) && (!enabled || enabled.length < 1)) {\n return null;\n }\n const sourceIds = filtered && filtered.length > 0 ? filtered : enabled;\n return new Filter({\n fieldFilter: {\n operator: FieldFilterOperator.EQUAL,\n operatorFunction: FieldFilterOperatorFunction.ANY,\n dimension: 'source',\n value: {\n value: sourceIds,\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n },\n },\n });\n }),\n distinctUntilChanged(),\n );\n this.filtersQuantity$ = combineLatest([this.filters$, this.filteredSources$, this.subgroup$]).pipe(\n map(([filters, filteredSources, subgroup]) => {\n let qty = 0;\n if (filters) {\n qty += filters.length;\n }\n if (filteredSources && filteredSources.length > 0) {\n qty += 1;\n }\n if (subgroup) {\n qty += 1;\n }\n return qty;\n }),\n );\n }\n\n public setFilters(filters: Filter[]): void {\n this.filters$$.next(filters);\n }\n\n public setEnabledSources(sourceIds: string[]): void {\n this.enabledSources$$.next(sourceIds);\n }\n\n public setFilteredSources(sourceIds: string[]): void {\n this.filteredSources$$.next(sourceIds);\n }\n\n public setSubgroup(groupId: string[]): void {\n this.subgroup$$.next(groupId);\n }\n}\n", "import { Injectable } from '@angular/core';\nimport { ActivationEnd, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Observable, Subject, combineLatest } from 'rxjs';\nimport { filter, map, shareReplay, startWith } from 'rxjs/operators';\nimport { getLocation } from '../../account-group/account-group';\nimport { LocationsService } from '../../locations';\nimport { PageId } from '../../page-access';\nimport { ReputationService } from '../../reputation';\nimport { FilterService } from '../../shared/filter-service.service';\nimport { AvailableTimeRangeOptions, TimeRangeService } from '../../shared/time-range.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport const COUNTRIES_LABEL = 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.COUNTRIES';\nexport const STATEPROV_LABEL = 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.REGION';\nexport const CITIES_LABEL = 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.CITIES';\n\nexport interface DisplayFilter {\n filterId: string;\n filterTypeTranslateKey?: string;\n displayName: string;\n displayName$?: Observable;\n icon?: string;\n}\n\nexport interface FilterDisplaySettings {\n textColor: string;\n backgroundColor: string;\n}\n\nexport interface LocationGroup {\n name: string;\n options: Location[];\n}\nexport interface Location {\n id: string;\n name: string;\n parent: string[];\n locationCount: number;\n}\n\nexport type DialogOpenTypes = 'location';\n\n@Injectable({ providedIn: 'root' })\nexport class BrandFilterContainerService {\n private readonly dateFilterUsed$$ = new BehaviorSubject(false);\n public readonly dateFilterUsed$ = this.dateFilterUsed$$.asObservable();\n public readonly dateFilterDisplay$: Observable;\n\n private readonly selectedAccountGroupIds$$ = new BehaviorSubject([]);\n public readonly selectedAccountGroupIds$ = this.selectedAccountGroupIds$$.asObservable();\n public readonly locationFilterDisplay$: Observable;\n\n private readonly selectedSourceIds$$ = new BehaviorSubject([]);\n public readonly selectedSourceIds$ = this.selectedSourceIds$$.asObservable();\n // TODO: Number if what I want most of the time but I've reached for a string (5+) when I didn't know exactly how many\n // TODO: ie, when filter for listings with name error OR website error -- overlapping counts with OR\n // TODO: Perhaps this isn't worth trying to put up here, let it be used in the locations that visualize better?\n private readonly sourceIdCounts$$ = new BehaviorSubject>(null);\n public readonly sourceIdCounts$ = this.sourceIdCounts$$.asObservable();\n public readonly sourceFilterDisplay$: Observable;\n public readonly sourceOptions$: Observable;\n\n openDialog$: Subject = new Subject();\n // TODO: This is set in several places but never read. Missed in feature removal?\n private minimised$$: BehaviorSubject = new BehaviorSubject(false);\n public minimised$: Observable = this.minimised$$.asObservable();\n\n shouldHaveShadow$: Observable;\n\n constructor(\n private readonly timeRangeService: TimeRangeService,\n private readonly translate: TranslateService,\n private readonly filterService: FilterService,\n private readonly router: Router,\n private readonly reputationService: ReputationService,\n private readonly locationsService: LocationsService,\n ) {\n // Watch the selection to produce the english version of the selection\n this.dateFilterDisplay$ = this.timeRangeService.selectedTimeRangeKey$.pipe(\n map((timeRangeKey) => {\n const timeRangeSelected = AvailableTimeRangeOptions.find(\n (timeRangeOption) => timeRangeOption.key === timeRangeKey,\n );\n return `${timeRangeSelected.name}`;\n }),\n );\n\n this.locationFilterDisplay$ = combineLatest([\n // Loaded, as we need to know if the selection is in the next load to carry it over\n this.locationsService.currentAccountGroups$.pipe(filter((ls) => !!ls)),\n this.selectedAccountGroupIds$,\n this.translate.stream('COMMON.LOCATIONS'),\n ]).pipe(\n map(([brandLocations, accountGroupIds, locationsTranslated]) => {\n const locs = accountGroupIds.map((accountGroupId) => brandLocations[accountGroupId]);\n const locsInside = locs.filter((loc) => loc);\n // If not all are present, set to just present\n if (locs.length - locsInside.length) {\n this.setAccountGroupIds(locsInside.map((loc) => loc.accountGroupId));\n return '';\n }\n\n if (locsInside.length > 1) {\n return `${locsInside.length} ${locationsTranslated}`;\n } else {\n return locsInside.map((loc) => `${loc.companyName} ${getLocation(loc)}`).join(', ');\n }\n }),\n );\n\n this.sourceFilterDisplay$ = combineLatest([\n // Loaded, as we need to know if the selection is in the next load to carry it over\n this.reputationService.brandSourcesFull$.pipe(filter((sourceMap) => !!sourceMap)),\n this.selectedSourceIds$,\n this.sourceIdCounts$,\n this.translate.stream('COMMON.REVIEW_OR_LISTING_SOURCES'),\n ]).pipe(\n map(([brandSources, selectedSourceIds, sourceIdCounts, sourcesTranslated]) => {\n const sources = selectedSourceIds.map((sourceId) => brandSources.get(sourceId));\n const sourcesInside = sources.filter((source) => source);\n // If not all are present, set to just present and exit early\n if (sources.length - sourcesInside.length) {\n this.setSourceIds(sourcesInside.map((source) => source.sourceId + ''));\n return '';\n }\n\n // If there's more than X, just display the count of selected\n if (sourcesInside.length > 2) {\n return `${sourcesInside.length} ${sourcesTranslated}`;\n } else {\n // Use counts if present\n if (sourceIdCounts) {\n return sourcesInside\n .map((source) => `${source.name} ${sourceIdCounts.get(source.sourceId + '')}`)\n .join(', ');\n } else {\n return sourcesInside.map((source) => `${source.name}`).join(', ');\n }\n }\n }),\n );\n\n this.sourceOptions$ = combineLatest([this.sourceIdCounts$$, this.reputationService.brandSourcesFull$]).pipe(\n map(([countMap, sourceMap]) => {\n if (!sourceMap) {\n return [];\n }\n return (\n Array.from(sourceMap.keys())\n .map((sourceId) => {\n const source = sourceMap.get(sourceId + '');\n const count = countMap ? countMap.get(sourceId + '') : null;\n return {\n value: sourceId,\n valueCount: count,\n name: count !== null ? `${source.name} (${count})` : `${source.name}`,\n };\n })\n // TODO: Sort by count?\n .sort((a, b) => a.name.localeCompare(b.name))\n );\n }),\n );\n\n this.reputationService.brandSources$\n .pipe(takeUntilDestroyed())\n .subscribe((sourceIds) => this.filterService.setEnabledSources(sourceIds.map((sourceId) => sourceId.toString())));\n this.selectedSourceIds$\n .pipe(takeUntilDestroyed())\n .subscribe((sourceIds) => this.filterService.setFilteredSources(sourceIds));\n\n this.shouldHaveShadow$ = this.router.events.pipe(\n filter((event) => event instanceof ActivationEnd && event.snapshot.children.length === 0),\n map((event: ActivationEnd) => {\n return event.snapshot.data['pageId'] !== PageId.multi_location_report;\n }),\n startWith(\n (function (_this): boolean {\n let route = _this.router.routerState.root;\n while (route.firstChild) {\n route = route.firstChild;\n }\n if (route.snapshot) {\n return route.snapshot.data['pageId'] !== PageId.multi_location_report;\n }\n })(this),\n ),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n }\n\n setMinimizedStatus(status: boolean): void {\n this.minimised$$.next(status);\n }\n\n openDialog(dialog: DialogOpenTypes): void {\n this.openDialog$.next(dialog);\n }\n\n getAccountGroupIds(): string[] {\n return this.selectedAccountGroupIds$$.getValue();\n }\n setAccountGroupIds(accountGroupIds: string[]): void {\n this.selectedAccountGroupIds$$.next(accountGroupIds);\n }\n clearAccountGroupIds(): void {\n this.selectedAccountGroupIds$$.next([]);\n }\n\n getSourceIds(): string[] {\n return this.selectedSourceIds$$.getValue();\n }\n setSourceIds(sourceIds: string[]): void {\n this.selectedSourceIds$$.next(sourceIds);\n }\n addSourceId(sourceId: string): void {\n const sources = this.selectedSourceIds$$.getValue();\n if (sources.includes(sourceId)) {\n return;\n }\n this.selectedSourceIds$$.next([...sources, sourceId]);\n }\n removeSourceId(sourceId: string): void {\n const sources = this.selectedSourceIds$$.getValue();\n const newSources = sources.filter((id) => id !== sourceId);\n if (sources.length !== newSources.length) {\n this.selectedSourceIds$$.next(newSources);\n }\n }\n clearSourceIds(): void {\n this.selectedSourceIds$$.next([]);\n }\n}\n", "import { DecimalPipe } from '@angular/common';\nimport { Observable } from 'rxjs';\nimport { MetricResult, QueryMetricsResponse, ResourceMetricResult } from '@vendasta/multi-location-analytics';\nimport { map } from 'rxjs/operators';\n\nconst rounderPipe = new DecimalPipe(`en-US`);\n\n// round uses an angular decimal pipe for consistent rounding logic\nexport function round(value: number, pipeOpts: string): number | null {\n const val = rounderPipe.transform(value, pipeOpts);\n return val === null ? null : +val.replace(',', '');\n}\n\nexport class Row {\n constructor(\n public values: any[],\n public measures: any[],\n ) {}\n}\n\nexport function rowify(r: ResourceMetricResult): Row[] {\n if (!r.metrics || !r.metrics.metrics) {\n return [];\n }\n const res = r.metrics.metrics.map(function (m: MetricResult): Row[] {\n return parse(m, new Row([], []));\n });\n const rows = [];\n res.forEach((singleDayMeasureValues) => {\n rows.push(singleDayMeasureValues[0]);\n });\n return rows;\n}\n\nfunction parse(m: MetricResult, r: Row): Row[] {\n r.values.push(m.dimension);\n if (!m.results || !m.results.metrics) {\n r.measures.push(m.measures);\n return [r];\n }\n const all = m.results.metrics.map(function (val: MetricResult): Row[] {\n return parse(val, r);\n });\n return all.reduce((acc, val) => acc.concat(val), []);\n}\n\nexport class QueryMetricsResponseDelta {\n readonly currentPeriodRows$: Observable;\n readonly previousPeriodRows$: Observable;\n constructor(\n public currentPeriod$: Observable,\n public prevPeriod$: Observable,\n ) {\n this.currentPeriodRows$ = this.currentPeriod$.pipe(\n map((r) => {\n if (!r) {\n return null;\n }\n return rowify(r.metricResults[0]);\n }),\n );\n this.previousPeriodRows$ = this.prevPeriod$.pipe(\n map((r) => {\n if (!r) {\n return null;\n }\n return rowify(r.metricResults[0]);\n }),\n );\n }\n}\n", "import { Injectable } from '@angular/core';\nimport {\n Alignment,\n AlignmentPeriod,\n AlignmentPeriodCalendar,\n AnalyticsApiService,\n BusinessResourceId,\n CompositeFilter,\n CompositeFilterOperator,\n DateRange,\n FieldFilter,\n FieldFilterOperator,\n FieldFilterOperatorFunction,\n Filter,\n GroupBy,\n GroupByDimension,\n GroupByExcludeCombination,\n GroupByOperator,\n GroupResourceId,\n Measure,\n MeasureAggregate,\n MeasureAggregateOperator,\n Order,\n PropertyType,\n QueryMetricsRequest,\n QueryMetricsResponse,\n ResourceId,\n TypedValue,\n UnaryFilter,\n UnaryFilterOperator,\n} from '@vendasta/multi-location-analytics';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport moment from 'moment/moment';\nimport { Observable, combineLatest, of } from 'rxjs';\nimport { debounceTime, filter, map, shareReplay, startWith, switchMap } from 'rxjs/operators';\nimport { partnerId } from '../../globals';\nimport { BrandFilterContainerService } from '../brands/brand-filter-container/brand-filter-container.service';\nimport { BrandsService } from '../brands/brands.service';\nimport { LocationsService, isAccountGroup, isBrand } from '../locations';\nimport { ReputationService } from '../reputation';\nimport { FilterService } from '../shared/filter-service.service';\nimport {\n alignUTCDateToLocal,\n generateDates,\n getAlignmentPeriodForRange,\n getGranularityForRange,\n previousPeriodMoment,\n} from '../shared/time-range-shared';\nimport { CUSTOM_TIME_RANGE_KEYS, TimeRangeService } from '../shared/time-range.service';\nimport { QueryMetricsResponseDelta } from './helpers';\ndayjs.extend(utc);\n\nexport class StatByTime {\n public localAlignedTime: Date;\n\n constructor(\n public time: Date,\n public stat: T,\n ) {\n this.localAlignedTime = alignUTCDateToLocal(time);\n }\n}\n\nexport class BrandContext {\n public readonly sourceIdsSet: Set;\n\n constructor(\n public resourceIds: ResourceId[],\n public startDate: Date,\n public endDate: Date,\n public timeRange: string,\n public filters: Filter[],\n // The brand's self-declared relevant sources, masking the data potentially present for irrelevant sources\n public activeSources: number[] = [],\n // The sources selected to filter to -- overrides the default of activeSources\n public selectedSourceIds: string[] = [],\n public groupBy: string[],\n ) {\n if (this.selectedSourceIds || this.activeSources) {\n const sourceIds =\n this.selectedSourceIds && this.selectedSourceIds.length\n ? this.selectedSourceIds\n : this.activeSources.map((num) => num + '');\n this.sourceIdsSet = new Set(sourceIds);\n }\n }\n\n public previousPeriod(): [Date, Date] {\n const prevRange = previousPeriodMoment([dayjs(this.startDate), dayjs(this.endDate)]);\n return [prevRange[0].toDate(), prevRange[1].toDate()];\n }\n\n public dateRange(forCurrentPeriod: boolean): [Date, Date] {\n if (forCurrentPeriod) {\n return [this.startDate, this.endDate];\n }\n return this.previousPeriod();\n }\n\n // GMB data is censored on API, this accounts for it\n public GMBDateRange(forCurrentPeriod: boolean): [Date, Date] {\n let [startDate, endDate] = this.dateRange(forCurrentPeriod);\n startDate = dayjs.utc(startDate).toDate();\n if (endDate >= dayjs.utc(dayjs().format('YYYY-MM-DD')).toDate()) {\n endDate = dayjs.utc(endDate).subtract(5, 'days').toDate();\n }\n return [startDate, endDate];\n }\n\n // Review data is typically delayed, this accounts for it\n public ReviewDateRange(forCurrentPeriod: boolean, onlyOffsetStartDate?: boolean): [Date, Date] {\n // don't offset when timeRange is custom, month, quarter\n if (CUSTOM_TIME_RANGE_KEYS.includes(this.timeRange)) {\n return this.dateRange(forCurrentPeriod);\n }\n // TODO: only offset if end is today, and handle displaying that conditionally.\n // TODO: this is currently implicit due to non-custom options always being `Last X`\n let [startDate, endDate] = this.dateRange(forCurrentPeriod);\n startDate = dayjs.utc(startDate).subtract(1, 'days').toDate();\n if (!onlyOffsetStartDate) {\n endDate = dayjs.utc(endDate).subtract(1, 'days').toDate();\n }\n return [startDate, endDate];\n }\n\n // AdIntel data is delayed, this accounts for it\n public adIntelDateRange(forCurrentPeriod: boolean): [Date, Date] {\n if (this.timeRange === 'custom') {\n let [startDate, endDate] = this.dateRange(forCurrentPeriod);\n startDate = dayjs.utc(startDate).subtract(0, 'days').toDate();\n endDate = dayjs.utc(endDate).subtract(0, 'days').toDate();\n return [startDate, endDate];\n }\n let [startDate, endDate] = this.dateRange(forCurrentPeriod);\n startDate = dayjs.utc(startDate).subtract(0, 'days').toDate();\n endDate = dayjs.utc(endDate).subtract(0, 'days').toDate();\n return [startDate, endDate];\n }\n\n public alignmentPeriod(): AlignmentPeriodCalendar {\n return getAlignmentPeriodForRange(this.startDate, this.endDate);\n }\n\n public buildFilter(filters?: Filter[]): Filter {\n if ((!this.filters || this.filters.length === 0) && (!filters || filters.length === 0)) {\n return null;\n }\n\n if (!filters) {\n filters = [];\n }\n if (this.filters && this.filters.length > 0) {\n filters = filters.concat(this.filters);\n }\n\n return new Filter({\n compositeFilter: {\n op: CompositeFilterOperator.AND,\n filters: filters,\n },\n });\n }\n\n public buildActiveSourcesFilter(field = 'source_id'): Filter {\n return new Filter({\n fieldFilter: {\n dimension: field,\n operator: FieldFilterOperator.EQUAL,\n operatorFunction: FieldFilterOperatorFunction.ANY,\n value: {\n value: Array.from(this.sourceIdsSet),\n valueType: PropertyType.PROPERTY_TYPE_INT64,\n },\n },\n });\n }\n\n public buildActualActiveSourcesFilter(field = 'source_id'): Filter {\n return new Filter({\n fieldFilter: {\n dimension: field,\n operator: FieldFilterOperator.EQUAL,\n operatorFunction: FieldFilterOperatorFunction.ANY,\n value: {\n value: this.activeSources.map((n) => n + ''),\n valueType: PropertyType.PROPERTY_TYPE_INT64,\n },\n },\n });\n }\n}\n\nfunction boolValue(value: boolean): TypedValue {\n return new TypedValue({\n value: value,\n valueType: PropertyType.PROPERTY_TYPE_BOOL,\n });\n}\n\nfunction stringValue(value: string): TypedValue {\n return new TypedValue({\n value: value,\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n });\n}\n\nexport const isAccurateFilter = new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'match_quality',\n operator: FieldFilterOperator.EQUAL,\n value: new TypedValue({\n value: 'good',\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n }),\n }),\n});\nexport const isInaccurateFilter = new Filter({\n fieldFilter: {\n dimension: 'match_quality',\n operator: FieldFilterOperator.NOT_EQUAL,\n value: {\n value: 'good',\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n },\n },\n});\nexport const isVerifiedFilter = new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'is_verified',\n operator: FieldFilterOperator.EQUAL,\n value: boolValue(true),\n }),\n});\nexport const isNotVerifiedFilter = new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'is_verified',\n operator: FieldFilterOperator.EQUAL,\n value: boolValue(false),\n }),\n});\nexport const isMissingFilter = new Filter({\n unaryFilter: new UnaryFilter({\n dimension: 'listing_id',\n op: UnaryFilterOperator.IS_NULL,\n }),\n});\nexport const isPotentialMissingFilter = new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'is_missing',\n operator: FieldFilterOperator.EQUAL,\n value: boolValue(true),\n }),\n});\n\ntype RequestBuilder = (brandsContext: BrandContext, curPeriod: boolean, groupBy: string[]) => QueryMetricsRequest;\n\n// Builds measures of error counts by field, error counts by accuracy level, and count of missing\nfunction buildListingCountMeasures(): Measure[] {\n // Count wrong fields\n const fields = [\n 'match_detail_name',\n 'match_detail_street_address',\n 'match_detail_locality',\n 'match_detail_region',\n 'match_detail_postal_code',\n 'match_detail_phone',\n 'match_detail_website',\n ];\n let measures = fields.map((field) => {\n const fieldErrorFilter = new Filter({\n fieldFilter: new FieldFilter({\n dimension: field,\n operator: FieldFilterOperator.EQUAL,\n value: stringValue('not match'),\n }),\n });\n return new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n compositeFilter: {\n op: CompositeFilterOperator.AND,\n filters: [fieldErrorFilter, isNotVerifiedFilter, isInaccurateFilter],\n },\n }),\n alias: field,\n }),\n });\n });\n\n measures = measures.concat([\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'num_accurate',\n filter: {\n compositeFilter: {\n filters: [isAccurateFilter, isVerifiedFilter],\n op: CompositeFilterOperator.OR,\n },\n },\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'num_inaccurate',\n filter: new Filter({\n compositeFilter: {\n filters: [isInaccurateFilter, isNotVerifiedFilter],\n op: CompositeFilterOperator.AND,\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'num_missing',\n filter: new Filter({\n unaryFilter: new UnaryFilter({\n dimension: 'listing_id',\n op: UnaryFilterOperator.IS_NULL,\n }),\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: isPotentialMissingFilter,\n alias: 'num_potential_missing',\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'num_ignoring_errors',\n filter: isVerifiedFilter,\n }),\n }),\n ]);\n return measures;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class QueryService {\n // BrandContext which is watched with minimal scoping, to trigger reactive querying of the following\n public brandsContext$: Observable;\n\n // TODO: The following react to changes after being subscribed to, regardless of current subscribers, due to shareReplay.\n\n // GMB: insights and the presence of connections\n readonly insights$s: Map;\n readonly insightsTotals$: Map;\n readonly searchKeywords: QueryMetricsResponseDelta;\n readonly gmbConnections$: Observable;\n\n // AdIntel: view, open, click counts\n readonly adIntelStats$: QueryMetricsResponseDelta;\n\n // Reviews: Comparison counts rolled up by time for location and source. Average rating derived.\n readonly reviews$s: Map;\n // ResponseTimes: Review response times\n readonly responseTimes$s: Map;\n // Counts by status, source, and rating, for presenting manage scoping\n readonly reviewCounts$: Observable;\n\n // Listings: Listing Scores Data by time for location and source. Listing Score % derived.\n readonly listingScore$: QueryMetricsResponseDelta;\n // The latest, for presenting now vs then delta\n readonly latestListingScore$: QueryMetricsResponseDelta;\n // Counts by time and source, and by time, source, and quality. Used for presence over time and score over time.\n readonly listingQuality$: QueryMetricsResponseDelta;\n // Count of accurate listing fields by field on current listings\n readonly listingMatchQuality$: Observable;\n readonly listingMatchQualityTotals$: Observable;\n // Counts by source, for filters, for presenting manage scoping\n readonly listingsBySource$: Observable;\n // Counts by source, presence/acccuracy ad field match, for filters, for presenting manage scoping\n readonly listingCounts$: Observable;\n // Counts by account group of listing accuracy\n readonly listingAccuracyCountsByLocation$: QueryMetricsResponseDelta;\n // Counts by source of listing accuracy\n readonly listingAccuracyCountsBySource$: QueryMetricsResponseDelta;\n\n readonly listingAccuracyTotals$: QueryMetricsResponseDelta;\n\n // Account Group: The ids in scope of filters, to be inflated and visualized.\n readonly accountGroup$: Observable;\n // Counts by Geo, for geo filter options\n readonly accountGroupGeography$: Observable;\n // Counts by Taxonomies (sets, not unnested), for taxonomy filter options\n readonly accountGroupTaxonomies$: Observable;\n\n // Social Connections: Service IDs, auth and token statuses. Filtered to authed and good token statuses.\n readonly socialConnections$: Observable;\n readonly facebookConnections$: Observable;\n\n readonly reviewRequests: QueryMetricsResponseDelta;\n readonly repReviewRequest$: QueryMetricsResponseDelta;\n\n readonly resourceIds$ = this.locationsService.currentLocation$.pipe(\n switchMap((location) => {\n if (isBrand(location)) {\n return this.brandsService.path$.pipe(\n map((path) => {\n return [\n new ResourceId({\n groupId: new GroupResourceId({\n groupPathNodes: path,\n }),\n }),\n ];\n }),\n );\n }\n if (isAccountGroup(location)) {\n return of([\n new ResourceId({\n businessId: new BusinessResourceId({\n businessId: location.accountGroupId,\n }),\n }),\n ]);\n }\n return of([]);\n }),\n );\n\n constructor(\n private readonly analyticsService: AnalyticsApiService,\n private readonly timeRangeService: TimeRangeService,\n private readonly filterService: FilterService,\n private readonly brandFiltersService: BrandFilterContainerService,\n private readonly reputationService: ReputationService,\n private readonly locationsService: LocationsService,\n private readonly brandsService: BrandsService,\n ) {\n this.brandsContext$ = combineLatest([\n this.resourceIds$,\n this.timeRangeService.utcAlignedDateRange$.pipe(filter(([startDate, endDate]) => !!startDate && !!endDate)),\n this.filterService.filters$,\n this.reputationService.brandSources$,\n this.brandFiltersService.selectedSourceIds$,\n this.timeRangeService.selectedTimeRangeKey$,\n ]).pipe(\n debounceTime(10),\n map(([resourceIds, [startDate, endDate], filters, activatedSources, selectedSourceIds, timeRange]) => {\n return new BrandContext(\n resourceIds,\n startDate,\n endDate,\n timeRange,\n filters,\n activatedSources,\n selectedSourceIds,\n ['source_id'],\n );\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n this.insights$s = new Map([\n [\n 'account_group_id',\n this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n this.buildGMBInsightsRequest,\n ['account_group_id'],\n ),\n ],\n ]);\n\n this.insightsTotals$ = new Map([\n [\n 'account_group_id',\n this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n this.buildGMBInsightsTotalsRequest,\n ['account_group_id'],\n ),\n ],\n ]);\n\n this.searchKeywords = this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n this.buildGMBSearchKeywordsRequest,\n ['account_group_id'],\n );\n\n const reviewContext$ = this.buildBrandContext$([\n 'partnerId',\n 'path',\n 'dateRange',\n 'timeRange',\n 'activeSources',\n 'selectedSourceIds',\n 'filters',\n ]);\n this.reviews$s = new Map([\n ['account_group_id', this.fetchMetric(reviewContext$, this.buildReviewsRequest, ['account_group_id'])],\n [\n 'account_group_id|allTime',\n this.fetchMetric(reviewContext$, this.buildAlltimeReviewsRequest, ['account_group_id']),\n ],\n ['source_id', this.fetchMetric(reviewContext$, this.buildReviewsRequest, ['source_id'])],\n [\n 'account_group_id|source_id',\n this.fetchMetric(reviewContext$, this.buildReviewsRequest, ['account_group_id', 'source_id']),\n ],\n [\n // 50 is an arbitrary limit, due to doing some processing and filtering on the front end the number of\n // rows received is larger then the rows displayed, so by setting the limit to 50 the queries tended to\n // be fast enough for the preview, while being large enough that the preview usually has a sufficient\n // quantity of data to look good.\n 'account_group_id|source_id|preview',\n this.fetchMetric(reviewContext$, this.buildReviewsRequest, ['account_group_id', 'source_id'], 50),\n ],\n ]);\n\n this.responseTimes$s = new Map([\n ['account_group_id', this.fetchMetric(reviewContext$, this.buildResponseTimeRequest, ['account_group_id'])],\n [\n 'account_group_id|allTime',\n this.fetchMetric(reviewContext$, this.buildAllTimeResponseTimeRequest, ['account_group_id']),\n ],\n ['source_id', this.fetchMetric(reviewContext$, this.buildResponseTimeRequest, ['source_id'])],\n ]);\n\n // Does not respond to *source* filters -- provided to give context to filter options which include sources\n this.reviewCounts$ = this.buildBrandContext$([\n 'partnerId',\n 'path',\n 'dateRange',\n 'timeRange',\n 'activeSources',\n 'filters',\n ]).pipe(\n switchMap((brandsContext: BrandContext) => {\n // Only offset the start so that we match\n const [startDate, endDate] = brandsContext.ReviewDateRange(true, true);\n return this.analyticsService.queryMetrics(\n new QueryMetricsRequest({\n partnerId,\n metricName: 'reviews',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveExclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n }),\n }),\n ],\n filter: brandsContext.buildFilter([brandsContext.buildActualActiveSourcesFilter()]),\n groupBy: new GroupBy({\n dimension: [\n { dimension: 'action_status' },\n { dimension: 'source_id' },\n { dimension: 'rating' },\n { dimension: 'edited' },\n { dimension: 'deleted_status' },\n ],\n groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n }),\n }),\n );\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n // Does not respond to filters -- provided to give context to filter options\n this.accountGroupGeography$ = this.buildBrandContext$(['partnerId', 'path']).pipe(\n switchMap((brandsContext: BrandContext) => {\n return this.analyticsService\n .queryMetrics(this.buildAccountGroupGeographyRequest(brandsContext))\n .pipe(startWith(null as QueryMetricsResponse));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n // Does not respond to filters -- provided to give context to filter options\n this.accountGroupTaxonomies$ = this.buildBrandContext$(['partnerId', 'path']).pipe(\n switchMap((brandsContext: BrandContext) => {\n return this.analyticsService\n .queryMetrics(this.buildAccountGroupTaxonomyRequest(brandsContext))\n .pipe(startWith(null as QueryMetricsResponse));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n this.accountGroup$ = this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'filters']).pipe(\n switchMap((brandsContext: BrandContext) => {\n return this.analyticsService\n .queryMetrics(this.buildAccountGroupRequest(brandsContext))\n .pipe(startWith(null as QueryMetricsResponse));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n this.listingScore$ = this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n this.buildListingScoreRequest,\n [],\n );\n\n this.latestListingScore$ = this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'filters']),\n this.buildLatestListingScoreRequest,\n [],\n );\n\n this.listingQuality$ = this.fetchMetric(\n this.buildBrandContext$([\n 'partnerId',\n 'path',\n 'dateRange',\n 'timeRange',\n 'activeSources',\n 'selectedSourceIds',\n 'filters',\n ]),\n this.buildListingQualityRequest,\n [],\n );\n\n this.listingMatchQuality$ = this.buildBrandContext$([\n 'partnerId',\n 'path',\n 'activeSources',\n 'selectedSourceIds',\n 'filters',\n ]).pipe(\n switchMap((brandsContext: BrandContext) => {\n return this.analyticsService\n .queryMetrics(\n this.buildListingMatchQualityRequest(\n brandsContext,\n new GroupBy({\n dimension: [\n new GroupByDimension({\n dimension: 'resource__account_group_id',\n }),\n new GroupByDimension({\n dimension: 'join__source_id',\n }),\n ],\n }),\n ),\n )\n .pipe(startWith(null as QueryMetricsResponse));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n this.listingMatchQualityTotals$ = this.buildBrandContext$([\n 'partnerId',\n 'path',\n 'activeSources',\n 'selectedSourceIds',\n 'filters',\n ]).pipe(\n switchMap((brandsContext: BrandContext) => {\n return this.analyticsService\n .queryMetrics(this.buildListingMatchQualityRequest(brandsContext, new GroupBy()))\n .pipe(startWith(null as QueryMetricsResponse));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n // Does not respond to *source* filters -- provided to give context to filter options which include sources\n this.listingCounts$ = this.fetchUnboundedMetric(\n this.buildBrandContext$(['partnerId', 'path', 'activeSources', 'filters']),\n this.buildListingCountRequest,\n );\n\n this.listingAccuracyCountsByLocation$ = this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'activeSources', 'filters', 'selectedSourceIds', 'dateRange']),\n this.buildBusinessDataListingCountRequest,\n ['resource__account_group_id'],\n );\n\n this.listingAccuracyCountsBySource$ = this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'activeSources', 'filters', 'selectedSourceIds', 'dateRange']),\n this.buildBusinessDataListingCountRequest,\n ['join__source_id'],\n );\n\n this.listingAccuracyTotals$ = this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'activeSources', 'filters', 'selectedSourceIds', 'dateRange']),\n this.buildBusinessDataListingCountRequest,\n [],\n );\n\n this.adIntelStats$ = this.fetchMetric(\n this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'timeRange', 'filters']),\n this.buildAdIntelStatsRequest,\n [],\n );\n\n // Does not react to filters -- provided solely for review response UI\n this.gmbConnections$ = this.buildBrandContext$(['partnerId', 'path']).pipe(\n switchMap((brandsContext: BrandContext) => {\n return this.analyticsService\n .queryMetrics(this.buildGMBLocationsRequest(brandsContext))\n .pipe(startWith(null as QueryMetricsResponse));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n // Does not react to filters -- provided solely for connection UI\n this.socialConnections$ = this.buildBrandContext$(['partnerId', 'path', 'dateRange']).pipe(\n switchMap((brandsContext) => {\n return this.analyticsService\n .queryMetrics(this.buildSocialRequest(brandsContext, true, false))\n .pipe(startWith(null as QueryMetricsResponse));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n this.facebookConnections$ = this.buildBrandContext$(['partnerId', 'path', 'dateRange']).pipe(\n switchMap((brandsContext) => {\n return this.analyticsService\n .queryMetrics(this.buildSocialRequest(brandsContext, true, true))\n .pipe(startWith(null as QueryMetricsResponse));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n const reviewsRequestContext$ = this.buildBrandContext$(['partnerId', 'path', 'dateRange', 'filters']);\n this.reviewRequests = this.fetchMetric(reviewsRequestContext$, this.buildReviewRequestsRequest, ['event_type']);\n this.repReviewRequest$ = this.fetchMetric(reviewsRequestContext$, this.buildRepReviewRequestsRequest, []);\n }\n\n fetchMetric(\n brandsContext$: Observable,\n requestBuilder: RequestBuilder,\n groupBy: string[],\n limit?: number,\n ): QueryMetricsResponseDelta {\n const current = brandsContext$.pipe(\n switchMap((brandsContext: BrandContext) => {\n const req = requestBuilder(brandsContext, true, groupBy);\n req.limit = limit;\n return this.analyticsService.queryMetrics(req);\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n const prev = brandsContext$.pipe(\n switchMap((brandsContext: BrandContext) => {\n const req = requestBuilder(brandsContext, false, groupBy);\n req.limit = limit;\n return this.analyticsService.queryMetrics(req);\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n return new QueryMetricsResponseDelta(current, prev);\n }\n\n fetchUnboundedMetric(\n brandsContext$: Observable,\n requestBuilder: RequestBuilder,\n ): Observable {\n return brandsContext$.pipe(\n switchMap((brandsContext: BrandContext) => {\n return this.analyticsService.queryMetrics(requestBuilder(brandsContext, true, []));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n }\n\n buildReviewsRequest(brandsContext: BrandContext, forCurrentPeriod: boolean, groupBy: string[]): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.ReviewDateRange(forCurrentPeriod);\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'reviews',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveExclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_one_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '1',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_two_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '2',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_three_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '3',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_four_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '4',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_five_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '5',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_none',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: 'none',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'responded',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n compositeFilter: {\n op: CompositeFilterOperator.OR,\n filters: [\n new Filter({\n fieldFilter: {\n dimension: 'action_status',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: 'owner-responded',\n },\n },\n }),\n new Filter({\n fieldFilter: {\n dimension: 'action_status',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: 'digital-agent-responded',\n },\n },\n }),\n ],\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'unresponded',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'action_status',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: 'action-required',\n },\n },\n }),\n }),\n }),\n ],\n filter: brandsContext.buildFilter([brandsContext.buildActiveSourcesFilter()]),\n groupBy: new GroupBy({\n dimension: groupBy\n .map((dim) => {\n return { dimension: dim };\n })\n .concat([{ dimension: 'published' }]),\n groupByOperator: GroupByOperator.OPERATOR_CUBE,\n }),\n alignment: Alignment.ALIGN_DELTA,\n alignmentPeriod: new AlignmentPeriod({\n // This data is not shown over time, so having less unnecessary buckets makes performance better, if\n // higher granularity is needed in the future this can be set to `brandsContext.alignmentPeriod()`\n calendar: AlignmentPeriodCalendar.CALENDAR_YEAR,\n }),\n });\n }\n\n buildAlltimeReviewsRequest(brandsContext: BrandContext, _: boolean, groupBy: string[]): QueryMetricsRequest {\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'reviews',\n resourceIds: brandsContext.resourceIds,\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_one_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '1',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_two_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '2',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_three_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '3',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_four_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '4',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_five_star',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: '5',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'rating_none',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'rating',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: 'none',\n },\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'responded',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n compositeFilter: {\n op: CompositeFilterOperator.OR,\n filters: [\n new Filter({\n fieldFilter: {\n dimension: 'action_status',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: 'owner-responded',\n },\n },\n }),\n new Filter({\n fieldFilter: {\n dimension: 'action_status',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: 'digital-agent-responded',\n },\n },\n }),\n ],\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'unresponded',\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n filter: new Filter({\n fieldFilter: {\n dimension: 'action_status',\n operator: FieldFilterOperator.EQUAL,\n value: {\n value: 'action-required',\n },\n },\n }),\n }),\n }),\n ],\n filter: brandsContext.buildFilter([brandsContext.buildActiveSourcesFilter()]),\n groupBy: new GroupBy({\n dimension: groupBy\n .map((dim) => {\n return { dimension: dim };\n })\n .concat([{ dimension: 'published' }]),\n groupByOperator: GroupByOperator.OPERATOR_CUBE,\n }),\n });\n }\n\n buildResponseTimeRequest(\n brandsContext: BrandContext,\n forCurrentPeriod: boolean,\n groupBy: string[],\n ): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.ReviewDateRange(forCurrentPeriod);\n const req = new QueryMetricsRequest({\n partnerId,\n metricName: 'review_response_time',\n resourceIds: brandsContext.resourceIds,\n });\n req.measures = [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'response_time',\n aggOp: MeasureAggregateOperator.AVG,\n alias: 'response_time',\n }),\n }),\n ];\n req.groupBy = new GroupBy({\n dimension: groupBy.map((dim) => {\n return { dimension: dim };\n }),\n });\n req.timeRange = inclusiveExclusive(startDate, endDate);\n return req;\n }\n\n buildAllTimeResponseTimeRequest(\n brandsContext: BrandContext,\n forCurrentPeriod: boolean,\n groupBy: string[],\n ): QueryMetricsRequest {\n const req = new QueryMetricsRequest({\n partnerId,\n metricName: 'review_response_time',\n resourceIds: brandsContext.resourceIds,\n });\n req.measures = [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'response_time',\n aggOp: MeasureAggregateOperator.AVG,\n alias: 'response_time',\n }),\n }),\n ];\n req.groupBy = new GroupBy({\n dimension: groupBy.map((dim) => {\n return { dimension: dim };\n }),\n });\n return req;\n }\n\n buildGMBInsightsRequest(\n brandsContext: BrandContext,\n forCurrentPeriod: boolean,\n groupBy: string[] = ['account_group_id'],\n ): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.GMBDateRange(forCurrentPeriod);\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'gmb_insights',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveExclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'views_maps',\n measure: 'views_maps',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'views_search',\n measure: 'views_search',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'actions_website',\n measure: 'actions_website',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'actions_phone',\n measure: 'actions_phone',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'actions_driving_directions',\n measure: 'actions_driving_directions',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'actions_bookings',\n measure: 'actions_bookings',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'actions_conversations',\n measure: 'actions_conversations',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'actions_food_orders',\n measure: 'actions_food_orders',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n ],\n filter: brandsContext.buildFilter(null),\n groupBy: new GroupBy({\n dimension: groupBy\n .map((dim) => {\n return { dimension: dim };\n })\n .concat([{ dimension: 'start_time' }]),\n groupByOperator: GroupByOperator.OPERATOR_CUBE,\n excludeCombination: [\n new GroupByExcludeCombination({\n dimensions: ['account_group_id', 'start_time'],\n }),\n ],\n }),\n alignment: Alignment.ALIGN_DELTA,\n alignmentPeriod: new AlignmentPeriod({\n calendar: brandsContext.alignmentPeriod(),\n }),\n });\n }\n\n buildGMBInsightsTotalsRequest(\n brandsContext: BrandContext,\n forCurrentPeriod: boolean,\n groupBy: string[] = ['account_group_id'],\n ): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.GMBDateRange(forCurrentPeriod);\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'gmb_insights',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveInclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'photos_count_customers',\n measure: 'photos_count_customers',\n aggOp: MeasureAggregateOperator.MAX,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n alias: 'photos_count_merchant',\n measure: 'photos_count_merchant',\n aggOp: MeasureAggregateOperator.MAX,\n }),\n }),\n ],\n filter: brandsContext.buildFilter(null),\n groupBy: new GroupBy({\n dimension: groupBy\n .map((dim) => {\n return { dimension: dim };\n })\n .concat([\n new GroupByDimension({\n limitDimension: {\n dimension: 'start_time',\n order: Order.ORDER_DESC,\n limit: 4,\n },\n }),\n ]),\n groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n }),\n });\n }\n\n buildGMBSearchKeywordsRequest(\n brandsContext: BrandContext,\n forCurrentPeriod: boolean,\n groupBy: string[] = ['account_group_id'],\n ): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.dateRange(forCurrentPeriod);\n\n const start = moment(startDate).utc().date(1);\n\n return new QueryMetricsRequest({\n partnerId: partnerId,\n metricName: 'gmb_search_keywords',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveInclusive(start.toDate(), endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'value',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n ],\n filter: brandsContext.buildFilter(null),\n groupBy: new GroupBy({\n dimension: groupBy\n .map((dim) => {\n return { dimension: dim };\n })\n .concat([{ dimension: 'month_date' }]),\n groupByOperator: GroupByOperator.OPERATOR_CUBE,\n excludeCombination: [\n new GroupByExcludeCombination({\n dimensions: ['account_group_id', 'month_date'],\n }),\n ],\n }),\n alignment: Alignment.ALIGN_DELTA,\n alignmentPeriod: new AlignmentPeriod({\n calendar: AlignmentPeriodCalendar.CALENDAR_MONTH,\n }),\n });\n }\n\n private buildAccountGroupGeographyRequest(brandContext: BrandContext): QueryMetricsRequest {\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'account_group',\n resourceIds: brandContext.resourceIds,\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n }),\n }),\n ],\n groupBy: new GroupBy({\n dimension: [\n { dimension: 'account_group__country' },\n { dimension: 'account_group__state' },\n { dimension: 'account_group__city' },\n ],\n groupByOperator: GroupByOperator.OPERATOR_ROLLUP,\n }),\n });\n }\n\n private buildAccountGroupTaxonomyRequest(brandContext: BrandContext): QueryMetricsRequest {\n // TODO: This could be bundled with the Geo query -- we want to count in multiple contexts'\n // TODO: We could accomplish this with a cube and exclude, but it would be good to get proper grouping sets support for it\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'account_group',\n resourceIds: brandContext.resourceIds,\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n }),\n }),\n ],\n groupBy: new GroupBy({\n dimension: [{ dimension: 'account_group__tax_ids' }],\n groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n }),\n });\n }\n\n private buildAccountGroupRequest(brandsContext: BrandContext): QueryMetricsRequest {\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'account_group',\n resourceIds: brandsContext.resourceIds,\n measures: [\n new Measure({\n measure: 'account_group__account_group_id',\n }),\n ],\n filter: brandsContext.buildFilter(null),\n });\n }\n\n private buildListingScoreRequest(brandsContext: BrandContext, curPeriod: boolean): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.dateRange(curPeriod);\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'listing_score',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveExclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'score',\n aggOp: MeasureAggregateOperator.AVG,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'score',\n aggOp: MeasureAggregateOperator.MAX,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n }),\n }),\n ],\n groupBy: new GroupBy({\n dimension: [\n new GroupByDimension({\n dimension: 'timestamp',\n }),\n ],\n groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n }),\n alignmentPeriod: new AlignmentPeriod({\n calendar: brandsContext.alignmentPeriod(),\n }),\n alignment: Alignment.ALIGN_EXACT,\n filter: brandsContext.buildFilter(null),\n });\n }\n\n private buildLatestListingScoreRequest(brandsContext: BrandContext, curPeriod: boolean): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.dateRange(curPeriod);\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'listing_score',\n resourceIds: brandsContext.resourceIds,\n timeRange: new DateRange({ start: startDate, end: endDate }),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'score',\n aggOp: MeasureAggregateOperator.MAX,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'source_list',\n aggOp: MeasureAggregateOperator.MAX,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'quality_list',\n aggOp: MeasureAggregateOperator.MAX,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'timestamp',\n aggOp: MeasureAggregateOperator.MAX,\n }),\n }),\n ],\n groupBy: new GroupBy({\n dimension: [\n new GroupByDimension({\n dimension: 'account_group_id',\n }),\n new GroupByDimension({\n limitDimension: {\n dimension: 'timestamp',\n order: Order.ORDER_DESC,\n limit: 1,\n },\n }),\n ],\n groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n }),\n filter: brandsContext.buildFilter(null),\n });\n }\n\n private buildListingQualityRequest(brandsContext: BrandContext, curPeriod: boolean): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.dateRange(curPeriod);\n\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'listing_presence_over_time',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveExclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n }),\n }),\n ],\n groupBy: new GroupBy({\n dimension: [\n new GroupByDimension({\n dimension: 'timestamp',\n }),\n new GroupByDimension({\n dimension: 'source',\n }),\n new GroupByDimension({\n dimension: 'quality',\n }),\n ],\n groupByOperator: GroupByOperator.OPERATOR_CUBE,\n excludeCombination: [\n // we need timestamp, source for presence overtime\n // we need timestamp, source, quality for score overtime, could use for accuracy over time\n // right now we're filtering on the frontend so all will require source, and time rollups aren't relevant\n new GroupByExcludeCombination({ dimensions: [] }),\n new GroupByExcludeCombination({ dimensions: ['source'] }),\n new GroupByExcludeCombination({ dimensions: ['quality'] }),\n new GroupByExcludeCombination({ dimensions: ['timestamp'] }),\n new GroupByExcludeCombination({\n dimensions: ['timestamp', 'quality'],\n }),\n new GroupByExcludeCombination({ dimensions: ['source', 'quality'] }),\n ],\n }),\n alignmentPeriod: new AlignmentPeriod({\n calendar: brandsContext.alignmentPeriod(),\n }),\n alignment: Alignment.ALIGN_EXACT,\n // Filter doesn't seem to effect speed but will reduce response size in some cases.\n // Results are also filtered when parsing downstream\n filter: brandsContext.buildFilter([brandsContext.buildActiveSourcesFilter('source')]),\n });\n }\n\n private buildListingMatchQualityRequest(brandsContext: BrandContext, groupBy: GroupBy): QueryMetricsRequest {\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'business_data_listings',\n resourceIds: brandsContext.resourceIds,\n filter: new Filter({\n compositeFilter: {\n op: CompositeFilterOperator.AND,\n filters: [\n brandsContext.buildActiveSourcesFilter('join__source_id'),\n new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'join__source_id',\n operator: FieldFilterOperator.NOT_EQUAL,\n value: {\n value: '12000',\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n },\n }),\n }),\n ],\n },\n }),\n measures: buildListingCountMeasures(),\n groupBy: groupBy,\n timeRange: { end: new Date() },\n });\n }\n\n private buildListingCountRequest(brandsContext: BrandContext): QueryMetricsRequest {\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'business_data_listings',\n resourceIds: brandsContext.resourceIds,\n filter: new Filter({\n compositeFilter: {\n op: CompositeFilterOperator.AND,\n filters: [\n brandsContext.buildFilter([brandsContext.buildActiveSourcesFilter('join__source_id')]),\n new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'join__source_id',\n operator: FieldFilterOperator.NOT_EQUAL,\n value: {\n value: '12000',\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n },\n }),\n }),\n ],\n },\n }),\n measures: buildListingCountMeasures(),\n groupBy: new GroupBy({\n dimension: [\n new GroupByDimension({\n dimension: 'join__source_id',\n }),\n ],\n }),\n timeRange: { end: new Date() },\n });\n }\n\n private buildBusinessDataListingCountRequest(\n brandsContext: BrandContext,\n forCurrentPeriod: boolean,\n groupBy: string[],\n ): QueryMetricsRequest {\n const [, endDate] = brandsContext.dateRange(forCurrentPeriod);\n\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'business_data_listings',\n resourceIds: brandsContext.resourceIds,\n timeRange: new DateRange({\n end: dayjs(endDate).toDate(),\n }),\n filter: brandsContext.buildFilter([\n brandsContext.buildActiveSourcesFilter('join__source_id'),\n new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'join__source_id',\n operator: FieldFilterOperator.NOT_EQUAL,\n value: {\n value: '12000',\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n },\n }),\n }),\n ]),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'accurate',\n filter: {\n compositeFilter: {\n filters: [isAccurateFilter, isVerifiedFilter],\n op: CompositeFilterOperator.OR,\n },\n },\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'inaccurate',\n filter: new Filter({\n compositeFilter: {\n filters: [isInaccurateFilter, isNotVerifiedFilter],\n op: CompositeFilterOperator.AND,\n },\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'missing',\n filter: isMissingFilter,\n }),\n }),\n ],\n groupBy: new GroupBy({\n dimension: groupBy.map((dim) => {\n return { dimension: dim };\n }),\n }),\n });\n }\n\n buildGMBLocationsRequest(brandsContext: BrandContext): QueryMetricsRequest {\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'gmb_locations_connected',\n resourceIds: brandsContext.resourceIds,\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: '*',\n aggOp: MeasureAggregateOperator.COUNT,\n }),\n }),\n ],\n groupBy: new GroupBy({\n dimension: [\n new GroupByDimension({\n dimension: 'account_group_id',\n }),\n ],\n groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n }),\n });\n }\n\n private buildAdIntelStatsRequest(brandsContext: BrandContext, curPeriod: boolean): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.adIntelDateRange(curPeriod);\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'advertising_intel_channel_stats',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveExclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'impressions',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'clicks',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'conversions',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'spend_micros',\n aggOp: MeasureAggregateOperator.SUM,\n }),\n }),\n ],\n groupBy: new GroupBy({\n dimension: [\n new GroupByDimension({\n dimension: 'account_group_id',\n }),\n new GroupByDimension({\n dimension: 'time_stamp',\n }),\n ],\n groupByOperator: GroupByOperator.OPERATOR_CUBE,\n excludeCombination: [\n new GroupByExcludeCombination({\n dimensions: ['account_group_id', 'time_stamp'],\n }),\n ],\n }),\n alignmentPeriod: new AlignmentPeriod({\n calendar: brandsContext.alignmentPeriod(),\n }),\n alignment: Alignment.ALIGN_DELTA,\n filter: brandsContext.buildFilter(),\n });\n }\n\n private buildSocialRequest(\n brandsContext: BrandContext,\n groupByAccount: boolean,\n fbPageOnly: boolean,\n ): QueryMetricsRequest {\n const measures = [new Measure({ measure: 'account_group_id' })];\n let groupBy = null;\n if (!groupByAccount) {\n measures.concat([\n new Measure({ measure: 'social_service_id' }),\n new Measure({ measure: 'token_broken' }),\n new Measure({ measure: 'authed_by_user' }),\n ]);\n } else {\n groupBy = new GroupBy({\n dimension: [\n new GroupByDimension({\n dimension: 'account_group_id',\n }),\n ],\n groupByOperator: GroupByOperator.OPERATOR_GROUP_BY,\n });\n }\n const filters = [\n new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'token_broken',\n value: new TypedValue({\n value: false,\n valueType: PropertyType.PROPERTY_TYPE_BOOL,\n }),\n operator: FieldFilterOperator.EQUAL,\n }),\n }),\n new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'authed_by_user',\n value: new TypedValue({\n value: true,\n valueType: PropertyType.PROPERTY_TYPE_BOOL,\n }),\n operator: FieldFilterOperator.EQUAL,\n }),\n }),\n ];\n if (fbPageOnly) {\n filters.push(\n new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'is_facebook_page',\n value: new TypedValue({\n value: true,\n valueType: PropertyType.PROPERTY_TYPE_BOOL,\n }),\n operator: FieldFilterOperator.EQUAL,\n }),\n }),\n );\n }\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'social_connections',\n measures,\n resourceIds: brandsContext.resourceIds,\n filter: new Filter({\n compositeFilter: new CompositeFilter({\n op: CompositeFilterOperator.AND,\n filters: filters,\n }),\n }),\n groupBy,\n });\n }\n\n private buildReviewRequestsRequest(\n brandsContext: BrandContext,\n forCurrentPeriod: boolean,\n groupBy: string[],\n ): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.dateRange(forCurrentPeriod);\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'review_request_email_performance',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveExclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'notification_id',\n aggOp: MeasureAggregateOperator.COUNT,\n }),\n }),\n ],\n filter: brandsContext.buildFilter(brandsContext.filters),\n groupBy: new GroupBy({\n dimension: groupBy.map((dim) => {\n return { dimension: dim };\n }),\n }),\n });\n }\n\n private buildRepReviewRequestsRequest(brandsContext: BrandContext, forCurrentPeriod: boolean): QueryMetricsRequest {\n const [startDate, endDate] = brandsContext.dateRange(forCurrentPeriod);\n return new QueryMetricsRequest({\n partnerId,\n metricName: 'review_request_metrics',\n resourceIds: brandsContext.resourceIds,\n timeRange: inclusiveExclusive(startDate, endDate),\n measures: [\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'status',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'requests_sent',\n filter: new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'status',\n operator: FieldFilterOperator.EQUAL,\n value: new TypedValue({\n value: ['Clicked', 'Opened', 'Sent', 'Delivered'],\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n }),\n operatorFunction: FieldFilterOperatorFunction.ANY,\n }),\n }),\n }),\n }),\n new Measure({\n aggregate: new MeasureAggregate({\n measure: 'status',\n aggOp: MeasureAggregateOperator.COUNT,\n alias: 'links_clicked',\n filter: new Filter({\n fieldFilter: new FieldFilter({\n dimension: 'status',\n operator: FieldFilterOperator.EQUAL,\n value: new TypedValue({\n value: ['Clicked', 'Opened'],\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n }),\n operatorFunction: FieldFilterOperatorFunction.ANY,\n }),\n }),\n }),\n }),\n ],\n filter: brandsContext.buildFilter(brandsContext.filters),\n });\n }\n\n public buildBrandContext$(fieldMask: string[]): Observable {\n const fieldMaskObj = fieldMask.reduce((o, f) => {\n o[f] = true;\n return o;\n }, {});\n return combineLatest([\n this.resourceIds$,\n fieldMaskObj['dateRange']\n ? this.timeRangeService.utcAlignedDateRange$.pipe(filter(([startDate, endDate]) => !!startDate && !!endDate))\n : of([null, null]),\n fieldMaskObj['timeRange'] ? this.timeRangeService.selectedTimeRangeKey$ : of(null),\n fieldMaskObj['selectedSourceIds'] ? this.brandFiltersService.selectedSourceIds$ : of(null),\n fieldMaskObj['activeSources'] ? this.reputationService.brandSources$ : of(null),\n fieldMaskObj['filters'] ? this.filterService.filters$ : of(null),\n ]).pipe(\n debounceTime(10),\n map(([resourceIds, [startDate, endDate], timeRange, selectedSourceIds, activatedSources, filters]) => {\n return new BrandContext(\n resourceIds,\n startDate,\n endDate,\n timeRange,\n filters,\n activatedSources,\n selectedSourceIds,\n [],\n );\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n }\n}\n\nexport function fillByTime(\n stats: StatByTime[],\n startDate: Date,\n endDate: Date,\n defaultStat: (startDate: Date) => StatByTime,\n): StatByTime[] {\n // Exit early if we're missing any of the pieces required\n if (!stats || !startDate || !endDate) {\n return stats;\n }\n // Figure out the expected times\n const granularity = getGranularityForRange(startDate, endDate);\n const expectedTimeBucketStarts = generateDates(startDate, endDate, granularity);\n\n // Build map of stats by time\n const statsByTime = stats.reduce((obj, stat) => {\n obj[stat.localAlignedTime.valueOf()] = stat;\n return obj;\n }, {});\n\n // Build filled stats by plucking from map or building a default with provided function\n return expectedTimeBucketStarts.map((start) => {\n return statsByTime[start.valueOf()] || defaultStat(start);\n });\n}\n\nexport function inclusiveExclusive(start: Date, end: Date): DateRange {\n return new DateRange({ start: start, endExclusive: end });\n}\n\nexport function inclusiveInclusive(start: Date, end: Date): DateRange {\n return new DateRange({ start: start, end: end });\n}\n", "import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { QueryMetricsResponse } from '@vendasta/multi-location-analytics';\nimport { TaxonomyOption, TaxonomyService } from '@vendasta/taxonomy';\nimport { Observable, combineLatest, forkJoin, of } from 'rxjs';\nimport { filter, map, shareReplay, switchMap } from 'rxjs/operators';\nimport { AccountGroup } from '../account-group';\nimport { LocationsService } from '../locations';\nimport { Row, rowify } from './helpers';\nimport { QueryService } from './query.service';\n\nclass TaxonomyOptionWithCount {\n constructor(public taxonomyOption: TaxonomyOption, public numLocations: number) {}\n}\n\nclass GeoWithCount {\n constructor(\n public countryCode: string,\n public country: string,\n public state: string,\n public stateCode: string,\n public city: string,\n public numLocations: number,\n ) {}\n}\n\nclass Country {\n constructor(public countryCode: string, public countryName: string, public stateCodeToName: Map) {}\n\n stateName(stateCode: string): string {\n const val = this.stateCodeToName.get(stateCode);\n if (!val) {\n return stateCode;\n }\n return val;\n }\n}\n\nclass CountryDetails {\n constructor(public countryCodeToCountry: Map) {}\n\n public countryName(countryCode: string): string {\n const val = this.countryCodeToCountry.get(countryCode);\n if (!val) {\n return countryCode;\n }\n return val.countryName;\n }\n\n public stateName(countryCode: string, stateCode: string): string {\n const val = this.countryCodeToCountry.get(countryCode);\n if (!val) {\n return stateCode;\n }\n return val.stateName(stateCode);\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AccountGroupMetricService {\n readonly filteredAccountGroupIdsForPath$: Observable>;\n readonly filteredLocationsForPath$: Observable<{\n [key: string]: AccountGroup;\n }>;\n\n readonly allTaxonomyOptions$: Observable;\n private brandTaxonomyRows$: Observable;\n readonly brandTaxonomyOptions$: Observable>;\n\n constructor(\n private queryService: QueryService,\n private httpClient: HttpClient,\n private locationsService: LocationsService,\n private taxonomyService: TaxonomyService,\n ) {\n this.filteredAccountGroupIdsForPath$ = this.getAccountGroupIds$();\n\n this.filteredLocationsForPath$ = combineLatest([\n this.locationsService.currentAccountGroups$,\n this.filteredAccountGroupIdsForPath$,\n ]).pipe(\n map(([locations, filteredAgids]) => {\n if (locations == null || filteredAgids == null) {\n return null;\n }\n const filtered = {};\n Object.keys(locations)\n .map((k) => locations[k])\n .forEach((ag: AccountGroup) => {\n if (!filteredAgids.has(ag.accountGroupId)) {\n return;\n }\n filtered[ag.accountGroupId] = ag;\n });\n return filtered;\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n this.allTaxonomyOptions$ = this.taxonomyService\n .getTaxonomyIds()\n .pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n this.brandTaxonomyRows$ = this.queryService.accountGroupTaxonomies$.pipe(\n map((r: QueryMetricsResponse) => {\n if (r == null) {\n return null;\n }\n return rowify(r.metricResults[0]);\n }),\n );\n this.brandTaxonomyOptions$ = combineLatest([this.allTaxonomyOptions$, this.brandTaxonomyRows$]).pipe(\n map(([allTax, brandRows]) => {\n if (!allTax || !brandRows) {\n return null;\n }\n const allTaxMap = new Map();\n allTax.forEach((tax) => {\n allTaxMap.set(tax.id, tax);\n });\n const brandTaxMap = new Map();\n // TODO: Flip this so that we're only getting/inflating what we have? (probably way faster/lighter?)\n brandRows.forEach((row) => {\n // Some accounts have the same taxId multiple times, so reduce to the set before counting\n Array.from(new Set(row.values[0])).forEach((taxId) => {\n const existing = brandTaxMap.get(taxId);\n if (existing) {\n // Update count\n existing.numLocations += +row.measures[0];\n brandTaxMap.set(taxId, existing);\n } else {\n // Get tax and set count\n brandTaxMap.set(taxId, new TaxonomyOptionWithCount(allTaxMap.get(taxId), +row.measures[0]));\n }\n });\n });\n return brandTaxMap;\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n }\n\n private getAccountGroupIds$(): Observable> {\n return this.queryService.accountGroup$.pipe(\n filter((r) => !!r),\n map((r: QueryMetricsResponse) => {\n const s = new Set();\n if (r) {\n rowify(r.metricResults[0]).forEach((row) => {\n s.add(row.measures[0][0]);\n });\n }\n return s;\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n }\n\n public getGeographicBreakdown$(): Observable {\n const rows$ = this.queryService.accountGroupGeography$.pipe(\n map((r: QueryMetricsResponse) => {\n if (r == null) {\n return null;\n }\n return rowify(r.metricResults[0]);\n }),\n );\n const countyInfo$ = rows$.pipe(\n switchMap((i) => {\n if (!i) {\n return of(null);\n }\n const countries = new Set();\n i.forEach((c) => {\n if (!c.values[0]) {\n return;\n }\n countries.add(c.values[0]);\n });\n return this.getCountryAndStateInformation(Array.from(countries.keys()));\n }),\n );\n\n return combineLatest([rows$, countyInfo$]).pipe(\n map(([rows, countryInfo]: [Row[], CountryDetails]) => {\n if (!rows || !countryInfo) {\n return [];\n }\n return rows.map(function (dataRow: Row): GeoWithCount {\n return new GeoWithCount(\n dataRow.values[0],\n countryInfo.countryName(dataRow.values[0]),\n countryInfo.stateName(dataRow.values[0], dataRow.values[1]),\n dataRow.values[1],\n dataRow.values[2],\n Number(dataRow.measures[0][0]),\n );\n });\n }),\n );\n }\n\n private getCountryAndStateInformation(countries: string[]): Observable {\n return forkJoin(\n countries.map((c) => {\n return this.httpClient\n .get('https://www.gstatic.com/chrome/autofill/libaddressinput/chromium-i18n/ssl-address/data/' + c)\n .pipe(\n map((r) => {\n const subKeys = String(r['sub_keys']).split('~');\n const subNames = String(r['sub_names']).split('~');\n\n const states = new Map();\n subKeys.forEach(function (key, i): void {\n states.set(key, subNames[i]);\n });\n\n return new Country(String(r['key']), capitalizeFirstLetters(String(r['name'])), states);\n }),\n );\n }),\n ).pipe(\n map((r) => {\n const m = new Map();\n r.forEach((c) => {\n m.set(c.countryCode, c);\n });\n return new CountryDetails(m);\n }),\n );\n }\n}\n\nfunction capitalizeFirstLetters(a: string): string {\n return a\n .split(' ')\n .map((c) => c.charAt(0).toUpperCase() + c.slice(1).toLowerCase())\n .join(' ');\n}\n", "import { Component, Inject, OnInit } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Observable } from 'rxjs';\nimport { map, startWith, take } from 'rxjs/operators';\nimport {\n CITIES_LABEL,\n COUNTRIES_LABEL,\n FilterDisplaySettings,\n Location,\n LocationGroup,\n STATEPROV_LABEL,\n} from '../brand-filter-container.service';\n\nexport interface GeographyData {\n availableLocations: LocationGroup[];\n selectedCountries: Location[];\n selectedStateProvinces: Location[];\n selectedCities: Location[];\n filterSettings: FilterDisplaySettings;\n}\n\n@Component({\n selector: 'bc-brand-geography-dialog',\n templateUrl: './brand-geography-dialog.component.html',\n styleUrls: ['./brand-geography-dialog.component.scss'],\n standalone: false,\n})\nexport class BrandGeographyDialogComponent implements OnInit {\n locationControl = new UntypedFormControl();\n\n filteredLocations$: Observable;\n\n selectedOptions: string[] = [];\n selectedCountries: Location[] = [];\n selectedStateProvinces: Location[] = [];\n selectedCities: Location[] = [];\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data: GeographyData,\n ) {}\n\n ngOnInit(): void {\n this.selectedCountries = this.data.selectedCountries;\n this.selectedStateProvinces = this.data.selectedStateProvinces;\n this.selectedCities = this.data.selectedCities;\n this.updateSelectedInformation();\n this.filteredLocations$ = this.locationControl.valueChanges.pipe(\n startWith(''),\n map((value) => this.filterLocationGroup(value)),\n );\n }\n\n private filterLocationGroup(value: string): any[] {\n if (!value) {\n value = '';\n }\n return this.data.availableLocations\n .map((group) => ({\n name: group.name,\n options: this.filterLocations(group.options, value),\n }))\n .filter((group) => group.options.length > 0);\n }\n\n private filterLocations(locations: Location[], value: string): any[] {\n const filterValue = value.toString().toLowerCase();\n return locations.filter((location) => {\n return (\n location.name.toLowerCase().indexOf(filterValue) > -1 &&\n this.selectedOptions.indexOf(location.id) === -1 &&\n !this.selectedOptions.some((r) => location.parent.includes(r))\n );\n });\n }\n\n addLocationOpt(event: MatAutocompleteSelectedEvent): void {\n // Find the selected option\n this.filteredLocations$\n .pipe(\n take(1),\n map((groups) => {\n for (const group of groups) {\n for (const location of group.options) {\n if (location.id === event.option.value.id) {\n if (location.parent.length === event.option.value.parent.length) {\n let sameParents = true;\n let i = 0;\n while (i < location.parent.length) {\n if (location.parent[i] !== event.option.value.parent[i]) {\n sameParents = false;\n break;\n }\n i = i + 1;\n }\n if (sameParents) {\n return [group, location];\n }\n }\n }\n }\n }\n }),\n )\n .subscribe(([group, location]) => {\n this.addLocation(group.name, location.id);\n });\n }\n\n addLocation(locationType: string, locationName?: string): void {\n const locationValue = locationName ? locationName : this.locationControl.value.trim();\n if (locationValue !== '') {\n this.locationControl.setValue('');\n\n if (locationType === COUNTRIES_LABEL) {\n const countryObject = this.data.availableLocations\n .filter((locationGroup) => locationGroup.name === COUNTRIES_LABEL)\n .map((locationGroup) =>\n locationGroup.options.filter((country) => country.id.toLowerCase() === locationValue.toLowerCase()),\n )[0][0];\n this.selectedCountries.push(countryObject);\n }\n if (locationType === STATEPROV_LABEL) {\n const stateprovObject = this.data.availableLocations\n .filter((locationGroup) => locationGroup.name === STATEPROV_LABEL)\n .map((locationGroup) =>\n locationGroup.options.filter((country) => country.id.toLowerCase() === locationValue.toLowerCase()),\n )[0][0];\n this.selectedStateProvinces.push(stateprovObject);\n }\n if (locationType === CITIES_LABEL) {\n const cityObject = this.data.availableLocations\n .filter((locationGroup) => locationGroup.name === CITIES_LABEL)\n .map((locationGroup) =>\n locationGroup.options.filter((country) => country.id.toLowerCase() === locationValue.toLowerCase()),\n )[0][0];\n this.selectedCities.push(cityObject);\n }\n this.updateSelectedInformation();\n }\n }\n\n removeLocation(locationType: number, locationName: string): void {\n if (locationType === 1) {\n this.selectedCountries = this.selectedCountries.filter((country) => country.id !== locationName);\n }\n if (locationType === 2) {\n this.selectedStateProvinces = this.selectedStateProvinces.filter((statProv) => statProv.id !== locationName);\n }\n if (locationType === 3) {\n this.selectedCities = this.selectedCities.filter((city) => city.id !== locationName);\n }\n this.updateSelectedInformation();\n }\n\n private updateSelectedInformation(): void {\n const selectedCountries = [...this.selectedCountries.map((country) => country.id)];\n this.selectedStateProvinces = this.selectedStateProvinces.filter(\n (location) => !selectedCountries.some((r) => location.parent.includes(r)),\n );\n const selectedStateProvinces = [...this.selectedStateProvinces.map((stateProv) => stateProv.id)];\n this.selectedCities = this.selectedCities.filter(\n (city) =>\n !selectedStateProvinces.some((r) => city.parent.includes(r)) &&\n !selectedCountries.some((r) => city.parent.includes(r)),\n );\n\n this.selectedOptions = [\n ...selectedCountries,\n ...selectedStateProvinces,\n ...this.selectedCities.map((city) => city.id),\n ];\n this.locationControl.setValue('');\n }\n\n close(newData: boolean): void {\n if (!newData) {\n this.dialogRef.close();\n return;\n }\n this.dialogRef.close({\n selectedCountries: this.selectedCountries,\n selectedStateProvinces: this.selectedStateProvinces,\n selectedCities: this.selectedCities,\n });\n }\n}\n", "\n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GEOGRAPHY' | translate }}\n\n\n
\n

\n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.LOCATIONS_IN_FILTER' | translate }}\n

\n @if (selectedCountries.length > 0) {\n
\n

\n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.COUNTRIES' | translate }}\n

\n
\n @for (data of selectedCountries; track data) {\n
\n {{ data.name }}\n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT' | translate: { count: data.locationCount } }}\n \n \n
\n }\n
\n
\n }\n @if (selectedStateProvinces.length > 0) {\n
\n

\n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.REGION' | translate }}\n

\n
\n @for (data of selectedStateProvinces; track data) {\n
\n {{ data.name }}\n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT' | translate: { count: data.locationCount } }}\n \n \n
\n }\n
\n
\n }\n @if (selectedCities.length > 0) {\n
\n

\n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.GEOGRAPHY.CITIES' | translate }}\n

\n
\n @for (data of selectedCities; track data) {\n
\n {{ data.name }}\n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT' | translate: { count: data.locationCount } }}\n \n \n
\n }\n
\n
\n }\n
\n
\n \n \n \n @for (group of filteredLocations$ | async; track group) {\n \n @for (option of group.options; track option) {\n \n {{ option.name }}\n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT' | translate: { count: option.locationCount } }}\n \n \n }\n \n }\n \n \n
\n
\n\n\n \n \n\n", "import { Component, OnInit, Inject } from '@angular/core';\nimport { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntypedFormControl } from '@angular/forms';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map, startWith, take } from 'rxjs/operators';\nimport { FilterDisplaySettings } from '../brand-filter-container.service';\nimport { BrandsService } from '../../brands.service';\nimport { Group } from '../../brands.api.service';\n\nexport interface GroupData {\n selectedGroup: GroupWithDisplayName;\n filterSettings: FilterDisplaySettings;\n}\n\nexport class GroupWithDisplayName {\n constructor(\n public name: string,\n public group: Group,\n ) {}\n}\n\n@Component({\n selector: 'bc-brand-group-dialog',\n templateUrl: './brand-group-dialog.component.html',\n styleUrls: ['./brand-group-dialog.component.scss'],\n standalone: false,\n})\nexport class BrandGroupDialogComponent implements OnInit {\n groupControl = new UntypedFormControl();\n\n filteredOptions$: Observable;\n\n selectedGroup: GroupWithDisplayName;\n options$: Observable;\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data: GroupData,\n private brandsService: BrandsService,\n ) {\n this.selectedGroup = data.selectedGroup;\n this.options$ = this.brandsService.allGroups$.pipe(\n map((groups) => {\n if (!groups) {\n return [];\n }\n const paths = new Map();\n groups.forEach((g) => {\n paths.set(g.pathNodes.join('|'), g);\n });\n\n return groups\n .map((g) => {\n return new GroupWithDisplayName(this.buildGroupName(paths, g), g);\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n }),\n );\n }\n\n buildGroupName(groupsByPath: Map, group: Group): string {\n const parent = groupsByPath.get(group.pathNodes.slice(0, -1).join('|'));\n if (!parent) {\n return group.name;\n } else {\n const parentName = this.buildGroupName(groupsByPath, parent);\n return `${parentName} / ${group.name}`;\n }\n }\n\n ngOnInit(): void {\n this.filteredOptions$ = combineLatest([this.groupControl.valueChanges.pipe(startWith('')), this.options$]).pipe(\n map(([value, options]) => this._filter(value, options)),\n );\n }\n\n private _filter(value: string, options: GroupWithDisplayName[]): GroupWithDisplayName[] {\n const filterValue = value.toLowerCase();\n\n return options.filter((option) => option.name.toLowerCase().includes(filterValue));\n }\n\n close(newData: boolean): void {\n if (!newData) {\n this.dialogRef.close();\n return;\n }\n this.dialogRef.close({\n selectedGroup: this.selectedGroup,\n });\n }\n\n setGroupOpt(event: MatAutocompleteSelectedEvent): void {\n // Find the selected option\n this.filteredOptions$\n .pipe(\n take(1),\n map((options) => {\n for (const option of options) {\n if (option.name === event.option.value) {\n return option;\n }\n }\n }),\n )\n .subscribe((option) => {\n this.setGroup(option);\n });\n }\n\n setGroup(id: any): void {\n this.selectedGroup = id;\n }\n}\n", "\n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GROUP' | translate }}\n\n\n
\n \n \n \n @for (option of filteredOptions$ | async; track option) {\n \n {{ option.name }}\n \n }\n \n \n
\n
\n\n \n \n\n", "import { Component, Inject, OnInit } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { BehaviorSubject, Observable, combineLatest } from 'rxjs';\nimport { debounceTime, map, tap } from 'rxjs/operators';\nimport { getLocation } from '../../../account-group/account-group';\nimport { LocationsService } from '../../../locations';\nimport { BrandFilterContainerService, FilterDisplaySettings } from '../brand-filter-container.service';\n\nexport interface LocationData {\n filterSettings: FilterDisplaySettings;\n}\n\nexport interface LocationDisplay {\n accountGroupId: string;\n name: string;\n address: string;\n}\n\n@Component({\n selector: 'bc-brand-geography-dialog',\n templateUrl: './brand-location-dialog.component.html',\n styleUrls: ['./brand-location-dialog.component.scss'],\n standalone: false,\n})\nexport class BrandLocationDialogComponent implements OnInit {\n accountGroupFilterControl = new UntypedFormControl();\n\n options$: Observable;\n filteredOptions$: Observable;\n\n selectedOptionsDetails$: Observable;\n selectedOptions$$: BehaviorSubject = new BehaviorSubject([]);\n selectedOptions$: Observable = this.selectedOptions$$.asObservable();\n\n noResultsFound = false;\n\n constructor(\n public dialogRef: MatDialogRef,\n private brandFiltersService: BrandFilterContainerService,\n @Inject(MAT_DIALOG_DATA) public data: LocationData,\n private locationsService: LocationsService,\n ) {}\n\n ngOnInit(): void {\n this.selectedOptions$$.next(this.brandFiltersService.getAccountGroupIds());\n\n this.options$ = this.locationsService.currentAccountGroups$.pipe(\n map((locationMap) => {\n if (!locationMap) {\n return [];\n }\n this.accountGroupFilterControl.setValue('');\n return Object.keys(locationMap)\n .map((accountGroupId) => {\n const accountGroup = locationMap[accountGroupId];\n return {\n accountGroupId,\n name: accountGroup.companyName,\n address: getLocation(accountGroup),\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n }),\n );\n\n this.filteredOptions$ = combineLatest([\n this.options$,\n this.accountGroupFilterControl.valueChanges,\n this.selectedOptions$,\n ]).pipe(\n debounceTime(500),\n map(([options, value, selectedOptions]) => this._filter(options, value, selectedOptions)),\n tap((options) => {\n this.noResultsFound = options.length === 0;\n }),\n );\n\n this.selectedOptionsDetails$ = combineLatest([this.options$, this.selectedOptions$]).pipe(\n map(([options, selected]) => {\n return options.filter((o) => selected.indexOf(o.accountGroupId) > -1);\n }),\n );\n }\n\n private _filter(options: LocationDisplay[], value: string, selectedOptions: string[]): LocationDisplay[] {\n if (value.trim() === '') {\n return options.filter((option) => selectedOptions.indexOf(option.accountGroupId) === -1);\n }\n const filterValue = value.toUpperCase();\n return options\n .filter(\n (option) =>\n option.name.toUpperCase().includes(filterValue) || option.address.toUpperCase().includes(filterValue),\n )\n .filter((option) => selectedOptions.indexOf(option.accountGroupId) === -1);\n }\n\n selectFilterLocation(option: HTMLElement, accountGroupId: string): void {\n option.remove();\n const currentSelected = this.selectedOptions$$.getValue();\n if (currentSelected.indexOf(accountGroupId) === -1) {\n currentSelected.push(accountGroupId);\n }\n this.selectedOptions$$.next(currentSelected);\n }\n\n removeLocation(accountGroupId: string): void {\n this.selectedOptions$$.next(this.selectedOptions$$.getValue().filter((o) => o !== accountGroupId));\n }\n\n close(newData: boolean): void {\n if (!newData) {\n this.dialogRef.close();\n return;\n }\n this.dialogRef.close({\n selectedAccountGroupIds: this.selectedOptions$$.getValue(),\n });\n }\n}\n", "\n {{ 'COMMON.LOCATION' | translate }}\n\n\n\n
\n \n \n \n \n @if (filteredOptions$ | async; as options) {\n @if (noResultsFound && !!accountGroupFilterControl.value && accountGroupFilterControl.value.trim() !== '') {\n
\n {{ 'BRANDS.LOCATIONS_MODAL.NO_RESULTS' | translate }}\n
\n }\n
\n
\n
\n
{{ option.name }}
\n
{{ option.address }}
\n
\n
\n
\n \n
\n
\n }\n
\n
\n
\n @if (selectedOptionsDetails$ | async; as options) {\n
\n \n {{ 'BRANDS.LOCATIONS_MODAL.SELECTED_LOCATIONS' | translate }}\n \n @if (options.length > 0) {\n \n ({{ options.length }} {{ (options.length === 1 ? 'COMMON.LOCATION' : 'COMMON.LOCATIONS') | translate }})\n \n }\n
\n
\n @if (options.length === 0) {\n
\n {{ 'BRANDS.LOCATIONS_MODAL.NO_LOCATIONS' | translate }}\n
\n }\n @for (item of options; track item) {\n \n
\n
{{ item.name }}
\n
{{ item.address }}
\n
\n
\n cancel\n
\n
\n }\n
\n }\n
\n
\n\n\n \n \n\n", "import { Component, OnInit, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntypedFormControl } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { FilterDisplaySettings, BrandFilterContainerService } from '../brand-filter-container.service';\nimport { BrandsService } from '../../brands.service';\n\nexport interface Data {\n selectedSourceIds: string[];\n filterSettings: FilterDisplaySettings;\n}\n\n@Component({\n selector: 'bc-brand-geography-dialog',\n templateUrl: './brand-source-dialog.component.html',\n styleUrls: ['./brand-source-dialog.component.scss'],\n standalone: false,\n})\nexport class BrandSourceDialogComponent implements OnInit {\n formControl = new UntypedFormControl();\n\n options$: Observable;\n\n constructor(\n private brandService: BrandsService,\n public dialogRef: MatDialogRef,\n private readonly brandFiltersService: BrandFilterContainerService,\n @Inject(MAT_DIALOG_DATA) public data: Data,\n ) {}\n\n ngOnInit(): void {\n this.formControl.setValue(this.data.selectedSourceIds);\n\n this.options$ = this.brandFiltersService.sourceOptions$;\n }\n\n close(newData: boolean): void {\n if (!newData) {\n this.dialogRef.close();\n return;\n }\n this.dialogRef.close({\n selectedSourceIds: this.formControl.value || [],\n });\n }\n}\n", "\n {{ 'COMMON.REVIEW_OR_LISTING_SOURCE' | translate }}\n\n\n
\n \n
\n
\n\n \n \n\n", "import { Component, OnInit, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntypedFormControl } from '@angular/forms';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\nimport { FilterDisplaySettings } from '../brand-filter-container.service';\nimport { AccountGroupMetricService } from '../../../metrics/account-group.service';\nimport { TaxonomyOption } from '@vendasta/taxonomy';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport interface TaxonomyData {\n selectedTaxonomies: TaxonomyOption[];\n filterSettings: FilterDisplaySettings;\n}\n\n@Component({\n selector: 'bc-brand-geography-dialog',\n templateUrl: './brand-taxonomy-dialog.component.html',\n styleUrls: ['./brand-taxonomy-dialog.component.scss'],\n standalone: false,\n})\nexport class BrandTaxonomyDialogComponent implements OnInit {\n taxonomyFormControl = new UntypedFormControl();\n\n taxonomyOptions$: Observable;\n\n constructor(\n private accountGroupService: AccountGroupMetricService,\n private translateService: TranslateService,\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data: TaxonomyData,\n ) {}\n\n ngOnInit(): void {\n const selectedTaxonomyIds = this.data.selectedTaxonomies.map((taxOpts) => taxOpts.id);\n this.taxonomyFormControl.setValue(selectedTaxonomyIds);\n\n this.taxonomyOptions$ = combineLatest([\n this.accountGroupService.brandTaxonomyOptions$,\n this.translateService.stream('FRONTEND.TAXONOMY'),\n ]).pipe(\n map(([brandTaxMap, taxonomyTranslations]) => {\n if (!brandTaxMap) {\n return [];\n }\n const locationsTemplate = this.translateService.instant('PERFORMANCE.MULTI_LOCATION.FILTERS.LOCATION_COUNT', {\n count: 'NUM',\n });\n return Array.from(brandTaxMap)\n .map(([fullTaxId, taxWithCount]) => {\n const taxNames = fullTaxId.split(':').map((taxId) => {\n return Object.prototype.hasOwnProperty.call(taxonomyTranslations, taxId)\n ? taxonomyTranslations[taxId]\n : taxId;\n });\n const taxName = taxNames.join(' > ');\n const numLocations = locationsTemplate.replace('NUM', taxWithCount.numLocations);\n return {\n value: fullTaxId,\n name: `${taxName} ${numLocations}`,\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n }),\n );\n }\n\n close(newData: boolean): void {\n if (!newData) {\n this.dialogRef.close();\n return;\n }\n // Get the actual tax options back from the ids\n this.accountGroupService.brandTaxonomyOptions$\n .pipe(\n take(1),\n map((taxOptions) => {\n return (this.taxonomyFormControl.value || []).map((taxId) => {\n return taxOptions.get(taxId).taxonomyOption;\n });\n }),\n )\n .subscribe((selectedTaxonomies) => {\n this.dialogRef.close({\n selectedTaxonomies: selectedTaxonomies,\n });\n });\n }\n}\n", "\n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.CATEGORY' | translate }}\n\n\n
\n \n
\n
\n\n \n \n\n", "import { Component, DestroyRef, input, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AddressAPIService, CountryConfiguration } from '@vendasta/address';\nimport {\n CompositeFilterOperator,\n FieldFilterOperator,\n FieldFilterOperatorFunction,\n Filter,\n PropertyType,\n} from '@vendasta/multi-location-analytics';\nimport { TaxonomyOption } from '@vendasta/taxonomy';\nimport { asyncScheduler, combineLatest, Observable } from 'rxjs';\nimport { map, observeOn, switchMap, withLatestFrom } from 'rxjs/operators';\nimport { LanguageService } from '../../core/language-service.service';\nimport { isMobile } from '../../core/mobile';\nimport { AccountGroupMetricService } from '../../metrics/account-group.service';\nimport { Mode, SidepanelService, Size, SizePixels } from '../../navigation/sidepanel.service';\nimport { FilterService } from '../../shared/filter-service.service';\nimport { TimeRangeService } from '../../shared/time-range.service';\nimport { BrandsService } from '../brands.service';\nimport {\n BrandFilterContainerService,\n CITIES_LABEL,\n COUNTRIES_LABEL,\n DisplayFilter,\n FilterDisplaySettings,\n Location,\n LocationGroup,\n STATEPROV_LABEL,\n} from './brand-filter-container.service';\nimport { BrandGeographyDialogComponent } from './brand-geography-dialog/brand-geography-dialog.component';\nimport { BrandGroupDialogComponent, GroupWithDisplayName } from './brand-group-dialog/brand-group-dialog.component';\nimport { BrandLocationDialogComponent } from './brand-location-dialog/brand-location-dialog.component';\nimport { BrandSourceDialogComponent } from './brand-source-dialog/brand-source-dialog.component';\nimport { BrandTaxonomyDialogComponent } from './brand-taxonomy-dialog/brand-taxonomy-dialog.component';\n\n@Component({\n selector: 'bc-brand-filter-container',\n templateUrl: './brand-filter-container.component.html',\n styleUrls: ['./brand-filter-container.component.scss'],\n standalone: false,\n})\nexport class BrandFilterContainerComponent implements OnInit {\n filterItems: DisplayFilter[] = [];\n filterSettings: FilterDisplaySettings = {\n textColor: '',\n backgroundColor: '',\n };\n filterQuantity$: Observable;\n\n availableLocations: LocationGroup[];\n selectedCountries: Location[] = [];\n selectedStateProvinces: Location[] = [];\n selectedCities: Location[] = [];\n\n selectedGroup: GroupWithDisplayName;\n\n selectedTaxonomies: TaxonomyOption[] = [];\n\n filterBarOffset$: Observable;\n\n sidenavOpened$ = this.sidepanelService.visible$;\n dateText$: Observable;\n\n geographyFilter$: Observable;\n busCategoryFilter$: Observable;\n groupFilter$: Observable;\n locationFilter$: Observable;\n sourceFilter$: Observable;\n\n displaySourceFilter = input(true);\n\n constructor(\n private dialog: MatDialog,\n private accountGroupMetricService: AccountGroupMetricService,\n private filterService: FilterService,\n private timeRangeService: TimeRangeService,\n private brandsService: BrandsService,\n private sidepanelService: SidepanelService,\n public brandFiltersService: BrandFilterContainerService,\n private languageService: LanguageService,\n private addressService: AddressAPIService,\n private destroyRef: DestroyRef,\n ) {}\n\n ngOnInit(): void {\n this.brandFiltersService.openDialog$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (dialog) => {\n switch (dialog) {\n case 'location':\n this.openLocationDialog();\n }\n },\n });\n\n // Add Location filter which displays only if locations are selected\n this.addOrUpdateFilterItem(\n 'location-filter',\n 'COMMON.LOCATION',\n null,\n this.brandFiltersService.locationFilterDisplay$,\n );\n // But still watch the selection to update the filters..\n this.brandFiltersService.selectedAccountGroupIds$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.calculateFilters();\n });\n\n // Add Source filter which displays only if sources are selected\n this.addOrUpdateFilterItem(\n 'source-filter',\n 'COMMON.REVIEW_OR_LISTING_SOURCE',\n null,\n this.brandFiltersService.sourceFilterDisplay$,\n );\n\n const geographicBreakdown$ = this.accountGroupMetricService.getGeographicBreakdown$();\n combineLatest([this.languageService.currentLocale$, geographicBreakdown$])\n .pipe(\n switchMap(([currentLocale, geographicBreakdown]) => {\n const countryCodes = geographicBreakdown.reduce((codes, location) => {\n if (location.countryCode && codes.indexOf(location.countryCode) === -1) {\n codes.push(location.countryCode);\n }\n return codes;\n }, []);\n return combineLatest(\n countryCodes.map((code) => this.addressService.getCountryConfiguration(code, currentLocale)),\n );\n }),\n map((countryConfigs: CountryConfiguration[]) => {\n return countryConfigs.reduce(\n (options: Record, country: CountryConfiguration) => {\n options[country.code] = country;\n return options;\n },\n {},\n );\n }),\n withLatestFrom(geographicBreakdown$),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(([countryOptions, geographicBreakdown]) => {\n if (typeof geographicBreakdown === 'undefined' || geographicBreakdown === null) {\n return;\n }\n this.clearAvailableLocations();\n geographicBreakdown.forEach((location) => {\n if (location.country && !location.state) {\n this.availableLocations[0].options.push({\n id: location.countryCode,\n name: countryOptions[location.countryCode].name,\n parent: [],\n locationCount: location.numLocations,\n });\n }\n if (location.country && location.state && !location.city) {\n const state = countryOptions[location.countryCode].zones?.find((zone) => {\n return zone.code === location.stateCode;\n });\n this.availableLocations[1].options.push({\n id: location.stateCode,\n name: state?.name,\n parent: [location.countryCode],\n locationCount: location.numLocations,\n });\n }\n if (location.country && location.state && location.city) {\n this.availableLocations[2].options.push({\n id: location.city,\n name: `${location.city}, ${location.stateCode}`,\n parent: [location.countryCode, location.stateCode],\n locationCount: location.numLocations,\n });\n }\n });\n this.availableLocations[0].options.sort(this.sortName);\n this.availableLocations[1].options.sort(this.sortName);\n this.availableLocations[2].options.sort(this.sortName);\n });\n\n this.filterBarOffset$ = combineLatest([\n this.sidepanelService.mode$,\n this.sidepanelService.size$,\n this.sidepanelService.visible$,\n ]).pipe(\n observeOn(asyncScheduler),\n map(([mode, size, visible]) => {\n if (mode !== Mode.SIDE || isMobile()) {\n return '0';\n }\n if (!visible) {\n return '0';\n }\n if (size === Size.SMALL) {\n return `${SizePixels.SMALL}px`;\n } else if (size === Size.REGULAR) {\n return `${SizePixels.REGULAR}px`;\n } else {\n return `${SizePixels.LARGE}px`;\n }\n }),\n );\n\n this.dateText$ = combineLatest([\n this.brandFiltersService.dateFilterDisplay$,\n this.timeRangeService.dateRange$,\n this.languageService.currentLocale$,\n ]).pipe(\n map(([type, [start, end], locale]) => {\n if (type === 'Custom' && start && end) {\n return start.toLocaleDateString(locale) + ' - ' + end.toLocaleDateString(locale);\n } else {\n return type;\n }\n }),\n );\n this.filterQuantity$ = this.filterService.filtersQuantity$;\n this.groupFilter$ = this.filterService.subgroup$.pipe(map((r) => r != null));\n this.locationFilter$ = this.brandFiltersService.locationFilterDisplay$.pipe(map((r) => r.length > 0));\n this.sourceFilter$ = this.filterService.filteredSources$.pipe(map((r) => r.length > 0));\n this.geographyFilter$ = this.filterQuantity$.pipe(\n map(() => this.selectedCities.concat(this.selectedStateProvinces).concat(this.selectedCountries).length > 0),\n );\n this.busCategoryFilter$ = this.filterQuantity$.pipe(map(() => this.selectedTaxonomies.length > 0));\n }\n\n private clearAvailableLocations(): void {\n this.availableLocations = [\n {\n name: COUNTRIES_LABEL,\n options: [],\n },\n {\n name: STATEPROV_LABEL,\n options: [],\n },\n {\n name: CITIES_LABEL,\n options: [],\n },\n ];\n }\n\n private sortName(a: Location, b: Location): number {\n return a.name?.localeCompare(b.name);\n }\n\n addOrUpdateFilterItem(\n filterId: string,\n filterTypeTranslateKey: string,\n value: string,\n value$?: Observable,\n ): void {\n const foundFilter = this.filterItems.filter((item) => item.filterId === filterId);\n if (foundFilter.length > 0) {\n foundFilter[0].displayName = value;\n this.filterItems[this.filterItems.findIndex((el) => el.filterId === filterId)] = foundFilter[0];\n return;\n }\n this.filterItems.push({\n filterId: filterId,\n filterTypeTranslateKey: filterTypeTranslateKey,\n displayName: value,\n displayName$: value$,\n });\n }\n\n removeFilterItem(filterId: string): void {\n if (filterId === 'location-filter') {\n // This will no longer display the chip and recalculate the filters\n this.brandFiltersService.clearAccountGroupIds();\n return;\n } else if (filterId === 'source-filter') {\n // This will no longer display the chip and recalculate the filters\n this.brandFiltersService.clearSourceIds();\n return;\n }\n this.filterItems = this.filterItems.filter((filter) => filter.filterId !== filterId);\n if (filterId === 'geography-filter') {\n this.selectedCountries = [];\n this.selectedStateProvinces = [];\n this.selectedCities = [];\n this.calculateFilters();\n } else if (filterId === 'group-filter') {\n this.brandsService.clearPath();\n this.selectedGroup = null;\n this.filterService.setSubgroup(null);\n } else if (filterId === 'category-filter') {\n this.selectedTaxonomies = [];\n this.calculateFilters();\n }\n }\n\n selectFilterItem(filterId: string): void {\n if (filterId === 'geography-filter') {\n this.openGeographyDialog();\n } else if (filterId === 'group-filter') {\n this.openGroupDialog();\n } else if (filterId === 'category-filter') {\n this.openTaxonomyDialog();\n } else if (filterId === 'location-filter') {\n this.openLocationDialog();\n } else if (filterId === 'source-filter') {\n this.openSourceDialog();\n }\n }\n\n private calculateGeographyFilter(): string {\n if (this.selectedCountries.length + this.selectedStateProvinces.length + this.selectedCities.length > 1) {\n let displayValue = '';\n if (this.selectedCountries.length === 1) {\n displayValue += '1 Country';\n } else if (this.selectedCountries.length > 1) {\n displayValue += `${this.selectedCountries.length} Countries`;\n }\n\n if (this.selectedCountries.length > 0 && this.selectedStateProvinces.length > 0) {\n displayValue += this.selectedCities.length > 0 ? ', ' : ' and ';\n }\n\n if (this.selectedStateProvinces.length === 1) {\n displayValue += '1 State/Province';\n } else if (this.selectedStateProvinces.length > 1) {\n displayValue += `${this.selectedStateProvinces.length} States/Provinces`;\n }\n\n if (\n (this.selectedCountries.length > 0 || this.selectedStateProvinces.length > 0) &&\n this.selectedCities.length > 0\n ) {\n displayValue += ' and ';\n }\n\n if (this.selectedCities.length === 1) {\n displayValue += '1 City';\n } else if (this.selectedCities.length > 1) {\n displayValue += `${this.selectedCities.length} Cities`;\n }\n return displayValue;\n }\n if (this.selectedCountries.length > 0) {\n return this.selectedCountries[0].id;\n }\n if (this.selectedStateProvinces.length > 0) {\n return this.selectedStateProvinces[0].id;\n }\n if (this.selectedCities.length > 0) {\n return this.selectedCities[0].id;\n }\n }\n\n private calculateGroupFilter(): string {\n if (this.selectedGroup) {\n return this.selectedGroup.name;\n }\n }\n\n private calculateTaxonomyFilter(): string {\n // Take the last part of the tax ids and join them\n return '' + this.selectedTaxonomies.map((taxOpt) => taxOpt.name.split(' > ').pop()).join(', ');\n }\n\n private calculatePartnerColor(theme: string, primaryColor?: string): void {\n let selectedColor = this.filterSettings.textColor;\n if (theme === 'dark' && primaryColor) {\n selectedColor = '#FFFFFF';\n }\n this.filterSettings = {\n textColor: selectedColor,\n backgroundColor: primaryColor ? `#${primaryColor}` : '#EAEAEA',\n };\n }\n\n openGeographyDialog(): void {\n const dialogRef = this.dialog.open(BrandGeographyDialogComponent, {\n data: {\n availableLocations: this.availableLocations,\n selectedCountries: this.selectedCountries,\n selectedStateProvinces: this.selectedStateProvinces,\n selectedCities: this.selectedCities,\n filterSettings: this.filterSettings,\n },\n id: 'brand-geography-container',\n });\n dialogRef.afterClosed().subscribe((results) => {\n if (typeof results !== 'undefined') {\n this.selectedCountries = results.selectedCountries;\n this.selectedStateProvinces = results.selectedStateProvinces;\n this.selectedCities = results.selectedCities;\n\n // Empty selection should clear filter chip\n if (\n this.selectedCountries.length === 0 &&\n this.selectedStateProvinces.length === 0 &&\n this.selectedCities.length === 0\n ) {\n this.removeFilterItem('geography-filter');\n this.calculateFilters();\n return;\n }\n\n this.addOrUpdateFilterItem(\n 'geography-filter',\n 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GEOGRAPHY',\n this.calculateGeographyFilter(),\n );\n this.calculateFilters();\n }\n });\n }\n\n openGroupDialog(): void {\n const dialogRef = this.dialog.open(BrandGroupDialogComponent, {\n data: {\n selectedGroup: this.selectedGroup,\n filterSettings: this.filterSettings,\n },\n id: 'brand-group-container',\n });\n dialogRef.afterClosed().subscribe((results) => {\n if (typeof results !== 'undefined') {\n this.selectedGroup = results.selectedGroup;\n this.filterService.setSubgroup(this.selectedGroup.group.pathNodes);\n\n this.addOrUpdateFilterItem(\n 'group-filter',\n 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GROUP',\n this.calculateGroupFilter(),\n );\n\n this.brandsService.setPath(this.selectedGroup.group.pathNodes);\n } else {\n this.selectedGroup = null;\n this.filterService.setSubgroup(null);\n this.brandsService.clearPath();\n }\n });\n }\n\n openTaxonomyDialog(): void {\n const dialogRef = this.dialog.open(BrandTaxonomyDialogComponent, {\n data: {\n selectedTaxonomies: this.selectedTaxonomies,\n filterSettings: this.filterSettings,\n },\n id: 'brand-taxonomies-container',\n });\n dialogRef.afterClosed().subscribe((results) => {\n if (typeof results !== 'undefined') {\n this.selectedTaxonomies = results.selectedTaxonomies as TaxonomyOption[];\n\n // Empty selection should clear filter chip\n if (this.selectedTaxonomies.length === 0) {\n this.removeFilterItem('category-filter');\n this.calculateFilters();\n return;\n }\n\n this.addOrUpdateFilterItem(\n 'category-filter',\n 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.CATEGORY',\n this.calculateTaxonomyFilter(),\n );\n this.calculateFilters();\n }\n });\n }\n\n openLocationDialog(): void {\n const dialogRef = this.dialog.open(BrandLocationDialogComponent, {\n data: {\n filterSettings: this.filterSettings,\n },\n id: 'brand-location-filter-container',\n panelClass: ['mobile-full-width'],\n });\n dialogRef.afterClosed().subscribe((results) => {\n if (typeof results !== 'undefined') {\n // Setting this updates the field, clears the chip if nothing, and recaclculates filters\n this.brandFiltersService.setAccountGroupIds(results.selectedAccountGroupIds);\n }\n });\n }\n\n openSourceDialog(): void {\n const dialogRef = this.dialog.open(BrandSourceDialogComponent, {\n data: {\n selectedSourceIds: this.brandFiltersService.getSourceIds(),\n filterSettings: this.filterSettings,\n },\n id: 'brand-source-filter-container',\n });\n dialogRef.afterClosed().subscribe((results) => {\n if (typeof results !== 'undefined') {\n // Setting this updates the field, clears the chip if nothing, and recaclculates filters\n this.brandFiltersService.setSourceIds(results.selectedSourceIds);\n }\n this.calculateFilters();\n });\n }\n\n private calculateGeographyFilters(): Filter {\n if (\n this.selectedCountries.length === 0 &&\n this.selectedStateProvinces.length === 0 &&\n this.selectedCities.length === 0\n ) {\n return null;\n }\n const filterObject = new Filter({\n compositeFilter: {\n op: CompositeFilterOperator.OR,\n filters: [],\n },\n });\n [...this.selectedCountries, ...this.selectedStateProvinces, ...this.selectedCities].forEach((location) => {\n let dimension = 'country';\n if (location.parent.length === 1) {\n dimension = 'state';\n } else if (location.parent.length === 2) {\n dimension = 'city';\n }\n filterObject.compositeFilter.filters.push(\n new Filter({\n fieldFilter: {\n operator: FieldFilterOperator.EQUAL,\n dimension: `account_group__${dimension}`,\n value: {\n value: location.id,\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n },\n },\n }),\n );\n });\n\n return filterObject;\n }\n\n private calculateTaxonomyFilters(): Filter {\n if (this.selectedTaxonomies.length === 0) {\n return null;\n }\n return new Filter({\n fieldFilter: {\n operator: FieldFilterOperator.OVERLAP,\n dimension: `account_group__tax_ids`,\n value: {\n value: this.selectedTaxonomies.map((taxOpt) => taxOpt.id),\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n },\n },\n });\n }\n\n private calculateLocationFilters(): Filter {\n if (this.brandFiltersService.getAccountGroupIds().length === 0) {\n return null;\n }\n return new Filter({\n fieldFilter: {\n operator: FieldFilterOperator.EQUAL,\n operatorFunction: FieldFilterOperatorFunction.ANY,\n // TODO: Minor(?) opportunity here to not require the join for this if all metrics had same agid field\n dimension: `account_group__account_group_id`,\n value: {\n value: this.brandFiltersService.getAccountGroupIds(),\n valueType: PropertyType.PROPERTY_TYPE_STRING,\n },\n },\n });\n }\n\n private calculateFilters(): void {\n const geoFilter = this.calculateGeographyFilters();\n const taxonomyFilter = this.calculateTaxonomyFilters();\n const locationFilter = this.calculateLocationFilters();\n this.filterService.setFilters([geoFilter, taxonomyFilter, locationFilter].filter((x) => !!x));\n }\n\n public clearAllFilters(): void {\n this.removeFilterItem('location-filter');\n this.removeFilterItem('source-filter');\n this.removeFilterItem('geography-filter');\n this.removeFilterItem('group-filter');\n this.removeFilterItem('category-filter');\n }\n}\n", "\n \n filter_list\n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.FILTERS' | translate }}\n \n \n \n \n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GEOGRAPHY' | translate }}...\n @if (geographyFilter$ | async) {\n brightness_1\n }\n \n \n \n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.CATEGORY' | translate }}...\n @if (busCategoryFilter$ | async) {\n brightness_1\n }\n \n \n \n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.TITLES.GROUP' | translate }}...\n @if (groupFilter$ | async) {\n brightness_1\n }\n \n \n \n \n {{ 'COMMON.LOCATION' | translate }}...\n @if (locationFilter$ | async) {\n brightness_1\n }\n \n \n @if (displaySourceFilter()) {\n \n \n {{ 'COMMON.REVIEW_OR_LISTING_SOURCE' | translate }}...\n @if (sourceFilter$ | async) {\n brightness_1\n }\n \n \n }\n @if ((filterQuantity$ | async) > 0) {\n \n {{ 'PERFORMANCE.MULTI_LOCATION.FILTERS.CLEAR_ALL_FILTERS' | translate }}\n \n }\n \n\n"], "mappings": "y+EAAA,IAAAA,GAAAC,EAAA,KAAAC,OCAA,IAWaC,GAXbC,GAAAC,EAAA,KACAC,KACAC,KAMAC,UAGaL,IAAa,IAAA,CAApB,MAAOA,CAAa,CAYxBM,aAAA,CAXQ,KAAAC,UAAY,IAAIC,EAAgB,IAAIC,KAAe,EAGnD,KAAAC,iBAA8C,IAAIF,EAAgB,CAAA,CAAE,EAEpE,KAAAG,kBAA+C,IAAIH,EAAgB,CAAA,CAAE,EAGrE,KAAAI,WAAwC,IAAIJ,EAAgB,IAAI,EAItE,KAAKK,SAAW,KAAKN,UAAUO,aAAY,EAAGC,KAAKC,EAAKC,GAAM,CAAC,GAAGA,CAAC,CAAC,CAAC,EACrE,KAAKC,gBAAkB,KAAKR,iBAAiBI,aAAY,EACzD,KAAKK,iBAAmB,KAAKR,kBAAkBG,aAAY,EAC3D,KAAKM,UAAY,KAAKR,WAAWE,aAAY,EAC7C,KAAKO,cAAgBC,EAAc,CAAC,KAAKZ,iBAAkB,KAAKS,gBAAgB,CAAC,EAAEJ,KACjFC,EAAI,CAAC,CAACO,EAASC,CAAQ,IAAK,CAC1B,IAAK,CAACA,GAAYA,EAASC,OAAS,KAAO,CAACF,GAAWA,EAAQE,OAAS,GACtE,OAAO,KAET,IAAMC,EAAYF,GAAYA,EAASC,OAAS,EAAID,EAAWD,EAC/D,OAAO,IAAII,EAAO,CAChBC,YAAa,CACXC,SAAUC,EAAoBC,MAC9BC,iBAAkBC,GAA4BC,IAC9CC,UAAW,SACXC,MAAO,CACLA,MAAOV,EACPW,UAAWC,EAAaC,uBAG7B,CACH,CAAC,EACDC,GAAoB,CAAE,EAExB,KAAKC,iBAAmBnB,EAAc,CAAC,KAAKT,SAAU,KAAKM,iBAAkB,KAAKC,SAAS,CAAC,EAAEL,KAC5FC,EAAI,CAAC,CAAC0B,EAASC,EAAiBC,CAAQ,IAAK,CAC3C,IAAIC,EAAM,EACV,OAAIH,IACFG,GAAOH,EAAQjB,QAEbkB,GAAmBA,EAAgBlB,OAAS,IAC9CoB,GAAO,GAELD,IACFC,GAAO,GAEFA,CACT,CAAC,CAAC,CAEN,CAEOC,WAAWJ,EAAiB,CACjC,KAAKnC,UAAUwC,KAAKL,CAAO,CAC7B,CAEOM,kBAAkBtB,EAAmB,CAC1C,KAAKhB,iBAAiBqC,KAAKrB,CAAS,CACtC,CAEOuB,mBAAmBvB,EAAmB,CAC3C,KAAKf,kBAAkBoC,KAAKrB,CAAS,CACvC,CAEOwB,YAAYC,EAAiB,CAClC,KAAKvC,WAAWmC,KAAKI,CAAO,CAC9B,iDApEWnD,EAAa,CAAA,kCAAbA,EAAaoD,QAAbpD,EAAaqD,UAAAC,WADA,MAAM,CAAA,CAAA,SACnBtD,CAAa,GAAA,ICX1B,IAaauD,GACAC,GACAC,GA6BAC,GA5CbC,GAAAC,EAAA,KACAC,KAEAC,KACAC,KACAC,KAEAC,KAGAC,KACAC,wCAEaZ,GAAkB,yDAClBC,GAAkB,sDAClBC,GAAe,sDA6BfC,IAA2B,IAAA,CAAlC,MAAOA,CAA2B,CA0BtCU,YACmBC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAkC,CALlC,KAAAL,iBAAAA,EACA,KAAAC,UAAAA,EACA,KAAAC,cAAAA,EACA,KAAAC,OAAAA,EACA,KAAAC,kBAAAA,EACA,KAAAC,iBAAAA,EA/BF,KAAAC,iBAAmB,IAAIC,EAAyB,EAAK,EACtD,KAAAC,gBAAkB,KAAKF,iBAAiBG,aAAY,EAGnD,KAAAC,0BAA4B,IAAIH,EAA0B,CAAA,CAAE,EAC7D,KAAAI,yBAA2B,KAAKD,0BAA0BD,aAAY,EAGrE,KAAAG,oBAAsB,IAAIL,EAA0B,CAAA,CAAE,EACvD,KAAAM,mBAAqB,KAAKD,oBAAoBH,aAAY,EAIzD,KAAAK,iBAAmB,IAAIP,EAAqC,IAAI,EACjE,KAAAQ,gBAAkB,KAAKD,iBAAiBL,aAAY,EAIpE,KAAAO,YAAwC,IAAIC,GAEpC,KAAAC,YAAwC,IAAIX,EAAyB,EAAK,EAC3E,KAAAY,WAAkC,KAAKD,YAAYT,aAAY,EAapE,KAAKW,mBAAqB,KAAKpB,iBAAiBqB,sBAAsBC,KACpEC,EAAKC,GAII,GAHmBC,GAA0BC,KACjDC,GAAoBA,EAAgBC,MAAQJ,CAAY,EAE/BK,IAAI,EACjC,CAAC,EAGJ,KAAKC,uBAAyBC,EAAc,CAE1C,KAAK1B,iBAAiB2B,sBAAsBV,KAAKW,GAAQC,GAAO,CAAC,CAACA,CAAE,CAAC,EACrE,KAAKvB,yBACL,KAAKV,UAAUkC,OAAO,kBAAkB,CAAC,CAC1C,EAAEb,KACDC,EAAI,CAAC,CAACa,EAAgBC,EAAiBC,CAAmB,IAAK,CAC7D,IAAMC,EAAOF,EAAgBd,IAAKiB,GAAmBJ,EAAeI,CAAc,CAAC,EAC7EC,EAAaF,EAAKN,OAAQS,GAAQA,CAAG,EAE3C,OAAIH,EAAKI,OAASF,EAAWE,QAC3B,KAAKC,mBAAmBH,EAAWlB,IAAKmB,GAAQA,EAAIF,cAAc,CAAC,EAC5D,IAGLC,EAAWE,OAAS,EACf,GAAGF,EAAWE,MAAM,IAAIL,CAAmB,GAE3CG,EAAWlB,IAAKmB,GAAQ,GAAGA,EAAIG,WAAW,IAAIC,GAAYJ,CAAG,CAAC,EAAE,EAAEK,KAAK,IAAI,CAEtF,CAAC,CAAC,EAGJ,KAAKC,qBAAuBjB,EAAc,CAExC,KAAK3B,kBAAkB6C,kBAAkB3B,KAAKW,GAAQiB,GAAc,CAAC,CAACA,CAAS,CAAC,EAChF,KAAKrC,mBACL,KAAKE,gBACL,KAAKd,UAAUkC,OAAO,kCAAkC,CAAC,CAC1D,EAAEb,KACDC,EAAI,CAAC,CAAC4B,EAAcC,EAAmBC,EAAgBC,CAAiB,IAAK,CAC3E,IAAMC,EAAUH,EAAkB7B,IAAKiC,GAAaL,EAAaM,IAAID,CAAQ,CAAC,EACxEE,EAAgBH,EAAQtB,OAAQ0B,GAAWA,CAAM,EAEvD,OAAIJ,EAAQZ,OAASe,EAAcf,QACjC,KAAKiB,aAAaF,EAAcnC,IAAKoC,GAAWA,EAAOH,SAAW,EAAE,CAAC,EAC9D,IAILE,EAAcf,OAAS,EAClB,GAAGe,EAAcf,MAAM,IAAIW,CAAiB,GAG/CD,EACKK,EACJnC,IAAKoC,GAAW,GAAGA,EAAO9B,IAAI,IAAIwB,EAAeI,IAAIE,EAAOH,SAAW,EAAE,CAAC,EAAE,EAC5ET,KAAK,IAAI,EAELW,EAAcnC,IAAKoC,GAAW,GAAGA,EAAO9B,IAAI,EAAE,EAAEkB,KAAK,IAAI,CAGtE,CAAC,CAAC,EAGJ,KAAKc,eAAiB9B,EAAc,CAAC,KAAKjB,iBAAkB,KAAKV,kBAAkB6C,iBAAiB,CAAC,EAAE3B,KACrGC,EAAI,CAAC,CAACuC,EAAUZ,CAAS,IAClBA,EAIHa,MAAMC,KAAKd,EAAUe,KAAI,CAAE,EACxB1C,IAAKiC,GAAY,CAChB,IAAMG,EAAST,EAAUO,IAAID,EAAW,EAAE,EACpCU,EAAQJ,EAAWA,EAASL,IAAID,EAAW,EAAE,EAAI,KACvD,MAAO,CACLW,MAAOX,EACPY,WAAYF,EACZrC,KAAMqC,IAAU,KAAO,GAAGP,EAAO9B,IAAI,KAAKqC,CAAK,IAAM,GAAGP,EAAO9B,IAAI,GAEvE,CAAC,EAEAwC,KAAK,CAACC,EAAGC,IAAMD,EAAEzC,KAAK2C,cAAcD,EAAE1C,IAAI,CAAC,EAdvC,CAAA,CAgBV,CAAC,EAGJ,KAAKzB,kBAAkBqE,cACpBnD,KAAKoD,GAAkB,CAAE,EACzBC,UAAWC,GAAc,KAAK1E,cAAc2E,kBAAkBD,EAAUrD,IAAKiC,GAAaA,EAASsB,SAAQ,CAAE,CAAC,CAAC,EAClH,KAAKjE,mBACFS,KAAKoD,GAAkB,CAAE,EACzBC,UAAWC,GAAc,KAAK1E,cAAc6E,mBAAmBH,CAAS,CAAC,EAE5E,KAAKI,kBAAoB,KAAK7E,OAAO8E,OAAO3D,KAC1CW,GAAQiD,GAAUA,aAAiBC,IAAiBD,EAAME,SAASC,SAAS1C,SAAW,CAAC,EACxFpB,EAAK2D,GACIA,EAAME,SAASE,KAAK,SAAcC,GAAOC,qBACjD,EACDC,EACG,SAAUC,EAAK,CACd,IAAIC,EAAQD,EAAMvF,OAAOyF,YAAYC,KACrC,KAAOF,EAAMG,YACXH,EAAQA,EAAMG,WAEhB,GAAIH,EAAMP,SACR,OAAOO,EAAMP,SAASE,KAAK,SAAcC,GAAOC,qBAEpD,EAAG,IAAI,CAAC,EAEVO,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,CAElD,CAEAC,mBAAmBC,EAAe,CAChC,KAAKjF,YAAYkF,KAAKD,CAAM,CAC9B,CAEAE,WAAWC,EAAuB,CAChC,KAAKtF,YAAYoF,KAAKE,CAAM,CAC9B,CAEAC,oBAAkB,CAChB,OAAO,KAAK7F,0BAA0B8F,SAAQ,CAChD,CACA5D,mBAAmBP,EAAyB,CAC1C,KAAK3B,0BAA0B0F,KAAK/D,CAAe,CACrD,CACAoE,sBAAoB,CAClB,KAAK/F,0BAA0B0F,KAAK,CAAA,CAAE,CACxC,CAEAM,cAAY,CACV,OAAO,KAAK9F,oBAAoB4F,SAAQ,CAC1C,CACA5C,aAAagB,EAAmB,CAC9B,KAAKhE,oBAAoBwF,KAAKxB,CAAS,CACzC,CACA+B,YAAYnD,EAAgB,CAC1B,IAAMD,EAAU,KAAK3C,oBAAoB4F,SAAQ,EAC7CjD,EAAQqD,SAASpD,CAAQ,GAG7B,KAAK5C,oBAAoBwF,KAAK,CAAC,GAAG7C,EAASC,CAAQ,CAAC,CACtD,CACAqD,eAAerD,EAAgB,CAC7B,IAAMD,EAAU,KAAK3C,oBAAoB4F,SAAQ,EAC3CM,EAAavD,EAAQtB,OAAQ8E,GAAOA,IAAOvD,CAAQ,EACrDD,EAAQZ,SAAWmE,EAAWnE,QAChC,KAAK/B,oBAAoBwF,KAAKU,CAAU,CAE5C,CACAE,gBAAc,CACZ,KAAKpG,oBAAoBwF,KAAK,CAAA,CAAE,CAClC,iDA5LW/G,GAA2B4H,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAAAF,EAAAG,EAAA,EAAAH,EAAAI,EAAA,EAAAJ,EAAAK,EAAA,EAAAL,EAAAM,EAAA,CAAA,CAAA,CAAA,kCAA3BlI,EAA2BmI,QAA3BnI,EAA2BoI,UAAAC,WADd,MAAM,CAAA,CAAA,SACnBrI,CAA2B,GAAA,ICpClC,SAAUsI,GAAMC,EAAeC,EAAgB,CACnD,IAAMC,EAAMC,GAAYC,UAAUJ,EAAOC,CAAQ,EACjD,OAAOC,IAAQ,KAAO,KAAO,CAACA,EAAIG,QAAQ,IAAK,EAAE,CACnD,CASM,SAAUC,GAAOC,EAAuB,CAC5C,GAAI,CAACA,EAAEC,SAAW,CAACD,EAAEC,QAAQA,QAC3B,MAAO,CAAA,EAET,IAAMC,EAAMF,EAAEC,QAAQA,QAAQE,IAAI,SAAUC,EAAe,CACzD,OAAOC,GAAMD,EAAG,IAAIE,GAAI,CAAA,EAAI,CAAA,CAAE,CAAC,CACjC,CAAC,EACKC,EAAO,CAAA,EACbL,OAAAA,EAAIM,QAASC,GAA0B,CACrCF,EAAKG,KAAKD,EAAuB,CAAC,CAAC,CACrC,CAAC,EACMF,CACT,CAEA,SAASF,GAAMD,EAAiBJ,EAAM,CAEpC,OADAA,EAAEW,OAAOD,KAAKN,EAAEQ,SAAS,EACrB,CAACR,EAAES,SAAW,CAACT,EAAES,QAAQZ,SAC3BD,EAAEc,SAASJ,KAAKN,EAAEU,QAAQ,EACnB,CAACd,CAAC,GAECI,EAAES,QAAQZ,QAAQE,IAAI,SAAUR,EAAiB,CAC3D,OAAOU,GAAMV,EAAKK,CAAC,CACrB,CAAC,EACUe,OAAO,CAACC,EAAKrB,IAAQqB,EAAIC,OAAOtB,CAAG,EAAG,CAAA,CAAE,CACrD,CA5CA,IAKMC,GAQOU,GAiCAY,GA9CbC,GAAAC,EAAA,KAAAC,KAGAC,KAEM1B,GAAc,IAAI2B,GAAY,OAAO,EAQ9BjB,GAAP,KAAU,CACdkB,YACSb,EACAG,EAAe,CADf,KAAAH,OAAAA,EACA,KAAAG,SAAAA,CACN,GA6BQI,GAAP,KAAgC,CAGpCM,YACSC,EACAC,EAA6C,CAD7C,KAAAD,eAAAA,EACA,KAAAC,YAAAA,EAEP,KAAKC,mBAAqB,KAAKF,eAAeG,KAC5CzB,EAAKH,GACEA,EAGED,GAAOC,EAAE6B,cAAc,CAAC,CAAC,EAFvB,IAGV,CAAC,EAEJ,KAAKC,oBAAsB,KAAKJ,YAAYE,KAC1CzB,EAAKH,GACEA,EAGED,GAAOC,EAAE6B,cAAc,CAAC,CAAC,EAFvB,IAGV,CAAC,CAEN,KC4HF,SAASE,GAAUC,EAAc,CAC/B,OAAO,IAAIC,GAAW,CACpBD,MAAOA,EACPE,UAAWC,EAAaC,mBACzB,CACH,CAEA,SAASC,GAAYL,EAAa,CAChC,OAAO,IAAIC,GAAW,CACpBD,MAAOA,EACPE,UAAWC,EAAaG,qBACzB,CACH,CAqDA,SAASC,IAAyB,CAWhC,IAAIC,EATW,CACb,oBACA,8BACA,wBACA,sBACA,2BACA,qBACA,sBAAsB,EAEFC,IAAKC,GAAS,CAClC,IAAMC,EAAmB,IAAIC,EAAO,CAClCC,YAAa,IAAIC,EAAY,CAC3BC,UAAWL,EACXM,SAAUC,EAAoBC,MAC9BlB,MAAOK,GAAY,WAAW,EAC/B,EACF,EACD,OAAO,IAAIc,EAAQ,CACjBC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBe,gBAAiB,CACfC,GAAIC,EAAwBC,IAC5BC,QAAS,CAACpB,EAAkBqB,GAAqBC,EAAkB,GAEtE,EACDC,MAAOxB,EACR,EACF,CACH,CAAC,EAEDF,OAAAA,EAAWA,EAAS2B,OAAO,CACzB,IAAIhB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCS,MAAO,eACPR,OAAQ,CACNC,gBAAiB,CACfI,QAAS,CAACK,GAAkBC,EAAgB,EAC5CT,GAAIC,EAAwBS,KAGjC,EACF,EACD,IAAInB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCS,MAAO,iBACPR,OAAQ,IAAId,EAAO,CACjBe,gBAAiB,CACfI,QAAS,CAACE,GAAoBD,EAAmB,EACjDJ,GAAIC,EAAwBC,KAE/B,EACF,EACF,EACD,IAAIX,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCS,MAAO,cACPR,OAAQ,IAAId,EAAO,CACjB2B,YAAa,IAAIC,GAAY,CAC3BzB,UAAW,aACXa,GAAIa,GAAoBC,QACzB,EACF,EACF,EACF,EACD,IAAIvB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQiB,GACRT,MAAO,wBACR,EACF,EACD,IAAIf,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCS,MAAO,sBACPR,OAAQW,GACT,EACF,CAAC,CACH,EACM7B,CACT,CAkmDM,SAAUoC,GAAmBC,EAAaC,EAAS,CACvD,OAAO,IAAIC,GAAU,CAAEF,MAAOA,EAAOG,aAAcF,CAAG,CAAE,CAC1D,CAEM,SAAUG,GAAmBJ,EAAaC,EAAS,CACvD,OAAO,IAAIC,GAAU,CAAEF,MAAOA,EAAOC,IAAKA,CAAG,CAAE,CACjD,CAt8DA,IA+BAI,EACAC,GACAC,GAoBaC,GAWAC,GA+IAlB,GAUAH,GAUAI,GAOAL,GAOAuB,GAMAZ,GA0GAa,GAjWbC,GAAAC,EAAA,KACAC,KA8BAT,EAAkB,SAClBC,GAAgB,SAChBC,GAAmB,SACnBQ,KACAC,KACAC,KAGAC,KAGAC,KAOAC,KACAC,6CACAC,EAAAA,QAAMC,OAAOC,GAAAA,OAAG,EAEHhB,GAAP,KAAiB,CAGrBiB,YACSC,EACAC,EAAO,CADP,KAAAD,KAAAA,EACA,KAAAC,KAAAA,EAEP,KAAKC,iBAAmBC,GAAoBH,CAAI,CAClD,GAGWjB,GAAP,KAAmB,CAGvBgB,YACSK,EACAC,EACAC,EACAC,EACA/C,EAEAgD,EAA0B,CAAA,EAE1BC,EAA8B,CAAA,EAC9BC,EAAiB,CAExB,GAXO,KAAAN,YAAAA,EACA,KAAAC,UAAAA,EACA,KAAAC,QAAAA,EACA,KAAAC,UAAAA,EACA,KAAA/C,QAAAA,EAEA,KAAAgD,cAAAA,EAEA,KAAAC,kBAAAA,EACA,KAAAC,QAAAA,EAEH,KAAKD,mBAAqB,KAAKD,cAAe,CAChD,IAAMG,EACJ,KAAKF,mBAAqB,KAAKA,kBAAkBG,OAC7C,KAAKH,kBACL,KAAKD,cAActE,IAAK2E,GAAQA,EAAM,EAAE,EAC9C,KAAKC,aAAe,IAAIC,IAAIJ,CAAS,CACvC,CACF,CAEOK,gBAAc,CACnB,IAAMC,EAAYC,GAAqB,IAACtB,EAAAA,SAAM,KAAKS,SAAS,KAAGT,EAAAA,SAAM,KAAKU,OAAO,CAAC,CAAC,EACnF,MAAO,CAACW,EAAU,CAAC,EAAEE,OAAM,EAAIF,EAAU,CAAC,EAAEE,OAAM,CAAE,CACtD,CAEOC,UAAUC,EAAyB,CACxC,OAAIA,EACK,CAAC,KAAKhB,UAAW,KAAKC,OAAO,EAE/B,KAAKU,eAAc,CAC5B,CAGOM,aAAaD,EAAyB,CAC3C,GAAI,CAAChB,EAAWC,CAAO,EAAI,KAAKc,UAAUC,CAAgB,EAC1DhB,OAAAA,EAAYT,EAAAA,QAAME,IAAIO,CAAS,EAAEc,OAAM,EACnCb,GAAWV,EAAAA,QAAME,OAAIF,EAAAA,SAAK,EAAG2B,OAAO,YAAY,CAAC,EAAEJ,OAAM,IAC3Db,EAAUV,EAAAA,QAAME,IAAIQ,CAAO,EAAEkB,SAAS,EAAG,MAAM,EAAEL,OAAM,GAElD,CAACd,EAAWC,CAAO,CAC5B,CAGOmB,gBAAgBJ,EAA2BK,EAA6B,CAE7E,GAAIC,GAAuBC,SAAS,KAAKrB,SAAS,EAChD,OAAO,KAAKa,UAAUC,CAAgB,EAIxC,GAAI,CAAChB,EAAWC,CAAO,EAAI,KAAKc,UAAUC,CAAgB,EAC1DhB,OAAAA,EAAYT,EAAAA,QAAME,IAAIO,CAAS,EAAEmB,SAAS,EAAG,MAAM,EAAEL,OAAM,EACtDO,IACHpB,EAAUV,EAAAA,QAAME,IAAIQ,CAAO,EAAEkB,SAAS,EAAG,MAAM,EAAEL,OAAM,GAElD,CAACd,EAAWC,CAAO,CAC5B,CAGOuB,iBAAiBR,EAAyB,CAC/C,GAAI,KAAKd,YAAc,SAAU,CAC/B,GAAI,CAACF,EAAWC,CAAO,EAAI,KAAKc,UAAUC,CAAgB,EAC1DhB,OAAAA,EAAYT,EAAAA,QAAME,IAAIO,CAAS,EAAEmB,SAAS,EAAG,MAAM,EAAEL,OAAM,EAC3Db,EAAUV,EAAAA,QAAME,IAAIQ,CAAO,EAAEkB,SAAS,EAAG,MAAM,EAAEL,OAAM,EAChD,CAACd,EAAWC,CAAO,CAC5B,CACA,GAAI,CAACD,EAAWC,CAAO,EAAI,KAAKc,UAAUC,CAAgB,EAC1DhB,OAAAA,EAAYT,EAAAA,QAAME,IAAIO,CAAS,EAAEmB,SAAS,EAAG,MAAM,EAAEL,OAAM,EAC3Db,EAAUV,EAAAA,QAAME,IAAIQ,CAAO,EAAEkB,SAAS,EAAG,MAAM,EAAEL,OAAM,EAChD,CAACd,EAAWC,CAAO,CAC5B,CAEOwB,iBAAe,CACpB,OAAOC,GAA2B,KAAK1B,UAAW,KAAKC,OAAO,CAChE,CAEO0B,YAAYxE,EAAkB,CACnC,OAAK,CAAC,KAAKA,SAAW,KAAKA,QAAQoD,SAAW,KAAO,CAACpD,GAAWA,EAAQoD,SAAW,GAC3E,MAGJpD,IACHA,EAAU,CAAA,GAER,KAAKA,SAAW,KAAKA,QAAQoD,OAAS,IACxCpD,EAAUA,EAAQI,OAAO,KAAKJ,OAAO,GAGhC,IAAInB,EAAO,CAChBe,gBAAiB,CACfC,GAAIC,EAAwBC,IAC5BC,QAASA,GAEZ,EACH,CAEOyE,yBAAyB9F,EAAQ,YAAW,CACjD,OAAO,IAAIE,EAAO,CAChBC,YAAa,CACXE,UAAWL,EACXM,SAAUC,EAAoBC,MAC9BuF,iBAAkBC,GAA4BC,IAC9C3G,MAAO,CACLA,MAAO4G,MAAMC,KAAK,KAAKxB,YAAY,EACnCnF,UAAWC,EAAa2G,sBAG7B,CACH,CAEOC,+BAA+BrG,EAAQ,YAAW,CACvD,OAAO,IAAIE,EAAO,CAChBC,YAAa,CACXE,UAAWL,EACXM,SAAUC,EAAoBC,MAC9BuF,iBAAkBC,GAA4BC,IAC9C3G,MAAO,CACLA,MAAO,KAAK+E,cAActE,IAAKuG,GAAMA,EAAI,EAAE,EAC3C9G,UAAWC,EAAa2G,sBAG7B,CACH,GAiBW1E,GAAmB,IAAIxB,EAAO,CACzCC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,gBACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,IAAIC,GAAW,CACpBD,MAAO,OACPE,UAAWC,EAAaG,qBACzB,EACF,EACF,EACY2B,GAAqB,IAAIrB,EAAO,CAC3CC,YAAa,CACXE,UAAW,gBACXC,SAAUC,EAAoBgG,UAC9BjH,MAAO,CACLA,MAAO,OACPE,UAAWC,EAAaG,uBAG7B,EACY+B,GAAmB,IAAIzB,EAAO,CACzCC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,cACXC,SAAUC,EAAoBC,MAC9BlB,MAAOD,GAAU,EAAI,EACtB,EACF,EACYiC,GAAsB,IAAIpB,EAAO,CAC5CC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,cACXC,SAAUC,EAAoBC,MAC9BlB,MAAOD,GAAU,EAAK,EACvB,EACF,EACYwD,GAAkB,IAAI3C,EAAO,CACxC2B,YAAa,IAAIC,GAAY,CAC3BzB,UAAW,aACXa,GAAIa,GAAoBC,QACzB,EACF,EACYC,GAA2B,IAAI/B,EAAO,CACjDC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,aACXC,SAAUC,EAAoBC,MAC9BlB,MAAOD,GAAU,EAAI,EACtB,EACF,EAoGYyD,IAAY,IAAA,CAAnB,MAAOA,CAAY,CAoFvBc,YACmB4C,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAA4B,CAN5B,KAAAN,iBAAAA,EACA,KAAAC,iBAAAA,EACA,KAAAC,cAAAA,EACA,KAAAC,oBAAAA,EACA,KAAAC,kBAAAA,EACA,KAAAC,iBAAAA,EACA,KAAAC,cAAAA,EAnCV,KAAAC,aAAe,KAAKF,iBAAiBG,iBAAiBC,KAC7DC,EAAWC,GACLC,GAAQD,CAAQ,EACX,KAAKL,cAAcO,MAAMJ,KAC9BlH,EAAKuH,GACI,CACL,IAAIC,GAAW,CACbC,QAAS,IAAIC,GAAgB,CAC3BC,eAAgBJ,EACjB,EACF,CAAC,CAEL,CAAC,EAGFK,GAAeR,CAAQ,EAClBS,GAAG,CACR,IAAIL,GAAW,CACbM,WAAY,IAAIC,GAAmB,CACjCD,WAAYV,EAASY,eACtB,EACF,CAAC,CACH,EAEIH,GAAG,CAAA,CAAE,CACb,CAAC,EAYF,KAAKI,eAAiBC,EAAc,CAClC,KAAKlB,aACL,KAAKN,iBAAiByB,qBAAqBjB,KAAKjG,GAAO,CAAC,CAACkD,EAAWC,CAAO,IAAM,CAAC,CAACD,GAAa,CAAC,CAACC,CAAO,CAAC,EAC1G,KAAKuC,cAAcyB,SACnB,KAAKvB,kBAAkBwB,cACvB,KAAKzB,oBAAoB0B,mBACzB,KAAK5B,iBAAiB6B,qBAAqB,CAC5C,EAAErB,KACDsB,GAAa,EAAE,EACfxI,EAAI,CAAC,CAACkE,EAAa,CAACC,EAAWC,CAAO,EAAG9C,EAASmH,GAAkBlE,GAAmBF,EAAS,IACvF,IAAIxB,GACTqB,EACAC,EACAC,EACAC,GACA/C,EACAmH,GACAlE,GACA,CAAC,WAAW,CAAC,CAEhB,EACDmE,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAGhD,KAAKC,WAAa,IAAIC,IAAuC,CAC3D,CACE,mBACA,KAAKC,YACH,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,YAAa,YAAa,SAAS,CAAC,EAClF,KAAKC,wBACL,CAAC,kBAAkB,CAAC,CACrB,CACF,CACF,EAED,KAAKC,gBAAkB,IAAIJ,IAAuC,CAChE,CACE,mBACA,KAAKC,YACH,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,YAAa,YAAa,SAAS,CAAC,EAClF,KAAKG,8BACL,CAAC,kBAAkB,CAAC,CACrB,CACF,CACF,EAED,KAAKC,eAAiB,KAAKL,YACzB,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,YAAa,YAAa,SAAS,CAAC,EAClF,KAAKK,8BACL,CAAC,kBAAkB,CAAC,EAGtB,IAAMC,EAAiB,KAAKN,mBAAmB,CAC7C,YACA,OACA,YACA,YACA,gBACA,oBACA,SAAS,CACV,EACD,KAAKO,UAAY,IAAIT,IAAuC,CAC1D,CAAC,mBAAoB,KAAKC,YAAYO,EAAgB,KAAKE,oBAAqB,CAAC,kBAAkB,CAAC,CAAC,EACrG,CACE,2BACA,KAAKT,YAAYO,EAAgB,KAAKG,2BAA4B,CAAC,kBAAkB,CAAC,CAAC,EAEzF,CAAC,YAAa,KAAKV,YAAYO,EAAgB,KAAKE,oBAAqB,CAAC,WAAW,CAAC,CAAC,EACvF,CACE,6BACA,KAAKT,YAAYO,EAAgB,KAAKE,oBAAqB,CAAC,mBAAoB,WAAW,CAAC,CAAC,EAE/F,CAKE,qCACA,KAAKT,YAAYO,EAAgB,KAAKE,oBAAqB,CAAC,mBAAoB,WAAW,EAAG,EAAE,CAAC,CAClG,CACF,EAED,KAAKE,gBAAkB,IAAIZ,IAAuC,CAChE,CAAC,mBAAoB,KAAKC,YAAYO,EAAgB,KAAKK,yBAA0B,CAAC,kBAAkB,CAAC,CAAC,EAC1G,CACE,2BACA,KAAKZ,YAAYO,EAAgB,KAAKM,gCAAiC,CAAC,kBAAkB,CAAC,CAAC,EAE9F,CAAC,YAAa,KAAKb,YAAYO,EAAgB,KAAKK,yBAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,CAC9F,EAGD,KAAKE,cAAgB,KAAKb,mBAAmB,CAC3C,YACA,OACA,YACA,YACA,gBACA,SAAS,CACV,EAAE9B,KACDC,EAAW2C,GAA+B,CAExC,GAAM,CAAC3F,EAAWC,CAAO,EAAI0F,EAAcvE,gBAAgB,GAAM,EAAI,EACrE,OAAO,KAAKkB,iBAAiBsD,aAC3B,IAAIC,EAAoB,CACtBC,UAAAA,EACAC,WAAY,UACZhG,YAAa4F,EAAc5F,YAC3BG,UAAWlC,GAAmBgC,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MACjC,EACF,CAAC,EAEJC,OAAQ6I,EAAchE,YAAY,CAACgE,EAAcxD,+BAA8B,CAAE,CAAC,EAClF9B,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CACT,CAAEA,UAAW,eAAe,EAC5B,CAAEA,UAAW,WAAW,EACxB,CAAEA,UAAW,QAAQ,EACrB,CAAEA,UAAW,QAAQ,EACrB,CAAEA,UAAW,gBAAgB,CAAE,EAEjC8J,gBAAiBC,EAAgBC,kBAClC,EACF,CAAC,CAEN,CAAC,EACD5B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAIhD,KAAK2B,uBAAyB,KAAKvB,mBAAmB,CAAC,YAAa,MAAM,CAAC,EAAE9B,KAC3EC,EAAW2C,GACF,KAAKrD,iBACTsD,aAAa,KAAKS,kCAAkCV,CAAa,CAAC,EAClE5C,KAAKuD,EAAU,IAA4B,CAAC,CAChD,EACD/B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAIhD,KAAK8B,wBAA0B,KAAK1B,mBAAmB,CAAC,YAAa,MAAM,CAAC,EAAE9B,KAC5EC,EAAW2C,GACF,KAAKrD,iBACTsD,aAAa,KAAKY,iCAAiCb,CAAa,CAAC,EACjE5C,KAAKuD,EAAU,IAA4B,CAAC,CAChD,EACD/B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAGhD,KAAKgC,cAAgB,KAAK5B,mBAAmB,CAAC,YAAa,OAAQ,YAAa,SAAS,CAAC,EAAE9B,KAC1FC,EAAW2C,GACF,KAAKrD,iBACTsD,aAAa,KAAKc,yBAAyBf,CAAa,CAAC,EACzD5C,KAAKuD,EAAU,IAA4B,CAAC,CAChD,EACD/B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAGhD,KAAKkC,cAAgB,KAAK/B,YACxB,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,YAAa,YAAa,SAAS,CAAC,EAClF,KAAK+B,yBACL,CAAA,CAAE,EAGJ,KAAKC,oBAAsB,KAAKjC,YAC9B,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,YAAa,SAAS,CAAC,EACrE,KAAKiC,+BACL,CAAA,CAAE,EAGJ,KAAKC,gBAAkB,KAAKnC,YAC1B,KAAKC,mBAAmB,CACtB,YACA,OACA,YACA,YACA,gBACA,oBACA,SAAS,CACV,EACD,KAAKmC,2BACL,CAAA,CAAE,EAGJ,KAAKC,qBAAuB,KAAKpC,mBAAmB,CAClD,YACA,OACA,gBACA,oBACA,SAAS,CACV,EAAE9B,KACDC,EAAW2C,GACF,KAAKrD,iBACTsD,aACC,KAAKsB,gCACHvB,EACA,IAAIK,EAAQ,CACV7J,UAAW,CACT,IAAIgL,EAAiB,CACnBhL,UAAW,6BACZ,EACD,IAAIgL,EAAiB,CACnBhL,UAAW,kBACZ,CAAC,EAEL,CAAC,CACH,EAEF4G,KAAKuD,EAAU,IAA4B,CAAC,CAChD,EACD/B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAGhD,KAAK2C,2BAA6B,KAAKvC,mBAAmB,CACxD,YACA,OACA,gBACA,oBACA,SAAS,CACV,EAAE9B,KACDC,EAAW2C,GACF,KAAKrD,iBACTsD,aAAa,KAAKsB,gCAAgCvB,EAAe,IAAIK,CAAS,CAAC,EAC/EjD,KAAKuD,EAAU,IAA4B,CAAC,CAChD,EACD/B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAIhD,KAAK4C,eAAiB,KAAKC,qBACzB,KAAKzC,mBAAmB,CAAC,YAAa,OAAQ,gBAAiB,SAAS,CAAC,EACzE,KAAK0C,wBAAwB,EAG/B,KAAKC,iCAAmC,KAAK5C,YAC3C,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,gBAAiB,UAAW,oBAAqB,WAAW,CAAC,EAC3G,KAAK4C,qCACL,CAAC,4BAA4B,CAAC,EAGhC,KAAKC,+BAAiC,KAAK9C,YACzC,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,gBAAiB,UAAW,oBAAqB,WAAW,CAAC,EAC3G,KAAK4C,qCACL,CAAC,iBAAiB,CAAC,EAGrB,KAAKE,uBAAyB,KAAK/C,YACjC,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,gBAAiB,UAAW,oBAAqB,WAAW,CAAC,EAC3G,KAAK4C,qCACL,CAAA,CAAE,EAGJ,KAAKG,cAAgB,KAAKhD,YACxB,KAAKC,mBAAmB,CAAC,YAAa,OAAQ,YAAa,YAAa,SAAS,CAAC,EAClF,KAAKgD,yBACL,CAAA,CAAE,EAIJ,KAAKC,gBAAkB,KAAKjD,mBAAmB,CAAC,YAAa,MAAM,CAAC,EAAE9B,KACpEC,EAAW2C,GACF,KAAKrD,iBACTsD,aAAa,KAAKmC,yBAAyBpC,CAAa,CAAC,EACzD5C,KAAKuD,EAAU,IAA4B,CAAC,CAChD,EACD/B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAIhD,KAAKuD,mBAAqB,KAAKnD,mBAAmB,CAAC,YAAa,OAAQ,WAAW,CAAC,EAAE9B,KACpFC,EAAW2C,GACF,KAAKrD,iBACTsD,aAAa,KAAKqC,mBAAmBtC,EAAe,GAAM,EAAK,CAAC,EAChE5C,KAAKuD,EAAU,IAA4B,CAAC,CAChD,EACD/B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAGhD,KAAKyD,qBAAuB,KAAKrD,mBAAmB,CAAC,YAAa,OAAQ,WAAW,CAAC,EAAE9B,KACtFC,EAAW2C,GACF,KAAKrD,iBACTsD,aAAa,KAAKqC,mBAAmBtC,EAAe,GAAM,EAAI,CAAC,EAC/D5C,KAAKuD,EAAU,IAA4B,CAAC,CAChD,EACD/B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAGhD,IAAM0D,EAAyB,KAAKtD,mBAAmB,CAAC,YAAa,OAAQ,YAAa,SAAS,CAAC,EACpG,KAAKuD,eAAiB,KAAKxD,YAAYuD,EAAwB,KAAKE,2BAA4B,CAAC,YAAY,CAAC,EAC9G,KAAKC,kBAAoB,KAAK1D,YAAYuD,EAAwB,KAAKI,8BAA+B,CAAA,CAAE,CAC1G,CAEA3D,YACEd,EACA0E,EACAnI,EACAoI,EAAc,CAEd,IAAMC,EAAU5E,EAAef,KAC7BC,EAAW2C,GAA+B,CACxC,IAAMgD,EAAMH,EAAe7C,EAAe,GAAMtF,CAAO,EACvDsI,OAAAA,EAAIF,MAAQA,EACL,KAAKnG,iBAAiBsD,aAAa+C,CAAG,CAC/C,CAAC,EACDpE,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAE1CmE,EAAO9E,EAAef,KAC1BC,EAAW2C,GAA+B,CACxC,IAAMgD,EAAMH,EAAe7C,EAAe,GAAOtF,CAAO,EACxDsI,OAAAA,EAAIF,MAAQA,EACL,KAAKnG,iBAAiBsD,aAAa+C,CAAG,CAC/C,CAAC,EACDpE,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAEhD,OAAO,IAAIoE,GAA0BH,EAASE,CAAI,CACpD,CAEAtB,qBACExD,EACA0E,EAA8B,CAE9B,OAAO1E,EAAef,KACpBC,EAAW2C,GACF,KAAKrD,iBAAiBsD,aAAa4C,EAAe7C,EAAe,GAAM,CAAA,CAAE,CAAC,CAClF,EACDpB,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,CAElD,CAEAY,oBAAoBM,EAA6B3E,EAA2BX,EAAiB,CAC3F,GAAM,CAACL,EAAWC,CAAO,EAAI0F,EAAcvE,gBAAgBJ,CAAgB,EAC3E,OAAO,IAAI6E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,UACZhG,YAAa4F,EAAc5F,YAC3BG,UAAWlC,GAAmBgC,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,kBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,kBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,oBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,mBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,mBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,cACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,SAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,YACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBe,gBAAiB,CACfC,GAAIC,EAAwBS,GAC5BP,QAAS,CACP,IAAInB,EAAO,CACTC,YAAa,CACXE,UAAW,gBACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,oBAGZ,EACD,IAAIY,EAAO,CACTC,YAAa,CACXE,UAAW,gBACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,4BAGZ,CAAC,GAGP,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,cACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,gBACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,oBAGZ,EACF,EACF,CAAC,EAEJ0B,OAAQ6I,EAAchE,YAAY,CAACgE,EAAc/D,yBAAwB,CAAE,CAAC,EAC5EvB,QAAS,IAAI2F,EAAQ,CACnB7J,UAAWkE,EACRxE,IAAKiN,IACG,CAAE3M,UAAW2M,CAAG,EACxB,EACAvL,OAAO,CAAC,CAAEpB,UAAW,WAAW,CAAE,CAAC,EACtC8J,gBAAiBC,EAAgB6C,cAClC,EACDC,UAAWC,GAAUC,YACrBzH,gBAAiB,IAAI0H,GAAgB,CAGnCC,SAAUC,GAAwBC,cACnC,EACF,CACH,CAEAhE,2BAA2BK,EAA6B4D,EAAYlJ,EAAiB,CACnF,OAAO,IAAIwF,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,UACZhG,YAAa4F,EAAc5F,YAC3BnE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,kBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,kBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,oBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,mBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,mBACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,MAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,cACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,SAGZ,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,YACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBe,gBAAiB,CACfC,GAAIC,EAAwBS,GAC5BP,QAAS,CACP,IAAInB,EAAO,CACTC,YAAa,CACXE,UAAW,gBACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,oBAGZ,EACD,IAAIY,EAAO,CACTC,YAAa,CACXE,UAAW,gBACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,4BAGZ,CAAC,GAGP,EACF,EACF,EACD,IAAImB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,cACPZ,QAAS,IACTC,MAAOC,EAAyBC,MAChCC,OAAQ,IAAId,EAAO,CACjBC,YAAa,CACXE,UAAW,gBACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,CACLA,MAAO,oBAGZ,EACF,EACF,CAAC,EAEJ0B,OAAQ6I,EAAchE,YAAY,CAACgE,EAAc/D,yBAAwB,CAAE,CAAC,EAC5EvB,QAAS,IAAI2F,EAAQ,CACnB7J,UAAWkE,EACRxE,IAAKiN,IACG,CAAE3M,UAAW2M,CAAG,EACxB,EACAvL,OAAO,CAAC,CAAEpB,UAAW,WAAW,CAAE,CAAC,EACtC8J,gBAAiBC,EAAgB6C,cAClC,EACF,CACH,CAEAvD,yBACEG,EACA3E,EACAX,EAAiB,CAEjB,GAAM,CAACL,EAAWC,CAAO,EAAI0F,EAAcvE,gBAAgBJ,CAAgB,EACrE2H,EAAM,IAAI9C,EAAoB,CAClCC,UAAAA,EACAC,WAAY,uBACZhG,YAAa4F,EAAc5F,YAC5B,EACD4I,OAAAA,EAAI/M,SAAW,CACb,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,gBACTC,MAAOC,EAAyB4M,IAChClM,MAAO,gBACR,EACF,CAAC,EAEJqL,EAAItI,QAAU,IAAI2F,EAAQ,CACxB7J,UAAWkE,EAAQxE,IAAKiN,IACf,CAAE3M,UAAW2M,CAAG,EACxB,EACF,EACDH,EAAIzI,UAAYlC,GAAmBgC,EAAWC,CAAO,EAC9C0I,CACT,CAEAlD,gCACEE,EACA3E,EACAX,EAAiB,CAEjB,IAAMsI,EAAM,IAAI9C,EAAoB,CAClCC,UAAAA,EACAC,WAAY,uBACZhG,YAAa4F,EAAc5F,YAC5B,EACD4I,OAAAA,EAAI/M,SAAW,CACb,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,gBACTC,MAAOC,EAAyB4M,IAChClM,MAAO,gBACR,EACF,CAAC,EAEJqL,EAAItI,QAAU,IAAI2F,EAAQ,CACxB7J,UAAWkE,EAAQxE,IAAKiN,IACf,CAAE3M,UAAW2M,CAAG,EACxB,EACF,EACMH,CACT,CAEA7D,wBACEa,EACA3E,EACAX,EAAoB,CAAC,kBAAkB,EAAC,CAExC,GAAM,CAACL,EAAWC,CAAO,EAAI0F,EAAc1E,aAAaD,CAAgB,EACxE,OAAO,IAAI6E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,eACZhG,YAAa4F,EAAc5F,YAC3BG,UAAWlC,GAAmBgC,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,aACPZ,QAAS,aACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,eACPZ,QAAS,eACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,kBACPZ,QAAS,kBACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,gBACPZ,QAAS,gBACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,6BACPZ,QAAS,6BACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,mBACPZ,QAAS,mBACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,wBACPZ,QAAS,wBACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,sBACPZ,QAAS,sBACTC,MAAOC,EAAyB6M,IACjC,EACF,CAAC,EAEJ3M,OAAQ6I,EAAchE,YAAY,IAAI,EACtCtB,QAAS,IAAI2F,EAAQ,CACnB7J,UAAWkE,EACRxE,IAAKiN,IACG,CAAE3M,UAAW2M,CAAG,EACxB,EACAvL,OAAO,CAAC,CAAEpB,UAAW,YAAY,CAAE,CAAC,EACvC8J,gBAAiBC,EAAgB6C,cACjCW,mBAAoB,CAClB,IAAIC,GAA0B,CAC5BC,WAAY,CAAC,mBAAoB,YAAY,EAC9C,CAAC,EAEL,EACDZ,UAAWC,GAAUC,YACrBzH,gBAAiB,IAAI0H,GAAgB,CACnCC,SAAUzD,EAAclE,gBAAe,EACxC,EACF,CACH,CAEAuD,8BACEW,EACA3E,EACAX,EAAoB,CAAC,kBAAkB,EAAC,CAExC,GAAM,CAACL,EAAWC,CAAO,EAAI0F,EAAc1E,aAAaD,CAAgB,EACxE,OAAO,IAAI6E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,eACZhG,YAAa4F,EAAc5F,YAC3BG,UAAW7B,GAAmB2B,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,yBACPZ,QAAS,yBACTC,MAAOC,EAAyBiN,IACjC,EACF,EACD,IAAItN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9Ba,MAAO,wBACPZ,QAAS,wBACTC,MAAOC,EAAyBiN,IACjC,EACF,CAAC,EAEJ/M,OAAQ6I,EAAchE,YAAY,IAAI,EACtCtB,QAAS,IAAI2F,EAAQ,CACnB7J,UAAWkE,EACRxE,IAAKiN,IACG,CAAE3M,UAAW2M,CAAG,EACxB,EACAvL,OAAO,CACN,IAAI4J,EAAiB,CACnB2C,eAAgB,CACd3N,UAAW,aACX4N,MAAOC,GAAMC,WACbxB,MAAO,GAEV,CAAC,CACH,EACHxC,gBAAiBC,EAAgBC,kBAClC,EACF,CACH,CAEAjB,8BACES,EACA3E,EACAX,EAAoB,CAAC,kBAAkB,EAAC,CAExC,GAAM,CAACL,EAAWC,CAAO,EAAI0F,EAAc5E,UAAUC,CAAgB,EAE/D/C,KAAQiM,GAAAA,SAAOlK,CAAS,EAAEP,IAAG,EAAG0K,KAAK,CAAC,EAE5C,OAAO,IAAItE,EAAoB,CAC7BC,UAAWA,EACXC,WAAY,sBACZhG,YAAa4F,EAAc5F,YAC3BG,UAAW7B,GAAmBJ,EAAM6C,OAAM,EAAIb,CAAO,EACrDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,QACTC,MAAOC,EAAyB6M,IACjC,EACF,CAAC,EAEJ3M,OAAQ6I,EAAchE,YAAY,IAAI,EACtCtB,QAAS,IAAI2F,EAAQ,CACnB7J,UAAWkE,EACRxE,IAAKiN,IACG,CAAE3M,UAAW2M,CAAG,EACxB,EACAvL,OAAO,CAAC,CAAEpB,UAAW,YAAY,CAAE,CAAC,EACvC8J,gBAAiBC,EAAgB6C,cACjCW,mBAAoB,CAClB,IAAIC,GAA0B,CAC5BC,WAAY,CAAC,mBAAoB,YAAY,EAC9C,CAAC,EAEL,EACDZ,UAAWC,GAAUC,YACrBzH,gBAAiB,IAAI0H,GAAgB,CACnCC,SAAUC,GAAwBe,eACnC,EACF,CACH,CAEQ/D,kCAAkCgE,EAA0B,CAClE,OAAO,IAAIxE,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,gBACZhG,YAAasK,EAAatK,YAC1BnE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MACjC,EACF,CAAC,EAEJwD,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CACT,CAAEA,UAAW,wBAAwB,EACrC,CAAEA,UAAW,sBAAsB,EACnC,CAAEA,UAAW,qBAAqB,CAAE,EAEtC8J,gBAAiBC,EAAgBoE,gBAClC,EACF,CACH,CAEQ9D,iCAAiC6D,EAA0B,CAGjE,OAAO,IAAIxE,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,gBACZhG,YAAasK,EAAatK,YAC1BnE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MACjC,EACF,CAAC,EAEJwD,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CAAC,CAAEA,UAAW,wBAAwB,CAAE,EACnD8J,gBAAiBC,EAAgBC,kBAClC,EACF,CACH,CAEQO,yBAAyBf,EAA2B,CAC1D,OAAO,IAAIE,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,gBACZhG,YAAa4F,EAAc5F,YAC3BnE,SAAU,CACR,IAAIW,EAAQ,CACVG,QAAS,kCACV,CAAC,EAEJI,OAAQ6I,EAAchE,YAAY,IAAI,EACvC,CACH,CAEQiF,yBAAyBjB,EAA6B4E,EAAkB,CAC9E,GAAM,CAACvK,EAAWC,CAAO,EAAI0F,EAAc5E,UAAUwJ,CAAS,EAC9D,OAAO,IAAI1E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,gBACZhG,YAAa4F,EAAc5F,YAC3BG,UAAWlC,GAAmBgC,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,QACTC,MAAOC,EAAyB4M,IACjC,EACF,EACD,IAAIjN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,QACTC,MAAOC,EAAyBiN,IACjC,EACF,EACD,IAAItN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MACjC,EACF,CAAC,EAEJwD,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CACT,IAAIgL,EAAiB,CACnBhL,UAAW,YACZ,CAAC,EAEJ8J,gBAAiBC,EAAgBC,kBAClC,EACD1E,gBAAiB,IAAI0H,GAAgB,CACnCC,SAAUzD,EAAclE,gBAAe,EACxC,EACDuH,UAAWC,GAAUuB,YACrB1N,OAAQ6I,EAAchE,YAAY,IAAI,EACvC,CACH,CAEQmF,+BAA+BnB,EAA6B4E,EAAkB,CACpF,GAAM,CAACvK,EAAWC,CAAO,EAAI0F,EAAc5E,UAAUwJ,CAAS,EAC9D,OAAO,IAAI1E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,gBACZhG,YAAa4F,EAAc5F,YAC3BG,UAAW,IAAI/B,GAAU,CAAEF,MAAO+B,EAAW9B,IAAK+B,CAAO,CAAE,EAC3DrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,QACTC,MAAOC,EAAyBiN,IACjC,EACF,EACD,IAAItN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,cACTC,MAAOC,EAAyBiN,IACjC,EACF,EACD,IAAItN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,eACTC,MAAOC,EAAyBiN,IACjC,EACF,EACD,IAAItN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,YACTC,MAAOC,EAAyBiN,IACjC,EACF,CAAC,EAEJxJ,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CACT,IAAIgL,EAAiB,CACnBhL,UAAW,mBACZ,EACD,IAAIgL,EAAiB,CACnB2C,eAAgB,CACd3N,UAAW,YACX4N,MAAOC,GAAMC,WACbxB,MAAO,GAEV,CAAC,EAEJxC,gBAAiBC,EAAgBC,kBAClC,EACDrJ,OAAQ6I,EAAchE,YAAY,IAAI,EACvC,CACH,CAEQqF,2BAA2BrB,EAA6B4E,EAAkB,CAChF,GAAM,CAACvK,EAAWC,CAAO,EAAI0F,EAAc5E,UAAUwJ,CAAS,EAE9D,OAAO,IAAI1E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,6BACZhG,YAAa4F,EAAc5F,YAC3BG,UAAWlC,GAAmBgC,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MACjC,EACF,CAAC,EAEJwD,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CACT,IAAIgL,EAAiB,CACnBhL,UAAW,YACZ,EACD,IAAIgL,EAAiB,CACnBhL,UAAW,SACZ,EACD,IAAIgL,EAAiB,CACnBhL,UAAW,UACZ,CAAC,EAEJ8J,gBAAiBC,EAAgB6C,cACjCW,mBAAoB,CAIlB,IAAIC,GAA0B,CAAEC,WAAY,CAAA,CAAE,CAAE,EAChD,IAAID,GAA0B,CAAEC,WAAY,CAAC,QAAQ,CAAC,CAAE,EACxD,IAAID,GAA0B,CAAEC,WAAY,CAAC,SAAS,CAAC,CAAE,EACzD,IAAID,GAA0B,CAAEC,WAAY,CAAC,WAAW,CAAC,CAAE,EAC3D,IAAID,GAA0B,CAC5BC,WAAY,CAAC,YAAa,SAAS,EACpC,EACD,IAAID,GAA0B,CAAEC,WAAY,CAAC,SAAU,SAAS,CAAC,CAAE,CAAC,EAEvE,EACDnI,gBAAiB,IAAI0H,GAAgB,CACnCC,SAAUzD,EAAclE,gBAAe,EACxC,EACDuH,UAAWC,GAAUuB,YAGrB1N,OAAQ6I,EAAchE,YAAY,CAACgE,EAAc/D,yBAAyB,QAAQ,CAAC,CAAC,EACrF,CACH,CAEQsF,gCAAgCvB,EAA6BtF,EAAgB,CACnF,OAAO,IAAIwF,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,yBACZhG,YAAa4F,EAAc5F,YAC3BjD,OAAQ,IAAId,EAAO,CACjBe,gBAAiB,CACfC,GAAIC,EAAwBC,IAC5BC,QAAS,CACPwI,EAAc/D,yBAAyB,iBAAiB,EACxD,IAAI5F,EAAO,CACTC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,kBACXC,SAAUC,EAAoBgG,UAC9BjH,MAAO,CACLA,MAAO,QACPE,UAAWC,EAAaG,sBAE3B,EACF,CAAC,GAGP,EACDE,SAAUD,GAAyB,EACnC0E,QAASA,EACTH,UAAW,CAAEhC,IAAK,IAAIuM,IAAM,EAC7B,CACH,CAEQlD,yBAAyB5B,EAA2B,CAC1D,OAAO,IAAIE,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,yBACZhG,YAAa4F,EAAc5F,YAC3BjD,OAAQ,IAAId,EAAO,CACjBe,gBAAiB,CACfC,GAAIC,EAAwBC,IAC5BC,QAAS,CACPwI,EAAchE,YAAY,CAACgE,EAAc/D,yBAAyB,iBAAiB,CAAC,CAAC,EACrF,IAAI5F,EAAO,CACTC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,kBACXC,SAAUC,EAAoBgG,UAC9BjH,MAAO,CACLA,MAAO,QACPE,UAAWC,EAAaG,sBAE3B,EACF,CAAC,GAGP,EACDE,SAAUD,GAAyB,EACnC0E,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CACT,IAAIgL,EAAiB,CACnBhL,UAAW,kBACZ,CAAC,EAEL,EACD+D,UAAW,CAAEhC,IAAK,IAAIuM,IAAM,EAC7B,CACH,CAEQhD,qCACN9B,EACA3E,EACAX,EAAiB,CAEjB,GAAM,CAAA,CAAGJ,CAAO,EAAI0F,EAAc5E,UAAUC,CAAgB,EAE5D,OAAO,IAAI6E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,yBACZhG,YAAa4F,EAAc5F,YAC3BG,UAAW,IAAI/B,GAAU,CACvBD,OAAKqB,EAAAA,SAAMU,CAAO,EAAEa,OAAM,EAC3B,EACDhE,OAAQ6I,EAAchE,YAAY,CAChCgE,EAAc/D,yBAAyB,iBAAiB,EACxD,IAAI5F,EAAO,CACTC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,kBACXC,SAAUC,EAAoBgG,UAC9BjH,MAAO,CACLA,MAAO,QACPE,UAAWC,EAAaG,sBAE3B,EACF,CAAC,CACH,EACDE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCS,MAAO,WACPR,OAAQ,CACNC,gBAAiB,CACfI,QAAS,CAACK,GAAkBC,EAAgB,EAC5CT,GAAIC,EAAwBS,KAGjC,EACF,EACD,IAAInB,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCS,MAAO,aACPR,OAAQ,IAAId,EAAO,CACjBe,gBAAiB,CACfI,QAAS,CAACE,GAAoBD,EAAmB,EACjDJ,GAAIC,EAAwBC,KAE/B,EACF,EACF,EACD,IAAIX,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MAChCS,MAAO,UACPR,OAAQ6B,GACT,EACF,CAAC,EAEJ0B,QAAS,IAAI2F,EAAQ,CACnB7J,UAAWkE,EAAQxE,IAAKiN,IACf,CAAE3M,UAAW2M,CAAG,EACxB,EACF,EACF,CACH,CAEAf,yBAAyBpC,EAA2B,CAClD,OAAO,IAAIE,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,0BACZhG,YAAa4F,EAAc5F,YAC3BnE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,IACTC,MAAOC,EAAyBC,MACjC,EACF,CAAC,EAEJwD,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CACT,IAAIgL,EAAiB,CACnBhL,UAAW,mBACZ,CAAC,EAEJ8J,gBAAiBC,EAAgBC,kBAClC,EACF,CACH,CAEQ0B,yBAAyBlC,EAA6B4E,EAAkB,CAC9E,GAAM,CAACvK,EAAWC,CAAO,EAAI0F,EAAcnE,iBAAiB+I,CAAS,EACrE,OAAO,IAAI1E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,kCACZhG,YAAa4F,EAAc5F,YAC3BG,UAAWlC,GAAmBgC,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,cACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,SACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,cACTC,MAAOC,EAAyB6M,IACjC,EACF,EACD,IAAIlN,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,eACTC,MAAOC,EAAyB6M,IACjC,EACF,CAAC,EAEJpJ,QAAS,IAAI2F,EAAQ,CACnB7J,UAAW,CACT,IAAIgL,EAAiB,CACnBhL,UAAW,mBACZ,EACD,IAAIgL,EAAiB,CACnBhL,UAAW,aACZ,CAAC,EAEJ8J,gBAAiBC,EAAgB6C,cACjCW,mBAAoB,CAClB,IAAIC,GAA0B,CAC5BC,WAAY,CAAC,mBAAoB,YAAY,EAC9C,CAAC,EAEL,EACDnI,gBAAiB,IAAI0H,GAAgB,CACnCC,SAAUzD,EAAclE,gBAAe,EACxC,EACDuH,UAAWC,GAAUC,YACrBpM,OAAQ6I,EAAchE,YAAW,EAClC,CACH,CAEQsG,mBACNtC,EACA+E,EACAC,EAAmB,CAEnB,IAAM/O,EAAW,CAAC,IAAIW,EAAQ,CAAEG,QAAS,kBAAkB,CAAE,CAAC,EAC1D2D,EAAU,KACTqK,EAOHrK,EAAU,IAAI2F,EAAQ,CACpB7J,UAAW,CACT,IAAIgL,EAAiB,CACnBhL,UAAW,mBACZ,CAAC,EAEJ8J,gBAAiBC,EAAgBC,kBAClC,EAbDvK,EAAS2B,OAAO,CACd,IAAIhB,EAAQ,CAAEG,QAAS,mBAAmB,CAAE,EAC5C,IAAIH,EAAQ,CAAEG,QAAS,cAAc,CAAE,EACvC,IAAIH,EAAQ,CAAEG,QAAS,gBAAgB,CAAE,CAAC,CAC3C,EAWH,IAAMS,EAAU,CACd,IAAInB,EAAO,CACTC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,eACXf,MAAO,IAAIC,GAAW,CACpBD,MAAO,GACPE,UAAWC,EAAaC,mBACzB,EACDY,SAAUC,EAAoBC,MAC/B,EACF,EACD,IAAIN,EAAO,CACTC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,iBACXf,MAAO,IAAIC,GAAW,CACpBD,MAAO,GACPE,UAAWC,EAAaC,mBACzB,EACDY,SAAUC,EAAoBC,MAC/B,EACF,CAAC,EAEJ,OAAIqO,GACFxN,EAAQyN,KACN,IAAI5O,EAAO,CACTC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,mBACXf,MAAO,IAAIC,GAAW,CACpBD,MAAO,GACPE,UAAWC,EAAaC,mBACzB,EACDY,SAAUC,EAAoBC,MAC/B,EACF,CAAC,EAGC,IAAIuJ,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,qBACZnK,SAAAA,EACAmE,YAAa4F,EAAc5F,YAC3BjD,OAAQ,IAAId,EAAO,CACjBe,gBAAiB,IAAI8N,GAAgB,CACnC7N,GAAIC,EAAwBC,IAC5BC,QAASA,EACV,EACF,EACDkD,QAAAA,EACD,CACH,CAEQgI,2BACN1C,EACA3E,EACAX,EAAiB,CAEjB,GAAM,CAACL,EAAWC,CAAO,EAAI0F,EAAc5E,UAAUC,CAAgB,EACrE,OAAO,IAAI6E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,mCACZhG,YAAa4F,EAAc5F,YAC3BG,UAAWlC,GAAmBgC,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,kBACTC,MAAOC,EAAyBC,MACjC,EACF,CAAC,EAEJC,OAAQ6I,EAAchE,YAAYgE,EAAcxI,OAAO,EACvDkD,QAAS,IAAI2F,EAAQ,CACnB7J,UAAWkE,EAAQxE,IAAKiN,IACf,CAAE3M,UAAW2M,CAAG,EACxB,EACF,EACF,CACH,CAEQP,8BAA8B5C,EAA6B3E,EAAyB,CAC1F,GAAM,CAAChB,EAAWC,CAAO,EAAI0F,EAAc5E,UAAUC,CAAgB,EACrE,OAAO,IAAI6E,EAAoB,CAC7BC,UAAAA,EACAC,WAAY,yBACZhG,YAAa4F,EAAc5F,YAC3BG,UAAWlC,GAAmBgC,EAAWC,CAAO,EAChDrE,SAAU,CACR,IAAIW,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,SACTC,MAAOC,EAAyBC,MAChCS,MAAO,gBACPR,OAAQ,IAAId,EAAO,CACjBC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,IAAIC,GAAW,CACpBD,MAAO,CAAC,UAAW,SAAU,OAAQ,WAAW,EAChDE,UAAWC,EAAaG,qBACzB,EACDmG,iBAAkBC,GAA4BC,IAC/C,EACF,EACF,EACF,EACD,IAAIxF,EAAQ,CACVC,UAAW,IAAIC,EAAiB,CAC9BC,QAAS,SACTC,MAAOC,EAAyBC,MAChCS,MAAO,gBACPR,OAAQ,IAAId,EAAO,CACjBC,YAAa,IAAIC,EAAY,CAC3BC,UAAW,SACXC,SAAUC,EAAoBC,MAC9BlB,MAAO,IAAIC,GAAW,CACpBD,MAAO,CAAC,UAAW,QAAQ,EAC3BE,UAAWC,EAAaG,qBACzB,EACDmG,iBAAkBC,GAA4BC,IAC/C,EACF,EACF,EACF,CAAC,EAEJjF,OAAQ6I,EAAchE,YAAYgE,EAAcxI,OAAO,EACxD,CACH,CAEO0H,mBAAmBiG,EAAmB,CAC3C,IAAMC,EAAeD,EAAUE,OAAO,CAACC,EAAGC,KACxCD,EAAEC,CAAC,EAAI,GACAD,GACN,CAAA,CAAE,EACL,OAAOlH,EAAc,CACnB,KAAKlB,aACLkI,EAAa,UACT,KAAKxI,iBAAiByB,qBAAqBjB,KAAKjG,GAAO,CAAC,CAACkD,EAAWC,CAAO,IAAM,CAAC,CAACD,GAAa,CAAC,CAACC,CAAO,CAAC,EAC1GyD,GAAG,CAAC,KAAM,IAAI,CAAC,EACnBqH,EAAa,UAAe,KAAKxI,iBAAiB6B,sBAAwBV,GAAG,IAAI,EACjFqH,EAAa,kBAAuB,KAAKtI,oBAAoB0B,mBAAqBT,GAAG,IAAI,EACzFqH,EAAa,cAAmB,KAAKrI,kBAAkBwB,cAAgBR,GAAG,IAAI,EAC9EqH,EAAa,QAAa,KAAKvI,cAAcyB,SAAWP,GAAG,IAAI,CAAC,CACjE,EAAEX,KACDsB,GAAa,EAAE,EACfxI,EAAI,CAAC,CAACkE,EAAa,CAACC,EAAWC,CAAO,EAAGC,EAAWE,EAAmBkE,EAAkBnH,CAAO,IACvF,IAAIuB,GACTqB,EACAC,EACAC,EACAC,EACA/C,EACAmH,EACAlE,EACA,CAAA,CAAE,CAEL,EACDmE,EAAY,CAAEE,WAAY,EAAGD,SAAU,EAAI,CAAE,CAAC,CAElD,iDAlkDW5F,GAAYuM,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAAAF,EAAAG,EAAA,EAAAH,EAAAI,EAAA,EAAAJ,EAAAK,EAAA,EAAAL,EAAAM,EAAA,EAAAN,EAAAO,EAAA,CAAA,CAAA,CAAA,kCAAZ9M,EAAY+M,QAAZ/M,EAAYgN,UAAAC,WADC,MAAM,CAAA,CAAA,SACnBjN,CAAY,GAAA,ICzHzB,SAASkN,GAAuBC,EAAS,CACvC,OAAOA,EACJC,MAAM,GAAG,EACTC,IAAKC,GAAMA,EAAEC,OAAO,CAAC,EAAEC,YAAW,EAAKF,EAAEG,MAAM,CAAC,EAAEC,YAAW,CAAE,EAC/DC,KAAK,GAAG,CACb,CA7OA,IAWMC,GAIAC,GAWAC,GAYAC,GAqBOC,GA3DbC,GAAAC,EAAA,KAIAC,KACAC,KAGAC,8BAGMT,GAAN,KAA6B,CAC3BU,YAAmBC,EAAuCC,EAAoB,CAA3D,KAAAD,eAAAA,EAAuC,KAAAC,aAAAA,CAAuB,GAG7EX,GAAN,KAAkB,CAChBS,YACSG,EACAC,EACAC,EACAC,EACAC,EACAL,EAAoB,CALpB,KAAAC,YAAAA,EACA,KAAAC,QAAAA,EACA,KAAAC,MAAAA,EACA,KAAAC,UAAAA,EACA,KAAAC,KAAAA,EACA,KAAAL,aAAAA,CACN,GAGCV,GAAN,KAAa,CACXQ,YAAmBG,EAA4BK,EAA4BC,EAAoC,CAA5F,KAAAN,YAAAA,EAA4B,KAAAK,YAAAA,EAA4B,KAAAC,gBAAAA,CAAuC,CAElHC,UAAUJ,EAAiB,CACzB,IAAMK,EAAM,KAAKF,gBAAgBG,IAAIN,CAAS,EAC9C,OAAKK,GACIL,CAGX,GAGIb,GAAN,KAAoB,CAClBO,YAAmBa,EAA0C,CAA1C,KAAAA,qBAAAA,CAA6C,CAEzDL,YAAYL,EAAmB,CACpC,IAAMQ,EAAM,KAAKE,qBAAqBD,IAAIT,CAAW,EACrD,OAAKQ,EAGEA,EAAIH,YAFFL,CAGX,CAEOO,UAAUP,EAAqBG,EAAiB,CACrD,IAAMK,EAAM,KAAKE,qBAAqBD,IAAIT,CAAW,EACrD,OAAKQ,EAGEA,EAAID,UAAUJ,CAAS,EAFrBA,CAGX,GAIWZ,IAAyB,IAAA,CAAhC,MAAOA,CAAyB,CAUpCM,YACUc,EACAC,EACAC,EACAC,EAAgC,CAHhC,KAAAH,aAAAA,EACA,KAAAC,WAAAA,EACA,KAAAC,iBAAAA,EACA,KAAAC,gBAAAA,EAER,KAAKC,gCAAkC,KAAKC,oBAAmB,EAE/D,KAAKC,0BAA4BC,EAAc,CAC7C,KAAKL,iBAAiBM,sBACtB,KAAKJ,+BAA+B,CACrC,EAAEK,KACDxC,EAAI,CAAC,CAACyC,EAAWC,CAAa,IAAK,CACjC,GAAID,GAAa,MAAQC,GAAiB,KACxC,OAAO,KAET,IAAMC,EAAW,CAAA,EACjBC,cAAOC,KAAKJ,CAAS,EAClBzC,IAAK8C,GAAML,EAAUK,CAAC,CAAC,EACvBC,QAASC,GAAoB,CACvBN,EAAcO,IAAID,EAAGE,cAAc,IAGxCP,EAASK,EAAGE,cAAc,EAAIF,EAChC,CAAC,EACIL,CACT,CAAC,EACDQ,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EAGhD,KAAKC,oBAAsB,KAAKpB,gBAC7BqB,eAAc,EACdf,KAAKW,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,EACtD,KAAKG,mBAAqB,KAAKzB,aAAa0B,wBAAwBjB,KAClExC,EAAK0D,GACCA,GAAK,KACA,KAEFC,GAAOD,EAAEE,cAAc,CAAC,CAAC,CACjC,CAAC,EAEJ,KAAKC,sBAAwBvB,EAAc,CAAC,KAAKgB,oBAAqB,KAAKE,kBAAkB,CAAC,EAAEhB,KAC9FxC,EAAI,CAAC,CAAC8D,EAAQC,CAAS,IAAK,CAC1B,GAAI,CAACD,GAAU,CAACC,EACd,OAAO,KAET,IAAMC,EAAY,IAAIC,IACtBH,EAAOf,QAASmB,GAAO,CACrBF,EAAUG,IAAID,EAAIE,GAAIF,CAAG,CAC3B,CAAC,EACD,IAAMG,EAAc,IAAIJ,IAExBF,OAAAA,EAAUhB,QAASuB,GAAO,CAExBC,MAAMC,KAAa,IAAIC,IAAIH,EAAII,OAAO,CAAC,CAAC,CAAC,EAAE3B,QAAS4B,GAAS,CAC3D,IAAMC,EAAWP,EAAYxC,IAAI8C,CAAK,EAClCC,GAEFA,EAASzD,cAAgB,CAACmD,EAAIO,SAAS,CAAC,EACxCR,EAAYF,IAAIQ,EAAOC,CAAQ,GAG/BP,EAAYF,IAAIQ,EAAO,IAAIpE,GAAwByD,EAAUnC,IAAI8C,CAAK,EAAG,CAACL,EAAIO,SAAS,CAAC,CAAC,CAAC,CAE9F,CAAC,CACH,CAAC,EACMR,CACT,CAAC,EACDlB,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,CAElD,CAEQjB,qBAAmB,CACzB,OAAO,KAAKL,aAAa+C,cAActC,KACrCuC,GAAQrB,GAAM,CAAC,CAACA,CAAC,EACjB1D,EAAK0D,GAA2B,CAC9B,IAAMsB,EAAI,IAAIP,IACd,OAAIf,GACFC,GAAOD,EAAEE,cAAc,CAAC,CAAC,EAAEb,QAASuB,GAAO,CACzCU,EAAEC,IAAIX,EAAIO,SAAS,CAAC,EAAE,CAAC,CAAC,CAC1B,CAAC,EAEIG,CACT,CAAC,EACD7B,EAAY,CAAEC,SAAU,GAAMC,WAAY,CAAC,CAAE,CAAC,CAElD,CAEO6B,yBAAuB,CAC5B,IAAMC,EAAQ,KAAKpD,aAAaqD,uBAAuB5C,KACrDxC,EAAK0D,GACCA,GAAK,KACA,KAEFC,GAAOD,EAAEE,cAAc,CAAC,CAAC,CACjC,CAAC,EAEEyB,EAAcF,EAAM3C,KACxB8C,EAAWC,GAAK,CACd,GAAI,CAACA,EACH,OAAOC,GAAG,IAAI,EAEhB,IAAMC,EAAY,IAAIhB,IACtBc,SAAExC,QAAS9C,GAAK,CACTA,EAAEyE,OAAO,CAAC,GAGfe,EAAUR,IAAIhF,EAAEyE,OAAO,CAAC,CAAC,CAC3B,CAAC,EACM,KAAKgB,8BAA8BnB,MAAMC,KAAKiB,EAAU5C,KAAI,CAAE,CAAC,CACxE,CAAC,CAAC,EAGJ,OAAOP,EAAc,CAAC6C,EAAOE,CAAW,CAAC,EAAE7C,KACzCxC,EAAI,CAAC,CAAC2F,EAAMC,CAAW,IACjB,CAACD,GAAQ,CAACC,EACL,CAAA,EAEFD,EAAK3F,IAAI,SAAU6F,EAAY,CACpC,OAAO,IAAIrF,GACTqF,EAAQnB,OAAO,CAAC,EAChBkB,EAAYnE,YAAYoE,EAAQnB,OAAO,CAAC,CAAC,EACzCkB,EAAYjE,UAAUkE,EAAQnB,OAAO,CAAC,EAAGmB,EAAQnB,OAAO,CAAC,CAAC,EAC1DmB,EAAQnB,OAAO,CAAC,EAChBmB,EAAQnB,OAAO,CAAC,EAChBoB,OAAOD,EAAQhB,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAElC,CAAC,CACF,CAAC,CAEN,CAEQa,8BAA8BD,EAAmB,CACvD,OAAOM,GACLN,EAAUzF,IAAKC,GACN,KAAK+B,WACTH,IAAI,0FAA4F5B,CAAC,EACjGuC,KACCxC,EAAK0D,GAAK,CACR,IAAMsC,EAAUC,OAAOvC,EAAE,QAAW,EAAE3D,MAAM,GAAG,EACzCmG,EAAWD,OAAOvC,EAAE,SAAY,EAAE3D,MAAM,GAAG,EAE3CoG,EAAS,IAAIlC,IACnB+B,OAAAA,EAAQjD,QAAQ,SAAUqD,EAAKb,EAAC,CAC9BY,EAAOhC,IAAIiC,EAAKF,EAASX,CAAC,CAAC,CAC7B,CAAC,EAEM,IAAI9E,GAAQwF,OAAOvC,EAAE,GAAM,EAAG7D,GAAuBoG,OAAOvC,EAAE,IAAO,CAAC,EAAGyC,CAAM,CACxF,CAAC,CAAC,CAEP,CAAC,EACF3D,KACAxC,EAAK0D,GAAK,CACR,IAAM2C,EAAI,IAAIpC,IACdP,OAAAA,EAAEX,QAAS9C,GAAK,CACdoG,EAAElC,IAAIlE,EAAEmB,YAAanB,CAAC,CACxB,CAAC,EACM,IAAIS,GAAe2F,CAAC,CAC7B,CAAC,CAAC,CAEN,iDA1KW1F,GAAyB2F,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAAAF,EAAAG,EAAA,EAAAH,EAAAI,EAAA,CAAA,CAAA,CAAA,kCAAzB/F,EAAyBgG,QAAzBhG,EAAyBiG,UAAAC,WADZ,MAAM,CAAA,CAAA,SACnBlG,CAAyB,GAAA,uCEtC1BmG,EAAA,EAAA,MAAA,EAAA,EACEC,EAAA,CAAA,EACAD,EAAA,EAAA,OAAA,EAAA,EACEC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,SAAA,EAAA,EAAwBG,EAAA,QAAA,UAAA,CAAA,IAAAC,EAAAC,EAAAC,CAAA,EAAAC,UAAAC,EAAAC,EAAA,CAAA,EAAA,OAAAC,EAASF,EAAAG,eAAe,EAACP,EAAAQ,EAAA,CAAU,CAAA,CAAA,EACzDZ,EAAA,EAAA,UAAA,EAAUC,EAAA,EAAA,OAAA,EAAKC,EAAA,EAAW,EACnB,4BANTW,EAAA,EAAAC,EAAA,IAAAV,EAAAW,KAAA,GAAA,EAEEF,EAAA,CAAA,EAAAC,EAAA,IAAAE,GAAA,EAAA,EAAA,oDAAAC,GAAA,EAAAC,GAAAd,EAAAe,aAAA,CAAA,EAAA,GAAA,6BATVnB,EAAA,EAAA,MAAA,CAAA,EAA4B,EAAA,IAAA,EAExBC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,MAAA,EAAA,EACEoB,GAAA,EAAAC,GAAA,EAAA,EAAA,MAAA,GAAAC,EAAA,EAWFpB,EAAA,EAAM,kBAdJW,EAAA,CAAA,EAAAC,EAAA,IAAAS,EAAA,EAAA,EAAA,wDAAA,EAAA,GAAA,EAGAV,EAAA,CAAA,EAAAW,GAAAhB,EAAAiB,iBAAA,sCAqBEzB,EAAA,EAAA,MAAA,EAAA,EACEC,EAAA,CAAA,EACAD,EAAA,EAAA,OAAA,EAAA,EACEC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,SAAA,EAAA,EAAwBG,EAAA,QAAA,UAAA,CAAA,IAAAuB,EAAArB,EAAAsB,CAAA,EAAApB,UAAAC,EAAAC,EAAA,CAAA,EAAA,OAAAC,EAASF,EAAAG,eAAe,EAACe,EAAAd,EAAA,CAAU,CAAA,CAAA,EACzDZ,EAAA,EAAA,UAAA,EAAUC,EAAA,EAAA,OAAA,EAAKC,EAAA,EAAW,EACnB,4BANTW,EAAA,EAAAC,EAAA,IAAAY,EAAAX,KAAA,GAAA,EAEEF,EAAA,CAAA,EAAAC,EAAA,IAAAE,GAAA,EAAA,EAAA,oDAAAC,GAAA,EAAAC,GAAAQ,EAAAP,aAAA,CAAA,EAAA,GAAA,6BATVnB,EAAA,EAAA,MAAA,CAAA,EAA4B,EAAA,IAAA,EAExBC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,MAAA,EAAA,EACEoB,GAAA,EAAAQ,GAAA,EAAA,EAAA,MAAA,GAAAN,EAAA,EAWFpB,EAAA,EAAM,kBAdJW,EAAA,CAAA,EAAAC,EAAA,IAAAS,EAAA,EAAA,EAAA,qDAAA,EAAA,GAAA,EAGAV,EAAA,CAAA,EAAAW,GAAAhB,EAAAqB,sBAAA,sCAqBE7B,EAAA,EAAA,MAAA,EAAA,EACEC,EAAA,CAAA,EACAD,EAAA,EAAA,OAAA,EAAA,EACEC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,SAAA,EAAA,EAAwBG,EAAA,QAAA,UAAA,CAAA,IAAA2B,EAAAzB,EAAA0B,CAAA,EAAAxB,UAAAC,EAAAC,EAAA,CAAA,EAAA,OAAAC,EAASF,EAAAG,eAAe,EAACmB,EAAAlB,EAAA,CAAU,CAAA,CAAA,EACzDZ,EAAA,EAAA,UAAA,EAAUC,EAAA,EAAA,OAAA,EAAKC,EAAA,EAAW,EACnB,4BANTW,EAAA,EAAAC,EAAA,IAAAgB,EAAAf,KAAA,GAAA,EAEEF,EAAA,CAAA,EAAAC,EAAA,IAAAE,GAAA,EAAA,EAAA,oDAAAC,GAAA,EAAAC,GAAAY,EAAAX,aAAA,CAAA,EAAA,GAAA,6BATVnB,EAAA,EAAA,MAAA,CAAA,EAA4B,EAAA,IAAA,EAExBC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,MAAA,EAAA,EACEoB,GAAA,EAAAY,GAAA,EAAA,EAAA,MAAA,GAAAV,EAAA,EAWFpB,EAAA,EAAM,kBAdJW,EAAA,CAAA,EAAAC,EAAA,IAAAS,EAAA,EAAA,EAAA,qDAAA,EAAA,GAAA,EAGAV,EAAA,CAAA,EAAAW,GAAAhB,EAAAyB,cAAA,6BA4BIjC,EAAA,EAAA,aAAA,EAAA,EACEC,EAAA,CAAA,EACAD,EAAA,EAAA,OAAA,EAAA,EACEC,EAAA,CAAA,mBACFC,EAAA,EAAO,0BAJGgC,EAAA,QAAAC,CAAA,EACVtB,EAAA,EAAAC,EAAA,IAAAqB,EAAApB,KAAA,GAAA,EAEEF,EAAA,CAAA,EAAAC,EAAA,IAAAE,GAAA,EAAA,EAAA,oDAAAC,GAAA,EAAAC,GAAAiB,EAAAhB,aAAA,CAAA,EAAA,GAAA,6BALRnB,EAAA,EAAA,eAAA,CAAA,mBACEoB,GAAA,EAAAgB,GAAA,EAAA,EAAA,aAAA,GAAAd,EAAA,EAQFpB,EAAA,0BATcgC,EAAA,QAAAX,EAAA,EAAA,EAAAc,EAAAtB,IAAA,CAAA,EACZF,EAAA,CAAA,EAAAW,GAAAa,EAAAC,OAAA,GDvFZ,UA6BaC,GA7BbC,GAAAC,EAAA,KACAC,KAEAC,KAEAC,KACAC,iHAuBaN,IAA6B,IAAA,CAApC,MAAOA,CAA6B,CAUxCO,YACSC,EACyBC,EAAmB,CAD5C,KAAAD,UAAAA,EACyB,KAAAC,KAAAA,EAXlC,KAAAC,gBAAkB,IAAIC,GAItB,KAAAC,gBAA4B,CAAA,EAC5B,KAAA1B,kBAAgC,CAAA,EAChC,KAAAI,uBAAqC,CAAA,EACrC,KAAAI,eAA6B,CAAA,CAK1B,CAEHmB,UAAQ,CACN,KAAK3B,kBAAoB,KAAKuB,KAAKvB,kBACnC,KAAKI,uBAAyB,KAAKmB,KAAKnB,uBACxC,KAAKI,eAAiB,KAAKe,KAAKf,eAChC,KAAKoB,0BAAyB,EAC9B,KAAKC,mBAAqB,KAAKL,gBAAgBM,aAAaC,KAC1DC,EAAU,EAAE,EACZC,EAAKC,GAAU,KAAKC,oBAAoBD,CAAK,CAAC,CAAC,CAEnD,CAEQC,oBAAoBD,EAAa,CACvC,OAAKA,IACHA,EAAQ,IAEH,KAAKX,KAAKa,mBACdH,IAAKI,IAAW,CACf/C,KAAM+C,EAAM/C,KACZuB,QAAS,KAAKyB,gBAAgBD,EAAMxB,QAASqB,CAAK,GAClD,EACDK,OAAQF,GAAUA,EAAMxB,QAAQ2B,OAAS,CAAC,CAC/C,CAEQF,gBAAgBG,EAAuBP,EAAa,CAC1D,IAAMQ,EAAcR,EAAMS,SAAQ,EAAGC,YAAW,EAChD,OAAOH,EAAUF,OAAQM,GAErBA,EAASvD,KAAKsD,YAAW,EAAGE,QAAQJ,CAAW,EAAI,IACnD,KAAKhB,gBAAgBoB,QAAQD,EAAS1D,EAAE,IAAM,IAC9C,CAAC,KAAKuC,gBAAgBqB,KAAMC,GAAMH,EAASI,OAAOC,SAASF,CAAC,CAAC,CAEhE,CACH,CAEAG,eAAeC,EAAmC,CAEhD,KAAKvB,mBACFE,KACCsB,GAAK,CAAC,EACNpB,EAAKqB,GAAU,CACb,QAAWjB,KAASiB,EAClB,QAAWT,KAAYR,EAAMxB,QAC3B,GAAIgC,EAAS1D,KAAOiE,EAAMG,OAAOrB,MAAM/C,IACjC0D,EAASI,OAAOT,SAAWY,EAAMG,OAAOrB,MAAMe,OAAOT,OAAQ,CAC/D,IAAIgB,EAAc,GACdC,EAAI,EACR,KAAOA,EAAIZ,EAASI,OAAOT,QAAQ,CACjC,GAAIK,EAASI,OAAOQ,CAAC,IAAML,EAAMG,OAAOrB,MAAMe,OAAOQ,CAAC,EAAG,CACvDD,EAAc,GACd,KACF,CACAC,EAAIA,EAAI,CACV,CACA,GAAID,EACF,MAAO,CAACnB,EAAOQ,CAAQ,CAE3B,CAIR,CAAC,CAAC,EAEHa,UAAU,CAAC,CAACrB,EAAOQ,CAAQ,IAAK,CAC/B,KAAKc,YAAYtB,EAAM/C,KAAMuD,EAAS1D,EAAE,CAC1C,CAAC,CACL,CAEAwE,YAAYC,EAAsBC,EAAqB,CACrD,IAAMC,EAAgBD,GAA8B,KAAKrC,gBAAgBU,MAAM6B,KAAI,EACnF,GAAID,IAAkB,GAAI,CAGxB,GAFA,KAAKtC,gBAAgBwC,SAAS,EAAE,EAE5BJ,IAAiBK,GAAiB,CACpC,IAAMC,EAAgB,KAAK3C,KAAKa,mBAC7BG,OAAQ4B,GAAkBA,EAAc7E,OAAS2E,EAAe,EAChEhC,IAAKkC,GACJA,EAActD,QAAQ0B,OAAQ6B,GAAYA,EAAQjF,GAAGyD,YAAW,IAAOkB,EAAclB,YAAW,CAAE,CAAC,EACnG,CAAC,EAAE,CAAC,EACR,KAAK5C,kBAAkBqE,KAAKH,CAAa,CAC3C,CACA,GAAIN,IAAiBU,GAAiB,CACpC,IAAMC,EAAkB,KAAKhD,KAAKa,mBAC/BG,OAAQ4B,GAAkBA,EAAc7E,OAASgF,EAAe,EAChErC,IAAKkC,GACJA,EAActD,QAAQ0B,OAAQ6B,GAAYA,EAAQjF,GAAGyD,YAAW,IAAOkB,EAAclB,YAAW,CAAE,CAAC,EACnG,CAAC,EAAE,CAAC,EACR,KAAKxC,uBAAuBiE,KAAKE,CAAe,CAClD,CACA,GAAIX,IAAiBY,GAAc,CACjC,IAAMC,EAAa,KAAKlD,KAAKa,mBAC1BG,OAAQ4B,GAAkBA,EAAc7E,OAASkF,EAAY,EAC7DvC,IAAKkC,GACJA,EAActD,QAAQ0B,OAAQ6B,GAAYA,EAAQjF,GAAGyD,YAAW,IAAOkB,EAAclB,YAAW,CAAE,CAAC,EACnG,CAAC,EAAE,CAAC,EACR,KAAKpC,eAAe6D,KAAKI,CAAU,CACrC,CACA,KAAK7C,0BAAyB,CAChC,CACF,CAEA1C,eAAe0E,EAAsBC,EAAoB,CACnDD,IAAiB,IACnB,KAAK5D,kBAAoB,KAAKA,kBAAkBuC,OAAQ6B,GAAYA,EAAQjF,KAAO0E,CAAY,GAE7FD,IAAiB,IACnB,KAAKxD,uBAAyB,KAAKA,uBAAuBmC,OAAQmC,GAAaA,EAASvF,KAAO0E,CAAY,GAEzGD,IAAiB,IACnB,KAAKpD,eAAiB,KAAKA,eAAe+B,OAAQoC,GAASA,EAAKxF,KAAO0E,CAAY,GAErF,KAAKjC,0BAAyB,CAChC,CAEQA,2BAAyB,CAC/B,IAAM5B,EAAoB,CAAC,GAAG,KAAKA,kBAAkBiC,IAAKmC,GAAYA,EAAQjF,EAAE,CAAC,EACjF,KAAKiB,uBAAyB,KAAKA,uBAAuBmC,OACvDM,GAAa,CAAC7C,EAAkB+C,KAAMC,GAAMH,EAASI,OAAOC,SAASF,CAAC,CAAC,CAAC,EAE3E,IAAM5C,EAAyB,CAAC,GAAG,KAAKA,uBAAuB6B,IAAK2C,GAAcA,EAAUzF,EAAE,CAAC,EAC/F,KAAKqB,eAAiB,KAAKA,eAAe+B,OACvCoC,GACC,CAACvE,EAAuB2C,KAAMC,GAAM2B,EAAK1B,OAAOC,SAASF,CAAC,CAAC,GAC3D,CAAChD,EAAkB+C,KAAMC,GAAM2B,EAAK1B,OAAOC,SAASF,CAAC,CAAC,CAAC,EAG3D,KAAKtB,gBAAkB,CACrB,GAAG1B,EACH,GAAGI,EACH,GAAG,KAAKI,eAAeyB,IAAK0C,GAASA,EAAKxF,EAAE,CAAC,EAE/C,KAAKqC,gBAAgBwC,SAAS,EAAE,CAClC,CAEAa,MAAMC,EAAgB,CACpB,GAAI,CAACA,EAAS,CACZ,KAAKxD,UAAUuD,MAAK,EACpB,MACF,CACA,KAAKvD,UAAUuD,MAAM,CACnB7E,kBAAmB,KAAKA,kBACxBI,uBAAwB,KAAKA,uBAC7BI,eAAgB,KAAKA,eACtB,CACH,iDA9JWM,GAA6BiE,EAAAC,EAAA,EAAAD,EAY9BE,EAAe,CAAA,CAAA,CAAA,+BAZdnE,EAA6BoE,UAAA,CAAA,CAAA,2BAAA,CAAA,EAAAC,WAAA,GAAAC,MAAA,GAAAC,KAAA,GAAAC,OAAA,CAAA,CAAA,OAAA,iBAAA,EAAA,CAAA,mBAAA,GAAA,EAAA,SAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,WAAA,GAAA,kBAAA,GAAA,EAAA,cAAA,kBAAA,aAAA,EAAA,CAAA,wBAAA,GAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,KAAA,EAAA,CAAA,qBAAA,GAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,GAAA,QAAA,UAAA,EAAA,OAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,GAAA,EAAA,OAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,gBAAA,CAAA,EAAAC,SAAA,SAAAC,EAAAC,EAAA,CAAA,GAAAD,EAAA,EAAA,WC7B1CjH,EAAA,EAAA,KAAA,CAAA,EAOEC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,oBAAA,EAAoB,EAAA,MAAA,CAAA,EACc,EAAA,IAAA,EAE5BC,EAAA,CAAA,mBACFC,EAAA,EACAiH,EAAA,EAAAC,GAAA,EAAA,EAAA,MAAA,CAAA,EAAoC,EAAAC,GAAA,EAAA,EAAA,MAAA,CAAA,EAoBK,GAAAC,GAAA,EAAA,EAAA,MAAA,CAAA,EAwC3CpH,EAAA,EACAF,EAAA,GAAA,MAAA,CAAA,EAA+B,GAAA,gBAAA,EAE3BuH,GAAA,GAAA,QAAA,CAAA,oBAOAvH,EAAA,GAAA,mBAAA,EAAA,CAAA,EAAgEG,EAAA,iBAAA,SAAAqH,EAAA,CAAAC,OAAApH,EAAAqH,CAAA,EAAAhH,EAAkBwG,EAAAtC,eAAA4C,CAAA,CAAsB,CAAA,CAAA,EACtGpG,GAAA,GAAAuG,GAAA,EAAA,EAAA,eAAA,EAAArG,EAAA,gBAYFpB,EAAA,EAAmB,EACJ,EACb,EAGRF,EAAA,GAAA,qBAAA,CAAA,EAAgC,GAAA,SAAA,CAAA,EACHG,EAAA,QAAA,UAAA,CAAAsH,OAAApH,EAAAqH,CAAA,EAAAhH,EAASwG,EAAAZ,MAAM,EAAK,CAAC,CAAA,CAAA,EAC9CrG,EAAA,EAAA,oBACFC,EAAA,EACAF,EAAA,GAAA,SAAA,EAAA,EAAwCG,EAAA,QAAA,UAAA,CAAAsH,OAAApH,EAAAqH,CAAA,EAAAhH,EAASwG,EAAAZ,MAAM,EAAI,CAAC,CAAA,CAAA,EAC1DrG,EAAA,EAAA,oBACFC,EAAA,EAAS,uBA1GTgC,EAAA,UAAA0F,GAAA,GAAAC,GAAAX,EAAAlE,KAAA8E,eAAAC,UAAAb,EAAAlE,KAAA8E,eAAAE,eAAA,CAAA,EAKAnH,EAAA,EAAAC,EAAA,IAAAS,EAAA,EAAA,GAAA,qDAAA,EAAA;CAAA,EAKIV,EAAA,CAAA,EAAAC,EAAA,IAAAS,EAAA,EAAA,GAAA,kEAAA,EAAA,GAAA,EAEFV,EAAA,CAAA,EAAAoH,EAAAf,EAAAzF,kBAAAwC,OAAA,EAAA,EAAA,EAAA,EAoBApD,EAAA,EAAAoH,EAAAf,EAAArF,uBAAAoC,OAAA,EAAA,EAAA,EAAA,EAoBApD,EAAA,EAAAoH,EAAAf,EAAAjF,eAAAgC,OAAA,EAAA,GAAA,EAAA,EAyBIpD,EAAA,CAAA,EAAAqB,EAAA,cAAAX,EAAA,GAAA,GAAA,wDAAA,CAAA,EAAoF,kBAAA2G,CAAA,EAE5D,cAAAhB,EAAAjE,eAAA,EAIxBpC,EAAA,CAAA,EAAAW,GAAAD,EAAA,GAAA,GAAA2F,EAAA5D,kBAAA,CAAA,EAmBJzC,EAAA,CAAA,EAAAC,EAAA,IAAAS,EAAA,GAAA,GAAA,6BAAA,EAAA,GAAA,EAGAV,EAAA,CAAA,EAAAC,EAAA,IAAAS,EAAA,GAAA,GAAA,2BAAA,EAAA,GAAA;uID9ESgB,CAA6B,GAAA,8BGdhC4F,EAAA,EAAA,aAAA,CAAA,EACEC,EAAA,CAAA,EACFC,EAAA,0BAFYC,EAAA,QAAAC,EAAAC,IAAA,EACVC,EAAA,EAAAC,EAAA,IAAAH,EAAAC,KAAA,GAAA,GDhBZ,OAeaG,GAaAC,GA5BbC,GAAAC,EAAA,KAEAC,KACAC,KACAC,KACAC,+FAUaP,GAAP,KAA2B,CAC/BQ,YACSX,EACAY,EAAY,CADZ,KAAAZ,KAAAA,EACA,KAAAY,MAAAA,CACN,GASQR,IAAyB,IAAA,CAAhC,MAAOA,CAAyB,CAQpCO,YACSE,EACyBC,EACxBC,EAA4B,CAF7B,KAAAF,UAAAA,EACyB,KAAAC,KAAAA,EACxB,KAAAC,cAAAA,EAVV,KAAAC,aAAe,IAAIC,GAYjB,KAAKC,cAAgBJ,EAAKI,cAC1B,KAAKC,SAAW,KAAKJ,cAAcK,WAAWC,KAC5CC,EAAKC,GAAU,CACb,GAAI,CAACA,EACH,MAAO,CAAA,EAET,IAAMC,EAAQ,IAAIC,IAClBF,OAAAA,EAAOG,QAASC,GAAK,CACnBH,EAAMI,IAAID,EAAEE,UAAUC,KAAK,GAAG,EAAGH,CAAC,CACpC,CAAC,EAEMJ,EACJD,IAAKK,GACG,IAAIxB,GAAqB,KAAK4B,eAAeP,EAAOG,CAAC,EAAGA,CAAC,CACjE,EACAK,KAAK,CAACC,EAAGC,IAAMD,EAAEjC,KAAKmC,cAAcD,EAAElC,IAAI,CAAC,CAChD,CAAC,CAAC,CAEN,CAEA+B,eAAeK,EAAkCxB,EAAY,CAC3D,IAAMyB,EAASD,EAAaE,IAAI1B,EAAMiB,UAAUU,MAAM,EAAG,EAAE,EAAET,KAAK,GAAG,CAAC,EACtE,OAAKO,EAII,GADY,KAAKN,eAAeK,EAAcC,CAAM,CACvC,MAAMzB,EAAMZ,IAAI,GAH7BY,EAAMZ,IAKjB,CAEAwC,UAAQ,CACN,KAAKC,iBAAmBC,EAAc,CAAC,KAAK1B,aAAa2B,aAAatB,KAAKuB,EAAU,EAAE,CAAC,EAAG,KAAKzB,QAAQ,CAAC,EAAEE,KACzGC,EAAI,CAAC,CAACuB,EAAOC,CAAO,IAAM,KAAKC,QAAQF,EAAOC,CAAO,CAAC,CAAC,CAE3D,CAEQC,QAAQF,EAAeC,EAA+B,CAC5D,IAAME,EAAcH,EAAMI,YAAW,EAErC,OAAOH,EAAQI,OAAQC,GAAWA,EAAOnD,KAAKiD,YAAW,EAAGG,SAASJ,CAAW,CAAC,CACnF,CAEAK,MAAMC,EAAgB,CACpB,GAAI,CAACA,EAAS,CACZ,KAAKzC,UAAUwC,MAAK,EACpB,MACF,CACA,KAAKxC,UAAUwC,MAAM,CACnBnC,cAAe,KAAKA,cACrB,CACH,CAEAqC,YAAYC,EAAmC,CAE7C,KAAKf,iBACFpB,KACCoC,GAAK,CAAC,EACNnC,EAAKwB,GAAW,CACd,QAAWK,KAAUL,EACnB,GAAIK,EAAOnD,OAASwD,EAAML,OAAON,MAC/B,OAAOM,CAGb,CAAC,CAAC,EAEHO,UAAWP,GAAU,CACpB,KAAKQ,SAASR,CAAM,CACtB,CAAC,CACL,CAEAQ,SAASC,EAAO,CACd,KAAK1C,cAAgB0C,CACvB,iDArFWxD,GAAyByD,EAAAC,EAAA,EAAAD,EAU1BE,EAAe,EAAAF,EAAAG,EAAA,CAAA,CAAA,CAAA,+BAVd5D,EAAyB6D,UAAA,CAAA,CAAA,uBAAA,CAAA,EAAAC,WAAA,GAAAC,MAAA,GAAAC,KAAA,GAAAC,OAAA,CAAA,CAAA,OAAA,iBAAA,EAAA,CAAA,mBAAA,GAAA,EAAA,SAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,WAAA,GAAA,kBAAA,GAAA,EAAA,kBAAA,aAAA,EAAA,CAAA,wBAAA,GAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,KAAA,EAAA,CAAA,qBAAA,GAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,GAAA,QAAA,UAAA,EAAA,OAAA,CAAA,EAAAC,SAAA,SAAAC,EAAAC,EAAA,CAAA,GAAAD,EAAA,EAAA,WC5BtC5E,EAAA,EAAA,KAAA,CAAA,EAOEC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,oBAAA,EAAoB,EAAA,MAAA,CAAA,EACa,EAAA,gBAAA,EAE3B8E,GAAA,EAAA,QAAA,CAAA,EACA9E,EAAA,EAAA,mBAAA,EAAA,CAAA,EAAgE+E,EAAA,iBAAA,SAAAC,EAAA,CAAAC,OAAAC,EAAAC,CAAA,EAAAC,EAAkBP,EAAAjB,YAAAoB,CAAA,CAAmB,CAAA,CAAA,EACnGK,GAAA,EAAAC,GAAA,EAAA,EAAA,aAAA,EAAAC,EAAA,gBAKFrF,EAAA,EAAmB,EACJ,EACb,EAERF,EAAA,GAAA,qBAAA,CAAA,EAAgC,GAAA,SAAA,CAAA,EACH+E,EAAA,QAAA,UAAA,CAAAE,OAAAC,EAAAC,CAAA,EAAAC,EAASP,EAAAnB,MAAM,EAAK,CAAC,CAAA,CAAA,EAC9CzD,EAAA,EAAA,oBACFC,EAAA,EACAF,EAAA,GAAA,SAAA,CAAA,EAAwC+E,EAAA,QAAA,UAAA,CAAAE,OAAAC,EAAAC,CAAA,EAAAC,EAASP,EAAAnB,MAAM,EAAI,CAAC,CAAA,CAAA,EAC1DzD,EAAA,EAAA,oBACFC,EAAA,EAAS,sBA3BTC,EAAA,UAAAqF,GAAA,GAAAC,GAAAZ,EAAA1D,KAAAuE,eAAAC,UAAAd,EAAA1D,KAAAuE,eAAAE,eAAA,CAAA,EAKAtF,EAAA,EAAAC,EAAA,IAAAsF,EAAA,EAAA,EAAA,iDAAA,EAAA;CAAA,EAKoCvF,EAAA,CAAA,EAAAH,EAAA,kBAAA2F,CAAA,EAAwB,cAAAjB,EAAAxD,YAAA,EAEtDf,EAAA,CAAA,EAAAyF,GAAAF,EAAA,GAAA,EAAAhB,EAAA/B,gBAAA,CAAA,EAWJxC,EAAA,CAAA,EAAAC,EAAA,IAAAsF,EAAA,GAAA,GAAA,6BAAA,EAAA,GAAA,EAGAvF,EAAA,CAAA,EAAAC,EAAA,IAAAsF,EAAA,GAAA,GAAA,2BAAA,EAAA,GAAA;mIDASpF,CAAyB,GAAA,2BGJ5BuF,EAAA,EAAA,MAAA,EAAA,EACEC,EAAA,CAAA,mBACFC,EAAA,SADEC,EAAA,EAAAC,EAAA,IAAAC,EAAA,EAAA,EAAA,mCAAA,EAAA,GAAA,sCAGJL,EAAA,EAAA,MAAA,GAAA,CAAA,EAAqE,EAAA,MAAA,EAAA,EACvC,EAAA,MAAA,EAAA,EACY,EAAA,MAAA,EAAA,EAClBC,EAAA,CAAA,EAAiBC,EAAA,EACnCF,EAAA,EAAA,MAAA,EAAA,EAAqBC,EAAA,CAAA,EAAoBC,EAAA,EAAM,EAC3C,EAERF,EAAA,EAAA,MAAA,EAAA,EAA4B,EAAA,SAAA,EAAA,EACcM,EAAA,QAAA,UAAA,CAAA,IAAAC,EAAAC,EAAAC,CAAA,EAAAC,UAAAC,EAAAC,GAAA,CAAA,EAAAC,EAAAC,EAAA,CAAA,EAAA,OAAAC,EAASF,EAAAG,qBAAAL,EAAAJ,EAAAU,cAAA,CAAqD,CAAA,CAAA,EACpGjB,EAAA,GAAA,UAAA,EAAUC,EAAA,GAAA,KAAA,EAAGC,EAAA,EAAW,EACjB,EACL,4BARgBC,EAAA,CAAA,EAAAe,GAAAX,EAAAY,IAAA,EACGhB,EAAA,CAAA,EAAAe,GAAAX,EAAAa,OAAA,4BAT3BC,EAAA,EAAAC,GAAA,EAAA,EAAA,MAAA,EAAA,EAA4G,EAAAC,GAAA,GAAA,EAAA,MAAA,EAAA,iBAA5GC,EAAAX,EAAAY,gBAAAZ,EAAAa,0BAAAC,OAAAd,EAAAa,0BAAAC,MAAAC,KAAA,IAAA,GAAA,EAAA,EAAA,EAKyDzB,EAAA,EAAA0B,EAAA,kBAAAC,CAAA,6BAuBvD9B,EAAA,EAAA,MAAA,EACEC,EAAA,CAAA,mBACFC,EAAA,kBADEC,EAAA,EAAA4B,GAAA,KAAAC,EAAAC,OAAA,IAAA5B,EAAA,EAAA,EAAA2B,EAAAC,SAAA,EAAA,kBAAA,kBAAA,EAAA,IAAA,0BAMFjC,EAAA,EAAA,MAAA,EAAA,EACEC,EAAA,CAAA,mBACFC,EAAA,SADEC,EAAA,EAAAC,EAAA,IAAAC,EAAA,EAAA,EAAA,qCAAA,EAAA,GAAA,sCAIFL,EAAA,EAAA,WAAA,EAAA,EAAgC,EAAA,MAAA,EAAA,EACQ,EAAA,MAAA,EAAA,EAClBC,EAAA,CAAA,EAAeC,EAAA,EACjCF,EAAA,EAAA,MAAA,EAAA,EAAqBC,EAAA,CAAA,EAAkBC,EAAA,EAAM,EAE/CF,EAAA,EAAA,MAAA,EAAA,EAAoB,EAAA,WAAA,EAAA,EACRM,EAAA,QAAA,UAAA,CAAA,IAAA4B,EAAA1B,EAAA2B,CAAA,EAAAzB,UAAAG,EAAAC,EAAA,CAAA,EAAA,OAAAC,EAASF,EAAAuB,eAAAF,EAAAjB,cAAA,CAAmC,CAAA,CAAA,EAAEhB,EAAA,EAAA,QAAA,EAAMC,EAAA,EAAW,EACrE,4BALcC,EAAA,CAAA,EAAAe,GAAAgB,EAAAf,IAAA,EACGhB,EAAA,CAAA,EAAAe,GAAAgB,EAAAd,OAAA,6BApB7BpB,EAAA,EAAA,MAAA,EAAA,EAAmB,EAAA,MAAA,EAEfC,EAAA,CAAA,mBACFC,EAAA,EACAmB,EAAA,EAAAgB,GAAA,EAAA,EAAA,MAAA,EAKFnC,EAAA,EACAF,EAAA,EAAA,MAAA,EAAA,EACEqB,EAAA,EAAAiB,GAAA,EAAA,EAAA,MAAA,EAAA,EAKAC,GAAA,EAAAC,GAAA,EAAA,EAAA,WAAA,GAAAC,EAAA,EAWFvC,EAAA,gBAzBIC,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,EAAA,EAAA,2CAAA,EAAA,GAAA,EAEFF,EAAA,CAAA,EAAAqB,EAAAQ,EAAAC,OAAA,EAAA,EAAA,EAAA,EAOA9B,EAAA,CAAA,EAAAqB,EAAAQ,EAAAC,SAAA,EAAA,EAAA,EAAA,EAKA9B,EAAA,EAAAuC,GAAAV,CAAA,GD9DR,OAyBaW,GAzBbC,GAAAC,EAAA,KACAC,KACAC,KACAC,KACAC,KACAC,yGAoBaP,IAA4B,IAAA,CAAnC,MAAOA,CAA4B,CAYvCQ,YACSC,EACCC,EACwBC,EACxBC,EAAkC,CAHnC,KAAAH,UAAAA,EACC,KAAAC,oBAAAA,EACwB,KAAAC,KAAAA,EACxB,KAAAC,iBAAAA,EAfV,KAAA7B,0BAA4B,IAAI8B,GAMhC,KAAAC,kBAA+C,IAAIC,EAA0B,CAAA,CAAE,EAC/E,KAAAC,iBAAyC,KAAKF,kBAAkBG,aAAY,EAE5E,KAAAnC,eAAiB,EAOd,CAEHoC,UAAQ,CACN,KAAKJ,kBAAkBK,KAAK,KAAKT,oBAAoBU,mBAAkB,CAAE,EAEzE,KAAKC,SAAW,KAAKT,iBAAiBU,sBAAsBC,KAC1DC,EAAKC,GACEA,GAGL,KAAK1C,0BAA0B2C,SAAS,EAAE,EACnCC,OAAOC,KAAKH,CAAW,EAC3BD,IAAKlD,GAAkB,CACtB,IAAMuD,EAAeJ,EAAYnD,CAAc,EAC/C,MAAO,CACLA,eAAAA,EACAE,KAAMqD,EAAaC,YACnBrD,QAASsD,GAAYF,CAAY,EAErC,CAAC,EACAG,KAAK,CAACC,EAAGC,IAAMD,EAAEzD,KAAK2D,cAAcD,EAAE1D,IAAI,CAAC,GAZrC,CAAA,CAaV,CAAC,EAGJ,KAAK4D,iBAAmBC,EAAc,CACpC,KAAKhB,SACL,KAAKtC,0BAA0BuD,aAC/B,KAAKtB,gBAAgB,CACtB,EAAEO,KACDgB,GAAa,GAAG,EAChBf,EAAI,CAAC,CAACgB,EAASxD,EAAOyD,CAAe,IAAM,KAAKC,QAAQF,EAASxD,EAAOyD,CAAe,CAAC,EACxFE,GAAKH,GAAW,CACd,KAAK1D,eAAiB0D,EAAQlD,SAAW,CAC3C,CAAC,CAAC,EAGJ,KAAKsD,wBAA0BP,EAAc,CAAC,KAAKhB,SAAU,KAAKL,gBAAgB,CAAC,EAAEO,KACnFC,EAAI,CAAC,CAACgB,EAASK,CAAQ,IACdL,EAAQM,OAAQC,GAAMF,EAASG,QAAQD,EAAEzE,cAAc,EAAI,EAAE,CACrE,CAAC,CAEN,CAEQoE,QAAQF,EAA4BxD,EAAeyD,EAAyB,CAClF,GAAIzD,EAAMC,KAAI,IAAO,GACnB,OAAOuD,EAAQM,OAAQG,GAAWR,EAAgBO,QAAQC,EAAO3E,cAAc,IAAM,EAAE,EAEzF,IAAM4E,EAAclE,EAAMmE,YAAW,EACrC,OAAOX,EACJM,OACEG,GACCA,EAAOzE,KAAK2E,YAAW,EAAGC,SAASF,CAAW,GAAKD,EAAOxE,QAAQ0E,YAAW,EAAGC,SAASF,CAAW,CAAC,EAExGJ,OAAQG,GAAWR,EAAgBO,QAAQC,EAAO3E,cAAc,IAAM,EAAE,CAC7E,CAEAD,qBAAqB4E,EAAqB3E,EAAsB,CAC9D2E,EAAOI,OAAM,EACb,IAAMC,EAAkB,KAAKxC,kBAAkByC,SAAQ,EACnDD,EAAgBN,QAAQ1E,CAAc,IAAM,IAC9CgF,EAAgBE,KAAKlF,CAAc,EAErC,KAAKwC,kBAAkBK,KAAKmC,CAAe,CAC7C,CAEA7D,eAAenB,EAAsB,CACnC,KAAKwC,kBAAkBK,KAAK,KAAKL,kBAAkByC,SAAQ,EAAGT,OAAQC,GAAMA,IAAMzE,CAAc,CAAC,CACnG,CAEAmF,MAAMC,EAAgB,CACpB,GAAI,CAACA,EAAS,CACZ,KAAKjD,UAAUgD,MAAK,EACpB,MACF,CACA,KAAKhD,UAAUgD,MAAM,CACnBE,wBAAyB,KAAK7C,kBAAkByC,SAAQ,EACzD,CACH,iDA9FWvD,GAA4B4D,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAAAF,EAe7BG,EAAe,EAAAH,EAAAI,EAAA,CAAA,CAAA,CAAA,+BAfdhE,EAA4BiE,UAAA,CAAA,CAAA,2BAAA,CAAA,EAAAC,WAAA,GAAAC,MAAA,GAAAC,KAAA,GAAAC,OAAA,CAAA,CAAA,WAAA,EAAA,EAAA,CAAA,mBAAA,GAAA,EAAA,SAAA,EAAA,CAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,aAAA,SAAA,EAAA,CAAA,OAAA,OAAA,WAAA,GAAA,eAAA,MAAA,EAAA,cAAA,aAAA,EAAA,CAAA,WAAA,KAAA,cAAA,QAAA,cAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,QAAA,KAAA,EAAA,CAAA,qBAAA,GAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,GAAA,QAAA,UAAA,EAAA,OAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,QAAA,SAAA,EAAA,gBAAA,iBAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,QAAA,UAAA,kBAAA,GAAA,EAAA,OAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,aAAA,UAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,OAAA,CAAA,EAAAC,SAAA,SAAAC,EAAApF,EAAA,IAAAoF,EAAA,ICzBzClH,EAAA,EAAA,KAAA,CAAA,EAOEC,EAAA,CAAA,mBACFC,EAAA,EAEAF,EAAA,EAAA,qBAAA,CAAA,EAAwD,EAAA,MAAA,CAAA,EACxB,EAAA,iBAAA,CAAA,EAE1BmH,GAAA,EAAA,QAAA,CAAA,mBAOFjH,EAAA,EACAF,EAAA,EAAA,8BAAA,CAAA,EACEqB,EAAA,EAAA+F,GAAA,EAAA,CAAA,gBAoBFlH,EAAA,EAA8B,EAEhCF,EAAA,GAAA,MAAA,CAAA,EACEqB,EAAA,GAAAgG,GAAA,EAAA,CAAA,gBA8BFnH,EAAA,EAAM,EAGRF,EAAA,GAAA,qBAAA,CAAA,EAAgC,GAAA,SAAA,CAAA,EACHM,EAAA,QAAA,UAAA,CAAA,OAASwB,EAAAsE,MAAM,EAAK,CAAC,CAAA,EAC9CnG,EAAA,EAAA,oBACFC,EAAA,EACAF,EAAA,GAAA,SAAA,EAAA,EAAwCM,EAAA,QAAA,UAAA,CAAA,OAASwB,EAAAsE,MAAM,EAAI,CAAC,CAAA,EAC1DnG,EAAA,EAAA,oBACFC,EAAA,EAAS,gBAlFT2B,EAAA,UAAAyF,GAAA,GAAAC,GAAAzF,EAAAwB,KAAAkE,eAAAC,UAAA3F,EAAAwB,KAAAkE,eAAAE,eAAA,CAAA,EAKAvH,EAAA,EAAAC,EAAA,IAAAC,EAAA,EAAA,EAAA,iBAAA,EAAA;CAAA,EASMF,EAAA,CAAA,EAAAwH,GAAA,cAAAtH,EAAA,EAAA,GAAA,qCAAA,CAAA,EACAwB,EAAA,cAAAC,EAAAJ,yBAAA,EAKFvB,EAAA,CAAA,EAAAqB,GAAAoG,EAAAvH,EAAA,GAAA,GAAAyB,EAAAiD,gBAAA,GAAA,EAAA,GAAA6C,CAAA,EAuBFzH,EAAA,CAAA,EAAAqB,GAAAqG,EAAAxH,EAAA,GAAA,GAAAyB,EAAAyD,uBAAA,GAAA,GAAA,GAAAsC,CAAA,EAmCA1H,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,6BAAA,EAAA,GAAA,EAGAF,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,2BAAA,EAAA,GAAA;sID1DSsC,CAA4B,GAAA,IEzBzC,OAkBamF,GAlBbC,GAAAC,EAAA,KACAC,KACAC,qFAgBaJ,IAA0B,IAAA,CAAjC,MAAOA,CAA0B,CAKrCK,YACUC,EACDC,EACUC,EACeC,EAAU,CAHlC,KAAAH,aAAAA,EACD,KAAAC,UAAAA,EACU,KAAAC,oBAAAA,EACe,KAAAC,KAAAA,EARlC,KAAAC,YAAc,IAAIC,EASf,CAEHC,UAAQ,CACN,KAAKF,YAAYG,SAAS,KAAKJ,KAAKK,iBAAiB,EAErD,KAAKC,SAAW,KAAKP,oBAAoBQ,cAC3C,CAEAC,MAAMC,EAAgB,CACpB,GAAI,CAACA,EAAS,CACZ,KAAKX,UAAUU,MAAK,EACpB,MACF,CACA,KAAKV,UAAUU,MAAM,CACnBH,kBAAmB,KAAKJ,YAAYS,OAAS,CAAA,EAC9C,CACH,iDA1BWnB,GAA0BoB,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAAAF,EAAAG,EAAA,EAAAH,EAS3BI,EAAe,CAAA,CAAA,CAAA,+BATdxB,EAA0ByB,UAAA,CAAA,CAAA,2BAAA,CAAA,EAAAC,WAAA,GAAAC,MAAA,GAAAC,KAAA,GAAAC,OAAA,CAAA,CAAA,mBAAA,GAAA,EAAA,SAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,cAAA,SAAA,EAAA,CAAA,QAAA,KAAA,EAAA,CAAA,qBAAA,GAAA,QAAA,UAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,GAAA,QAAA,UAAA,EAAA,OAAA,CAAA,EAAAC,SAAA,SAAAC,EAAAC,EAAA,CAAAD,EAAA,IClBvCE,EAAA,EAAA,KAAA,CAAA,EAOEC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,oBAAA,EAAoB,EAAA,MAAA,CAAA,EAEhBG,GAAA,EAAA,sBAAA,CAAA,eACFD,EAAA,EAAM,EAERF,EAAA,EAAA,qBAAA,CAAA,EAAgC,EAAA,SAAA,CAAA,EACaI,EAAA,QAAA,UAAA,CAAA,OAASL,EAAAf,MAAM,EAAK,CAAC,CAAA,EAC9DiB,EAAA,CAAA,oBACFC,EAAA,EACAF,EAAA,GAAA,SAAA,CAAA,EAAwCI,EAAA,QAAA,UAAA,CAAA,OAASL,EAAAf,MAAM,EAAI,CAAC,CAAA,EAC1DiB,EAAA,EAAA,oBACFC,EAAA,EAAS,SAlBTG,EAAA,UAAAC,GAAA,GAAAC,GAAAR,EAAAvB,KAAAgC,eAAAC,UAAAV,EAAAvB,KAAAgC,eAAAE,eAAA,CAAA,EAKAC,EAAA,EAAAC,EAAA,IAAAC,EAAA,EAAA,EAAA,iCAAA,EAAA;CAAA,EAIuBF,EAAA,CAAA,EAAAN,EAAA,cAAAN,EAAAtB,WAAA,EAA2B,UAAAoC,EAAA,EAAA,EAAAd,EAAAjB,QAAA,CAAA,EAKhD6B,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,6BAAA,EAAA,GAAA,EAGAF,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,2BAAA,EAAA,GAAA;oIDDS9C,CAA0B,GAAA,IElBvC,OAqBa+C,GArBbC,GAAAC,EAAA,KACAC,KACAC,KACAC,KACAC,gFAiBaN,IAA4B,IAAA,CAAnC,MAAOA,CAA4B,CAKvCO,YACUC,EACAC,EACDC,EACyBC,EAAkB,CAH1C,KAAAH,oBAAAA,EACA,KAAAC,iBAAAA,EACD,KAAAC,UAAAA,EACyB,KAAAC,KAAAA,EARlC,KAAAC,oBAAsB,IAAIC,EASvB,CAEHC,UAAQ,CACN,IAAMC,EAAsB,KAAKJ,KAAKK,mBAAmBC,IAAKC,GAAYA,EAAQC,EAAE,EACpF,KAAKP,oBAAoBQ,SAASL,CAAmB,EAErD,KAAKM,iBAAmBC,EAAc,CACpC,KAAKd,oBAAoBe,sBACzB,KAAKd,iBAAiBe,OAAO,mBAAmB,CAAC,CAClD,EAAEC,KACDR,EAAI,CAAC,CAACS,EAAaC,CAAoB,IAAK,CAC1C,GAAI,CAACD,EACH,MAAO,CAAA,EAET,IAAME,EAAoB,KAAKnB,iBAAiBoB,QAAQ,oDAAqD,CAC3GC,MAAO,MACR,EACD,OAAOC,MAAMC,KAAKN,CAAW,EAC1BT,IAAI,CAAC,CAACgB,EAAWC,CAAY,IAAK,CAMjC,IAAMC,EALWF,EAAUG,MAAM,GAAG,EAAEnB,IAAKoB,GAClCC,OAAOC,UAAUC,eAAeC,KAAKd,EAAsBU,CAAK,EACnEV,EAAqBU,CAAK,EAC1BA,CACL,EACwBK,KAAK,KAAK,EAC7BC,EAAef,EAAkBgB,QAAQ,MAAOV,EAAaS,YAAY,EAC/E,MAAO,CACLE,MAAOZ,EACPa,KAAM,GAAGX,CAAO,IAAIQ,CAAY,GAEpC,CAAC,EACAI,KAAK,CAACC,EAAGC,IAAMD,EAAEF,KAAKI,cAAcD,EAAEH,IAAI,CAAC,CAChD,CAAC,CAAC,CAEN,CAEAK,MAAMC,EAAgB,CACpB,GAAI,CAACA,EAAS,CACZ,KAAK1C,UAAUyC,MAAK,EACpB,MACF,CAEA,KAAK3C,oBAAoBe,sBACtBE,KACC4B,GAAK,CAAC,EACNpC,EAAKqC,IACK,KAAK1C,oBAAoBiC,OAAS,CAAA,GAAI5B,IAAKoB,GAC1CiB,EAAWC,IAAIlB,CAAK,EAAEmB,cAC9B,CACF,CAAC,EAEHC,UAAWzC,GAAsB,CAChC,KAAKN,UAAUyC,MAAM,CACnBnC,mBAAoBA,EACrB,CACH,CAAC,CACL,iDAlEWhB,GAA4B0D,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAAAF,EAAAG,EAAA,EAAAH,EAS7BI,EAAe,CAAA,CAAA,CAAA,+BATd9D,EAA4B+D,UAAA,CAAA,CAAA,2BAAA,CAAA,EAAAC,WAAA,GAAAC,MAAA,GAAAC,KAAA,GAAAC,OAAA,CAAA,CAAA,mBAAA,GAAA,EAAA,SAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,cAAA,SAAA,EAAA,CAAA,QAAA,KAAA,EAAA,CAAA,qBAAA,GAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,GAAA,QAAA,UAAA,EAAA,OAAA,CAAA,EAAAC,SAAA,SAAAC,EAAAC,EAAA,CAAAD,EAAA,ICrBzCE,EAAA,EAAA,KAAA,CAAA,EAOEC,EAAA,CAAA,mBACFC,EAAA,EACAF,EAAA,EAAA,oBAAA,EAAoB,EAAA,MAAA,CAAA,EAEhBG,GAAA,EAAA,sBAAA,CAAA,eACFD,EAAA,EAAM,EAERF,EAAA,EAAA,qBAAA,CAAA,EAAgC,EAAA,SAAA,CAAA,EACHI,EAAA,QAAA,UAAA,CAAA,OAASL,EAAAnB,MAAM,EAAK,CAAC,CAAA,EAC9CqB,EAAA,CAAA,oBACFC,EAAA,EACAF,EAAA,GAAA,SAAA,CAAA,EAAwCI,EAAA,QAAA,UAAA,CAAA,OAASL,EAAAnB,MAAM,EAAI,CAAC,CAAA,EAC1DqB,EAAA,EAAA,oBACFC,EAAA,EAAS,SAlBTG,EAAA,UAAAC,GAAA,GAAAC,GAAAR,EAAA3D,KAAAoE,eAAAC,UAAAV,EAAA3D,KAAAoE,eAAAE,eAAA,CAAA,EAKAC,EAAA,EAAAC,EAAA,IAAAC,EAAA,EAAA,EAAA,oDAAA,EAAA;CAAA,EAIuBF,EAAA,CAAA,EAAAN,EAAA,cAAAN,EAAA1D,mBAAA,EAAmC,UAAAwE,EAAA,EAAA,EAAAd,EAAAjD,gBAAA,CAAA,EAKxD6D,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,6BAAA,EAAA,GAAA,EAGAF,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,2BAAA,EAAA,GAAA;sIDESpF,CAA4B,GAAA,2BGY/BqF,EAAA,EAAA,WAAA,CAAA,EAAmCC,EAAA,EAAA,cAAA,EAAYC,EAAA,0BAa/CF,EAAA,EAAA,WAAA,CAAA,EAAmCC,EAAA,EAAA,cAAA,EAAYC,EAAA,0BAa/CF,EAAA,EAAA,WAAA,CAAA,EAAmCC,EAAA,EAAA,cAAA,EAAYC,EAAA,0BAa/CF,EAAA,EAAA,WAAA,CAAA,EAAmCC,EAAA,EAAA,cAAA,EAAYC,EAAA,0BAc7CF,EAAA,EAAA,WAAA,CAAA,EAAmCC,EAAA,EAAA,cAAA,EAAYC,EAAA,sCATrDF,EAAA,EAAA,SAAA,EAAA,EAEEG,EAAA,QAAA,UAAA,CAAAC,EAAAC,CAAA,EAAA,IAAAC,EAAAC,EAAA,EAAA,OAAAC,EAASF,EAAAG,iBAAA,CAAkB,CAAA,CAAA,EAI3BT,EAAA,EAAA,MAAA,EACEC,EAAA,CAAA,mBACAS,EAAA,EAAAC,GAAA,EAAA,EAAA,WAAA,CAAA,eAGFT,EAAA,EAAO,oBAJLU,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,EAAA,EAAA,iCAAA,EAAA,MAAA,EACAF,EAAA,CAAA,EAAAG,EAAAD,EAAA,EAAA,EAAAR,EAAAU,aAAA,EAAA,EAAA,EAAA,sCAOJhB,EAAA,EAAA,SAAA,EAAA,EAEEG,EAAA,QAAA,UAAA,CAAAC,EAAAa,CAAA,EAAA,IAAAX,EAAAC,EAAA,EAAA,OAAAC,EAASF,EAAAY,gBAAA,CAAiB,CAAA,CAAA,EAM1BjB,EAAA,CAAA,mBACFC,EAAA,QADEU,EAAA,EAAAC,EAAA,IAAAC,EAAA,EAAA,EAAA,sDAAA,EAAA,GAAA,GDpGR,UA2CaK,GA3CbC,GAAAC,EAAA,KAAAC,KACAC,KAGAC,KAQAC,KACAC,KAEAC,KAEAC,KAIAC,KAUAC,KACAC,KACAC,KACAC,KACAC,mJAQaf,IAA6B,IAAA,CAApC,MAAOA,CAA6B,CA8BxCgB,YACUC,EACAC,EACAC,EACAC,EACAC,EACAC,EACDC,EACCC,EACAC,EACAC,EAAsB,CATtB,KAAAT,OAAAA,EACA,KAAAC,0BAAAA,EACA,KAAAC,cAAAA,EACA,KAAAC,iBAAAA,EACA,KAAAC,cAAAA,EACA,KAAAC,iBAAAA,EACD,KAAAC,oBAAAA,EACC,KAAAC,gBAAAA,EACA,KAAAC,eAAAA,EACA,KAAAC,WAAAA,EAvCV,KAAAC,YAA+B,CAAA,EAC/B,KAAAC,eAAwC,CACtCC,UAAW,GACXC,gBAAiB,IAKnB,KAAAC,kBAAgC,CAAA,EAChC,KAAAC,uBAAqC,CAAA,EACrC,KAAAC,eAA6B,CAAA,EAI7B,KAAAC,mBAAuC,CAAA,EAIvC,KAAAC,eAAiB,KAAKb,iBAAiBc,SASvC,KAAAC,oBAAsBC,GAAe,EAAI,CAatC,CAEHC,UAAQ,CACN,KAAKhB,oBAAoBiB,YAAYC,KAAKC,GAAmB,KAAKhB,UAAU,CAAC,EAAEiB,UAAU,CACvFC,KAAO3B,GAAU,CACf,OAAQA,EAAM,CACZ,IAAK,WACH,KAAK4B,mBAAkB,CAC3B,CACF,EACD,EAGD,KAAKC,sBACH,kBACA,kBACA,KACA,KAAKvB,oBAAoBwB,sBAAsB,EAGjD,KAAKxB,oBAAoByB,yBAAyBP,KAAKC,GAAmB,KAAKhB,UAAU,CAAC,EAAEiB,UAAU,IAAK,CACzG,KAAKM,iBAAgB,CACvB,CAAC,EAGD,KAAKH,sBACH,gBACA,kCACA,KACA,KAAKvB,oBAAoB2B,oBAAoB,EAG/C,IAAMC,EAAuB,KAAKjC,0BAA0BkC,wBAAuB,EACnFC,EAAc,CAAC,KAAK7B,gBAAgB8B,eAAgBH,CAAoB,CAAC,EACtEV,KACCc,EAAU,CAAC,CAACC,EAAeC,CAAmB,IAAK,CACjD,IAAMC,EAAeD,EAAoBE,OAAO,CAACC,EAAOC,KAClDA,EAASC,aAAeF,EAAMG,QAAQF,EAASC,WAAW,IAAM,IAClEF,EAAMI,KAAKH,EAASC,WAAW,EAE1BF,GACN,CAAA,CAAE,EACL,OAAOP,EACLK,EAAaO,IAAKC,GAAS,KAAKzC,eAAe0C,wBAAwBD,EAAMV,CAAa,CAAC,CAAC,CAEhG,CAAC,EACDS,EAAKG,GACIA,EAAeT,OACpB,CAACU,EAA+CC,KAC9CD,EAAQC,EAAQJ,IAAI,EAAII,EACjBD,GAET,CAAA,CAAE,CAEL,EACDE,GAAepB,CAAoB,EACnCT,GAAmB,KAAKhB,UAAU,CAAC,EAEpCiB,UAAU,CAAC,CAAC6B,EAAgBf,CAAmB,IAAK,CAC/C,OAAOA,EAAwB,KAAeA,IAAwB,OAG1E,KAAKgB,wBAAuB,EAC5BhB,EAAoBiB,QAASb,GAAY,CASvC,GARIA,EAASS,SAAW,CAACT,EAASc,OAChC,KAAKC,mBAAmB,CAAC,EAAEP,QAAQL,KAAK,CACtCa,GAAIhB,EAASC,YACbgB,KAAMN,EAAeX,EAASC,WAAW,EAAEgB,KAC3CC,OAAQ,CAAA,EACRC,cAAenB,EAASoB,aACzB,EAECpB,EAASS,SAAWT,EAASc,OAAS,CAACd,EAASqB,KAAM,CACxD,IAAMP,EAAQH,EAAeX,EAASC,WAAW,EAAEqB,OAAOC,KAAMC,GACvDA,EAAKnB,OAASL,EAASyB,SAC/B,EACD,KAAKV,mBAAmB,CAAC,EAAEP,QAAQL,KAAK,CACtCa,GAAIhB,EAASyB,UACbR,KAAMH,GAAOG,KACbC,OAAQ,CAAClB,EAASC,WAAW,EAC7BkB,cAAenB,EAASoB,aACzB,CACH,CACIpB,EAASS,SAAWT,EAASc,OAASd,EAASqB,MACjD,KAAKN,mBAAmB,CAAC,EAAEP,QAAQL,KAAK,CACtCa,GAAIhB,EAASqB,KACbJ,KAAM,GAAGjB,EAASqB,IAAI,KAAKrB,EAASyB,SAAS,GAC7CP,OAAQ,CAAClB,EAASC,YAAaD,EAASyB,SAAS,EACjDN,cAAenB,EAASoB,aACzB,CAEL,CAAC,EACD,KAAKL,mBAAmB,CAAC,EAAEP,QAAQkB,KAAK,KAAKC,QAAQ,EACrD,KAAKZ,mBAAmB,CAAC,EAAEP,QAAQkB,KAAK,KAAKC,QAAQ,EACrD,KAAKZ,mBAAmB,CAAC,EAAEP,QAAQkB,KAAK,KAAKC,QAAQ,EACvD,CAAC,EAEH,KAAKC,iBAAmBpC,EAAc,CACpC,KAAK/B,iBAAiBoE,MACtB,KAAKpE,iBAAiBqE,MACtB,KAAKrE,iBAAiBc,QAAQ,CAC/B,EAAEK,KACDmD,GAAUC,EAAc,EACxB5B,EAAI,CAAC,CAAC6B,EAAMC,EAAMC,CAAO,IACnBF,IAASG,GAAKC,MAAQC,GAAQ,GAG9B,CAACH,EACI,IAELD,IAASK,GAAKC,MACT,GAAGC,GAAWD,KAAK,KACjBN,IAASK,GAAKG,QAChB,GAAGD,GAAWC,OAAO,KAErB,GAAGD,GAAWE,KAAK,IAE7B,CAAC,EAGJ,KAAKC,UAAYpD,EAAc,CAC7B,KAAK9B,oBAAoBmF,mBACzB,KAAKtF,iBAAiBuF,WACtB,KAAKnF,gBAAgB8B,cAAc,CACpC,EAAEb,KACDwB,EAAI,CAAC,CAAC2C,EAAM,CAACC,EAAOC,CAAG,EAAGC,CAAM,IAC1BH,IAAS,UAAYC,GAASC,EACzBD,EAAMG,mBAAmBD,CAAM,EAAI,MAAQD,EAAIE,mBAAmBD,CAAM,EAExEH,CAEV,CAAC,EAEJ,KAAKK,gBAAkB,KAAK9F,cAAc+F,iBAC1C,KAAKC,aAAe,KAAKhG,cAAciG,UAAU3E,KAAKwB,EAAKoD,GAAMA,GAAK,IAAI,CAAC,EAC3E,KAAKC,gBAAkB,KAAK/F,oBAAoBwB,uBAAuBN,KAAKwB,EAAKoD,GAAMA,EAAEE,OAAS,CAAC,CAAC,EACpG,KAAK1H,cAAgB,KAAKsB,cAAcqG,iBAAiB/E,KAAKwB,EAAKoD,GAAMA,EAAEE,OAAS,CAAC,CAAC,EACtF,KAAKE,iBAAmB,KAAKR,gBAAgBxE,KAC3CwB,EAAI,IAAM,KAAKhC,eAAeyF,OAAO,KAAK1F,sBAAsB,EAAE0F,OAAO,KAAK3F,iBAAiB,EAAEwF,OAAS,CAAC,CAAC,EAE9G,KAAKI,mBAAqB,KAAKV,gBAAgBxE,KAAKwB,EAAI,IAAM,KAAK/B,mBAAmBqF,OAAS,CAAC,CAAC,CACnG,CAEQ9C,yBAAuB,CAC7B,KAAKG,mBAAqB,CACxB,CACEE,KAAM8C,GACNvD,QAAS,CAAA,GAEX,CACES,KAAM+C,GACNxD,QAAS,CAAA,GAEX,CACES,KAAMgD,GACNzD,QAAS,CAAA,EACV,CAEL,CAEQmB,SAASuC,EAAaC,EAAW,CACvC,OAAOD,EAAEjD,MAAMmD,cAAcD,EAAElD,IAAI,CACrC,CAEAhC,sBACEoF,EACAC,EACAC,EACAC,EAA2B,CAE3B,IAAMC,EAAc,KAAK3G,YAAY4G,OAAQC,GAASA,EAAKN,WAAaA,CAAQ,EAChF,GAAII,EAAYf,OAAS,EAAG,CAC1Be,EAAY,CAAC,EAAEG,YAAcL,EAC7B,KAAKzG,YAAY,KAAKA,YAAY+G,UAAWC,GAAOA,EAAGT,WAAaA,CAAQ,CAAC,EAAII,EAAY,CAAC,EAC9F,MACF,CACA,KAAK3G,YAAYqC,KAAK,CACpBkE,SAAUA,EACVC,uBAAwBA,EACxBM,YAAaL,EACbQ,aAAcP,EACf,CACH,CAEAQ,iBAAiBX,EAAgB,CAC/B,GAAIA,IAAa,kBAAmB,CAElC,KAAK3G,oBAAoBuH,qBAAoB,EAC7C,MACF,SAAWZ,IAAa,gBAAiB,CAEvC,KAAK3G,oBAAoBwH,eAAc,EACvC,MACF,CACA,KAAKpH,YAAc,KAAKA,YAAY4G,OAAQA,GAAWA,EAAOL,WAAaA,CAAQ,EAC/EA,IAAa,oBACf,KAAKnG,kBAAoB,CAAA,EACzB,KAAKC,uBAAyB,CAAA,EAC9B,KAAKC,eAAiB,CAAA,EACtB,KAAKgB,iBAAgB,GACZiF,IAAa,gBACtB,KAAK7G,cAAc2H,UAAS,EAC5B,KAAKC,cAAgB,KACrB,KAAK9H,cAAc+H,YAAY,IAAI,GAC1BhB,IAAa,oBACtB,KAAKhG,mBAAqB,CAAA,EAC1B,KAAKe,iBAAgB,EAEzB,CAEAkG,iBAAiBjB,EAAgB,CAC3BA,IAAa,mBACf,KAAKkB,oBAAmB,EACflB,IAAa,eACtB,KAAKmB,gBAAe,EACXnB,IAAa,kBACtB,KAAKoB,mBAAkB,EACdpB,IAAa,kBACtB,KAAKrF,mBAAkB,EACdqF,IAAa,iBACtB,KAAK5I,iBAAgB,CAEzB,CAEQiK,0BAAwB,CAC9B,GAAI,KAAKxH,kBAAkBwF,OAAS,KAAKvF,uBAAuBuF,OAAS,KAAKtF,eAAesF,OAAS,EAAG,CACvG,IAAIiC,EAAe,GACnB,OAAI,KAAKzH,kBAAkBwF,SAAW,EACpCiC,GAAgB,YACP,KAAKzH,kBAAkBwF,OAAS,IACzCiC,GAAgB,GAAG,KAAKzH,kBAAkBwF,MAAM,cAG9C,KAAKxF,kBAAkBwF,OAAS,GAAK,KAAKvF,uBAAuBuF,OAAS,IAC5EiC,GAAgB,KAAKvH,eAAesF,OAAS,EAAI,KAAO,SAGtD,KAAKvF,uBAAuBuF,SAAW,EACzCiC,GAAgB,mBACP,KAAKxH,uBAAuBuF,OAAS,IAC9CiC,GAAgB,GAAG,KAAKxH,uBAAuBuF,MAAM,sBAIpD,KAAKxF,kBAAkBwF,OAAS,GAAK,KAAKvF,uBAAuBuF,OAAS,IAC3E,KAAKtF,eAAesF,OAAS,IAE7BiC,GAAgB,SAGd,KAAKvH,eAAesF,SAAW,EACjCiC,GAAgB,SACP,KAAKvH,eAAesF,OAAS,IACtCiC,GAAgB,GAAG,KAAKvH,eAAesF,MAAM,WAExCiC,CACT,CACA,GAAI,KAAKzH,kBAAkBwF,OAAS,EAClC,OAAO,KAAKxF,kBAAkB,CAAC,EAAE8C,GAEnC,GAAI,KAAK7C,uBAAuBuF,OAAS,EACvC,OAAO,KAAKvF,uBAAuB,CAAC,EAAE6C,GAExC,GAAI,KAAK5C,eAAesF,OAAS,EAC/B,OAAO,KAAKtF,eAAe,CAAC,EAAE4C,EAElC,CAEQ4E,sBAAoB,CAC1B,GAAI,KAAKR,cACP,OAAO,KAAKA,cAAcnE,IAE9B,CAEQ4E,yBAAuB,CAE7B,MAAO,GAAK,KAAKxH,mBAAmB+B,IAAK0F,GAAWA,EAAO7E,KAAK8E,MAAM,KAAK,EAAEC,IAAG,CAAE,EAAEC,KAAK,IAAI,CAC/F,CAEQC,sBAAsBC,EAAeC,EAAqB,CAChE,IAAIC,EAAgB,KAAKtI,eAAeC,UACpCmI,IAAU,QAAUC,IACtBC,EAAgB,WAElB,KAAKtI,eAAiB,CACpBC,UAAWqI,EACXpI,gBAAiBmI,EAAe,IAAIA,CAAY,GAAK,UAEzD,CAEAb,qBAAmB,CACC,KAAKnI,OAAOkJ,KAAKC,GAA+B,CAChEC,KAAM,CACJzF,mBAAoB,KAAKA,mBACzB7C,kBAAmB,KAAKA,kBACxBC,uBAAwB,KAAKA,uBAC7BC,eAAgB,KAAKA,eACrBL,eAAgB,KAAKA,gBAEvBiD,GAAI,4BACL,EACSyF,YAAW,EAAG3H,UAAW4H,GAAW,CAC5C,GAAI,OAAOA,EAAY,IAAa,CAMlC,GALA,KAAKxI,kBAAoBwI,EAAQxI,kBACjC,KAAKC,uBAAyBuI,EAAQvI,uBACtC,KAAKC,eAAiBsI,EAAQtI,eAI5B,KAAKF,kBAAkBwF,SAAW,GAClC,KAAKvF,uBAAuBuF,SAAW,GACvC,KAAKtF,eAAesF,SAAW,EAC/B,CACA,KAAKsB,iBAAiB,kBAAkB,EACxC,KAAK5F,iBAAgB,EACrB,MACF,CAEA,KAAKH,sBACH,mBACA,sDACA,KAAKyG,yBAAwB,CAAE,EAEjC,KAAKtG,iBAAgB,CACvB,CACF,CAAC,CACH,CAEAoG,iBAAe,CACK,KAAKpI,OAAOkJ,KAAKK,GAA2B,CAC5DH,KAAM,CACJpB,cAAe,KAAKA,cACpBrH,eAAgB,KAAKA,gBAEvBiD,GAAI,wBACL,EACSyF,YAAW,EAAG3H,UAAW4H,GAAW,CACxC,OAAOA,EAAY,KACrB,KAAKtB,cAAsCsB,EAAQtB,cACnD,KAAK9H,cAAc+H,YAAY,KAAKD,cAAcwB,MAAMC,SAAS,EAEjE,KAAK5H,sBACH,eACA,kDACA,KAAK2G,qBAAoB,CAAE,EAG7B,KAAKpI,cAAcsJ,QAAQ,KAAK1B,cAAcwB,MAAMC,SAAS,IAE7D,KAAKzB,cAAgB,KACrB,KAAK9H,cAAc+H,YAAY,IAAI,EACnC,KAAK7H,cAAc2H,UAAS,EAEhC,CAAC,CACH,CAEAM,oBAAkB,CACE,KAAKrI,OAAOkJ,KAAKS,GAA8B,CAC/DP,KAAM,CACJnI,mBAAoB,KAAKA,mBACzBN,eAAgB,KAAKA,gBAEvBiD,GAAI,6BACL,EACSyF,YAAW,EAAG3H,UAAW4H,GAAW,CAC5C,GAAI,OAAOA,EAAY,IAAa,CAIlC,GAHA,KAAKrI,mBAAqBqI,EAAQrI,mBAG9B,KAAKA,mBAAmBqF,SAAW,EAAG,CACxC,KAAKsB,iBAAiB,iBAAiB,EACvC,KAAK5F,iBAAgB,EACrB,MACF,CAEA,KAAKH,sBACH,kBACA,qDACA,KAAK4G,wBAAuB,CAAE,EAEhC,KAAKzG,iBAAgB,CACvB,CACF,CAAC,CACH,CAEAJ,oBAAkB,CACE,KAAK5B,OAAOkJ,KAAKU,GAA8B,CAC/DR,KAAM,CACJzI,eAAgB,KAAKA,gBAEvBiD,GAAI,kCACJiG,WAAY,CAAC,mBAAmB,EACjC,EACSR,YAAW,EAAG3H,UAAW4H,GAAW,CACxC,OAAOA,EAAY,KAErB,KAAKhJ,oBAAoBwJ,mBAAmBR,EAAQS,uBAAuB,CAE/E,CAAC,CACH,CAEA1L,kBAAgB,CACI,KAAK2B,OAAOkJ,KAAKc,GAA4B,CAC7DZ,KAAM,CACJa,kBAAmB,KAAK3J,oBAAoB4J,aAAY,EACxDvJ,eAAgB,KAAKA,gBAEvBiD,GAAI,gCACL,EACSyF,YAAW,EAAG3H,UAAW4H,GAAW,CACxC,OAAOA,EAAY,KAErB,KAAKhJ,oBAAoB6J,aAAab,EAAQW,iBAAiB,EAEjE,KAAKjI,iBAAgB,CACvB,CAAC,CACH,CAEQoI,2BAAyB,CAC/B,GACE,KAAKtJ,kBAAkBwF,SAAW,GAClC,KAAKvF,uBAAuBuF,SAAW,GACvC,KAAKtF,eAAesF,SAAW,EAE/B,OAAO,KAET,IAAM+D,EAAe,IAAIC,EAAO,CAC9BC,gBAAiB,CACfC,GAAIC,EAAwBC,GAC5BC,QAAS,CAAA,GAEZ,EACD,OAAC,GAAG,KAAK7J,kBAAmB,GAAG,KAAKC,uBAAwB,GAAG,KAAKC,cAAc,EAAEyC,QAASb,GAAY,CACvG,IAAIgI,EAAY,UACZhI,EAASkB,OAAOwC,SAAW,EAC7BsE,EAAY,QACHhI,EAASkB,OAAOwC,SAAW,IACpCsE,EAAY,QAEdP,EAAaE,gBAAgBI,QAAQ5H,KACnC,IAAIuH,EAAO,CACTO,YAAa,CACXC,SAAUC,EAAoBC,MAC9BJ,UAAW,kBAAkBA,CAAS,GACtCzD,MAAO,CACLA,MAAOvE,EAASgB,GAChBqH,UAAWC,EAAaC,uBAG7B,CAAC,CAEN,CAAC,EAEMd,CACT,CAEQe,0BAAwB,CAC9B,OAAI,KAAKnK,mBAAmBqF,SAAW,EAC9B,KAEF,IAAIgE,EAAO,CAChBO,YAAa,CACXC,SAAUC,EAAoBM,QAC9BT,UAAW,yBACXzD,MAAO,CACLA,MAAO,KAAKlG,mBAAmB+B,IAAK0F,GAAWA,EAAO9E,EAAE,EACxDqH,UAAWC,EAAaC,uBAG7B,CACH,CAEQG,0BAAwB,CAC9B,OAAI,KAAKhL,oBAAoBiL,mBAAkB,EAAGjF,SAAW,EACpD,KAEF,IAAIgE,EAAO,CAChBO,YAAa,CACXC,SAAUC,EAAoBC,MAC9BQ,iBAAkBC,GAA4BC,IAE9Cd,UAAW,kCACXzD,MAAO,CACLA,MAAO,KAAK7G,oBAAoBiL,mBAAkB,EAClDN,UAAWC,EAAaC,uBAG7B,CACH,CAEQnJ,kBAAgB,CACtB,IAAM2J,EAAY,KAAKvB,0BAAyB,EAC1CwB,EAAiB,KAAKR,yBAAwB,EAC9CS,EAAiB,KAAKP,yBAAwB,EACpD,KAAKpL,cAAc4L,WAAW,CAACH,EAAWC,EAAgBC,CAAc,EAAEvE,OAAQyE,GAAM,CAAC,CAACA,CAAC,CAAC,CAC9F,CAEOjN,iBAAe,CACpB,KAAK8I,iBAAiB,iBAAiB,EACvC,KAAKA,iBAAiB,eAAe,EACrC,KAAKA,iBAAiB,kBAAkB,EACxC,KAAKA,iBAAiB,cAAc,EACpC,KAAKA,iBAAiB,iBAAiB,CACzC,iDAhiBW7I,GAA6BiN,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAAAF,EAAAG,EAAA,EAAAH,EAAAI,EAAA,EAAAJ,EAAAK,EAAA,EAAAL,EAAAM,EAAA,EAAAN,EAAAO,EAAA,EAAAP,EAAAQ,EAAA,EAAAR,EAAAS,EAAA,EAAAT,EAAAU,EAAA,CAAA,CAAA,CAAA,+BAA7B3N,EAA6B4N,UAAA,CAAA,CAAA,2BAAA,CAAA,EAAAC,OAAA,CAAAxL,oBAAA,CAAA,EAAA,qBAAA,CAAA,EAAAyL,WAAA,GAAAC,MAAA,GAAAC,KAAA,GAAAC,OAAA,CAAA,CAAA,kBAAA,SAAA,EAAA,CAAA,EAAA,eAAA,mBAAA,QAAA,EAAA,UAAA,OAAA,EAAA,UAAA,SAAA,EAAA,CAAA,qBAAA,GAAA,mBAAA,QAAA,gBAAA,SAAA,EAAA,qBAAA,EAAA,oBAAA,WAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,CAAA,gBAAA,GAAA,oBAAA,uBAAA,cAAA,sCAAA,EAAA,OAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,gBAAA,GAAA,oBAAA,uBAAA,cAAA,qCAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,GAAA,oBAAA,uBAAA,cAAA,kCAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,GAAA,oBAAA,uBAAA,cAAA,qCAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,GAAA,oBAAA,uBAAA,cAAA,kCAAA,EAAA,CAAA,QAAA,UAAA,gBAAA,GAAA,oBAAA,uBAAA,cAAA,iCAAA,EAAA,cAAA,EAAA,CAAA,gBAAA,GAAA,oBAAA,uBAAA,cAAA,mCAAA,EAAA,OAAA,EAAA,CAAA,QAAA,UAAA,gBAAA,GAAA,oBAAA,uBAAA,cAAA,iCAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAAC,SAAA,SAAAC,EAAAC,EAAA,CAAA,GAAAD,EAAA,EAAA,WC3C1CtP,EAAA,EAAA,MAAA,CAAA,yCASEA,EAAA,EAAA,SAAA,CAAA,4BASEA,EAAA,EAAA,WAAA,CAAA,EAAuBC,EAAA,EAAA,aAAA,EAAWC,EAAA,EAClCF,EAAA,EAAA,OAAA,CAAA,EACEC,EAAA,EAAA,oBACFC,EAAA,EAAO,EAETF,EAAA,GAAA,WAAA,EAAA,CAAA,EAAoF,GAAA,SAAA,CAAA,EAGhFG,EAAA,QAAA,UAAA,CAAAqP,OAAApP,EAAAqP,CAAA,EAAAjP,EAAS+O,EAAAhF,oBAAA,CAAqB,CAAA,CAAA,EAI9BvK,EAAA,GAAA,MAAA,EACEC,EAAA,EAAA,oBACAS,EAAA,GAAAgP,GAAA,EAAA,EAAA,WAAA,CAAA,gBAGFxP,EAAA,EAAO,EAETF,EAAA,GAAA,SAAA,CAAA,EAEEG,EAAA,QAAA,UAAA,CAAAqP,OAAApP,EAAAqP,CAAA,EAAAjP,EAAS+O,EAAA9E,mBAAA,CAAoB,CAAA,CAAA,EAI7BzK,EAAA,GAAA,MAAA,EACEC,EAAA,EAAA,oBACAS,EAAA,GAAAiP,GAAA,EAAA,EAAA,WAAA,CAAA,gBAGFzP,EAAA,EAAO,EAETF,EAAA,GAAA,SAAA,CAAA,EAEEG,EAAA,QAAA,UAAA,CAAAqP,OAAApP,EAAAqP,CAAA,EAAAjP,EAAS+O,EAAA/E,gBAAA,CAAiB,CAAA,CAAA,EAI1BxK,EAAA,GAAA,MAAA,EACEC,EAAA,EAAA,oBACAS,EAAA,GAAAkP,GAAA,EAAA,EAAA,WAAA,CAAA,gBAGF1P,EAAA,EAAO,EAETF,EAAA,GAAA,SAAA,EAAA,EAEEG,EAAA,QAAA,UAAA,CAAAqP,OAAApP,EAAAqP,CAAA,EAAAjP,EAAS+O,EAAAvL,mBAAA,CAAoB,CAAA,CAAA,EAI7BhE,EAAA,GAAA,MAAA,EACEC,EAAA,EAAA,oBACAS,EAAA,GAAAmP,GAAA,EAAA,EAAA,WAAA,CAAA,gBAGF3P,EAAA,EAAO,EAETQ,EAAA,GAAAoP,GAAA,EAAA,EAAA,SAAA,EAAA,EAA6B,GAAAC,GAAA,EAAA,EAAA,SAAA,EAAA,gBA2B/B7P,EAAA,EAAW,uBArGX8P,EAAA,UAAAC,GAAA,GAAAC,GAAApP,EAAA,EAAA,GAAAyO,EAAAjM,cAAA,IAAA,GAAAxC,EAAA,EAAA,GAAAyO,EAAA7M,oBAAAyN,iBAAA,CAAA,CAAA,EAGE,UAAAC,GAAA,GAAAC,GAAAvP,EAAA,EAAA,GAAAyO,EAAA3I,gBAAA,CAAA,CAAA,EAOAhG,EAAA,CAAA,EAAAoP,EAAA,oBAAAM,CAAA,EAAqC,WAAAxP,EAAA,EAAA,GAAAyO,EAAAnH,eAAA,CAAA,EACD,iBAAAtH,EAAA,EAAA,GAAAyO,EAAAnH,eAAA,IAAA,CAAA,EAOlCxH,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,4CAAA,EAAA,GAAA,EAG4BF,EAAA,CAAA,EAAAoP,EAAA,iBAAA,EAAA,EAQ1BpP,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,qDAAA,EAAA,MAAA,EACAF,EAAA,CAAA,EAAAG,EAAAD,EAAA,GAAA,GAAAyO,EAAA3G,gBAAA,EAAA,GAAA,EAAA,EAYAhI,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,oDAAA,EAAA,MAAA,EACAF,EAAA,CAAA,EAAAG,EAAAD,EAAA,GAAA,GAAAyO,EAAAzG,kBAAA,EAAA,GAAA,EAAA,EAYAlI,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,iDAAA,EAAA,MAAA,EACAF,EAAA,CAAA,EAAAG,EAAAD,EAAA,GAAA,GAAAyO,EAAAjH,YAAA,EAAA,GAAA,EAAA,EAYA1H,EAAA,CAAA,EAAAC,EAAA,IAAAC,EAAA,GAAA,GAAA,iBAAA,EAAA,MAAA,EACAF,EAAA,CAAA,EAAAG,EAAAD,EAAA,GAAA,GAAAyO,EAAA9G,eAAA,EAAA,GAAA,EAAA,EAKJ7H,EAAA,CAAA,EAAAG,EAAAwO,EAAA/L,oBAAA,EAAA,GAAA,EAAA,EAeA5C,EAAA,EAAAG,EAAAD,EAAA,GAAA,GAAAyO,EAAAnH,eAAA,EAAA,EAAA,GAAA,EAAA;uIDhDSjH,CAA6B,GAAA", "names": ["init_reputation", "__esmMin", "init_reputation_service", "FilterService", "init_filter_service_service", "__esmMin", "init_esm", "init_vendasta_multi_location_analytics", "init_operators", "constructor", "filters$$", "BehaviorSubject", "Array", "enabledSources$$", "filteredSources$$", "subgroup$$", "filters$", "asObservable", "pipe", "map", "r", "enabledSources$", "filteredSources$", "subgroup$", "sourceFilter$", "combineLatest", "enabled", "filtered", "length", "sourceIds", "Filter", "fieldFilter", "operator", "FieldFilterOperator", "EQUAL", "operatorFunction", "FieldFilterOperatorFunction", "ANY", "dimension", "value", "valueType", "PropertyType", "PROPERTY_TYPE_STRING", "distinctUntilChanged", "filtersQuantity$", "filters", "filteredSources", "subgroup", "qty", "setFilters", "next", "setEnabledSources", "setFilteredSources", "setSubgroup", "groupId", "factory", "\u0275fac", "providedIn", "COUNTRIES_LABEL", "STATEPROV_LABEL", "CITIES_LABEL", "BrandFilterContainerService", "init_brand_filter_container_service", "__esmMin", "init_router", "init_esm", "init_operators", "init_account_group", "init_page_access", "init_time_range_service", "init_rxjs_interop", "constructor", "timeRangeService", "translate", "filterService", "router", "reputationService", "locationsService", "dateFilterUsed$$", "BehaviorSubject", "dateFilterUsed$", "asObservable", "selectedAccountGroupIds$$", "selectedAccountGroupIds$", "selectedSourceIds$$", "selectedSourceIds$", "sourceIdCounts$$", "sourceIdCounts$", "openDialog$", "Subject", "minimised$$", "minimised$", "dateFilterDisplay$", "selectedTimeRangeKey$", "pipe", "map", "timeRangeKey", "AvailableTimeRangeOptions", "find", "timeRangeOption", "key", "name", "locationFilterDisplay$", "combineLatest", "currentAccountGroups$", "filter", "ls", "stream", "brandLocations", "accountGroupIds", "locationsTranslated", "locs", "accountGroupId", "locsInside", "loc", "length", "setAccountGroupIds", "companyName", "getLocation", "join", "sourceFilterDisplay$", "brandSourcesFull$", "sourceMap", "brandSources", "selectedSourceIds", "sourceIdCounts", "sourcesTranslated", "sources", "sourceId", "get", "sourcesInside", "source", "setSourceIds", "sourceOptions$", "countMap", "Array", "from", "keys", "count", "value", "valueCount", "sort", "a", "b", "localeCompare", "brandSources$", "takeUntilDestroyed", "subscribe", "sourceIds", "setEnabledSources", "toString", "setFilteredSources", "shouldHaveShadow$", "events", "event", "ActivationEnd", "snapshot", "children", "data", "PageId", "multi_location_report", "startWith", "_this", "route", "routerState", "root", "firstChild", "shareReplay", "refCount", "bufferSize", "setMinimizedStatus", "status", "next", "openDialog", "dialog", "getAccountGroupIds", "getValue", "clearAccountGroupIds", "getSourceIds", "addSourceId", "includes", "removeSourceId", "newSources", "id", "clearSourceIds", "\u0275\u0275inject", "TimeRangeService", "TranslateService", "FilterService", "Router", "ReputationService", "LocationsService", "factory", "\u0275fac", "providedIn", "round", "value", "pipeOpts", "val", "rounderPipe", "transform", "replace", "rowify", "r", "metrics", "res", "map", "m", "parse", "Row", "rows", "forEach", "singleDayMeasureValues", "push", "values", "dimension", "results", "measures", "reduce", "acc", "concat", "QueryMetricsResponseDelta", "init_helpers", "__esmMin", "init_common", "init_operators", "DecimalPipe", "constructor", "currentPeriod$", "prevPeriod$", "currentPeriodRows$", "pipe", "metricResults", "previousPeriodRows$", "boolValue", "value", "TypedValue", "valueType", "PropertyType", "PROPERTY_TYPE_BOOL", "stringValue", "PROPERTY_TYPE_STRING", "buildListingCountMeasures", "measures", "map", "field", "fieldErrorFilter", "Filter", "fieldFilter", "FieldFilter", "dimension", "operator", "FieldFilterOperator", "EQUAL", "Measure", "aggregate", "MeasureAggregate", "measure", "aggOp", "MeasureAggregateOperator", "COUNT", "filter", "compositeFilter", "op", "CompositeFilterOperator", "AND", "filters", "isNotVerifiedFilter", "isInaccurateFilter", "alias", "concat", "isAccurateFilter", "isVerifiedFilter", "OR", "unaryFilter", "UnaryFilter", "UnaryFilterOperator", "IS_NULL", "isPotentialMissingFilter", "inclusiveExclusive", "start", "end", "DateRange", "endExclusive", "inclusiveInclusive", "import_dayjs", "import_utc", "import_moment", "StatByTime", "BrandContext", "isMissingFilter", "QueryService", "init_query_service", "__esmMin", "init_vendasta_multi_location_analytics", "init_esm", "init_operators", "init_globals", "init_locations", "init_time_range_shared", "init_time_range_service", "init_helpers", "dayjs", "extend", "utc", "constructor", "time", "stat", "localAlignedTime", "alignUTCDateToLocal", "resourceIds", "startDate", "endDate", "timeRange", "activeSources", "selectedSourceIds", "groupBy", "sourceIds", "length", "num", "sourceIdsSet", "Set", "previousPeriod", "prevRange", "previousPeriodMoment", "toDate", "dateRange", "forCurrentPeriod", "GMBDateRange", "format", "subtract", "ReviewDateRange", "onlyOffsetStartDate", "CUSTOM_TIME_RANGE_KEYS", "includes", "adIntelDateRange", "alignmentPeriod", "getAlignmentPeriodForRange", "buildFilter", "buildActiveSourcesFilter", "operatorFunction", "FieldFilterOperatorFunction", "ANY", "Array", "from", "PROPERTY_TYPE_INT64", "buildActualActiveSourcesFilter", "n", "NOT_EQUAL", "analyticsService", "timeRangeService", "filterService", "brandFiltersService", "reputationService", "locationsService", "brandsService", "resourceIds$", "currentLocation$", "pipe", "switchMap", "location", "isBrand", "path$", "path", "ResourceId", "groupId", "GroupResourceId", "groupPathNodes", "isAccountGroup", "of", "businessId", "BusinessResourceId", "accountGroupId", "brandsContext$", "combineLatest", "utcAlignedDateRange$", "filters$", "brandSources$", "selectedSourceIds$", "selectedTimeRangeKey$", "debounceTime", "activatedSources", "shareReplay", "refCount", "bufferSize", "insights$s", "Map", "fetchMetric", "buildBrandContext$", "buildGMBInsightsRequest", "insightsTotals$", "buildGMBInsightsTotalsRequest", "searchKeywords", "buildGMBSearchKeywordsRequest", "reviewContext$", "reviews$s", "buildReviewsRequest", "buildAlltimeReviewsRequest", "responseTimes$s", "buildResponseTimeRequest", "buildAllTimeResponseTimeRequest", "reviewCounts$", "brandsContext", "queryMetrics", "QueryMetricsRequest", "partnerId", "metricName", "GroupBy", "groupByOperator", "GroupByOperator", "OPERATOR_GROUP_BY", "accountGroupGeography$", "buildAccountGroupGeographyRequest", "startWith", "accountGroupTaxonomies$", "buildAccountGroupTaxonomyRequest", "accountGroup$", "buildAccountGroupRequest", "listingScore$", "buildListingScoreRequest", "latestListingScore$", "buildLatestListingScoreRequest", "listingQuality$", "buildListingQualityRequest", "listingMatchQuality$", "buildListingMatchQualityRequest", "GroupByDimension", "listingMatchQualityTotals$", "listingCounts$", "fetchUnboundedMetric", "buildListingCountRequest", "listingAccuracyCountsByLocation$", "buildBusinessDataListingCountRequest", "listingAccuracyCountsBySource$", "listingAccuracyTotals$", "adIntelStats$", "buildAdIntelStatsRequest", "gmbConnections$", "buildGMBLocationsRequest", "socialConnections$", "buildSocialRequest", "facebookConnections$", "reviewsRequestContext$", "reviewRequests", "buildReviewRequestsRequest", "repReviewRequest$", "buildRepReviewRequestsRequest", "requestBuilder", "limit", "current", "req", "prev", "QueryMetricsResponseDelta", "dim", "OPERATOR_CUBE", "alignment", "Alignment", "ALIGN_DELTA", "AlignmentPeriod", "calendar", "AlignmentPeriodCalendar", "CALENDAR_YEAR", "_", "AVG", "SUM", "excludeCombination", "GroupByExcludeCombination", "dimensions", "MAX", "limitDimension", "order", "Order", "ORDER_DESC", "moment", "date", "CALENDAR_MONTH", "brandContext", "OPERATOR_ROLLUP", "curPeriod", "ALIGN_EXACT", "Date", "groupByAccount", "fbPageOnly", "push", "CompositeFilter", "fieldMask", "fieldMaskObj", "reduce", "o", "f", "\u0275\u0275inject", "AnalyticsApiService", "TimeRangeService", "FilterService", "BrandFilterContainerService", "ReputationService", "LocationsService", "BrandsService", "factory", "\u0275fac", "providedIn", "capitalizeFirstLetters", "a", "split", "map", "c", "charAt", "toUpperCase", "slice", "toLowerCase", "join", "TaxonomyOptionWithCount", "GeoWithCount", "Country", "CountryDetails", "AccountGroupMetricService", "init_account_group_service", "__esmMin", "init_esm", "init_operators", "init_helpers", "constructor", "taxonomyOption", "numLocations", "countryCode", "country", "state", "stateCode", "city", "countryName", "stateCodeToName", "stateName", "val", "get", "countryCodeToCountry", "queryService", "httpClient", "locationsService", "taxonomyService", "filteredAccountGroupIdsForPath$", "getAccountGroupIds$", "filteredLocationsForPath$", "combineLatest", "currentAccountGroups$", "pipe", "locations", "filteredAgids", "filtered", "Object", "keys", "k", "forEach", "ag", "has", "accountGroupId", "shareReplay", "refCount", "bufferSize", "allTaxonomyOptions$", "getTaxonomyIds", "brandTaxonomyRows$", "accountGroupTaxonomies$", "r", "rowify", "metricResults", "brandTaxonomyOptions$", "allTax", "brandRows", "allTaxMap", "Map", "tax", "set", "id", "brandTaxMap", "row", "Array", "from", "Set", "values", "taxId", "existing", "measures", "accountGroup$", "filter", "s", "add", "getGeographicBreakdown$", "rows$", "accountGroupGeography$", "countyInfo$", "switchMap", "i", "of", "countries", "getCountryAndStateInformation", "rows", "countryInfo", "dataRow", "Number", "forkJoin", "subKeys", "String", "subNames", "states", "key", "m", "\u0275\u0275inject", "QueryService", "HttpClient", "LocationsService", "TaxonomyService", "factory", "\u0275fac", "providedIn", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "data_r3", "\u0275\u0275restoreView", "_r2", "$implicit", "ctx_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "removeLocation", "id", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "name", "\u0275\u0275pipeBind2", "\u0275\u0275pureFunction1", "_c1", "locationCount", "\u0275\u0275repeaterCreate", "BrandGeographyDialogComponent_Conditional_8_For_6_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275pipeBind1", "\u0275\u0275repeater", "selectedCountries", "data_r6", "_r5", "BrandGeographyDialogComponent_Conditional_9_For_6_Template", "selectedStateProvinces", "data_r8", "_r7", "BrandGeographyDialogComponent_Conditional_10_For_6_Template", "selectedCities", "\u0275\u0275property", "option_r9", "BrandGeographyDialogComponent_For_18_For_3_Template", "group_r10", "options", "BrandGeographyDialogComponent", "init_brand_geography_dialog_component", "__esmMin", "init_forms", "init_dialog", "init_operators", "init_brand_filter_container_service", "constructor", "dialogRef", "data", "locationControl", "UntypedFormControl", "selectedOptions", "ngOnInit", "updateSelectedInformation", "filteredLocations$", "valueChanges", "pipe", "startWith", "map", "value", "filterLocationGroup", "availableLocations", "group", "filterLocations", "filter", "length", "locations", "filterValue", "toString", "toLowerCase", "location", "indexOf", "some", "r", "parent", "includes", "addLocationOpt", "event", "take", "groups", "option", "sameParents", "i", "subscribe", "addLocation", "locationType", "locationName", "locationValue", "trim", "setValue", "COUNTRIES_LABEL", "countryObject", "locationGroup", "country", "push", "STATEPROV_LABEL", "stateprovObject", "CITIES_LABEL", "cityObject", "statProv", "city", "stateProv", "close", "newData", "\u0275\u0275directiveInject", "MatDialogRef", "MAT_DIALOG_DATA", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "BrandGeographyDialogComponent_Conditional_8_Template", "BrandGeographyDialogComponent_Conditional_9_Template", "BrandGeographyDialogComponent_Conditional_10_Template", "\u0275\u0275element", "$event", "i0", "_r1", "BrandGeographyDialogComponent_For_18_Template", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275conditional", "auto_r11", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "option_r2", "name", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "GroupWithDisplayName", "BrandGroupDialogComponent", "init_brand_group_dialog_component", "__esmMin", "init_dialog", "init_forms", "init_esm", "init_operators", "constructor", "group", "dialogRef", "data", "brandsService", "groupControl", "UntypedFormControl", "selectedGroup", "options$", "allGroups$", "pipe", "map", "groups", "paths", "Map", "forEach", "g", "set", "pathNodes", "join", "buildGroupName", "sort", "a", "b", "localeCompare", "groupsByPath", "parent", "get", "slice", "ngOnInit", "filteredOptions$", "combineLatest", "valueChanges", "startWith", "value", "options", "_filter", "filterValue", "toLowerCase", "filter", "option", "includes", "close", "newData", "setGroupOpt", "event", "take", "subscribe", "setGroup", "id", "\u0275\u0275directiveInject", "MatDialogRef", "MAT_DIALOG_DATA", "BrandsService", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275element", "\u0275\u0275listener", "$event", "i0", "\u0275\u0275restoreView", "_r1", "\u0275\u0275resetView", "\u0275\u0275repeaterCreate", "BrandGroupDialogComponent_For_10_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275pipeBind1", "auto_r3", "\u0275\u0275repeater", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275listener", "option_r2", "\u0275\u0275restoreView", "_r1", "$implicit", "optionEl_r3", "\u0275\u0275reference", "ctx_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "selectFilterLocation", "accountGroupId", "\u0275\u0275textInterpolate", "name", "address", "\u0275\u0275template", "BrandLocationDialogComponent_Conditional_9_Conditional_0_Template", "BrandLocationDialogComponent_Conditional_9_div_1_Template", "\u0275\u0275conditional", "noResultsFound", "accountGroupFilterControl", "value", "trim", "\u0275\u0275property", "ctx", "\u0275\u0275textInterpolate2", "options_r5", "length", "item_r7", "_r6", "removeLocation", "BrandLocationDialogComponent_Conditional_12_Conditional_4_Template", "BrandLocationDialogComponent_Conditional_12_Conditional_6_Template", "\u0275\u0275repeaterCreate", "BrandLocationDialogComponent_Conditional_12_For_8_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275repeater", "BrandLocationDialogComponent", "init_brand_location_dialog_component", "__esmMin", "init_forms", "init_dialog", "init_esm", "init_operators", "init_account_group", "constructor", "dialogRef", "brandFiltersService", "data", "locationsService", "UntypedFormControl", "selectedOptions$$", "BehaviorSubject", "selectedOptions$", "asObservable", "ngOnInit", "next", "getAccountGroupIds", "options$", "currentAccountGroups$", "pipe", "map", "locationMap", "setValue", "Object", "keys", "accountGroup", "companyName", "getLocation", "sort", "a", "b", "localeCompare", "filteredOptions$", "combineLatest", "valueChanges", "debounceTime", "options", "selectedOptions", "_filter", "tap", "selectedOptionsDetails$", "selected", "filter", "o", "indexOf", "option", "filterValue", "toUpperCase", "includes", "remove", "currentSelected", "getValue", "push", "close", "newData", "selectedAccountGroupIds", "\u0275\u0275directiveInject", "MatDialogRef", "BrandFilterContainerService", "MAT_DIALOG_DATA", "LocationsService", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "\u0275\u0275element", "BrandLocationDialogComponent_Conditional_9_Template", "BrandLocationDialogComponent_Conditional_12_Template", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275propertyInterpolate", "tmp_4_0", "tmp_5_0", "BrandSourceDialogComponent", "init_brand_source_dialog_component", "__esmMin", "init_dialog", "init_forms", "constructor", "brandService", "dialogRef", "brandFiltersService", "data", "formControl", "UntypedFormControl", "ngOnInit", "setValue", "selectedSourceIds", "options$", "sourceOptions$", "close", "newData", "value", "\u0275\u0275directiveInject", "BrandsService", "MatDialogRef", "BrandFilterContainerService", "MAT_DIALOG_DATA", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275element", "\u0275\u0275listener", "\u0275\u0275property", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "BrandTaxonomyDialogComponent", "init_brand_taxonomy_dialog_component", "__esmMin", "init_dialog", "init_forms", "init_esm", "init_operators", "constructor", "accountGroupService", "translateService", "dialogRef", "data", "taxonomyFormControl", "UntypedFormControl", "ngOnInit", "selectedTaxonomyIds", "selectedTaxonomies", "map", "taxOpts", "id", "setValue", "taxonomyOptions$", "combineLatest", "brandTaxonomyOptions$", "stream", "pipe", "brandTaxMap", "taxonomyTranslations", "locationsTemplate", "instant", "count", "Array", "from", "fullTaxId", "taxWithCount", "taxName", "split", "taxId", "Object", "prototype", "hasOwnProperty", "call", "join", "numLocations", "replace", "value", "name", "sort", "a", "b", "localeCompare", "close", "newData", "take", "taxOptions", "get", "taxonomyOption", "subscribe", "\u0275\u0275directiveInject", "AccountGroupMetricService", "TranslateService", "MatDialogRef", "MAT_DIALOG_DATA", "selectors", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275element", "\u0275\u0275listener", "\u0275\u0275property", "\u0275\u0275pureFunction2", "_c0", "filterSettings", "textColor", "backgroundColor", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "openSourceDialog", "\u0275\u0275template", "BrandFilterContainerComponent_Conditional_38_Conditional_4_Template", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind1", "\u0275\u0275conditional", "sourceFilter$", "_r4", "clearAllFilters", "BrandFilterContainerComponent", "init_brand_filter_container_component", "__esmMin", "init_core", "init_rxjs_interop", "init_vendasta_multi_location_analytics", "init_esm", "init_operators", "init_mobile", "init_sidepanel_service", "init_brand_filter_container_service", "init_brand_geography_dialog_component", "init_brand_group_dialog_component", "init_brand_location_dialog_component", "init_brand_source_dialog_component", "init_brand_taxonomy_dialog_component", "constructor", "dialog", "accountGroupMetricService", "filterService", "timeRangeService", "brandsService", "sidepanelService", "brandFiltersService", "languageService", "addressService", "destroyRef", "filterItems", "filterSettings", "textColor", "backgroundColor", "selectedCountries", "selectedStateProvinces", "selectedCities", "selectedTaxonomies", "sidenavOpened$", "visible$", "displaySourceFilter", "input", "ngOnInit", "openDialog$", "pipe", "takeUntilDestroyed", "subscribe", "next", "openLocationDialog", "addOrUpdateFilterItem", "locationFilterDisplay$", "selectedAccountGroupIds$", "calculateFilters", "sourceFilterDisplay$", "geographicBreakdown$", "getGeographicBreakdown$", "combineLatest", "currentLocale$", "switchMap", "currentLocale", "geographicBreakdown", "countryCodes", "reduce", "codes", "location", "countryCode", "indexOf", "push", "map", "code", "getCountryConfiguration", "countryConfigs", "options", "country", "withLatestFrom", "countryOptions", "clearAvailableLocations", "forEach", "state", "availableLocations", "id", "name", "parent", "locationCount", "numLocations", "city", "zones", "find", "zone", "stateCode", "sort", "sortName", "filterBarOffset$", "mode$", "size$", "observeOn", "asyncScheduler", "mode", "size", "visible", "Mode", "SIDE", "isMobile", "Size", "SMALL", "SizePixels", "REGULAR", "LARGE", "dateText$", "dateFilterDisplay$", "dateRange$", "type", "start", "end", "locale", "toLocaleDateString", "filterQuantity$", "filtersQuantity$", "groupFilter$", "subgroup$", "r", "locationFilter$", "length", "filteredSources$", "geographyFilter$", "concat", "busCategoryFilter$", "COUNTRIES_LABEL", "STATEPROV_LABEL", "CITIES_LABEL", "a", "b", "localeCompare", "filterId", "filterTypeTranslateKey", "value", "value$", "foundFilter", "filter", "item", "displayName", "findIndex", "el", "displayName$", "removeFilterItem", "clearAccountGroupIds", "clearSourceIds", "clearPath", "selectedGroup", "setSubgroup", "selectFilterItem", "openGeographyDialog", "openGroupDialog", "openTaxonomyDialog", "calculateGeographyFilter", "displayValue", "calculateGroupFilter", "calculateTaxonomyFilter", "taxOpt", "split", "pop", "join", "calculatePartnerColor", "theme", "primaryColor", "selectedColor", "open", "BrandGeographyDialogComponent", "data", "afterClosed", "results", "BrandGroupDialogComponent", "group", "pathNodes", "setPath", "BrandTaxonomyDialogComponent", "BrandLocationDialogComponent", "panelClass", "setAccountGroupIds", "selectedAccountGroupIds", "BrandSourceDialogComponent", "selectedSourceIds", "getSourceIds", "setSourceIds", "calculateGeographyFilters", "filterObject", "Filter", "compositeFilter", "op", "CompositeFilterOperator", "OR", "filters", "dimension", "fieldFilter", "operator", "FieldFilterOperator", "EQUAL", "valueType", "PropertyType", "PROPERTY_TYPE_STRING", "calculateTaxonomyFilters", "OVERLAP", "calculateLocationFilters", "getAccountGroupIds", "operatorFunction", "FieldFilterOperatorFunction", "ANY", "geoFilter", "taxonomyFilter", "locationFilter", "setFilters", "x", "\u0275\u0275directiveInject", "MatDialog", "AccountGroupMetricService", "FilterService", "TimeRangeService", "BrandsService", "SidepanelService", "BrandFilterContainerService", "LanguageService", "AddressAPIService", "DestroyRef", "selectors", "inputs", "standalone", "decls", "vars", "consts", "template", "rf", "ctx", "i0", "_r1", "BrandFilterContainerComponent_Conditional_18_Template", "BrandFilterContainerComponent_Conditional_24_Template", "BrandFilterContainerComponent_Conditional_30_Template", "BrandFilterContainerComponent_Conditional_36_Template", "BrandFilterContainerComponent_Conditional_38_Template", "BrandFilterContainerComponent_Conditional_39_Template", "\u0275\u0275property", "\u0275\u0275pureFunction2", "_c0", "shouldHaveShadow$", "\u0275\u0275pureFunction1", "_c1", "filterSelection_r5"] }