@acorex/charts 21.0.1-next.5 → 21.0.1-next.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-line-chart.mjs","sources":["../tmp-esm2022/line-chart/lib/line-chart.config.js","../tmp-esm2022/line-chart/lib/line-chart.component.js","../tmp-esm2022/line-chart/acorex-charts-line-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXLineChartDefaultConfig = {\n margins: {\n top: 20,\n right: 25,\n bottom: 40,\n left: 50,\n },\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showVerticalGrid: false,\n yAxisStartsAtZero: true,\n axisPadding: 5,\n showTooltip: true,\n lineWidth: 2,\n showPoints: true,\n pointRadius: 4,\n smoothLine: false,\n fillArea: false,\n fillOpacity: 20,\n showCrosshair: false,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_LINE_CHART_CONFIG = new InjectionToken('AX_LINE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXLineChartDefaultConfig,\n});\nexport function lineChartConfig(config = {}) {\n const result = {\n ...AXLineChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jaGFydC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvbGluZS1jaGFydC9zcmMvbGliL2xpbmUtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXNCO0lBQ3pELE9BQU8sRUFBRTtRQUNQLEdBQUcsRUFBRSxFQUFFO1FBQ1AsS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxFQUFFO0tBQ1Q7SUFDRCxTQUFTLEVBQUUsSUFBSTtJQUNmLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsV0FBVyxFQUFFLENBQUM7SUFDZCxXQUFXLEVBQUUsSUFBSTtJQUNqQixTQUFTLEVBQUUsQ0FBQztJQUNaLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxDQUFDO0lBQ2QsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLEtBQUs7SUFDZixXQUFXLEVBQUUsRUFBRTtJQUNmLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFNBQVMsRUFBRSx1QkFBdUI7UUFDbEMsYUFBYSxFQUFFLGdEQUFnRDtRQUMvRCxVQUFVLEVBQUUsd0JBQXdCO1FBQ3BDLGFBQWEsRUFBRSx1QkFBdUI7S0FDdkM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQW9CLHNCQUFzQixFQUFFO0lBQ2hHLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx3QkFBd0I7Q0FDeEMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGVBQWUsQ0FBQyxTQUFpQyxFQUFFO0lBQ2pFLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx3QkFBd0I7UUFDM0IsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhMaW5lQ2hhcnRPcHRpb24gfSBmcm9tICcuL2xpbmUtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWExpbmVDaGFydERlZmF1bHRDb25maWc6IEFYTGluZUNoYXJ0T3B0aW9uID0ge1xuICBtYXJnaW5zOiB7XG4gICAgdG9wOiAyMCxcbiAgICByaWdodDogMjUsXG4gICAgYm90dG9tOiA0MCxcbiAgICBsZWZ0OiA1MCxcbiAgfSxcbiAgc2hvd1hBeGlzOiB0cnVlLFxuICBzaG93WUF4aXM6IHRydWUsXG4gIHNob3dHcmlkOiB0cnVlLFxuICBzaG93VmVydGljYWxHcmlkOiBmYWxzZSxcbiAgeUF4aXNTdGFydHNBdFplcm86IHRydWUsXG4gIGF4aXNQYWRkaW5nOiA1LFxuICBzaG93VG9vbHRpcDogdHJ1ZSxcbiAgbGluZVdpZHRoOiAyLFxuICBzaG93UG9pbnRzOiB0cnVlLFxuICBwb2ludFJhZGl1czogNCxcbiAgc21vb3RoTGluZTogZmFsc2UsXG4gIGZpbGxBcmVhOiBmYWxzZSxcbiAgZmlsbE9wYWNpdHk6IDIwLFxuICBzaG93Q3Jvc3NoYWlyOiBmYWxzZSxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDEwMDAsXG4gIGFuaW1hdGlvbkVhc2luZzogJ2N1YmljLW91dCcsXG4gIG1lc3NhZ2VzOiB7XG4gICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgIG5vRGF0YUhlbHA6ICdQbGVhc2UgcHJvdmlkZSBkYXRhIHRvIGRpc3BsYXkgdGhlIGNoYXJ0JyxcbiAgICBhbGxIaWRkZW46ICdBbGwgc2VyaWVzIGFyZSBoaWRkZW4nLFxuICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBsZWdlbmQgaXRlbXMgdG8gc2hvdyBzZXJpZXMgaW4gdGhlIGNoYXJ0JyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtY2hhcnQtbGluZScsXG4gICAgYWxsSGlkZGVuSWNvbjogJ2ZhLWxpZ2h0IGZhLWV5ZS1zbGFzaCcsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgQVhfTElORV9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhMaW5lQ2hhcnRPcHRpb24+KCdBWF9MSU5FX0NIQVJUX0NPTkZJRycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBBWExpbmVDaGFydERlZmF1bHRDb25maWcsXG59KTtcblxuZXhwb3J0IHR5cGUgUGFydGlhbExpbmVDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhMaW5lQ2hhcnRPcHRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZUNoYXJ0Q29uZmlnKGNvbmZpZzogUGFydGlhbExpbmVDaGFydENvbmZpZyA9IHt9KTogQVhMaW5lQ2hhcnRPcHRpb24ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgLi4uQVhMaW5lQ2hhcnREZWZhdWx0Q29uZmlnLFxuICAgIC4uLmNvbmZpZyxcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","import { AX_CHART_COLOR_PALETTE, AXChartComponent, computeTooltipPosition, formatLargeNumber, getChartColor, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_LINE_CHART_CONFIG } from './line-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Line Chart Component for rendering data as lines with interactive hover effects and animations\n */\nexport class AXLineChartComponent extends AXChartComponent {\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n pointClick = output();\n chartContainerEl = viewChild.required('chartContainer');\n d3;\n svg;\n chart;\n xScale;\n yScale;\n xAxis;\n yAxis;\n width;\n height;\n margin = { top: 20, right: 25, bottom: 40, left: 50 };\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n hiddenSeries = new Set();\n _fullNormalizedData = [];\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_LINE_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Messages with defaults\n effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Layout & Dimensions\n MIN_DIMENSION = 100;\n MIN_CONTAINER_DIMENSION = 200;\n DEFAULT_MARGIN_TOP = 20;\n DEFAULT_MARGIN_RIGHT = 25;\n DEFAULT_MARGIN_BOTTOM = 40;\n DEFAULT_MARGIN_LEFT = 50;\n MIN_MARGIN_BOTTOM = 45;\n MIN_MARGIN_LEFT = 55;\n MAX_EXTRA_MARGIN = 60;\n // Styling & Visual\n DEFAULT_LINE_WIDTH = 2;\n DEFAULT_POINT_RADIUS = 4;\n DEFAULT_FILL_OPACITY = 20;\n LINE_HIGHLIGHT_MULTIPLIER = 1.5;\n POINT_HIGHLIGHT_MULTIPLIER = 1.5;\n POINT_STROKE_WIDTH = 1;\n POINT_HOVER_STROKE_WIDTH = 2;\n GRID_DASH_ARRAY = '2,2';\n CROSSHAIR_DASH_ARRAY = '3,3';\n CROSSHAIR_OPACITY = 0.7;\n // Animation\n HOVER_TRANSITION_DURATION = 150;\n ANIMATION_END_BUFFER = 100;\n POINT_ANIMATION_DELAY_MS = 50;\n POINT_ANIMATION_DELAY_RATIO = 0.5;\n POINT_ANIMATION_DURATION_RATIO = 0.3;\n // Text & Labels\n AXIS_LABEL_FONT_SIZE = 14;\n CHAR_WIDTH_RATIO = 0.6;\n FONT_WIDTH_MULTIPLIER = 0.6;\n MAX_LABEL_LENGTH = 20;\n MIN_FONT_SIZE_X = 11;\n MAX_FONT_SIZE_X = 15;\n MIN_FONT_SIZE_Y = 11;\n MAX_FONT_SIZE_Y = 15;\n FONT_PADDING = 10;\n Y_AXIS_PADDING = 10;\n // Data & Performance\n MAX_POINTS_TO_RENDER = 100;\n POINT_COORDINATE_PRECISION = 10;\n MANY_ITEMS_THRESHOLD = 20;\n VERY_MANY_ITEMS_THRESHOLD = 50;\n // Tooltip\n TOOLTIP_GAP = 10;\n /**\n * Normalizes input data to consistent array format with originalIndex\n */\n normalizeData(rawData) {\n if (Array.isArray(rawData)) {\n return rawData.map((s, i) => ({ ...s, originalIndex: i }));\n }\n if (rawData && 'data' in rawData) {\n return [{ ...rawData, originalIndex: 0 }];\n }\n return [];\n }\n /**\n * Gets unique identifier for a series\n */\n getSeriesIdentifier(series) {\n return series.id || series.label || `series-${series.originalIndex}`;\n }\n /**\n * Calculates dynamic font size based on available space\n */\n calculateDynamicFontSize(dimension, divisor, min, max) {\n return Math.max(min, Math.min(max, Math.round(dimension / divisor)));\n }\n /**\n * Creates a unique key for point coordinates (for overlap detection)\n */\n createPointKey(x, y) {\n const precision = this.POINT_COORDINATE_PRECISION;\n return `${Math.round(x * precision) / precision},${Math.round(y * precision) / precision}`;\n }\n /**\n * Removes series elements from the chart\n */\n removeSeriesElements(seriesIdentifier) {\n this.chart.selectAll(`.ax-line-chart-series[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n this.chart.selectAll(`.ax-line-chart-points[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n }\n /**\n * Truncates long labels with ellipsis\n */\n truncateLabel(label, maxLength = this.MAX_LABEL_LENGTH) {\n if (label.length <= maxLength)\n return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n /**\n * Calculates maximum width needed for Y-axis tick labels\n */\n calculateMaxYAxisTickLabelWidth() {\n const allSeriesData = this._fullNormalizedData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)));\n let maxValue = 0;\n let minValue = 0;\n for (const series of allSeriesData) {\n if (series.data && series.data.length > 0) {\n for (const point of series.data) {\n if (typeof point.y === 'number') {\n maxValue = Math.max(maxValue, point.y);\n minValue = Math.min(minValue, point.y);\n }\n }\n }\n }\n // Check both max and min (for negative values)\n const maxAbsValue = Math.max(Math.abs(maxValue), Math.abs(minValue));\n const tickLabelText = Number.isFinite(maxAbsValue) ? formatLargeNumber(maxAbsValue) : '00000';\n return tickLabelText.length * this.AXIS_LABEL_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n ngOnInit() {\n this.loadD3();\n }\n #effect = effect(() => {\n this._fullNormalizedData = this.normalizeData(this.data());\n this.effectiveOptions();\n if (this._rendered()) {\n this.updateChart();\n }\n }, ...(ngDevMode ? [{ debugName: \"#effect\" }] : []));\n ngAfterViewInit() {\n this._initialized.set(true);\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n // AXChartLegendCompatible Implementation\n getLegendItems() {\n const totalSum = this._fullNormalizedData.reduce((sum, series) => {\n return sum + series.data.reduce((sSum, p) => sSum + p.y, 0);\n }, 0);\n return this._fullNormalizedData.map((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n const seriesSum = series.data.reduce((sum, p) => sum + p.y, 0);\n const percentage = totalSum > 0 ? (seriesSum / totalSum) * 100 : 0;\n return {\n id: seriesIdentifier,\n name: series.label || `Series ${series.originalIndex + 1}`,\n value: seriesSum,\n color: series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n hidden: this.hiddenSeries.has(seriesIdentifier),\n percentage: parseFloat(percentage.toFixed(2)),\n };\n });\n }\n highlightSegment(id) {\n if (!this.svg)\n return;\n const allSeriesGroups = this.svg.selectAll('g.ax-line-chart-series');\n const allPointsGroups = this.svg.selectAll('g.ax-line-chart-points');\n if (id === null) {\n allSeriesGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allPointsGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allSeriesGroups\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .classed('ax-chart-highlighted-path', false);\n allPointsGroups\n .selectAll('circle.ax-line-chart-point')\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .classed('ax-chart-highlighted-point', false);\n return;\n }\n allSeriesGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n allPointsGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n const targetSeriesGroup = this.svg.selectAll(`g.ax-line-chart-series[data-series-identifier=\"${id}\"]`);\n const targetPointsGroup = this.svg.selectAll(`g.ax-line-chart-points[data-series-identifier=\"${id}\"]`);\n targetSeriesGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetPointsGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetSeriesGroup\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER)\n .classed('ax-chart-highlighted-path', true);\n targetPointsGroup\n .selectAll('circle.ax-line-chart-point')\n .attr('r', (this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS) * this.POINT_HIGHLIGHT_MULTIPLIER)\n .classed('ax-chart-highlighted-path', true);\n }\n toggleSegment(id) {\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n }\n else {\n this.hiddenSeries.add(id);\n }\n this.updateChart();\n return !this.hiddenSeries.has(id);\n }\n async loadD3() {\n try {\n this.d3 = await import('d3');\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n const containerElement = this.chartContainerEl().nativeElement;\n const allSeriesData = this._fullNormalizedData;\n // Clear previous SVG and any empty-state messages (preserve tooltip component)\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n if (allSeriesData.length === 0 || allSeriesData.every((series) => !series.data || series.data.length === 0)) {\n this.showNoDataMessage(containerElement);\n return;\n }\n const visibleDataForRendering = allSeriesData.filter((series) => !this.hiddenSeries.has(this.getSeriesIdentifier(series)));\n if (visibleDataForRendering.length === 0) {\n // All data is present, but all series are hidden by the legend\n this.showAllSeriesHiddenMessage(containerElement);\n // Still setup basic SVG and chart group for consistency if needed, or return\n // For now, we will show the message and return, as scales/axes can't be drawn.\n return;\n }\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n // Use allSeriesData for domain calculation to keep scales consistent\n const dataForScaleSetup = allSeriesData.filter((s) => s.data && s.data.length > 0);\n if (dataForScaleSetup.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n this.setupScales(dataForScaleSetup);\n this.createAxes(chartOptions);\n this.renderLines(allSeriesData); // RenderLines will handle hiding based on hiddenSeries\n }\n updateChart() {\n this.createChart();\n }\n cleanupChart() {\n if (this.svg) {\n this.d3?.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.chart = null;\n }\n this._tooltipVisible.set(false);\n }\n setupDimensions(containerElement, options) {\n this.calculateMargins(options, containerElement.clientWidth);\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n const minDim = Math.min(this.MIN_CONTAINER_DIMENSION, containerWidth, containerHeight);\n if (options.width && options.height) {\n this.width = options.width - this.margin.left - this.margin.right;\n this.height = options.height - this.margin.top - this.margin.bottom;\n }\n else {\n this.width = Math.max(containerWidth, minDim) - this.margin.left - this.margin.right;\n this.height = Math.max(containerHeight, minDim) - this.margin.top - this.margin.bottom;\n }\n this.width = Math.max(this.width, this.MIN_DIMENSION);\n this.height = Math.max(this.height, this.MIN_DIMENSION);\n const totalWidth = this.width + this.margin.left + this.margin.right;\n const totalHeight = this.height + this.margin.top + this.margin.bottom;\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', totalWidth)\n .attr('height', totalHeight)\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('style', `\n width: ${totalWidth}px;\n height: ${totalHeight}px;\n max-width: 100%;\n max-height: 100%;\n overflow: visible;\n `);\n this.svg = svg;\n this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n calculateMargins(options, containerWidth) {\n this.margin = {\n top: options.margins?.top ?? this.DEFAULT_MARGIN_TOP,\n right: options.margins?.right ?? this.DEFAULT_MARGIN_RIGHT,\n bottom: options.margins?.bottom ?? this.DEFAULT_MARGIN_BOTTOM,\n left: options.margins?.left ?? this.DEFAULT_MARGIN_LEFT,\n };\n const allDataPoints = this._fullNormalizedData.flatMap((series) => series.data);\n if (allDataPoints.length > 0) {\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n if (!allNumericX) {\n const visibleSeries = this._fullNormalizedData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)));\n const allXValues = new Set(visibleSeries.flatMap((series) => series.data.map((d) => String(d.x))));\n const labelCount = allXValues.size;\n if (labelCount > 0 && containerWidth > 0) {\n const workingWidth = containerWidth - this.margin.left - this.margin.right;\n if (workingWidth > 0) {\n const availableWidthPerLabel = workingWidth / labelCount;\n const labels = Array.from(allXValues);\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedFontSize = this.calculateDynamicFontSize(workingWidth, 45, this.MIN_FONT_SIZE_X, this.MAX_FONT_SIZE_X);\n // Account for label truncation in width calculation\n const maxLabelLength = labelCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * estimatedFontSize * this.CHAR_WIDTH_RATIO;\n if (estimatedLongestLabelWidth > availableWidthPerLabel) {\n // Calculate diagonal height when rotated -45 degrees\n const diagonalHeight = estimatedLongestLabelWidth * Math.sin(Math.PI / 4);\n const requiredExtraMargin = diagonalHeight + 15; // Extra padding for safety\n this.margin.bottom += Math.min(this.MAX_EXTRA_MARGIN, requiredExtraMargin);\n }\n }\n }\n }\n }\n if (options.xAxisLabel) {\n const xLabelLength = options.xAxisLabel.length;\n const extraBottomMargin = Math.min(20, Math.max(10, xLabelLength * 0.8));\n this.margin.bottom = Math.max(this.margin.bottom, 40 + extraBottomMargin);\n }\n if (options.yAxisLabel) {\n // Calculate space needed for Y-axis: tick labels + padding + title\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const yAxisTitleThickness = 20; // Height of rotated title text\n const yAxisTitlePadding = this.Y_AXIS_PADDING;\n const totalYAxisWidth = maxTickLabelWidth + yAxisTitlePadding + yAxisTitleThickness;\n this.margin.left = Math.max(this.margin.left, totalYAxisWidth);\n }\n else if (options.showYAxis !== false) {\n // Just tick labels, no title\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n this.margin.left = Math.max(this.margin.left, maxTickLabelWidth + 10);\n }\n if (options.showXAxis !== false) {\n this.margin.bottom = Math.max(this.margin.bottom, this.MIN_MARGIN_BOTTOM);\n }\n if (options.showYAxis !== false) {\n this.margin.left = Math.max(this.margin.left, this.MIN_MARGIN_LEFT);\n }\n }\n setupScales(data) {\n // Expects already filtered data for scales\n const chartOptions = this.effectiveOptions();\n const padding = chartOptions.axisPadding ?? 0;\n const paddingMultiplier = padding / 100;\n // Ensure data is not empty for scale domain calculation\n const allDataPoints = data.length > 0 ? data.flatMap((series) => series.data) : [{ x: 0, y: 0 }];\n if (allDataPoints.length === 0) {\n // Should ideally not happen if createChart filters correctly\n allDataPoints.push({ x: 0, y: 0 }); // Default fallback to prevent crash with empty domain\n }\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n if (allNumericX) {\n const xMax = this.d3.max(allDataPoints, (d) => d.x) ?? 0;\n if (xMax === 0) {\n // If all values are 0, show -1 to 1 range\n this.xScale = this.d3\n .scaleLinear()\n .domain([-1, 1])\n .range([0, this.width]);\n }\n else {\n // Always start X axis from 0 for numeric data\n this.xScale = this.d3.scaleLinear().domain([0, xMax]).range([0, this.width]);\n }\n }\n else {\n this.xScale = this.d3\n .scaleBand()\n .domain(allDataPoints.map((d) => String(d.x)))\n .range([0, this.width])\n .paddingInner(0.2)\n .paddingOuter(0);\n }\n const yAxisStartsAtZero = chartOptions.yAxisStartsAtZero !== false;\n let yMin = this.d3.min(allDataPoints, (d) => d.y) ?? 0;\n if (yAxisStartsAtZero) {\n yMin = Math.min(0, yMin);\n }\n const yMax = this.d3.max(allDataPoints, (d) => d.y) ?? 0;\n const yRange = yMax - yMin;\n this.yScale = this.d3\n .scaleLinear()\n .domain([yMin, yMax + yRange * paddingMultiplier])\n .nice()\n .range([this.height, 0]);\n }\n createAxes(options) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isBandScale = this.xScale.bandwidth !== undefined;\n const isRtl = document.documentElement.dir === 'rtl' || document.body.dir === 'rtl';\n const axesGroup = this.chart.append('g').attr('class', 'ax-line-chart-axes');\n if (showXAxis) {\n let xAxisGenerator;\n let itemCount = 0;\n if (isBandScale) {\n // Band scale (categorical data)\n itemCount = this.xScale.domain().length;\n // Smart tick reduction for many items (like bar chart)\n let tickValues = this.xScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick for 50+ items\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick for 20-50 items\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n xAxisGenerator = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d) => {\n const label = String(d);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n }\n else {\n // Linear scale (numeric data)\n // Let D3 determine optimal tick count, but ensure we show reasonable number\n // Calculate optimal tick count based on width\n const optimalTickCount = Math.min(12, Math.max(5, Math.floor(this.width / 80)));\n xAxisGenerator = this.d3\n .axisBottom(this.xScale)\n .ticks(optimalTickCount)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d) => {\n // Format numbers nicely\n const num = Number(d);\n if (Number.isInteger(num)) {\n return String(num);\n }\n return num.toFixed(1);\n });\n itemCount = optimalTickCount;\n }\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-line-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(xAxisGenerator);\n // Style the x-axis path and lines\n this.xAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n this.xAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n const dynamicXAxisTickFontSize = this.calculateDynamicFontSize(this.width, 45, this.MIN_FONT_SIZE_X, this.MAX_FONT_SIZE_X);\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-line-chart-labels-color), 0.7)');\n // Automatically rotate labels if they are likely to overlap (only for band scale)\n let labelsAreRotated = false;\n if (isBandScale && this.xScale.bandwidth && this.xScale.domain().length > 0) {\n const step = this.xScale.step();\n const longestLabel = this.xScale.domain().reduce((a, b) => (a.length > b.length ? a : b), '');\n // Using char width ratio constant for better estimate\n const estimatedLongestLabelWidth = longestLabel.length * dynamicXAxisTickFontSize * this.CHAR_WIDTH_RATIO;\n if (estimatedLongestLabelWidth > step) {\n labelsAreRotated = true;\n xAxisTicks\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .attr('dx', '-0.8em')\n .attr('dy', '0.15em');\n }\n }\n // Only show X-axis title if labels are NOT rotated and item count is reasonable\n // This prevents overlap with rotated labels and improves readability\n const shouldShowXAxisTitle = options.xAxisLabel && !labelsAreRotated && itemCount <= this.MANY_ITEMS_THRESHOLD;\n if (shouldShowXAxisTitle) {\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('x', this.width / 2)\n .attr('y', this.height + this.margin.bottom - 5)\n .attr('direction', 'ltr')\n .attr('style', `\n font-size: 14px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `)\n .text(options.xAxisLabel);\n }\n }\n if (showYAxis) {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3\n .axisLeft(this.yScale)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((value) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n // Reduce tick count for better readability with large numbers\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for millions+\n }\n else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n this.yAxis = axesGroup.append('g').attr('class', 'ax-line-chart-axis-y').call(yAxisGenerator);\n // Style the y-axis path and lines\n this.yAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n this.yAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n const dynamicYAxisTickFontSize = this.calculateDynamicFontSize(this.height, 30, this.MIN_FONT_SIZE_Y, this.MAX_FONT_SIZE_Y);\n const yTickTexts = this.yAxis.selectAll('text').attr('style', `\n font-size: ${dynamicYAxisTickFontSize}px;\n font-weight: 400;\n fill: rgba(var(--ax-comp-line-chart-labels-color), 0.7);\n `);\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n }\n if (options.yAxisLabel) {\n // Calculate proper position for Y-axis title\n // Position it to the left of the tick labels with proper spacing\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n // Position title to the left of the tick labels\n const labelY = -maxTickLabelWidth - padding;\n // Center the title vertically\n const labelX = -this.height / 2;\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .attr('style', `\n font-size: 14px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `)\n .text(options.yAxisLabel);\n }\n }\n if (showGrid) {\n const gridGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-grid-container')\n .attr('pointer-events', 'none');\n const yGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid')\n .call(this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => '')\n .tickValues(this.yScale.ticks()));\n // Style the grid path and lines\n yGrid.selectAll('path').attr('stroke-width', '0');\n yGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n if (options.showVerticalGrid) {\n const xGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid-vertical')\n .attr('transform', `translate(0,${this.height})`)\n .call(this.d3\n .axisBottom(this.xScale)\n .tickSize(-this.height)\n .tickFormat(() => '')\n .tickValues(isBandScale ? undefined : this.xScale.ticks()));\n // Style the vertical grid path and lines\n xGrid.selectAll('path').attr('stroke-width', '0');\n xGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.15)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n }\n }\n }\n renderLines(allSeriesData) {\n const isBandScale = this.xScale.bandwidth !== undefined;\n const getX = (d) => {\n if (isBandScale) {\n return this.xScale(String(d.x)) + this.xScale.bandwidth() / 2;\n }\n else {\n return this.xScale(d.x);\n }\n };\n const lineGenerator = this.d3\n .line()\n .x(getX)\n .y((d) => this.yScale(d.y));\n if (this.effectiveOptions().smoothLine !== false) {\n lineGenerator.curve(this.d3.curveMonotoneX);\n }\n const areaGenerator = this.d3\n .area()\n .x(getX)\n .y0(this.height)\n .y1((d) => this.yScale(d.y));\n if (this.effectiveOptions().smoothLine !== false) {\n areaGenerator.curve(this.d3.curveMonotoneX);\n }\n this.svg.attr('class', 'ax-line-chart-animating');\n const allSeriesGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-series')\n .attr('pointer-events', 'none');\n const allPointsGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-points')\n .attr('pointer-events', 'none');\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier)) {\n this.removeSeriesElements(seriesIdentifier);\n return;\n }\n if (!series.data || series.data.length === 0)\n return;\n const seriesGroup = allSeriesGroup\n .append('g')\n .attr('class', `ax-line-chart-series ax-line-chart-series-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const fillColor = series.fillColor || lineColor;\n const line = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-line')\n .attr('stroke', lineColor)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .attr('stroke-linejoin', 'round')\n .attr('stroke-linecap', 'round')\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('style', 'transition: stroke-width 0.3s ease;')\n .attr('pointer-events', 'none');\n line\n .on('mouseenter', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER);\n })\n .on('mouseleave', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n });\n const totalLength = line.node().getTotalLength();\n line\n .attr('stroke-dasharray', totalLength + ' ' + totalLength)\n .attr('stroke-dashoffset', totalLength)\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('stroke-dashoffset', 0)\n .on('end', function () {\n line.attr('pointer-events', 'all');\n });\n if (this.effectiveOptions().fillArea) {\n const area = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-area')\n .attr('fill', fillColor)\n .attr('opacity', 0)\n .attr('d', areaGenerator)\n .attr('style', 'transition: opacity 0.3s ease;')\n .attr('pointer-events', 'none');\n area\n .on('mouseenter', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', ((this.effectiveOptions().fillOpacity ?? 20) / 100) * 1.5);\n })\n .on('mouseleave', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100);\n });\n area\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100)\n .on('end', function () {\n area.attr('pointer-events', 'all');\n });\n }\n });\n if (this.effectiveOptions().showPoints !== false) {\n const pointMap = new Map();\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n pointData.forEach((point) => {\n const x = getX(point);\n const y = this.yScale(point.y);\n const key = this.createPointKey(x, y);\n if (!pointMap.has(key)) {\n pointMap.set(key, []);\n }\n pointMap.get(key)?.push({ point, series, originalIndex: series.originalIndex });\n });\n });\n let animationCounter = 0;\n const totalVisibleSeriesCount = allSeriesData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)) && s.data && s.data.length > 0).length;\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const pointsGroup = allPointsGroup\n .append('g')\n .attr('class', `ax-line-chart-points ax-line-chart-points-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n pointsGroup\n .on('mouseenter', () => this.handlePointGroupEnter(series.originalIndex))\n .on('mouseleave', () => this.handlePointGroupLeave());\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n pointsGroup\n .selectAll('circle')\n .data(pointData)\n .enter()\n .append('circle')\n .attr('class', 'ax-line-chart-point')\n .attr('cx', getX)\n .attr('cy', (d) => this.yScale(d.y))\n .attr('r', 0)\n .attr('fill', lineColor)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1)\n .attr('data-x', (d) => d.x)\n .attr('data-y', (d) => d.y)\n .style('cursor', 'pointer')\n .attr('pointer-events', 'none')\n .on('mouseenter', (event, d) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n if (overlappingPoints.length > 1) {\n this.handleOverlappingPointsHover(event, overlappingPoints);\n }\n else {\n this.handlePointHover(event, d, series, series.originalIndex);\n }\n this.d3\n .select(event.target)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('r', (this.effectiveOptions().pointRadius ?? 4) * 1.5)\n .attr('stroke-width', 2)\n .attr('stroke', `rgb(var(--ax-comp-line-chart-bg-color))`);\n })\n .on('mousemove', (event) => this.updateTooltipPosition(event))\n .on('mouseleave', (event) => {\n this._tooltipVisible.set(false);\n this.d3\n .select(event.target)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .attr('stroke-width', 1)\n .attr('stroke', '#fff');\n })\n .on('click', (event, d) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n if (overlappingPoints.length > 1) {\n overlappingPoints.forEach(({ point, series }) => {\n this.handlePointClick(event, point, series);\n });\n }\n else {\n this.handlePointClick(event, d, series);\n }\n })\n .transition()\n .delay((_d, i) => i * Math.min(this.POINT_ANIMATION_DELAY_MS, (animationDuration || 0) * 0.05) +\n (animationDuration || 0) * this.POINT_ANIMATION_DELAY_RATIO)\n .duration((animationDuration || 0) * this.POINT_ANIMATION_DURATION_RATIO)\n .ease(animationEasing)\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .on('end', (d, i, nodes) => {\n if (i === nodes.length - 1) {\n animationCounter++;\n if (animationCounter >= totalVisibleSeriesCount) {\n this.enablePointerEventsAfterAnimation();\n }\n }\n });\n });\n }\n else {\n setTimeout(() => this.enablePointerEventsAfterAnimation(), (animationDuration || 0) + this.ANIMATION_END_BUFFER);\n }\n }\n enablePointerEventsAfterAnimation() {\n if (!this.chart || !this.svg)\n return;\n this.chart.selectAll('.ax-line-chart-all-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-line').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-area').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-all-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-point').attr('pointer-events', 'all');\n this.svg.classed('ax-line-chart-animating', false);\n }\n handlePointGroupEnter(originalIndex) {\n this.chart\n .select(`.ax-line-chart-series-${originalIndex} .ax-line-chart-line`)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER);\n }\n handlePointGroupLeave() {\n this.chart\n .selectAll('.ax-line-chart-line')\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.select('.ax-line-chart-crosshair').selectAll('*').remove();\n }\n }\n getReducedDataPoints(data, maxPoints) {\n if (data.length <= maxPoints)\n return data;\n const result = [];\n const step = Math.ceil(data.length / maxPoints);\n for (let i = 0; i < data.length; i += step) {\n result.push(data[i]);\n }\n if (result[result.length - 1] !== data[data.length - 1]) {\n result.push(data[data.length - 1]);\n }\n return result;\n }\n handlePointHover(event, dataPoint, series, originalIndex) {\n if (this.effectiveOptions().showTooltip !== false) {\n const color = series.lineColor || getChartColor(originalIndex, this.chartColors);\n this._tooltipData.set({\n title: dataPoint.tooltipLabel || series.tooltipLabel || series.label || `Series ${originalIndex + 1}`,\n value: formatLargeNumber(dataPoint.y),\n color: color,\n });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n if (this.effectiveOptions().showCrosshair === true) {\n this.showCrosshairLines(dataPoint);\n }\n }\n }\n showCrosshairLines(dataPoint) {\n const isBandScale = this.xScale.bandwidth !== undefined;\n let x;\n if (isBandScale) {\n x = this.xScale(String(dataPoint.x)) + this.xScale.bandwidth() / 2;\n }\n else {\n x = this.xScale(dataPoint.x);\n }\n const y = this.yScale(dataPoint.y);\n let crosshairGroup = this.chart.select('.ax-line-chart-crosshair');\n if (crosshairGroup.empty()) {\n crosshairGroup = this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n crosshairGroup.selectAll('*').remove();\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-vertical')\n .attr('x1', x)\n .attr('y1', 0)\n .attr('x2', x)\n .attr('y2', this.height)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-horizontal')\n .attr('x1', 0)\n .attr('y1', y)\n .attr('x2', this.width)\n .attr('y2', y)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n }\n updateTooltipPosition(event) {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(rect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n }\n // computeTooltipPosition moved to shared chart utils\n handlePointClick(event, dataPoint, series) {\n this.pointClick.emit({\n series: series, // series still refers to the full series data with originalIndex\n point: dataPoint,\n event: {\n nativeEvent: event,\n sender: this,\n },\n });\n }\n showNoDataMessage(containerElement) {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-no-data-message')\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().noDataIcon} fa-2x\"></i>`);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().noData);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().noDataHelp);\n }\n showAllSeriesHiddenMessage(containerElement) {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-message') // Different class\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().allHiddenIcon} fa-2x\"></i>`); // Different icon\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().allHidden);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().allHiddenHelp);\n }\n handleOverlappingPointsHover(event, overlappingPoints) {\n if (this.effectiveOptions().showTooltip === false)\n return;\n const tooltipData = {\n title: overlappingPoints.map(({ series }) => series.label),\n value: formatLargeNumber(overlappingPoints[0].point.y),\n color: overlappingPoints.map(({ series }) => series.lineColor || getChartColor(series.originalIndex, this.chartColors)),\n };\n this._tooltipData.set(tooltipData);\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n if (this.effectiveOptions().showCrosshair === true && overlappingPoints.length > 0) {\n this.showCrosshairLines(overlappingPoints[0].point);\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: AXLineChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.15\", type: AXLineChartComponent, isStandalone: true, selector: \"ax-line-chart\", inputs: { data: { classPropertyName: \"data\", publicName: \"data\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pointClick: \"pointClick\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-line-chart\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"false\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-line-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: AXLineChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-line-chart', standalone: true, encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-line-chart\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"false\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-line-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: \"data\", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: \"options\", required: false }] }], pointClick: [{ type: i0.Output, args: [\"pointClick\"] }], chartContainerEl: [{ type: i0.ViewChild, args: ['chartContainer', { isSignal: true }] }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvbGluZS1jaGFydC9zcmMvbGliL2xpbmUtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2xpbmUtY2hhcnQvc3JjL2xpYi9saW5lLWNoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBRWhCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUczRDs7R0FFRztBQVVILE1BQU0sT0FBTyxvQkFDWCxTQUFRLGdCQUFnQjtJQUd4QixJQUFJLEdBQUcsS0FBSyxDQUFtQixFQUFFLGdEQUFDLENBQUM7SUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBb0IsRUFBRSxtREFBQyxDQUFDO0lBQ3ZDLFVBQVUsR0FBRyxNQUFNLEVBQThCLENBQUM7SUFFakMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsZ0JBQWdCLENBQUMsQ0FBQztJQUMzRixFQUFFLENBQXVCO0lBRTNCLEdBQUcsQ0FBeUQ7SUFDNUQsS0FBSyxDQUF1RDtJQUM1RCxNQUFNLENBQXlEO0lBQy9ELE1BQU0sQ0FBa0M7SUFD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UEFMRVRURSxcbiAgQVhDaGFydENvbXBvbmVudCxcbiAgQVhDaGFydENvbXBvbmVudEJhc2UsXG4gIGNvbXB1dGVUb29sdGlwUG9zaXRpb24sXG4gIGZvcm1hdExhcmdlTnVtYmVyLFxuICBnZXRDaGFydENvbG9yLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbn0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRMZWdlbmRJdGVtIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtbGVnZW5kJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgQVhfTElORV9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2xpbmUtY2hhcnQuY29uZmlnJztcbmltcG9ydCB7IEFYTGluZUNoYXJ0RGF0YSwgQVhMaW5lQ2hhcnRPcHRpb24sIEFYTGluZUNoYXJ0UG9pbnRDbGlja0V2ZW50LCBBWExpbmVDaGFydFZhbHVlIH0gZnJvbSAnLi9saW5lLWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIExpbmUgQ2hhcnQgQ29tcG9uZW50IGZvciByZW5kZXJpbmcgZGF0YSBhcyBsaW5lcyB3aXRoIGludGVyYWN0aXZlIGhvdmVyIGVmZmVjdHMgYW5kIGFuaW1hdGlvbnNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtbGluZS1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saW5lLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGluZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhMaW5lQ2hhcnRDb21wb25lbnRcbiAgZXh0ZW5kcyBBWENoYXJ0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0Q29tcG9uZW50QmFzZVxue1xuICBkYXRhID0gaW5wdXQ8QVhMaW5lQ2hhcnRWYWx1ZT4oW10pO1xuICBvcHRpb25zID0gaW5wdXQ8QVhMaW5lQ2hhcnRPcHRpb24+KHt9KTtcbiAgcG9pbnRDbGljayA9IG91dHB1dDxBWExpbmVDaGFydFBvaW50Q2xpY2tFdmVudD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0Q29udGFpbmVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuICBwcm90ZWN0ZWQgZDMhOiB0eXBlb2YgaW1wb3J0KCdkMycpO1xuXG4gIHByaXZhdGUgc3ZnITogZDMuU2VsZWN0aW9uPFNWR1NWR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD47XG4gIHByaXZhdGUgY2hhcnQhOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD47XG4gIHByaXZhdGUgeFNjYWxlITogZDMuU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXI+IHwgZDMuU2NhbGVCYW5kPHN0cmluZz47XG4gIHByaXZhdGUgeVNjYWxlITogZDMuU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXI+O1xuICBwcml2YXRlIHhBeGlzITogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+O1xuICBwcml2YXRlIHlBeGlzITogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+O1xuXG4gIHByaXZhdGUgd2lkdGghOiBudW1iZXI7XG4gIHByaXZhdGUgaGVpZ2h0ITogbnVtYmVyO1xuICBwcml2YXRlIG1hcmdpbiA9IHsgdG9wOiAyMCwgcmlnaHQ6IDI1LCBib3R0b206IDQwLCBsZWZ0OiA1MCB9O1xuXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgcGVyY2VudGFnZTogJzAlJyxcbiAgICBjb2xvcjogJycsXG4gIH0pO1xuXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIGhpZGRlblNlcmllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9mdWxsTm9ybWFsaXplZERhdGE6IChBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9KVtdID0gW107XG5cbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfTElORV9DSEFSVF9DT05GSUcpO1xuXG4gIC8vIEluamVjdCB0aGUgY2hhcnQgY29sb3JzXG4gIHByaXZhdGUgY2hhcnRDb2xvcnMgPSBpbmplY3QoQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSk7XG5cbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnVG9rZW4sXG4gICAgICAuLi50aGlzLm9wdGlvbnMoKSxcbiAgICB9O1xuICB9KTtcblxuICAvLyBNZXNzYWdlcyB3aXRoIGRlZmF1bHRzXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVNZXNzYWdlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZXMgPSB7XG4gICAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgICBhbGxIaWRkZW46ICdBbGwgc2VyaWVzIGFyZSBoaWRkZW4nLFxuICAgICAgYWxsSGlkZGVuSGVscDogJ0NsaWNrIGxlZ2VuZCBpdGVtcyB0byBzaG93IHNlcmllcyBpbiB0aGUgY2hhcnQnLFxuICAgICAgbm9EYXRhSWNvbjogJ2ZhLWxpZ2h0IGZhLWNoYXJ0LWxpbmUnLFxuICAgICAgYWxsSGlkZGVuSWNvbjogJ2ZhLWxpZ2h0IGZhLWV5ZS1zbGFzaCcsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdE1lc3NhZ2VzLFxuICAgICAgLi4udGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubWVzc2FnZXMsXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gTGF5b3V0ICYgRGltZW5zaW9uc1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9ESU1FTlNJT04gPSAxMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0NPTlRBSU5FUl9ESU1FTlNJT04gPSAyMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NQVJHSU5fVE9QID0gMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NQVJHSU5fUklHSFQgPSAyNTtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX01BUkdJTl9CT1RUT00gPSA0MDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX01BUkdJTl9MRUZUID0gNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX01BUkdJTl9CT1RUT00gPSA0NTtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fTUFSR0lOX0xFRlQgPSA1NTtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfRVhUUkFfTUFSR0lOID0gNjA7XG5cbiAgLy8gU3R5bGluZyAmIFZpc3VhbFxuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTElORV9XSURUSCA9IDI7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9QT0lOVF9SQURJVVMgPSA0O1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfRklMTF9PUEFDSVRZID0gMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTElORV9ISUdITElHSFRfTVVMVElQTElFUiA9IDEuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBQT0lOVF9ISUdITElHSFRfTVVMVElQTElFUiA9IDEuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBQT0lOVF9TVFJPS0VfV0lEVEggPSAxO1xuICBwcml2YXRlIHJlYWRvbmx5IFBPSU5UX0hPVkVSX1NUUk9LRV9XSURUSCA9IDI7XG4gIHByaXZhdGUgcmVhZG9ubHkgR1JJRF9EQVNIX0FSUkFZID0gJzIsMic7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ1JPU1NIQUlSX0RBU0hfQVJSQVkgPSAnMywzJztcbiAgcHJpdmF0ZSByZWFkb25seSBDUk9TU0hBSVJfT1BBQ0lUWSA9IDAuNztcblxuICAvLyBBbmltYXRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBIT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwO1xuICBwcml2YXRlIHJlYWRvbmx5IEFOSU1BVElPTl9FTkRfQlVGRkVSID0gMTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IFBPSU5UX0FOSU1BVElPTl9ERUxBWV9NUyA9IDUwO1xuICBwcml2YXRlIHJlYWRvbmx5IFBPSU5UX0FOSU1BVElPTl9ERUxBWV9SQVRJTyA9IDAuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBQT0lOVF9BTklNQVRJT05fRFVSQVRJT05fUkFUSU8gPSAwLjM7XG5cbiAgLy8gVGV4dCAmIExhYmVsc1xuICBwcml2YXRlIHJlYWRvbmx5IEFYSVNfTEFCRUxfRk9OVF9TSVpFID0gMTQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUl9XSURUSF9SQVRJTyA9IDAuNjtcbiAgcHJpdmF0ZSByZWFkb25seSBGT05UX1dJRFRIX01VTFRJUExJRVIgPSAwLjY7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX0xBQkVMX0xFTkdUSCA9IDIwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9GT05UX1NJWkVfWCA9IDExO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9GT05UX1NJWkVfWCA9IDE1O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9GT05UX1NJWkVfWSA9IDExO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9GT05UX1NJWkVfWSA9IDE1O1xuICBwcml2YXRlIHJlYWRvbmx5IEZPTlRfUEFERElORyA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IFlfQVhJU19QQURESU5HID0gMTA7XG5cbiAgLy8gRGF0YSAmIFBlcmZvcm1hbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX1BPSU5UU19UT19SRU5ERVIgPSAxMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgUE9JTlRfQ09PUkRJTkFURV9QUkVDSVNJT04gPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNQU5ZX0lURU1TX1RIUkVTSE9MRCA9IDIwO1xuICBwcml2YXRlIHJlYWRvbmx5IFZFUllfTUFOWV9JVEVNU19USFJFU0hPTEQgPSA1MDtcblxuICAvLyBUb29sdGlwXG4gIHByaXZhdGUgcmVhZG9ubHkgVE9PTFRJUF9HQVAgPSAxMDtcblxuICAvKipcbiAgICogTm9ybWFsaXplcyBpbnB1dCBkYXRhIHRvIGNvbnNpc3RlbnQgYXJyYXkgZm9ybWF0IHdpdGggb3JpZ2luYWxJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRhKHJhd0RhdGE6IEFYTGluZUNoYXJ0VmFsdWUpOiAoQVhMaW5lQ2hhcnREYXRhICYgeyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfSlbXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3RGF0YSkpIHtcbiAgICAgIHJldHVybiByYXdEYXRhLm1hcCgocywgaSkgPT4gKHsgLi4ucywgb3JpZ2luYWxJbmRleDogaSB9KSk7XG4gICAgfVxuICAgIGlmIChyYXdEYXRhICYmICdkYXRhJyBpbiByYXdEYXRhKSB7XG4gICAgICByZXR1cm4gW3sgLi4ucmF3RGF0YSwgb3JpZ2luYWxJbmRleDogMCB9XTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2VyaWVzXG4gICAqL1xuICBwcml2YXRlIGdldFNlcmllc0lkZW50aWZpZXIoc2VyaWVzOiBBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VyaWVzLmlkIHx8IHNlcmllcy5sYWJlbCB8fCBgc2VyaWVzLSR7c2VyaWVzLm9yaWdpbmFsSW5kZXh9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGR5bmFtaWMgZm9udCBzaXplIGJhc2VkIG9uIGF2YWlsYWJsZSBzcGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEeW5hbWljRm9udFNpemUoZGltZW5zaW9uOiBudW1iZXIsIGRpdmlzb3I6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIE1hdGgucm91bmQoZGltZW5zaW9uIC8gZGl2aXNvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5pcXVlIGtleSBmb3IgcG9pbnQgY29vcmRpbmF0ZXMgKGZvciBvdmVybGFwIGRldGVjdGlvbilcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUG9pbnRLZXkoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWNpc2lvbiA9IHRoaXMuUE9JTlRfQ09PUkRJTkFURV9QUkVDSVNJT047XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQoeCAqIHByZWNpc2lvbikgLyBwcmVjaXNpb259LCR7TWF0aC5yb3VuZCh5ICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgc2VyaWVzIGVsZW1lbnRzIGZyb20gdGhlIGNoYXJ0XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZVNlcmllc0VsZW1lbnRzKHNlcmllc0lkZW50aWZpZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKGAuYXgtbGluZS1jaGFydC1zZXJpZXNbZGF0YS1zZXJpZXMtaWRlbnRpZmllcj1cIiR7c2VyaWVzSWRlbnRpZmllcn1cIl1gKS5yZW1vdmUoKTtcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdEFsbChgLmF4LWxpbmUtY2hhcnQtcG9pbnRzW2RhdGEtc2VyaWVzLWlkZW50aWZpZXI9XCIke3Nlcmllc0lkZW50aWZpZXJ9XCJdYCkucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIGxvbmcgbGFiZWxzIHdpdGggZWxsaXBzaXNcbiAgICovXG4gIHByaXZhdGUgdHJ1bmNhdGVMYWJlbChsYWJlbDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IHRoaXMuTUFYX0xBQkVMX0xFTkdUSCk6IHN0cmluZyB7XG4gICAgaWYgKGxhYmVsLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiBsYWJlbDtcbiAgICByZXR1cm4gbGFiZWwuc3Vic3RyaW5nKDAsIG1heExlbmd0aCAtIDEpICsgJ+KApic7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBtYXhpbXVtIHdpZHRoIG5lZWRlZCBmb3IgWS1heGlzIHRpY2sgbGFiZWxzXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZU1heFlBeGlzVGlja0xhYmVsV2lkdGgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBhbGxTZXJpZXNEYXRhID0gdGhpcy5fZnVsbE5vcm1hbGl6ZWREYXRhLmZpbHRlcigocykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyh0aGlzLmdldFNlcmllc0lkZW50aWZpZXIocykpKTtcblxuICAgIGxldCBtYXhWYWx1ZSA9IDA7XG4gICAgbGV0IG1pblZhbHVlID0gMDtcblxuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIGFsbFNlcmllc0RhdGEpIHtcbiAgICAgIGlmIChzZXJpZXMuZGF0YSAmJiBzZXJpZXMuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHBvaW50LnkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtYXhWYWx1ZSA9IE1hdGgubWF4KG1heFZhbHVlLCBwb2ludC55KTtcbiAgICAgICAgICAgIG1pblZhbHVlID0gTWF0aC5taW4obWluVmFsdWUsIHBvaW50LnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGJvdGggbWF4IGFuZCBtaW4gKGZvciBuZWdhdGl2ZSB2YWx1ZXMpXG4gICAgY29uc3QgbWF4QWJzVmFsdWUgPSBNYXRoLm1heChNYXRoLmFicyhtYXhWYWx1ZSksIE1hdGguYWJzKG1pblZhbHVlKSk7XG4gICAgY29uc3QgdGlja0xhYmVsVGV4dCA9IE51bWJlci5pc0Zpbml0ZShtYXhBYnNWYWx1ZSkgPyBmb3JtYXRMYXJnZU51bWJlcihtYXhBYnNWYWx1ZSkgOiAnMDAwMDAnO1xuXG4gICAgcmV0dXJuIHRpY2tMYWJlbFRleHQubGVuZ3RoICogdGhpcy5BWElTX0xBQkVMX0ZPTlRfU0laRSAqIHRoaXMuRk9OVF9XSURUSF9NVUxUSVBMSUVSICsgdGhpcy5GT05UX1BBRERJTkc7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWREMygpO1xuICB9XG5cbiAgI2VmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgdGhpcy5fZnVsbE5vcm1hbGl6ZWREYXRhID0gdGhpcy5ub3JtYWxpemVEYXRhKHRoaXMuZGF0YSgpKTtcbiAgICB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgIGlmICh0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgfVxuICB9KTtcblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgIGlmICh0aGlzLmQzICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcbiAgfVxuXG4gIC8vIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIEltcGxlbWVudGF0aW9uXG4gIGdldExlZ2VuZEl0ZW1zKCk6IEFYQ2hhcnRMZWdlbmRJdGVtW10ge1xuICAgIGNvbnN0IHRvdGFsU3VtID0gdGhpcy5fZnVsbE5vcm1hbGl6ZWREYXRhLnJlZHVjZSgoc3VtLCBzZXJpZXMpID0+IHtcbiAgICAgIHJldHVybiBzdW0gKyBzZXJpZXMuZGF0YS5yZWR1Y2UoKHNTdW0sIHApID0+IHNTdW0gKyBwLnksIDApO1xuICAgIH0sIDApO1xuXG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxOb3JtYWxpemVkRGF0YS5tYXAoKHNlcmllcykgPT4ge1xuICAgICAgY29uc3Qgc2VyaWVzSWRlbnRpZmllciA9IHRoaXMuZ2V0U2VyaWVzSWRlbnRpZmllcihzZXJpZXMpO1xuICAgICAgY29uc3Qgc2VyaWVzU3VtID0gc2VyaWVzLmRhdGEucmVkdWNlKChzdW0sIHApID0+IHN1bSArIHAueSwgMCk7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWxTdW0gPiAwID8gKHNlcmllc1N1bSAvIHRvdGFsU3VtKSAqIDEwMCA6IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogc2VyaWVzSWRlbnRpZmllcixcbiAgICAgICAgbmFtZTogc2VyaWVzLmxhYmVsIHx8IGBTZXJpZXMgJHtzZXJpZXMub3JpZ2luYWxJbmRleCArIDF9YCxcbiAgICAgICAgdmFsdWU6IHNlcmllc1N1bSxcbiAgICAgICAgY29sb3I6IHNlcmllcy5saW5lQ29sb3IgfHwgZ2V0Q2hhcnRDb2xvcihzZXJpZXMub3JpZ2luYWxJbmRleCwgdGhpcy5jaGFydENvbG9ycyksXG4gICAgICAgIGhpZGRlbjogdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHNlcmllc0lkZW50aWZpZXIpLFxuICAgICAgICBwZXJjZW50YWdlOiBwYXJzZUZsb2F0KHBlcmNlbnRhZ2UudG9GaXhlZCgyKSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgaGlnaGxpZ2h0U2VnbWVudChpZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmcpIHJldHVybjtcblxuICAgIGNvbnN0IGFsbFNlcmllc0dyb3VwcyA9IHRoaXMuc3ZnLnNlbGVjdEFsbCgnZy5heC1saW5lLWNoYXJ0LXNlcmllcycpO1xuICAgIGNvbnN0IGFsbFBvaW50c0dyb3VwcyA9IHRoaXMuc3ZnLnNlbGVjdEFsbCgnZy5heC1saW5lLWNoYXJ0LXBvaW50cycpO1xuXG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICBhbGxTZXJpZXNHcm91cHMuY2xhc3NlZCgnYXgtY2hhcnQtZGltbWVkJywgZmFsc2UpLnN0eWxlKCdvcGFjaXR5JywgMSk7XG4gICAgICBhbGxQb2ludHNHcm91cHMuY2xhc3NlZCgnYXgtY2hhcnQtZGltbWVkJywgZmFsc2UpLnN0eWxlKCdvcGFjaXR5JywgMSk7XG5cbiAgICAgIGFsbFNlcmllc0dyb3Vwc1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1saW5lJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmxpbmVXaWR0aCA/PyB0aGlzLkRFRkFVTFRfTElORV9XSURUSClcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWNoYXJ0LWhpZ2hsaWdodGVkLXBhdGgnLCBmYWxzZSk7XG4gICAgICBhbGxQb2ludHNHcm91cHNcbiAgICAgICAgLnNlbGVjdEFsbCgnY2lyY2xlLmF4LWxpbmUtY2hhcnQtcG9pbnQnKVxuICAgICAgICAuYXR0cigncicsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnBvaW50UmFkaXVzID8/IHRoaXMuREVGQVVMVF9QT0lOVF9SQURJVVMpXG4gICAgICAgIC5jbGFzc2VkKCdheC1jaGFydC1oaWdobGlnaHRlZC1wb2ludCcsIGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhbGxTZXJpZXNHcm91cHMuY2xhc3NlZCgnYXgtY2hhcnQtZGltbWVkJywgdHJ1ZSkuc3R5bGUoJ29wYWNpdHknLCAwLjMpO1xuICAgIGFsbFBvaW50c0dyb3Vwcy5jbGFzc2VkKCdheC1jaGFydC1kaW1tZWQnLCB0cnVlKS5zdHlsZSgnb3BhY2l0eScsIDAuMyk7XG5cbiAgICBjb25zdCB0YXJnZXRTZXJpZXNHcm91cCA9IHRoaXMuc3ZnLnNlbGVjdEFsbChgZy5heC1saW5lLWNoYXJ0LXNlcmllc1tkYXRhLXNlcmllcy1pZGVudGlmaWVyPVwiJHtpZH1cIl1gKTtcbiAgICBjb25zdCB0YXJnZXRQb2ludHNHcm91cCA9IHRoaXMuc3ZnLnNlbGVjdEFsbChgZy5heC1saW5lLWNoYXJ0LXBvaW50c1tkYXRhLXNlcmllcy1pZGVudGlmaWVyPVwiJHtpZH1cIl1gKTtcblxuICAgIHRhcmdldFNlcmllc0dyb3VwLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKS5zdHlsZSgnb3BhY2l0eScsIDEpO1xuICAgIHRhcmdldFBvaW50c0dyb3VwLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKS5zdHlsZSgnb3BhY2l0eScsIDEpO1xuXG4gICAgdGFyZ2V0U2VyaWVzR3JvdXBcbiAgICAgIC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LWxpbmUnKVxuICAgICAgLmF0dHIoXG4gICAgICAgICdzdHJva2Utd2lkdGgnLFxuICAgICAgICAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IHRoaXMuREVGQVVMVF9MSU5FX1dJRFRIKSAqIHRoaXMuTElORV9ISUdITElHSFRfTVVMVElQTElFUixcbiAgICAgIClcbiAgICAgIC5jbGFzc2VkKCdheC1jaGFydC1oaWdobGlnaHRlZC1wYXRoJywgdHJ1ZSk7XG5cbiAgICB0YXJnZXRQb2ludHNHcm91cFxuICAgICAgLnNlbGVjdEFsbCgnY2lyY2xlLmF4LWxpbmUtY2hhcnQtcG9pbnQnKVxuICAgICAgLmF0dHIoJ3InLCAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkucG9pbnRSYWRpdXMgPz8gdGhpcy5ERUZBVUxUX1BPSU5UX1JBRElVUykgKiB0aGlzLlBPSU5UX0hJR0hMSUdIVF9NVUxUSVBMSUVSKVxuICAgICAgLmNsYXNzZWQoJ2F4LWNoYXJ0LWhpZ2hsaWdodGVkLXBhdGgnLCB0cnVlKTtcbiAgfVxuXG4gIHRvZ2dsZVNlZ21lbnQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhpZGRlblNlcmllcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLmhpZGRlblNlcmllcy5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGRlblNlcmllcy5hZGQoaWQpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgcmV0dXJuICF0aGlzLmhpZGRlblNlcmllcy5oYXMoaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCgpICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMyB8fCAhdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGFsbFNlcmllc0RhdGEgPSB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGE7XG5cbiAgICAvLyBDbGVhciBwcmV2aW91cyBTVkcgYW5kIGFueSBlbXB0eS1zdGF0ZSBtZXNzYWdlcyAocHJlc2VydmUgdG9vbHRpcCBjb21wb25lbnQpXG4gICAgdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtbGluZS1jaGFydC1uby1kYXRhLW1lc3NhZ2UsIC5heC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4tbWVzc2FnZScpXG4gICAgICAucmVtb3ZlKCk7XG5cbiAgICBpZiAoYWxsU2VyaWVzRGF0YS5sZW5ndGggPT09IDAgfHwgYWxsU2VyaWVzRGF0YS5ldmVyeSgoc2VyaWVzKSA9PiAhc2VyaWVzLmRhdGEgfHwgc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aXNpYmxlRGF0YUZvclJlbmRlcmluZyA9IGFsbFNlcmllc0RhdGEuZmlsdGVyKFxuICAgICAgKHNlcmllcykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyh0aGlzLmdldFNlcmllc0lkZW50aWZpZXIoc2VyaWVzKSksXG4gICAgKTtcblxuICAgIGlmICh2aXNpYmxlRGF0YUZvclJlbmRlcmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEFsbCBkYXRhIGlzIHByZXNlbnQsIGJ1dCBhbGwgc2VyaWVzIGFyZSBoaWRkZW4gYnkgdGhlIGxlZ2VuZFxuICAgICAgdGhpcy5zaG93QWxsU2VyaWVzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIC8vIFN0aWxsIHNldHVwIGJhc2ljIFNWRyBhbmQgY2hhcnQgZ3JvdXAgZm9yIGNvbnNpc3RlbmN5IGlmIG5lZWRlZCwgb3IgcmV0dXJuXG4gICAgICAvLyBGb3Igbm93LCB3ZSB3aWxsIHNob3cgdGhlIG1lc3NhZ2UgYW5kIHJldHVybiwgYXMgc2NhbGVzL2F4ZXMgY2FuJ3QgYmUgZHJhd24uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2hhcnRPcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgdGhpcy5zZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudCwgY2hhcnRPcHRpb25zKTtcblxuICAgIC8vIFVzZSBhbGxTZXJpZXNEYXRhIGZvciBkb21haW4gY2FsY3VsYXRpb24gdG8ga2VlcCBzY2FsZXMgY29uc2lzdGVudFxuICAgIGNvbnN0IGRhdGFGb3JTY2FsZVNldHVwID0gYWxsU2VyaWVzRGF0YS5maWx0ZXIoKHMpID0+IHMuZGF0YSAmJiBzLmRhdGEubGVuZ3RoID4gMCk7XG4gICAgaWYgKGRhdGFGb3JTY2FsZVNldHVwLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXR1cFNjYWxlcyhkYXRhRm9yU2NhbGVTZXR1cCk7XG4gICAgdGhpcy5jcmVhdGVBeGVzKGNoYXJ0T3B0aW9ucyk7XG4gICAgdGhpcy5yZW5kZXJMaW5lcyhhbGxTZXJpZXNEYXRhKTsgLy8gUmVuZGVyTGluZXMgd2lsbCBoYW5kbGUgaGlkaW5nIGJhc2VkIG9uIGhpZGRlblNlcmllc1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3ZnKSB7XG4gICAgICB0aGlzLmQzPy5zZWxlY3QodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnJykucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN2ZyA9IG51bGw7XG4gICAgICB0aGlzLmNoYXJ0ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zOiBBWExpbmVDaGFydE9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY2FsY3VsYXRlTWFyZ2lucyhvcHRpb25zLCBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICBjb25zdCBtaW5EaW0gPSBNYXRoLm1pbih0aGlzLk1JTl9DT05UQUlORVJfRElNRU5TSU9OLCBjb250YWluZXJXaWR0aCwgY29udGFpbmVySGVpZ2h0KTtcblxuICAgIGlmIChvcHRpb25zLndpZHRoICYmIG9wdGlvbnMuaGVpZ2h0KSB7XG4gICAgICB0aGlzLndpZHRoID0gb3B0aW9ucy53aWR0aCAtIHRoaXMubWFyZ2luLmxlZnQgLSB0aGlzLm1hcmdpbi5yaWdodDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgLSB0aGlzLm1hcmdpbi50b3AgLSB0aGlzLm1hcmdpbi5ib3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud2lkdGggPSBNYXRoLm1heChjb250YWluZXJXaWR0aCwgbWluRGltKSAtIHRoaXMubWFyZ2luLmxlZnQgLSB0aGlzLm1hcmdpbi5yaWdodDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgoY29udGFpbmVySGVpZ2h0LCBtaW5EaW0pIC0gdGhpcy5tYXJnaW4udG9wIC0gdGhpcy5tYXJnaW4uYm90dG9tO1xuICAgIH1cblxuICAgIHRoaXMud2lkdGggPSBNYXRoLm1heCh0aGlzLndpZHRoLCB0aGlzLk1JTl9ESU1FTlNJT04pO1xuICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5oZWlnaHQsIHRoaXMuTUlOX0RJTUVOU0lPTik7XG5cbiAgICBjb25zdCB0b3RhbFdpZHRoID0gdGhpcy53aWR0aCArIHRoaXMubWFyZ2luLmxlZnQgKyB0aGlzLm1hcmdpbi5yaWdodDtcbiAgICBjb25zdCB0b3RhbEhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgdGhpcy5tYXJnaW4udG9wICsgdGhpcy5tYXJnaW4uYm90dG9tO1xuXG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRvdGFsV2lkdGgpXG4gICAgICAuYXR0cignaGVpZ2h0JywgdG90YWxIZWlnaHQpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt0b3RhbFdpZHRofSAke3RvdGFsSGVpZ2h0fWApXG4gICAgICAuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0JylcbiAgICAgIC5hdHRyKFxuICAgICAgICAnc3R5bGUnLFxuICAgICAgICBgXG4gICAgICAgIHdpZHRoOiAke3RvdGFsV2lkdGh9cHg7XG4gICAgICAgIGhlaWdodDogJHt0b3RhbEhlaWdodH1weDtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAgIGAsXG4gICAgICApO1xuXG4gICAgdGhpcy5zdmcgPSBzdmc7XG4gICAgdGhpcy5jaGFydCA9IHRoaXMuc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt0aGlzLm1hcmdpbi5sZWZ0fSwke3RoaXMubWFyZ2luLnRvcH0pYCk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZU1hcmdpbnMob3B0aW9uczogQVhMaW5lQ2hhcnRPcHRpb24sIGNvbnRhaW5lcldpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmdpbiA9IHtcbiAgICAgIHRvcDogb3B0aW9ucy5tYXJnaW5zPy50b3AgPz8gdGhpcy5ERUZBVUxUX01BUkdJTl9UT1AsXG4gICAgICByaWdodDogb3B0aW9ucy5tYXJnaW5zPy5yaWdodCA/PyB0aGlzLkRFRkFVTFRfTUFSR0lOX1JJR0hULFxuICAgICAgYm90dG9tOiBvcHRpb25zLm1hcmdpbnM/LmJvdHRvbSA/PyB0aGlzLkRFRkFVTFRfTUFSR0lOX0JPVFRPTSxcbiAgICAgIGxlZnQ6IG9wdGlvbnMubWFyZ2lucz8ubGVmdCA/PyB0aGlzLkRFRkFVTFRfTUFSR0lOX0xFRlQsXG4gICAgfTtcblxuICAgIGNvbnN0IGFsbERhdGFQb2ludHMgPSB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGEuZmxhdE1hcCgoc2VyaWVzKSA9PiBzZXJpZXMuZGF0YSk7XG4gICAgaWYgKGFsbERhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWxsTnVtZXJpY1ggPSBhbGxEYXRhUG9pbnRzLmV2ZXJ5KChkKSA9PiB0eXBlb2YgZC54ID09PSAnbnVtYmVyJyk7XG5cbiAgICAgIGlmICghYWxsTnVtZXJpY1gpIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHRoaXMuX2Z1bGxOb3JtYWxpemVkRGF0YS5maWx0ZXIoXG4gICAgICAgICAgKHMpID0+ICF0aGlzLmhpZGRlblNlcmllcy5oYXModGhpcy5nZXRTZXJpZXNJZGVudGlmaWVyKHMpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWxsWFZhbHVlcyA9IG5ldyBTZXQodmlzaWJsZVNlcmllcy5mbGF0TWFwKChzZXJpZXMpID0+IHNlcmllcy5kYXRhLm1hcCgoZCkgPT4gU3RyaW5nKGQueCkpKSk7XG4gICAgICAgIGNvbnN0IGxhYmVsQ291bnQgPSBhbGxYVmFsdWVzLnNpemU7XG5cbiAgICAgICAgaWYgKGxhYmVsQ291bnQgPiAwICYmIGNvbnRhaW5lcldpZHRoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHdvcmtpbmdXaWR0aCA9IGNvbnRhaW5lcldpZHRoIC0gdGhpcy5tYXJnaW4ubGVmdCAtIHRoaXMubWFyZ2luLnJpZ2h0O1xuICAgICAgICAgIGlmICh3b3JraW5nV2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aFBlckxhYmVsID0gd29ya2luZ1dpZHRoIC8gbGFiZWxDb3VudDtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVscyA9IEFycmF5LmZyb20oYWxsWFZhbHVlcyk7XG4gICAgICAgICAgICBjb25zdCBsb25nZXN0TGFiZWwgPSBsYWJlbHMucmVkdWNlKChhLCBiKSA9PiAoYS5sZW5ndGggPiBiLmxlbmd0aCA/IGEgOiBiKSwgJycpO1xuXG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRGb250U2l6ZSA9IHRoaXMuY2FsY3VsYXRlRHluYW1pY0ZvbnRTaXplKFxuICAgICAgICAgICAgICB3b3JraW5nV2lkdGgsXG4gICAgICAgICAgICAgIDQ1LFxuICAgICAgICAgICAgICB0aGlzLk1JTl9GT05UX1NJWkVfWCxcbiAgICAgICAgICAgICAgdGhpcy5NQVhfRk9OVF9TSVpFX1gsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBBY2NvdW50IGZvciBsYWJlbCB0cnVuY2F0aW9uIGluIHdpZHRoIGNhbGN1bGF0aW9uXG4gICAgICAgICAgICBjb25zdCBtYXhMYWJlbExlbmd0aCA9IGxhYmVsQ291bnQgPiB0aGlzLk1BTllfSVRFTVNfVEhSRVNIT0xEID8gMTAgOiB0aGlzLk1BWF9MQUJFTF9MRU5HVEg7XG4gICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVMYWJlbExlbmd0aCA9IE1hdGgubWluKGxvbmdlc3RMYWJlbC5sZW5ndGgsIG1heExhYmVsTGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoID0gZWZmZWN0aXZlTGFiZWxMZW5ndGggKiBlc3RpbWF0ZWRGb250U2l6ZSAqIHRoaXMuQ0hBUl9XSURUSF9SQVRJTztcblxuICAgICAgICAgICAgaWYgKGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoID4gYXZhaWxhYmxlV2lkdGhQZXJMYWJlbCkge1xuICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZGlhZ29uYWwgaGVpZ2h0IHdoZW4gcm90YXRlZCAtNDUgZGVncmVlc1xuICAgICAgICAgICAgICBjb25zdCBkaWFnb25hbEhlaWdodCA9IGVzdGltYXRlZExvbmdlc3RMYWJlbFdpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDQpO1xuICAgICAgICAgICAgICBjb25zdCByZXF1aXJlZEV4dHJhTWFyZ2luID0gZGlhZ29uYWxIZWlnaHQgKyAxNTsgLy8gRXh0cmEgcGFkZGluZyBmb3Igc2FmZXR5XG4gICAgICAgICAgICAgIHRoaXMubWFyZ2luLmJvdHRvbSArPSBNYXRoLm1pbih0aGlzLk1BWF9FWFRSQV9NQVJHSU4sIHJlcXVpcmVkRXh0cmFNYXJnaW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnhBeGlzTGFiZWwpIHtcbiAgICAgIGNvbnN0IHhMYWJlbExlbmd0aCA9IG9wdGlvbnMueEF4aXNMYWJlbC5sZW5ndGg7XG4gICAgICBjb25zdCBleHRyYUJvdHRvbU1hcmdpbiA9IE1hdGgubWluKDIwLCBNYXRoLm1heCgxMCwgeExhYmVsTGVuZ3RoICogMC44KSk7XG4gICAgICB0aGlzLm1hcmdpbi5ib3R0b20gPSBNYXRoLm1heCh0aGlzLm1hcmdpbi5ib3R0b20sIDQwICsgZXh0cmFCb3R0b21NYXJnaW4pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnlBeGlzTGFiZWwpIHtcbiAgICAgIC8vIENhbGN1bGF0ZSBzcGFjZSBuZWVkZWQgZm9yIFktYXhpczogdGljayBsYWJlbHMgKyBwYWRkaW5nICsgdGl0bGVcbiAgICAgIGNvbnN0IG1heFRpY2tMYWJlbFdpZHRoID0gdGhpcy5jYWxjdWxhdGVNYXhZQXhpc1RpY2tMYWJlbFdpZHRoKCk7XG4gICAgICBjb25zdCB5QXhpc1RpdGxlVGhpY2tuZXNzID0gMjA7IC8vIEhlaWdodCBvZiByb3RhdGVkIHRpdGxlIHRleHRcbiAgICAgIGNvbnN0IHlBeGlzVGl0bGVQYWRkaW5nID0gdGhpcy5ZX0FYSVNfUEFERElORztcbiAgICAgIGNvbnN0IHRvdGFsWUF4aXNXaWR0aCA9IG1heFRpY2tMYWJlbFdpZHRoICsgeUF4aXNUaXRsZVBhZGRpbmcgKyB5QXhpc1RpdGxlVGhpY2tuZXNzO1xuXG4gICAgICB0aGlzLm1hcmdpbi5sZWZ0ID0gTWF0aC5tYXgodGhpcy5tYXJnaW4ubGVmdCwgdG90YWxZQXhpc1dpZHRoKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZSkge1xuICAgICAgLy8gSnVzdCB0aWNrIGxhYmVscywgbm8gdGl0bGVcbiAgICAgIGNvbnN0IG1heFRpY2tMYWJlbFdpZHRoID0gdGhpcy5jYWxjdWxhdGVNYXhZQXhpc1RpY2tMYWJlbFdpZHRoKCk7XG4gICAgICB0aGlzLm1hcmdpbi5sZWZ0ID0gTWF0aC5tYXgodGhpcy5tYXJnaW4ubGVmdCwgbWF4VGlja0xhYmVsV2lkdGggKyAxMCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2hvd1hBeGlzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJnaW4uYm90dG9tID0gTWF0aC5tYXgodGhpcy5tYXJnaW4uYm90dG9tLCB0aGlzLk1JTl9NQVJHSU5fQk9UVE9NKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG93WUF4aXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1hcmdpbi5sZWZ0ID0gTWF0aC5tYXgodGhpcy5tYXJnaW4ubGVmdCwgdGhpcy5NSU5fTUFSR0lOX0xFRlQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTY2FsZXMoZGF0YTogKEFYTGluZUNoYXJ0RGF0YSAmIHsgb3JpZ2luYWxJbmRleDogbnVtYmVyIH0pW10pOiB2b2lkIHtcbiAgICAvLyBFeHBlY3RzIGFscmVhZHkgZmlsdGVyZWQgZGF0YSBmb3Igc2NhbGVzXG4gICAgY29uc3QgY2hhcnRPcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgY29uc3QgcGFkZGluZyA9IGNoYXJ0T3B0aW9ucy5heGlzUGFkZGluZyA/PyAwO1xuICAgIGNvbnN0IHBhZGRpbmdNdWx0aXBsaWVyID0gcGFkZGluZyAvIDEwMDtcblxuICAgIC8vIEVuc3VyZSBkYXRhIGlzIG5vdCBlbXB0eSBmb3Igc2NhbGUgZG9tYWluIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgYWxsRGF0YVBvaW50cyA9IGRhdGEubGVuZ3RoID4gMCA/IGRhdGEuZmxhdE1hcCgoc2VyaWVzKSA9PiBzZXJpZXMuZGF0YSkgOiBbeyB4OiAwLCB5OiAwIH1dO1xuICAgIGlmIChhbGxEYXRhUG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gU2hvdWxkIGlkZWFsbHkgbm90IGhhcHBlbiBpZiBjcmVhdGVDaGFydCBmaWx0ZXJzIGNvcnJlY3RseVxuICAgICAgYWxsRGF0YVBvaW50cy5wdXNoKHsgeDogMCwgeTogMCB9KTsgLy8gRGVmYXVsdCBmYWxsYmFjayB0byBwcmV2ZW50IGNyYXNoIHdpdGggZW1wdHkgZG9tYWluXG4gICAgfVxuXG4gICAgY29uc3QgYWxsTnVtZXJpY1ggPSBhbGxEYXRhUG9pbnRzLmV2ZXJ5KChkKSA9PiB0eXBlb2YgZC54ID09PSAnbnVtYmVyJyk7XG5cbiAgICBpZiAoYWxsTnVtZXJpY1gpIHtcbiAgICAgIGNvbnN0IHhNYXggPSB0aGlzLmQzLm1heChhbGxEYXRhUG9pbnRzLCAoZCkgPT4gZC54IGFzIG51bWJlcikgPz8gMDtcblxuICAgICAgaWYgKHhNYXggPT09IDApIHtcbiAgICAgICAgLy8gSWYgYWxsIHZhbHVlcyBhcmUgMCwgc2hvdyAtMSB0byAxIHJhbmdlXG4gICAgICAgIHRoaXMueFNjYWxlID0gdGhpcy5kM1xuICAgICAgICAgIC5zY2FsZUxpbmVhcigpXG4gICAgICAgICAgLmRvbWFpbihbLTEsIDFdKVxuICAgICAgICAgIC5yYW5nZShbMCwgdGhpcy53aWR0aF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWx3YXlzIHN0YXJ0IFggYXhpcyBmcm9tIDAgZm9yIG51bWVyaWMgZGF0YVxuICAgICAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsIHhNYXhdKS5yYW5nZShbMCwgdGhpcy53aWR0aF0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDNcbiAgICAgICAgLnNjYWxlQmFuZCgpXG4gICAgICAgIC5kb21haW4oYWxsRGF0YVBvaW50cy5tYXAoKGQpID0+IFN0cmluZyhkLngpKSlcbiAgICAgICAgLnJhbmdlKFswLCB0aGlzLndpZHRoXSlcbiAgICAgICAgLnBhZGRpbmdJbm5lcigwLjIpXG4gICAgICAgIC5wYWRkaW5nT3V0ZXIoMCk7XG4gICAgfVxuXG4gICAgY29uc3QgeUF4aXNTdGFydHNBdFplcm8gPSBjaGFydE9wdGlvbnMueUF4aXNTdGFydHNBdFplcm8gIT09IGZhbHNlO1xuICAgIGxldCB5TWluID0gdGhpcy5kMy5taW4oYWxsRGF0YVBvaW50cywgKGQpID0+IGQueSkgPz8gMDtcbiAgICBpZiAoeUF4aXNTdGFydHNBdFplcm8pIHtcbiAgICAgIHlNaW4gPSBNYXRoLm1pbigwLCB5TWluKTtcbiAgICB9XG4gICAgY29uc3QgeU1heCA9IHRoaXMuZDMubWF4KGFsbERhdGFQb2ludHMsIChkKSA9PiBkLnkpID8/IDA7XG4gICAgY29uc3QgeVJhbmdlID0geU1heCAtIHlNaW47XG5cbiAgICB0aGlzLnlTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFt5TWluLCB5TWF4ICsgeVJhbmdlICogcGFkZGluZ011bHRpcGxpZXJdKVxuICAgICAgLm5pY2UoKVxuICAgICAgLnJhbmdlKFt0aGlzLmhlaWdodCwgMF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKG9wdGlvbnM6IEFYTGluZUNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93R3JpZCA9IG9wdGlvbnMuc2hvd0dyaWQgIT09IGZhbHNlO1xuICAgIGNvbnN0IGlzQmFuZFNjYWxlID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNSdGwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyID09PSAncnRsJyB8fCBkb2N1bWVudC5ib2R5LmRpciA9PT0gJ3J0bCc7XG4gICAgY29uc3QgYXhlc0dyb3VwID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4ZXMnKTtcblxuICAgIGlmIChzaG93WEF4aXMpIHtcbiAgICAgIGxldCB4QXhpc0dlbmVyYXRvcjtcbiAgICAgIGxldCBpdGVtQ291bnQgPSAwO1xuXG4gICAgICBpZiAoaXNCYW5kU2NhbGUpIHtcbiAgICAgICAgLy8gQmFuZCBzY2FsZSAoY2F0ZWdvcmljYWwgZGF0YSlcbiAgICAgICAgaXRlbUNvdW50ID0gdGhpcy54U2NhbGUuZG9tYWluKCkubGVuZ3RoO1xuXG4gICAgICAgIC8vIFNtYXJ0IHRpY2sgcmVkdWN0aW9uIGZvciBtYW55IGl0ZW1zIChsaWtlIGJhciBjaGFydClcbiAgICAgICAgbGV0IHRpY2tWYWx1ZXM6IHN0cmluZ1tdID0gdGhpcy54U2NhbGUuZG9tYWluKCkgYXMgc3RyaW5nW107XG4gICAgICAgIGlmIChpdGVtQ291bnQgPiB0aGlzLlZFUllfTUFOWV9JVEVNU19USFJFU0hPTEQpIHtcbiAgICAgICAgICAvLyBTaG93IGV2ZXJ5IDV0aCB0aWNrIGZvciA1MCsgaXRlbXNcbiAgICAgICAgICB0aWNrVmFsdWVzID0gdGlja1ZhbHVlcy5maWx0ZXIoKF9kLCBpKSA9PiBpICUgNSA9PT0gMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbUNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgICAgIC8vIFNob3cgZXZlcnkgMm5kIHRpY2sgZm9yIDIwLTUwIGl0ZW1zXG4gICAgICAgICAgdGlja1ZhbHVlcyA9IHRpY2tWYWx1ZXMuZmlsdGVyKChfZCwgaSkgPT4gaSAlIDIgPT09IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgeEF4aXNHZW5lcmF0b3IgPSB0aGlzLmQzXG4gICAgICAgICAgLmF4aXNCb3R0b20odGhpcy54U2NhbGUpXG4gICAgICAgICAgLnRpY2tWYWx1ZXModGlja1ZhbHVlcylcbiAgICAgICAgICAudGlja1NpemUoNSlcbiAgICAgICAgICAudGlja1BhZGRpbmcoOClcbiAgICAgICAgICAudGlja0Zvcm1hdCgoZDogZDMuQXhpc0RvbWFpbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBTdHJpbmcoZCk7XG4gICAgICAgICAgICAvLyBUcnVuY2F0ZSBsb25nIGxhYmVscyBpbnRlbGxpZ2VudGx5XG4gICAgICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBpdGVtQ291bnQgPiB0aGlzLk1BTllfSVRFTVNfVEhSRVNIT0xEID8gMTAgOiB0aGlzLk1BWF9MQUJFTF9MRU5HVEg7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cnVuY2F0ZUxhYmVsKGxhYmVsLCBtYXhMZW5ndGgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTGluZWFyIHNjYWxlIChudW1lcmljIGRhdGEpXG4gICAgICAgIC8vIExldCBEMyBkZXRlcm1pbmUgb3B0aW1hbCB0aWNrIGNvdW50LCBidXQgZW5zdXJlIHdlIHNob3cgcmVhc29uYWJsZSBudW1iZXJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9wdGltYWwgdGljayBjb3VudCBiYXNlZCBvbiB3aWR0aFxuICAgICAgICBjb25zdCBvcHRpbWFsVGlja0NvdW50ID0gTWF0aC5taW4oMTIsIE1hdGgubWF4KDUsIE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDgwKSkpO1xuXG4gICAgICAgIHhBeGlzR2VuZXJhdG9yID0gdGhpcy5kM1xuICAgICAgICAgIC5heGlzQm90dG9tKHRoaXMueFNjYWxlKVxuICAgICAgICAgIC50aWNrcyhvcHRpbWFsVGlja0NvdW50KVxuICAgICAgICAgIC50aWNrU2l6ZSg1KVxuICAgICAgICAgIC50aWNrUGFkZGluZyg4KVxuICAgICAgICAgIC50aWNrRm9ybWF0KChkOiBkMy5BeGlzRG9tYWluKSA9PiB7XG4gICAgICAgICAgICAvLyBGb3JtYXQgbnVtYmVycyBuaWNlbHlcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihkKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhudW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bS50b0ZpeGVkKDEpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGl0ZW1Db3VudCA9IG9wdGltYWxUaWNrQ291bnQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMueEF4aXMgPSBheGVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4aXMteCcpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt0aGlzLmhlaWdodH0pYClcbiAgICAgICAgLmNhbGwoeEF4aXNHZW5lcmF0b3IpO1xuXG4gICAgICAvLyBTdHlsZSB0aGUgeC1heGlzIHBhdGggYW5kIGxpbmVzXG4gICAgICB0aGlzLnhBeGlzLnNlbGVjdEFsbCgncGF0aCcpLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1heGlzLWNvbG9yKSwgMC4yKScpO1xuXG4gICAgICB0aGlzLnhBeGlzXG4gICAgICAgIC5zZWxlY3RBbGwoJ2xpbmUnKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpLCAwLjIpJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNoYXJyYXknLCAnMiwyJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuNScpO1xuXG4gICAgICBjb25zdCBkeW5hbWljWEF4aXNUaWNrRm9udFNpemUgPSB0aGlzLmNhbGN1bGF0ZUR5bmFtaWNGb250U2l6ZShcbiAgICAgICAgdGhpcy53aWR0aCxcbiAgICAgICAgNDUsXG4gICAgICAgIHRoaXMuTUlOX0ZPTlRfU0laRV9YLFxuICAgICAgICB0aGlzLk1BWF9GT05UX1NJWkVfWCxcbiAgICAgICk7XG4gICAgICBjb25zdCB4QXhpc1RpY2tzID0gdGhpcy54QXhpc1xuICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtkeW5hbWljWEF4aXNUaWNrRm9udFNpemV9cHhgKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzQwMCcpXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1sYWJlbHMtY29sb3IpLCAwLjcpJyk7XG5cbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgcm90YXRlIGxhYmVscyBpZiB0aGV5IGFyZSBsaWtlbHkgdG8gb3ZlcmxhcCAob25seSBmb3IgYmFuZCBzY2FsZSlcbiAgICAgIGxldCBsYWJlbHNBcmVSb3RhdGVkID0gZmFsc2U7XG4gICAgICBpZiAoaXNCYW5kU2NhbGUgJiYgdGhpcy54U2NhbGUuYmFuZHdpZHRoICYmIHRoaXMueFNjYWxlLmRvbWFpbigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMueFNjYWxlLnN0ZXAoKTtcbiAgICAgICAgY29uc3QgbG9uZ2VzdExhYmVsID0gdGhpcy54U2NhbGUuZG9tYWluKCkucmVkdWNlKChhLCBiKSA9PiAoYS5sZW5ndGggPiBiLmxlbmd0aCA/IGEgOiBiKSwgJycpO1xuICAgICAgICAvLyBVc2luZyBjaGFyIHdpZHRoIHJhdGlvIGNvbnN0YW50IGZvciBiZXR0ZXIgZXN0aW1hdGVcbiAgICAgICAgY29uc3QgZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggPSBsb25nZXN0TGFiZWwubGVuZ3RoICogZHluYW1pY1hBeGlzVGlja0ZvbnRTaXplICogdGhpcy5DSEFSX1dJRFRIX1JBVElPO1xuXG4gICAgICAgIGlmIChlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA+IHN0ZXApIHtcbiAgICAgICAgICBsYWJlbHNBcmVSb3RhdGVkID0gdHJ1ZTtcbiAgICAgICAgICB4QXhpc1RpY2tzXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtNDUpJylcbiAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnZW5kJylcbiAgICAgICAgICAgIC5hdHRyKCdkeCcsICctMC44ZW0nKVxuICAgICAgICAgICAgLmF0dHIoJ2R5JywgJzAuMTVlbScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc2hvdyBYLWF4aXMgdGl0bGUgaWYgbGFiZWxzIGFyZSBOT1Qgcm90YXRlZCBhbmQgaXRlbSBjb3VudCBpcyByZWFzb25hYmxlXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIG92ZXJsYXAgd2l0aCByb3RhdGVkIGxhYmVscyBhbmQgaW1wcm92ZXMgcmVhZGFiaWxpdHlcbiAgICAgIGNvbnN0IHNob3VsZFNob3dYQXhpc1RpdGxlID0gb3B0aW9ucy54QXhpc0xhYmVsICYmICFsYWJlbHNBcmVSb3RhdGVkICYmIGl0ZW1Db3VudCA8PSB0aGlzLk1BTllfSVRFTVNfVEhSRVNIT0xEO1xuXG4gICAgICBpZiAoc2hvdWxkU2hvd1hBeGlzVGl0bGUpIHtcbiAgICAgICAgYXhlc0dyb3VwXG4gICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYXhpcy1sYWJlbCBheC14LWF4aXMtbGFiZWwnKVxuICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCd4JywgdGhpcy53aWR0aCAvIDIpXG4gICAgICAgICAgLmF0dHIoJ3knLCB0aGlzLmhlaWdodCArIHRoaXMubWFyZ2luLmJvdHRvbSAtIDUpXG4gICAgICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgICAgICBmaWxsOiByZ2IodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LXRleHQtY29sb3IpKTtcbiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICAgIGAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC50ZXh0KG9wdGlvbnMueEF4aXNMYWJlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dZQXhpcykge1xuICAgICAgLy8gQ3JlYXRlIFkgYXhpcyB3aXRoIHNtYXJ0IG51bWJlciBmb3JtYXR0aW5nXG4gICAgICBjb25zdCB5QXhpc0dlbmVyYXRvciA9IHRoaXMuZDNcbiAgICAgICAgLmF4aXNMZWZ0KHRoaXMueVNjYWxlKVxuICAgICAgICAudGlja1NpemUoNSlcbiAgICAgICAgLnRpY2tQYWRkaW5nKDgpXG4gICAgICAgIC50aWNrRm9ybWF0KCh2YWx1ZTogbnVtYmVyIHwgeyB2YWx1ZU9mKCk6IG51bWJlciB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgbnVtVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiB2YWx1ZS52YWx1ZU9mKCk7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKG51bVZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIFJlZHVjZSB0aWNrIGNvdW50IGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgd2l0aCBsYXJnZSBudW1iZXJzXG4gICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMueVNjYWxlLmRvbWFpbigpWzFdO1xuICAgICAgaWYgKG1heFZhbHVlID4gMWU2KSB7XG4gICAgICAgIHlBeGlzR2VuZXJhdG9yLnRpY2tzKDYpOyAvLyBGZXdlciB0aWNrcyBmb3IgbWlsbGlvbnMrXG4gICAgICB9IGVsc2UgaWYgKG1heFZhbHVlID4gMWUzKSB7XG4gICAgICAgIHlBeGlzR2VuZXJhdG9yLnRpY2tzKDgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnlBeGlzID0gYXhlc0dyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYXhpcy15JykuY2FsbCh5QXhpc0dlbmVyYXRvcik7XG5cbiAgICAgIC8vIFN0eWxlIHRoZSB5LWF4aXMgcGF0aCBhbmQgbGluZXNcbiAgICAgIHRoaXMueUF4aXMuc2VsZWN0QWxsKCdwYXRoJykuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWF4aXMtY29sb3IpLCAwLjIpJyk7XG5cbiAgICAgIHRoaXMueUF4aXNcbiAgICAgICAgLnNlbGVjdEFsbCgnbGluZScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAncmdiYSh2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtZ3JpZC1saW5lcy1jb2xvciksIDAuMiknKVxuICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hhcnJheScsICcyLDInKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC41Jyk7XG5cbiAgICAgIGNvbnN0IGR5bmFtaWNZQXhpc1RpY2tGb250U2l6ZSA9IHRoaXMuY2FsY3VsYXRlRHluYW1pY0ZvbnRTaXplKFxuICAgICAgICB0aGlzLmhlaWdodCxcbiAgICAgICAgMzAsXG4gICAgICAgIHRoaXMuTUlOX0ZPTlRfU0laRV9ZLFxuICAgICAgICB0aGlzLk1BWF9GT05UX1NJWkVfWSxcbiAgICAgICk7XG4gICAgICBjb25zdCB5VGlja1RleHRzID0gdGhpcy55QXhpcy5zZWxlY3RBbGwoJ3RleHQnKS5hdHRyKFxuICAgICAgICAnc3R5bGUnLFxuICAgICAgICBgXG4gICAgICAgICAgZm9udC1zaXplOiAke2R5bmFtaWNZQXhpc1RpY2tGb250U2l6ZX1weDtcbiAgICAgICAgICBmb250LXdlaWdodDogNDAwO1xuICAgICAgICAgIGZpbGw6IHJnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWxhYmVscy1jb2xvciksIDAuNyk7XG4gICAgICAgIGAsXG4gICAgICApO1xuXG4gICAgICBpZiAoaXNSdGwpIHtcbiAgICAgICAgeVRpY2tUZXh0cy5hdHRyKCd0ZXh0LWFuY2hvcicsICdzdGFydCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy55QXhpc0xhYmVsKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBwcm9wZXIgcG9zaXRpb24gZm9yIFktYXhpcyB0aXRsZVxuICAgICAgICAvLyBQb3NpdGlvbiBpdCB0byB0aGUgbGVmdCBvZiB0aGUgdGljayBsYWJlbHMgd2l0aCBwcm9wZXIgc3BhY2luZ1xuICAgICAgICBjb25zdCBtYXhUaWNrTGFiZWxXaWR0aCA9IHRoaXMuY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5ZX0FYSVNfUEFERElORztcblxuICAgICAgICAvLyBQb3NpdGlvbiB0aXRsZSB0byB0aGUgbGVmdCBvZiB0aGUgdGljayBsYWJlbHNcbiAgICAgICAgY29uc3QgbGFiZWxZID0gLW1heFRpY2tMYWJlbFdpZHRoIC0gcGFkZGluZztcblxuICAgICAgICAvLyBDZW50ZXIgdGhlIHRpdGxlIHZlcnRpY2FsbHlcbiAgICAgICAgY29uc3QgbGFiZWxYID0gLXRoaXMuaGVpZ2h0IC8gMjtcblxuICAgICAgICBheGVzR3JvdXBcbiAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1heGlzLWxhYmVsIGF4LXktYXhpcy1sYWJlbCcpXG4gICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXG4gICAgICAgICAgLmF0dHIoJ3gnLCBsYWJlbFgpXG4gICAgICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKVxuICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgICAgICBmaWxsOiByZ2IodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LXRleHQtY29sb3IpKTtcbiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICAgIGAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC50ZXh0KG9wdGlvbnMueUF4aXNMYWJlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dHcmlkKSB7XG4gICAgICBjb25zdCBncmlkR3JvdXAgPSB0aGlzLmNoYXJ0XG4gICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1ncmlkLWNvbnRhaW5lcicpXG4gICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICAgIGNvbnN0IHlHcmlkID0gZ3JpZEdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1ncmlkJylcbiAgICAgICAgLmNhbGwoXG4gICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgLmF4aXNMZWZ0KHRoaXMueVNjYWxlKVxuICAgICAgICAgICAgLnRpY2tTaXplKC10aGlzLndpZHRoKVxuICAgICAgICAgICAgLnRpY2tGb3JtYXQoKCkgPT4gJycpXG4gICAgICAgICAgICAudGlja1ZhbHVlcyh0aGlzLnlTY2FsZS50aWNrcygpKSxcbiAgICAgICAgKTtcblxuICAgICAgLy8gU3R5bGUgdGhlIGdyaWQgcGF0aCBhbmQgbGluZXNcbiAgICAgIHlHcmlkLnNlbGVjdEFsbCgncGF0aCcpLmF0dHIoJ3N0cm9rZS13aWR0aCcsICcwJyk7XG5cbiAgICAgIHlHcmlkXG4gICAgICAgIC5zZWxlY3RBbGwoJy50aWNrJylcbiAgICAgICAgLnNlbGVjdEFsbCgnbGluZScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAncmdiYSh2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtZ3JpZC1saW5lcy1jb2xvciksIDAuMiknKVxuICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hhcnJheScsICcyLDInKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC41Jyk7XG5cbiAgICAgIGlmIChvcHRpb25zLnNob3dWZXJ0aWNhbEdyaWQpIHtcbiAgICAgICAgY29uc3QgeEdyaWQgPSBncmlkR3JvdXBcbiAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1ncmlkLXZlcnRpY2FsJylcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7dGhpcy5oZWlnaHR9KWApXG4gICAgICAgICAgLmNhbGwoXG4gICAgICAgICAgICB0aGlzLmQzXG4gICAgICAgICAgICAgIC5heGlzQm90dG9tKHRoaXMueFNjYWxlKVxuICAgICAgICAgICAgICAudGlja1NpemUoLXRoaXMuaGVpZ2h0KVxuICAgICAgICAgICAgICAudGlja0Zvcm1hdCgoKSA9PiAnJylcbiAgICAgICAgICAgICAgLnRpY2tWYWx1ZXMoaXNCYW5kU2NhbGUgPyB1bmRlZmluZWQgOiB0aGlzLnhTY2FsZS50aWNrcygpKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIFN0eWxlIHRoZSB2ZXJ0aWNhbCBncmlkIHBhdGggYW5kIGxpbmVzXG4gICAgICAgIHhHcmlkLnNlbGVjdEFsbCgncGF0aCcpLmF0dHIoJ3N0cm9rZS13aWR0aCcsICcwJyk7XG5cbiAgICAgICAgeEdyaWRcbiAgICAgICAgICAuc2VsZWN0QWxsKCcudGljaycpXG4gICAgICAgICAgLnNlbGVjdEFsbCgnbGluZScpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSwgMC4xNSknKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzIsMicpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuNScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTGluZXMoYWxsU2VyaWVzRGF0YTogKEFYTGluZUNoYXJ0RGF0YSAmIHsgb3JpZ2luYWxJbmRleDogbnVtYmVyIH0pW10pOiB2b2lkIHtcbiAgICBjb25zdCBpc0JhbmRTY2FsZSA9IHRoaXMueFNjYWxlLmJhbmR3aWR0aCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZ2V0WCA9IChkOiB7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH0pID0+IHtcbiAgICAgIGlmIChpc0JhbmRTY2FsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy54U2NhbGUoU3RyaW5nKGQueCkpICsgdGhpcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFNjYWxlKGQueCBhcyBudW1iZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBsaW5lR2VuZXJhdG9yID0gdGhpcy5kM1xuICAgICAgLmxpbmU8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PigpXG4gICAgICAueChnZXRYKVxuICAgICAgLnkoKGQpID0+IHRoaXMueVNjYWxlKGQueSkpIGFzIGQzLkxpbmU8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PjtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zbW9vdGhMaW5lICE9PSBmYWxzZSkge1xuICAgICAgbGluZUdlbmVyYXRvci5jdXJ2ZSh0aGlzLmQzLmN1cnZlTW9ub3RvbmVYKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcmVhR2VuZXJhdG9yID0gdGhpcy5kM1xuICAgICAgLmFyZWE8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PigpXG4gICAgICAueChnZXRYKVxuICAgICAgLnkwKHRoaXMuaGVpZ2h0KVxuICAgICAgLnkxKChkKSA9PiB0aGlzLnlTY2FsZShkLnkpKTtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zbW9vdGhMaW5lICE9PSBmYWxzZSkge1xuICAgICAgYXJlYUdlbmVyYXRvci5jdXJ2ZSh0aGlzLmQzLmN1cnZlTW9ub3RvbmVYKTtcbiAgICB9XG5cbiAgICB0aGlzLnN2Zy5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFuaW1hdGluZycpO1xuXG4gICAgY29uc3QgYWxsU2VyaWVzR3JvdXAgPSB0aGlzLmNoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFsbC1zZXJpZXMnKVxuICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgIGNvbnN0IGFsbFBvaW50c0dyb3VwID0gdGhpcy5jaGFydFxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1hbGwtcG9pbnRzJylcbiAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0Nyb3NzaGFpciA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWNyb3NzaGFpcicpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICBhbGxTZXJpZXNEYXRhLmZvckVhY2goKHNlcmllcykgPT4ge1xuICAgICAgY29uc3Qgc2VyaWVzSWRlbnRpZmllciA9IHRoaXMuZ2V0U2VyaWVzSWRlbnRpZmllcihzZXJpZXMpO1xuXG4gICAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKHNlcmllc0lkZW50aWZpZXIpKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2VyaWVzRWxlbWVudHMoc2VyaWVzSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghc2VyaWVzLmRhdGEgfHwgc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNlcmllc0dyb3VwID0gYWxsU2VyaWVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1saW5lLWNoYXJ0LXNlcmllcyBheC1saW5lLWNoYXJ0LXNlcmllcy0ke3Nlcmllcy5vcmlnaW5hbEluZGV4fWApXG4gICAgICAgIC5hdHRyKCdkYXRhLXNlcmllcy1pZGVudGlmaWVyJywgc2VyaWVzSWRlbnRpZmllcilcbiAgICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgICAgY29uc3QgbGluZUNvbG9yID0gc2VyaWVzLmxpbmVDb2xvciB8fCBnZXRDaGFydENvbG9yKHNlcmllcy5vcmlnaW5hbEluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcbiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IHNlcmllcy5maWxsQ29sb3IgfHwgbGluZUNvbG9yO1xuXG4gICAgICBjb25zdCBsaW5lID0gc2VyaWVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5kYXR1bShzZXJpZXMuZGF0YSlcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtbGluZScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBsaW5lQ29sb3IpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5saW5lV2lkdGggPz8gdGhpcy5ERUZBVUxUX0xJTkVfV0lEVEgpXG4gICAgICAgIC5hdHRyKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKVxuICAgICAgICAuYXR0cignc3Ryb2tlLWxpbmVjYXAnLCAncm91bmQnKVxuICAgICAgICAuYXR0cignZCcsIGxpbmVHZW5lcmF0b3IpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxuICAgICAgICAuYXR0cignc3R5bGUnLCAndHJhbnNpdGlvbjogc3Ryb2tlLXdpZHRoIDAuM3MgZWFzZTsnKVxuICAgICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuXG4gICAgICBsaW5lXG4gICAgICAgIC5vbignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgICAgICBsaW5lXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICdzdHJva2Utd2lkdGgnLFxuICAgICAgICAgICAgICAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IHRoaXMuREVGQVVMVF9MSU5FX1dJRFRIKSAqIHRoaXMuTElORV9ISUdITElHSFRfTVVMVElQTElFUixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICBsaW5lXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmxpbmVXaWR0aCA/PyB0aGlzLkRFRkFVTFRfTElORV9XSURUSCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxpbmUubm9kZSgpLmdldFRvdGFsTGVuZ3RoKCk7XG4gICAgICBsaW5lXG4gICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgdG90YWxMZW5ndGggKyAnICcgKyB0b3RhbExlbmd0aClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNob2Zmc2V0JywgdG90YWxMZW5ndGgpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpXG4gICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaG9mZnNldCcsIDApXG4gICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxpbmUuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZmlsbEFyZWEpIHtcbiAgICAgICAgY29uc3QgYXJlYSA9IHNlcmllc0dyb3VwXG4gICAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgLmRhdHVtKHNlcmllcy5kYXRhKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFyZWEnKVxuICAgICAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAuYXR0cignZCcsIGFyZWFHZW5lcmF0b3IpXG4gICAgICAgICAgLmF0dHIoJ3N0eWxlJywgJ3RyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOycpXG4gICAgICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgICAgICBhcmVhXG4gICAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgICAgYXJlYVxuICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgIC5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgKCh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5maWxsT3BhY2l0eSA/PyAyMCkgLyAxMDApICogMS41KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgICAgICAgICAuYXR0cignb3BhY2l0eScsICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5maWxsT3BhY2l0eSA/PyAyMCkgLyAxMDApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGFyZWFcbiAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZylcbiAgICAgICAgICAuYXR0cignb3BhY2l0eScsICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5maWxsT3BhY2l0eSA/PyAyMCkgLyAxMDApXG4gICAgICAgICAgLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhcmVhLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dQb2ludHMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBwb2ludE1hcCA9IG5ldyBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgQXJyYXk8e1xuICAgICAgICAgIHBvaW50OiB7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH07XG4gICAgICAgICAgc2VyaWVzOiBBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9O1xuICAgICAgICAgIG9yaWdpbmFsSW5kZXg6IG51bWJlcjtcbiAgICAgICAgfT5cbiAgICAgID4oKTtcblxuICAgICAgYWxsU2VyaWVzRGF0YS5mb3JFYWNoKChzZXJpZXMpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzSWRlbnRpZmllciA9IHRoaXMuZ2V0U2VyaWVzSWRlbnRpZmllcihzZXJpZXMpO1xuICAgICAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKHNlcmllc0lkZW50aWZpZXIpIHx8ICFzZXJpZXMuZGF0YSB8fCBzZXJpZXMuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2ludERhdGEgPSB0aGlzLmdldFJlZHVjZWREYXRhUG9pbnRzKHNlcmllcy5kYXRhLCB0aGlzLk1BWF9QT0lOVFNfVE9fUkVOREVSKTtcblxuICAgICAgICBwb2ludERhdGEuZm9yRWFjaCgocG9pbnQpID0+IHtcbiAgICAgICAgICBjb25zdCB4ID0gZ2V0WChwb2ludCk7XG4gICAgICAgICAgY29uc3QgeSA9IHRoaXMueVNjYWxlKHBvaW50LnkpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY3JlYXRlUG9pbnRLZXkoeCwgeSk7XG5cbiAgICAgICAgICBpZiAoIXBvaW50TWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBwb2ludE1hcC5zZXQoa2V5LCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50TWFwLmdldChrZXkpPy5wdXNoKHsgcG9pbnQsIHNlcmllcywgb3JpZ2luYWxJbmRleDogc2VyaWVzLm9yaWdpbmFsSW5kZXggfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBhbmltYXRpb25Db3VudGVyID0gMDtcbiAgICAgIGNvbnN0IHRvdGFsVmlzaWJsZVNlcmllc0NvdW50ID0gYWxsU2VyaWVzRGF0YS5maWx0ZXIoXG4gICAgICAgIChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHRoaXMuZ2V0U2VyaWVzSWRlbnRpZmllcihzKSkgJiYgcy5kYXRhICYmIHMuZGF0YS5sZW5ndGggPiAwLFxuICAgICAgKS5sZW5ndGg7XG5cbiAgICAgIGFsbFNlcmllc0RhdGEuZm9yRWFjaCgoc2VyaWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc0lkZW50aWZpZXIgPSB0aGlzLmdldFNlcmllc0lkZW50aWZpZXIoc2VyaWVzKTtcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzZXJpZXNJZGVudGlmaWVyKSB8fCAhc2VyaWVzLmRhdGEgfHwgc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZUNvbG9yID0gc2VyaWVzLmxpbmVDb2xvciB8fCBnZXRDaGFydENvbG9yKHNlcmllcy5vcmlnaW5hbEluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcbiAgICAgICAgY29uc3QgcG9pbnRzR3JvdXAgPSBhbGxQb2ludHNHcm91cFxuICAgICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1saW5lLWNoYXJ0LXBvaW50cyBheC1saW5lLWNoYXJ0LXBvaW50cy0ke3Nlcmllcy5vcmlnaW5hbEluZGV4fWApXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtc2VyaWVzLWlkZW50aWZpZXInLCBzZXJpZXNJZGVudGlmaWVyKVxuICAgICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICAgICAgcG9pbnRzR3JvdXBcbiAgICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLmhhbmRsZVBvaW50R3JvdXBFbnRlcihzZXJpZXMub3JpZ2luYWxJbmRleCkpXG4gICAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5oYW5kbGVQb2ludEdyb3VwTGVhdmUoKSk7XG5cbiAgICAgICAgY29uc3QgcG9pbnREYXRhID0gdGhpcy5nZXRSZWR1Y2VkRGF0YVBvaW50cyhzZXJpZXMuZGF0YSwgdGhpcy5NQVhfUE9JTlRTX1RPX1JFTkRFUik7XG5cbiAgICAgICAgcG9pbnRzR3JvdXBcbiAgICAgICAgICAuc2VsZWN0QWxsKCdjaXJjbGUnKVxuICAgICAgICAgIC5kYXRhKHBvaW50RGF0YSlcbiAgICAgICAgICAuZW50ZXIoKVxuICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtcG9pbnQnKVxuICAgICAgICAgIC5hdHRyKCdjeCcsIGdldFgpXG4gICAgICAgICAgLmF0dHIoJ2N5JywgKGQpID0+IHRoaXMueVNjYWxlKGQueSkpXG4gICAgICAgICAgLmF0dHIoJ3InLCAwKVxuICAgICAgICAgIC5hdHRyKCdmaWxsJywgbGluZUNvbG9yKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnI2ZmZicpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEteCcsIChkKSA9PiBkLngpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEteScsIChkKSA9PiBkLnkpXG4gICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudDogTW91c2VFdmVudCwgZDogeyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4ID0gZ2V0WChkKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLnlTY2FsZShkLnkpO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVQb2ludEtleSh4LCB5KTtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nUG9pbnRzID0gcG9pbnRNYXAuZ2V0KGtleSkgfHwgW107XG5cbiAgICAgICAgICAgIGlmIChvdmVybGFwcGluZ1BvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlT3ZlcmxhcHBpbmdQb2ludHNIb3ZlcihldmVudCwgb3ZlcmxhcHBpbmdQb2ludHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQb2ludEhvdmVyKGV2ZW50LCBkLCBzZXJpZXMsIHNlcmllcy5vcmlnaW5hbEluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgICAuc2VsZWN0KGV2ZW50LnRhcmdldCBhcyBTVkdDaXJjbGVFbGVtZW50KVxuICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgIC5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAgICAgICAgIC5hdHRyKCdyJywgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnBvaW50UmFkaXVzID8/IDQpICogMS41KVxuICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMilcbiAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZScsIGByZ2IodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWJnLWNvbG9yKSlgKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCkpXG4gICAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgICAuc2VsZWN0KGV2ZW50LnRhcmdldCBhcyBTVkdDaXJjbGVFbGVtZW50KVxuICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgIC5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAgICAgICAgIC5hdHRyKCdyJywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkucG9pbnRSYWRpdXMgPz8gdGhpcy5ERUZBVUxUX1BPSU5UX1JBRElVUylcbiAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEpXG4gICAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnI2ZmZicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdjbGljaycsIChldmVudDogTW91c2VFdmVudCwgZDogeyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4ID0gZ2V0WChkKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLnlTY2FsZShkLnkpO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVQb2ludEtleSh4LCB5KTtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nUG9pbnRzID0gcG9pbnRNYXAuZ2V0KGtleSkgfHwgW107XG5cbiAgICAgICAgICAgIGlmIChvdmVybGFwcGluZ1BvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIG92ZXJsYXBwaW5nUG9pbnRzLmZvckVhY2goKHsgcG9pbnQsIHNlcmllcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQb2ludENsaWNrKGV2ZW50LCBwb2ludCwgc2VyaWVzKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBvaW50Q2xpY2soZXZlbnQsIGQsIHNlcmllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgLmRlbGF5KFxuICAgICAgICAgICAgKF9kOiB7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH0sIGk6IG51bWJlcikgPT5cbiAgICAgICAgICAgICAgaSAqIE1hdGgubWluKHRoaXMuUE9JTlRfQU5JTUFUSU9OX0RFTEFZX01TLCAoYW5pbWF0aW9uRHVyYXRpb24gfHwgMCkgKiAwLjA1KSArXG4gICAgICAgICAgICAgIChhbmltYXRpb25EdXJhdGlvbiB8fCAwKSAqIHRoaXMuUE9JTlRfQU5JTUFUSU9OX0RFTEFZX1JBVElPLFxuICAgICAgICAgIClcbiAgICAgICAgICAuZHVyYXRpb24oKGFuaW1hdGlvbkR1cmF0aW9uIHx8IDApICogdGhpcy5QT0lOVF9BTklNQVRJT05fRFVSQVRJT05fUkFUSU8pXG4gICAgICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgICAgIC5hdHRyKCdyJywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkucG9pbnRSYWRpdXMgPz8gdGhpcy5ERUZBVUxUX1BPSU5UX1JBRElVUylcbiAgICAgICAgICAub24oJ2VuZCcsIChkLCBpLCBub2RlcykgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPT09IG5vZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uQ291bnRlcisrO1xuICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uQ291bnRlciA+PSB0b3RhbFZpc2libGVTZXJpZXNDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlUG9pbnRlckV2ZW50c0FmdGVyQW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZW5hYmxlUG9pbnRlckV2ZW50c0FmdGVyQW5pbWF0aW9uKCksIChhbmltYXRpb25EdXJhdGlvbiB8fCAwKSArIHRoaXMuQU5JTUFUSU9OX0VORF9CVUZGRVIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlUG9pbnRlckV2ZW50c0FmdGVyQW5pbWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFydCB8fCAhdGhpcy5zdmcpIHJldHVybjtcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtYWxsLXNlcmllcycpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1zZXJpZXMnKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTtcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtbGluZScpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1hcmVhJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LWFsbC1wb2ludHMnKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTtcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtcG9pbnRzJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LXBvaW50JykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5zdmcuY2xhc3NlZCgnYXgtbGluZS1jaGFydC1hbmltYXRpbmcnLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBvaW50R3JvdXBFbnRlcihvcmlnaW5hbEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0XG4gICAgICAuc2VsZWN0KGAuYXgtbGluZS1jaGFydC1zZXJpZXMtJHtvcmlnaW5hbEluZGV4fSAuYXgtbGluZS1jaGFydC1saW5lYClcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3N0cm9rZS13aWR0aCcsXG4gICAgICAgICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5saW5lV2lkdGggPz8gdGhpcy5ERUZBVUxUX0xJTkVfV0lEVEgpICogdGhpcy5MSU5FX0hJR0hMSUdIVF9NVUxUSVBMSUVSLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRHcm91cExlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnRcbiAgICAgIC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LWxpbmUnKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKHRoaXMuSE9WRVJfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5saW5lV2lkdGggPz8gdGhpcy5ERUZBVUxUX0xJTkVfV0lEVEgpO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dDcm9zc2hhaXIgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2hhcnQuc2VsZWN0KCcuYXgtbGluZS1jaGFydC1jcm9zc2hhaXInKS5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJlZHVjZWREYXRhUG9pbnRzKFxuICAgIGRhdGE6IEFycmF5PHsgeDogbnVtYmVyIHwgc3RyaW5nOyB5OiBudW1iZXIgfT4sXG4gICAgbWF4UG9pbnRzOiBudW1iZXIsXG4gICk6IEFycmF5PHsgeDogbnVtYmVyIHwgc3RyaW5nOyB5OiBudW1iZXIgfT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA8PSBtYXhQb2ludHMpIHJldHVybiBkYXRhO1xuICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyBtYXhQb2ludHMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gc3RlcCkge1xuICAgICAgcmVzdWx0LnB1c2goZGF0YVtpXSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdICE9PSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0pIHtcbiAgICAgIHJlc3VsdC5wdXNoKGRhdGFbZGF0YS5sZW5ndGggLSAxXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBvaW50SG92ZXIoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgZGF0YVBvaW50OiBBWExpbmVDaGFydERhdGFbJ2RhdGEnXVtudW1iZXJdLFxuICAgIHNlcmllczogQVhMaW5lQ2hhcnREYXRhICYgeyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfSxcbiAgICBvcmlnaW5hbEluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gc2VyaWVzLmxpbmVDb2xvciB8fCBnZXRDaGFydENvbG9yKG9yaWdpbmFsSW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpO1xuXG4gICAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgICB0aXRsZTogZGF0YVBvaW50LnRvb2x0aXBMYWJlbCB8fCBzZXJpZXMudG9vbHRpcExhYmVsIHx8IHNlcmllcy5sYWJlbCB8fCBgU2VyaWVzICR7b3JpZ2luYWxJbmRleCArIDF9YCxcbiAgICAgICAgdmFsdWU6IGZvcm1hdExhcmdlTnVtYmVyKGRhdGFQb2ludC55KSxcbiAgICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcblxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dDcm9zc2hhaXIgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5zaG93Q3Jvc3NoYWlyTGluZXMoZGF0YVBvaW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dDcm9zc2hhaXJMaW5lcyhkYXRhUG9pbnQ6IHsgeDogbnVtYmVyIHwgc3RyaW5nOyB5OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IGlzQmFuZFNjYWxlID0gdGhpcy54U2NhbGUuYmFuZHdpZHRoICE9PSB1bmRlZmluZWQ7XG5cbiAgICBsZXQgeDogbnVtYmVyO1xuICAgIGlmIChpc0JhbmRTY2FsZSkge1xuICAgICAgeCA9IHRoaXMueFNjYWxlKFN0cmluZyhkYXRhUG9pbnQueCkpICsgdGhpcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0gdGhpcy54U2NhbGUoZGF0YVBvaW50LnggYXMgbnVtYmVyKTtcbiAgICB9XG4gICAgY29uc3QgeSA9IHRoaXMueVNjYWxlKGRhdGFQb2ludC55KTtcblxuICAgIGxldCBjcm9zc2hhaXJHcm91cCA9IHRoaXMuY2hhcnQuc2VsZWN0KCcuYXgtbGluZS1jaGFydC1jcm9zc2hhaXInKTtcbiAgICBpZiAoY3Jvc3NoYWlyR3JvdXAuZW1wdHkoKSkge1xuICAgICAgY3Jvc3NoYWlyR3JvdXAgPSB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtY3Jvc3NoYWlyJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgIH1cblxuICAgIGNyb3NzaGFpckdyb3VwLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuXG4gICAgY3Jvc3NoYWlyR3JvdXBcbiAgICAgIC5hcHBlbmQoJ2xpbmUnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtY3Jvc3NoYWlyLXZlcnRpY2FsJylcbiAgICAgIC5hdHRyKCd4MScsIHgpXG4gICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgLmF0dHIoJ3gyJywgeClcbiAgICAgIC5hdHRyKCd5MicsIHRoaXMuaGVpZ2h0KVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSwgMC41KScpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzMsMycpXG4gICAgICAuYXR0cignb3BhY2l0eScsIDAuNylcbiAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICBjcm9zc2hhaXJHcm91cFxuICAgICAgLmFwcGVuZCgnbGluZScpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1jcm9zc2hhaXItaG9yaXpvbnRhbCcpXG4gICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgLmF0dHIoJ3kxJywgeSlcbiAgICAgIC5hdHRyKCd4MicsIHRoaXMud2lkdGgpXG4gICAgICAuYXR0cigneTInLCB5KVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSwgMC41KScpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMSlcbiAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzMsMycpXG4gICAgICAuYXR0cignb3BhY2l0eScsIDAuNylcbiAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0b29sdGlwRWwgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY2hhcnQtdG9vbHRpcCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbCA/IHRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgY29uc3QgcG9zID0gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbihyZWN0LCB0b29sdGlwUmVjdCwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgdGhpcy5UT09MVElQX0dBUCk7XG4gICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldChwb3MpO1xuICB9XG5cbiAgLy8gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbiBtb3ZlZCB0byBzaGFyZWQgY2hhcnQgdXRpbHNcblxuICBwcml2YXRlIGhhbmRsZVBvaW50Q2xpY2soXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgZGF0YVBvaW50OiBBWExpbmVDaGFydERhdGFbJ2RhdGEnXVtudW1iZXJdLFxuICAgIHNlcmllczogQVhMaW5lQ2hhcnREYXRhICYgeyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5wb2ludENsaWNrLmVtaXQoe1xuICAgICAgc2VyaWVzOiBzZXJpZXMsIC8vIHNlcmllcyBzdGlsbCByZWZlcnMgdG8gdGhlIGZ1bGwgc2VyaWVzIGRhdGEgd2l0aCBvcmlnaW5hbEluZGV4XG4gICAgICBwb2ludDogZGF0YVBvaW50LFxuICAgICAgZXZlbnQ6IHtcbiAgICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgICBzZW5kZXI6IHRoaXMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBvbmx5IGNoYXJ0IFNWRyBhbmQgcHJldmlvdXMgZW1wdHktc3RhdGUgbWVzc2FnZXMgdG8gYXZvaWQgcmVtb3ZpbmcgdG9vbHRpcFxuICAgIHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5zZWxlY3RBbGwoJ3N2ZywgLmF4LWxpbmUtY2hhcnQtbm8tZGF0YS1tZXNzYWdlLCAuYXgtbGluZS1jaGFydC1hbGwtaGlkZGVuLW1lc3NhZ2UnKVxuICAgICAgLnJlbW92ZSgpO1xuICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtbm8tZGF0YS1tZXNzYWdlJylcbiAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgLnN0eWxlKCdsZWZ0JywgJzUwJScpXG4gICAgICAuc3R5bGUoJ3RvcCcsICc1MCUnKVxuICAgICAgLnN0eWxlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC01MCUsIC01MCUpJyk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtbm8tZGF0YS1pY29uJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjYnKVxuICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzAuNzVyZW0nKVxuICAgICAgLmh0bWwoYDxpIGNsYXNzPVwiJHt0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhSWNvbn0gZmEtMnhcIj48L2k+YCk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtbm8tZGF0YS10ZXh0JylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzFyZW0nKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxuICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzAuNXJlbScpXG4gICAgICAudGV4dCh0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1uby1kYXRhLWhlbHAnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMC44cmVtJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjYnKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLm5vRGF0YUhlbHApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93QWxsU2VyaWVzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBvbmx5IGNoYXJ0IFNWRyBhbmQgcHJldmlvdXMgZW1wdHktc3RhdGUgbWVzc2FnZXMgdG8gYXZvaWQgcmVtb3ZpbmcgdG9vbHRpcFxuICAgIHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5zZWxlY3RBbGwoJ3N2ZywgLmF4LWxpbmUtY2hhcnQtbm8tZGF0YS1tZXNzYWdlLCAuYXgtbGluZS1jaGFydC1hbGwtaGlkZGVuLW1lc3NhZ2UnKVxuICAgICAgLnJlbW92ZSgpO1xuICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYWxsLWhpZGRlbi1tZXNzYWdlJykgLy8gRGlmZmVyZW50IGNsYXNzXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcbiAgICAgIC5zdHlsZSgnbGVmdCcsICc1MCUnKVxuICAgICAgLnN0eWxlKCd0b3AnLCAnNTAlJylcbiAgICAgIC5zdHlsZSgndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScpO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4taWNvbicpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC42JylcbiAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICcwLjc1cmVtJylcbiAgICAgIC5odG1sKGA8aSBjbGFzcz1cIiR7dGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkljb259IGZhLTJ4XCI+PC9pPmApOyAvLyBEaWZmZXJlbnQgaWNvblxuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4tdGV4dCcpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxcmVtJylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICcwLjVyZW0nKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbik7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYWxsLWhpZGRlbi1oZWxwJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzAuOHJlbScpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC42JylcbiAgICAgIC50ZXh0KHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5hbGxIaWRkZW5IZWxwKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT3ZlcmxhcHBpbmdQb2ludHNIb3ZlcihcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBvdmVybGFwcGluZ1BvaW50czogQXJyYXk8e1xuICAgICAgcG9pbnQ6IHsgeDogbnVtYmVyIHwgc3RyaW5nOyB5OiBudW1iZXIgfTtcbiAgICAgIHNlcmllczogQVhMaW5lQ2hhcnREYXRhICYgeyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfTtcbiAgICAgIG9yaWdpbmFsSW5kZXg6IG51bWJlcjtcbiAgICB9PixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdG9vbHRpcERhdGE6IEFYQ2hhcnRUb29sdGlwRGF0YSA9IHtcbiAgICAgIHRpdGxlOiBvdmVybGFwcGluZ1BvaW50cy5tYXAoKHsgc2VyaWVzIH0pID0+IHNlcmllcy5sYWJlbCksXG4gICAgICB2YWx1ZTogZm9ybWF0TGFyZ2VOdW1iZXIob3ZlcmxhcHBpbmdQb2ludHNbMF0ucG9pbnQueSksXG4gICAgICBjb2xvcjogb3ZlcmxhcHBpbmdQb2ludHMubWFwKFxuICAgICAgICAoeyBzZXJpZXMgfSkgPT4gc2VyaWVzLmxpbmVDb2xvciB8fCBnZXRDaGFydENvbG9yKHNlcmllcy5vcmlnaW5hbEluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKSxcbiAgICAgICksXG4gICAgfTtcblxuICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh0b29sdGlwRGF0YSk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93Q3Jvc3NoYWlyID09PSB0cnVlICYmIG92ZXJsYXBwaW5nUG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2hvd0Nyb3NzaGFpckxpbmVzKG92ZXJsYXBwaW5nUG9pbnRzWzBdLnBvaW50KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1saW5lLWNoYXJ0XCIgI2NoYXJ0Q29udGFpbmVyPlxuICA8IS0tIFNoYXJlZCB0b29sdGlwIGNvbXBvbmVudCAtLT5cbiAgPGF4LWNoYXJ0LXRvb2x0aXBcbiAgICBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCJcbiAgICBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIlxuICAgIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIlxuICAgIFtzaG93UGVyY2VudGFnZV09XCJmYWxzZVwiXG4gID48L2F4LWNoYXJ0LXRvb2x0aXA+XG48L2Rpdj5cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1saW5lLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2xpbmUtY2hhcnQvc3JjL2Fjb3JleC1jaGFydHMtbGluZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-line-chart.mjs","sources":["../../../../packages/charts/line-chart/src/lib/line-chart.config.ts","../../../../packages/charts/line-chart/src/lib/line-chart.component.ts","../../../../packages/charts/line-chart/src/lib/line-chart.component.html","../../../../packages/charts/line-chart/src/acorex-charts-line-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXLineChartOption } from './line-chart.type';\n\nexport const AXLineChartDefaultConfig: AXLineChartOption = {\n margins: {\n top: 20,\n right: 25,\n bottom: 40,\n left: 50,\n },\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showVerticalGrid: false,\n yAxisStartsAtZero: true,\n axisPadding: 5,\n showTooltip: true,\n lineWidth: 2,\n showPoints: true,\n pointRadius: 4,\n smoothLine: false,\n fillArea: false,\n fillOpacity: 20,\n showCrosshair: false,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\n\nexport const AX_LINE_CHART_CONFIG = new InjectionToken<AXLineChartOption>('AX_LINE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXLineChartDefaultConfig,\n});\n\nexport type PartialLineChartConfig = Partial<AXLineChartOption>;\n\nexport function lineChartConfig(config: PartialLineChartConfig = {}): AXLineChartOption {\n const result = {\n ...AXLineChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AX_CHART_COLOR_PALETTE,\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n formatLargeNumber,\n getChartColor,\n getEasingFunction,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type * as d3 from 'd3';\nimport { AX_LINE_CHART_CONFIG } from './line-chart.config';\nimport { AXLineChartData, AXLineChartOption, AXLineChartPointClickEvent, AXLineChartValue } from './line-chart.type';\n\n/**\n * Line Chart Component for rendering data as lines with interactive hover effects and animations\n */\n@Component({\n selector: 'ax-line-chart',\n templateUrl: './line-chart.component.html',\n styleUrls: ['./line-chart.component.scss'],\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXLineChartComponent\n extends AXChartComponent\n implements OnInit, AfterViewInit, OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n data = input<AXLineChartValue>([]);\n options = input<AXLineChartOption>({});\n pointClick = output<AXLineChartPointClickEvent>();\n\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n protected d3!: typeof import('d3');\n\n private svg!: d3.Selection<SVGSVGElement, unknown, null, undefined>;\n private chart!: d3.Selection<SVGGElement, unknown, null, undefined>;\n private xScale!: d3.ScaleLinear<number, number> | d3.ScaleBand<string>;\n private yScale!: d3.ScaleLinear<number, number>;\n private xAxis!: d3.Selection<SVGGElement, unknown, null, undefined>;\n private yAxis!: d3.Selection<SVGGElement, unknown, null, undefined>;\n\n private width!: number;\n private height!: number;\n private margin = { top: 20, right: 25, bottom: 40, left: 50 };\n\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n });\n\n private _initialized = signal(false);\n private _rendered = signal(false);\n private hiddenSeries = new Set<string>();\n private _fullNormalizedData: (AXLineChartData & { originalIndex: number })[] = [];\n\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_LINE_CHART_CONFIG);\n\n // Inject the chart colors\n private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Messages with defaults\n protected effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n });\n\n // Layout & Dimensions\n private readonly MIN_DIMENSION = 100;\n private readonly MIN_CONTAINER_DIMENSION = 200;\n private readonly DEFAULT_MARGIN_TOP = 20;\n private readonly DEFAULT_MARGIN_RIGHT = 25;\n private readonly DEFAULT_MARGIN_BOTTOM = 40;\n private readonly DEFAULT_MARGIN_LEFT = 50;\n private readonly MIN_MARGIN_BOTTOM = 45;\n private readonly MIN_MARGIN_LEFT = 55;\n private readonly MAX_EXTRA_MARGIN = 60;\n\n // Styling & Visual\n private readonly DEFAULT_LINE_WIDTH = 2;\n private readonly DEFAULT_POINT_RADIUS = 4;\n private readonly DEFAULT_FILL_OPACITY = 20;\n private readonly LINE_HIGHLIGHT_MULTIPLIER = 1.5;\n private readonly POINT_HIGHLIGHT_MULTIPLIER = 1.5;\n private readonly POINT_STROKE_WIDTH = 1;\n private readonly POINT_HOVER_STROKE_WIDTH = 2;\n private readonly GRID_DASH_ARRAY = '2,2';\n private readonly CROSSHAIR_DASH_ARRAY = '3,3';\n private readonly CROSSHAIR_OPACITY = 0.7;\n\n // Animation\n private readonly HOVER_TRANSITION_DURATION = 150;\n private readonly ANIMATION_END_BUFFER = 100;\n private readonly POINT_ANIMATION_DELAY_MS = 50;\n private readonly POINT_ANIMATION_DELAY_RATIO = 0.5;\n private readonly POINT_ANIMATION_DURATION_RATIO = 0.3;\n\n // Text & Labels\n private readonly AXIS_LABEL_FONT_SIZE = 14;\n private readonly CHAR_WIDTH_RATIO = 0.6;\n private readonly FONT_WIDTH_MULTIPLIER = 0.6;\n private readonly MAX_LABEL_LENGTH = 20;\n private readonly MIN_FONT_SIZE_X = 11;\n private readonly MAX_FONT_SIZE_X = 15;\n private readonly MIN_FONT_SIZE_Y = 11;\n private readonly MAX_FONT_SIZE_Y = 15;\n private readonly FONT_PADDING = 10;\n private readonly Y_AXIS_PADDING = 10;\n\n // Data & Performance\n private readonly MAX_POINTS_TO_RENDER = 100;\n private readonly POINT_COORDINATE_PRECISION = 10;\n private readonly MANY_ITEMS_THRESHOLD = 20;\n private readonly VERY_MANY_ITEMS_THRESHOLD = 50;\n\n // Tooltip\n private readonly TOOLTIP_GAP = 10;\n\n /**\n * Normalizes input data to consistent array format with originalIndex\n */\n private normalizeData(rawData: AXLineChartValue): (AXLineChartData & { originalIndex: number })[] {\n if (Array.isArray(rawData)) {\n return rawData.map((s, i) => ({ ...s, originalIndex: i }));\n }\n if (rawData && 'data' in rawData) {\n return [{ ...rawData, originalIndex: 0 }];\n }\n return [];\n }\n\n /**\n * Gets unique identifier for a series\n */\n private getSeriesIdentifier(series: AXLineChartData & { originalIndex: number }): string {\n return series.id || series.label || `series-${series.originalIndex}`;\n }\n\n /**\n * Calculates dynamic font size based on available space\n */\n private calculateDynamicFontSize(dimension: number, divisor: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, Math.round(dimension / divisor)));\n }\n\n /**\n * Creates a unique key for point coordinates (for overlap detection)\n */\n private createPointKey(x: number, y: number): string {\n const precision = this.POINT_COORDINATE_PRECISION;\n return `${Math.round(x * precision) / precision},${Math.round(y * precision) / precision}`;\n }\n\n /**\n * Removes series elements from the chart\n */\n private removeSeriesElements(seriesIdentifier: string): void {\n this.chart.selectAll(`.ax-line-chart-series[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n this.chart.selectAll(`.ax-line-chart-points[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n }\n\n /**\n * Truncates long labels with ellipsis\n */\n private truncateLabel(label: string, maxLength: number = this.MAX_LABEL_LENGTH): string {\n if (label.length <= maxLength) return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n\n /**\n * Calculates maximum width needed for Y-axis tick labels\n */\n private calculateMaxYAxisTickLabelWidth(): number {\n const allSeriesData = this._fullNormalizedData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)));\n\n let maxValue = 0;\n let minValue = 0;\n\n for (const series of allSeriesData) {\n if (series.data && series.data.length > 0) {\n for (const point of series.data) {\n if (typeof point.y === 'number') {\n maxValue = Math.max(maxValue, point.y);\n minValue = Math.min(minValue, point.y);\n }\n }\n }\n }\n\n // Check both max and min (for negative values)\n const maxAbsValue = Math.max(Math.abs(maxValue), Math.abs(minValue));\n const tickLabelText = Number.isFinite(maxAbsValue) ? formatLargeNumber(maxAbsValue) : '00000';\n\n return tickLabelText.length * this.AXIS_LABEL_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n\n ngOnInit(): void {\n this.loadD3();\n }\n\n #effect = effect(() => {\n this._fullNormalizedData = this.normalizeData(this.data());\n this.effectiveOptions();\n\n if (this._rendered()) {\n this.updateChart();\n }\n });\n\n ngAfterViewInit(): void {\n this._initialized.set(true);\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n // AXChartLegendCompatible Implementation\n getLegendItems(): AXChartLegendItem[] {\n const totalSum = this._fullNormalizedData.reduce((sum, series) => {\n return sum + series.data.reduce((sSum, p) => sSum + p.y, 0);\n }, 0);\n\n return this._fullNormalizedData.map((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n const seriesSum = series.data.reduce((sum, p) => sum + p.y, 0);\n const percentage = totalSum > 0 ? (seriesSum / totalSum) * 100 : 0;\n return {\n id: seriesIdentifier,\n name: series.label || `Series ${series.originalIndex + 1}`,\n value: seriesSum,\n color: series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n hidden: this.hiddenSeries.has(seriesIdentifier),\n percentage: parseFloat(percentage.toFixed(2)),\n };\n });\n }\n\n highlightSegment(id: string | null): void {\n if (!this.svg) return;\n\n const allSeriesGroups = this.svg.selectAll('g.ax-line-chart-series');\n const allPointsGroups = this.svg.selectAll('g.ax-line-chart-points');\n\n if (id === null) {\n allSeriesGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allPointsGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n\n allSeriesGroups\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .classed('ax-chart-highlighted-path', false);\n allPointsGroups\n .selectAll('circle.ax-line-chart-point')\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .classed('ax-chart-highlighted-point', false);\n return;\n }\n\n allSeriesGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n allPointsGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n\n const targetSeriesGroup = this.svg.selectAll(`g.ax-line-chart-series[data-series-identifier=\"${id}\"]`);\n const targetPointsGroup = this.svg.selectAll(`g.ax-line-chart-points[data-series-identifier=\"${id}\"]`);\n\n targetSeriesGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetPointsGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n\n targetSeriesGroup\n .selectAll('.ax-line-chart-line')\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n )\n .classed('ax-chart-highlighted-path', true);\n\n targetPointsGroup\n .selectAll('circle.ax-line-chart-point')\n .attr('r', (this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS) * this.POINT_HIGHLIGHT_MULTIPLIER)\n .classed('ax-chart-highlighted-path', true);\n }\n\n toggleSegment(id: string): boolean {\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n } else {\n this.hiddenSeries.add(id);\n }\n this.updateChart();\n return !this.hiddenSeries.has(id);\n }\n\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n public createChart(): void {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n const containerElement = this.chartContainerEl().nativeElement;\n const allSeriesData = this._fullNormalizedData;\n\n // Clear previous SVG and any empty-state messages (preserve tooltip component)\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n\n if (allSeriesData.length === 0 || allSeriesData.every((series) => !series.data || series.data.length === 0)) {\n this.showNoDataMessage(containerElement);\n return;\n }\n\n const visibleDataForRendering = allSeriesData.filter(\n (series) => !this.hiddenSeries.has(this.getSeriesIdentifier(series)),\n );\n\n if (visibleDataForRendering.length === 0) {\n // All data is present, but all series are hidden by the legend\n this.showAllSeriesHiddenMessage(containerElement);\n // Still setup basic SVG and chart group for consistency if needed, or return\n // For now, we will show the message and return, as scales/axes can't be drawn.\n return;\n }\n\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n\n // Use allSeriesData for domain calculation to keep scales consistent\n const dataForScaleSetup = allSeriesData.filter((s) => s.data && s.data.length > 0);\n if (dataForScaleSetup.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n this.setupScales(dataForScaleSetup);\n this.createAxes(chartOptions);\n this.renderLines(allSeriesData); // RenderLines will handle hiding based on hiddenSeries\n }\n\n public updateChart(): void {\n this.createChart();\n }\n\n public cleanupChart(): void {\n if (this.svg) {\n this.d3?.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();\n this.svg = null;\n this.chart = null;\n }\n this._tooltipVisible.set(false);\n }\n\n private setupDimensions(containerElement: HTMLElement, options: AXLineChartOption): void {\n this.calculateMargins(options, containerElement.clientWidth);\n\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n const minDim = Math.min(this.MIN_CONTAINER_DIMENSION, containerWidth, containerHeight);\n\n if (options.width && options.height) {\n this.width = options.width - this.margin.left - this.margin.right;\n this.height = options.height - this.margin.top - this.margin.bottom;\n } else {\n this.width = Math.max(containerWidth, minDim) - this.margin.left - this.margin.right;\n this.height = Math.max(containerHeight, minDim) - this.margin.top - this.margin.bottom;\n }\n\n this.width = Math.max(this.width, this.MIN_DIMENSION);\n this.height = Math.max(this.height, this.MIN_DIMENSION);\n\n const totalWidth = this.width + this.margin.left + this.margin.right;\n const totalHeight = this.height + this.margin.top + this.margin.bottom;\n\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', totalWidth)\n .attr('height', totalHeight)\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr(\n 'style',\n `\n width: ${totalWidth}px;\n height: ${totalHeight}px;\n max-width: 100%;\n max-height: 100%;\n overflow: visible;\n `,\n );\n\n this.svg = svg;\n this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n\n private calculateMargins(options: AXLineChartOption, containerWidth: number): void {\n this.margin = {\n top: options.margins?.top ?? this.DEFAULT_MARGIN_TOP,\n right: options.margins?.right ?? this.DEFAULT_MARGIN_RIGHT,\n bottom: options.margins?.bottom ?? this.DEFAULT_MARGIN_BOTTOM,\n left: options.margins?.left ?? this.DEFAULT_MARGIN_LEFT,\n };\n\n const allDataPoints = this._fullNormalizedData.flatMap((series) => series.data);\n if (allDataPoints.length > 0) {\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n\n if (!allNumericX) {\n const visibleSeries = this._fullNormalizedData.filter(\n (s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)),\n );\n const allXValues = new Set(visibleSeries.flatMap((series) => series.data.map((d) => String(d.x))));\n const labelCount = allXValues.size;\n\n if (labelCount > 0 && containerWidth > 0) {\n const workingWidth = containerWidth - this.margin.left - this.margin.right;\n if (workingWidth > 0) {\n const availableWidthPerLabel = workingWidth / labelCount;\n const labels = Array.from(allXValues);\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n\n const estimatedFontSize = this.calculateDynamicFontSize(\n workingWidth,\n 45,\n this.MIN_FONT_SIZE_X,\n this.MAX_FONT_SIZE_X,\n );\n\n // Account for label truncation in width calculation\n const maxLabelLength = labelCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * estimatedFontSize * this.CHAR_WIDTH_RATIO;\n\n if (estimatedLongestLabelWidth > availableWidthPerLabel) {\n // Calculate diagonal height when rotated -45 degrees\n const diagonalHeight = estimatedLongestLabelWidth * Math.sin(Math.PI / 4);\n const requiredExtraMargin = diagonalHeight + 15; // Extra padding for safety\n this.margin.bottom += Math.min(this.MAX_EXTRA_MARGIN, requiredExtraMargin);\n }\n }\n }\n }\n }\n\n if (options.xAxisLabel) {\n const xLabelLength = options.xAxisLabel.length;\n const extraBottomMargin = Math.min(20, Math.max(10, xLabelLength * 0.8));\n this.margin.bottom = Math.max(this.margin.bottom, 40 + extraBottomMargin);\n }\n\n if (options.yAxisLabel) {\n // Calculate space needed for Y-axis: tick labels + padding + title\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const yAxisTitleThickness = 20; // Height of rotated title text\n const yAxisTitlePadding = this.Y_AXIS_PADDING;\n const totalYAxisWidth = maxTickLabelWidth + yAxisTitlePadding + yAxisTitleThickness;\n\n this.margin.left = Math.max(this.margin.left, totalYAxisWidth);\n } else if (options.showYAxis !== false) {\n // Just tick labels, no title\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n this.margin.left = Math.max(this.margin.left, maxTickLabelWidth + 10);\n }\n\n if (options.showXAxis !== false) {\n this.margin.bottom = Math.max(this.margin.bottom, this.MIN_MARGIN_BOTTOM);\n }\n\n if (options.showYAxis !== false) {\n this.margin.left = Math.max(this.margin.left, this.MIN_MARGIN_LEFT);\n }\n }\n\n private setupScales(data: (AXLineChartData & { originalIndex: number })[]): void {\n // Expects already filtered data for scales\n const chartOptions = this.effectiveOptions();\n const padding = chartOptions.axisPadding ?? 0;\n const paddingMultiplier = padding / 100;\n\n // Ensure data is not empty for scale domain calculation\n const allDataPoints = data.length > 0 ? data.flatMap((series) => series.data) : [{ x: 0, y: 0 }];\n if (allDataPoints.length === 0) {\n // Should ideally not happen if createChart filters correctly\n allDataPoints.push({ x: 0, y: 0 }); // Default fallback to prevent crash with empty domain\n }\n\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n\n if (allNumericX) {\n const xMax = this.d3.max(allDataPoints, (d) => d.x as number) ?? 0;\n\n if (xMax === 0) {\n // If all values are 0, show -1 to 1 range\n this.xScale = this.d3\n .scaleLinear()\n .domain([-1, 1])\n .range([0, this.width]);\n } else {\n // Always start X axis from 0 for numeric data\n this.xScale = this.d3.scaleLinear().domain([0, xMax]).range([0, this.width]);\n }\n } else {\n this.xScale = this.d3\n .scaleBand()\n .domain(allDataPoints.map((d) => String(d.x)))\n .range([0, this.width])\n .paddingInner(0.2)\n .paddingOuter(0);\n }\n\n const yAxisStartsAtZero = chartOptions.yAxisStartsAtZero !== false;\n let yMin = this.d3.min(allDataPoints, (d) => d.y) ?? 0;\n if (yAxisStartsAtZero) {\n yMin = Math.min(0, yMin);\n }\n const yMax = this.d3.max(allDataPoints, (d) => d.y) ?? 0;\n const yRange = yMax - yMin;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([yMin, yMax + yRange * paddingMultiplier])\n .nice()\n .range([this.height, 0]);\n }\n\n private createAxes(options: AXLineChartOption): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isBandScale = this.xScale.bandwidth !== undefined;\n const isRtl = document.documentElement.dir === 'rtl' || document.body.dir === 'rtl';\n const axesGroup = this.chart.append('g').attr('class', 'ax-line-chart-axes');\n\n if (showXAxis) {\n let xAxisGenerator;\n let itemCount = 0;\n\n if (isBandScale) {\n // Band scale (categorical data)\n itemCount = this.xScale.domain().length;\n\n // Smart tick reduction for many items (like bar chart)\n let tickValues: string[] = this.xScale.domain() as string[];\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick for 50+ items\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick for 20-50 items\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n\n xAxisGenerator = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d: d3.AxisDomain) => {\n const label = String(d);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n } else {\n // Linear scale (numeric data)\n // Let D3 determine optimal tick count, but ensure we show reasonable number\n // Calculate optimal tick count based on width\n const optimalTickCount = Math.min(12, Math.max(5, Math.floor(this.width / 80)));\n\n xAxisGenerator = this.d3\n .axisBottom(this.xScale)\n .ticks(optimalTickCount)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d: d3.AxisDomain) => {\n // Format numbers nicely\n const num = Number(d);\n if (Number.isInteger(num)) {\n return String(num);\n }\n return num.toFixed(1);\n });\n\n itemCount = optimalTickCount;\n }\n\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-line-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(xAxisGenerator);\n\n // Style the x-axis path and lines\n this.xAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n\n this.xAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n const dynamicXAxisTickFontSize = this.calculateDynamicFontSize(\n this.width,\n 45,\n this.MIN_FONT_SIZE_X,\n this.MAX_FONT_SIZE_X,\n );\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-line-chart-labels-color), 0.7)');\n\n // Automatically rotate labels if they are likely to overlap (only for band scale)\n let labelsAreRotated = false;\n if (isBandScale && this.xScale.bandwidth && this.xScale.domain().length > 0) {\n const step = this.xScale.step();\n const longestLabel = this.xScale.domain().reduce((a, b) => (a.length > b.length ? a : b), '');\n // Using char width ratio constant for better estimate\n const estimatedLongestLabelWidth = longestLabel.length * dynamicXAxisTickFontSize * this.CHAR_WIDTH_RATIO;\n\n if (estimatedLongestLabelWidth > step) {\n labelsAreRotated = true;\n xAxisTicks\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .attr('dx', '-0.8em')\n .attr('dy', '0.15em');\n }\n }\n\n // Only show X-axis title if labels are NOT rotated and item count is reasonable\n // This prevents overlap with rotated labels and improves readability\n const shouldShowXAxisTitle = options.xAxisLabel && !labelsAreRotated && itemCount <= this.MANY_ITEMS_THRESHOLD;\n\n if (shouldShowXAxisTitle) {\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('x', this.width / 2)\n .attr('y', this.height + this.margin.bottom - 5)\n .attr('direction', 'ltr')\n .attr(\n 'style',\n `\n font-size: 14px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `,\n )\n .text(options.xAxisLabel);\n }\n }\n\n if (showYAxis) {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3\n .axisLeft(this.yScale)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((value: number | { valueOf(): number }) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n\n // Reduce tick count for better readability with large numbers\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for millions+\n } else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n\n this.yAxis = axesGroup.append('g').attr('class', 'ax-line-chart-axis-y').call(yAxisGenerator);\n\n // Style the y-axis path and lines\n this.yAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n\n this.yAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n const dynamicYAxisTickFontSize = this.calculateDynamicFontSize(\n this.height,\n 30,\n this.MIN_FONT_SIZE_Y,\n this.MAX_FONT_SIZE_Y,\n );\n const yTickTexts = this.yAxis.selectAll('text').attr(\n 'style',\n `\n font-size: ${dynamicYAxisTickFontSize}px;\n font-weight: 400;\n fill: rgba(var(--ax-comp-line-chart-labels-color), 0.7);\n `,\n );\n\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n }\n\n if (options.yAxisLabel) {\n // Calculate proper position for Y-axis title\n // Position it to the left of the tick labels with proper spacing\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n\n // Position title to the left of the tick labels\n const labelY = -maxTickLabelWidth - padding;\n\n // Center the title vertically\n const labelX = -this.height / 2;\n\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .attr(\n 'style',\n `\n font-size: 14px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `,\n )\n .text(options.yAxisLabel);\n }\n }\n\n if (showGrid) {\n const gridGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-grid-container')\n .attr('pointer-events', 'none');\n\n const yGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid')\n .call(\n this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => '')\n .tickValues(this.yScale.ticks()),\n );\n\n // Style the grid path and lines\n yGrid.selectAll('path').attr('stroke-width', '0');\n\n yGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n if (options.showVerticalGrid) {\n const xGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid-vertical')\n .attr('transform', `translate(0,${this.height})`)\n .call(\n this.d3\n .axisBottom(this.xScale)\n .tickSize(-this.height)\n .tickFormat(() => '')\n .tickValues(isBandScale ? undefined : this.xScale.ticks()),\n );\n\n // Style the vertical grid path and lines\n xGrid.selectAll('path').attr('stroke-width', '0');\n\n xGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.15)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n }\n }\n }\n\n private renderLines(allSeriesData: (AXLineChartData & { originalIndex: number })[]): void {\n const isBandScale = this.xScale.bandwidth !== undefined;\n\n const getX = (d: { x: number | string; y: number }) => {\n if (isBandScale) {\n return this.xScale(String(d.x)) + this.xScale.bandwidth() / 2;\n } else {\n return this.xScale(d.x as number);\n }\n };\n\n const lineGenerator = this.d3\n .line<{ x: number | string; y: number }>()\n .x(getX)\n .y((d) => this.yScale(d.y)) as d3.Line<{ x: number | string; y: number }>;\n\n if (this.effectiveOptions().smoothLine !== false) {\n lineGenerator.curve(this.d3.curveMonotoneX);\n }\n\n const areaGenerator = this.d3\n .area<{ x: number | string; y: number }>()\n .x(getX)\n .y0(this.height)\n .y1((d) => this.yScale(d.y));\n\n if (this.effectiveOptions().smoothLine !== false) {\n areaGenerator.curve(this.d3.curveMonotoneX);\n }\n\n this.svg.attr('class', 'ax-line-chart-animating');\n\n const allSeriesGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-series')\n .attr('pointer-events', 'none');\n\n const allPointsGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-points')\n .attr('pointer-events', 'none');\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n\n if (this.hiddenSeries.has(seriesIdentifier)) {\n this.removeSeriesElements(seriesIdentifier);\n return;\n }\n if (!series.data || series.data.length === 0) return;\n\n const seriesGroup = allSeriesGroup\n .append('g')\n .attr('class', `ax-line-chart-series ax-line-chart-series-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const fillColor = series.fillColor || lineColor;\n\n const line = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-line')\n .attr('stroke', lineColor)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .attr('stroke-linejoin', 'round')\n .attr('stroke-linecap', 'round')\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('style', 'transition: stroke-width 0.3s ease;')\n .attr('pointer-events', 'none');\n\n line\n .on('mouseenter', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n );\n })\n .on('mouseleave', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n });\n\n const totalLength = line.node().getTotalLength();\n line\n .attr('stroke-dasharray', totalLength + ' ' + totalLength)\n .attr('stroke-dashoffset', totalLength)\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('stroke-dashoffset', 0)\n .on('end', function () {\n line.attr('pointer-events', 'all');\n });\n\n if (this.effectiveOptions().fillArea) {\n const area = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-area')\n .attr('fill', fillColor)\n .attr('opacity', 0)\n .attr('d', areaGenerator)\n .attr('style', 'transition: opacity 0.3s ease;')\n .attr('pointer-events', 'none');\n\n area\n .on('mouseenter', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', ((this.effectiveOptions().fillOpacity ?? 20) / 100) * 1.5);\n })\n .on('mouseleave', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100);\n });\n\n area\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100)\n .on('end', function () {\n area.attr('pointer-events', 'all');\n });\n }\n });\n\n if (this.effectiveOptions().showPoints !== false) {\n const pointMap = new Map<\n string,\n Array<{\n point: { x: number | string; y: number };\n series: AXLineChartData & { originalIndex: number };\n originalIndex: number;\n }>\n >();\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n\n pointData.forEach((point) => {\n const x = getX(point);\n const y = this.yScale(point.y);\n const key = this.createPointKey(x, y);\n\n if (!pointMap.has(key)) {\n pointMap.set(key, []);\n }\n pointMap.get(key)?.push({ point, series, originalIndex: series.originalIndex });\n });\n });\n\n let animationCounter = 0;\n const totalVisibleSeriesCount = allSeriesData.filter(\n (s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)) && s.data && s.data.length > 0,\n ).length;\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const pointsGroup = allPointsGroup\n .append('g')\n .attr('class', `ax-line-chart-points ax-line-chart-points-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n\n pointsGroup\n .on('mouseenter', () => this.handlePointGroupEnter(series.originalIndex))\n .on('mouseleave', () => this.handlePointGroupLeave());\n\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n\n pointsGroup\n .selectAll('circle')\n .data(pointData)\n .enter()\n .append('circle')\n .attr('class', 'ax-line-chart-point')\n .attr('cx', getX)\n .attr('cy', (d) => this.yScale(d.y))\n .attr('r', 0)\n .attr('fill', lineColor)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1)\n .attr('data-x', (d) => d.x)\n .attr('data-y', (d) => d.y)\n .style('cursor', 'pointer')\n .attr('pointer-events', 'none')\n .on('mouseenter', (event: MouseEvent, d: { x: number | string; y: number }) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n\n if (overlappingPoints.length > 1) {\n this.handleOverlappingPointsHover(event, overlappingPoints);\n } else {\n this.handlePointHover(event, d, series, series.originalIndex);\n }\n\n this.d3\n .select(event.target as SVGCircleElement)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('r', (this.effectiveOptions().pointRadius ?? 4) * 1.5)\n .attr('stroke-width', 2)\n .attr('stroke', `rgb(var(--ax-comp-line-chart-bg-color))`);\n })\n .on('mousemove', (event: MouseEvent) => this.updateTooltipPosition(event))\n .on('mouseleave', (event: MouseEvent) => {\n this._tooltipVisible.set(false);\n this.d3\n .select(event.target as SVGCircleElement)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .attr('stroke-width', 1)\n .attr('stroke', '#fff');\n })\n .on('click', (event: MouseEvent, d: { x: number | string; y: number }) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n\n if (overlappingPoints.length > 1) {\n overlappingPoints.forEach(({ point, series }) => {\n this.handlePointClick(event, point, series);\n });\n } else {\n this.handlePointClick(event, d, series);\n }\n })\n .transition()\n .delay(\n (_d: { x: number | string; y: number }, i: number) =>\n i * Math.min(this.POINT_ANIMATION_DELAY_MS, (animationDuration || 0) * 0.05) +\n (animationDuration || 0) * this.POINT_ANIMATION_DELAY_RATIO,\n )\n .duration((animationDuration || 0) * this.POINT_ANIMATION_DURATION_RATIO)\n .ease(animationEasing)\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .on('end', (d, i, nodes) => {\n if (i === nodes.length - 1) {\n animationCounter++;\n if (animationCounter >= totalVisibleSeriesCount) {\n this.enablePointerEventsAfterAnimation();\n }\n }\n });\n });\n } else {\n setTimeout(() => this.enablePointerEventsAfterAnimation(), (animationDuration || 0) + this.ANIMATION_END_BUFFER);\n }\n }\n\n private enablePointerEventsAfterAnimation(): void {\n if (!this.chart || !this.svg) return;\n this.chart.selectAll('.ax-line-chart-all-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-line').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-area').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-all-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-point').attr('pointer-events', 'all');\n this.svg.classed('ax-line-chart-animating', false);\n }\n\n private handlePointGroupEnter(originalIndex: number): void {\n this.chart\n .select(`.ax-line-chart-series-${originalIndex} .ax-line-chart-line`)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n );\n }\n\n private handlePointGroupLeave(): void {\n this.chart\n .selectAll('.ax-line-chart-line')\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.select('.ax-line-chart-crosshair').selectAll('*').remove();\n }\n }\n\n private getReducedDataPoints(\n data: Array<{ x: number | string; y: number }>,\n maxPoints: number,\n ): Array<{ x: number | string; y: number }> {\n if (data.length <= maxPoints) return data;\n const result: Array<{ x: number | string; y: number }> = [];\n const step = Math.ceil(data.length / maxPoints);\n for (let i = 0; i < data.length; i += step) {\n result.push(data[i]);\n }\n if (result[result.length - 1] !== data[data.length - 1]) {\n result.push(data[data.length - 1]);\n }\n return result;\n }\n\n private handlePointHover(\n event: MouseEvent,\n dataPoint: AXLineChartData['data'][number],\n series: AXLineChartData & { originalIndex: number },\n originalIndex: number,\n ): void {\n if (this.effectiveOptions().showTooltip !== false) {\n const color = series.lineColor || getChartColor(originalIndex, this.chartColors);\n\n this._tooltipData.set({\n title: dataPoint.tooltipLabel || series.tooltipLabel || series.label || `Series ${originalIndex + 1}`,\n value: formatLargeNumber(dataPoint.y),\n color: color,\n });\n\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.showCrosshairLines(dataPoint);\n }\n }\n }\n\n private showCrosshairLines(dataPoint: { x: number | string; y: number }): void {\n const isBandScale = this.xScale.bandwidth !== undefined;\n\n let x: number;\n if (isBandScale) {\n x = this.xScale(String(dataPoint.x)) + this.xScale.bandwidth() / 2;\n } else {\n x = this.xScale(dataPoint.x as number);\n }\n const y = this.yScale(dataPoint.y);\n\n let crosshairGroup = this.chart.select('.ax-line-chart-crosshair');\n if (crosshairGroup.empty()) {\n crosshairGroup = this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n\n crosshairGroup.selectAll('*').remove();\n\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-vertical')\n .attr('x1', x)\n .attr('y1', 0)\n .attr('x2', x)\n .attr('y2', this.height)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-horizontal')\n .attr('x1', 0)\n .attr('y1', y)\n .attr('x2', this.width)\n .attr('y2', y)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(rect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n }\n\n // computeTooltipPosition moved to shared chart utils\n\n private handlePointClick(\n event: MouseEvent,\n dataPoint: AXLineChartData['data'][number],\n series: AXLineChartData & { originalIndex: number },\n ): void {\n this.pointClick.emit({\n series: series, // series still refers to the full series data with originalIndex\n point: dataPoint,\n event: {\n nativeEvent: event,\n sender: this,\n },\n });\n }\n\n private showNoDataMessage(containerElement: HTMLElement): void {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-no-data-message')\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().noDataIcon} fa-2x\"></i>`);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().noData);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().noDataHelp);\n }\n\n private showAllSeriesHiddenMessage(containerElement: HTMLElement): void {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-message') // Different class\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().allHiddenIcon} fa-2x\"></i>`); // Different icon\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().allHidden);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().allHiddenHelp);\n }\n\n private handleOverlappingPointsHover(\n event: MouseEvent,\n overlappingPoints: Array<{\n point: { x: number | string; y: number };\n series: AXLineChartData & { originalIndex: number };\n originalIndex: number;\n }>,\n ): void {\n if (this.effectiveOptions().showTooltip === false) return;\n\n const tooltipData: AXChartTooltipData = {\n title: overlappingPoints.map(({ series }) => series.label),\n value: formatLargeNumber(overlappingPoints[0].point.y),\n color: overlappingPoints.map(\n ({ series }) => series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n ),\n };\n\n this._tooltipData.set(tooltipData);\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n\n if (this.effectiveOptions().showCrosshair === true && overlappingPoints.length > 0) {\n this.showCrosshairLines(overlappingPoints[0].point);\n }\n }\n}\n","<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}