@acorex/charts 0.0.1
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.
- package/README.md +72 -0
- package/bar-chart/README.md +3 -0
- package/bar-chart/index.d.ts +211 -0
- package/chart-legend/index.d.ts +104 -0
- package/chart-tooltip/README.md +3 -0
- package/chart-tooltip/index.d.ts +54 -0
- package/donut-chart/README.md +3 -0
- package/donut-chart/index.d.ts +251 -0
- package/fesm2022/acorex-charts-bar-chart.mjs +772 -0
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -0
- package/fesm2022/acorex-charts-chart-legend.mjs +109 -0
- package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -0
- package/fesm2022/acorex-charts-chart-tooltip.mjs +74 -0
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -0
- package/fesm2022/acorex-charts-donut-chart.mjs +758 -0
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -0
- package/fesm2022/acorex-charts-gauge-chart.mjs +686 -0
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -0
- package/fesm2022/acorex-charts-hierarchy-chart.mjs +700 -0
- package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -0
- package/fesm2022/acorex-charts-line-chart.mjs +995 -0
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -0
- package/fesm2022/acorex-charts.mjs +41 -0
- package/fesm2022/acorex-charts.mjs.map +1 -0
- package/gauge-chart/README.md +3 -0
- package/gauge-chart/index.d.ts +218 -0
- package/hierarchy-chart/README.md +61 -0
- package/hierarchy-chart/index.d.ts +368 -0
- package/index.d.ts +14 -0
- package/line-chart/README.md +3 -0
- package/line-chart/index.d.ts +184 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-charts-bar-chart.mjs","sources":["../tmp-esm2022/bar-chart/lib/bar-chart.config.js","../tmp-esm2022/bar-chart/lib/bar-chart.component.js","../tmp-esm2022/bar-chart/acorex-charts-bar-chart.js"],"sourcesContent":["import { AX_GLOBAL_CONFIG } from '@acorex/core/config';\nimport { InjectionToken, inject } from '@angular/core';\nimport { set } from 'lodash-es';\nexport const AXBarChartDefaultConfig = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n};\nexport const AX_BAR_CHART_CONFIG = new InjectionToken('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => {\n const global = inject(AX_GLOBAL_CONFIG);\n set(global, 'chart.barChart', AXBarChartDefaultConfig);\n return AXBarChartDefaultConfig;\n },\n});\nexport function barChartConfig(config = {}) {\n const result = {\n ...AXBarChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFFBQVEsRUFBRSxFQUFFO0lBQ1osWUFBWSxFQUFFLENBQUM7SUFDZixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0NBQzdCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBbUIscUJBQXFCLEVBQUU7SUFDN0YsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUN2RCxPQUFPLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7Q0FDRixDQUFDLENBQUM7QUFJSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQWdDLEVBQUU7SUFDL0QsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLHVCQUF1QjtRQUMxQixHQUFHLE1BQU07S0FDVixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYX0dMT0JBTF9DT05GSUcgfSBmcm9tICdAYWNvcmV4L2NvcmUvY29uZmlnJztcbmltcG9ydCB7IEluamVjdGlvblRva2VuLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBBWEJhckNoYXJ0T3B0aW9uIH0gZnJvbSAnLi9iYXItY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWEJhckNoYXJ0RGVmYXVsdENvbmZpZzogQVhCYXJDaGFydE9wdGlvbiA9IHtcbiAgc2hvd1hBeGlzOiB0cnVlLFxuICBzaG93WUF4aXM6IHRydWUsXG4gIHNob3dHcmlkOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIGJhcldpZHRoOiA4MCxcbiAgY29ybmVyUmFkaXVzOiA0LFxuICBhbmltYXRpb25EdXJhdGlvbjogODAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0JBUl9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhCYXJDaGFydE9wdGlvbj4oJ0FYX0JBUl9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4ge1xuICAgIGNvbnN0IGdsb2JhbCA9IGluamVjdChBWF9HTE9CQUxfQ09ORklHKTtcbiAgICBzZXQoZ2xvYmFsLCAnY2hhcnQuYmFyQ2hhcnQnLCBBWEJhckNoYXJ0RGVmYXVsdENvbmZpZyk7XG4gICAgcmV0dXJuIEFYQmFyQ2hhcnREZWZhdWx0Q29uZmlnO1xuICB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhCYXJDaGFydE9wdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXJDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IHt9KTogQVhCYXJDaGFydE9wdGlvbiB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAuLi5BWEJhckNoYXJ0RGVmYXVsdENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=","import { NXComponent } from '@acorex/cdk/common';\nimport { AX_CHART_COLOR_PALETTE, getChartColor } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_BAR_CHART_CONFIG } from './bar-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Bar Chart Component\n * Renders data as vertical bars with interactive hover effects and animations\n */\nexport class AXBarChartComponent extends NXComponent {\n // Inputs\n /** Chart data input */\n data = input([]);\n /** Chart options input */\n options = input({});\n // Outputs\n /** Emitted when a bar is clicked */\n barClick = output();\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // D3 reference - loaded asynchronously\n d3;\n // Chart elements\n svg;\n chart;\n xScale;\n yScale;\n xAxis;\n yAxis;\n // Chart dimensions\n width;\n height;\n margin = { top: 20, right: 20, bottom: 30, left: 40 };\n // Animation state\n _initialAnimationComplete = signal(false);\n // Tooltip state\n _tooltipVisible = signal(false);\n _tooltipPosition = signal({ x: 0, y: 0 });\n _tooltipData = signal({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n });\n // Signals for component state\n _initialized = signal(false);\n _rendered = signal(false);\n // Tooltip accessors\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_BAR_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n // Inject AXPlatform\n platform = inject(AXPlatform);\n // Configuration with defaults\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n // Track hidden bars\n hiddenBars = new Set();\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n // Create chart after D3 is loaded and container is available\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n });\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n this.data();\n this.effectiveOptions();\n // Only update if already rendered\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\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 /**\n * Creates the bar chart SVG and renders all elements\n */\n createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n const containerElement = this.chartContainerEl().nativeElement;\n const data = this.data() || [];\n // Filter out hidden bars for visible data\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n // Clear existing chart\n this.d3.select(containerElement).selectAll('svg').remove();\n // Early return if no data\n if (!data.length) {\n this.showNoDataMessage(containerElement);\n return;\n }\n // Early return if all bars are hidden\n if (visibleData.length === 0) {\n this.showAllBarsHiddenMessage(containerElement);\n return;\n }\n // Get options and setup dimensions\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n // Create scales and axes using visible data\n this.setupScales(visibleData);\n this.createAxes(chartOptions);\n // Render the bars\n this.renderBars(data);\n }\n /**\n * Updates the chart when inputs change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Cleans up chart resources\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 /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n setupDimensions(containerElement, options) {\n // Calculate margins based on options\n this.calculateMargins(options);\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // If options specify width and height, use those, otherwise default to container size\n const minDim = Math.min(200, containerWidth, containerHeight); // Ensure reasonable minimum\n if (options.width && options.height) {\n // Explicit dimensions provided\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 // Responsive dimensions\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 // Create responsive SVG that scales with its container\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${this.width + this.margin.left + this.margin.right} ${this.height + this.margin.top + this.margin.bottom}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n // Create chart group with margins\n this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n /**\n * Calculates chart margins based on options\n */\n calculateMargins(options) {\n // Start with default margins\n this.margin = {\n top: 20,\n right: 20,\n bottom: 30,\n left: 40,\n };\n // Adjust margins if axis labels are present\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, 30 + extraBottomMargin);\n }\n if (options.yAxisLabel) {\n const yLabelLength = options.yAxisLabel.length;\n const extraLeftMargin = Math.min(20, Math.max(10, yLabelLength * 0.8));\n this.margin.left = Math.max(this.margin.left, 40 + extraLeftMargin);\n }\n // Ensure minimum margins for axes\n if (options.showXAxis !== false) {\n this.margin.bottom = Math.max(this.margin.bottom, 35);\n }\n if (options.showYAxis !== false) {\n this.margin.left = Math.max(this.margin.left, 45);\n }\n }\n /**\n * Creates x and y scales for the chart\n */\n setupScales(data) {\n // Get the bar width percentage (default 80%)\n const barWidthPercent = this.effectiveOptions().barWidth ?? 60 / 100;\n // Calculate padding based on barWidth (inverse relationship)\n const padding = Math.max(0.1, 1 - barWidthPercent);\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.label))\n .range([0, this.width])\n .padding(padding);\n // Create y scale (linear scale for values)\n this.yScale = this.d3\n .scaleLinear()\n .domain([0, this.d3.max(data, (d) => d.value) || 0])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y axes with grid lines\n */\n createAxes(options) {\n // Only create axes if they are enabled in options\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isRtl = this.platform.isRtl();\n // Create a group for all axes\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n // Create X axis\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(this.d3.axisBottom(this.xScale));\n // Style the axis text\n const dynamicXAxisTickFontSize = Math.max(11, Math.min(15, Math.round(this.width / 45)));\n this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)');\n // Style all lines in the x-axis (path, ticks)\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add X axis label if provided\n if (options.xAxisLabel) {\n const labelY = this.height + this.margin.bottom * 0.8;\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(options.xAxisLabel);\n }\n }\n if (showYAxis) {\n // Create Y axis\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(this.d3.axisLeft(this.yScale));\n // Style the axis text\n const dynamicYAxisTickFontSize = Math.max(11, Math.min(15, Math.round(this.height / 30)));\n const yTickTexts = this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicYAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)');\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n }\n // Style all lines in the y-axis (path, ticks)\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add Y axis label if provided\n if (options.yAxisLabel) {\n const labelX = -this.height / 2;\n const labelY = -this.margin.left * 0.8;\n axesGroup\n .append('text')\n .attr('class', 'ax-bar-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 .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(options.yAxisLabel);\n }\n }\n if (showGrid) {\n // Add horizontal grid lines\n this.chart\n .append('g')\n .attr('class', 'ax-bar-chart-grid')\n .call(this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => ''))\n .selectAll('line')\n .style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))')\n .style('stroke-opacity', 0.2);\n // Remove unneeded elements from grid\n this.chart.select('.ax-bar-chart-grid').selectAll('path, text').remove();\n }\n }\n /**\n * Renders the bars with animations\n */\n renderBars(data) {\n // Filter out hidden bars\n const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n const originalFullData = this.data(); // Get the original full data set\n // Reset animation state\n this._initialAnimationComplete.set(false);\n // Get corner radius from options\n const radius = this.effectiveOptions().cornerRadius;\n // Get animation options\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = this.getEasingFunction(this.effectiveOptions().animationEasing);\n // Create a container for all bars\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n // Create groups for each bar to handle transformations\n const barGroups = barsContainer\n .selectAll('.ax-bar-chart-bar-group')\n .data(visibleData)\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n // Add bars inside groups\n const bars = barGroups\n .append('rect')\n .attr('class', 'ax-bar-chart-bar')\n .attr('x', (d) => this.xScale(d.label))\n .attr('width', this.xScale.bandwidth())\n .attr('y', this.height) // Start from bottom for animation\n .attr('height', 0) // Start with height 0 for animation\n .attr('rx', radius) // Rounded corners\n .attr('ry', radius) // Rounded corners\n .attr('fill', (d) => {\n // Find the index of the current bar (d) in the original data array\n const originalIndex = originalFullData.findIndex((item) => item.id === d.id);\n // Use the original color if provided, otherwise get color from palette using original index\n // Fallback to index 0 if not found, though this shouldn't happen with valid data.\n return d.color || this.getColor(originalIndex !== -1 ? originalIndex : 0);\n });\n // Add data labels if they're enabled\n if (this.effectiveOptions().showDataLabels !== false) {\n barGroups\n .append('text')\n .attr('class', 'ax-bar-chart-data-label')\n .attr('text-anchor', 'middle')\n .attr('x', (d) => this.xScale(d.label) + this.xScale.bandwidth() / 2)\n .attr('y', this.height) // Start from bottom for animation\n .style('font-size', 'clamp(8px, 2vmin, 12px)')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n .style('opacity', 0) // Start invisible for animation\n .text((d) => d.value);\n // Animate data labels\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * 50 + 100) // Slightly delayed after bar animation\n .attr('y', (d) => this.yScale(d.value) - 8) // Position above bar\n .style('opacity', 1)\n .ease(animationEasing);\n }\n // Set up event handlers on each group\n barGroups\n .on('mouseenter', (event, d) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('rect');\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl.transition().duration(150).style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n this.handleBarHover(event, d);\n })\n .on('mousemove', (event) => {\n // Only update tooltip if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', (event, d) => {\n // Only apply hover effects if initial animation is complete\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('rect');\n // Remove hover effect\n barEl.transition().duration(150).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n // Only trigger click events if initial animation is complete\n if (this._initialAnimationComplete()) {\n this.handleBarClick(event, d);\n }\n });\n // Add animation\n bars\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * 50) // Stagger each bar animation\n .attr('y', (d) => this.yScale(d.value))\n .attr('height', (d) => this.height - this.yScale(d.value))\n .ease(animationEasing) // Use the configured easing function\n .end() // Wait for all animations to complete\n .then(() => {\n // Mark animation as complete to enable hover effects\n this._initialAnimationComplete.set(true);\n });\n }\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n getEasingFunction(easing) {\n switch (easing) {\n case 'linear':\n return this.d3.easeLinear;\n case 'ease':\n return this.d3.easePolyInOut;\n case 'ease-in':\n return this.d3.easePolyIn;\n case 'ease-out':\n return this.d3.easePolyOut;\n case 'ease-in-out':\n return this.d3.easePolyInOut;\n case 'cubic':\n return this.d3.easeCubic;\n case 'cubic-in':\n return this.d3.easeCubicIn;\n case 'cubic-out':\n return this.d3.easeCubicOut;\n case 'cubic-in-out':\n return this.d3.easeCubicInOut;\n default:\n return this.d3.easeCubicOut; // Default easing\n }\n }\n /**\n * Handles bar hover event and shows tooltip\n */\n handleBarHover(event, datum) {\n if (this.effectiveOptions().showTooltip !== false) {\n const index = this.data().findIndex((item) => item.id === datum.id);\n const color = datum.color || this.getColor(index);\n // Calculate percentage of total\n const total = this.data().reduce((sum, item) => sum + item.value, 0);\n const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n this._tooltipData.set({\n title: datum.tooltipLabel || datum.label,\n value: datum.value.toString(),\n percentage: `${percentage}%`,\n color: color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n /**\n * Updates tooltip position based on mouse coordinates\n */\n updateTooltipPosition(event) {\n const container = this.chartContainerEl().nativeElement.getBoundingClientRect();\n const tooltipEl = this.chartContainerEl().nativeElement.querySelector('.chart-tooltip');\n if (!tooltipEl) {\n const x = event.clientX - container.left;\n const y = event.clientY - container.top;\n this._tooltipPosition.set({ x, y });\n return;\n }\n const tooltipRect = tooltipEl.getBoundingClientRect();\n let x = event.clientX - container.left;\n const y = event.clientY - container.top;\n // Adjust position if near the right edge\n if (x + tooltipRect.width + 10 > container.width) {\n x = x - tooltipRect.width - 10;\n }\n else {\n x = x + 10;\n }\n this._tooltipPosition.set({ x, y });\n }\n /**\n * Handles bar click event\n */\n handleBarClick(event, datum) {\n this.barClick.emit({ item: datum, event: { nativeEvent: event, sender: this } });\n }\n /**\n * Shows a message when no data is available\n */\n showNoDataMessage(containerElement) {\n // Clear existing contents first\n this.d3.select(containerElement).selectAll('*').remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n // Apply generic container class, specific bar chart background class, and existing specific class\n .attr('class', 'ax-chart-message-container ax-bar-chart-message-background ax-bar-chart-no-data-message');\n // Add an icon\n messageContainer\n .append('div')\n // Apply generic icon class and specific bar chart icon class\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html('<i class=\"fa-light fa-chart-column fa-2x\"></i>');\n // Add text message\n messageContainer\n .append('div')\n // Apply generic text class and specific bar chart text class\n .attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text')\n .text('No data available');\n // Add help text\n messageContainer\n .append('div')\n // Apply generic help class and specific bar chart help class\n .attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help')\n .text('Please provide data to display the chart');\n }\n /**\n * Shows a message when all bars are hidden\n */\n showAllBarsHiddenMessage(containerElement) {\n // Clear existing contents first\n this.d3.select(containerElement).selectAll('*').remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n // Apply generic container class, specific bar chart background class, and existing specific class\n .attr('class', 'ax-chart-message-container ax-bar-chart-message-background ax-bar-chart-no-data-message');\n // Add an icon\n messageContainer\n .append('div')\n // Apply generic icon class and specific bar chart icon class\n .attr('class', 'ax-chart-message-icon ax-bar-chart-no-data-icon')\n .html('<i class=\"fa-light fa-eye-slash fa-2x\"></i>');\n // Add text message\n messageContainer\n .append('div')\n // Apply generic text class and specific bar chart text class\n .attr('class', 'ax-chart-message-text ax-bar-chart-no-data-text')\n .text('All bars are hidden');\n // Add help text\n messageContainer\n .append('div')\n // Apply generic help class and specific bar chart help class\n .attr('class', 'ax-chart-message-help ax-bar-chart-no-data-help')\n .text('Click on legend items to show bars');\n }\n /**\n * Gets the color for a bar based on its index\n */\n getColor(index) {\n return getChartColor(index, this.chartColors);\n }\n /**\n * Checks if a bar is hidden\n */\n isBarHidden(id) {\n return this.hiddenBars.has(id);\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Returns legend items based on the chart data\n */\n getLegendItems() {\n const data = this.data() || [];\n const total = data.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return data.map((item, index) => {\n const value = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (value / total) * 100 : 0;\n return {\n id: item.id,\n name: item.label || `Item ${index + 1}`,\n value: item.value,\n percentage,\n color: item.color || this.getColor(index),\n hidden: this.isBarHidden(item.id),\n };\n });\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Highlights a specific bar by ID\n */\n highlightSegment(id) {\n if (!this.svg)\n return;\n // If the bar is hidden, we shouldn't try to highlight it\n if (id !== null && this.isBarHidden(id)) {\n // Just unhighlight everything when trying to highlight a hidden bar\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n return;\n }\n if (id === null) {\n // If id is null, unhighlight everything\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n return;\n }\n // Find the target bar\n const targetBar = this.svg.selectAll('.ax-bar-chart-bar').filter((d) => d?.id === id);\n // Safety check - if no matching bar is found, do nothing\n if (targetBar.empty())\n return;\n // Check if the target bar is currently highlighted\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n // If already highlighted, unhighlight all bars\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n }\n else {\n // Reset all bars first\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .classed('ax-bar-chart-highlighted', false)\n .classed('ax-bar-chart-dimmed', false)\n .attr('opacity', 1)\n .attr('filter', null)\n .attr('stroke', null)\n .attr('stroke-width', null)\n .attr('stroke-opacity', null);\n // Highlight the target bar\n targetBar\n .classed('ax-bar-chart-highlighted', true)\n .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n .attr('stroke', '#000')\n .attr('stroke-width', '1px')\n .attr('stroke-opacity', '0.3')\n .style('transition', 'all 0.2s ease-in-out');\n // Dim other bars\n this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d) => d?.id !== id)\n .classed('ax-bar-chart-dimmed', true)\n .attr('opacity', 0.5)\n .style('transition', 'opacity 0.2s ease-in-out');\n }\n }\n /**\n * Implementation of AXChartLegendCompatible interface\n * Toggles visibility of a bar by ID\n * @returns New visibility state (true = visible, false = hidden)\n */\n toggleSegment(id) {\n const wasAllHidden = this.data().length > 0 && this.data().every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n // Making a bar visible\n this.hiddenBars.delete(id);\n // If all bars were previously hidden, we need to ensure the message is cleared\n if (wasAllHidden) {\n // Force complete DOM cleanup and redraw\n if (this.chartContainerEl()?.nativeElement) {\n // Clear everything in the container\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('*').remove();\n // Force full redraw\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n // Normal update for other cases\n this.updateChart();\n }\n }\n else {\n // Hiding a bar\n this.hiddenBars.add(id);\n this.updateChart();\n }\n // Return the new visibility state\n return !this.hiddenBars.has(id);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.4\", ngImport: i0, type: AXBarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.0.4\", type: AXBarChartComponent, isStandalone: true, selector: \"ax-bar-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: { barClick: \"barClick\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-bar-chart\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-bar-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-bar-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-bg-color: var(--ax-sys-color-lightest-surface)}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden;color:rgb(var(--ax-sys-color-on-lightest-surface));background-color:rgb(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-bar-chart .ax-bar-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-bar-chart-bg-color));padding:1.5rem;border-radius:.5rem;box-shadow:0 2px 12px #00000014;width:80%;max-width:300px}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-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.0.4\", ngImport: i0, type: AXBarChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-bar-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-bar-chart\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"true\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-bar-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-bar-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-bar-chart-bg-color: var(--ax-sys-color-lightest-surface)}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden;color:rgb(var(--ax-sys-color-on-lightest-surface));background-color:rgb(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-bar-chart .ax-bar-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-bar-chart-bg-color));padding:1.5rem;border-radius:.5rem;box-shadow:0 2px 12px #00000014;width:80%;max-width:300px}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-bar-chart .ax-bar-chart-no-data-message .ax-bar-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2Jhci1jaGFydC9zcmMvbGliL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBR3pEOzs7R0FHRztBQVNILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxXQUFXO0lBQ2xELFNBQVM7SUFDVCx1QkFBdUI7SUFDdkIsSUFBSSxHQUFHLEtBQUssQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFFbkMsMEJBQTBCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLENBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBRXRDLFVBQVU7SUFDVixvQ0FBb0M7SUFDcEMsUUFBUSxHQUFHLE1BQU0sRUFBd0IsQ0FBQztJQUUxQyw0QkFBNEI7SUFDWCxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUE2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LENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO3VHQTd6QlUsbUJBQW1COzJGQUFuQixtQkFBbUIscWdCQ3BDaEMsaVJBU0EseTNDRHdCWSx1QkFBdUI7OzJGQUd0QixtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsY0FBYyxpQkFHVCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsdUJBQXVCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOWENvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY2RrL2NvbW1vbic7XG5pbXBvcnQgeyBBWF9DSEFSVF9DT0xPUl9QQUxFVFRFLCBnZXRDaGFydENvbG9yIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRMZWdlbmRJdGVtIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtbGVnZW5kJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcbmltcG9ydCB7IEFYUGxhdGZvcm0gfSBmcm9tICdAYWNvcmV4L2NvcmUvcGxhdGZvcm0nO1xuXG5pbXBvcnQge1xuICBhZnRlck5leHRSZW5kZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhfQkFSX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vYmFyLWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQgeyBBWEJhckNoYXJ0Q2xpY2tFdmVudCwgQVhCYXJDaGFydERhdGEsIEFYQmFyQ2hhcnRPcHRpb24gfSBmcm9tICcuL2Jhci1jaGFydC50eXBlJztcblxuLyoqXG4gKiBCYXIgQ2hhcnQgQ29tcG9uZW50XG4gKiBSZW5kZXJzIGRhdGEgYXMgdmVydGljYWwgYmFycyB3aXRoIGludGVyYWN0aXZlIGhvdmVyIGVmZmVjdHMgYW5kIGFuaW1hdGlvbnNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtYmFyLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Jhci1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhCYXJDaGFydENvbXBvbmVudCBleHRlbmRzIE5YQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSB7XG4gIC8vIElucHV0c1xuICAvKiogQ2hhcnQgZGF0YSBpbnB1dCAqL1xuICBkYXRhID0gaW5wdXQ8QVhCYXJDaGFydERhdGFbXT4oW10pO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWEJhckNoYXJ0T3B0aW9uPih7fSk7XG5cbiAgLy8gT3V0cHV0c1xuICAvKiogRW1pdHRlZCB3aGVuIGEgYmFyIGlzIGNsaWNrZWQgKi9cbiAgYmFyQ2xpY2sgPSBvdXRwdXQ8QVhCYXJDaGFydENsaWNrRXZlbnQ+KCk7XG5cbiAgLy8gQ2hhcnQgY29udGFpbmVyIHJlZmVyZW5jZVxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0Q29udGFpbmVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuXG4gIC8vIEQzIHJlZmVyZW5jZSAtIGxvYWRlZCBhc3luY2hyb25vdXNseVxuICBwcm90ZWN0ZWQgZDMhOiB0eXBlb2YgaW1wb3J0KCdkMycpO1xuXG4gIC8vIENoYXJ0IGVsZW1lbnRzXG4gIHByaXZhdGUgc3ZnITogYW55O1xuICBwcml2YXRlIGNoYXJ0ITogYW55O1xuICBwcml2YXRlIHhTY2FsZSE6IGFueTtcbiAgcHJpdmF0ZSB5U2NhbGUhOiBhbnk7XG4gIHByaXZhdGUgeEF4aXMhOiBhbnk7XG4gIHByaXZhdGUgeUF4aXMhOiBhbnk7XG5cbiAgLy8gQ2hhcnQgZGltZW5zaW9uc1xuICBwcml2YXRlIHdpZHRoITogbnVtYmVyO1xuICBwcml2YXRlIGhlaWdodCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXJnaW4gPSB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiAzMCwgbGVmdDogNDAgfTtcblxuICAvLyBBbmltYXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUb29sdGlwIHN0YXRlXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgcGVyY2VudGFnZTogJzAlJyxcbiAgICBjb2xvcjogJycsXG4gIH0pO1xuXG4gIC8vIFNpZ25hbHMgZm9yIGNvbXBvbmVudCBzdGF0ZVxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUb29sdGlwIGFjY2Vzc29yc1xuICBwcm90ZWN0ZWQgdG9vbHRpcFZpc2libGUgPSB0aGlzLl90b29sdGlwVmlzaWJsZS5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwUG9zaXRpb24gPSB0aGlzLl90b29sdGlwUG9zaXRpb24uYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcERhdGEgPSB0aGlzLl90b29sdGlwRGF0YS5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gSW5qZWN0IGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBjb25maWdUb2tlbiA9IGluamVjdChBWF9CQVJfQ0hBUlRfQ09ORklHKTtcblxuICAvLyBJbmplY3QgdGhlIGNoYXJ0IGNvbG9yc1xuICBwcml2YXRlIGNoYXJ0Q29sb3JzID0gaW5qZWN0KEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUpO1xuXG4gIC8vIEluamVjdCBBWFBsYXRmb3JtXG4gIHByaXZhdGUgcGxhdGZvcm0gPSBpbmplY3QoQVhQbGF0Zm9ybSk7XG5cbiAgLy8gQ29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHRzXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZ1Rva2VuLFxuICAgICAgLi4udGhpcy5vcHRpb25zKCksXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gVHJhY2sgaGlkZGVuIGJhcnNcbiAgcHJpdmF0ZSBoaWRkZW5CYXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBEeW5hbWljYWxseSBsb2FkIEQzIGFuZCBpbml0aWFsaXplIHRoZSBjaGFydCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRDMoKTtcbiAgICAgIC8vIENyZWF0ZSBjaGFydCBhZnRlciBEMyBpcyBsb2FkZWQgYW5kIGNvbnRhaW5lciBpcyBhdmFpbGFibGVcbiAgICAgIGlmICh0aGlzLmQzICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGNoYW5nZXMgdG8gcmVkcmF3IHRoZSBjaGFydFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBBY2Nlc3MgaW5wdXRzIHRvIHRyYWNrIHRoZW1cbiAgICAgIHRoaXMuZGF0YSgpO1xuICAgICAgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGFscmVhZHkgcmVuZGVyZWRcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cENoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgRDMuanMgZHluYW1pY2FsbHlcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRDMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgYmFyIGNoYXJ0IFNWRyBhbmQgcmVuZGVycyBhbGwgZWxlbWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZDMgfHwgIXRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCkgfHwgW107XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGhpZGRlbiBiYXJzIGZvciB2aXNpYmxlIGRhdGFcbiAgICBjb25zdCB2aXNpYmxlRGF0YSA9IGRhdGEuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG5cbiAgICAvLyBDbGVhciBleGlzdGluZyBjaGFydFxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnJykucmVtb3ZlKCk7XG5cbiAgICAvLyBFYXJseSByZXR1cm4gaWYgbm8gZGF0YVxuICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvd05vRGF0YU1lc3NhZ2UoY29udGFpbmVyRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRWFybHkgcmV0dXJuIGlmIGFsbCBiYXJzIGFyZSBoaWRkZW5cbiAgICBpZiAodmlzaWJsZURhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3B0aW9ucyBhbmQgc2V0dXAgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNoYXJ0T3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIHRoaXMuc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQsIGNoYXJ0T3B0aW9ucyk7XG5cbiAgICAvLyBDcmVhdGUgc2NhbGVzIGFuZCBheGVzIHVzaW5nIHZpc2libGUgZGF0YVxuICAgIHRoaXMuc2V0dXBTY2FsZXModmlzaWJsZURhdGEpO1xuICAgIHRoaXMuY3JlYXRlQXhlcyhjaGFydE9wdGlvbnMpO1xuXG4gICAgLy8gUmVuZGVyIHRoZSBiYXJzXG4gICAgdGhpcy5yZW5kZXJCYXJzKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNoYXJ0IHdoZW4gaW5wdXRzIGNoYW5nZVxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgY2hhcnQgcmVzb3VyY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgY2xlYW51cENoYXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN2Zykge1xuICAgICAgdGhpcy5kMz8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KS5zZWxlY3RBbGwoJ3N2ZycpLnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdmcgPSBudWxsO1xuICAgICAgdGhpcy5jaGFydCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBjaGFydCBkaW1lbnNpb25zIGFuZCBjcmVhdGVzIFNWRyB3aXRoIHJlc3BvbnNpdmUgYXR0cmlidXRlc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgbWFyZ2lucyBiYXNlZCBvbiBvcHRpb25zXG4gICAgdGhpcy5jYWxjdWxhdGVNYXJnaW5zKG9wdGlvbnMpO1xuXG4gICAgLy8gR2V0IGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgLy8gSWYgb3B0aW9ucyBzcGVjaWZ5IHdpZHRoIGFuZCBoZWlnaHQsIHVzZSB0aG9zZSwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gY29udGFpbmVyIHNpemVcbiAgICBjb25zdCBtaW5EaW0gPSBNYXRoLm1pbigyMDAsIGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQpOyAvLyBFbnN1cmUgcmVhc29uYWJsZSBtaW5pbXVtXG5cbiAgICBpZiAob3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCkge1xuICAgICAgLy8gRXhwbGljaXQgZGltZW5zaW9ucyBwcm92aWRlZFxuICAgICAgdGhpcy53aWR0aCA9IG9wdGlvbnMud2lkdGggLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7XG4gICAgICB0aGlzLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0IC0gdGhpcy5tYXJnaW4udG9wIC0gdGhpcy5tYXJnaW4uYm90dG9tO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNwb25zaXZlIGRpbWVuc2lvbnNcbiAgICAgIHRoaXMud2lkdGggPSBNYXRoLm1heChjb250YWluZXJXaWR0aCwgbWluRGltKSAtIHRoaXMubWFyZ2luLmxlZnQgLSB0aGlzLm1hcmdpbi5yaWdodDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgoY29udGFpbmVySGVpZ2h0LCBtaW5EaW0pIC0gdGhpcy5tYXJnaW4udG9wIC0gdGhpcy5tYXJnaW4uYm90dG9tO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSByZXNwb25zaXZlIFNWRyB0aGF0IHNjYWxlcyB3aXRoIGl0cyBjb250YWluZXJcbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5hdHRyKFxuICAgICAgICAndmlld0JveCcsXG4gICAgICAgIGAwIDAgJHt0aGlzLndpZHRoICsgdGhpcy5tYXJnaW4ubGVmdCArIHRoaXMubWFyZ2luLnJpZ2h0fSAke3RoaXMuaGVpZ2h0ICsgdGhpcy5tYXJnaW4udG9wICsgdGhpcy5tYXJnaW4uYm90dG9tfWAsXG4gICAgICApXG4gICAgICAuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG5cbiAgICB0aGlzLnN2ZyA9IHN2ZztcblxuICAgIC8vIENyZWF0ZSBjaGFydCBncm91cCB3aXRoIG1hcmdpbnNcbiAgICB0aGlzLmNoYXJ0ID0gdGhpcy5zdmcuYXBwZW5kKCdnJykuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3RoaXMubWFyZ2luLmxlZnR9LCR7dGhpcy5tYXJnaW4udG9wfSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGNoYXJ0IG1hcmdpbnMgYmFzZWQgb24gb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVNYXJnaW5zKG9wdGlvbnM6IEFYQmFyQ2hhcnRPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBTdGFydCB3aXRoIGRlZmF1bHQgbWFyZ2luc1xuICAgIHRoaXMubWFyZ2luID0ge1xuICAgICAgdG9wOiAyMCxcbiAgICAgIHJpZ2h0OiAyMCxcbiAgICAgIGJvdHRvbTogMzAsXG4gICAgICBsZWZ0OiA0MCxcbiAgICB9O1xuXG4gICAgLy8gQWRqdXN0IG1hcmdpbnMgaWYgYXhpcyBsYWJlbHMgYXJlIHByZXNlbnRcbiAgICBpZiAob3B0aW9ucy54QXhpc0xhYmVsKSB7XG4gICAgICBjb25zdCB4TGFiZWxMZW5ndGggPSBvcHRpb25zLnhBeGlzTGFiZWwubGVuZ3RoO1xuICAgICAgY29uc3QgZXh0cmFCb3R0b21NYXJnaW4gPSBNYXRoLm1pbigyMCwgTWF0aC5tYXgoMTAsIHhMYWJlbExlbmd0aCAqIDAuOCkpO1xuICAgICAgdGhpcy5tYXJnaW4uYm90dG9tID0gTWF0aC5tYXgodGhpcy5tYXJnaW4uYm90dG9tLCAzMCArIGV4dHJhQm90dG9tTWFyZ2luKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy55QXhpc0xhYmVsKSB7XG4gICAgICBjb25zdCB5TGFiZWxMZW5ndGggPSBvcHRpb25zLnlBeGlzTGFiZWwubGVuZ3RoO1xuICAgICAgY29uc3QgZXh0cmFMZWZ0TWFyZ2luID0gTWF0aC5taW4oMjAsIE1hdGgubWF4KDEwLCB5TGFiZWxMZW5ndGggKiAwLjgpKTtcbiAgICAgIHRoaXMubWFyZ2luLmxlZnQgPSBNYXRoLm1heCh0aGlzLm1hcmdpbi5sZWZ0LCA0MCArIGV4dHJhTGVmdE1hcmdpbik7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gbWFyZ2lucyBmb3IgYXhlc1xuICAgIGlmIChvcHRpb25zLnNob3dYQXhpcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubWFyZ2luLmJvdHRvbSA9IE1hdGgubWF4KHRoaXMubWFyZ2luLmJvdHRvbSwgMzUpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3dZQXhpcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubWFyZ2luLmxlZnQgPSBNYXRoLm1heCh0aGlzLm1hcmdpbi5sZWZ0LCA0NSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgeCBhbmQgeSBzY2FsZXMgZm9yIHRoZSBjaGFydFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFNjYWxlcyhkYXRhOiBBWEJhckNoYXJ0RGF0YVtdKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBiYXIgd2lkdGggcGVyY2VudGFnZSAoZGVmYXVsdCA4MCUpXG4gICAgY29uc3QgYmFyV2lkdGhQZXJjZW50ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYmFyV2lkdGggPz8gNjAgLyAxMDA7XG4gICAgLy8gQ2FsY3VsYXRlIHBhZGRpbmcgYmFzZWQgb24gYmFyV2lkdGggKGludmVyc2UgcmVsYXRpb25zaGlwKVxuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLjEsIDEgLSBiYXJXaWR0aFBlcmNlbnQpO1xuXG4gICAgLy8gQ3JlYXRlIHggc2NhbGUgKGJhbmQgc2NhbGUgZm9yIGNhdGVnb3JpY2FsIGRhdGEpXG4gICAgdGhpcy54U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVCYW5kKClcbiAgICAgIC5kb21haW4oZGF0YS5tYXAoKGQpID0+IGQubGFiZWwpKVxuICAgICAgLnJhbmdlKFswLCB0aGlzLndpZHRoXSlcbiAgICAgIC5wYWRkaW5nKHBhZGRpbmcpO1xuXG4gICAgLy8gQ3JlYXRlIHkgc2NhbGUgKGxpbmVhciBzY2FsZSBmb3IgdmFsdWVzKVxuICAgIHRoaXMueVNjYWxlID0gdGhpcy5kM1xuICAgICAgLnNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oWzAsIHRoaXMuZDMubWF4KGRhdGEsIChkKSA9PiBkLnZhbHVlKSB8fCAwXSlcbiAgICAgIC5uaWNlKClcbiAgICAgIC5yYW5nZShbdGhpcy5oZWlnaHQsIDBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHggYW5kIHkgYXhlcyB3aXRoIGdyaWQgbGluZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXhlcyhvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgLy8gT25seSBjcmVhdGUgYXhlcyBpZiB0aGV5IGFyZSBlbmFibGVkIGluIG9wdGlvbnNcbiAgICBjb25zdCBzaG93WEF4aXMgPSBvcHRpb25zLnNob3dYQXhpcyAhPT0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd1lBeGlzID0gb3B0aW9ucy5zaG93WUF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dHcmlkID0gb3B0aW9ucy5zaG93R3JpZCAhPT0gZmFsc2U7XG4gICAgY29uc3QgaXNSdGwgPSB0aGlzLnBsYXRmb3JtLmlzUnRsKCk7XG5cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgYWxsIGF4ZXNcbiAgICBjb25zdCBheGVzR3JvdXAgPSB0aGlzLmNoYXJ0LmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGVzJyk7XG5cbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICAvLyBDcmVhdGUgWCBheGlzXG4gICAgICB0aGlzLnhBeGlzID0gYXhlc0dyb3VwXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMteCcpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt0aGlzLmhlaWdodH0pYClcbiAgICAgICAgLmNhbGwodGhpcy5kMy5heGlzQm90dG9tKHRoaXMueFNjYWxlKSk7XG5cbiAgICAgIC8vIFN0eWxlIHRoZSBheGlzIHRleHRcbiAgICAgIGNvbnN0IGR5bmFtaWNYQXhpc1RpY2tGb250U2l6ZSA9IE1hdGgubWF4KDExLCBNYXRoLm1pbigxNSwgTWF0aC5yb3VuZCh0aGlzLndpZHRoIC8gNDUpKSk7XG4gICAgICB0aGlzLnhBeGlzXG4gICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2R5bmFtaWNYQXhpc1RpY2tGb250U2l6ZX1weGApXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNDAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtbGFiZWxzLWNvbG9yKSwgMC43KScpO1xuXG4gICAgICAvLyBTdHlsZSBhbGwgbGluZXMgaW4gdGhlIHgtYXhpcyAocGF0aCwgdGlja3MpXG4gICAgICB0aGlzLnhBeGlzLnNlbGVjdEFsbCgnbGluZSwgcGF0aCcpLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpO1xuXG4gICAgICAvLyBBZGQgWCBheGlzIGxhYmVsIGlmIHByb3ZpZGVkXG4gICAgICBpZiAob3B0aW9ucy54QXhpc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsWSA9IHRoaXMuaGVpZ2h0ICsgdGhpcy5tYXJnaW4uYm90dG9tICogMC44O1xuXG4gICAgICAgIGF4ZXNHcm91cFxuICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy1sYWJlbCBheC14LWF4aXMtbGFiZWwnKVxuICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCd4JywgdGhpcy53aWR0aCAvIDIpXG4gICAgICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMTRweCcpXG4gICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgICAgICAudGV4dChvcHRpb25zLnhBeGlzTGFiZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93WUF4aXMpIHtcbiAgICAgIC8vIENyZWF0ZSBZIGF4aXNcbiAgICAgIHRoaXMueUF4aXMgPSBheGVzR3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMteScpLmNhbGwodGhpcy5kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSkpO1xuXG4gICAgICAvLyBTdHlsZSB0aGUgYXhpcyB0ZXh0XG4gICAgICBjb25zdCBkeW5hbWljWUF4aXNUaWNrRm9udFNpemUgPSBNYXRoLm1heCgxMSwgTWF0aC5taW4oMTUsIE1hdGgucm91bmQodGhpcy5oZWlnaHQgLyAzMCkpKTtcbiAgICAgIGNvbnN0IHlUaWNrVGV4dHMgPSB0aGlzLnlBeGlzXG4gICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke2R5bmFtaWNZQXhpc1RpY2tGb250U2l6ZX1weGApXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNDAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtbGFiZWxzLWNvbG9yKSwgMC43KScpO1xuXG4gICAgICBpZiAoaXNSdGwpIHtcbiAgICAgICAgeVRpY2tUZXh0cy5hdHRyKCd0ZXh0LWFuY2hvcicsICdzdGFydCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdHlsZSBhbGwgbGluZXMgaW4gdGhlIHktYXhpcyAocGF0aCwgdGlja3MpXG4gICAgICB0aGlzLnlBeGlzLnNlbGVjdEFsbCgnbGluZSwgcGF0aCcpLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpO1xuXG4gICAgICAvLyBBZGQgWSBheGlzIGxhYmVsIGlmIHByb3ZpZGVkXG4gICAgICBpZiAob3B0aW9ucy55QXhpc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsWCA9IC10aGlzLmhlaWdodCAvIDI7XG4gICAgICAgIGNvbnN0IGxhYmVsWSA9IC10aGlzLm1hcmdpbi5sZWZ0ICogMC44O1xuXG4gICAgICAgIGF4ZXNHcm91cFxuICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy1sYWJlbCBheC15LWF4aXMtbGFiZWwnKVxuICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdtaWRkbGUnKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKC05MCknKVxuICAgICAgICAgIC5hdHRyKCd4JywgbGFiZWxYKVxuICAgICAgICAgIC5hdHRyKCd5JywgbGFiZWxZKVxuICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzE0cHgnKVxuICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWF4aXMtbGFiZWwtY29sb3IpKScpXG4gICAgICAgICAgLnRleHQob3B0aW9ucy55QXhpc0xhYmVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0dyaWQpIHtcbiAgICAgIC8vIEFkZCBob3Jpem9udGFsIGdyaWQgbGluZXNcbiAgICAgIHRoaXMuY2hhcnRcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtZ3JpZCcpXG4gICAgICAgIC5jYWxsKFxuICAgICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAgIC5heGlzTGVmdCh0aGlzLnlTY2FsZSlcbiAgICAgICAgICAgIC50aWNrU2l6ZSgtdGhpcy53aWR0aClcbiAgICAgICAgICAgIC50aWNrRm9ybWF0KCgpID0+ICcnKSxcbiAgICAgICAgKVxuICAgICAgICAuc2VsZWN0QWxsKCdsaW5lJylcbiAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlLW9wYWNpdHknLCAwLjIpO1xuXG4gICAgICAvLyBSZW1vdmUgdW5uZWVkZWQgZWxlbWVudHMgZnJvbSBncmlkXG4gICAgICB0aGlzLmNoYXJ0LnNlbGVjdCgnLmF4LWJhci1jaGFydC1ncmlkJykuc2VsZWN0QWxsKCdwYXRoLCB0ZXh0JykucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJhcnMgd2l0aCBhbmltYXRpb25zXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckJhcnMoZGF0YTogQVhCYXJDaGFydERhdGFbXSk6IHZvaWQge1xuICAgIC8vIEZpbHRlciBvdXQgaGlkZGVuIGJhcnNcbiAgICBjb25zdCB2aXNpYmxlRGF0YSA9IGRhdGEuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgY29uc3Qgb3JpZ2luYWxGdWxsRGF0YSA9IHRoaXMuZGF0YSgpOyAvLyBHZXQgdGhlIG9yaWdpbmFsIGZ1bGwgZGF0YSBzZXRcblxuICAgIC8vIFJlc2V0IGFuaW1hdGlvbiBzdGF0ZVxuICAgIHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZS5zZXQoZmFsc2UpO1xuXG4gICAgLy8gR2V0IGNvcm5lciByYWRpdXMgZnJvbSBvcHRpb25zXG4gICAgY29uc3QgcmFkaXVzID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuY29ybmVyUmFkaXVzO1xuXG4gICAgLy8gR2V0IGFuaW1hdGlvbiBvcHRpb25zXG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EdXJhdGlvbjtcbiAgICBjb25zdCBhbmltYXRpb25FYXNpbmcgPSB0aGlzLmdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIGFsbCBiYXJzXG4gICAgY29uc3QgYmFyc0NvbnRhaW5lciA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcnMtY29udGFpbmVyJyk7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXBzIGZvciBlYWNoIGJhciB0byBoYW5kbGUgdHJhbnNmb3JtYXRpb25zXG4gICAgY29uc3QgYmFyR3JvdXBzID0gYmFyc0NvbnRhaW5lclxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXItZ3JvdXAnKVxuICAgICAgLmRhdGEodmlzaWJsZURhdGEpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyLWdyb3VwJyk7XG5cbiAgICAvLyBBZGQgYmFycyBpbnNpZGUgZ3JvdXBzXG4gICAgY29uc3QgYmFycyA9IGJhckdyb3Vwc1xuICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAuYXR0cigneCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gdGhpcy54U2NhbGUoZC5sYWJlbCkpXG4gICAgICAuYXR0cignd2lkdGgnLCB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKSlcbiAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQpIC8vIFN0YXJ0IGZyb20gYm90dG9tIGZvciBhbmltYXRpb25cbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAwKSAvLyBTdGFydCB3aXRoIGhlaWdodCAwIGZvciBhbmltYXRpb25cbiAgICAgIC5hdHRyKCdyeCcsIHJhZGl1cykgLy8gUm91bmRlZCBjb3JuZXJzXG4gICAgICAuYXR0cigncnknLCByYWRpdXMpIC8vIFJvdW5kZWQgY29ybmVyc1xuICAgICAgLmF0dHIoJ2ZpbGwnLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgYmFyIChkKSBpbiB0aGUgb3JpZ2luYWwgZGF0YSBhcnJheVxuICAgICAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxGdWxsRGF0YS5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGQuaWQpO1xuICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbG9yIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZ2V0IGNvbG9yIGZyb20gcGFsZXR0ZSB1c2luZyBvcmlnaW5hbCBpbmRleFxuICAgICAgICAvLyBGYWxsYmFjayB0byBpbmRleCAwIGlmIG5vdCBmb3VuZCwgdGhvdWdoIHRoaXMgc2hvdWxkbid0IGhhcHBlbiB3aXRoIHZhbGlkIGRhdGEuXG4gICAgICAgIHJldHVybiBkLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3Iob3JpZ2luYWxJbmRleCAhPT0gLTEgPyBvcmlnaW5hbEluZGV4IDogMCk7XG4gICAgICB9KTtcblxuICAgIC8vIEFkZCBkYXRhIGxhYmVscyBpZiB0aGV5J3JlIGVuYWJsZWRcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0RhdGFMYWJlbHMgIT09IGZhbHNlKSB7XG4gICAgICBiYXJHcm91cHNcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAuYXR0cigneCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gdGhpcy54U2NhbGUoZC5sYWJlbCkgKyB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXG4gICAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQpIC8vIFN0YXJ0IGZyb20gYm90dG9tIGZvciBhbmltYXRpb25cbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnY2xhbXAoOHB4LCAydm1pbiwgMTJweCknKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzUwMCcpXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZGF0YS1sYWJlbHMtY29sb3IpKScpXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApIC8vIFN0YXJ0IGludmlzaWJsZSBmb3IgYW5pbWF0aW9uXG4gICAgICAgIC50ZXh0KChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gZC52YWx1ZSk7XG5cbiAgICAgIC8vIEFuaW1hdGUgZGF0YSBsYWJlbHNcbiAgICAgIGJhckdyb3Vwc1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgICAgLmRlbGF5KChkOiBBWEJhckNoYXJ0RGF0YSwgaTogbnVtYmVyKSA9PiBpICogNTAgKyAxMDApIC8vIFNsaWdodGx5IGRlbGF5ZWQgYWZ0ZXIgYmFyIGFuaW1hdGlvblxuICAgICAgICAuYXR0cigneScsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gdGhpcy55U2NhbGUoZC52YWx1ZSkgLSA4KSAvLyBQb3NpdGlvbiBhYm92ZSBiYXJcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgZXZlbnQgaGFuZGxlcnMgb24gZWFjaCBncm91cFxuICAgIGJhckdyb3Vwc1xuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICAvLyBPbmx5IGFwcGx5IGhvdmVyIGVmZmVjdHMgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGJhckVsID0gdGhpcy5kMy5zZWxlY3QoZXZlbnQuY3VycmVudFRhcmdldCkuc2VsZWN0KCdyZWN0Jyk7XG5cbiAgICAgICAgLy8gU3RhbmRhcmQgaG92ZXIgZWZmZWN0IC0gZGFya2VuIHRoZSBiYXIgc2xpZ2h0bHkgYW5kIGFkZCBhIHN1YnRsZSBzaGFkb3dcbiAgICAgICAgYmFyRWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKDE1MCkuc3R5bGUoJ2ZpbHRlcicsICdicmlnaHRuZXNzKDAuNykgZHJvcC1zaGFkb3coMCAwIDJweCByZ2JhKDAsMCwwLDAuMSkpJyk7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVCYXJIb3ZlcihldmVudCwgZCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgLy8gT25seSB1cGRhdGUgdG9vbHRpcCBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAodGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ21vdXNlbGVhdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYXBwbHkgaG92ZXIgZWZmZWN0cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3JlY3QnKTtcblxuICAgICAgICAvLyBSZW1vdmUgaG92ZXIgZWZmZWN0XG4gICAgICAgIGJhckVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxNTApLnN0eWxlKCdmaWx0ZXInLCBudWxsKTtcblxuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdHJpZ2dlciBjbGljayBldmVudHMgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVCYXJDbGljayhldmVudCwgZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGFuaW1hdGlvblxuICAgIGJhcnNcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5kZWxheSgoZDogQVhCYXJDaGFydERhdGEsIGk6IG51bWJlcikgPT4gaSAqIDUwKSAvLyBTdGFnZ2VyIGVhY2ggYmFyIGFuaW1hdGlvblxuICAgICAgLmF0dHIoJ3knLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHRoaXMueVNjYWxlKGQudmFsdWUpKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gdGhpcy5oZWlnaHQgLSB0aGlzLnlTY2FsZShkLnZhbHVlKSlcbiAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZykgLy8gVXNlIHRoZSBjb25maWd1cmVkIGVhc2luZyBmdW5jdGlvblxuICAgICAgLmVuZCgpIC8vIFdhaXQgZm9yIGFsbCBhbmltYXRpb25zIHRvIGNvbXBsZXRlXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIE1hcmsgYW5pbWF0aW9uIGFzIGNvbXBsZXRlIHRvIGVuYWJsZSBob3ZlciBlZmZlY3RzXG4gICAgICAgIHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZS5zZXQodHJ1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBEMyBlYXNpbmcgZnVuY3Rpb24gYmFzZWQgb24gdGhlIG9wdGlvbiBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgZ2V0RWFzaW5nRnVuY3Rpb24oZWFzaW5nPzogc3RyaW5nKTogYW55IHtcbiAgICBzd2l0Y2ggKGVhc2luZykge1xuICAgICAgY2FzZSAnbGluZWFyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZUxpbmVhcjtcbiAgICAgIGNhc2UgJ2Vhc2UnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlUG9seUluT3V0O1xuICAgICAgY2FzZSAnZWFzZS1pbic6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5SW47XG4gICAgICBjYXNlICdlYXNlLW91dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VQb2x5T3V0O1xuICAgICAgY2FzZSAnZWFzZS1pbi1vdXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlUG9seUluT3V0O1xuICAgICAgY2FzZSAnY3ViaWMnOlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWM7XG4gICAgICBjYXNlICdjdWJpYy1pbic6XG4gICAgICAgIHJldHVybiB0aGlzLmQzLmVhc2VDdWJpY0luO1xuICAgICAgY2FzZSAnY3ViaWMtb3V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZUN1YmljT3V0O1xuICAgICAgY2FzZSAnY3ViaWMtaW4tb3V0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMuZWFzZUN1YmljSW5PdXQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5kMy5lYXNlQ3ViaWNPdXQ7IC8vIERlZmF1bHQgZWFzaW5nXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYmFyIGhvdmVyIGV2ZW50IGFuZCBzaG93cyB0b29sdGlwXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUJhckhvdmVyKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXR1bTogQVhCYXJDaGFydERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXAgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZGF0YSgpLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZGF0dW0uaWQpO1xuICAgICAgY29uc3QgY29sb3IgPSBkYXR1bS5jb2xvciB8fCB0aGlzLmdldENvbG9yKGluZGV4KTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBlcmNlbnRhZ2Ugb2YgdG90YWxcbiAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5kYXRhKCkucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApO1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/ICgoZGF0dW0udmFsdWUgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMSkgOiAnMCc7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICAgIHRpdGxlOiBkYXR1bS50b29sdGlwTGFiZWwgfHwgZGF0dW0ubGFiZWwsXG4gICAgICAgIHZhbHVlOiBkYXR1bS52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICBwZXJjZW50YWdlOiBgJHtwZXJjZW50YWdlfSVgLFxuICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRvb2x0aXAgcG9zaXRpb24gYmFzZWQgb24gbW91c2UgY29vcmRpbmF0ZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0b29sdGlwRWwgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJyk7XG5cbiAgICBpZiAoIXRvb2x0aXBFbCkge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSBjb250YWluZXIubGVmdDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgIHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5zZXQoeyB4LCB5IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCB4ID0gZXZlbnQuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcblxuICAgIC8vIEFkanVzdCBwb3NpdGlvbiBpZiBuZWFyIHRoZSByaWdodCBlZGdlXG4gICAgaWYgKHggKyB0b29sdGlwUmVjdC53aWR0aCArIDEwID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICB4ID0geCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4ICsgMTA7XG4gICAgfVxuXG4gICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldCh7IHgsIHkgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBiYXIgY2xpY2sgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQmFyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdHVtOiBBWEJhckNoYXJ0RGF0YSk6IHZvaWQge1xuICAgIHRoaXMuYmFyQ2xpY2suZW1pdCh7IGl0ZW06IGRhdHVtLCBldmVudDogeyBuYXRpdmVFdmVudDogZXZlbnQsIHNlbmRlcjogdGhpcyB9IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbWVzc2FnZSB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBwcml2YXRlIHNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgY29udGVudHMgZmlyc3RcbiAgICB0aGlzLmQzLnNlbGVjdChjb250YWluZXJFbGVtZW50KS5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTtcblxuICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBjb250YWluZXIgY2xhc3MsIHNwZWNpZmljIGJhciBjaGFydCBiYWNrZ3JvdW5kIGNsYXNzLCBhbmQgZXhpc3Rpbmcgc3BlY2lmaWMgY2xhc3NcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lciBheC1iYXItY2hhcnQtbWVzc2FnZS1iYWNrZ3JvdW5kIGF4LWJhci1jaGFydC1uby1kYXRhLW1lc3NhZ2UnKTtcblxuICAgIC8vIEFkZCBhbiBpY29uXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC8vIEFwcGx5IGdlbmVyaWMgaWNvbiBjbGFzcyBhbmQgc3BlY2lmaWMgYmFyIGNoYXJ0IGljb24gY2xhc3NcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWljb24gYXgtYmFyLWNoYXJ0LW5vLWRhdGEtaWNvbicpXG4gICAgICAuaHRtbCgnPGkgY2xhc3M9XCJmYS1saWdodCBmYS1jaGFydC1jb2x1bW4gZmEtMnhcIj48L2k+Jyk7XG5cbiAgICAvLyBBZGQgdGV4dCBtZXNzYWdlXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC8vIEFwcGx5IGdlbmVyaWMgdGV4dCBjbGFzcyBhbmQgc3BlY2lmaWMgYmFyIGNoYXJ0IHRleHQgY2xhc3NcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLXRleHQgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtdGV4dCcpXG4gICAgICAudGV4dCgnTm8gZGF0YSBhdmFpbGFibGUnKTtcblxuICAgIC8vIEFkZCBoZWxwIHRleHRcbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBoZWxwIGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgaGVscCBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaGVscCBheC1iYXItY2hhcnQtbm8tZGF0YS1oZWxwJylcbiAgICAgIC50ZXh0KCdQbGVhc2UgcHJvdmlkZSBkYXRhIHRvIGRpc3BsYXkgdGhlIGNoYXJ0Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gYWxsIGJhcnMgYXJlIGhpZGRlblxuICAgKi9cbiAgcHJpdmF0ZSBzaG93QWxsQmFyc0hpZGRlbk1lc3NhZ2UoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50cyBmaXJzdFxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAvLyBBcHBseSBnZW5lcmljIGNvbnRhaW5lciBjbGFzcywgc3BlY2lmaWMgYmFyIGNoYXJ0IGJhY2tncm91bmQgY2xhc3MsIGFuZCBleGlzdGluZyBzcGVjaWZpYyBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtY29udGFpbmVyIGF4LWJhci1jaGFydC1tZXNzYWdlLWJhY2tncm91bmQgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtbWVzc2FnZScpO1xuXG4gICAgLy8gQWRkIGFuIGljb25cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyBpY29uIGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgaWNvbiBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtaWNvbiBheC1iYXItY2hhcnQtbm8tZGF0YS1pY29uJylcbiAgICAgIC5odG1sKCc8aSBjbGFzcz1cImZhLWxpZ2h0IGZhLWV5ZS1zbGFzaCBmYS0yeFwiPjwvaT4nKTtcblxuICAgIC8vIEFkZCB0ZXh0IG1lc3NhZ2VcbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLy8gQXBwbHkgZ2VuZXJpYyB0ZXh0IGNsYXNzIGFuZCBzcGVjaWZpYyBiYXIgY2hhcnQgdGV4dCBjbGFzc1xuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWNoYXJ0LW1lc3NhZ2UtdGV4dCBheC1iYXItY2hhcnQtbm8tZGF0YS10ZXh0JylcbiAgICAgIC50ZXh0KCdBbGwgYmFycyBhcmUgaGlkZGVuJyk7XG5cbiAgICAvLyBBZGQgaGVscCB0ZXh0XG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC8vIEFwcGx5IGdlbmVyaWMgaGVscCBjbGFzcyBhbmQgc3BlY2lmaWMgYmFyIGNoYXJ0IGhlbHAgY2xhc3NcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1jaGFydC1tZXNzYWdlLWhlbHAgYXgtYmFyLWNoYXJ0LW5vLWRhdGEtaGVscCcpXG4gICAgICAudGV4dCgnQ2xpY2sgb24gbGVnZW5kIGl0ZW1zIHRvIHNob3cgYmFycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbG9yIGZvciBhIGJhciBiYXNlZCBvbiBpdHMgaW5kZXhcbiAgICovXG4gIHByb3RlY3RlZCBnZXRDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q2hhcnRDb2xvcihpbmRleCwgdGhpcy5jaGFydENvbG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgYmFyIGlzIGhpZGRlblxuICAgKi9cbiAgcHJvdGVjdGVkIGlzQmFySGlkZGVuKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oaWRkZW5CYXJzLmhhcyhpZCk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIFJldHVybnMgbGVnZW5kIGl0ZW1zIGJhc2VkIG9uIHRoZSBjaGFydCBkYXRhXG4gICAqL1xuICBnZXRMZWdlbmRJdGVtcygpOiBBWENoYXJ0TGVnZW5kSXRlbVtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCkgfHwgW107XG4gICAgY29uc3QgdG90YWwgPSBkYXRhLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyAodHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDApLCAwKTtcblxuICAgIHJldHVybiBkYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKHZhbHVlIC8gdG90YWwpICogMTAwIDogMDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgIG5hbWU6IGl0ZW0ubGFiZWwgfHwgYEl0ZW0gJHtpbmRleCArIDF9YCxcbiAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICAgIHBlcmNlbnRhZ2UsXG4gICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXgpLFxuICAgICAgICBoaWRkZW46IHRoaXMuaXNCYXJIaWRkZW4oaXRlbS5pZCksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIGludGVyZmFjZVxuICAgKiBIaWdobGlnaHRzIGEgc3BlY2lmaWMgYmFyIGJ5IElEXG4gICAqL1xuICBoaWdobGlnaHRTZWdtZW50KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2ZykgcmV0dXJuO1xuXG4gICAgLy8gSWYgdGhlIGJhciBpcyBoaWRkZW4sIHdlIHNob3VsZG4ndCB0cnkgdG8gaGlnaGxpZ2h0IGl0XG4gICAgaWYgKGlkICE9PSBudWxsICYmIHRoaXMuaXNCYXJIaWRkZW4oaWQpKSB7XG4gICAgICAvLyBKdXN0IHVuaGlnaGxpZ2h0IGV2ZXJ5dGhpbmcgd2hlbiB0cnlpbmcgdG8gaGlnaGxpZ2h0IGEgaGlkZGVuIGJhclxuICAgICAgdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJywgZmFsc2UpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgZmFsc2UpXG4gICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSlcbiAgICAgICAgLmF0dHIoJ2ZpbHRlcicsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgbnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAvLyBJZiBpZCBpcyBudWxsLCB1bmhpZ2hsaWdodCBldmVyeXRoaW5nXG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCBudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSB0YXJnZXQgYmFyXG4gICAgY29uc3QgdGFyZ2V0QmFyID0gdGhpcy5zdmcuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpLmZpbHRlcigoZDogYW55KSA9PiBkPy5pZCA9PT0gaWQpO1xuXG4gICAgLy8gU2FmZXR5IGNoZWNrIC0gaWYgbm8gbWF0Y2hpbmcgYmFyIGlzIGZvdW5kLCBkbyBub3RoaW5nXG4gICAgaWYgKHRhcmdldEJhci5lbXB0eSgpKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGJhciBpcyBjdXJyZW50bHkgaGlnaGxpZ2h0ZWRcbiAgICBjb25zdCBpc0N1cnJlbnRseUhpZ2hsaWdodGVkID0gdGFyZ2V0QmFyLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcpO1xuXG4gICAgaWYgKGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQpIHtcbiAgICAgIC8vIElmIGFscmVhZHkgaGlnaGxpZ2h0ZWQsIHVuaGlnaGxpZ2h0IGFsbCBiYXJzXG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzZXQgYWxsIGJhcnMgZmlyc3RcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcsIGZhbHNlKVxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWRpbW1lZCcsIGZhbHNlKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgIC5hdHRyKCdmaWx0ZXInLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsIG51bGwpO1xuXG4gICAgICAvLyBIaWdobGlnaHQgdGhlIHRhcmdldCBiYXJcbiAgICAgIHRhcmdldEJhclxuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ2ZpbHRlcicsICdkcm9wLXNoYWRvdygwIDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4zKSknKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJyMwMDAnKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgJzFweCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsICcwLjMnKVxuICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnYWxsIDAuMnMgZWFzZS1pbi1vdXQnKTtcblxuICAgICAgLy8gRGltIG90aGVyIGJhcnNcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmZpbHRlcigoZDogYW55KSA9PiBkPy5pZCAhPT0gaWQpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwLjUpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIGJhciBieSBJRFxuICAgKiBAcmV0dXJucyBOZXcgdmlzaWJpbGl0eSBzdGF0ZSAodHJ1ZSA9IHZpc2libGUsIGZhbHNlID0gaGlkZGVuKVxuICAgKi9cbiAgdG9nZ2xlU2VnbWVudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgd2FzQWxsSGlkZGVuID0gdGhpcy5kYXRhKCkubGVuZ3RoID4gMCAmJiB0aGlzLmRhdGEoKS5ldmVyeSgoZCkgPT4gdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5CYXJzLmhhcyhpZCkpIHtcbiAgICAgIC8vIE1ha2luZyBhIGJhciB2aXNpYmxlXG4gICAgICB0aGlzLmhpZGRlbkJhcnMuZGVsZXRlKGlkKTtcblxuICAgICAgLy8gSWYgYWxsIGJhcnMgd2VyZSBwcmV2aW91c2x5IGhpZGRlbiwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIG1lc3NhZ2UgaXMgY2xlYXJlZFxuICAgICAgaWYgKHdhc0FsbEhpZGRlbikge1xuICAgICAgICAvLyBGb3JjZSBjb21wbGV0ZSBET00gY2xlYW51cCBhbmQgcmVkcmF3XG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIC8vIENsZWFyIGV2ZXJ5dGhpbmcgaW4gdGhlIGNvbnRhaW5lclxuICAgICAgICAgIHRoaXMuZDM/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50KS5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTtcblxuICAgICAgICAgIC8vIEZvcmNlIGZ1bGwgcmVkcmF3XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbCB1cGRhdGUgZm9yIG90aGVyIGNhc2VzXG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGlkaW5nIGEgYmFyXG4gICAgICB0aGlzLmhpZGRlbkJhcnMuYWRkKGlkKTtcbiAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIG5ldyB2aXNpYmlsaXR5IHN0YXRlXG4gICAgcmV0dXJuICF0aGlzLmhpZGRlbkJhcnMuaGFzKGlkKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImF4LWJhci1jaGFydFwiICNjaGFydENvbnRhaW5lcj5cbiAgPCEtLSBTaGFyZWQgdG9vbHRpcCBjb21wb25lbnQgLS0+XG4gIDxheC1jaGFydC10b29sdGlwXG4gICAgW3Zpc2libGVdPVwidG9vbHRpcFZpc2libGUoKVwiXG4gICAgW3Bvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbigpXCJcbiAgICBbZGF0YV09XCJ0b29sdGlwRGF0YSgpXCJcbiAgICBbc2hvd1BlcmNlbnRhZ2VdPVwidHJ1ZVwiXG4gID48L2F4LWNoYXJ0LXRvb2x0aXA+XG48L2Rpdj5cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1iYXItY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvYmFyLWNoYXJ0L3NyYy9hY29yZXgtY2hhcnRzLWJhci1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as i1 from '@angular/common';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { input, output, computed, ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
5
|
+
|
|
6
|
+
class AXChartLegendComponent {
|
|
7
|
+
/**
|
|
8
|
+
* Chart component instance
|
|
9
|
+
* Must implement AXChartLegendCompatible interface
|
|
10
|
+
*/
|
|
11
|
+
chart = input.required();
|
|
12
|
+
/**
|
|
13
|
+
* Configuration options for the legend
|
|
14
|
+
*/
|
|
15
|
+
options = input({});
|
|
16
|
+
/**
|
|
17
|
+
* Event emitted when a legend item is clicked
|
|
18
|
+
* Returns the item that was clicked
|
|
19
|
+
*/
|
|
20
|
+
itemClick = output();
|
|
21
|
+
/**
|
|
22
|
+
* Event emitted when the mouse enters a legend item
|
|
23
|
+
*/
|
|
24
|
+
itemMouseEnter = output();
|
|
25
|
+
/**
|
|
26
|
+
* Event emitted when the mouse leaves a legend item
|
|
27
|
+
*/
|
|
28
|
+
itemMouseLeave = output();
|
|
29
|
+
/**
|
|
30
|
+
* Reference to legend container for measuring dimensions
|
|
31
|
+
*/
|
|
32
|
+
legendContainer;
|
|
33
|
+
// Computed values for the template
|
|
34
|
+
showValues = computed(() => this.options()?.showValues !== false);
|
|
35
|
+
showPercentage = computed(() => this.options()?.showPercentage !== false);
|
|
36
|
+
containerClass = computed(() => {
|
|
37
|
+
const opts = this.options();
|
|
38
|
+
const className = opts?.className || '';
|
|
39
|
+
const mode = opts?.mode || 'vertical'; // Default to vertical
|
|
40
|
+
return {
|
|
41
|
+
'ax-chart-legend': true,
|
|
42
|
+
[className]: !!className,
|
|
43
|
+
[`ax-legend-${mode}`]: true, // Add mode-specific class
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
// Track if the legend is interactive
|
|
47
|
+
isInteractive = computed(() => this.options()?.interactive !== false);
|
|
48
|
+
// Compute the items to display from the chart
|
|
49
|
+
displayItems = computed(() => {
|
|
50
|
+
return this.chart().getLegendItems();
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Handle clicks on legend items
|
|
54
|
+
*/
|
|
55
|
+
onItemClick(item) {
|
|
56
|
+
const chartInstance = this.chart();
|
|
57
|
+
// If we have a chart and it's interactive, toggle the segment
|
|
58
|
+
if (this.isInteractive()) {
|
|
59
|
+
const isVisible = chartInstance.toggleSegment(item.id);
|
|
60
|
+
// Update the item's hidden state to reflect the current state
|
|
61
|
+
item.hidden = !isVisible;
|
|
62
|
+
}
|
|
63
|
+
// Always emit the item click event
|
|
64
|
+
this.itemClick.emit(item);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Handle mouse enter on legend items
|
|
68
|
+
*/
|
|
69
|
+
onItemMouseEnter(item) {
|
|
70
|
+
this.chart().highlightSegment(null);
|
|
71
|
+
this.itemMouseEnter.emit(item);
|
|
72
|
+
this.chart().highlightSegment(item.id);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Handle mouse leave on legend items
|
|
76
|
+
*/
|
|
77
|
+
onItemMouseLeave(item) {
|
|
78
|
+
this.itemMouseLeave.emit(item);
|
|
79
|
+
this.chart().highlightSegment(null);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get legend container dimensions
|
|
83
|
+
*/
|
|
84
|
+
getDimensions() {
|
|
85
|
+
if (!this.legendContainer?.nativeElement) {
|
|
86
|
+
return { width: 0, height: 0 };
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
width: this.legendContainer.nativeElement.offsetWidth,
|
|
90
|
+
height: this.legendContainer.nativeElement.offsetHeight,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AXChartLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
94
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: AXChartLegendComponent, isStandalone: true, selector: "ax-chart-legend", inputs: { chart: { classPropertyName: "chart", publicName: "chart", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", itemMouseEnter: "itemMouseEnter", itemMouseLeave: "itemMouseLeave" }, viewQueries: [{ propertyName: "legendContainer", first: true, predicate: ["legendContainer"], descendants: true }], ngImport: i0, template: "<div #legendContainer [ngClass]=\"containerClass()\">\n @for (item of displayItems(); track item.id) {\n <div\n class=\"ax-legend-item\"\n [class.ax-legend-item-hidden]=\"item.hidden\"\n (click)=\"onItemClick(item)\"\n (mouseenter)=\"onItemMouseEnter(item)\"\n (mouseleave)=\"onItemMouseLeave(item)\"\n >\n <span class=\"ax-legend-color\" [style.background-color]=\"item.color\"></span>\n <span class=\"ax-legend-name\">{{ item.name }}</span>\n @if (showValues()) {\n <span class=\"ax-legend-value\">{{ item.value }}</span>\n }\n @if (showPercentage()) {\n <span class=\"ax-legend-percentage\">{{ item.percentage }}%</span>\n }\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--ax-legend-bg: var(--ax-sys-color-lightest, #ffffff);--ax-legend-text: var(--ax-sys-color-on-lightest, #333333);--ax-legend-border: var(--ax-sys-color-border, rgba(0, 0, 0, .1));--ax-legend-shadow: 0 2px 8px rgba(0, 0, 0, .06);--ax-legend-radius: .5rem;--ax-legend-padding: .75rem;--ax-legend-gap: .5rem;--ax-legend-item-height: 1.75rem}.ax-chart-legend{display:flex;flex-direction:column;background-color:var(--ax-legend-bg);border-radius:var(--ax-legend-radius);border:1px solid var(--ax-legend-border);box-shadow:var(--ax-legend-shadow);padding:var(--ax-legend-padding);gap:var(--ax-legend-gap);overflow-y:auto;max-height:100%;width:100%}.ax-chart-legend.ax-legend-horizontal{flex-direction:row;flex-wrap:wrap;align-items:center}.ax-legend-item{display:flex;align-items:baseline;gap:.5rem;padding:.25rem .5rem;border-radius:.25rem;cursor:pointer;white-space:nowrap;height:var(--ax-legend-item-height);transition:all .15s ease;color:var(--ax-legend-text)}.ax-legend-item:hover{background-color:#0000000a}.ax-legend-item:active{transform:scale(.98)}.ax-legend-item.ax-legend-item-hidden{opacity:.75}.ax-legend-item.ax-legend-item-hidden>.ax-legend-name{text-decoration:line-through}.ax-legend-item.ax-legend-item-hidden .ax-legend-color{opacity:.4;position:relative}.ax-legend-item.ax-legend-item-hidden .ax-legend-color:after{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:repeating-linear-gradient(45deg,rgba(255,255,255,.5),rgba(255,255,255,.5) 2px,transparent 2px,transparent 4px);border-radius:inherit}.ax-legend-color{width:12px;height:12px;border-radius:3px;flex-shrink:0}.ax-legend-name{font-size:.875rem;font-weight:500}.ax-legend-value{font-size:.75rem;opacity:.7;margin-left:.25rem}.ax-legend-percentage{font-size:.7rem;font-weight:500;margin-left:.35rem;padding:.1rem .35rem;border-radius:.5rem;background-color:#0000000d;line-height:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
95
|
+
}
|
|
96
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AXChartLegendComponent, decorators: [{
|
|
97
|
+
type: Component,
|
|
98
|
+
args: [{ selector: 'ax-chart-legend', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #legendContainer [ngClass]=\"containerClass()\">\n @for (item of displayItems(); track item.id) {\n <div\n class=\"ax-legend-item\"\n [class.ax-legend-item-hidden]=\"item.hidden\"\n (click)=\"onItemClick(item)\"\n (mouseenter)=\"onItemMouseEnter(item)\"\n (mouseleave)=\"onItemMouseLeave(item)\"\n >\n <span class=\"ax-legend-color\" [style.background-color]=\"item.color\"></span>\n <span class=\"ax-legend-name\">{{ item.name }}</span>\n @if (showValues()) {\n <span class=\"ax-legend-value\">{{ item.value }}</span>\n }\n @if (showPercentage()) {\n <span class=\"ax-legend-percentage\">{{ item.percentage }}%</span>\n }\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--ax-legend-bg: var(--ax-sys-color-lightest, #ffffff);--ax-legend-text: var(--ax-sys-color-on-lightest, #333333);--ax-legend-border: var(--ax-sys-color-border, rgba(0, 0, 0, .1));--ax-legend-shadow: 0 2px 8px rgba(0, 0, 0, .06);--ax-legend-radius: .5rem;--ax-legend-padding: .75rem;--ax-legend-gap: .5rem;--ax-legend-item-height: 1.75rem}.ax-chart-legend{display:flex;flex-direction:column;background-color:var(--ax-legend-bg);border-radius:var(--ax-legend-radius);border:1px solid var(--ax-legend-border);box-shadow:var(--ax-legend-shadow);padding:var(--ax-legend-padding);gap:var(--ax-legend-gap);overflow-y:auto;max-height:100%;width:100%}.ax-chart-legend.ax-legend-horizontal{flex-direction:row;flex-wrap:wrap;align-items:center}.ax-legend-item{display:flex;align-items:baseline;gap:.5rem;padding:.25rem .5rem;border-radius:.25rem;cursor:pointer;white-space:nowrap;height:var(--ax-legend-item-height);transition:all .15s ease;color:var(--ax-legend-text)}.ax-legend-item:hover{background-color:#0000000a}.ax-legend-item:active{transform:scale(.98)}.ax-legend-item.ax-legend-item-hidden{opacity:.75}.ax-legend-item.ax-legend-item-hidden>.ax-legend-name{text-decoration:line-through}.ax-legend-item.ax-legend-item-hidden .ax-legend-color{opacity:.4;position:relative}.ax-legend-item.ax-legend-item-hidden .ax-legend-color:after{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:repeating-linear-gradient(45deg,rgba(255,255,255,.5),rgba(255,255,255,.5) 2px,transparent 2px,transparent 4px);border-radius:inherit}.ax-legend-color{width:12px;height:12px;border-radius:3px;flex-shrink:0}.ax-legend-name{font-size:.875rem;font-weight:500}.ax-legend-value{font-size:.75rem;opacity:.7;margin-left:.25rem}.ax-legend-percentage{font-size:.7rem;font-weight:500;margin-left:.35rem;padding:.1rem .35rem;border-radius:.5rem;background-color:#0000000d;line-height:1}\n"] }]
|
|
99
|
+
}], propDecorators: { legendContainer: [{
|
|
100
|
+
type: ViewChild,
|
|
101
|
+
args: ['legendContainer']
|
|
102
|
+
}] } });
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Generated bundle index. Do not edit.
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
export { AXChartLegendComponent };
|
|
109
|
+
//# sourceMappingURL=acorex-charts-chart-legend.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-charts-chart-legend.mjs","sources":["../tmp-esm2022/chart-legend/lib/chart-legend.component.js","../tmp-esm2022/chart-legend/acorex-charts-chart-legend.js"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, ViewChild, computed, input, output } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nexport class AXChartLegendComponent {\n /**\n * Chart component instance\n * Must implement AXChartLegendCompatible interface\n */\n chart = input.required();\n /**\n * Configuration options for the legend\n */\n options = input({});\n /**\n * Event emitted when a legend item is clicked\n * Returns the item that was clicked\n */\n itemClick = output();\n /**\n * Event emitted when the mouse enters a legend item\n */\n itemMouseEnter = output();\n /**\n * Event emitted when the mouse leaves a legend item\n */\n itemMouseLeave = output();\n /**\n * Reference to legend container for measuring dimensions\n */\n legendContainer;\n // Computed values for the template\n showValues = computed(() => this.options()?.showValues !== false);\n showPercentage = computed(() => this.options()?.showPercentage !== false);\n containerClass = computed(() => {\n const opts = this.options();\n const className = opts?.className || '';\n const mode = opts?.mode || 'vertical'; // Default to vertical\n return {\n 'ax-chart-legend': true,\n [className]: !!className,\n [`ax-legend-${mode}`]: true, // Add mode-specific class\n };\n });\n // Track if the legend is interactive\n isInteractive = computed(() => this.options()?.interactive !== false);\n // Compute the items to display from the chart\n displayItems = computed(() => {\n return this.chart().getLegendItems();\n });\n /**\n * Handle clicks on legend items\n */\n onItemClick(item) {\n const chartInstance = this.chart();\n // If we have a chart and it's interactive, toggle the segment\n if (this.isInteractive()) {\n const isVisible = chartInstance.toggleSegment(item.id);\n // Update the item's hidden state to reflect the current state\n item.hidden = !isVisible;\n }\n // Always emit the item click event\n this.itemClick.emit(item);\n }\n /**\n * Handle mouse enter on legend items\n */\n onItemMouseEnter(item) {\n this.chart().highlightSegment(null);\n this.itemMouseEnter.emit(item);\n this.chart().highlightSegment(item.id);\n }\n /**\n * Handle mouse leave on legend items\n */\n onItemMouseLeave(item) {\n this.itemMouseLeave.emit(item);\n this.chart().highlightSegment(null);\n }\n /**\n * Get legend container dimensions\n */\n getDimensions() {\n if (!this.legendContainer?.nativeElement) {\n return { width: 0, height: 0 };\n }\n return {\n width: this.legendContainer.nativeElement.offsetWidth,\n height: this.legendContainer.nativeElement.offsetHeight,\n };\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.4\", ngImport: i0, type: AXChartLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.0.4\", type: AXChartLegendComponent, isStandalone: true, selector: \"ax-chart-legend\", inputs: { chart: { classPropertyName: \"chart\", publicName: \"chart\", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: \"itemClick\", itemMouseEnter: \"itemMouseEnter\", itemMouseLeave: \"itemMouseLeave\" }, viewQueries: [{ propertyName: \"legendContainer\", first: true, predicate: [\"legendContainer\"], descendants: true }], ngImport: i0, template: \"<div #legendContainer [ngClass]=\\\"containerClass()\\\">\\n @for (item of displayItems(); track item.id) {\\n <div\\n class=\\\"ax-legend-item\\\"\\n [class.ax-legend-item-hidden]=\\\"item.hidden\\\"\\n (click)=\\\"onItemClick(item)\\\"\\n (mouseenter)=\\\"onItemMouseEnter(item)\\\"\\n (mouseleave)=\\\"onItemMouseLeave(item)\\\"\\n >\\n <span class=\\\"ax-legend-color\\\" [style.background-color]=\\\"item.color\\\"></span>\\n <span class=\\\"ax-legend-name\\\">{{ item.name }}</span>\\n @if (showValues()) {\\n <span class=\\\"ax-legend-value\\\">{{ item.value }}</span>\\n }\\n @if (showPercentage()) {\\n <span class=\\\"ax-legend-percentage\\\">{{ item.percentage }}%</span>\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\":host{display:block;width:100%;height:100%;--ax-legend-bg: var(--ax-sys-color-lightest, #ffffff);--ax-legend-text: var(--ax-sys-color-on-lightest, #333333);--ax-legend-border: var(--ax-sys-color-border, rgba(0, 0, 0, .1));--ax-legend-shadow: 0 2px 8px rgba(0, 0, 0, .06);--ax-legend-radius: .5rem;--ax-legend-padding: .75rem;--ax-legend-gap: .5rem;--ax-legend-item-height: 1.75rem}.ax-chart-legend{display:flex;flex-direction:column;background-color:var(--ax-legend-bg);border-radius:var(--ax-legend-radius);border:1px solid var(--ax-legend-border);box-shadow:var(--ax-legend-shadow);padding:var(--ax-legend-padding);gap:var(--ax-legend-gap);overflow-y:auto;max-height:100%;width:100%}.ax-chart-legend.ax-legend-horizontal{flex-direction:row;flex-wrap:wrap;align-items:center}.ax-legend-item{display:flex;align-items:baseline;gap:.5rem;padding:.25rem .5rem;border-radius:.25rem;cursor:pointer;white-space:nowrap;height:var(--ax-legend-item-height);transition:all .15s ease;color:var(--ax-legend-text)}.ax-legend-item:hover{background-color:#0000000a}.ax-legend-item:active{transform:scale(.98)}.ax-legend-item.ax-legend-item-hidden{opacity:.75}.ax-legend-item.ax-legend-item-hidden>.ax-legend-name{text-decoration:line-through}.ax-legend-item.ax-legend-item-hidden .ax-legend-color{opacity:.4;position:relative}.ax-legend-item.ax-legend-item-hidden .ax-legend-color:after{content:\\\"\\\";position:absolute;top:0;left:0;right:0;bottom:0;background:repeating-linear-gradient(45deg,rgba(255,255,255,.5),rgba(255,255,255,.5) 2px,transparent 2px,transparent 4px);border-radius:inherit}.ax-legend-color{width:12px;height:12px;border-radius:3px;flex-shrink:0}.ax-legend-name{font-size:.875rem;font-weight:500}.ax-legend-value{font-size:.75rem;opacity:.7;margin-left:.25rem}.ax-legend-percentage{font-size:.7rem;font-weight:500;margin-left:.35rem;padding:.1rem .35rem;border-radius:.5rem;background-color:#0000000d;line-height:1}\\n\"], dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: i1.NgClass, selector: \"[ngClass]\", inputs: [\"class\", \"ngClass\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.4\", ngImport: i0, type: AXChartLegendComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-chart-legend', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div #legendContainer [ngClass]=\\\"containerClass()\\\">\\n @for (item of displayItems(); track item.id) {\\n <div\\n class=\\\"ax-legend-item\\\"\\n [class.ax-legend-item-hidden]=\\\"item.hidden\\\"\\n (click)=\\\"onItemClick(item)\\\"\\n (mouseenter)=\\\"onItemMouseEnter(item)\\\"\\n (mouseleave)=\\\"onItemMouseLeave(item)\\\"\\n >\\n <span class=\\\"ax-legend-color\\\" [style.background-color]=\\\"item.color\\\"></span>\\n <span class=\\\"ax-legend-name\\\">{{ item.name }}</span>\\n @if (showValues()) {\\n <span class=\\\"ax-legend-value\\\">{{ item.value }}</span>\\n }\\n @if (showPercentage()) {\\n <span class=\\\"ax-legend-percentage\\\">{{ item.percentage }}%</span>\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\":host{display:block;width:100%;height:100%;--ax-legend-bg: var(--ax-sys-color-lightest, #ffffff);--ax-legend-text: var(--ax-sys-color-on-lightest, #333333);--ax-legend-border: var(--ax-sys-color-border, rgba(0, 0, 0, .1));--ax-legend-shadow: 0 2px 8px rgba(0, 0, 0, .06);--ax-legend-radius: .5rem;--ax-legend-padding: .75rem;--ax-legend-gap: .5rem;--ax-legend-item-height: 1.75rem}.ax-chart-legend{display:flex;flex-direction:column;background-color:var(--ax-legend-bg);border-radius:var(--ax-legend-radius);border:1px solid var(--ax-legend-border);box-shadow:var(--ax-legend-shadow);padding:var(--ax-legend-padding);gap:var(--ax-legend-gap);overflow-y:auto;max-height:100%;width:100%}.ax-chart-legend.ax-legend-horizontal{flex-direction:row;flex-wrap:wrap;align-items:center}.ax-legend-item{display:flex;align-items:baseline;gap:.5rem;padding:.25rem .5rem;border-radius:.25rem;cursor:pointer;white-space:nowrap;height:var(--ax-legend-item-height);transition:all .15s ease;color:var(--ax-legend-text)}.ax-legend-item:hover{background-color:#0000000a}.ax-legend-item:active{transform:scale(.98)}.ax-legend-item.ax-legend-item-hidden{opacity:.75}.ax-legend-item.ax-legend-item-hidden>.ax-legend-name{text-decoration:line-through}.ax-legend-item.ax-legend-item-hidden .ax-legend-color{opacity:.4;position:relative}.ax-legend-item.ax-legend-item-hidden .ax-legend-color:after{content:\\\"\\\";position:absolute;top:0;left:0;right:0;bottom:0;background:repeating-linear-gradient(45deg,rgba(255,255,255,.5),rgba(255,255,255,.5) 2px,transparent 2px,transparent 4px);border-radius:inherit}.ax-legend-color{width:12px;height:12px;border-radius:3px;flex-shrink:0}.ax-legend-name{font-size:.875rem;font-weight:500}.ax-legend-value{font-size:.75rem;opacity:.7;margin-left:.25rem}.ax-legend-percentage{font-size:.7rem;font-weight:500;margin-left:.35rem;padding:.1rem .35rem;border-radius:.5rem;background-color:#0000000d;line-height:1}\\n\"] }]\n }], propDecorators: { legendContainer: [{\n type: ViewChild,\n args: ['legendContainer']\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtbGVnZW5kLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9jaGFydC1sZWdlbmQvc3JjL2xpYi9jaGFydC1sZWdlbmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2NoYXJ0LWxlZ2VuZC9zcmMvbGliL2NoYXJ0LWxlZ2VuZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFXbkgsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQzs7O09BR0c7SUFDSCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBMkIsQ0FBQztJQUVsRDs7T0FFRztJQUNILE9BQU8sR0FBRyxLQUFLLENBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBRTFDOzs7T0FHRztJQUNILFNBQVMsR0FBRyxNQUFNLEVBQXFCLENBQUM7SUFFeEM7O09BRUc7SUFDSCxjQUFjLEdBQUcsTUFBTSxFQUFxQixDQUFDO0lBRTdDOztPQUVHO0lBQ0gsY0FBYyxHQUFHLE1BQU0sRUFBcUIsQ0FBQztJQUU3Qzs7T0FFRztJQUMyQixlQUFlLENBQThCO0lBRTNFLG1DQUFtQztJQUN6QixVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxVQUFVLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDbEUsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lB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QGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgY29tcHV0ZWQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSwgQVhDaGFydExlZ2VuZE9wdGlvbnMgfSBmcm9tICcuL2NoYXJ0LWxlZ2VuZC50eXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtY2hhcnQtbGVnZW5kJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LWxlZ2VuZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoYXJ0LWxlZ2VuZC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYQ2hhcnRMZWdlbmRDb21wb25lbnQge1xuICAvKipcbiAgICogQ2hhcnQgY29tcG9uZW50IGluc3RhbmNlXG4gICAqIE11c3QgaW1wbGVtZW50IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIGludGVyZmFjZVxuICAgKi9cbiAgY2hhcnQgPSBpbnB1dC5yZXF1aXJlZDxBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZT4oKTtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbGVnZW5kXG4gICAqL1xuICBvcHRpb25zID0gaW5wdXQ8QVhDaGFydExlZ2VuZE9wdGlvbnM+KHt9KTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgbGVnZW5kIGl0ZW0gaXMgY2xpY2tlZFxuICAgKiBSZXR1cm5zIHRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWRcbiAgICovXG4gIGl0ZW1DbGljayA9IG91dHB1dDxBWENoYXJ0TGVnZW5kSXRlbT4oKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBtb3VzZSBlbnRlcnMgYSBsZWdlbmQgaXRlbVxuICAgKi9cbiAgaXRlbU1vdXNlRW50ZXIgPSBvdXRwdXQ8QVhDaGFydExlZ2VuZEl0ZW0+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgbW91c2UgbGVhdmVzIGEgbGVnZW5kIGl0ZW1cbiAgICovXG4gIGl0ZW1Nb3VzZUxlYXZlID0gb3V0cHV0PEFYQ2hhcnRMZWdlbmRJdGVtPigpO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gbGVnZW5kIGNvbnRhaW5lciBmb3IgbWVhc3VyaW5nIGRpbWVuc2lvbnNcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2xlZ2VuZENvbnRhaW5lcicpIGxlZ2VuZENvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIC8vIENvbXB1dGVkIHZhbHVlcyBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCBzaG93VmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCk/LnNob3dWYWx1ZXMgIT09IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHNob3dQZXJjZW50YWdlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCk/LnNob3dQZXJjZW50YWdlICE9PSBmYWxzZSk7XG4gIHByb3RlY3RlZCBjb250YWluZXJDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zKCk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gb3B0cz8uY2xhc3NOYW1lIHx8ICcnO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRzPy5tb2RlIHx8ICd2ZXJ0aWNhbCc7IC8vIERlZmF1bHQgdG8gdmVydGljYWxcbiAgICByZXR1cm4ge1xuICAgICAgJ2F4LWNoYXJ0LWxlZ2VuZCc6IHRydWUsXG4gICAgICBbY2xhc3NOYW1lXTogISFjbGFzc05hbWUsXG4gICAgICBbYGF4LWxlZ2VuZC0ke21vZGV9YF06IHRydWUsIC8vIEFkZCBtb2RlLXNwZWNpZmljIGNsYXNzXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gVHJhY2sgaWYgdGhlIGxlZ2VuZCBpcyBpbnRlcmFjdGl2ZVxuICBwcm90ZWN0ZWQgaXNJbnRlcmFjdGl2ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2UpO1xuXG4gIC8vIENvbXB1dGUgdGhlIGl0ZW1zIHRvIGRpc3BsYXkgZnJvbSB0aGUgY2hhcnRcbiAgcHJvdGVjdGVkIGRpc3BsYXlJdGVtcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFydCgpLmdldExlZ2VuZEl0ZW1zKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2tzIG9uIGxlZ2VuZCBpdGVtc1xuICAgKi9cbiAgcHJvdGVjdGVkIG9uSXRlbUNsaWNrKGl0ZW06IEFYQ2hhcnRMZWdlbmRJdGVtKTogdm9pZCB7XG4gICAgY29uc3QgY2hhcnRJbnN0YW5jZSA9IHRoaXMuY2hhcnQoKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBjaGFydCBhbmQgaXQncyBpbnRlcmFjdGl2ZSwgdG9nZ2xlIHRoZSBzZWdtZW50XG4gICAgaWYgKHRoaXMuaXNJbnRlcmFjdGl2ZSgpKSB7XG4gICAgICBjb25zdCBpc1Zpc2libGUgPSBjaGFydEluc3RhbmNlLnRvZ2dsZVNlZ21lbnQoaXRlbS5pZCk7XG4gICAgICAvLyBVcGRhdGUgdGhlIGl0ZW0ncyBoaWRkZW4gc3RhdGUgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgaXRlbS5oaWRkZW4gPSAhaXNWaXNpYmxlO1xuICAgIH1cblxuICAgIC8vIEFsd2F5cyBlbWl0IHRoZSBpdGVtIGNsaWNrIGV2ZW50XG4gICAgdGhpcy5pdGVtQ2xpY2suZW1pdChpdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW91c2UgZW50ZXIgb24gbGVnZW5kIGl0ZW1zXG4gICAqL1xuICBwcm90ZWN0ZWQgb25JdGVtTW91c2VFbnRlcihpdGVtOiBBWENoYXJ0TGVnZW5kSXRlbSk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnQoKS5oaWdobGlnaHRTZWdtZW50KG51bGwpO1xuICAgIHRoaXMuaXRlbU1vdXNlRW50ZXIuZW1pdChpdGVtKTtcbiAgICB0aGlzLmNoYXJ0KCkuaGlnaGxpZ2h0U2VnbWVudChpdGVtLmlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW91c2UgbGVhdmUgb24gbGVnZW5kIGl0ZW1zXG4gICAqL1xuICBwcm90ZWN0ZWQgb25JdGVtTW91c2VMZWF2ZShpdGVtOiBBWENoYXJ0TGVnZW5kSXRlbSk6IHZvaWQge1xuICAgIHRoaXMuaXRlbU1vdXNlTGVhdmUuZW1pdChpdGVtKTtcbiAgICB0aGlzLmNoYXJ0KCkuaGlnaGxpZ2h0U2VnbWVudChudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGVnZW5kIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAqL1xuICBnZXREaW1lbnNpb25zKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgaWYgKCF0aGlzLmxlZ2VuZENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogdGhpcy5sZWdlbmRDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5sZWdlbmRDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQsXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiAjbGVnZW5kQ29udGFpbmVyIFtuZ0NsYXNzXT1cImNvbnRhaW5lckNsYXNzKClcIj5cbiAgQGZvciAoaXRlbSBvZiBkaXNwbGF5SXRlbXMoKTsgdHJhY2sgaXRlbS5pZCkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiYXgtbGVnZW5kLWl0ZW1cIlxuICAgICAgW2NsYXNzLmF4LWxlZ2VuZC1pdGVtLWhpZGRlbl09XCJpdGVtLmhpZGRlblwiXG4gICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwib25JdGVtTW91c2VFbnRlcihpdGVtKVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJvbkl0ZW1Nb3VzZUxlYXZlKGl0ZW0pXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cImF4LWxlZ2VuZC1jb2xvclwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIml0ZW0uY29sb3JcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImF4LWxlZ2VuZC1uYW1lXCI+e3sgaXRlbS5uYW1lIH19PC9zcGFuPlxuICAgICAgQGlmIChzaG93VmFsdWVzKCkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJheC1sZWdlbmQtdmFsdWVcIj57eyBpdGVtLnZhbHVlIH19PC9zcGFuPlxuICAgICAgfVxuICAgICAgQGlmIChzaG93UGVyY2VudGFnZSgpKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtbGVnZW5kLXBlcmNlbnRhZ2VcIj57eyBpdGVtLnBlcmNlbnRhZ2UgfX0lPC9zcGFuPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1jaGFydC1sZWdlbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvY2hhcnQtbGVnZW5kL3NyYy9hY29yZXgtY2hhcnRzLWNoYXJ0LWxlZ2VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as i1 from '@angular/common';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { inject, NgZone, input, afterNextRender, ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
5
|
+
|
|
6
|
+
class AXChartTooltipComponent {
|
|
7
|
+
ngZone = inject(NgZone);
|
|
8
|
+
data = input(null);
|
|
9
|
+
position = input({ x: 0, y: 0 });
|
|
10
|
+
visible = input(false);
|
|
11
|
+
/**
|
|
12
|
+
* Whether to show the tooltip's percentage badge
|
|
13
|
+
*/
|
|
14
|
+
showPercentage = input(true);
|
|
15
|
+
/**
|
|
16
|
+
* Optional custom styling for the tooltip
|
|
17
|
+
*/
|
|
18
|
+
style = input({});
|
|
19
|
+
/**
|
|
20
|
+
* Reference to tooltip container for measuring dimensions
|
|
21
|
+
*/
|
|
22
|
+
tooltipContainer;
|
|
23
|
+
// Tooltip dimensions
|
|
24
|
+
tooltipWidth = 0;
|
|
25
|
+
tooltipHeight = 0;
|
|
26
|
+
constructor() {
|
|
27
|
+
afterNextRender(() => {
|
|
28
|
+
// Update tooltip dimensions when visible changes
|
|
29
|
+
this.updateTooltipDimensions();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Updates tooltip dimensions after it's rendered
|
|
34
|
+
*/
|
|
35
|
+
updateTooltipDimensions() {
|
|
36
|
+
if (this.visible() && this.tooltipContainer) {
|
|
37
|
+
this.ngZone.runOutsideAngular(() => {
|
|
38
|
+
// Use requestAnimationFrame to ensure dimensions are calculated after render
|
|
39
|
+
requestAnimationFrame(() => {
|
|
40
|
+
if (this.tooltipContainer?.nativeElement) {
|
|
41
|
+
this.tooltipWidth = this.tooltipContainer.nativeElement.offsetWidth;
|
|
42
|
+
this.tooltipHeight = this.tooltipContainer.nativeElement.offsetHeight;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get adjusted tooltip position
|
|
50
|
+
* Exposes properties for parent components to query tooltip dimensions
|
|
51
|
+
*/
|
|
52
|
+
getDimensions() {
|
|
53
|
+
return {
|
|
54
|
+
width: this.tooltipWidth,
|
|
55
|
+
height: this.tooltipHeight,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AXChartTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
59
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: AXChartTooltipComponent, isStandalone: true, selector: "ax-chart-tooltip", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, showPercentage: { classPropertyName: "showPercentage", publicName: "showPercentage", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "tooltipContainer", first: true, predicate: ["tooltipContainer"], descendants: true }], ngImport: i0, template: "@if (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\n >\n <div class=\"chart-tooltip-title\">{{ data()!.title }}</div>\n <div class=\"chart-tooltip-content\">\n @if (data()!.color) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"data()!.color\"></div>\n }\n <div class=\"chart-tooltip-value\">{{ data()!.value }}</div>\n @if (showPercentage() && data()!.percentage) {\n <div class=\"chart-tooltip-percentage\">{{ data()!.percentage }}</div>\n }\n </div>\n </div>\n}\n", styles: [".chart-tooltip{position:absolute;pointer-events:none;background-color:#212121e6;color:#fff;padding:.5rem .75rem;border-radius:.375rem;font-size:.8rem;z-index:10;box-shadow:0 4px 12px #00000026;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:1px solid rgba(255,255,255,.1);transform:translate(10px,-50%);max-width:200px;transition:opacity .15s ease,transform .15s ease}.chart-tooltip-title{font-weight:600;padding-bottom:.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-content{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.chart-tooltip-color{width:10px;height:10px;border-radius:2px;flex-shrink:0;box-shadow:0 1px 2px #0003}.chart-tooltip-value{font-weight:500;flex-grow:1}.chart-tooltip-percentage{background-color:#fff3;padding:.125rem .375rem;border-radius:1rem;font-size:.7rem;font-weight:500;flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
60
|
+
}
|
|
61
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AXChartTooltipComponent, decorators: [{
|
|
62
|
+
type: Component,
|
|
63
|
+
args: [{ selector: 'ax-chart-tooltip', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\n >\n <div class=\"chart-tooltip-title\">{{ data()!.title }}</div>\n <div class=\"chart-tooltip-content\">\n @if (data()!.color) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"data()!.color\"></div>\n }\n <div class=\"chart-tooltip-value\">{{ data()!.value }}</div>\n @if (showPercentage() && data()!.percentage) {\n <div class=\"chart-tooltip-percentage\">{{ data()!.percentage }}</div>\n }\n </div>\n </div>\n}\n", styles: [".chart-tooltip{position:absolute;pointer-events:none;background-color:#212121e6;color:#fff;padding:.5rem .75rem;border-radius:.375rem;font-size:.8rem;z-index:10;box-shadow:0 4px 12px #00000026;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:1px solid rgba(255,255,255,.1);transform:translate(10px,-50%);max-width:200px;transition:opacity .15s ease,transform .15s ease}.chart-tooltip-title{font-weight:600;padding-bottom:.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-content{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.chart-tooltip-color{width:10px;height:10px;border-radius:2px;flex-shrink:0;box-shadow:0 1px 2px #0003}.chart-tooltip-value{font-weight:500;flex-grow:1}.chart-tooltip-percentage{background-color:#fff3;padding:.125rem .375rem;border-radius:1rem;font-size:.7rem;font-weight:500;flex-shrink:0}\n"] }]
|
|
64
|
+
}], ctorParameters: () => [], propDecorators: { tooltipContainer: [{
|
|
65
|
+
type: ViewChild,
|
|
66
|
+
args: ['tooltipContainer']
|
|
67
|
+
}] } });
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Generated bundle index. Do not edit.
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
export { AXChartTooltipComponent };
|
|
74
|
+
//# sourceMappingURL=acorex-charts-chart-tooltip.mjs.map
|