ng2-charts
Version:
Reactive, responsive, beautiful charts for Angular based on Chart.js
1 lines • 17.3 kB
Source Map (JSON)
{"version":3,"file":"ng2-charts.mjs","sources":["../../../../libs/ng2-charts/src/lib/ng-charts.provider.ts","../../../../libs/ng2-charts/src/lib/theme.service.ts","../../../../libs/ng2-charts/src/lib/base-chart.directive.ts","../../../../libs/ng2-charts/src/lib/utils.ts","../../../../libs/ng2-charts/src/index.ts","../../../../libs/ng2-charts/src/ng2-charts.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport {\n ChartComponentLike,\n Defaults,\n registerables as defaultRegisterables,\n} from 'chart.js';\nimport { DeepPartial } from './utils';\nimport { merge } from 'es-toolkit';\n\nexport const NG_CHARTS_CONFIGURATION =\n new InjectionToken<NgChartsConfiguration>('Configuration for ngCharts');\n\nexport type NgChartsConfiguration = {\n /**\n * Any registerable that can be used with `Chart.register()`, such as plugins, controllers, scales, and elements.\n */\n registerables?: readonly ChartComponentLike[];\n\n /**\n * Default configuration that can be used with `defaults.set()`.\n */\n defaults?: DeepPartial<Defaults>;\n};\n\n/**\n * Provide all the default registerable as defined by Chart.js\n */\nexport function withDefaultRegisterables(\n ...registerables: ChartComponentLike[]\n): NgChartsConfiguration {\n return { registerables: [...defaultRegisterables, ...registerables] };\n}\n\n/**\n * Provide configuration for ngCharts. In most cases, you have to pass it some registerables. So either\n * `withDefaultRegisterables()`, or a custom list of registerables tailored to your needs to reduce bundle size.\n */\nexport function provideCharts(\n ...configurations: readonly NgChartsConfiguration[]\n) {\n const config: NgChartsConfiguration = configurations.reduce(merge, {});\n return { provide: NG_CHARTS_CONFIGURATION, useValue: config };\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { ChartConfiguration, ChartOptions } from 'chart.js';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeService {\n private pColorschemesOptions?: ChartOptions;\n public colorschemesOptions: BehaviorSubject<ChartOptions | undefined> =\n new BehaviorSubject<ChartOptions | undefined>(undefined);\n\n setColorschemesOptions(options: ChartConfiguration['options']): void {\n this.pColorschemesOptions = options;\n this.colorschemesOptions.next(options);\n }\n\n getColorschemesOptions(): ChartConfiguration['options'] {\n return this.pColorschemesOptions;\n }\n}\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n inject,\n PLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Chart,\n ChartConfiguration,\n ChartEvent,\n ChartType,\n DefaultDataPoint,\n defaults,\n Plugin,\n UpdateMode,\n} from 'chart.js';\nimport { ThemeService } from './theme.service';\nimport { Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { merge } from 'es-toolkit';\nimport {\n NG_CHARTS_CONFIGURATION,\n NgChartsConfiguration,\n} from './ng-charts.provider';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: 'canvas[baseChart]',\n exportAs: 'base-chart',\n standalone: true,\n})\nexport class BaseChartDirective<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint<TType>,\n TLabel = unknown,\n>\n implements OnDestroy, OnChanges\n{\n @Input() public type: ChartConfiguration<TType, TData, TLabel>['type'] =\n 'bar' as TType;\n @Input() public legend?: boolean;\n @Input() public data?: ChartConfiguration<TType, TData, TLabel>['data'];\n @Input() public options: ChartConfiguration<TType, TData, TLabel>['options'];\n @Input() public plugins: Plugin<TType>[] = [];\n\n @Input() public labels?: ChartConfiguration<\n TType,\n TData,\n TLabel\n >['data']['labels'];\n @Input() public datasets?: ChartConfiguration<\n TType,\n TData,\n TLabel\n >['data']['datasets'];\n\n @Output() public chartClick: EventEmitter<{\n event?: ChartEvent;\n active?: object[];\n }> = new EventEmitter();\n @Output() public chartHover: EventEmitter<{\n event: ChartEvent;\n active: object[];\n }> = new EventEmitter();\n\n public ctx: CanvasRenderingContext2D | null = null;\n public chart?: Chart<TType, TData, TLabel>;\n\n private subs: Subscription[] = [];\n private themeOverrides: ChartConfiguration['options'] = {};\n private element = inject(ElementRef);\n private zone = inject(NgZone);\n private themeService = inject(ThemeService);\n private config = inject(NG_CHARTS_CONFIGURATION, { optional: true }) as\n | NgChartsConfiguration\n | undefined;\n private platformId = inject(PLATFORM_ID);\n private isBrowser = isPlatformBrowser(this.platformId);\n\n public constructor() {\n if (this.config?.registerables) {\n Chart.register(...this.config.registerables);\n }\n\n if (this.config?.defaults) {\n defaults.set(this.config.defaults);\n }\n\n // Only get canvas context in browser environment\n if (this.isBrowser) {\n this.ctx = this.element.nativeElement.getContext('2d');\n }\n\n this.subs.push(\n this.themeService.colorschemesOptions\n .pipe(distinctUntilChanged())\n .subscribe((r) => this.themeChanged(r)),\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.isBrowser) {\n return; // Skip chart operations in SSR\n }\n\n const requireRender = ['type'];\n const propertyNames = Object.getOwnPropertyNames(changes);\n\n if (\n propertyNames.some((key) => requireRender.includes(key)) ||\n propertyNames.every((key) => changes[key].isFirstChange())\n ) {\n this.render();\n } else {\n // For legend changes, we need to update the chart options and re-render\n if (this.chart && changes['legend']) {\n const config = this.getChartConfiguration();\n if (config.options) {\n this.chart.options = config.options;\n }\n this.update();\n } else if (this.chart) {\n const config = this.getChartConfiguration();\n\n // Using assign to avoid changing the original object reference\n if (config.data && this.chart.config.data) {\n Object.assign(this.chart.config.data, config.data);\n }\n if (config.plugins && this.chart.config.plugins) {\n Object.assign(this.chart.config.plugins, config.plugins);\n }\n if (config.options && this.chart.config.options) {\n Object.assign(this.chart.config.options, config.options);\n }\n\n this.update();\n }\n }\n }\n\n public ngOnDestroy(): void {\n if (this.chart) {\n this.chart.destroy();\n this.chart = void 0;\n }\n this.subs.forEach((s) => s.unsubscribe());\n }\n\n public render(): Chart<TType, TData, TLabel> | undefined {\n if (!this.isBrowser || !this.ctx) {\n return undefined;\n }\n\n if (this.chart) {\n this.chart.destroy();\n }\n\n return this.zone.runOutsideAngular(\n () =>\n (this.chart = new Chart(\n this.ctx as CanvasRenderingContext2D,\n this.getChartConfiguration(),\n )),\n );\n }\n\n public update(mode?: UpdateMode): void {\n if (this.chart && this.isBrowser) {\n this.zone.runOutsideAngular(() => this.chart?.update(mode));\n }\n }\n\n public hideDataset(index: number, hidden: boolean): void {\n if (this.chart && this.isBrowser) {\n this.chart.getDatasetMeta(index).hidden = hidden;\n this.update();\n }\n }\n\n public isDatasetHidden(index: number): boolean | undefined {\n return this.chart?.getDatasetMeta(index)?.hidden;\n }\n\n public toBase64Image(): string | undefined {\n return this.chart?.toBase64Image();\n }\n\n private themeChanged(options: ChartConfiguration['options']): void {\n this.themeOverrides = options;\n if (this.chart) {\n if (this.chart.config.options) {\n Object.assign(this.chart.config.options, this.getChartOptions());\n }\n\n this.update();\n }\n }\n\n private getChartOptions(): ChartConfiguration<\n TType,\n TData,\n TLabel\n >['options'] {\n return [\n {\n onHover: (event: ChartEvent, active: object[]) => {\n if (!this.chartHover.observed && !this.chartHover.observers?.length) {\n return;\n }\n\n this.zone.run(() => this.chartHover.emit({ event, active }));\n },\n onClick: (event?: ChartEvent, active?: object[]) => {\n if (!this.chartClick.observed && !this.chartClick.observers?.length) {\n return;\n }\n\n this.zone.run(() => this.chartClick.emit({ event, active }));\n },\n },\n this.themeOverrides ?? {},\n this.options ?? {},\n {\n plugins: {\n legend: {\n display: this.legend,\n },\n },\n },\n ].reduce(merge, {}) as ChartConfiguration<TType, TData, TLabel>['options'];\n }\n\n private getChartConfiguration(): ChartConfiguration<TType, TData, TLabel> {\n return {\n type: this.type,\n data: this.getChartData(),\n options: this.getChartOptions(),\n plugins: this.plugins,\n };\n }\n\n private getChartData(): ChartConfiguration<TType, TData, TLabel>['data'] {\n return this.data\n ? this.data\n : {\n labels: this.labels || [],\n datasets: this.datasets || [],\n };\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\n// DeepPartial implementation taken from the utility-types NPM package, which is\n// Copyright (c) 2016 Piotr Witek <piotrek.witek@gmail.com> (http://piotrwitek.github.io)\n// and used under the terms of the MIT license\nexport type DeepPartial<T> = T extends Function\n ? T\n : T extends Array<infer U>\n ? _DeepPartialArray<U>\n : T extends object\n ? _DeepPartialObject<T>\n : T | undefined;\n\ntype _DeepPartialArray<T> = Array<DeepPartial<T>>;\ntype _DeepPartialObject<T> = { [P in keyof T]?: DeepPartial<T[P]> };\n","/*\n * Public API Surface of ng2-charts\n */\n\nexport * from './lib/ng-charts.provider';\nexport * from './lib/base-chart.directive';\nexport * from './lib/theme.service';\nexport * from './lib/utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["registerables","defaultRegisterables"],"mappings":";;;;;;;;MASa,uBAAuB,GAClC,IAAI,cAAc,CAAwB,4BAA4B;AAcxE;;AAEG;AACG,SAAU,wBAAwB,CACtC,GAAGA,eAAmC,EAAA;IAEtC,OAAO,EAAE,aAAa,EAAE,CAAC,GAAGC,aAAoB,EAAE,GAAGD,eAAa,CAAC,EAAE;AACvE;AAEA;;;AAGG;AACG,SAAU,aAAa,CAC3B,GAAG,cAAgD,EAAA;IAEnD,MAAM,MAAM,GAA0B,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;IACtE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC/D;;MCnCa,YAAY,CAAA;AAHzB,IAAA,WAAA,GAAA;AAKS,QAAA,IAAA,CAAA,mBAAmB,GACxB,IAAI,eAAe,CAA2B,SAAS,CAAC;AAU3D,IAAA;AARC,IAAA,sBAAsB,CAAC,OAAsC,EAAA;AAC3D,QAAA,IAAI,CAAC,oBAAoB,GAAG,OAAO;AACnC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;IACxC;IAEA,sBAAsB,GAAA;QACpB,OAAO,IAAI,CAAC,oBAAoB;IAClC;8GAZW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA,CAAA;;2FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCiCY,kBAAkB,CAAA;AAgD7B,IAAA,WAAA,GAAA;QAzCgB,IAAA,CAAA,IAAI,GAClB,KAAc;QAIA,IAAA,CAAA,OAAO,GAAoB,EAAE;AAa5B,QAAA,IAAA,CAAA,UAAU,GAGtB,IAAI,YAAY,EAAE;AACN,QAAA,IAAA,CAAA,UAAU,GAGtB,IAAI,YAAY,EAAE;QAEhB,IAAA,CAAA,GAAG,GAAoC,IAAI;QAG1C,IAAA,CAAA,IAAI,GAAmB,EAAE;QACzB,IAAA,CAAA,cAAc,GAAkC,EAAE;AAClD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAEtD;AACL,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,QAAA,IAAA,CAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AAGpD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE;YAC9B,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QAC9C;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;YACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACpC;;AAGA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;QACxD;QAEA,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,IAAI,CAAC,YAAY,CAAC;aACf,IAAI,CAAC,oBAAoB,EAAE;AAC3B,aAAA,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAC1C;IACH;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO;QACT;AAEA,QAAA,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC;QAC9B,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAEzD,QAAA,IACE,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACxD,YAAA,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,EAC1D;YACA,IAAI,CAAC,MAAM,EAAE;QACf;aAAO;;YAEL,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;AACnC,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAC3C,gBAAA,IAAI,MAAM,CAAC,OAAO,EAAE;oBAClB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;gBACrC;gBACA,IAAI,CAAC,MAAM,EAAE;YACf;AAAO,iBAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACrB,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE;;AAG3C,gBAAA,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;AACzC,oBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;gBACpD;AACA,gBAAA,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;AAC/C,oBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;gBAC1D;AACA,gBAAA,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;AAC/C,oBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;gBAC1D;gBAEA,IAAI,CAAC,MAAM,EAAE;YACf;QACF;IACF;IAEO,WAAW,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACpB,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C;IAEO,MAAM,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AAChC,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACtB;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAChC,OACG,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CACrB,IAAI,CAAC,GAA+B,EACpC,IAAI,CAAC,qBAAqB,EAAE,CAC7B,CAAC,CACL;IACH;AAEO,IAAA,MAAM,CAAC,IAAiB,EAAA;QAC7B,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D;IACF;IAEO,WAAW,CAAC,KAAa,EAAE,MAAe,EAAA;QAC/C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE;YAChC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM;YAChD,IAAI,CAAC,MAAM,EAAE;QACf;IACF;AAEO,IAAA,eAAe,CAAC,KAAa,EAAA;QAClC,OAAO,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM;IAClD;IAEO,aAAa,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE;IACpC;AAEQ,IAAA,YAAY,CAAC,OAAsC,EAAA;AACzD,QAAA,IAAI,CAAC,cAAc,GAAG,OAAO;AAC7B,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;AAC7B,gBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;YAClE;YAEA,IAAI,CAAC,MAAM,EAAE;QACf;IACF;IAEQ,eAAe,GAAA;QAKrB,OAAO;AACL,YAAA;AACE,gBAAA,OAAO,EAAE,CAAC,KAAiB,EAAE,MAAgB,KAAI;AAC/C,oBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE;wBACnE;oBACF;oBAEA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9D,CAAC;AACD,gBAAA,OAAO,EAAE,CAAC,KAAkB,EAAE,MAAiB,KAAI;AACjD,oBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE;wBACnE;oBACF;oBAEA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9D,CAAC;AACF,aAAA;YACD,IAAI,CAAC,cAAc,IAAI,EAAE;YACzB,IAAI,CAAC,OAAO,IAAI,EAAE;AAClB,YAAA;AACE,gBAAA,OAAO,EAAE;AACP,oBAAA,MAAM,EAAE;wBACN,OAAO,EAAE,IAAI,CAAC,MAAM;AACrB,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAwD;IAC5E;IAEQ,qBAAqB,GAAA;QAC3B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE;AACzB,YAAA,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB;IACH;IAEQ,YAAY,GAAA;QAClB,OAAO,IAAI,CAAC;cACR,IAAI,CAAC;AACP,cAAE;AACE,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;AACzB,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;aAC9B;IACP;8GAzNW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;AAET,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAQE;;sBAEA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBAKA;;sBAMA;;sBAIA;;;ACpEH;;ACAA;;AAEG;;ACFH;;AAEG;;;;"}