@acorex/charts 20.9.2 → 20.9.4
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/bar-chart/index.d.ts +1 -0
- package/donut-chart/index.d.ts +1 -0
- package/fesm2022/acorex-charts-bar-chart.mjs +40 -39
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-tooltip.mjs +17 -13
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs +16 -5
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs +9 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs +111 -8
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs +9 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts.mjs +18 -26
- package/fesm2022/acorex-charts.mjs.map +1 -1
- package/funnel-chart/index.d.ts +1 -0
- package/gauge-chart/index.d.ts +24 -0
- package/heatmap-chart/index.d.ts +1 -0
- package/package.json +5 -5
|
@@ -1 +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_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXBarChartDefaultConfig = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n rotateXAxisLabels: 'auto',\n barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-chart-column',\n },\n};\nexport const AX_BAR_CHART_CONFIG = new InjectionToken('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXBarChartDefaultConfig,\n});\nexport function barChartConfig(config = {}) {\n return {\n ...AXBarChartDefaultConfig,\n ...config,\n messages: {\n ...AXBarChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLE1BQU07SUFDekIsUUFBUSxFQUFFLEVBQUU7SUFDWixZQUFZLEVBQUUsQ0FBQztJQUNmLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsR0FBRyx5QkFBeUI7UUFDNUIsVUFBVSxFQUFFLDBCQUEwQjtLQUN2QztDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBbUIscUJBQXFCLEVBQUU7SUFDN0YsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLHVCQUF1QjtDQUN2QyxDQUFDLENBQUM7QUFJSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQWdDLEVBQUU7SUFDL0QsT0FBTztRQUNMLEdBQUcsdUJBQXVCO1FBQzFCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcsdUJBQXVCLENBQUMsUUFBUTtZQUNuQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYQmFyQ2hhcnRPcHRpb24gfSBmcm9tICcuL2Jhci1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYQmFyQ2hhcnREZWZhdWx0Q29uZmlnOiBBWEJhckNoYXJ0T3B0aW9uID0ge1xuICBzaG93WEF4aXM6IHRydWUsXG4gIHNob3dZQXhpczogdHJ1ZSxcbiAgc2hvd0dyaWQ6IHRydWUsXG4gIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICBzaG93VG9vbHRpcDogdHJ1ZSxcbiAgcm90YXRlWEF4aXNMYWJlbHM6ICdhdXRvJyxcbiAgYmFyV2lkdGg6IDgwLFxuICBjb3JuZXJSYWRpdXM6IDQsXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA4MDAsXG4gIGFuaW1hdGlvbkVhc2luZzogJ2N1YmljLW91dCcsXG4gIG1lc3NhZ2VzOiB7XG4gICAgLi4uQVhfQ0hBUlRfREVGQVVMVF9NRVNTQUdFUyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtY2hhcnQtY29sdW1uJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9CQVJfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYQmFyQ2hhcnRPcHRpb24+KCdBWF9CQVJfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IEFYQmFyQ2hhcnREZWZhdWx0Q29uZmlnLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhCYXJDaGFydE9wdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXJDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IHt9KTogQVhCYXJDaGFydE9wdGlvbiB7XG4gIHJldHVybiB7XG4gICAgLi4uQVhCYXJDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAuLi5BWEJhckNoYXJ0RGVmYXVsdENvbmZpZy5tZXNzYWdlcyxcbiAgICAgIC4uLmNvbmZpZy5tZXNzYWdlcyxcbiAgICB9LFxuICB9O1xufVxuIl19","import { AX_CHART_COLOR_PALETTE, AXChartComponent, formatLargeNumber, getChartColor, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, resolveBarWidthFraction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\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 AXChartComponent {\n // Inputs\n /** Chart data input */\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\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 - using proper D3 types\n svg;\n chart;\n xScale;\n yScale;\n xSubScale;\n xAxis;\n yAxis;\n // Chart dimensions\n width;\n height;\n margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Constants for layout calculations\n CHAR_WIDTH_RATIO = 0.65;\n TOOLTIP_GAP = 10;\n AXIS_TICK_PADDING = 10;\n Y_AXIS_TITLE_THICKNESS = 14;\n Y_AXIS_TITLE_PADDING = 14;\n X_AXIS_TITLE_FONT_SIZE = 14;\n X_AXIS_TITLE_GAP = 14;\n X_AXIS_TITLE_BLOCK_HEIGHT = 24;\n TOP_EDGE_PADDING = 8;\n BOTTOM_EDGE_PADDING = 8;\n HORIZONTAL_EDGE_PADDING = 12;\n FALLBACK_PLOT_HEIGHT = 240;\n MIN_PLOT_HEIGHT = 120;\n MIN_TOTAL_WIDTH = 200;\n OUTER_PADDING_CLUSTERED = 0.2;\n INNER_PADDING_CLUSTERED = 0.1;\n MIN_PADDING = 0.1;\n HOVER_TRANSITION_DURATION = 150;\n DEFAULT_ANIMATION_DELAY = 50;\n LABEL_ANIMATION_DELAY = 100;\n MIN_TOP_SPACE_FOR_LABEL = 20;\n LABEL_OFFSET = 8;\n ROTATION_TOLERANCE_SMALL_DATASET = 1.4;\n SMALL_DATASET_THRESHOLD = 6;\n Y_AXIS_PADDING = 20;\n TICK_AREA_PADDING = 6;\n TICK_AREA_GAP = 8;\n DEFAULT_FONT_SIZE = 13;\n FONT_WIDTH_MULTIPLIER = 0.6;\n FONT_PADDING = 8;\n MAX_LABEL_LENGTH = 20;\n MIN_FONT_SIZE_X_AXIS = 8;\n MAX_FONT_SIZE_X_AXIS = 14;\n MIN_FONT_SIZE_Y_AXIS = 9;\n MAX_FONT_SIZE_Y_AXIS = 15;\n MANY_ITEMS_THRESHOLD = 20;\n VERY_MANY_ITEMS_THRESHOLD = 50;\n // Animation state\n _initialAnimationComplete = signal(false, ...(ngDevMode ? [{ debugName: \"_initialAnimationComplete\" }] : []));\n // Tooltip state\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\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 // Removed unused AXPlatform injection\n // Configuration with defaults\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Messages with defaults\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Track hidden bars and series\n hiddenBars = new Set();\n hiddenSeries = new Set();\n // Computed values for better performance\n isClusteredMode = computed(() => {\n const value = this.data();\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }, ...(ngDevMode ? [{ debugName: \"isClusteredMode\" }] : []));\n visibleData = computed(() => {\n const value = this.data() || [];\n if (this.isClusteredMode()) {\n return value;\n }\n return value.filter((d) => !this.hiddenBars.has(d.id));\n }, ...(ngDevMode ? [{ debugName: \"visibleData\" }] : []));\n hasVisibleData = computed(() => {\n const value = this.data();\n if (!Array.isArray(value) || value.length === 0)\n return false;\n if (this.isClusteredMode()) {\n const groups = value;\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n return groups.some((g) => visibleSeries.some((label) => !!g.chartData.find((item) => item.label === label)));\n }\n return value.some((d) => !this.hiddenBars.has(d.id));\n }, ...(ngDevMode ? [{ debugName: \"hasVisibleData\" }] : []));\n // Type guard helper\n isClusteredData(value) {\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }\n getClusterSeriesLabels(groups) {\n return groups[0]?.chartData?.map((d) => d.label) ?? [];\n }\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 inputValue = (this.data() || []);\n const isClustered = this.isClusteredData(inputValue);\n // Use computed visibility\n const hasAnyVisible = this.hasVisibleData();\n const visibleSingleData = isClustered ? [] : this.visibleData();\n const groupedData = isClustered ? inputValue : [];\n // Clear existing chart SVG and messages (do not remove tooltip component)\n this.d3.select(containerElement).selectAll('svg, .ax-chart-message-container').remove();\n // Early return if no data\n if (!Array.isArray(inputValue) || inputValue.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n // Early return if all bars are hidden\n if (!hasAnyVisible) {\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 and render based on mode\n if (isClustered) {\n this.setupScalesClustered(groupedData);\n this.createAxesClustered(chartOptions, groupedData);\n this.renderBarsClustered(groupedData);\n }\n else {\n this.setupScales(visibleSingleData);\n this.createAxes(chartOptions);\n this.renderBars(visibleSingleData);\n }\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._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.d3?.select(container).selectAll('svg, .ax-chart-message-container').remove();\n }\n this.svg = undefined;\n this.chart = undefined;\n this._tooltipVisible.set(false);\n }\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n setupDimensions(containerElement, options) {\n // Remove outer margins; calculate only internal paddings for axes and labels\n this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Axis visibility\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n // Internal left padding for Y-axis ticks/labels/title\n const yAxisTitleThickness = options.yAxisLabel ? this.Y_AXIS_TITLE_THICKNESS : 0;\n const yAxisTitlePadding = options.yAxisLabel ? this.Y_AXIS_TITLE_PADDING : 0;\n const leftPaddingForYAxis = showYAxis\n ? this.calculateMaxYAxisTickLabelWidth() + this.AXIS_TICK_PADDING + yAxisTitlePadding + yAxisTitleThickness\n : 0;\n const leftInnerPadding = leftPaddingForYAxis + this.HORIZONTAL_EDGE_PADDING;\n const rightInnerPadding = this.HORIZONTAL_EDGE_PADDING;\n // Estimate internal bottom padding for X-axis ticks/labels/title\n let bottomPaddingForXAxis = 0;\n if (showXAxis) {\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n const barCount = isClustered ? raw.length : raw.length;\n const longestLabel = (() => {\n if (isClustered) {\n const groups = raw;\n return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n }\n const flat = raw || [];\n return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n })();\n const baseWidth = options.width ?? containerWidth;\n const workingWidth = Math.max(1, baseWidth - leftInnerPadding - rightInnerPadding);\n const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n // Use truncated label length for calculation (same logic as actual rendering)\n const maxLabelLength = barCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * dynamicFontSize * 0.65;\n const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n const rotateOption = typeof options.rotateXAxisLabels === 'boolean' ? options.rotateXAxisLabels : undefined;\n const willRotate = this.shouldLabelsRotate(rotateOption, estimatedLongestLabelWidth, availableWidthPerBar);\n const tickAreaHeight = willRotate\n ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING\n : dynamicFontSize + this.TICK_AREA_PADDING + 2;\n const gapBelowTicks = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_GAP : 0;\n const titleBlockHeight = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_BLOCK_HEIGHT : 0;\n bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n }\n // Determine plotting dimensions with sensible fallbacks\n const baseWidth = options.width ?? containerWidth;\n const totalWidth = Math.max(this.MIN_TOTAL_WIDTH, baseWidth > 0 ? baseWidth : this.MIN_TOTAL_WIDTH);\n const plotWidth = Math.max(0, totalWidth - leftInnerPadding - rightInnerPadding);\n const plotHeight = this.calculatePlotHeight(options.height, containerHeight, bottomPaddingForXAxis);\n this.width = plotWidth;\n this.height = plotHeight;\n // Create SVG with explicit pixel dimensions to avoid collapse\n const totalHeight = this.height + bottomPaddingForXAxis + this.TOP_EDGE_PADDING + this.BOTTOM_EDGE_PADDING;\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n // Create chart group translated by internal paddings (no external margins)\n this.chart = this.svg\n .append('g')\n .attr('class', 'chart-content')\n .attr('transform', `translate(${leftInnerPadding},${this.TOP_EDGE_PADDING})`);\n }\n /**\n * Calculates plot height based on options and container dimensions\n */\n calculatePlotHeight(optionHeight, containerHeight, bottomPadding) {\n if (optionHeight && optionHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, optionHeight - bottomPadding);\n }\n if (containerHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, containerHeight - bottomPadding);\n }\n return this.FALLBACK_PLOT_HEIGHT;\n }\n /**\n * Determines if X-axis labels should rotate\n */\n shouldLabelsRotate(rotateOption, estimatedWidth, availableWidth) {\n if (rotateOption === true)\n return true;\n if (rotateOption === false)\n return false;\n return estimatedWidth > availableWidth;\n }\n /**\n * Creates x and y scales for the chart\n */\n setupScales(data) {\n const barWidthFraction = resolveBarWidthFraction(this.effectiveOptions().barWidth);\n const padding = Math.max(this.MIN_PADDING, 1 - barWidthFraction);\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.id))\n .range([0, this.width])\n .padding(padding);\n // Create y scale (linear scale for values)\n // Support negative values by calculating min/max\n const minValue = this.d3.min(data, (d) => d.value) || 0;\n const maxValue = this.d3.max(data, (d) => d.value) || 0;\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, minValue), Math.max(0, maxValue)])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y scales for clustered charts\n */\n setupScalesClustered(groups) {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n // Outer band for clusters\n this.xScale = this.d3\n .scaleBand()\n .domain(groups.map((g) => g.id))\n .range([0, this.width])\n .padding(this.OUTER_PADDING_CLUSTERED);\n // Inner band for series\n this.xSubScale = this.d3\n .scaleBand()\n .domain(visibleSeries)\n .range([0, this.xScale.bandwidth()])\n .padding(this.INNER_PADDING_CLUSTERED);\n // Y scale across all visible values (support negative values)\n const allVisibleValues = [];\n for (const g of groups) {\n visibleSeries.forEach((label) => {\n const item = g.chartData.find((d) => d.label === label);\n if (item && typeof item.value === 'number')\n allVisibleValues.push(item.value);\n });\n }\n const yMin = this.d3.min(allVisibleValues) || 0;\n const yMax = this.d3.max(allVisibleValues) || 0;\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, yMin), Math.max(0, yMax)])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y axes with grid lines\n */\n createAxes(options) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxis(axesGroup, options);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxis(axesGroup, options) {\n const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n const idToLabel = new Map(visibleDataForTicks.map((d) => [d.id, d.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n createYAxis(axesGroup, options) {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3.axisLeft(this.yScale).tickFormat((value) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n // Reduce tick count for better readability\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for large numbers\n }\n else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(yAxisGenerator);\n // Style the axis text\n const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('text-anchor', 'end')\n .attr('direction', 'ltr');\n // Style axis lines\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add Y axis title\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel);\n }\n }\n shouldRotateXAxisLabels(idToLabel, fontSize) {\n const options = this.effectiveOptions();\n // Check if user explicitly set rotation option\n if (options.rotateXAxisLabels === true)\n return true;\n if (options.rotateXAxisLabels === false)\n return false;\n // If 'auto' or undefined, use intelligent calculation\n if (this.xScale.domain().length === 0)\n return false;\n const step = this.xScale.step();\n const labels = Array.from(idToLabel.values());\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n // Heuristic: avoid rotation when there are few categories even if estimation is slightly larger\n const domainCount = this.xScale.domain().length;\n if (domainCount <= this.SMALL_DATASET_THRESHOLD) {\n return estimatedWidth > step * this.ROTATION_TOLERANCE_SMALL_DATASET;\n }\n return estimatedWidth > step;\n }\n createXAxisTitle(axesGroup, title, tickAreaHeight, gapBelowTicks = this.TICK_AREA_GAP) {\n // Title positioned directly below tick area with a consistent gap\n const labelY = this.height + tickAreaHeight + gapBelowTicks;\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', 'hanging') // Align to top of text for better positioning\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', `${this.X_AXIS_TITLE_FONT_SIZE}px`)\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n createYAxisTitle(axesGroup, title) {\n // Calculate the exact position for Y-axis title\n // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n // Y-axis is at X = 0 within the chart group\n // Chart group is translated by (margin.left, margin.top)\n // So Y-axis is at X = margin.left in SVG coordinates\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n // Position title to the left of the tick labels\n // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n const labelY = -maxTickLabelWidth - padding;\n // Center the title vertically\n const labelX = -this.height / 2;\n axesGroup\n .append('text')\n .attr('class', 'ax-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 .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n calculateMaxYAxisTickLabelWidth() {\n // Calculate the maximum width needed for Y-axis tick labels\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n let maxValue = 0;\n if (isClustered) {\n const groups = raw;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n for (const g of groups) {\n visibleSeries.forEach((label) => {\n const item = g.chartData.find((d) => d.label === label);\n if (item && typeof item.value === 'number')\n maxValue = Math.max(maxValue, item.value);\n });\n }\n }\n else {\n const visibleData = raw.filter((d) => !this.isBarHidden(d.id));\n maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n }\n // Use formatted number for width calculation\n const tickLabelText = Number.isFinite(maxValue) ? formatLargeNumber(maxValue) : '00000';\n return tickLabelText.length * this.DEFAULT_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n createGridLines() {\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 * Creates axes for clustered charts\n */\n createAxesClustered(options, groups) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxisClustered(axesGroup, options, groups);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxisClustered(axesGroup, options, groups) {\n const idToLabel = new Map(groups.map((g) => [g.id, g.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\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() || [];\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 = getEasingFunction(this.d3, 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('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\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.id) + 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) => {\n // Format large numbers in data labels\n return d.value >= 1000 ? formatLargeNumber(d.value) : d.value;\n });\n // Animate data labels with smart positioning to avoid clipping\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d) => {\n const barTop = this.yScale(d.value);\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d) => {\n const barTop = this.yScale(d.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\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('path');\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .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) => {\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('path');\n // Remove hover effect\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).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 const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * animationDelay)\n .attrTween('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const finalHeight = this.height - this.yScale(d.value);\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\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 * Renders bars for clustered charts\n */\n renderBarsClustered(groups) {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n this._initialAnimationComplete.set(false);\n const radius = this.effectiveOptions().cornerRadius;\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n const groupSel = barsContainer\n .selectAll('.ax-bar-chart-group')\n .data(groups)\n .enter()\n .append('g')\n .attr('class', 'ax-bar-chart-group')\n .attr('transform', (g) => `translate(${this.xScale(g.id)},0)`);\n const barGroups = groupSel\n .selectAll('.ax-bar-chart-bar-group')\n .data((g) => visibleSeries.map((label) => {\n const seriesIndex = seriesLabels.indexOf(label);\n return {\n group: g,\n seriesLabel: label,\n seriesIndex,\n item: g.chartData.find((d) => d.label === label) ?? g.chartData[seriesIndex],\n };\n }))\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('data-series', (d) => d.seriesLabel)\n .attr('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const y = this.height - 0.5;\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d) => {\n return d.item?.color || this.getColor(d.seriesIndex);\n });\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.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n .attr('y', this.height)\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)\n .text((d) => {\n const value = d.item?.value;\n if (value === undefined)\n return '';\n return value >= 1000 ? formatLargeNumber(value) : value;\n });\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d) => {\n if (!d.item)\n return this.height;\n const barTop = this.yScale(d.item.value);\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d) => {\n if (!d.item)\n return 'false';\n const barTop = this.yScale(d.item.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n barGroups\n .on('mouseenter', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n if (d.item)\n this.handleBarHover(event, d.item, d.group);\n })\n .on('mousemove', (event) => {\n if (this._initialAnimationComplete())\n this.updateTooltipPosition(event);\n })\n .on('mouseleave', (event) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n if (d.item)\n this.handleBarClick(event, d.item);\n });\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * animationDelay)\n .attrTween('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const finalHeight = d.item ? this.height - this.yScale(d.item.value) : 0;\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing)\n .end()\n .then(() => this._initialAnimationComplete.set(true));\n }\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\n /**\n * Handles bar hover event and shows tooltip\n */\n handleBarHover(event, datum, group) {\n if (this.effectiveOptions().showTooltip !== false) {\n const dataValue = this.data();\n const isClustered = this.isClusteredData(dataValue);\n const flatData = isClustered\n ? dataValue.flatMap((g) => g.chartData)\n : dataValue || [];\n const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n const color = datum.color || this.getColor(index !== -1 ? index : 0);\n // Calculate percentage of total\n const total = isClustered\n ? dataValue.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0), 0)\n : flatData.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: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n value: formatLargeNumber(datum.value),\n percentage: `${percentage}%`,\n color: color,\n });\n this.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\n }\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords)\n return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = this.computeEnhancedTooltipPosition(containerRect, tooltipRect, coords.x, coords.y);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Enhanced tooltip positioning that considers chart boundaries and prevents overflow\n */\n computeEnhancedTooltipPosition(containerRect, tooltipRect, clientX, clientY) {\n const cursorX = clientX - containerRect.left;\n const cursorY = clientY - containerRect.top;\n if (!tooltipRect) {\n // Default positioning when tooltip dimensions are unknown\n return {\n x: Math.min(cursorX + this.TOOLTIP_GAP, containerRect.width - this.TOOLTIP_GAP),\n y: Math.max(this.TOOLTIP_GAP, Math.min(cursorY, containerRect.height - this.TOOLTIP_GAP)),\n };\n }\n // Calculate available space in each direction\n const spaceRight = containerRect.width - cursorX;\n const spaceLeft = cursorX;\n const spaceBelow = containerRect.height - cursorY;\n const spaceAbove = cursorY;\n // Determine best horizontal position\n let x;\n if (spaceRight >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the right of cursor\n x = cursorX + this.TOOLTIP_GAP;\n }\n else if (spaceLeft >= tooltipRect.width + this.TOOLTIP_GAP) {\n // Position to the left of cursor\n x = cursorX - tooltipRect.width - this.TOOLTIP_GAP;\n }\n else {\n // Center horizontally if neither side has enough space\n x = Math.max(this.TOOLTIP_GAP, Math.min((containerRect.width - tooltipRect.width) / 2, containerRect.width - tooltipRect.width - this.TOOLTIP_GAP));\n }\n // Calculate best vertical position\n let y;\n if (spaceBelow >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position below cursor\n y = cursorY + this.TOOLTIP_GAP;\n }\n else if (spaceAbove >= tooltipRect.height + this.TOOLTIP_GAP) {\n // Position above cursor\n y = cursorY - tooltipRect.height - this.TOOLTIP_GAP;\n }\n else {\n // Center vertically if neither direction has enough space\n y = Math.max(this.TOOLTIP_GAP, Math.min((containerRect.height - tooltipRect.height) / 2, containerRect.height - tooltipRect.height - this.TOOLTIP_GAP));\n }\n // Ensure tooltip stays within container bounds\n x = Math.max(this.TOOLTIP_GAP, Math.min(x, containerRect.width - tooltipRect.width - this.TOOLTIP_GAP));\n y = Math.max(this.TOOLTIP_GAP, Math.min(y, containerRect.height - tooltipRect.height - this.TOOLTIP_GAP));\n return { 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 const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n /**\n * Shows a message when all bars are hidden\n */\n showAllBarsHiddenMessage(containerElement) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.allHiddenIcon,\n title: messages.allHidden,\n help: messages.allHiddenHelp,\n });\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 value = (this.data() || []);\n if (this.isClusteredData(value)) {\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const total = groups.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0), 0);\n return seriesLabels.map((label, index) => {\n const seriesTotal = groups.reduce((s, g) => {\n const item = g.chartData[index];\n const v = item && typeof item.value === 'number' ? item.value : 0;\n return s + v;\n }, 0);\n const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n const firstItem = groups[0]?.chartData[index];\n return {\n id: label,\n name: label || `Series ${index + 1}`,\n value: seriesTotal,\n percentage,\n color: firstItem?.color || this.getColor(index),\n hidden: this.hiddenSeries.has(label),\n };\n });\n }\n const flat = value;\n const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return flat.map((item, index) => {\n const val = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (val / 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 const value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n const resetAll = () => {\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 if (id === null) {\n resetAll();\n return;\n }\n if (!isClustered) {\n if (this.isBarHidden(id)) {\n resetAll();\n return;\n }\n const targetBar = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d) => d?.id === id);\n if (targetBar.empty())\n return;\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n resetAll();\n }\n else {\n resetAll();\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 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 return;\n }\n const targetBars = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d, i, nodes) => {\n const node = nodes[i];\n return node.getAttribute('data-series') === id;\n });\n if (targetBars.empty())\n return;\n const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n if (isHighlighted) {\n resetAll();\n }\n else {\n resetAll();\n targetBars\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 this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d, i, nodes) => nodes[i].getAttribute('data-series') !== 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 value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n if (!isClustered) {\n const wasAllHidden = value.length > 0 && value.every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n this.hiddenBars.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3\n ?.select(this.chartContainerEl().nativeElement)\n .selectAll('svg, .ax-chart-message-container')\n .remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenBars.add(id);\n this.updateChart();\n }\n return !this.hiddenBars.has(id);\n }\n // Clustered mode: toggle series by label\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const seriesCount = seriesLabels.length;\n const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.d3?.select(this.chartContainerEl().nativeElement).selectAll('svg, .ax-chart-message-container').remove();\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenSeries.add(id);\n this.updateChart();\n }\n return !this.hiddenSeries.has(id);\n }\n // ===== Helper utilities for modularity and maintainability =====\n getContainerElement() {\n return this.chartContainerEl()?.nativeElement ?? null;\n }\n clearChartArea(containerElement) {\n this.d3.select(containerElement).selectAll('svg, .ax-chart-empty, .ax-chart-message-container').remove();\n }\n /**\n * Truncates long labels with ellipsis\n */\n truncateLabel(label, maxLength = this.MAX_LABEL_LENGTH) {\n if (label.length <= maxLength)\n return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n /**\n * Gets adaptive font size for X-axis based on width and item count\n */\n getXAxisTickFontSizeBasedOnWidth() {\n const itemCount = this.xScale.domain().length;\n const baseSize = Math.round(this.width / 50);\n // Reduce font size for many items\n let adjustedSize = baseSize;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.7);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.85);\n }\n return Math.max(this.MIN_FONT_SIZE_X_AXIS, Math.min(this.MAX_FONT_SIZE_X_AXIS, adjustedSize));\n }\n /**\n * Gets adaptive font size for Y-axis based on height\n */\n getYAxisTickFontSizeBasedOnHeight() {\n const baseSize = Math.round(this.height / 30);\n return Math.max(this.MIN_FONT_SIZE_Y_AXIS, Math.min(this.MAX_FONT_SIZE_Y_AXIS, baseSize));\n }\n buildXAxisCommon(axesGroup, idToLabel, options) {\n const itemCount = this.xScale.domain().length;\n // Smart tick reduction for many items\n let tickValues = this.xScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n const axis = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickFormat((id) => {\n const label = idToLabel.get(id) ?? String(id);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(axis);\n const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n if (isRotated) {\n xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n }\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n if (options.xAxisLabel && !isRotated) {\n const tickNodes = (this.xAxis.selectAll('text').nodes() || []);\n const measuredTickHeight = tickNodes.length > 0\n ? Math.max(...tickNodes.map((n) => {\n try {\n return n?.getBBox?.()?.height ?? dynamicFontSize;\n }\n catch {\n return dynamicFontSize;\n }\n }))\n : dynamicFontSize;\n const tickAreaHeight = measuredTickHeight + this.TICK_AREA_PADDING;\n const gapBelowTicks = this.X_AXIS_TITLE_GAP;\n this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXBarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", 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\\\" role=\\\"img\\\" #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-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-bar-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--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: 0, 0, 0, 0}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;min-height:0;box-sizing:border-box;overflow:hidden;background-color:rgba(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label{pointer-events:none;-webkit-user-select:none;user-select:none}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label[data-inside-bar=true]{fill:#fff;font-weight:600;text-shadow:0 0 2px rgba(0,0,0,.3)}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", 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\\\" role=\\\"img\\\" #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-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-bar-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--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: 0, 0, 0, 0}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;min-height:0;box-sizing:border-box;overflow:hidden;background-color:rgba(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label{pointer-events:none;-webkit-user-select:none;user-select:none}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label[data-inside-bar=true]{fill:#fff;font-weight:600;text-shadow:0 0 2px rgba(0,0,0,.3)}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2Jhci1jaGFydC9zcmMvbGliL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUVoQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2Qix1QkFBdUIsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBU3pEOzs7R0FHRztBQVNILE1BQU0sT0FBTyxtQkFDWCxTQUFRLGdCQUFnQjtJQUd4QixTQUFTO0lBQ1QsdUJBQXVCO0lBQ3ZCLElBQUksR0FBRyxLQUFLLENBQWtCLEVBQXFCLGdEQUFDLENBQUM7SUFFckQsMEJBQTBCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLENBQW1CLEVBQUUsbURBQUMsQ0FBQztJQUV0QyxVQUFVO0lBQ1Ysb0NBQW9DO0lBQ3BDLFFBQVEsR0FBRyxNQUFNLEVBQXdCLENBQUM7SUFFMUMsNEJBQTRCO0lBQ1gsZ0JBQWdCLEdBQUcsU0FBUyxDQUFD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QWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQzt1R0FqOUNVLG1CQUFtQjsyRkFBbkIsbUJBQW1CLHFnQkNuRGhDLDhSQVNBLHVtRER1Q1ksdUJBQXVCOzsyRkFHdEIsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGNBQWMsaUJBR1QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLHVCQUF1QixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSxcbiAgQVhDaGFydENvbXBvbmVudCxcbiAgQVhDaGFydENvbXBvbmVudEJhc2UsXG4gIGZvcm1hdExhcmdlTnVtYmVyLFxuICBnZXRDaGFydENvbG9yLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbiAgbWVyZ2VDaGFydE1lc3NhZ2VzLFxuICBtZXJnZUNoYXJ0T3B0aW9ucyxcbiAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UsXG4gIHJlc29sdmVCYXJXaWR0aEZyYWN0aW9uLFxufSBmcm9tICdAYWNvcmV4L2NoYXJ0cyc7XG5pbXBvcnQgeyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSwgQVhDaGFydExlZ2VuZEl0ZW0gfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC1sZWdlbmQnO1xuaW1wb3J0IHsgQVhDaGFydFRvb2x0aXBDb21wb25lbnQsIEFYQ2hhcnRUb29sdGlwRGF0YSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LXRvb2x0aXAnO1xuXG5pbXBvcnQge1xuICBhZnRlck5leHRSZW5kZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhfQkFSX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vYmFyLWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQge1xuICBBWEJhckNoYXJ0Q2xpY2tFdmVudCxcbiAgQVhCYXJDaGFydENsdXN0ZXJlZERhdGEsXG4gIEFYQmFyQ2hhcnREYXRhLFxuICBBWEJhckNoYXJ0T3B0aW9uLFxuICBBWEJhckNoYXJ0VmFsdWUsXG59IGZyb20gJy4vYmFyLWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIEJhciBDaGFydCBDb21wb25lbnRcbiAqIFJlbmRlcnMgZGF0YSBhcyB2ZXJ0aWNhbCBiYXJzIHdpdGggaW50ZXJhY3RpdmUgaG92ZXIgZWZmZWN0cyBhbmQgYW5pbWF0aW9uc1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1iYXItY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYmFyLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFyLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtBWENoYXJ0VG9vbHRpcENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBWEJhckNoYXJ0Q29tcG9uZW50XG4gIGV4dGVuZHMgQVhDaGFydENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydExlZ2VuZENvbXBhdGlibGUsIEFYQ2hhcnRDb21wb25lbnRCYXNlXG57XG4gIC8vIElucHV0c1xuICAvKiogQ2hhcnQgZGF0YSBpbnB1dCAqL1xuICBkYXRhID0gaW5wdXQ8QVhCYXJDaGFydFZhbHVlPihbXSBhcyBBWEJhckNoYXJ0VmFsdWUpO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWEJhckNoYXJ0T3B0aW9uPih7fSk7XG5cbiAgLy8gT3V0cHV0c1xuICAvKiogRW1pdHRlZCB3aGVuIGEgYmFyIGlzIGNsaWNrZWQgKi9cbiAgYmFyQ2xpY2sgPSBvdXRwdXQ8QVhCYXJDaGFydENsaWNrRXZlbnQ+KCk7XG5cbiAgLy8gQ2hhcnQgY29udGFpbmVyIHJlZmVyZW5jZVxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0Q29udGFpbmVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuXG4gIC8vIEQzIHJlZmVyZW5jZSAtIGxvYWRlZCBhc3luY2hyb25vdXNseVxuICBwcm90ZWN0ZWQgZDMhOiB0eXBlb2YgaW1wb3J0KCdkMycpO1xuXG4gIC8vIENoYXJ0IGVsZW1lbnRzIC0gdXNpbmcgcHJvcGVyIEQzIHR5cGVzXG4gIHByaXZhdGUgc3ZnITogUmV0dXJuVHlwZTx0eXBlb2YgaW1wb3J0KCdkMycpLnNlbGVjdDxTVkdTVkdFbGVtZW50LCB1bmtub3duPj47XG4gIHByaXZhdGUgY2hhcnQhOiBSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoJ2QzJykuc2VsZWN0PFNWR0dFbGVtZW50LCB1bmtub3duPj47XG4gIHByaXZhdGUgeFNjYWxlITogUmV0dXJuVHlwZTx0eXBlb2YgaW1wb3J0KCdkMycpLnNjYWxlQmFuZDxzdHJpbmc+PjtcbiAgcHJpdmF0ZSB5U2NhbGUhOiBSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoJ2QzJykuc2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXI+PjtcbiAgcHJpdmF0ZSB4U3ViU2NhbGUhOiBSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoJ2QzJykuc2NhbGVCYW5kPHN0cmluZz4+O1xuICBwcml2YXRlIHhBeGlzITogUmV0dXJuVHlwZTx0eXBlb2YgaW1wb3J0KCdkMycpLnNlbGVjdDxTVkdHRWxlbWVudCwgdW5rbm93bj4+O1xuICBwcml2YXRlIHlBeGlzITogUmV0dXJuVHlwZTx0eXBlb2YgaW1wb3J0KCdkMycpLnNlbGVjdDxTVkdHRWxlbWVudCwgdW5rbm93bj4+O1xuXG4gIC8vIENoYXJ0IGRpbWVuc2lvbnNcbiAgcHJpdmF0ZSB3aWR0aCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBoZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgbWFyZ2luID0geyB0b3A6IDAsIHJpZ2h0OiAwLCBib3R0b206IDAsIGxlZnQ6IDAgfTtcblxuICAvLyBDb25zdGFudHMgZm9yIGxheW91dCBjYWxjdWxhdGlvbnNcbiAgcHJpdmF0ZSByZWFkb25seSBDSEFSX1dJRFRIX1JBVElPID0gMC42NTtcbiAgcHJpdmF0ZSByZWFkb25seSBUT09MVElQX0dBUCA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IEFYSVNfVElDS19QQURESU5HID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgWV9BWElTX1RJVExFX1RISUNLTkVTUyA9IDE0O1xuICBwcml2YXRlIHJlYWRvbmx5IFlfQVhJU19USVRMRV9QQURESU5HID0gMTQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgWF9BWElTX1RJVExFX0ZPTlRfU0laRSA9IDE0O1xuICBwcml2YXRlIHJlYWRvbmx5IFhfQVhJU19USVRMRV9HQVAgPSAxNDtcbiAgcHJpdmF0ZSByZWFkb25seSBYX0FYSVNfVElUTEVfQkxPQ0tfSEVJR0hUID0gMjQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgVE9QX0VER0VfUEFERElORyA9IDg7XG4gIHByaXZhdGUgcmVhZG9ubHkgQk9UVE9NX0VER0VfUEFERElORyA9IDg7XG4gIHByaXZhdGUgcmVhZG9ubHkgSE9SSVpPTlRBTF9FREdFX1BBRERJTkcgPSAxMjtcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19QTE9UX0hFSUdIVCA9IDI0MDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fUExPVF9IRUlHSFQgPSAxMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX1RPVEFMX1dJRFRIID0gMjAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE9VVEVSX1BBRERJTkdfQ0xVU1RFUkVEID0gMC4yO1xuICBwcml2YXRlIHJlYWRvbmx5IElOTkVSX1BBRERJTkdfQ0xVU1RFUkVEID0gMC4xO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9QQURESU5HID0gMC4xO1xuICBwcml2YXRlIHJlYWRvbmx5IEhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04gPSAxNTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9BTklNQVRJT05fREVMQVkgPSA1MDtcbiAgcHJpdmF0ZSByZWFkb25seSBMQUJFTF9BTklNQVRJT05fREVMQVkgPSAxMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX1RPUF9TUEFDRV9GT1JfTEFCRUwgPSAyMDtcbiAgcHJpdmF0ZSByZWFkb25seSBMQUJFTF9PRkZTRVQgPSA4O1xuICBwcml2YXRlIHJlYWRvbmx5IFJPVEFUSU9OX1RPTEVSQU5DRV9TTUFMTF9EQVRBU0VUID0gMS40O1xuICBwcml2YXRlIHJlYWRvbmx5IFNNQUxMX0RBVEFTRVRfVEhSRVNIT0xEID0gNjtcbiAgcHJpdmF0ZSByZWFkb25seSBZX0FYSVNfUEFERElORyA9IDIwO1xuICBwcml2YXRlIHJlYWRvbmx5IFRJQ0tfQVJFQV9QQURESU5HID0gNjtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0FSRUFfR0FQID0gODtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0ZPTlRfU0laRSA9IDEzO1xuICBwcml2YXRlIHJlYWRvbmx5IEZPTlRfV0lEVEhfTVVMVElQTElFUiA9IDAuNjtcbiAgcHJpdmF0ZSByZWFkb25seSBGT05UX1BBRERJTkcgPSA4O1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9MQUJFTF9MRU5HVEggPSAyMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRk9OVF9TSVpFX1hfQVhJUyA9IDg7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX0ZPTlRfU0laRV9YX0FYSVMgPSAxNDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRk9OVF9TSVpFX1lfQVhJUyA9IDk7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX0ZPTlRfU0laRV9ZX0FYSVMgPSAxNTtcbiAgcHJpdmF0ZSByZWFkb25seSBNQU5ZX0lURU1TX1RIUkVTSE9MRCA9IDIwO1xuICBwcml2YXRlIHJlYWRvbmx5IFZFUllfTUFOWV9JVEVNU19USFJFU0hPTEQgPSA1MDtcblxuICAvLyBBbmltYXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUb29sdGlwIHN0YXRlXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgcGVyY2VudGFnZTogJzAlJyxcbiAgICBjb2xvcjogJycsXG4gIH0pO1xuICBwcml2YXRlIF90b29sdGlwUmFmSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9wZW5kaW5nVG9vbHRpcENvb3JkczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gU2lnbmFscyBmb3IgY29tcG9uZW50IHN0YXRlXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRvb2x0aXAgYWNjZXNzb3JzXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0JBUl9DSEFSVF9DT05GSUcpO1xuXG4gIC8vIEluamVjdCB0aGUgY2hhcnQgY29sb3JzXG4gIHByaXZhdGUgY2hhcnRDb2xvcnMgPSBpbmplY3QoQVhfQ0hBUlRfQ09MT1JfUEFMRVRURSk7XG5cbiAgLy8gSW5qZWN0IEFYUGxhdGZvcm1cbiAgLy8gUmVtb3ZlZCB1bnVzZWQgQVhQbGF0Zm9ybSBpbmplY3Rpb25cblxuICAvLyBDb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiBtZXJnZUNoYXJ0T3B0aW9ucyh0aGlzLmNvbmZpZ1Rva2VuLCB0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIC8vIE1lc3NhZ2VzIHdpdGggZGVmYXVsdHNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBtZXJnZUNoYXJ0TWVzc2FnZXModGhpcy5jb25maWdUb2tlbi5tZXNzYWdlcywgdGhpcy5vcHRpb25zKCk/Lm1lc3NhZ2VzKSxcbiAgKTtcblxuICAvLyBUcmFjayBoaWRkZW4gYmFycyBhbmQgc2VyaWVzXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlkZGVuQmFycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGhpZGRlblNlcmllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIENvbXB1dGVkIHZhbHVlcyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNDbHVzdGVyZWRNb2RlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhKCk7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgJ2NoYXJ0RGF0YScgaW4gdmFsdWVbMF07XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlzaWJsZURhdGEgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGEoKSB8fCBbXTtcbiAgICBpZiAodGhpcy5pc0NsdXN0ZXJlZE1vZGUoKSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW107XG4gICAgfVxuICAgIHJldHVybiAodmFsdWUgYXMgQVhCYXJDaGFydERhdGFbXSkuZmlsdGVyKChkKSA9PiAhdGhpcy5oaWRkZW5CYXJzLmhhcyhkLmlkKSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzVmlzaWJsZURhdGEgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGEoKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuaXNDbHVzdGVyZWRNb2RlKCkpIHtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IHZhbHVlIGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW107XG4gICAgICBjb25zdCBzZXJpZXNMYWJlbHMgPSB0aGlzLmdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzKTtcbiAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcbiAgICAgIHJldHVybiBncm91cHMuc29tZSgoZykgPT5cbiAgICAgICAgdmlzaWJsZVNlcmllcy5zb21lKChsYWJlbCkgPT4gISFnLmNoYXJ0RGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmxhYmVsID09PSBsYWJlbCkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHZhbHVlIGFzIEFYQmFyQ2hhcnREYXRhW10pLnNvbWUoKGQpID0+ICF0aGlzLmhpZGRlbkJhcnMuaGFzKGQuaWQpKTtcbiAgfSk7XG5cbiAgLy8gVHlwZSBndWFyZCBoZWxwZXJcbiAgcHJpdmF0ZSBpc0NsdXN0ZXJlZERhdGEodmFsdWU6IEFYQmFyQ2hhcnRWYWx1ZSk6IHZhbHVlIGlzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwICYmICdjaGFydERhdGEnIGluIHZhbHVlWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZ3JvdXBzWzBdPy5jaGFydERhdGE/Lm1hcCgoZCkgPT4gZC5sYWJlbCkgPz8gW107XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgRDMgYW5kIGluaXRpYWxpemUgdGhlIGNoYXJ0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWREMygpO1xuICAgICAgLy8gQ3JlYXRlIGNoYXJ0IGFmdGVyIEQzIGlzIGxvYWRlZCBhbmQgY29udGFpbmVyIGlzIGF2YWlsYWJsZVxuICAgICAgaWYgKHRoaXMuZDMgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBXYXRjaCBmb3IgY2hhbmdlcyB0byByZWRyYXcgdGhlIGNoYXJ0XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIEFjY2VzcyBpbnB1dHMgdG8gdHJhY2sgdGhlbVxuICAgICAgdGhpcy5kYXRhKCk7XG4gICAgICB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgaWYgYWxyZWFkeSByZW5kZXJlZFxuICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkKCkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBEMy5qcyBkeW5hbWljYWxseVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIC8vIElmIGNvbnRhaW5lciBpcyByZWFkeSwgY3JlYXRlIGNoYXJ0XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBiYXIgY2hhcnQgU1ZHIGFuZCByZW5kZXJzIGFsbCBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMyB8fCAhdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBjb25zdCBpc0NsdXN0ZXJlZCA9IHRoaXMuaXNDbHVzdGVyZWREYXRhKGlucHV0VmFsdWUpO1xuXG4gICAgLy8gVXNlIGNvbXB1dGVkIHZpc2liaWxpdHlcbiAgICBjb25zdCBoYXNBbnlWaXNpYmxlID0gdGhpcy5oYXNWaXNpYmxlRGF0YSgpO1xuICAgIGNvbnN0IHZpc2libGVTaW5nbGVEYXRhID0gaXNDbHVzdGVyZWQgPyBbXSA6ICh0aGlzLnZpc2libGVEYXRhKCkgYXMgQVhCYXJDaGFydERhdGFbXSk7XG4gICAgY29uc3QgZ3JvdXBlZERhdGEgPSBpc0NsdXN0ZXJlZCA/IChpbnB1dFZhbHVlIGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pIDogW107XG5cbiAgICAvLyBDbGVhciBleGlzdGluZyBjaGFydCBTVkcgYW5kIG1lc3NhZ2VzIChkbyBub3QgcmVtb3ZlIHRvb2x0aXAgY29tcG9uZW50KVxuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBubyBkYXRhXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpIHx8IGlucHV0VmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAgaWYgKCFoYXNBbnlWaXNpYmxlKSB7XG4gICAgICB0aGlzLnNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3B0aW9ucyBhbmQgc2V0dXAgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNoYXJ0T3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIHRoaXMuc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQsIGNoYXJ0T3B0aW9ucyk7XG5cbiAgICAvLyBDcmVhdGUgc2NhbGVzIGFuZCBheGVzIGFuZCByZW5kZXIgYmFzZWQgb24gbW9kZVxuICAgIGlmIChpc0NsdXN0ZXJlZCkge1xuICAgICAgdGhpcy5zZXR1cFNjYWxlc0NsdXN0ZXJlZChncm91cGVkRGF0YSk7XG4gICAgICB0aGlzLmNyZWF0ZUF4ZXNDbHVzdGVyZWQoY2hhcnRPcHRpb25zLCBncm91cGVkRGF0YSk7XG4gICAgICB0aGlzLnJlbmRlckJhcnNDbHVzdGVyZWQoZ3JvdXBlZERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldHVwU2NhbGVzKHZpc2libGVTaW5nbGVEYXRhKTtcbiAgICAgIHRoaXMuY3JlYXRlQXhlcyhjaGFydE9wdGlvbnMpO1xuICAgICAgdGhpcy5yZW5kZXJCYXJzKHZpc2libGVTaW5nbGVEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2hlbiBpbnB1dHMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwUmFmSWQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSBudWxsO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5kMz8uc2VsZWN0KGNvbnRhaW5lcikuc2VsZWN0QWxsKCdzdmcsIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lcicpLnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLnN2ZyA9IHVuZGVmaW5lZCE7XG4gICAgdGhpcy5jaGFydCA9IHVuZGVmaW5lZCE7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGNoYXJ0IGRpbWVuc2lvbnMgYW5kIGNyZWF0ZXMgU1ZHIHdpdGggcmVzcG9uc2l2ZSBhdHRyaWJ1dGVzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9uczogQVhCYXJDaGFydE9wdGlvbik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBvdXRlciBtYXJnaW5zOyBjYWxjdWxhdGUgb25seSBpbnRlcm5hbCBwYWRkaW5ncyBmb3IgYXhlcyBhbmQgbGFiZWxzXG4gICAgdGhpcy5tYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuXG4gICAgLy8gR2V0IGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgLy8gQXhpcyB2aXNpYmlsaXR5XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcblxuICAgIC8vIEludGVybmFsIGxlZnQgcGFkZGluZyBmb3IgWS1heGlzIHRpY2tzL2xhYmVscy90aXRsZVxuICAgIGNvbnN0IHlBeGlzVGl0bGVUaGlja25lc3MgPSBvcHRpb25zLnlBeGlzTGFiZWwgPyB0aGlzLllfQVhJU19USVRMRV9USElDS05FU1MgOiAwO1xuICAgIGNvbnN0IHlBeGlzVGl0bGVQYWRkaW5nID0gb3B0aW9ucy55QXhpc0xhYmVsID8gdGhpcy5ZX0FYSVNfVElUTEVfUEFERElORyA6IDA7XG4gICAgY29uc3QgbGVmdFBhZGRpbmdGb3JZQXhpcyA9IHNob3dZQXhpc1xuICAgICAgPyB0aGlzLmNhbGN1bGF0ZU1heFlBeGlzVGlja0xhYmVsV2lkdGgoKSArIHRoaXMuQVhJU19USUNLX1BBRERJTkcgKyB5QXhpc1RpdGxlUGFkZGluZyArIHlBeGlzVGl0bGVUaGlja25lc3NcbiAgICAgIDogMDtcbiAgICBjb25zdCBsZWZ0SW5uZXJQYWRkaW5nID0gbGVmdFBhZGRpbmdGb3JZQXhpcyArIHRoaXMuSE9SSVpPTlRBTF9FREdFX1BBRERJTkc7XG4gICAgY29uc3QgcmlnaHRJbm5lclBhZGRpbmcgPSB0aGlzLkhPUklaT05UQUxfRURHRV9QQURESU5HO1xuXG4gICAgLy8gRXN0aW1hdGUgaW50ZXJuYWwgYm90dG9tIHBhZGRpbmcgZm9yIFgtYXhpcyB0aWNrcy9sYWJlbHMvdGl0bGVcbiAgICBsZXQgYm90dG9tUGFkZGluZ0ZvclhBeGlzID0gMDtcbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICBjb25zdCByYXcgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEocmF3KTtcbiAgICAgIGNvbnN0IGJhckNvdW50ID0gaXNDbHVzdGVyZWQgPyAocmF3IGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLmxlbmd0aCA6IChyYXcgYXMgQVhCYXJDaGFydERhdGFbXSkubGVuZ3RoO1xuICAgICAgY29uc3QgbG9uZ2VzdExhYmVsID0gKCgpID0+IHtcbiAgICAgICAgaWYgKGlzQ2x1c3RlcmVkKSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBzID0gcmF3IGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW107XG4gICAgICAgICAgcmV0dXJuIGdyb3Vwcy5yZWR1Y2UoKGFjYywgZykgPT4gKGFjYy5sZW5ndGggPiAoZy5sYWJlbD8ubGVuZ3RoID8/IDApID8gYWNjIDogKGcubGFiZWwgPz8gJycpKSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYXQgPSAocmF3IGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuICAgICAgICByZXR1cm4gZmxhdC5yZWR1Y2UoKGEsIGIpID0+IChhLmxlbmd0aCA+IGIubGFiZWwubGVuZ3RoID8gYSA6IGIubGFiZWwpLCAnJyk7XG4gICAgICB9KSgpO1xuXG4gICAgICBjb25zdCBiYXNlV2lkdGggPSBvcHRpb25zLndpZHRoID8/IGNvbnRhaW5lcldpZHRoO1xuICAgICAgY29uc3Qgd29ya2luZ1dpZHRoID0gTWF0aC5tYXgoMSwgYmFzZVdpZHRoIC0gbGVmdElubmVyUGFkZGluZyAtIHJpZ2h0SW5uZXJQYWRkaW5nKTtcbiAgICAgIGNvbnN0IGR5bmFtaWNGb250U2l6ZSA9IE1hdGgubWF4KDEwLCBNYXRoLm1pbigxNCwgTWF0aC5yb3VuZCh3b3JraW5nV2lkdGggLyA1MCkpKTtcblxuICAgICAgLy8gVXNlIHRydW5jYXRlZCBsYWJlbCBsZW5ndGggZm9yIGNhbGN1bGF0aW9uIChzYW1lIGxvZ2ljIGFzIGFjdHVhbCByZW5kZXJpbmcpXG4gICAgICBjb25zdCBtYXhMYWJlbExlbmd0aCA9IGJhckNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCA/IDEwIDogdGhpcy5NQVhfTEFCRUxfTEVOR1RIO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTGFiZWxMZW5ndGggPSBNYXRoLm1pbihsb25nZXN0TGFiZWwubGVuZ3RoLCBtYXhMYWJlbExlbmd0aCk7XG4gICAgICBjb25zdCBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA9IGVmZmVjdGl2ZUxhYmVsTGVuZ3RoICogZHluYW1pY0ZvbnRTaXplICogMC42NTtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhQZXJCYXIgPSBiYXJDb3VudCA+IDAgPyB3b3JraW5nV2lkdGggLyBiYXJDb3VudCA6IHdvcmtpbmdXaWR0aDtcbiAgICAgIGNvbnN0IHJvdGF0ZU9wdGlvbiA9IHR5cGVvZiBvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgd2lsbFJvdGF0ZSA9IHRoaXMuc2hvdWxkTGFiZWxzUm90YXRlKHJvdGF0ZU9wdGlvbiwgZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGgsIGF2YWlsYWJsZVdpZHRoUGVyQmFyKTtcblxuICAgICAgY29uc3QgdGlja0FyZWFIZWlnaHQgPSB3aWxsUm90YXRlXG4gICAgICAgID8gZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggKiBNYXRoLlNRUlQxXzIgKyBkeW5hbWljRm9udFNpemUgKiBNYXRoLlNRUlQxXzIgKyB0aGlzLlRJQ0tfQVJFQV9QQURESU5HXG4gICAgICAgIDogZHluYW1pY0ZvbnRTaXplICsgdGhpcy5USUNLX0FSRUFfUEFERElORyArIDI7XG4gICAgICBjb25zdCBnYXBCZWxvd1RpY2tzID0gb3B0aW9ucy54QXhpc0xhYmVsICYmICF3aWxsUm90YXRlID8gdGhpcy5YX0FYSVNfVElUTEVfR0FQIDogMDtcbiAgICAgIGNvbnN0IHRpdGxlQmxvY2tIZWlnaHQgPSBvcHRpb25zLnhBeGlzTGFiZWwgJiYgIXdpbGxSb3RhdGUgPyB0aGlzLlhfQVhJU19USVRMRV9CTE9DS19IRUlHSFQgOiAwO1xuICAgICAgYm90dG9tUGFkZGluZ0ZvclhBeGlzID0gdGlja0FyZWFIZWlnaHQgKyBnYXBCZWxvd1RpY2tzICsgdGl0bGVCbG9ja0hlaWdodDtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgcGxvdHRpbmcgZGltZW5zaW9ucyB3aXRoIHNlbnNpYmxlIGZhbGxiYWNrc1xuICAgIGNvbnN0IGJhc2VXaWR0aCA9IG9wdGlvbnMud2lkdGggPz8gY29udGFpbmVyV2lkdGg7XG4gICAgY29uc3QgdG90YWxXaWR0aCA9IE1hdGgubWF4KHRoaXMuTUlOX1RPVEFMX1dJRFRILCBiYXNlV2lkdGggPiAwID8gYmFzZVdpZHRoIDogdGhpcy5NSU5fVE9UQUxfV0lEVEgpO1xuICAgIGNvbnN0IHBsb3RXaWR0aCA9IE1hdGgubWF4KDAsIHRvdGFsV2lkdGggLSBsZWZ0SW5uZXJQYWRkaW5nIC0gcmlnaHRJbm5lclBhZGRpbmcpO1xuXG4gICAgY29uc3QgcGxvdEhlaWdodCA9IHRoaXMuY2FsY3VsYXRlUGxvdEhlaWdodChvcHRpb25zLmhlaWdodCwgY29udGFpbmVySGVpZ2h0LCBib3R0b21QYWRkaW5nRm9yWEF4aXMpO1xuXG4gICAgdGhpcy53aWR0aCA9IHBsb3RXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IHBsb3RIZWlnaHQ7XG5cbiAgICAvLyBDcmVhdGUgU1ZHIHdpdGggZXhwbGljaXQgcGl4ZWwgZGltZW5zaW9ucyB0byBhdm9pZCBjb2xsYXBzZVxuICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBib3R0b21QYWRkaW5nRm9yWEF4aXMgKyB0aGlzLlRPUF9FREdFX1BBRERJTkcgKyB0aGlzLkJPVFRPTV9FREdFX1BBRERJTkc7XG5cbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3RvdGFsV2lkdGh9ICR7dG90YWxIZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIHRoaXMuc3ZnID0gc3ZnO1xuXG4gICAgLy8gQ3JlYXRlIGNoYXJ0IGdyb3VwIHRyYW5zbGF0ZWQgYnkgaW50ZXJuYWwgcGFkZGluZ3MgKG5vIGV4dGVybmFsIG1hcmdpbnMpXG4gICAgdGhpcy5jaGFydCA9IHRoaXMuc3ZnXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdjaGFydC1jb250ZW50JylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7bGVmdElubmVyUGFkZGluZ30sJHt0aGlzLlRPUF9FREdFX1BBRERJTkd9KWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgcGxvdCBoZWlnaHQgYmFzZWQgb24gb3B0aW9ucyBhbmQgY29udGFpbmVyIGRpbWVuc2lvbnNcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlUGxvdEhlaWdodChcbiAgICBvcHRpb25IZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBjb250YWluZXJIZWlnaHQ6IG51bWJlcixcbiAgICBib3R0b21QYWRkaW5nOiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgaWYgKG9wdGlvbkhlaWdodCAmJiBvcHRpb25IZWlnaHQgPiAwKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5NSU5fUExPVF9IRUlHSFQsIG9wdGlvbkhlaWdodCAtIGJvdHRvbVBhZGRpbmcpO1xuICAgIH1cbiAgICBpZiAoY29udGFpbmVySGVpZ2h0ID4gMCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuTUlOX1BMT1RfSEVJR0hULCBjb250YWluZXJIZWlnaHQgLSBib3R0b21QYWRkaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuRkFMTEJBQ0tfUExPVF9IRUlHSFQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBYLWF4aXMgbGFiZWxzIHNob3VsZCByb3RhdGVcbiAgICovXG4gIHByaXZhdGUgc2hvdWxkTGFiZWxzUm90YXRlKFxuICAgIHJvdGF0ZU9wdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICBlc3RpbWF0ZWRXaWR0aDogbnVtYmVyLFxuICAgIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChyb3RhdGVPcHRpb24gPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChyb3RhdGVPcHRpb24gPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGVzdGltYXRlZFdpZHRoID4gYXZhaWxhYmxlV2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB4IGFuZCB5IHNjYWxlcyBmb3IgdGhlIGNoYXJ0XG4gICAqL1xuICBwcml2YXRlIHNldHVwU2NhbGVzKGRhdGE6IEFYQmFyQ2hhcnREYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBiYXJXaWR0aEZyYWN0aW9uID0gcmVzb2x2ZUJhcldpZHRoRnJhY3Rpb24odGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYmFyV2lkdGgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCh0aGlzLk1JTl9QQURESU5HLCAxIC0gYmFyV2lkdGhGcmFjdGlvbik7XG5cbiAgICAvLyBDcmVhdGUgeCBzY2FsZSAoYmFuZCBzY2FsZSBmb3IgY2F0ZWdvcmljYWwgZGF0YSlcbiAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgLmRvbWFpbihkYXRhLm1hcCgoZCkgPT4gZC5pZCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAvLyBDcmVhdGUgeSBzY2FsZSAobGluZWFyIHNjYWxlIGZvciB2YWx1ZXMpXG4gICAgLy8gU3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMgYnkgY2FsY3VsYXRpbmcgbWluL21heFxuICAgIGNvbnN0IG1pblZhbHVlID0gdGhpcy5kMy5taW4oZGF0YSwgKGQpID0+IGQudmFsdWUpIHx8IDA7XG4gICAgY29uc3QgbWF4VmFsdWUgPSB0aGlzLmQzLm1heChkYXRhLCAoZCkgPT4gZC52YWx1ZSkgfHwgMDtcblxuICAgIHRoaXMueVNjYWxlID0gdGhpcy5kM1xuICAgICAgLnNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oW01hdGgubWluKDAsIG1pblZhbHVlKSwgTWF0aC5tYXgoMCwgbWF4VmFsdWUpXSlcbiAgICAgIC5uaWNlKClcbiAgICAgIC5yYW5nZShbdGhpcy5oZWlnaHQsIDBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHggYW5kIHkgc2NhbGVzIGZvciBjbHVzdGVyZWQgY2hhcnRzXG4gICAqL1xuICBwcml2YXRlIHNldHVwU2NhbGVzQ2x1c3RlcmVkKGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHMpO1xuICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcblxuICAgIC8vIE91dGVyIGJhbmQgZm9yIGNsdXN0ZXJzXG4gICAgdGhpcy54U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVCYW5kKClcbiAgICAgIC5kb21haW4oZ3JvdXBzLm1hcCgoZykgPT4gZy5pZCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcodGhpcy5PVVRFUl9QQURESU5HX0NMVVNURVJFRCk7XG5cbiAgICAvLyBJbm5lciBiYW5kIGZvciBzZXJpZXNcbiAgICB0aGlzLnhTdWJTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgLmRvbWFpbih2aXNpYmxlU2VyaWVzKVxuICAgICAgLnJhbmdlKFswLCB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKV0pXG4gICAgICAucGFkZGluZyh0aGlzLklOTkVSX1BBRERJTkdfQ0xVU1RFUkVEKTtcblxuICAgIC8vIFkgc2NhbGUgYWNyb3NzIGFsbCB2aXNpYmxlIHZhbHVlcyAoc3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMpXG4gICAgY29uc3QgYWxsVmlzaWJsZVZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGcgb2YgZ3JvdXBzKSB7XG4gICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKGxhYmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBnLmNoYXJ0RGF0YS5maW5kKChkKSA9PiBkLmxhYmVsID09PSBsYWJlbCk7XG4gICAgICAgIGlmIChpdGVtICYmIHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJykgYWxsVmlzaWJsZVZhbHVlcy5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHlNaW4gPSB0aGlzLmQzLm1pbihhbGxWaXNpYmxlVmFsdWVzKSB8fCAwO1xuICAgIGNvbnN0IHlNYXggPSB0aGlzLmQzLm1heChhbGxWaXNpYmxlVmFsdWVzKSB8fCAwO1xuXG4gICAgdGhpcy55U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbTWF0aC5taW4oMCwgeU1pbiksIE1hdGgubWF4KDAsIHlNYXgpXSlcbiAgICAgIC5uaWNlKClcbiAgICAgIC5yYW5nZShbdGhpcy5oZWlnaHQsIDBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHggYW5kIHkgYXhlcyB3aXRoIGdyaWQgbGluZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXhlcyhvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93R3JpZCA9IG9wdGlvbnMuc2hvd0dyaWQgIT09IGZhbHNlO1xuXG4gICAgY29uc3QgYXhlc0dyb3VwID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhlcycpO1xuXG4gICAgaWYgKHNob3dYQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVYQXhpcyhheGVzR3JvdXAsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChzaG93WUF4aXMpIHtcbiAgICAgIHRoaXMuY3JlYXRlWUF4aXMoYXhlc0dyb3VwLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd0dyaWQpIHtcbiAgICAgIHRoaXMuY3JlYXRlR3JpZExpbmVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVYQXhpcyhcbiAgICBheGVzR3JvdXA6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuZDMuc2VsZWN0PFNWR0dFbGVtZW50LCB1bmtub3duPj4sXG4gICAgb3B0aW9uczogQVhCYXJDaGFydE9wdGlvbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZURhdGFGb3JUaWNrcyA9ICh0aGlzLmRhdGEoKSB8fCBbXSkuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgY29uc3QgaWRUb0xhYmVsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4odmlzaWJsZURhdGFGb3JUaWNrcy5tYXAoKGQpID0+IFtkLmlkLCBkLmxhYmVsXSkpO1xuICAgIHRoaXMuYnVpbGRYQXhpc0NvbW1vbihheGVzR3JvdXAsIGlkVG9MYWJlbCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVlBeGlzKFxuICAgIGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PixcbiAgICBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLFxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgWSBheGlzIHdpdGggc21hcnQgbnVtYmVyIGZvcm1hdHRpbmdcbiAgICBjb25zdCB5QXhpc0dlbmVyYXRvciA9IHRoaXMuZDMuYXhpc0xlZnQodGhpcy55U2NhbGUpLnRpY2tGb3JtYXQoKHZhbHVlOiBudW1iZXIgfCB7IHZhbHVlT2YoKTogbnVtYmVyIH0pID0+IHtcbiAgICAgIGNvbnN0IG51bVZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogdmFsdWUudmFsdWVPZigpO1xuICAgICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKG51bVZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIFJlZHVjZSB0aWNrIGNvdW50IGZvciBiZXR0ZXIgcmVhZGFiaWxpdHlcbiAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMueVNjYWxlLmRvbWFpbigpWzFdO1xuICAgIGlmIChtYXhWYWx1ZSA+IDFlNikge1xuICAgICAgeUF4aXNHZW5lcmF0b3IudGlja3MoNik7IC8vIEZld2VyIHRpY2tzIGZvciBsYXJnZSBudW1iZXJzXG4gICAgfSBlbHNlIGlmIChtYXhWYWx1ZSA+IDFlMykge1xuICAgICAgeUF4aXNHZW5lcmF0b3IudGlja3MoOCk7XG4gICAgfVxuXG4gICAgdGhpcy55QXhpcyA9IGF4ZXNHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy15JykuY2FsbCh5QXhpc0dlbmVyYXRvcik7XG5cbiAgICAvLyBTdHlsZSB0aGUgYXhpcyB0ZXh0XG4gICAgY29uc3QgZHluYW1pY0ZvbnRTaXplID0gdGhpcy5nZXRZQXhpc1RpY2tGb250U2l6ZUJhc2VkT25IZWlnaHQoKTtcbiAgICB0aGlzLnlBeGlzXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7ZHluYW1pY0ZvbnRTaXplfXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNDAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2JhKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWxhYmVscy1jb2xvciksIDAuNyknKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ2VuZCcpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpO1xuXG4gICAgLy8gU3R5bGUgYXhpcyBsaW5lc1xuICAgIHRoaXMueUF4aXMuc2VsZWN0QWxsKCdsaW5lLCBwYXRoJykuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJyk7XG5cbiAgICAvLyBBZGQgWSBheGlzIHRpdGxlXG4gICAgaWYgKG9wdGlvbnMueUF4aXNMYWJlbCkge1xuICAgICAgdGhpcy5jcmVhdGVZQXhpc1RpdGxlKGF4ZXNHcm91cCwgb3B0aW9ucy55QXhpc0xhYmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJvdGF0ZVhBeGlzTGFiZWxzKGlkVG9MYWJlbDogTWFwPHN0cmluZywgc3RyaW5nPiwgZm9udFNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgIC8vIENoZWNrIGlmIHVzZXIgZXhwbGljaXRseSBzZXQgcm90YXRpb24gb3B0aW9uXG4gICAgaWYgKG9wdGlvbnMucm90YXRlWEF4aXNMYWJlbHMgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSWYgJ2F1dG8nIG9yIHVuZGVmaW5lZCwgdXNlIGludGVsbGlnZW50IGNhbGN1bGF0aW9uXG4gICAgaWYgKHRoaXMueFNjYWxlLmRvbWFpbigpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMueFNjYWxlLnN0ZXAoKTtcbiAgICBjb25zdCBsYWJlbHMgPSBBcnJheS5mcm9tKGlkVG9MYWJlbC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbG9uZ2VzdExhYmVsID0gbGFiZWxzLnJlZHVjZSgoYSwgYikgPT4gKGEubGVuZ3RoID4gYi5sZW5ndGggPyBhIDogYiksICcnKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRXaWR0aCA9IGxvbmdlc3RMYWJlbC5sZW5ndGggKiBmb250U2l6ZSAqIHRoaXMuQ0hBUl9XSURUSF9SQVRJTztcblxuICAgIC8vIEhldXJpc3RpYzogYXZvaWQgcm90YXRpb24gd2hlbiB0aGVyZSBhcmUgZmV3IGNhdGVnb3JpZXMgZXZlbiBpZiBlc3RpbWF0aW9uIGlzIHNsaWdodGx5IGxhcmdlclxuICAgIGNvbnN0IGRvbWFpbkNvdW50ID0gdGhpcy54U2NhbGUuZG9tYWluKCkubGVuZ3RoO1xuICAgIGlmIChkb21haW5Db3VudCA8PSB0aGlzLlNNQUxMX0RBVEFTRVRfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm4gZXN0aW1hdGVkV2lkdGggPiBzdGVwICogdGhpcy5ST1RBVElPTl9UT0xFUkFOQ0VfU01BTExfREFUQVNFVDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXN0aW1hdGVkV2lkdGggPiBzdGVwO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVYQXhpc1RpdGxlKFxuICAgIGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRpY2tBcmVhSGVpZ2h0OiBudW1iZXIsXG4gICAgZ2FwQmVsb3dUaWNrcyA9IHRoaXMuVElDS19BUkVBX0dBUCxcbiAgKTogdm9pZCB7XG4gICAgLy8gVGl0bGUgcG9zaXRpb25lZCBkaXJlY3RseSBiZWxvdyB0aWNrIGFyZWEgd2l0aCBhIGNvbnNpc3RlbnQgZ2FwXG4gICAgY29uc3QgbGFiZWxZID0gdGhpcy5oZWlnaHQgKyB0aWNrQXJlYUhlaWdodCArIGdhcEJlbG93VGlja3M7XG5cbiAgICBheGVzR3JvdXBcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGlzLWxhYmVsIGF4LXgtYXhpcy1sYWJlbCcpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJykgLy8gQWxpZ24gdG8gdG9wIG9mIHRleHQgZm9yIGJldHRlciBwb3NpdGlvbmluZ1xuICAgICAgLmF0dHIoJ3gnLCB0aGlzLndpZHRoIC8gMilcbiAgICAgIC5hdHRyKCd5JywgbGFiZWxZKVxuICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHt0aGlzLlhfQVhJU19USVRMRV9GT05UX1NJWkV9cHhgKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1heGlzLWxhYmVsLWNvbG9yKSknKVxuICAgICAgLnRleHQodGl0bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVZQXhpc1RpdGxlKGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PiwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhhY3QgcG9zaXRpb24gZm9yIFktYXhpcyB0aXRsZVxuICAgIC8vIFktYXhpcyB0aWNrIGxhYmVscyB1c2UgdGV4dC1hbmNob3I6IGVuZCwgc28gdGhleSBleHRlbmQgTEVGVCBvZiB0aGUgWS1heGlzIGxpbmVcbiAgICAvLyBZLWF4aXMgaXMgYXQgWCA9IDAgd2l0aGluIHRoZSBjaGFydCBncm91cFxuICAgIC8vIENoYXJ0IGdyb3VwIGlzIHRyYW5zbGF0ZWQgYnkgKG1hcmdpbi5sZWZ0LCBtYXJnaW4udG9wKVxuICAgIC8vIFNvIFktYXhpcyBpcyBhdCBYID0gbWFyZ2luLmxlZnQgaW4gU1ZHIGNvb3JkaW5hdGVzXG5cbiAgICBjb25zdCBtYXhUaWNrTGFiZWxXaWR0aCA9IHRoaXMuY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLllfQVhJU19QQURESU5HO1xuXG4gICAgLy8gUG9zaXRpb24gdGl0bGUgdG8gdGhlIGxlZnQgb2YgdGhlIHRpY2sgbGFiZWxzXG4gICAgLy8gU2luY2UgdGV4dC1hbmNob3I6IGVuZCBhbGlnbnMgdGhlIHRleHQgdG8gdGhlIFktYXhpcywgd2UgbmVlZCB0byBnbyBmdXJ0aGVyIGxlZnRcbiAgICBjb25zdCBsYWJlbFkgPSAtbWF4VGlja0xhYmVsV2lkdGggLSBwYWRkaW5nO1xuXG4gICAgLy8gQ2VudGVyIHRoZSB0aXRsZSB2ZXJ0aWNhbGx5XG4gICAgY29uc3QgbGFiZWxYID0gLXRoaXMuaGVpZ2h0IC8gMjtcblxuICAgIGF4ZXNHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMtbGFiZWwgYXgteS1heGlzLWxhYmVsJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcbiAgICAgIC5hdHRyKCd4JywgbGFiZWxYKVxuICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxNHB4JylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgIC50ZXh0KHRpdGxlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpOiBudW1iZXIge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSB3aWR0aCBuZWVkZWQgZm9yIFktYXhpcyB0aWNrIGxhYmVsc1xuICAgIGNvbnN0IHJhdyA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEocmF3KTtcblxuICAgIGxldCBtYXhWYWx1ZSA9IDA7XG4gICAgaWYgKGlzQ2x1c3RlcmVkKSB7XG4gICAgICBjb25zdCBncm91cHMgPSByYXcgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcblxuICAgICAgZm9yIChjb25zdCBnIG9mIGdyb3Vwcykge1xuICAgICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKGxhYmVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGcuY2hhcnREYXRhLmZpbmQoKGQpID0+IGQubGFiZWwgPT09IGxhYmVsKTtcbiAgICAgICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicpIG1heFZhbHVlID0gTWF0aC5tYXgobWF4VmFsdWUsIGl0ZW0udmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmlzaWJsZURhdGEgPSAocmF3IGFzIEFYQmFyQ2hhcnREYXRhW10pLmZpbHRlcigoZCkgPT4gIXRoaXMuaXNCYXJIaWRkZW4oZC5pZCkpO1xuICAgICAgbWF4VmFsdWUgPSB2aXNpYmxlRGF0YS5yZWR1Y2UoKGFjYywgZCkgPT4gKGQudmFsdWUgPiBhY2MgPyBkLnZhbHVlIDogYWNjKSwgMCk7XG4gICAgfVxuXG4gICAgLy8gVXNlIGZvcm1hdHRlZCBudW1iZXIgZm9yIHdpZHRoIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgdGlja0xhYmVsVGV4dCA9IE51bWJlci5pc0Zpbml0ZShtYXhWYWx1ZSkgPyBmb3JtYXRMYXJnZU51bWJlcihtYXhWYWx1ZSkgOiAnMDAwMDAnO1xuICAgIHJldHVybiB0aWNrTGFiZWxUZXh0Lmxlbmd0aCAqIHRoaXMuREVGQVVMVF9GT05UX1NJWkUgKiB0aGlzLkZPTlRfV0lEVEhfTVVMVElQTElFUiArIHRoaXMuRk9OVF9QQURESU5HO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHcmlkTGluZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydFxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWdyaWQnKVxuICAgICAgLmNhbGwoXG4gICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAuYXhpc0xlZnQodGhpcy55U2NhbGUpXG4gICAgICAgICAgLnRpY2tTaXplKC10aGlzLndpZHRoKVxuICAgICAgICAgIC50aWNrRm9ybWF0KCgpID0+ICcnKSxcbiAgICAgIClcbiAgICAgIC5zZWxlY3RBbGwoJ2xpbmUnKVxuICAgICAgLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpXG4gICAgICAuc3R5bGUoJ3N0cm9rZS1vcGFjaXR5JywgMC4yKTtcblxuICAgIC8vIFJlbW92ZSB1bm5lZWRlZCBlbGVtZW50cyBmcm9tIGdyaWRcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdCgnLmF4LWJhci1jaGFydC1ncmlkJykuc2VsZWN0QWxsKCdwYXRoLCB0ZXh0JykucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBheGVzIGZvciBjbHVzdGVyZWQgY2hhcnRzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUF4ZXNDbHVzdGVyZWQob3B0aW9uczogQVhCYXJDaGFydE9wdGlvbiwgZ3JvdXBzOiBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93R3JpZCA9IG9wdGlvbnMuc2hvd0dyaWQgIT09IGZhbHNlO1xuXG4gICAgY29uc3QgYXhlc0dyb3VwID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhlcycpO1xuXG4gICAgaWYgKHNob3dYQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVYQXhpc0NsdXN0ZXJlZChheGVzR3JvdXAsIG9wdGlvbnMsIGdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dZQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVZQXhpcyhheGVzR3JvdXAsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChzaG93R3JpZCkge1xuICAgICAgdGhpcy5jcmVhdGVHcmlkTGluZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVhBeGlzQ2x1c3RlcmVkKFxuICAgIGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PixcbiAgICBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLFxuICAgIGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaWRUb0xhYmVsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oZ3JvdXBzLm1hcCgoZykgPT4gW2cuaWQsIGcubGFiZWxdKSk7XG4gICAgdGhpcy5idWlsZFhBeGlzQ29tbW9uKGF4ZXNHcm91cCwgaWRUb0xhYmVsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBiYXJzIHdpdGggYW5pbWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCYXJzKGRhdGE6IEFYQmFyQ2hhcnREYXRhW10pOiB2b2lkIHtcbiAgICAvLyBGaWx0ZXIgb3V0IGhpZGRlbiBiYXJzXG4gICAgY29uc3QgdmlzaWJsZURhdGEgPSBkYXRhLmZpbHRlcigoZCkgPT4gIXRoaXMuaXNCYXJIaWRkZW4oZC5pZCkpO1xuICAgIGNvbnN0IG9yaWdpbmFsRnVsbERhdGEgPSAodGhpcy5kYXRhKCkgYXMgQVhCYXJDaGFydERhdGFbXSkgfHwgW107XG5cbiAgICAvLyBSZXNldCBhbmltYXRpb24gc3RhdGVcbiAgICB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KGZhbHNlKTtcblxuICAgIC8vIEdldCBjb3JuZXIgcmFkaXVzIGZyb20gb3B0aW9uc1xuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmNvcm5lclJhZGl1cztcblxuICAgIC8vIEdldCBhbmltYXRpb24gb3B0aW9uc1xuICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRHVyYXRpb247XG4gICAgY29uc3QgYW5pbWF0aW9uRWFzaW5nID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYWxsIGJhcnNcbiAgICBjb25zdCBiYXJzQ29udGFpbmVyID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFycy1jb250YWluZXInKTtcblxuICAgIC8vIENyZWF0ZSBncm91cHMgZm9yIGVhY2ggYmFyIHRvIGhhbmRsZSB0cmFuc2Zvcm1hdGlvbnNcbiAgICBjb25zdCBiYXJHcm91cHMgPSBiYXJzQ29udGFpbmVyXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpXG4gICAgICAuZGF0YSh2aXNpYmxlRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1iYXItZ3JvdXAnKTtcblxuICAgIC8vIEFkZCBiYXJzIGluc2lkZSBncm91cHNcbiAgICBjb25zdCBiYXJzID0gYmFyR3JvdXBzXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyJylcbiAgICAgIC5hdHRyKCdkJywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLnhTY2FsZShkLmlkKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKTtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuaGVpZ2h0IC0gMC41OyAvLyBpbml0aWFsIGhlaWdodCBpcyB6ZXJvXG4gICAgICAgIHJldHVybiBgTSR7eH0sJHt5fSBMJHt4fSwke3l9IEwke3ggKyB3aWR0aH0sJHt5fSBMJHt4ICsgd2lkdGh9LCR7eX0gWmA7XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgYmFyIChkKSBpbiB0aGUgb3JpZ2luYWwgZGF0YSBhcnJheVxuICAgICAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxGdWxsRGF0YS5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGQuaWQpO1xuICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbG9yIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZ2V0IGNvbG9yIGZyb20gcGFsZXR0ZSB1c2luZyBvcmlnaW5hbCBpbmRleFxuICAgICAgICAvLyBGYWxsYmFjayB0byBpbmRleCAwIGlmIG5vdCBmb3VuZCwgdGhvdWdoIHRoaXMgc2hvdWxkbid0IGhhcHBlbiB3aXRoIHZhbGlkIGRhdGEuXG4gICAgICAgIHJldHVybiBkLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3Iob3JpZ2luYWxJbmRleCAhPT0gLTEgPyBvcmlnaW5hbEluZGV4IDogMCk7XG4gICAgICB9KTtcblxuICAgIC8vIEFkZCBkYXRhIGxhYmVscyBpZiB0aGV5J3JlIGVuYWJsZWRcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0RhdGFMYWJlbHMgIT09IGZhbHNlKSB7XG4gICAgICBiYXJHcm91cHNcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAuYXR0cigneCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gdGhpcy54U2NhbGUoZC5pZCkgKyB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXG4gICAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQpIC8vIFN0YXJ0IGZyb20gYm90dG9tIGZvciBhbmltYXRpb25cbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnY2xhbXAoOHB4LCAydm1pbiwgMTJweCknKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzUwMCcpXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZGF0YS1sYWJlbHMtY29sb3IpKScpXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApIC8vIFN0YXJ0IGludmlzaWJsZSBmb3IgYW5pbWF0aW9uXG4gICAgICAgIC50ZXh0KChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICAgIC8vIEZvcm1hdCBsYXJnZSBudW1iZXJzIGluIGRhdGEgbGFiZWxzXG4gICAgICAgICAgcmV0dXJuIGQudmFsdWUgPj0gMTAwMCA/IGZvcm1hdExhcmdlTnVtYmVyKGQudmFsdWUpIDogZC52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFuaW1hdGUgZGF0YSBsYWJlbHMgd2l0aCBzbWFydCBwb3NpdGlvbmluZyB0byBhdm9pZCBjbGlwcGluZ1xuICAgICAgY29uc3QgYW5pbWF0aW9uRGVsYXkgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EZWxheSA/PyB0aGlzLkRFRkFVTFRfQU5JTUFUSU9OX0RFTEFZO1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAuZGVsYXkoKGQ6IEFYQmFyQ2hhcnREYXRhLCBpOiBudW1iZXIpID0+IGkgKiBhbmltYXRpb25EZWxheSArIHRoaXMuTEFCRUxfQU5JTUFUSU9OX0RFTEFZKVxuICAgICAgICAuYXR0cigneScsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhclRvcCA9IHRoaXMueVNjYWxlKGQudmFsdWUpO1xuXG4gICAgICAgICAgLy8gSWYgYmFyIGlzIG5lYXIgdGhlIHRvcCAoMTAwJSBvciBjbG9zZSksIHBvc2l0aW9uIGxhYmVsIGluc2lkZSB0aGUgYmFyXG4gICAgICAgICAgaWYgKGJhclRvcCA8IHRoaXMuTUlOX1RPUF9TUEFDRV9GT1JfTEFCRUwpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXJUb3AgKyB0aGlzLkxBQkVMX09GRlNFVDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPdGhlcndpc2UsIHBvc2l0aW9uIGFib3ZlIHRoZSBiYXJcbiAgICAgICAgICByZXR1cm4gYmFyVG9wIC0gdGhpcy5MQUJFTF9PRkZTRVQ7XG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCdkYXRhLWluc2lkZS1iYXInLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBiYXJUb3AgPSB0aGlzLnlTY2FsZShkLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gYmFyVG9wIDwgdGhpcy5NSU5fVE9QX1NQQUNFX0ZPUl9MQUJFTCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgIH0pXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGhhbmRsZXJzIG9uIGVhY2ggZ3JvdXBcbiAgICBiYXJHcm91cHNcbiAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudDogTW91c2VFdmVudCwgZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gT25seSBhcHBseSBob3ZlciBlZmZlY3RzIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBiYXJFbCA9IHRoaXMuZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNlbGVjdCgncGF0aCcpO1xuXG4gICAgICAgIC8vIFN0YW5kYXJkIGhvdmVyIGVmZmVjdCAtIGRhcmtlbiB0aGUgYmFyIHNsaWdodGx5IGFuZCBhZGQgYSBzdWJ0bGUgc2hhZG93XG4gICAgICAgIGJhckVsXG4gICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgIC5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAgICAgLnN0eWxlKCdmaWx0ZXInLCAnYnJpZ2h0bmVzcygwLjcpIGRyb3Atc2hhZG93KDAgMCAycHggcmdiYSgwLDAsMCwwLjEpKScpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlQmFySG92ZXIoZXZlbnQsIGQpO1xuICAgICAgfSlcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdXBkYXRlIHRvb2x0aXAgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYXBwbHkgaG92ZXIgZWZmZWN0cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcblxuICAgICAgICAvLyBSZW1vdmUgaG92ZXIgZWZmZWN0XG4gICAgICAgIGJhckVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pLnN0eWxlKCdmaWx0ZXInLCBudWxsKTtcblxuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdHJpZ2dlciBjbGljayBldmVudHMgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVCYXJDbGljayhldmVudCwgZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGFuaW1hdGlvblxuICAgIGNvbnN0IGFuaW1hdGlvbkRlbGF5ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRGVsYXkgPz8gdGhpcy5ERUZBVUxUX0FOSU1BVElPTl9ERUxBWTtcbiAgICBiYXJzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZGVsYXkoKGQ6IEFYQmFyQ2hhcnREYXRhLCBpOiBudW1iZXIpID0+IGkgKiBhbmltYXRpb25EZWxheSlcbiAgICAgIC5hdHRyVHdlZW4oJ2QnLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMueFNjYWxlKGQuaWQpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMueFNjYWxlLmJhbmR3aWR0aCgpO1xuICAgICAgICBjb25zdCBmaW5hbEhlaWdodCA9IHRoaXMuaGVpZ2h0IC0gdGhpcy55U2NhbGUoZC52YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuICh0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gZmluYWxIZWlnaHQgKiB0O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRZID0gdGhpcy5oZWlnaHQgLSBjdXJyZW50SGVpZ2h0O1xuICAgICAgICAgIGNvbnN0IGJvdHRvbVkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gQWRkIHNtYWxsIGdhcCB0byBwcmV2ZW50IG92ZXJsYXAgd2l0aCB4LWF4aXNcblxuICAgICAgICAgIGlmIChyYWRpdXMgPiAwICYmIGN1cnJlbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCByYWRpdXMgdG8gcHJldmVudCBpdCBmcm9tIGV4Y2VlZGluZyBoYWxmIHRoZSBiYXIgd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVJhZGl1cyA9IE1hdGgubWluKHJhZGl1cywgd2lkdGggLyAyKTtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBRJHt4fSwke2N1cnJlbnRZfSAke3ggKyBlZmZlY3RpdmVSYWRpdXN9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aCAtIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gUSR7eCArIHdpZHRofSwke2N1cnJlbnRZfSAke3ggKyB3aWR0aH0sJHtjdXJyZW50WSArIGVmZmVjdGl2ZVJhZGl1c30gTCR7eCArIHdpZHRofSwke2JvdHRvbVl9IFpgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYE0ke3h9LCR7Ym90dG9tWX0gTCR7eH0sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRofSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZykgLy8gVXNlIHRoZSBjb25maWd1cmVkIGVhc2luZyBmdW5jdGlvblxuICAgICAgLmVuZCgpIC8vIFdhaXQgZm9yIGFsbCBhbmltYXRpb25zIHRvIGNvbXBsZXRlXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIE1hcmsgYW5pbWF0aW9uIGFzIGNvbXBsZXRlIHRvIGVuYWJsZSBob3ZlciBlZmZlY3RzXG4gICAgICAgIHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZS5zZXQodHJ1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGJhcnMgZm9yIGNsdXN0ZXJlZCBjaGFydHNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmFyc0NsdXN0ZXJlZChncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBzZXJpZXNMYWJlbHMgPSB0aGlzLmdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzKTtcbiAgICBjb25zdCB2aXNpYmxlU2VyaWVzID0gc2VyaWVzTGFiZWxzLmZpbHRlcigocykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzKSk7XG5cbiAgICB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmNvcm5lclJhZGl1cztcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICBjb25zdCBiYXJzQ29udGFpbmVyID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFycy1jb250YWluZXInKTtcblxuICAgIGNvbnN0IGdyb3VwU2VsID0gYmFyc0NvbnRhaW5lclxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1ncm91cCcpXG4gICAgICAuZGF0YShncm91cHMpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWdyb3VwJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZzogQVhCYXJDaGFydENsdXN0ZXJlZERhdGEpID0+IGB0cmFuc2xhdGUoJHt0aGlzLnhTY2FsZShnLmlkKX0sMClgKTtcblxuICAgIHR5cGUgQ2x1c3RlcmVkQmFyRGF0dW0gPSB7XG4gICAgICBncm91cDogQVhCYXJDaGFydENsdXN0ZXJlZERhdGE7XG4gICAgICBzZXJpZXNMYWJlbDogc3RyaW5nO1xuICAgICAgc2VyaWVzSW5kZXg6IG51bWJlcjtcbiAgICAgIGl0ZW06IEFYQmFyQ2hhcnREYXRhIHwgdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBjb25zdCBiYXJHcm91cHMgPSBncm91cFNlbFxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXItZ3JvdXAnKVxuICAgICAgLmRhdGEoKGc6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhKSA9PlxuICAgICAgICB2aXNpYmxlU2VyaWVzLm1hcCgobGFiZWwpOiBDbHVzdGVyZWRCYXJEYXR1bSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VyaWVzSW5kZXggPSBzZXJpZXNMYWJlbHMuaW5kZXhPZihsYWJlbCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyb3VwOiBnLFxuICAgICAgICAgICAgc2VyaWVzTGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgc2VyaWVzSW5kZXgsXG4gICAgICAgICAgICBpdGVtOiBnLmNoYXJ0RGF0YS5maW5kKChkKSA9PiBkLmxhYmVsID09PSBsYWJlbCkgPz8gZy5jaGFydERhdGFbc2VyaWVzSW5kZXhdLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpO1xuXG4gICAgY29uc3QgYmFycyA9IGJhckdyb3Vwc1xuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAuYXR0cignZGF0YS1zZXJpZXMnLCAoZDogQ2x1c3RlcmVkQmFyRGF0dW0pID0+IGQuc2VyaWVzTGFiZWwpXG4gICAgICAuYXR0cignZCcsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLmhlaWdodCAtIDAuNTtcbiAgICAgICAgcmV0dXJuIGBNJHt4fSwke3l9IEwke3h9LCR7eX0gTCR7eCArIHdpZHRofSwke3l9IEwke3ggKyB3aWR0aH0sJHt5fSBaYDtcbiAgICAgIH0pXG4gICAgICAuYXR0cignZmlsbCcsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4ge1xuICAgICAgICByZXR1cm4gZC5pdGVtPy5jb2xvciB8fCB0aGlzLmdldENvbG9yKGQuc2VyaWVzSW5kZXgpO1xuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0RhdGFMYWJlbHMgIT09IGZhbHNlKSB7XG4gICAgICBiYXJHcm91cHNcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAuYXR0cigneCcsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4gKHRoaXMueFN1YlNjYWxlKGQuc2VyaWVzTGFiZWwpIHx8IDApICsgdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxuICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0KVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICdjbGFtcCg4cHgsIDJ2bWluLCAxMnB4KScpXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1kYXRhLWxhYmVscy1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgLnRleHQoKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkLml0ZW0/LnZhbHVlO1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID49IDEwMDAgPyBmb3JtYXRMYXJnZU51bWJlcih2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFuaW1hdGlvbkRlbGF5ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRGVsYXkgPz8gdGhpcy5ERUZBVUxUX0FOSU1BVElPTl9ERUxBWTtcbiAgICAgIGJhckdyb3Vwc1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgICAgLmRlbGF5KChfZDogdW5rbm93biwgaTogbnVtYmVyKSA9PiBpICogYW5pbWF0aW9uRGVsYXkgKyB0aGlzLkxBQkVMX0FOSU1BVElPTl9ERUxBWSlcbiAgICAgICAgLmF0dHIoJ3knLCAoZDogQ2x1c3RlcmVkQmFyRGF0dW0pID0+IHtcbiAgICAgICAgICBpZiAoIWQuaXRlbSkgcmV0dXJuIHRoaXMuaGVpZ2h0O1xuXG4gICAgICAgICAgY29uc3QgYmFyVG9wID0gdGhpcy55U2NhbGUoZC5pdGVtLnZhbHVlKTtcblxuICAgICAgICAgIC8vIElmIGJhciBpcyBuZWFyIHRoZSB0b3AgKDEwMCUgb3IgY2xvc2UpLCBwb3NpdGlvbiBsYWJlbCBpbnNpZGUgdGhlIGJhclxuICAgICAgICAgIGlmIChiYXJUb3AgPCB0aGlzLk1JTl9UT1BfU1BBQ0VfRk9SX0xBQkVMKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFyVG9wICsgdGhpcy5MQUJFTF9PRkZTRVQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3NpdGlvbiBhYm92ZSB0aGUgYmFyXG4gICAgICAgICAgcmV0dXJuIGJhclRvcCAtIHRoaXMuTEFCRUxfT0ZGU0VUO1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cignZGF0YS1pbnNpZGUtYmFyJywgKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgICAgaWYgKCFkLml0ZW0pIHJldHVybiAnZmFsc2UnO1xuXG4gICAgICAgICAgY29uc3QgYmFyVG9wID0gdGhpcy55U2NhbGUoZC5pdGVtLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gYmFyVG9wIDwgdGhpcy5NSU5fVE9QX1NQQUNFX0ZPUl9MQUJFTCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgIH0pXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZyk7XG4gICAgfVxuXG4gICAgYmFyR3JvdXBzXG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcbiAgICAgICAgYmFyRWxcbiAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgLmR1cmF0aW9uKHRoaXMuSE9WRVJfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgICAgICAuc3R5bGUoJ2ZpbHRlcicsICdicmlnaHRuZXNzKDAuNykgZHJvcC1zaGFkb3coMCAwIDJweCByZ2JhKDAsMCwwLDAuMSkpJyk7XG4gICAgICAgIGlmIChkLml0ZW0pIHRoaXMuaGFuZGxlQmFySG92ZXIoZXZlbnQsIGQuaXRlbSwgZC5ncm91cCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcbiAgICAgICAgYmFyRWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuSE9WRVJfVFJBTlNJVElPTl9EVVJBVElPTikuc3R5bGUoJ2ZpbHRlcicsIG51bGwpO1xuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgaWYgKGQuaXRlbSkgdGhpcy5oYW5kbGVCYXJDbGljayhldmVudCwgZC5pdGVtKTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgYW5pbWF0aW9uRGVsYXkgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EZWxheSA/PyB0aGlzLkRFRkFVTFRfQU5JTUFUSU9OX0RFTEFZO1xuICAgIGJhcnNcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5kZWxheSgoX2Q6IHVua25vd24sIGk6IG51bWJlcikgPT4gaSAqIGFuaW1hdGlvbkRlbGF5KVxuICAgICAgLmF0dHJUd2VlbignZCcsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IGZpbmFsSGVpZ2h0ID0gZC5pdGVtID8gdGhpcy5oZWlnaHQgLSB0aGlzLnlTY2FsZShkLml0ZW0udmFsdWUpIDogMDtcblxuICAgICAgICByZXR1cm4gKHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBmaW5hbEhlaWdodCAqIHQ7XG4gICAgICAgICAgY29uc3QgY3VycmVudFkgPSB0aGlzLmhlaWdodCAtIGN1cnJlbnRIZWlnaHQ7XG4gICAgICAgICAgY29uc3QgYm90dG9tWSA9IHRoaXMuaGVpZ2h0IC0gMC41OyAvLyBBZGQgc21hbGwgZ2FwIHRvIHByZXZlbnQgb3ZlcmxhcCB3aXRoIHgtYXhpc1xuXG4gICAgICAgICAgaWYgKHJhZGl1cyA+IDAgJiYgY3VycmVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgIC8vIExpbWl0IHJhZGl1cyB0byBwcmV2ZW50IGl0IGZyb20gZXhjZWVkaW5nIGhhbGYgdGhlIGJhciB3aWR0aFxuICAgICAgICAgICAgY29uc3QgZWZmZWN0aXZlUmFkaXVzID0gTWF0aC5taW4ocmFkaXVzLCB3aWR0aCAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIGBNJHt4fSwke2JvdHRvbVl9IEwke3h9LCR7Y3VycmVudFkgKyBlZmZlY3RpdmVSYWRpdXN9IFEke3h9LCR7Y3VycmVudFl9ICR7eCArIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRoIC0gZWZmZWN0aXZlUmFkaXVzfSwke2N1cnJlbnRZfSBRJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9ICR7eCArIHdpZHRofSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aH0sJHtib3R0b21ZfSBaYDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgLmVuZCgpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBEMyBlYXNpbmcgZnVuY3Rpb24gYmFzZWQgb24gdGhlIG9wdGlvbiBzdHJpbmdcbiAgICovXG4gIC8vIGdldEVhc2luZ0Z1bmN0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGJhciBob3ZlciBldmVudCBhbmQgc2hvd3MgdG9vbHRpcFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVCYXJIb3ZlcihldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYQmFyQ2hhcnREYXRhLCBncm91cD86IHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgZGF0YVZhbHVlID0gdGhpcy5kYXRhKCkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgICAgY29uc3QgaXNDbHVzdGVyZWQgPSB0aGlzLmlzQ2x1c3RlcmVkRGF0YShkYXRhVmFsdWUpO1xuICAgICAgY29uc3QgZmxhdERhdGE6IEFYQmFyQ2hhcnREYXRhW10gPSBpc0NsdXN0ZXJlZFxuICAgICAgICA/IChkYXRhVmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSkuZmxhdE1hcCgoZykgPT4gZy5jaGFydERhdGEpXG4gICAgICAgIDogKGRhdGFWYWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKSB8fCBbXTtcbiAgICAgIGNvbnN0IGluZGV4ID0gZmxhdERhdGEuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXR1bS5pZCAmJiBpdGVtLmxhYmVsID09PSBkYXR1bS5sYWJlbCk7XG4gICAgICBjb25zdCBjb2xvciA9IGRhdHVtLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXggIT09IC0xID8gaW5kZXggOiAwKTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBlcmNlbnRhZ2Ugb2YgdG90YWxcbiAgICAgIGNvbnN0IHRvdGFsID0gaXNDbHVzdGVyZWRcbiAgICAgICAgPyAoZGF0YVZhbHVlIGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLnJlZHVjZShcbiAgICAgICAgICAgIChzdW0sIGcpID0+IHN1bSArIGcuY2hhcnREYXRhLnJlZHVjZSgocywgaXQpID0+IHMgKyBpdC52YWx1ZSwgMCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgIClcbiAgICAgICAgOiAoZmxhdERhdGEgYXMgQVhCYXJDaGFydERhdGFbXSkucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApO1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/ICgoZGF0dW0udmFsdWUgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMSkgOiAnMCc7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICAgIHRpdGxlOiBncm91cCA/IGAke2RhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbH0g4oCUICR7Z3JvdXAubGFiZWx9YCA6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGZvcm1hdExhcmdlTnVtYmVyKGRhdHVtLnZhbHVlKSxcbiAgICAgICAgcGVyY2VudGFnZTogYCR7cGVyY2VudGFnZX0lYCxcbiAgICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcztcbiAgICAgIGlmICghY29vcmRzKSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcEVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbCA/IHRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLmNvbXB1dGVFbmhhbmNlZFRvb2x0aXBQb3NpdGlvbihjb250YWluZXJSZWN0LCB0b29sdGlwUmVjdCwgY29vcmRzLngsIGNvb3Jkcy55KTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5zZXQocG9zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlZCB0b29sdGlwIHBvc2l0aW9uaW5nIHRoYXQgY29uc2lkZXJzIGNoYXJ0IGJvdW5kYXJpZXMgYW5kIHByZXZlbnRzIG92ZXJmbG93XG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVFbmhhbmNlZFRvb2x0aXBQb3NpdGlvbihcbiAgICBjb250YWluZXJSZWN0OiBET01SZWN0LFxuICAgIHRvb2x0aXBSZWN0OiBET01SZWN0IHwgbnVsbCxcbiAgICBjbGllbnRYOiBudW1iZXIsXG4gICAgY2xpZW50WTogbnVtYmVyLFxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGN1cnNvclggPSBjbGllbnRYIC0gY29udGFpbmVyUmVjdC5sZWZ0O1xuICAgIGNvbnN0IGN1cnNvclkgPSBjbGllbnRZIC0gY29udGFpbmVyUmVjdC50b3A7XG5cbiAgICBpZiAoIXRvb2x0aXBSZWN0KSB7XG4gICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uaW5nIHdoZW4gdG9vbHRpcCBkaW1lbnNpb25zIGFyZSB1bmtub3duXG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBNYXRoLm1pbihjdXJzb3JYICsgdGhpcy5UT09MVElQX0dBUCwgY29udGFpbmVyUmVjdC53aWR0aCAtIHRoaXMuVE9PTFRJUF9HQVApLFxuICAgICAgICB5OiBNYXRoLm1heCh0aGlzLlRPT0xUSVBfR0FQLCBNYXRoLm1pbihjdXJzb3JZLCBjb250YWluZXJSZWN0LmhlaWdodCAtIHRoaXMuVE9PTFRJUF9HQVApKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGF2YWlsYWJsZSBzcGFjZSBpbiBlYWNoIGRpcmVjdGlvblxuICAgIGNvbnN0IHNwYWNlUmlnaHQgPSBjb250YWluZXJSZWN0LndpZHRoIC0gY3Vyc29yWDtcbiAgICBjb25zdCBzcGFjZUxlZnQgPSBjdXJzb3JYO1xuICAgIGNvbnN0IHNwYWNlQmVsb3cgPSBjb250YWluZXJSZWN0LmhlaWdodCAtIGN1cnNvclk7XG4gICAgY29uc3Qgc3BhY2VBYm92ZSA9IGN1cnNvclk7XG5cbiAgICAvLyBEZXRlcm1pbmUgYmVzdCBob3Jpem9udGFsIHBvc2l0aW9uXG4gICAgbGV0IHg6IG51bWJlcjtcbiAgICBpZiAoc3BhY2VSaWdodCA+PSB0b29sdGlwUmVjdC53aWR0aCArIHRoaXMuVE9PTFRJUF9HQVApIHtcbiAgICAgIC8vIFBvc2l0aW9uIHRvIHRoZSByaWdodCBvZiBjdXJzb3JcbiAgICAgIHggPSBjdXJzb3JYICsgdGhpcy5UT09MVElQX0dBUDtcbiAgICB9IGVsc2UgaWYgKHNwYWNlTGVmdCA+PSB0b29sdGlwUmVjdC53aWR0aCArIHRoaXMuVE9PTFRJUF9HQVApIHtcbiAgICAgIC8vIFBvc2l0aW9uIHRvIHRoZSBsZWZ0IG9mIGN1cnNvclxuICAgICAgeCA9IGN1cnNvclggLSB0b29sdGlwUmVjdC53aWR0aCAtIHRoaXMuVE9PTFRJUF9HQVA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENlbnRlciBob3Jpem9udGFsbHkgaWYgbmVpdGhlciBzaWRlIGhhcyBlbm91Z2ggc3BhY2VcbiAgICAgIHggPSBNYXRoLm1heChcbiAgICAgICAgdGhpcy5UT09MVElQX0dBUCxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgKGNvbnRhaW5lclJlY3Qud2lkdGggLSB0b29sdGlwUmVjdC53aWR0aCkgLyAyLFxuICAgICAgICAgIGNvbnRhaW5lclJlY3Qud2lkdGggLSB0b29sdGlwUmVjdC53aWR0aCAtIHRoaXMuVE9PTFRJUF9HQVAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBiZXN0IHZlcnRpY2FsIHBvc2l0aW9uXG4gICAgbGV0IHk6IG51bWJlcjtcbiAgICBpZiAoc3BhY2VCZWxvdyA+PSB0b29sdGlwUmVjdC5oZWlnaHQgKyB0aGlzLlRPT0xUSVBfR0FQKSB7XG4gICAgICAvLyBQb3NpdGlvbiBiZWxvdyBjdXJzb3JcbiAgICAgIHkgPSBjdXJzb3JZICsgdGhpcy5UT09MVElQX0dBUDtcbiAgICB9IGVsc2UgaWYgKHNwYWNlQWJvdmUgPj0gdG9vbHRpcFJlY3QuaGVpZ2h0ICsgdGhpcy5UT09MVElQX0dBUCkge1xuICAgICAgLy8gUG9zaXRpb24gYWJvdmUgY3Vyc29yXG4gICAgICB5ID0gY3Vyc29yWSAtIHRvb2x0aXBSZWN0LmhlaWdodCAtIHRoaXMuVE9PTFRJUF9HQVA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENlbnRlciB2ZXJ0aWNhbGx5IGlmIG5laXRoZXIgZGlyZWN0aW9uIGhhcyBlbm91Z2ggc3BhY2VcbiAgICAgIHkgPSBNYXRoLm1heChcbiAgICAgICAgdGhpcy5UT09MVElQX0dBUCxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgKGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gdG9vbHRpcFJlY3QuaGVpZ2h0KSAvIDIsXG4gICAgICAgICAgY29udGFpbmVyUmVjdC5oZWlnaHQgLSB0b29sdGlwUmVjdC5oZWlnaHQgLSB0aGlzLlRPT0xUSVBfR0FQLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdG9vbHRpcCBzdGF5cyB3aXRoaW4gY29udGFpbmVyIGJvdW5kc1xuICAgIHggPSBNYXRoLm1heCh0aGlzLlRPT0xUSVBfR0FQLCBNYXRoLm1pbih4LCBjb250YWluZXJSZWN0LndpZHRoIC0gdG9vbHRpcFJlY3Qud2lkdGggLSB0aGlzLlRPT0xUSVBfR0FQKSk7XG4gICAgeSA9IE1hdGgubWF4KHRoaXMuVE9PTFRJUF9HQVAsIE1hdGgubWluKHksIGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gdG9vbHRpcFJlY3QuaGVpZ2h0IC0gdGhpcy5UT09MVElQX0dBUCkpO1xuXG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYmFyIGNsaWNrIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUJhckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXR1bTogQVhCYXJDaGFydERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmJhckNsaWNrLmVtaXQoeyBpdGVtOiBkYXR1bSwgZXZlbnQ6IHsgbmF0aXZlRXZlbnQ6IGV2ZW50LCBzZW5kZXI6IHRoaXMgfSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpO1xuICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIGNvbnRhaW5lckVsZW1lbnQsIHtcbiAgICAgIGljb246IG1lc3NhZ2VzLm5vRGF0YUljb24sXG4gICAgICB0aXRsZTogbWVzc2FnZXMubm9EYXRhLFxuICAgICAgaGVscDogbWVzc2FnZXMubm9EYXRhSGVscCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpO1xuICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIGNvbnRhaW5lckVsZW1lbnQsIHtcbiAgICAgIGljb246IG1lc3NhZ2VzLmFsbEhpZGRlbkljb24sXG4gICAgICB0aXRsZTogbWVzc2FnZXMuYWxsSGlkZGVuLFxuICAgICAgaGVscDogbWVzc2FnZXMuYWxsSGlkZGVuSGVscCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb2xvciBmb3IgYSBiYXIgYmFzZWQgb24gaXRzIGluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q29sb3IoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldENoYXJ0Q29sb3IoaW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGJhciBpcyBoaWRkZW5cbiAgICovXG4gIHByb3RlY3RlZCBpc0JhckhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuQmFycy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIGludGVyZmFjZVxuICAgKiBSZXR1cm5zIGxlZ2VuZCBpdGVtcyBiYXNlZCBvbiB0aGUgY2hhcnQgZGF0YVxuICAgKi9cbiAgZ2V0TGVnZW5kSXRlbXMoKTogQVhDaGFydExlZ2VuZEl0ZW1bXSB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBpZiAodGhpcy5pc0NsdXN0ZXJlZERhdGEodmFsdWUpKSB7XG4gICAgICBjb25zdCBncm91cHMgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgICAgY29uc3Qgc2VyaWVzTGFiZWxzID0gZ3JvdXBzLmxlbmd0aCA+IDAgPyB0aGlzLmdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzKSA6IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSBncm91cHMucmVkdWNlKFxuICAgICAgICAoc3VtLCBnKSA9PiBzdW0gKyBnLmNoYXJ0RGF0YS5yZWR1Y2UoKHMsIGl0KSA9PiBzICsgKHR5cGVvZiBpdC52YWx1ZSA9PT0gJ251bWJlcicgPyBpdC52YWx1ZSA6IDApLCAwKSxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2VyaWVzTGFiZWxzLm1hcCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc1RvdGFsID0gZ3JvdXBzLnJlZHVjZSgocywgZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBnLmNoYXJ0RGF0YVtpbmRleF07XG4gICAgICAgICAgY29uc3QgdiA9IGl0ZW0gJiYgdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICAgICAgcmV0dXJuIHMgKyB2O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/IChzZXJpZXNUb3RhbCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGdyb3Vwc1swXT8uY2hhcnREYXRhW2luZGV4XTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogbGFiZWwsXG4gICAgICAgICAgbmFtZTogbGFiZWwgfHwgYFNlcmllcyAke2luZGV4ICsgMX1gLFxuICAgICAgICAgIHZhbHVlOiBzZXJpZXNUb3RhbCxcbiAgICAgICAgICBwZXJjZW50YWdlLFxuICAgICAgICAgIGNvbG9yOiBmaXJzdEl0ZW0/LmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXgpLFxuICAgICAgICAgIGhpZGRlbjogdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGxhYmVsKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYXQgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdO1xuICAgIGNvbnN0IHRvdGFsID0gZmxhdC5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgKHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJyA/IGl0ZW0udmFsdWUgOiAwKSwgMCk7XG4gICAgcmV0dXJuIGZsYXQubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKHZhbCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgSXRlbSAke2luZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihpbmRleCksXG4gICAgICAgIGhpZGRlbjogdGhpcy5pc0JhckhpZGRlbihpdGVtLmlkKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIEhpZ2hsaWdodHMgYSBzcGVjaWZpYyBiYXIgYnkgSURcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEodmFsdWUpO1xuXG4gICAgY29uc3QgcmVzZXRBbGwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCBudWxsKTtcbiAgICB9O1xuXG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICByZXNldEFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNDbHVzdGVyZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzQmFySGlkZGVuKGlkIGFzIHN0cmluZykpIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0QmFyID0gdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuZmlsdGVyKChkOiB1bmtub3duKSA9PiAoZCBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZCk/LmlkID09PSBpZCk7XG4gICAgICBpZiAodGFyZ2V0QmFyLmVtcHR5KCkpIHJldHVybjtcbiAgICAgIGNvbnN0IGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQgPSB0YXJnZXRCYXIuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJyk7XG4gICAgICBpZiAoaXNDdXJyZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgICByZXNldEFsbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgICAgdGFyZ2V0QmFyXG4gICAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcsIHRydWUpXG4gICAgICAgICAgLmF0dHIoJ2ZpbHRlcicsICdkcm9wLXNoYWRvdygwIDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4zKSknKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnIzAwMCcpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsICcxcHgnKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsICcwLjMnKVxuICAgICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdhbGwgMC4ycyBlYXNlLWluLW91dCcpO1xuICAgICAgICB0aGlzLnN2Z1xuICAgICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgICAuZmlsdGVyKChkOiB1bmtub3duKSA9PiAoZCBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZCk/LmlkICE9PSBpZClcbiAgICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWRpbW1lZCcsIHRydWUpXG4gICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwLjUpXG4gICAgICAgICAgLnN0eWxlKCd0cmFuc2l0aW9uJywgJ29wYWNpdHkgMC4ycyBlYXNlLWluLW91dCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEJhcnMgPSB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgLmZpbHRlcigoX2Q6IHVua25vd24sIGk6IG51bWJlciwgbm9kZXM6IFNWR1BhdGhFbGVtZW50W10pID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VyaWVzJykgPT09IGlkO1xuICAgICAgfSk7XG4gICAgaWYgKHRhcmdldEJhcnMuZW1wdHkoKSkgcmV0dXJuO1xuICAgIGNvbnN0IGlzSGlnaGxpZ2h0ZWQgPSB0YXJnZXRCYXJzLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcpO1xuICAgIGlmIChpc0hpZ2hsaWdodGVkKSB7XG4gICAgICByZXNldEFsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNldEFsbCgpO1xuICAgICAgdGFyZ2V0QmFyc1xuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ2ZpbHRlcicsICdkcm9wLXNoYWRvdygwIDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4zKSknKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJyMwMDAnKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgJzFweCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsICcwLjMnKVxuICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnYWxsIDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmZpbHRlcigoX2Q6IHVua25vd24sIGk6IG51bWJlciwgbm9kZXM6IFNWR1BhdGhFbGVtZW50W10pID0+IG5vZGVzW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1zZXJpZXMnKSAhPT0gaWQpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwLjUpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIGJhciBieSBJRFxuICAgKiBAcmV0dXJucyBOZXcgdmlzaWJpbGl0eSBzdGF0ZSAodHJ1ZSA9IHZpc2libGUsIGZhbHNlID0gaGlkZGVuKVxuICAgKi9cbiAgdG9nZ2xlU2VnbWVudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBjb25zdCBpc0NsdXN0ZXJlZCA9IHRoaXMuaXNDbHVzdGVyZWREYXRhKHZhbHVlKTtcblxuICAgIGlmICghaXNDbHVzdGVyZWQpIHtcbiAgICAgIGNvbnN0IHdhc0FsbEhpZGRlbiA9XG4gICAgICAgICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5sZW5ndGggPiAwICYmICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5ldmVyeSgoZCkgPT4gdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgICBpZiAodGhpcy5oaWRkZW5CYXJzLmhhcyhpZCkpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5CYXJzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAgICAgPy5zZWxlY3QodGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKVxuICAgICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRkZW5CYXJzLmFkZChpZCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhdGhpcy5oaWRkZW5CYXJzLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLy8gQ2x1c3RlcmVkIG1vZGU6IHRvZ2dsZSBzZXJpZXMgYnkgbGFiZWxcbiAgICBjb25zdCBncm91cHMgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICBjb25zdCBzZXJpZXNDb3VudCA9IHNlcmllc0xhYmVscy5sZW5ndGg7XG4gICAgY29uc3Qgd2FzQWxsSGlkZGVuID0gc2VyaWVzQ291bnQgPiAwICYmIHRoaXMuaGlkZGVuU2VyaWVzLnNpemUgPj0gc2VyaWVzQ291bnQ7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5oaWRkZW5TZXJpZXMuZGVsZXRlKGlkKTtcbiAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5kMz8uc2VsZWN0KHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtbWVzc2FnZS1jb250YWluZXInKS5yZW1vdmUoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGRlblNlcmllcy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKTtcbiAgfVxuXG4gIC8vID09PT09IEhlbHBlciB1dGlsaXRpZXMgZm9yIG1vZHVsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eSA9PT09PVxuXG4gIHByaXZhdGUgZ2V0Q29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNoYXJ0QXJlYShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtZW1wdHksIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lcicpLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyBsb25nIGxhYmVscyB3aXRoIGVsbGlwc2lzXG4gICAqL1xuICBwcml2YXRlIHRydW5jYXRlTGFiZWwobGFiZWw6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIgPSB0aGlzLk1BWF9MQUJFTF9MRU5HVEgpOiBzdHJpbmcge1xuICAgIGlmIChsYWJlbC5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gbGFiZWw7XG4gICAgcmV0dXJuIGxhYmVsLnN1YnN0cmluZygwLCBtYXhMZW5ndGggLSAxKSArICfigKYnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWRhcHRpdmUgZm9udCBzaXplIGZvciBYLWF4aXMgYmFzZWQgb24gd2lkdGggYW5kIGl0ZW0gY291bnRcbiAgICovXG4gIHByaXZhdGUgZ2V0WEF4aXNUaWNrRm9udFNpemVCYXNlZE9uV2lkdGgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpdGVtQ291bnQgPSB0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGg7XG4gICAgY29uc3QgYmFzZVNpemUgPSBNYXRoLnJvdW5kKHRoaXMud2lkdGggLyA1MCk7XG5cbiAgICAvLyBSZWR1Y2UgZm9udCBzaXplIGZvciBtYW55IGl0ZW1zXG4gICAgbGV0IGFkanVzdGVkU2l6ZSA9IGJhc2VTaXplO1xuICAgIGlmIChpdGVtQ291bnQgPiB0aGlzLlZFUllfTUFOWV9JVEVNU19USFJFU0hPTEQpIHtcbiAgICAgIGFkanVzdGVkU2l6ZSA9IE1hdGgucm91bmQoYmFzZVNpemUgKiAwLjcpO1xuICAgIH0gZWxzZSBpZiAoaXRlbUNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgYWRqdXN0ZWRTaXplID0gTWF0aC5yb3VuZChiYXNlU2l6ZSAqIDAuODUpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLk1JTl9GT05UX1NJWkVfWF9BWElTLCBNYXRoLm1pbih0aGlzLk1BWF9GT05UX1NJWkVfWF9BWElTLCBhZGp1c3RlZFNpemUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFkYXB0aXZlIGZvbnQgc2l6ZSBmb3IgWS1heGlzIGJhc2VkIG9uIGhlaWdodFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRZQXhpc1RpY2tGb250U2l6ZUJhc2VkT25IZWlnaHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBiYXNlU2l6ZSA9IE1hdGgucm91bmQodGhpcy5oZWlnaHQgLyAzMCk7XG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuTUlOX0ZPTlRfU0laRV9ZX0FYSVMsIE1hdGgubWluKHRoaXMuTUFYX0ZPTlRfU0laRV9ZX0FYSVMsIGJhc2VTaXplKSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkWEF4aXNDb21tb24oXG4gICAgYXhlc0dyb3VwOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmQzLnNlbGVjdDxTVkdHRWxlbWVudCwgdW5rbm93bj4+LFxuICAgIGlkVG9MYWJlbDogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtQ291bnQgPSB0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGg7XG5cbiAgICAvLyBTbWFydCB0aWNrIHJlZHVjdGlvbiBmb3IgbWFueSBpdGVtc1xuICAgIGxldCB0aWNrVmFsdWVzID0gdGhpcy54U2NhbGUuZG9tYWluKCk7XG4gICAgaWYgKGl0ZW1Db3VudCA+IHRoaXMuVkVSWV9NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgLy8gU2hvdyBldmVyeSA1dGggdGlja1xuICAgICAgdGlja1ZhbHVlcyA9IHRpY2tWYWx1ZXMuZmlsdGVyKChfZCwgaSkgPT4gaSAlIDUgPT09IDApO1xuICAgIH0gZWxzZSBpZiAoaXRlbUNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgLy8gU2hvdyBldmVyeSAybmQgdGlja1xuICAgICAgdGlja1ZhbHVlcyA9IHRpY2tWYWx1ZXMuZmlsdGVyKChfZCwgaSkgPT4gaSAlIDIgPT09IDApO1xuICAgIH1cblxuICAgIGNvbnN0IGF4aXMgPSB0aGlzLmQzXG4gICAgICAuYXhpc0JvdHRvbSh0aGlzLnhTY2FsZSlcbiAgICAgIC50aWNrVmFsdWVzKHRpY2tWYWx1ZXMpXG4gICAgICAudGlja0Zvcm1hdCgoaWQ6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGlkVG9MYWJlbC5nZXQoaWQpID8/IFN0cmluZyhpZCk7XG4gICAgICAgIC8vIFRydW5jYXRlIGxvbmcgbGFiZWxzIGludGVsbGlnZW50bHlcbiAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gaXRlbUNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCA/IDEwIDogdGhpcy5NQVhfTEFCRUxfTEVOR1RIO1xuICAgICAgICByZXR1cm4gdGhpcy50cnVuY2F0ZUxhYmVsKGxhYmVsLCBtYXhMZW5ndGgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnhBeGlzID0gYXhlc0dyb3VwXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy14JylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt0aGlzLmhlaWdodH0pYClcbiAgICAgIC5jYWxsKGF4aXMpO1xuXG4gICAgY29uc3QgZHluYW1pY0ZvbnRTaXplID0gdGhpcy5nZXRYQXhpc1RpY2tGb250U2l6ZUJhc2VkT25XaWR0aCgpO1xuICAgIGNvbnN0IHhBeGlzVGlja3MgPSB0aGlzLnhBeGlzXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7ZHluYW1pY0ZvbnRTaXplfXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNDAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2JhKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWxhYmVscy1jb2xvciksIDAuNyknKVxuICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKTtcblxuICAgIGNvbnN0IGlzUm90YXRlZCA9IHRoaXMuc2hvdWxkUm90YXRlWEF4aXNMYWJlbHMoaWRUb0xhYmVsLCBkeW5hbWljRm9udFNpemUpO1xuICAgIGlmIChpc1JvdGF0ZWQpIHtcbiAgICAgIHhBeGlzVGlja3MuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtNDUpJykuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ2VuZCcpLmF0dHIoJ2R4JywgJy0wLjhlbScpLmF0dHIoJ2R5JywgJzAuMTVlbScpO1xuICAgIH1cblxuICAgIHRoaXMueEF4aXMuc2VsZWN0QWxsKCdsaW5lLCBwYXRoJykuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJyk7XG5cbiAgICBpZiAob3B0aW9ucy54QXhpc0xhYmVsICYmICFpc1JvdGF0ZWQpIHtcbiAgICAgIGNvbnN0IHRpY2tOb2RlcyA9ICh0aGlzLnhBeGlzLnNlbGVjdEFsbCgndGV4dCcpLm5vZGVzKCkgfHwgW10pIGFzIFNWR1RleHRFbGVtZW50W107XG4gICAgICBjb25zdCBtZWFzdXJlZFRpY2tIZWlnaHQgPVxuICAgICAgICB0aWNrTm9kZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIC4uLnRpY2tOb2Rlcy5tYXAoKG4pID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG4/LmdldEJCb3g/LigpPy5oZWlnaHQgPz8gZHluYW1pY0ZvbnRTaXplO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNGb250U2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogZHluYW1pY0ZvbnRTaXplO1xuICAgICAgY29uc3QgdGlja0FyZWFIZWlnaHQgPSBtZWFzdXJlZFRpY2tIZWlnaHQgKyB0aGlzLlRJQ0tfQVJFQV9QQURESU5HO1xuICAgICAgY29uc3QgZ2FwQmVsb3dUaWNrcyA9IHRoaXMuWF9BWElTX1RJVExFX0dBUDtcbiAgICAgIHRoaXMuY3JlYXRlWEF4aXNUaXRsZShheGVzR3JvdXAsIG9wdGlvbnMueEF4aXNMYWJlbCwgdGlja0FyZWFIZWlnaHQsIGdhcEJlbG93VGlja3MpO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtYmFyLWNoYXJ0XCIgcm9sZT1cImltZ1wiICNjaGFydENvbnRhaW5lcj5cbiAgPCEtLSBTaGFyZWQgdG9vbHRpcCBjb21wb25lbnQgLS0+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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"}
|
|
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_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXBarChartDefaultConfig = {\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showDataLabels: true,\n showTooltip: true,\n rotateXAxisLabels: 'auto',\n barWidth: 80,\n cornerRadius: 4,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-chart-column',\n },\n};\nexport const AX_BAR_CHART_CONFIG = new InjectionToken('AX_BAR_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXBarChartDefaultConfig,\n});\nexport function barChartConfig(config = {}) {\n return {\n ...AXBarChartDefaultConfig,\n ...config,\n messages: {\n ...AXBarChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLE1BQU07SUFDekIsUUFBUSxFQUFFLEVBQUU7SUFDWixZQUFZLEVBQUUsQ0FBQztJQUNmLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsR0FBRyx5QkFBeUI7UUFDNUIsVUFBVSxFQUFFLDBCQUEwQjtLQUN2QztDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBbUIscUJBQXFCLEVBQUU7SUFDN0YsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLHVCQUF1QjtDQUN2QyxDQUFDLENBQUM7QUFJSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQWdDLEVBQUU7SUFDL0QsT0FBTztRQUNMLEdBQUcsdUJBQXVCO1FBQzFCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcsdUJBQXVCLENBQUMsUUFBUTtZQUNuQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYQmFyQ2hhcnRPcHRpb24gfSBmcm9tICcuL2Jhci1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYQmFyQ2hhcnREZWZhdWx0Q29uZmlnOiBBWEJhckNoYXJ0T3B0aW9uID0ge1xuICBzaG93WEF4aXM6IHRydWUsXG4gIHNob3dZQXhpczogdHJ1ZSxcbiAgc2hvd0dyaWQ6IHRydWUsXG4gIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICBzaG93VG9vbHRpcDogdHJ1ZSxcbiAgcm90YXRlWEF4aXNMYWJlbHM6ICdhdXRvJyxcbiAgYmFyV2lkdGg6IDgwLFxuICBjb3JuZXJSYWRpdXM6IDQsXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA4MDAsXG4gIGFuaW1hdGlvbkVhc2luZzogJ2N1YmljLW91dCcsXG4gIG1lc3NhZ2VzOiB7XG4gICAgLi4uQVhfQ0hBUlRfREVGQVVMVF9NRVNTQUdFUyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtY2hhcnQtY29sdW1uJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9CQVJfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYQmFyQ2hhcnRPcHRpb24+KCdBWF9CQVJfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IEFYQmFyQ2hhcnREZWZhdWx0Q29uZmlnLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhCYXJDaGFydE9wdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXJDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxCYXJDaGFydENvbmZpZyA9IHt9KTogQVhCYXJDaGFydE9wdGlvbiB7XG4gIHJldHVybiB7XG4gICAgLi4uQVhCYXJDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAuLi5BWEJhckNoYXJ0RGVmYXVsdENvbmZpZy5tZXNzYWdlcyxcbiAgICAgIC4uLmNvbmZpZy5tZXNzYWdlcyxcbiAgICB9LFxuICB9O1xufVxuIl19","import { AX_CHART_COLOR_PALETTE, AXChartComponent, formatLargeNumber, getChartColor, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, resolveBarWidthFraction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\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 AXChartComponent {\n // Inputs\n /** Chart data input */\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\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 - using proper D3 types\n svg;\n chart;\n xScale;\n yScale;\n xSubScale;\n xAxis;\n yAxis;\n // Chart dimensions\n width;\n height;\n margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Constants for layout calculations\n CHAR_WIDTH_RATIO = 0.65;\n TOOLTIP_GAP = 10;\n AXIS_TICK_PADDING = 10;\n Y_AXIS_TITLE_THICKNESS = 14;\n Y_AXIS_TITLE_PADDING = 14;\n X_AXIS_TITLE_FONT_SIZE = 14;\n X_AXIS_TITLE_GAP = 14;\n X_AXIS_TITLE_BLOCK_HEIGHT = 24;\n TOP_EDGE_PADDING = 8;\n BOTTOM_EDGE_PADDING = 8;\n HORIZONTAL_EDGE_PADDING = 12;\n FALLBACK_PLOT_HEIGHT = 240;\n MIN_PLOT_HEIGHT = 120;\n MIN_TOTAL_WIDTH = 200;\n OUTER_PADDING_CLUSTERED = 0.2;\n INNER_PADDING_CLUSTERED = 0.1;\n MIN_PADDING = 0.1;\n HOVER_TRANSITION_DURATION = 150;\n DEFAULT_ANIMATION_DELAY = 50;\n LABEL_ANIMATION_DELAY = 100;\n MIN_TOP_SPACE_FOR_LABEL = 20;\n LABEL_OFFSET = 8;\n ROTATION_TOLERANCE_SMALL_DATASET = 1.4;\n SMALL_DATASET_THRESHOLD = 6;\n Y_AXIS_PADDING = 20;\n TICK_AREA_PADDING = 6;\n TICK_AREA_GAP = 8;\n DEFAULT_FONT_SIZE = 13;\n FONT_WIDTH_MULTIPLIER = 0.6;\n FONT_PADDING = 8;\n MAX_LABEL_LENGTH = 20;\n MIN_FONT_SIZE_X_AXIS = 8;\n MAX_FONT_SIZE_X_AXIS = 14;\n MIN_FONT_SIZE_Y_AXIS = 9;\n MAX_FONT_SIZE_Y_AXIS = 15;\n MANY_ITEMS_THRESHOLD = 20;\n VERY_MANY_ITEMS_THRESHOLD = 50;\n // Animation state\n _initialAnimationComplete = signal(false, ...(ngDevMode ? [{ debugName: \"_initialAnimationComplete\" }] : []));\n // Tooltip state\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\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 // Removed unused AXPlatform injection\n // Configuration with defaults\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Messages with defaults\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Track hidden bars and series\n hiddenBars = new Set();\n hiddenSeries = new Set();\n // Computed values for better performance\n isClusteredMode = computed(() => {\n const value = this.data();\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }, ...(ngDevMode ? [{ debugName: \"isClusteredMode\" }] : []));\n visibleData = computed(() => {\n const value = this.data() || [];\n if (this.isClusteredMode()) {\n return value;\n }\n return value.filter((d) => !this.hiddenBars.has(d.id));\n }, ...(ngDevMode ? [{ debugName: \"visibleData\" }] : []));\n hasVisibleData = computed(() => {\n const value = this.data();\n if (!Array.isArray(value) || value.length === 0)\n return false;\n if (this.isClusteredMode()) {\n const groups = value;\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n return groups.some((g) => visibleSeries.some((label) => !!g.chartData.find((item) => item.label === label)));\n }\n return value.some((d) => !this.hiddenBars.has(d.id));\n }, ...(ngDevMode ? [{ debugName: \"hasVisibleData\" }] : []));\n // Type guard helper\n isClusteredData(value) {\n return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n }\n getClusterSeriesLabels(groups) {\n return groups[0]?.chartData?.map((d) => d.label) ?? [];\n }\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 inputValue = (this.data() || []);\n const isClustered = this.isClusteredData(inputValue);\n // Use computed visibility\n const hasAnyVisible = this.hasVisibleData();\n const visibleSingleData = isClustered ? [] : this.visibleData();\n const groupedData = isClustered ? inputValue : [];\n // Clear existing chart SVG and messages (do not remove tooltip component)\n this.clearChartArea(containerElement);\n // Early return if no data\n if (!Array.isArray(inputValue) || inputValue.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n // Early return if all bars are hidden\n if (!hasAnyVisible) {\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 and render based on mode\n if (isClustered) {\n this.setupScalesClustered(groupedData);\n this.createAxesClustered(chartOptions, groupedData);\n this.renderBarsClustered(groupedData);\n }\n else {\n this.setupScales(visibleSingleData);\n this.createAxes(chartOptions);\n this.renderBars(visibleSingleData);\n }\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._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n const container = this.chartContainerEl()?.nativeElement;\n if (container) {\n this.clearChartArea(container);\n }\n this.svg = undefined;\n this.chart = undefined;\n this._tooltipVisible.set(false);\n }\n /**\n * Sets up chart dimensions and creates SVG with responsive attributes\n */\n setupDimensions(containerElement, options) {\n // Remove outer margins; calculate only internal paddings for axes and labels\n this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n // Get container dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Axis visibility\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n // Internal left padding for Y-axis ticks/labels/title\n const yAxisTitleThickness = options.yAxisLabel ? this.Y_AXIS_TITLE_THICKNESS : 0;\n const yAxisTitlePadding = options.yAxisLabel ? this.Y_AXIS_TITLE_PADDING : 0;\n const leftPaddingForYAxis = showYAxis\n ? this.calculateMaxYAxisTickLabelWidth() + this.AXIS_TICK_PADDING + yAxisTitlePadding + yAxisTitleThickness\n : 0;\n const leftInnerPadding = leftPaddingForYAxis + this.HORIZONTAL_EDGE_PADDING;\n const rightInnerPadding = this.HORIZONTAL_EDGE_PADDING;\n // Estimate internal bottom padding for X-axis ticks/labels/title\n let bottomPaddingForXAxis = 0;\n if (showXAxis) {\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n const barCount = isClustered ? raw.length : raw.length;\n const longestLabel = (() => {\n if (isClustered) {\n const groups = raw;\n return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n }\n const flat = raw || [];\n return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n })();\n const baseWidth = options.width ?? containerWidth;\n const workingWidth = Math.max(1, baseWidth - leftInnerPadding - rightInnerPadding);\n const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n // Use truncated label length for calculation (same logic as actual rendering)\n const maxLabelLength = barCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n const estimatedLongestLabelWidth = effectiveLabelLength * dynamicFontSize * 0.65;\n const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n const rotateOption = typeof options.rotateXAxisLabels === 'boolean' ? options.rotateXAxisLabels : undefined;\n const willRotate = this.shouldLabelsRotate(rotateOption, estimatedLongestLabelWidth, availableWidthPerBar);\n const tickAreaHeight = willRotate\n ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING\n : dynamicFontSize + this.TICK_AREA_PADDING + 2;\n const gapBelowTicks = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_GAP : 0;\n const titleBlockHeight = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_BLOCK_HEIGHT : 0;\n bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n }\n // Determine plotting dimensions with sensible fallbacks\n const baseWidth = options.width ?? containerWidth;\n const totalWidth = Math.max(this.MIN_TOTAL_WIDTH, baseWidth > 0 ? baseWidth : this.MIN_TOTAL_WIDTH);\n const plotWidth = Math.max(0, totalWidth - leftInnerPadding - rightInnerPadding);\n const plotHeight = this.calculatePlotHeight(options.height, containerHeight, bottomPaddingForXAxis);\n this.width = plotWidth;\n this.height = plotHeight;\n // Create SVG with explicit pixel dimensions to avoid collapse\n const totalHeight = this.height + bottomPaddingForXAxis + this.TOP_EDGE_PADDING + this.BOTTOM_EDGE_PADDING;\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n // Create chart group translated by internal paddings (no external margins)\n this.chart = this.svg\n .append('g')\n .attr('class', 'chart-content')\n .attr('transform', `translate(${leftInnerPadding},${this.TOP_EDGE_PADDING})`);\n }\n /**\n * Calculates plot height based on options and container dimensions\n */\n calculatePlotHeight(optionHeight, containerHeight, bottomPadding) {\n if (optionHeight && optionHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, optionHeight - bottomPadding);\n }\n if (containerHeight > 0) {\n return Math.max(this.MIN_PLOT_HEIGHT, containerHeight - bottomPadding);\n }\n return this.FALLBACK_PLOT_HEIGHT;\n }\n /**\n * Determines if X-axis labels should rotate\n */\n shouldLabelsRotate(rotateOption, estimatedWidth, availableWidth) {\n if (rotateOption === true)\n return true;\n if (rotateOption === false)\n return false;\n return estimatedWidth > availableWidth;\n }\n /**\n * Creates x and y scales for the chart\n */\n setupScales(data) {\n const barWidthFraction = resolveBarWidthFraction(this.effectiveOptions().barWidth);\n const padding = Math.max(this.MIN_PADDING, 1 - barWidthFraction);\n // Create x scale (band scale for categorical data)\n this.xScale = this.d3\n .scaleBand()\n .domain(data.map((d) => d.id))\n .range([0, this.width])\n .padding(padding);\n // Create y scale (linear scale for values)\n // Support negative values by calculating min/max\n const minValue = this.d3.min(data, (d) => d.value) || 0;\n const maxValue = this.d3.max(data, (d) => d.value) || 0;\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, minValue), Math.max(0, maxValue)])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y scales for clustered charts\n */\n setupScalesClustered(groups) {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n // Outer band for clusters\n this.xScale = this.d3\n .scaleBand()\n .domain(groups.map((g) => g.id))\n .range([0, this.width])\n .padding(this.OUTER_PADDING_CLUSTERED);\n // Inner band for series\n this.xSubScale = this.d3\n .scaleBand()\n .domain(visibleSeries)\n .range([0, this.xScale.bandwidth()])\n .padding(this.INNER_PADDING_CLUSTERED);\n // Y scale across all visible values (support negative values)\n const allVisibleValues = [];\n for (const g of groups) {\n visibleSeries.forEach((label) => {\n const item = g.chartData.find((d) => d.label === label);\n if (item && typeof item.value === 'number')\n allVisibleValues.push(item.value);\n });\n }\n const yMin = this.d3.min(allVisibleValues) || 0;\n const yMax = this.d3.max(allVisibleValues) || 0;\n this.yScale = this.d3\n .scaleLinear()\n .domain([Math.min(0, yMin), Math.max(0, yMax)])\n .nice()\n .range([this.height, 0]);\n }\n /**\n * Creates x and y axes with grid lines\n */\n createAxes(options) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxis(axesGroup, options);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxis(axesGroup, options) {\n const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n const idToLabel = new Map(visibleDataForTicks.map((d) => [d.id, d.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\n }\n createYAxis(axesGroup, options) {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3.axisLeft(this.yScale).tickFormat((value) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n // Reduce tick count for better readability\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for large numbers\n }\n else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(yAxisGenerator);\n // Style the axis text\n const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n this.yAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('text-anchor', 'end')\n .attr('direction', 'ltr');\n // Style axis lines\n this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n // Add Y axis title\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel);\n }\n }\n shouldRotateXAxisLabels(idToLabel, fontSize) {\n const options = this.effectiveOptions();\n // Check if user explicitly set rotation option\n if (options.rotateXAxisLabels === true)\n return true;\n if (options.rotateXAxisLabels === false)\n return false;\n // If 'auto' or undefined, use intelligent calculation\n if (this.xScale.domain().length === 0)\n return false;\n const step = this.xScale.step();\n const labels = Array.from(idToLabel.values());\n const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n // Heuristic: avoid rotation when there are few categories even if estimation is slightly larger\n const domainCount = this.xScale.domain().length;\n if (domainCount <= this.SMALL_DATASET_THRESHOLD) {\n return estimatedWidth > step * this.ROTATION_TOLERANCE_SMALL_DATASET;\n }\n return estimatedWidth > step;\n }\n createXAxisTitle(axesGroup, title, tickAreaHeight, gapBelowTicks = this.TICK_AREA_GAP) {\n // Title positioned directly below tick area with a consistent gap\n const labelY = this.height + tickAreaHeight + gapBelowTicks;\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', 'hanging') // Align to top of text for better positioning\n .attr('x', this.width / 2)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .style('font-size', `${this.X_AXIS_TITLE_FONT_SIZE}px`)\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n createYAxisTitle(axesGroup, title) {\n // Calculate the exact position for Y-axis title\n // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n // Y-axis is at X = 0 within the chart group\n // Chart group is translated by (margin.left, margin.top)\n // So Y-axis is at X = margin.left in SVG coordinates\n const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n const padding = this.Y_AXIS_PADDING;\n // Position title to the left of the tick labels\n // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n const labelY = -maxTickLabelWidth - padding;\n // Center the title vertically\n const labelX = -this.height / 2;\n axesGroup\n .append('text')\n .attr('class', 'ax-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 .attr('direction', 'ltr')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n .text(title);\n }\n calculateMaxYAxisTickLabelWidth() {\n // Calculate the maximum width needed for Y-axis tick labels\n const raw = (this.data() || []);\n const isClustered = this.isClusteredData(raw);\n let maxValue = 0;\n if (isClustered) {\n const groups = raw;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n for (const g of groups) {\n visibleSeries.forEach((label) => {\n const item = g.chartData.find((d) => d.label === label);\n if (item && typeof item.value === 'number')\n maxValue = Math.max(maxValue, item.value);\n });\n }\n }\n else {\n const visibleData = raw.filter((d) => !this.isBarHidden(d.id));\n maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n }\n // Use formatted number for width calculation\n const tickLabelText = Number.isFinite(maxValue) ? formatLargeNumber(maxValue) : '00000';\n return tickLabelText.length * this.DEFAULT_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n createGridLines() {\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 * Creates axes for clustered charts\n */\n createAxesClustered(options, groups) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n if (showXAxis) {\n this.createXAxisClustered(axesGroup, options, groups);\n }\n if (showYAxis) {\n this.createYAxis(axesGroup, options);\n }\n if (showGrid) {\n this.createGridLines();\n }\n }\n createXAxisClustered(axesGroup, options, groups) {\n const idToLabel = new Map(groups.map((g) => [g.id, g.label]));\n this.buildXAxisCommon(axesGroup, idToLabel, options);\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() || [];\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 = getEasingFunction(this.d3, 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('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const y = this.height - 0.5; // initial height is zero\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\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.id) + 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) => {\n // Format large numbers in data labels\n return d.value >= 1000 ? formatLargeNumber(d.value) : d.value;\n });\n // Animate data labels with smart positioning to avoid clipping\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d) => {\n const barTop = this.yScale(d.value);\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d) => {\n const barTop = this.yScale(d.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\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('path');\n // Standard hover effect - darken the bar slightly and add a subtle shadow\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .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) => {\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('path');\n // Remove hover effect\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).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 const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((d, i) => i * animationDelay)\n .attrTween('d', (d) => {\n const x = this.xScale(d.id);\n const width = this.xScale.bandwidth();\n const finalHeight = this.height - this.yScale(d.value);\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\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 * Renders bars for clustered charts\n */\n renderBarsClustered(groups) {\n const seriesLabels = this.getClusterSeriesLabels(groups);\n const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n this._initialAnimationComplete.set(false);\n const radius = this.effectiveOptions().cornerRadius;\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n const groupSel = barsContainer\n .selectAll('.ax-bar-chart-group')\n .data(groups)\n .enter()\n .append('g')\n .attr('class', 'ax-bar-chart-group')\n .attr('transform', (g) => `translate(${this.xScale(g.id)},0)`);\n const barGroups = groupSel\n .selectAll('.ax-bar-chart-bar-group')\n .data((g) => visibleSeries.map((label) => {\n const seriesIndex = seriesLabels.indexOf(label);\n return {\n group: g,\n seriesLabel: label,\n seriesIndex,\n item: g.chartData.find((d) => d.label === label) ?? g.chartData[seriesIndex],\n };\n }))\n .enter()\n .append('g')\n .style('cursor', 'pointer')\n .attr('class', 'ax-bar-chart-bar-group');\n const bars = barGroups\n .append('path')\n .attr('class', 'ax-bar-chart-bar')\n .attr('data-series', (d) => d.seriesLabel)\n .attr('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const y = this.height - 0.5;\n return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n })\n .attr('fill', (d) => {\n return d.item?.color || this.getColor(d.seriesIndex);\n });\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.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n .attr('y', this.height)\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)\n .text((d) => {\n const value = d.item?.value;\n if (value === undefined)\n return '';\n return value >= 1000 ? formatLargeNumber(value) : value;\n });\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n barGroups\n .selectAll('.ax-bar-chart-data-label')\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n .attr('y', (d) => {\n if (!d.item)\n return this.height;\n const barTop = this.yScale(d.item.value);\n // If bar is near the top (100% or close), position label inside the bar\n if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n return barTop + this.LABEL_OFFSET;\n }\n // Otherwise, position above the bar\n return barTop - this.LABEL_OFFSET;\n })\n .attr('data-inside-bar', (d) => {\n if (!d.item)\n return 'false';\n const barTop = this.yScale(d.item.value);\n return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n })\n .style('opacity', 1)\n .ease(animationEasing);\n }\n barGroups\n .on('mouseenter', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n if (d.item)\n this.handleBarHover(event, d.item, d.group);\n })\n .on('mousemove', (event) => {\n if (this._initialAnimationComplete())\n this.updateTooltipPosition(event);\n })\n .on('mouseleave', (event) => {\n if (!this._initialAnimationComplete())\n return;\n const barEl = this.d3.select(event.currentTarget).select('path');\n barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n this._tooltipVisible.set(false);\n })\n .on('click', (event, d) => {\n if (!this._initialAnimationComplete())\n return;\n if (d.item)\n this.handleBarClick(event, d.item);\n });\n const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n bars\n .transition()\n .duration(animationDuration)\n .delay((_d, i) => i * animationDelay)\n .attrTween('d', (d) => {\n const x = this.xSubScale(d.seriesLabel);\n const width = this.xSubScale.bandwidth();\n const finalHeight = d.item ? this.height - this.yScale(d.item.value) : 0;\n return (t) => {\n const currentHeight = finalHeight * t;\n const currentY = this.height - currentHeight;\n const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n if (radius > 0 && currentHeight > 0) {\n // Limit radius to prevent it from exceeding half the bar width\n const effectiveRadius = Math.min(radius, width / 2);\n return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n }\n else {\n return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n }\n };\n })\n .ease(animationEasing)\n .end()\n .then(() => this._initialAnimationComplete.set(true));\n }\n /**\n * Gets the appropriate D3 easing function based on the option string\n */\n // getEasingFunction moved to shared chart utils\n /**\n * Handles bar hover event and shows tooltip\n */\n handleBarHover(event, datum, group) {\n if (this.effectiveOptions().showTooltip !== false) {\n const dataValue = this.data();\n const isClustered = this.isClusteredData(dataValue);\n const flatData = isClustered\n ? dataValue.flatMap((g) => g.chartData)\n : dataValue || [];\n const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n const color = datum.color || this.getColor(index !== -1 ? index : 0);\n // Calculate percentage of total\n const total = isClustered\n ? dataValue.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0), 0)\n : flatData.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: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n value: formatLargeNumber(datum.value),\n percentage: `${percentage}%`,\n color: color,\n });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this.scheduleTooltipPosition(0);\n }\n scheduleTooltipPosition(attempt) {\n this._tooltipRafId = requestAnimationFrame(() => {\n const coords = this._pendingTooltipCoords;\n if (!coords) {\n this._tooltipRafId = null;\n return;\n }\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) {\n this._tooltipRafId = null;\n return;\n }\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(attempt + 1);\n return;\n }\n this._tooltipRafId = null;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = this.computeEnhancedTooltipPosition(containerRect, tooltipRect, coords.x, coords.y);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Enhanced tooltip positioning that considers chart boundaries and prevents overflow\n */\n computeEnhancedTooltipPosition(containerRect, tooltipRect, clientX, clientY) {\n const containerLeft = containerRect.left;\n const containerTop = containerRect.top;\n const containerRight = containerRect.right;\n const containerBottom = containerRect.bottom;\n if (!tooltipRect) {\n return {\n x: Math.min(clientX + this.TOOLTIP_GAP, containerRight - this.TOOLTIP_GAP),\n y: Math.max(containerTop + this.TOOLTIP_GAP, Math.min(clientY + this.TOOLTIP_GAP, containerBottom - this.TOOLTIP_GAP)),\n };\n }\n const spaceRight = containerRight - clientX;\n const spaceLeft = clientX - containerLeft;\n const spaceBelow = containerBottom - clientY;\n const spaceAbove = clientY - containerTop;\n let x;\n if (spaceRight >= tooltipRect.width + this.TOOLTIP_GAP) {\n x = clientX + this.TOOLTIP_GAP;\n }\n else if (spaceLeft >= tooltipRect.width + this.TOOLTIP_GAP) {\n x = clientX - tooltipRect.width - this.TOOLTIP_GAP;\n }\n else {\n x = Math.max(containerLeft + this.TOOLTIP_GAP, Math.min(containerLeft + (containerRect.width - tooltipRect.width) / 2, containerRight - tooltipRect.width - this.TOOLTIP_GAP));\n }\n let y;\n if (spaceBelow >= tooltipRect.height + this.TOOLTIP_GAP) {\n y = clientY + this.TOOLTIP_GAP;\n }\n else if (spaceAbove >= tooltipRect.height + this.TOOLTIP_GAP) {\n y = clientY - tooltipRect.height - this.TOOLTIP_GAP;\n }\n else {\n y = Math.max(containerTop + this.TOOLTIP_GAP, Math.min(containerTop + (containerRect.height - tooltipRect.height) / 2, containerBottom - tooltipRect.height - this.TOOLTIP_GAP));\n }\n x = Math.max(containerLeft + this.TOOLTIP_GAP, Math.min(x, containerRight - tooltipRect.width - this.TOOLTIP_GAP));\n y = Math.max(containerTop + this.TOOLTIP_GAP, Math.min(y, containerBottom - tooltipRect.height - this.TOOLTIP_GAP));\n return { 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 const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n /**\n * Shows a message when all bars are hidden\n */\n showAllBarsHiddenMessage(containerElement) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.allHiddenIcon,\n title: messages.allHidden,\n help: messages.allHiddenHelp,\n });\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 value = (this.data() || []);\n if (this.isClusteredData(value)) {\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const total = groups.reduce((sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0), 0);\n return seriesLabels.map((label, index) => {\n const seriesTotal = groups.reduce((s, g) => {\n const item = g.chartData[index];\n const v = item && typeof item.value === 'number' ? item.value : 0;\n return s + v;\n }, 0);\n const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n const firstItem = groups[0]?.chartData[index];\n return {\n id: label,\n name: label || `Series ${index + 1}`,\n value: seriesTotal,\n percentage,\n color: firstItem?.color || this.getColor(index),\n hidden: this.hiddenSeries.has(label),\n };\n });\n }\n const flat = value;\n const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n return flat.map((item, index) => {\n const val = typeof item.value === 'number' ? item.value : 0;\n const percentage = total > 0 ? (val / 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 const value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n const resetAll = () => {\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 if (id === null) {\n resetAll();\n return;\n }\n if (!isClustered) {\n if (this.isBarHidden(id)) {\n resetAll();\n return;\n }\n const targetBar = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((d) => d?.id === id);\n if (targetBar.empty())\n return;\n const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n if (isCurrentlyHighlighted) {\n resetAll();\n }\n else {\n resetAll();\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 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 return;\n }\n const targetBars = this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d, i, nodes) => {\n const node = nodes[i];\n return node.getAttribute('data-series') === id;\n });\n if (targetBars.empty())\n return;\n const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n if (isHighlighted) {\n resetAll();\n }\n else {\n resetAll();\n targetBars\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 this.svg\n .selectAll('.ax-bar-chart-bar')\n .filter((_d, i, nodes) => nodes[i].getAttribute('data-series') !== 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 value = (this.data() || []);\n const isClustered = this.isClusteredData(value);\n if (!isClustered) {\n const wasAllHidden = value.length > 0 && value.every((d) => this.isBarHidden(d.id));\n if (this.hiddenBars.has(id)) {\n this.hiddenBars.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.clearChartArea(this.chartContainerEl().nativeElement);\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenBars.add(id);\n this.updateChart();\n }\n return !this.hiddenBars.has(id);\n }\n // Clustered mode: toggle series by label\n const groups = value;\n const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n const seriesCount = seriesLabels.length;\n const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n if (wasAllHidden) {\n if (this.chartContainerEl()?.nativeElement) {\n this.clearChartArea(this.chartContainerEl().nativeElement);\n setTimeout(() => {\n this.createChart();\n }, 0);\n }\n }\n else {\n this.updateChart();\n }\n }\n else {\n this.hiddenSeries.add(id);\n this.updateChart();\n }\n return !this.hiddenSeries.has(id);\n }\n // ===== Helper utilities for modularity and maintainability =====\n getContainerElement() {\n return this.chartContainerEl()?.nativeElement ?? null;\n }\n clearChartArea(containerElement) {\n if (!this.d3)\n return;\n this.d3.select(containerElement).selectAll('svg, .ax-chart-empty, .ax-chart-message-container').remove();\n }\n /**\n * Truncates long labels with ellipsis\n */\n truncateLabel(label, maxLength = this.MAX_LABEL_LENGTH) {\n if (label.length <= maxLength)\n return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n /**\n * Gets adaptive font size for X-axis based on width and item count\n */\n getXAxisTickFontSizeBasedOnWidth() {\n const itemCount = this.xScale.domain().length;\n const baseSize = Math.round(this.width / 50);\n // Reduce font size for many items\n let adjustedSize = baseSize;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.7);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n adjustedSize = Math.round(baseSize * 0.85);\n }\n return Math.max(this.MIN_FONT_SIZE_X_AXIS, Math.min(this.MAX_FONT_SIZE_X_AXIS, adjustedSize));\n }\n /**\n * Gets adaptive font size for Y-axis based on height\n */\n getYAxisTickFontSizeBasedOnHeight() {\n const baseSize = Math.round(this.height / 30);\n return Math.max(this.MIN_FONT_SIZE_Y_AXIS, Math.min(this.MAX_FONT_SIZE_Y_AXIS, baseSize));\n }\n buildXAxisCommon(axesGroup, idToLabel, options) {\n const itemCount = this.xScale.domain().length;\n // Smart tick reduction for many items\n let tickValues = this.xScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n const axis = this.d3\n .axisBottom(this.xScale)\n .tickValues(tickValues)\n .tickFormat((id) => {\n const label = idToLabel.get(id) ?? String(id);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-bar-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(axis);\n const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n if (isRotated) {\n xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n }\n this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n if (options.xAxisLabel && !isRotated) {\n const tickNodes = (this.xAxis.selectAll('text').nodes() || []);\n const measuredTickHeight = tickNodes.length > 0\n ? Math.max(...tickNodes.map((n) => {\n try {\n return n?.getBBox?.()?.height ?? dynamicFontSize;\n }\n catch {\n return dynamicFontSize;\n }\n }))\n : dynamicFontSize;\n const tickAreaHeight = measuredTickHeight + this.TICK_AREA_PADDING;\n const gapBelowTicks = this.X_AXIS_TITLE_GAP;\n this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXBarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", 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\\\" role=\\\"img\\\" #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-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-bar-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--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: 0, 0, 0, 0}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;min-height:0;box-sizing:border-box;overflow:hidden;background-color:rgba(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label{pointer-events:none;-webkit-user-select:none;user-select:none}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label[data-inside-bar=true]{fill:#fff;font-weight:600;text-shadow:0 0 2px rgba(0,0,0,.3)}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", 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\\\" role=\\\"img\\\" #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-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-bar-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--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: 0, 0, 0, 0}ax-bar-chart .ax-bar-chart{width:100%;height:100%;position:relative;min-height:0;box-sizing:border-box;overflow:hidden;background-color:rgba(var(--ax-comp-bar-chart-bg-color))}ax-bar-chart .ax-bar-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%}ax-bar-chart .ax-bar-chart svg g:has(text){font-family:inherit}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label{pointer-events:none;-webkit-user-select:none;user-select:none}ax-bar-chart .ax-bar-chart .ax-bar-chart-data-label[data-inside-bar=true]{fill:#fff;font-weight:600;text-shadow:0 0 2px rgba(0,0,0,.3)}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9iYXItY2hhcnQvc3JjL2xpYi9iYXItY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2Jhci1jaGFydC9zcmMvbGliL2Jhci1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUVoQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2Qix1QkFBdUIsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBU3pEOzs7R0FHRztBQVNILE1BQU0sT0FBTyxtQkFDWCxTQUFRLGdCQUFnQjtJQUd4QixTQUFTO0lBQ1QsdUJBQXVCO0lBQ3ZCLElBQUksR0FBRyxLQUFLLENBQWtCLEVBQXFCLGdEQUFDLENBQUM7SUFFckQsMEJBQTBCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLENBQW1CLEVBQUUsbURBQUMsQ0FBQztJQUV0QyxVQUFVO0lBQ1Ysb0NBQW9DO0lBQ3BDLFFBQVEsR0FBRyxNQUFNLEVBQXdCLENBQUM7SUFFMUMsNEJBQTRCO0lBQ1gsZ0JBQWdCLEdBQUcsU0FBUyxDQUFD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LGlCQUFpQixDQUFDO1lBQ25FLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7SUFDSCxDQUFDO3VHQWgrQ1UsbUJBQW1COzJGQUFuQixtQkFBbUIscWdCQ25EaEMsOFJBU0EsdW1ERHVDWSx1QkFBdUI7OzJGQUd0QixtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsY0FBYyxpQkFHVCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsdUJBQXVCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBWF9DSEFSVF9DT0xPUl9QQUxFVFRFLFxuICBBWENoYXJ0Q29tcG9uZW50LFxuICBBWENoYXJ0Q29tcG9uZW50QmFzZSxcbiAgZm9ybWF0TGFyZ2VOdW1iZXIsXG4gIGdldENoYXJ0Q29sb3IsXG4gIGdldEVhc2luZ0Z1bmN0aW9uLFxuICBtZXJnZUNoYXJ0TWVzc2FnZXMsXG4gIG1lcmdlQ2hhcnRPcHRpb25zLFxuICByZW5kZXJDaGFydEVtcHR5TWVzc2FnZSxcbiAgcmVzb2x2ZUJhcldpZHRoRnJhY3Rpb24sXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LWxlZ2VuZCc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5cbmltcG9ydCB7XG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWF9CQVJfQ0hBUlRfQ09ORklHIH0gZnJvbSAnLi9iYXItY2hhcnQuY29uZmlnJztcbmltcG9ydCB7XG4gIEFYQmFyQ2hhcnRDbGlja0V2ZW50LFxuICBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YSxcbiAgQVhCYXJDaGFydERhdGEsXG4gIEFYQmFyQ2hhcnRPcHRpb24sXG4gIEFYQmFyQ2hhcnRWYWx1ZSxcbn0gZnJvbSAnLi9iYXItY2hhcnQudHlwZSc7XG5cbi8qKlxuICogQmFyIENoYXJ0IENvbXBvbmVudFxuICogUmVuZGVycyBkYXRhIGFzIHZlcnRpY2FsIGJhcnMgd2l0aCBpbnRlcmFjdGl2ZSBob3ZlciBlZmZlY3RzIGFuZCBhbmltYXRpb25zXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWJhci1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXItY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9iYXItY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYQmFyQ2hhcnRDb21wb25lbnRcbiAgZXh0ZW5kcyBBWENoYXJ0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25EZXN0cm95LCBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSwgQVhDaGFydENvbXBvbmVudEJhc2VcbntcbiAgLy8gSW5wdXRzXG4gIC8qKiBDaGFydCBkYXRhIGlucHV0ICovXG4gIGRhdGEgPSBpbnB1dDxBWEJhckNoYXJ0VmFsdWU+KFtdIGFzIEFYQmFyQ2hhcnRWYWx1ZSk7XG5cbiAgLyoqIENoYXJ0IG9wdGlvbnMgaW5wdXQgKi9cbiAgb3B0aW9ucyA9IGlucHV0PEFYQmFyQ2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBPdXRwdXRzXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBiYXIgaXMgY2xpY2tlZCAqL1xuICBiYXJDbGljayA9IG91dHB1dDxBWEJhckNoYXJ0Q2xpY2tFdmVudD4oKTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gRDMgcmVmZXJlbmNlIC0gbG9hZGVkIGFzeW5jaHJvbm91c2x5XG4gIHByb3RlY3RlZCBkMyE6IHR5cGVvZiBpbXBvcnQoJ2QzJyk7XG5cbiAgLy8gQ2hhcnQgZWxlbWVudHMgLSB1c2luZyBwcm9wZXIgRDMgdHlwZXNcbiAgcHJpdmF0ZSBzdmchOiBSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoJ2QzJykuc2VsZWN0PFNWR1NWR0VsZW1lbnQsIHVua25vd24+PjtcbiAgcHJpdmF0ZSBjaGFydCE6IFJldHVyblR5cGU8dHlwZW9mIGltcG9ydCgnZDMnKS5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PjtcbiAgcHJpdmF0ZSB4U2NhbGUhOiBSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoJ2QzJykuc2NhbGVCYW5kPHN0cmluZz4+O1xuICBwcml2YXRlIHlTY2FsZSE6IFJldHVyblR5cGU8dHlwZW9mIGltcG9ydCgnZDMnKS5zY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlcj4+O1xuICBwcml2YXRlIHhTdWJTY2FsZSE6IFJldHVyblR5cGU8dHlwZW9mIGltcG9ydCgnZDMnKS5zY2FsZUJhbmQ8c3RyaW5nPj47XG4gIHByaXZhdGUgeEF4aXMhOiBSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoJ2QzJykuc2VsZWN0PFNWR0dFbGVtZW50LCB1bmtub3duPj47XG4gIHByaXZhdGUgeUF4aXMhOiBSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoJ2QzJykuc2VsZWN0PFNWR0dFbGVtZW50LCB1bmtub3duPj47XG5cbiAgLy8gQ2hhcnQgZGltZW5zaW9uc1xuICBwcml2YXRlIHdpZHRoITogbnVtYmVyO1xuICBwcml2YXRlIGhlaWdodCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuXG4gIC8vIENvbnN0YW50cyBmb3IgbGF5b3V0IGNhbGN1bGF0aW9uc1xuICBwcml2YXRlIHJlYWRvbmx5IENIQVJfV0lEVEhfUkFUSU8gPSAwLjY1O1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgQVhJU19USUNLX1BBRERJTkcgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBZX0FYSVNfVElUTEVfVEhJQ0tORVNTID0gMTQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgWV9BWElTX1RJVExFX1BBRERJTkcgPSAxNDtcbiAgcHJpdmF0ZSByZWFkb25seSBYX0FYSVNfVElUTEVfRk9OVF9TSVpFID0gMTQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgWF9BWElTX1RJVExFX0dBUCA9IDE0O1xuICBwcml2YXRlIHJlYWRvbmx5IFhfQVhJU19USVRMRV9CTE9DS19IRUlHSFQgPSAyNDtcbiAgcHJpdmF0ZSByZWFkb25seSBUT1BfRURHRV9QQURESU5HID0gODtcbiAgcHJpdmF0ZSByZWFkb25seSBCT1RUT01fRURHRV9QQURESU5HID0gODtcbiAgcHJpdmF0ZSByZWFkb25seSBIT1JJWk9OVEFMX0VER0VfUEFERElORyA9IDEyO1xuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX1BMT1RfSEVJR0hUID0gMjQwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9QTE9UX0hFSUdIVCA9IDEyMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fVE9UQUxfV0lEVEggPSAyMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgT1VURVJfUEFERElOR19DTFVTVEVSRUQgPSAwLjI7XG4gIHByaXZhdGUgcmVhZG9ubHkgSU5ORVJfUEFERElOR19DTFVTVEVSRUQgPSAwLjE7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX1BBRERJTkcgPSAwLjE7XG4gIHByaXZhdGUgcmVhZG9ubHkgSE9WRVJfVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0FOSU1BVElPTl9ERUxBWSA9IDUwO1xuICBwcml2YXRlIHJlYWRvbmx5IExBQkVMX0FOSU1BVElPTl9ERUxBWSA9IDEwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fVE9QX1NQQUNFX0ZPUl9MQUJFTCA9IDIwO1xuICBwcml2YXRlIHJlYWRvbmx5IExBQkVMX09GRlNFVCA9IDg7XG4gIHByaXZhdGUgcmVhZG9ubHkgUk9UQVRJT05fVE9MRVJBTkNFX1NNQUxMX0RBVEFTRVQgPSAxLjQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgU01BTExfREFUQVNFVF9USFJFU0hPTEQgPSA2O1xuICBwcml2YXRlIHJlYWRvbmx5IFlfQVhJU19QQURESU5HID0gMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgVElDS19BUkVBX1BBRERJTkcgPSA2O1xuICBwcml2YXRlIHJlYWRvbmx5IFRJQ0tfQVJFQV9HQVAgPSA4O1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfRk9OVF9TSVpFID0gMTM7XG4gIHByaXZhdGUgcmVhZG9ubHkgRk9OVF9XSURUSF9NVUxUSVBMSUVSID0gMC42O1xuICBwcml2YXRlIHJlYWRvbmx5IEZPTlRfUEFERElORyA9IDg7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX0xBQkVMX0xFTkdUSCA9IDIwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9GT05UX1NJWkVfWF9BWElTID0gODtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfRk9OVF9TSVpFX1hfQVhJUyA9IDE0O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9GT05UX1NJWkVfWV9BWElTID0gOTtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfRk9OVF9TSVpFX1lfQVhJUyA9IDE1O1xuICBwcml2YXRlIHJlYWRvbmx5IE1BTllfSVRFTVNfVEhSRVNIT0xEID0gMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgVkVSWV9NQU5ZX0lURU1TX1RIUkVTSE9MRCA9IDUwO1xuXG4gIC8vIEFuaW1hdGlvbiBzdGF0ZVxuICBwcml2YXRlIF9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRvb2x0aXAgc3RhdGVcbiAgcHJpdmF0ZSBfdG9vbHRpcFZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF90b29sdGlwUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBwcml2YXRlIF90b29sdGlwRGF0YSA9IHNpZ25hbDxBWENoYXJ0VG9vbHRpcERhdGE+KHtcbiAgICB0aXRsZTogJycsXG4gICAgdmFsdWU6ICcwJyxcbiAgICBwZXJjZW50YWdlOiAnMCUnLFxuICAgIGNvbG9yOiAnJyxcbiAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdUb29sdGlwQ29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyBTaWduYWxzIGZvciBjb21wb25lbnQgc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVG9vbHRpcCBhY2Nlc3NvcnNcbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfQkFSX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gSW5qZWN0IHRoZSBjaGFydCBjb2xvcnNcbiAgcHJpdmF0ZSBjaGFydENvbG9ycyA9IGluamVjdChBWF9DSEFSVF9DT0xPUl9QQUxFVFRFKTtcblxuICAvLyBJbmplY3QgQVhQbGF0Zm9ybVxuICAvLyBSZW1vdmVkIHVudXNlZCBBWFBsYXRmb3JtIGluamVjdGlvblxuXG4gIC8vIENvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0c1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IG1lcmdlQ2hhcnRPcHRpb25zKHRoaXMuY29uZmlnVG9rZW4sIHRoaXMub3B0aW9ucygpKSk7XG5cbiAgLy8gTWVzc2FnZXMgd2l0aCBkZWZhdWx0c1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIG1lcmdlQ2hhcnRNZXNzYWdlcyh0aGlzLmNvbmZpZ1Rva2VuLm1lc3NhZ2VzLCB0aGlzLm9wdGlvbnMoKT8ubWVzc2FnZXMpLFxuICApO1xuXG4gIC8vIFRyYWNrIGhpZGRlbiBiYXJzIGFuZCBzZXJpZXNcbiAgcHJpdmF0ZSByZWFkb25seSBoaWRkZW5CYXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlkZGVuU2VyaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLy8gQ29tcHV0ZWQgdmFsdWVzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBpc0NsdXN0ZXJlZE1vZGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGEoKTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiAnY2hhcnREYXRhJyBpbiB2YWx1ZVswXTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aXNpYmxlRGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YSgpIHx8IFtdO1xuICAgIGlmICh0aGlzLmlzQ2x1c3RlcmVkTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICB9XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5maWx0ZXIoKGQpID0+ICF0aGlzLmhpZGRlbkJhcnMuaGFzKGQuaWQpKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYXNWaXNpYmxlRGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YSgpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5pc0NsdXN0ZXJlZE1vZGUoKSkge1xuICAgICAgY29uc3QgZ3JvdXBzID0gdmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHMpO1xuICAgICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHNlcmllc0xhYmVscy5maWx0ZXIoKHMpID0+ICF0aGlzLmhpZGRlblNlcmllcy5oYXMocykpO1xuICAgICAgcmV0dXJuIGdyb3Vwcy5zb21lKChnKSA9PlxuICAgICAgICB2aXNpYmxlU2VyaWVzLnNvbWUoKGxhYmVsKSA9PiAhIWcuY2hhcnREYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubGFiZWwgPT09IGxhYmVsKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAodmFsdWUgYXMgQVhCYXJDaGFydERhdGFbXSkuc29tZSgoZCkgPT4gIXRoaXMuaGlkZGVuQmFycy5oYXMoZC5pZCkpO1xuICB9KTtcblxuICAvLyBUeXBlIGd1YXJkIGhlbHBlclxuICBwcml2YXRlIGlzQ2x1c3RlcmVkRGF0YSh2YWx1ZTogQVhCYXJDaGFydFZhbHVlKTogdmFsdWUgaXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgJ2NoYXJ0RGF0YScgaW4gdmFsdWVbMF07XG4gIH1cblxuICBwcml2YXRlIGdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzOiBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBncm91cHNbMF0/LmNoYXJ0RGF0YT8ubWFwKChkKSA9PiBkLmxhYmVsKSA/PyBbXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgICAvLyBDcmVhdGUgY2hhcnQgYWZ0ZXIgRDMgaXMgbG9hZGVkIGFuZCBjb250YWluZXIgaXMgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5kMyAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gQWNjZXNzIGlucHV0cyB0byB0cmFjayB0aGVtXG4gICAgICB0aGlzLmRhdGEoKTtcbiAgICAgIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmQzID0gYXdhaXQgaW1wb3J0KCdkMycpO1xuICAgICAgLy8gSWYgY29udGFpbmVyIGlzIHJlYWR5LCBjcmVhdGUgY2hhcnRcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCgpICYmIHRoaXMuY2hhcnRDb250YWluZXJFbCgpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEMy5qczonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGJhciBjaGFydCBTVkcgYW5kIHJlbmRlcnMgYWxsIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmQzIHx8ICF0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEoaW5wdXRWYWx1ZSk7XG5cbiAgICAvLyBVc2UgY29tcHV0ZWQgdmlzaWJpbGl0eVxuICAgIGNvbnN0IGhhc0FueVZpc2libGUgPSB0aGlzLmhhc1Zpc2libGVEYXRhKCk7XG4gICAgY29uc3QgdmlzaWJsZVNpbmdsZURhdGEgPSBpc0NsdXN0ZXJlZCA/IFtdIDogKHRoaXMudmlzaWJsZURhdGEoKSBhcyBBWEJhckNoYXJ0RGF0YVtdKTtcbiAgICBjb25zdCBncm91cGVkRGF0YSA9IGlzQ2x1c3RlcmVkID8gKGlucHV0VmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSkgOiBbXTtcblxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGNoYXJ0IFNWRyBhbmQgbWVzc2FnZXMgKGRvIG5vdCByZW1vdmUgdG9vbHRpcCBjb21wb25lbnQpXG4gICAgdGhpcy5jbGVhckNoYXJ0QXJlYShjb250YWluZXJFbGVtZW50KTtcblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBubyBkYXRhXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpIHx8IGlucHV0VmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVhcmx5IHJldHVybiBpZiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAgaWYgKCFoYXNBbnlWaXNpYmxlKSB7XG4gICAgICB0aGlzLnNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3B0aW9ucyBhbmQgc2V0dXAgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNoYXJ0T3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIHRoaXMuc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQsIGNoYXJ0T3B0aW9ucyk7XG5cbiAgICAvLyBDcmVhdGUgc2NhbGVzIGFuZCBheGVzIGFuZCByZW5kZXIgYmFzZWQgb24gbW9kZVxuICAgIGlmIChpc0NsdXN0ZXJlZCkge1xuICAgICAgdGhpcy5zZXR1cFNjYWxlc0NsdXN0ZXJlZChncm91cGVkRGF0YSk7XG4gICAgICB0aGlzLmNyZWF0ZUF4ZXNDbHVzdGVyZWQoY2hhcnRPcHRpb25zLCBncm91cGVkRGF0YSk7XG4gICAgICB0aGlzLnJlbmRlckJhcnNDbHVzdGVyZWQoZ3JvdXBlZERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldHVwU2NhbGVzKHZpc2libGVTaW5nbGVEYXRhKTtcbiAgICAgIHRoaXMuY3JlYXRlQXhlcyhjaGFydE9wdGlvbnMpO1xuICAgICAgdGhpcy5yZW5kZXJCYXJzKHZpc2libGVTaW5nbGVEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hhcnQgd2hlbiBpbnB1dHMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwUmFmSWQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSBudWxsO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5jbGVhckNoYXJ0QXJlYShjb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLnN2ZyA9IHVuZGVmaW5lZCE7XG4gICAgdGhpcy5jaGFydCA9IHVuZGVmaW5lZCE7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGNoYXJ0IGRpbWVuc2lvbnMgYW5kIGNyZWF0ZXMgU1ZHIHdpdGggcmVzcG9uc2l2ZSBhdHRyaWJ1dGVzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGltZW5zaW9ucyhjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9uczogQVhCYXJDaGFydE9wdGlvbik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBvdXRlciBtYXJnaW5zOyBjYWxjdWxhdGUgb25seSBpbnRlcm5hbCBwYWRkaW5ncyBmb3IgYXhlcyBhbmQgbGFiZWxzXG4gICAgdGhpcy5tYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuXG4gICAgLy8gR2V0IGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgLy8gQXhpcyB2aXNpYmlsaXR5XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcblxuICAgIC8vIEludGVybmFsIGxlZnQgcGFkZGluZyBmb3IgWS1heGlzIHRpY2tzL2xhYmVscy90aXRsZVxuICAgIGNvbnN0IHlBeGlzVGl0bGVUaGlja25lc3MgPSBvcHRpb25zLnlBeGlzTGFiZWwgPyB0aGlzLllfQVhJU19USVRMRV9USElDS05FU1MgOiAwO1xuICAgIGNvbnN0IHlBeGlzVGl0bGVQYWRkaW5nID0gb3B0aW9ucy55QXhpc0xhYmVsID8gdGhpcy5ZX0FYSVNfVElUTEVfUEFERElORyA6IDA7XG4gICAgY29uc3QgbGVmdFBhZGRpbmdGb3JZQXhpcyA9IHNob3dZQXhpc1xuICAgICAgPyB0aGlzLmNhbGN1bGF0ZU1heFlBeGlzVGlja0xhYmVsV2lkdGgoKSArIHRoaXMuQVhJU19USUNLX1BBRERJTkcgKyB5QXhpc1RpdGxlUGFkZGluZyArIHlBeGlzVGl0bGVUaGlja25lc3NcbiAgICAgIDogMDtcbiAgICBjb25zdCBsZWZ0SW5uZXJQYWRkaW5nID0gbGVmdFBhZGRpbmdGb3JZQXhpcyArIHRoaXMuSE9SSVpPTlRBTF9FREdFX1BBRERJTkc7XG4gICAgY29uc3QgcmlnaHRJbm5lclBhZGRpbmcgPSB0aGlzLkhPUklaT05UQUxfRURHRV9QQURESU5HO1xuXG4gICAgLy8gRXN0aW1hdGUgaW50ZXJuYWwgYm90dG9tIHBhZGRpbmcgZm9yIFgtYXhpcyB0aWNrcy9sYWJlbHMvdGl0bGVcbiAgICBsZXQgYm90dG9tUGFkZGluZ0ZvclhBeGlzID0gMDtcbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICBjb25zdCByYXcgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEocmF3KTtcbiAgICAgIGNvbnN0IGJhckNvdW50ID0gaXNDbHVzdGVyZWQgPyAocmF3IGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLmxlbmd0aCA6IChyYXcgYXMgQVhCYXJDaGFydERhdGFbXSkubGVuZ3RoO1xuICAgICAgY29uc3QgbG9uZ2VzdExhYmVsID0gKCgpID0+IHtcbiAgICAgICAgaWYgKGlzQ2x1c3RlcmVkKSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBzID0gcmF3IGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW107XG4gICAgICAgICAgcmV0dXJuIGdyb3Vwcy5yZWR1Y2UoKGFjYywgZykgPT4gKGFjYy5sZW5ndGggPiAoZy5sYWJlbD8ubGVuZ3RoID8/IDApID8gYWNjIDogKGcubGFiZWwgPz8gJycpKSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYXQgPSAocmF3IGFzIEFYQmFyQ2hhcnREYXRhW10pIHx8IFtdO1xuICAgICAgICByZXR1cm4gZmxhdC5yZWR1Y2UoKGEsIGIpID0+IChhLmxlbmd0aCA+IGIubGFiZWwubGVuZ3RoID8gYSA6IGIubGFiZWwpLCAnJyk7XG4gICAgICB9KSgpO1xuXG4gICAgICBjb25zdCBiYXNlV2lkdGggPSBvcHRpb25zLndpZHRoID8/IGNvbnRhaW5lcldpZHRoO1xuICAgICAgY29uc3Qgd29ya2luZ1dpZHRoID0gTWF0aC5tYXgoMSwgYmFzZVdpZHRoIC0gbGVmdElubmVyUGFkZGluZyAtIHJpZ2h0SW5uZXJQYWRkaW5nKTtcbiAgICAgIGNvbnN0IGR5bmFtaWNGb250U2l6ZSA9IE1hdGgubWF4KDEwLCBNYXRoLm1pbigxNCwgTWF0aC5yb3VuZCh3b3JraW5nV2lkdGggLyA1MCkpKTtcblxuICAgICAgLy8gVXNlIHRydW5jYXRlZCBsYWJlbCBsZW5ndGggZm9yIGNhbGN1bGF0aW9uIChzYW1lIGxvZ2ljIGFzIGFjdHVhbCByZW5kZXJpbmcpXG4gICAgICBjb25zdCBtYXhMYWJlbExlbmd0aCA9IGJhckNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCA/IDEwIDogdGhpcy5NQVhfTEFCRUxfTEVOR1RIO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTGFiZWxMZW5ndGggPSBNYXRoLm1pbihsb25nZXN0TGFiZWwubGVuZ3RoLCBtYXhMYWJlbExlbmd0aCk7XG4gICAgICBjb25zdCBlc3RpbWF0ZWRMb25nZXN0TGFiZWxXaWR0aCA9IGVmZmVjdGl2ZUxhYmVsTGVuZ3RoICogZHluYW1pY0ZvbnRTaXplICogMC42NTtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhQZXJCYXIgPSBiYXJDb3VudCA+IDAgPyB3b3JraW5nV2lkdGggLyBiYXJDb3VudCA6IHdvcmtpbmdXaWR0aDtcbiAgICAgIGNvbnN0IHJvdGF0ZU9wdGlvbiA9IHR5cGVvZiBvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgd2lsbFJvdGF0ZSA9IHRoaXMuc2hvdWxkTGFiZWxzUm90YXRlKHJvdGF0ZU9wdGlvbiwgZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGgsIGF2YWlsYWJsZVdpZHRoUGVyQmFyKTtcblxuICAgICAgY29uc3QgdGlja0FyZWFIZWlnaHQgPSB3aWxsUm90YXRlXG4gICAgICAgID8gZXN0aW1hdGVkTG9uZ2VzdExhYmVsV2lkdGggKiBNYXRoLlNRUlQxXzIgKyBkeW5hbWljRm9udFNpemUgKiBNYXRoLlNRUlQxXzIgKyB0aGlzLlRJQ0tfQVJFQV9QQURESU5HXG4gICAgICAgIDogZHluYW1pY0ZvbnRTaXplICsgdGhpcy5USUNLX0FSRUFfUEFERElORyArIDI7XG4gICAgICBjb25zdCBnYXBCZWxvd1RpY2tzID0gb3B0aW9ucy54QXhpc0xhYmVsICYmICF3aWxsUm90YXRlID8gdGhpcy5YX0FYSVNfVElUTEVfR0FQIDogMDtcbiAgICAgIGNvbnN0IHRpdGxlQmxvY2tIZWlnaHQgPSBvcHRpb25zLnhBeGlzTGFiZWwgJiYgIXdpbGxSb3RhdGUgPyB0aGlzLlhfQVhJU19USVRMRV9CTE9DS19IRUlHSFQgOiAwO1xuICAgICAgYm90dG9tUGFkZGluZ0ZvclhBeGlzID0gdGlja0FyZWFIZWlnaHQgKyBnYXBCZWxvd1RpY2tzICsgdGl0bGVCbG9ja0hlaWdodDtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgcGxvdHRpbmcgZGltZW5zaW9ucyB3aXRoIHNlbnNpYmxlIGZhbGxiYWNrc1xuICAgIGNvbnN0IGJhc2VXaWR0aCA9IG9wdGlvbnMud2lkdGggPz8gY29udGFpbmVyV2lkdGg7XG4gICAgY29uc3QgdG90YWxXaWR0aCA9IE1hdGgubWF4KHRoaXMuTUlOX1RPVEFMX1dJRFRILCBiYXNlV2lkdGggPiAwID8gYmFzZVdpZHRoIDogdGhpcy5NSU5fVE9UQUxfV0lEVEgpO1xuICAgIGNvbnN0IHBsb3RXaWR0aCA9IE1hdGgubWF4KDAsIHRvdGFsV2lkdGggLSBsZWZ0SW5uZXJQYWRkaW5nIC0gcmlnaHRJbm5lclBhZGRpbmcpO1xuXG4gICAgY29uc3QgcGxvdEhlaWdodCA9IHRoaXMuY2FsY3VsYXRlUGxvdEhlaWdodChvcHRpb25zLmhlaWdodCwgY29udGFpbmVySGVpZ2h0LCBib3R0b21QYWRkaW5nRm9yWEF4aXMpO1xuXG4gICAgdGhpcy53aWR0aCA9IHBsb3RXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IHBsb3RIZWlnaHQ7XG5cbiAgICAvLyBDcmVhdGUgU1ZHIHdpdGggZXhwbGljaXQgcGl4ZWwgZGltZW5zaW9ucyB0byBhdm9pZCBjb2xsYXBzZVxuICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBib3R0b21QYWRkaW5nRm9yWEF4aXMgKyB0aGlzLlRPUF9FREdFX1BBRERJTkcgKyB0aGlzLkJPVFRPTV9FREdFX1BBRERJTkc7XG5cbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3RvdGFsV2lkdGh9ICR7dG90YWxIZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIHRoaXMuc3ZnID0gc3ZnO1xuXG4gICAgLy8gQ3JlYXRlIGNoYXJ0IGdyb3VwIHRyYW5zbGF0ZWQgYnkgaW50ZXJuYWwgcGFkZGluZ3MgKG5vIGV4dGVybmFsIG1hcmdpbnMpXG4gICAgdGhpcy5jaGFydCA9IHRoaXMuc3ZnXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdjaGFydC1jb250ZW50JylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7bGVmdElubmVyUGFkZGluZ30sJHt0aGlzLlRPUF9FREdFX1BBRERJTkd9KWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgcGxvdCBoZWlnaHQgYmFzZWQgb24gb3B0aW9ucyBhbmQgY29udGFpbmVyIGRpbWVuc2lvbnNcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlUGxvdEhlaWdodChcbiAgICBvcHRpb25IZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBjb250YWluZXJIZWlnaHQ6IG51bWJlcixcbiAgICBib3R0b21QYWRkaW5nOiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgaWYgKG9wdGlvbkhlaWdodCAmJiBvcHRpb25IZWlnaHQgPiAwKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5NSU5fUExPVF9IRUlHSFQsIG9wdGlvbkhlaWdodCAtIGJvdHRvbVBhZGRpbmcpO1xuICAgIH1cbiAgICBpZiAoY29udGFpbmVySGVpZ2h0ID4gMCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuTUlOX1BMT1RfSEVJR0hULCBjb250YWluZXJIZWlnaHQgLSBib3R0b21QYWRkaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuRkFMTEJBQ0tfUExPVF9IRUlHSFQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBYLWF4aXMgbGFiZWxzIHNob3VsZCByb3RhdGVcbiAgICovXG4gIHByaXZhdGUgc2hvdWxkTGFiZWxzUm90YXRlKFxuICAgIHJvdGF0ZU9wdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICBlc3RpbWF0ZWRXaWR0aDogbnVtYmVyLFxuICAgIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChyb3RhdGVPcHRpb24gPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChyb3RhdGVPcHRpb24gPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGVzdGltYXRlZFdpZHRoID4gYXZhaWxhYmxlV2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB4IGFuZCB5IHNjYWxlcyBmb3IgdGhlIGNoYXJ0XG4gICAqL1xuICBwcml2YXRlIHNldHVwU2NhbGVzKGRhdGE6IEFYQmFyQ2hhcnREYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBiYXJXaWR0aEZyYWN0aW9uID0gcmVzb2x2ZUJhcldpZHRoRnJhY3Rpb24odGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYmFyV2lkdGgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCh0aGlzLk1JTl9QQURESU5HLCAxIC0gYmFyV2lkdGhGcmFjdGlvbik7XG5cbiAgICAvLyBDcmVhdGUgeCBzY2FsZSAoYmFuZCBzY2FsZSBmb3IgY2F0ZWdvcmljYWwgZGF0YSlcbiAgICB0aGlzLnhTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgLmRvbWFpbihkYXRhLm1hcCgoZCkgPT4gZC5pZCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAvLyBDcmVhdGUgeSBzY2FsZSAobGluZWFyIHNjYWxlIGZvciB2YWx1ZXMpXG4gICAgLy8gU3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMgYnkgY2FsY3VsYXRpbmcgbWluL21heFxuICAgIGNvbnN0IG1pblZhbHVlID0gdGhpcy5kMy5taW4oZGF0YSwgKGQpID0+IGQudmFsdWUpIHx8IDA7XG4gICAgY29uc3QgbWF4VmFsdWUgPSB0aGlzLmQzLm1heChkYXRhLCAoZCkgPT4gZC52YWx1ZSkgfHwgMDtcblxuICAgIHRoaXMueVNjYWxlID0gdGhpcy5kM1xuICAgICAgLnNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oW01hdGgubWluKDAsIG1pblZhbHVlKSwgTWF0aC5tYXgoMCwgbWF4VmFsdWUpXSlcbiAgICAgIC5uaWNlKClcbiAgICAgIC5yYW5nZShbdGhpcy5oZWlnaHQsIDBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHggYW5kIHkgc2NhbGVzIGZvciBjbHVzdGVyZWQgY2hhcnRzXG4gICAqL1xuICBwcml2YXRlIHNldHVwU2NhbGVzQ2x1c3RlcmVkKGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IHRoaXMuZ2V0Q2x1c3RlclNlcmllc0xhYmVscyhncm91cHMpO1xuICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcblxuICAgIC8vIE91dGVyIGJhbmQgZm9yIGNsdXN0ZXJzXG4gICAgdGhpcy54U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVCYW5kKClcbiAgICAgIC5kb21haW4oZ3JvdXBzLm1hcCgoZykgPT4gZy5pZCkpXG4gICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgLnBhZGRpbmcodGhpcy5PVVRFUl9QQURESU5HX0NMVVNURVJFRCk7XG5cbiAgICAvLyBJbm5lciBiYW5kIGZvciBzZXJpZXNcbiAgICB0aGlzLnhTdWJTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgLmRvbWFpbih2aXNpYmxlU2VyaWVzKVxuICAgICAgLnJhbmdlKFswLCB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKV0pXG4gICAgICAucGFkZGluZyh0aGlzLklOTkVSX1BBRERJTkdfQ0xVU1RFUkVEKTtcblxuICAgIC8vIFkgc2NhbGUgYWNyb3NzIGFsbCB2aXNpYmxlIHZhbHVlcyAoc3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMpXG4gICAgY29uc3QgYWxsVmlzaWJsZVZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGcgb2YgZ3JvdXBzKSB7XG4gICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKGxhYmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBnLmNoYXJ0RGF0YS5maW5kKChkKSA9PiBkLmxhYmVsID09PSBsYWJlbCk7XG4gICAgICAgIGlmIChpdGVtICYmIHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJykgYWxsVmlzaWJsZVZhbHVlcy5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHlNaW4gPSB0aGlzLmQzLm1pbihhbGxWaXNpYmxlVmFsdWVzKSB8fCAwO1xuICAgIGNvbnN0IHlNYXggPSB0aGlzLmQzLm1heChhbGxWaXNpYmxlVmFsdWVzKSB8fCAwO1xuXG4gICAgdGhpcy55U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbTWF0aC5taW4oMCwgeU1pbiksIE1hdGgubWF4KDAsIHlNYXgpXSlcbiAgICAgIC5uaWNlKClcbiAgICAgIC5yYW5nZShbdGhpcy5oZWlnaHQsIDBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHggYW5kIHkgYXhlcyB3aXRoIGdyaWQgbGluZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXhlcyhvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93R3JpZCA9IG9wdGlvbnMuc2hvd0dyaWQgIT09IGZhbHNlO1xuXG4gICAgY29uc3QgYXhlc0dyb3VwID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhlcycpO1xuXG4gICAgaWYgKHNob3dYQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVYQXhpcyhheGVzR3JvdXAsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChzaG93WUF4aXMpIHtcbiAgICAgIHRoaXMuY3JlYXRlWUF4aXMoYXhlc0dyb3VwLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd0dyaWQpIHtcbiAgICAgIHRoaXMuY3JlYXRlR3JpZExpbmVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVYQXhpcyhcbiAgICBheGVzR3JvdXA6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuZDMuc2VsZWN0PFNWR0dFbGVtZW50LCB1bmtub3duPj4sXG4gICAgb3B0aW9uczogQVhCYXJDaGFydE9wdGlvbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZURhdGFGb3JUaWNrcyA9ICh0aGlzLmRhdGEoKSB8fCBbXSkuZmlsdGVyKChkKSA9PiAhdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgY29uc3QgaWRUb0xhYmVsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4odmlzaWJsZURhdGFGb3JUaWNrcy5tYXAoKGQpID0+IFtkLmlkLCBkLmxhYmVsXSkpO1xuICAgIHRoaXMuYnVpbGRYQXhpc0NvbW1vbihheGVzR3JvdXAsIGlkVG9MYWJlbCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVlBeGlzKFxuICAgIGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PixcbiAgICBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLFxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgWSBheGlzIHdpdGggc21hcnQgbnVtYmVyIGZvcm1hdHRpbmdcbiAgICBjb25zdCB5QXhpc0dlbmVyYXRvciA9IHRoaXMuZDMuYXhpc0xlZnQodGhpcy55U2NhbGUpLnRpY2tGb3JtYXQoKHZhbHVlOiBudW1iZXIgfCB7IHZhbHVlT2YoKTogbnVtYmVyIH0pID0+IHtcbiAgICAgIGNvbnN0IG51bVZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogdmFsdWUudmFsdWVPZigpO1xuICAgICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKG51bVZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIFJlZHVjZSB0aWNrIGNvdW50IGZvciBiZXR0ZXIgcmVhZGFiaWxpdHlcbiAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMueVNjYWxlLmRvbWFpbigpWzFdO1xuICAgIGlmIChtYXhWYWx1ZSA+IDFlNikge1xuICAgICAgeUF4aXNHZW5lcmF0b3IudGlja3MoNik7IC8vIEZld2VyIHRpY2tzIGZvciBsYXJnZSBudW1iZXJzXG4gICAgfSBlbHNlIGlmIChtYXhWYWx1ZSA+IDFlMykge1xuICAgICAgeUF4aXNHZW5lcmF0b3IudGlja3MoOCk7XG4gICAgfVxuXG4gICAgdGhpcy55QXhpcyA9IGF4ZXNHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy15JykuY2FsbCh5QXhpc0dlbmVyYXRvcik7XG5cbiAgICAvLyBTdHlsZSB0aGUgYXhpcyB0ZXh0XG4gICAgY29uc3QgZHluYW1pY0ZvbnRTaXplID0gdGhpcy5nZXRZQXhpc1RpY2tGb250U2l6ZUJhc2VkT25IZWlnaHQoKTtcbiAgICB0aGlzLnlBeGlzXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7ZHluYW1pY0ZvbnRTaXplfXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNDAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2JhKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWxhYmVscy1jb2xvciksIDAuNyknKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ2VuZCcpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpO1xuXG4gICAgLy8gU3R5bGUgYXhpcyBsaW5lc1xuICAgIHRoaXMueUF4aXMuc2VsZWN0QWxsKCdsaW5lLCBwYXRoJykuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJyk7XG5cbiAgICAvLyBBZGQgWSBheGlzIHRpdGxlXG4gICAgaWYgKG9wdGlvbnMueUF4aXNMYWJlbCkge1xuICAgICAgdGhpcy5jcmVhdGVZQXhpc1RpdGxlKGF4ZXNHcm91cCwgb3B0aW9ucy55QXhpc0xhYmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJvdGF0ZVhBeGlzTGFiZWxzKGlkVG9MYWJlbDogTWFwPHN0cmluZywgc3RyaW5nPiwgZm9udFNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcblxuICAgIC8vIENoZWNrIGlmIHVzZXIgZXhwbGljaXRseSBzZXQgcm90YXRpb24gb3B0aW9uXG4gICAgaWYgKG9wdGlvbnMucm90YXRlWEF4aXNMYWJlbHMgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLnJvdGF0ZVhBeGlzTGFiZWxzID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSWYgJ2F1dG8nIG9yIHVuZGVmaW5lZCwgdXNlIGludGVsbGlnZW50IGNhbGN1bGF0aW9uXG4gICAgaWYgKHRoaXMueFNjYWxlLmRvbWFpbigpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMueFNjYWxlLnN0ZXAoKTtcbiAgICBjb25zdCBsYWJlbHMgPSBBcnJheS5mcm9tKGlkVG9MYWJlbC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbG9uZ2VzdExhYmVsID0gbGFiZWxzLnJlZHVjZSgoYSwgYikgPT4gKGEubGVuZ3RoID4gYi5sZW5ndGggPyBhIDogYiksICcnKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRXaWR0aCA9IGxvbmdlc3RMYWJlbC5sZW5ndGggKiBmb250U2l6ZSAqIHRoaXMuQ0hBUl9XSURUSF9SQVRJTztcblxuICAgIC8vIEhldXJpc3RpYzogYXZvaWQgcm90YXRpb24gd2hlbiB0aGVyZSBhcmUgZmV3IGNhdGVnb3JpZXMgZXZlbiBpZiBlc3RpbWF0aW9uIGlzIHNsaWdodGx5IGxhcmdlclxuICAgIGNvbnN0IGRvbWFpbkNvdW50ID0gdGhpcy54U2NhbGUuZG9tYWluKCkubGVuZ3RoO1xuICAgIGlmIChkb21haW5Db3VudCA8PSB0aGlzLlNNQUxMX0RBVEFTRVRfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm4gZXN0aW1hdGVkV2lkdGggPiBzdGVwICogdGhpcy5ST1RBVElPTl9UT0xFUkFOQ0VfU01BTExfREFUQVNFVDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXN0aW1hdGVkV2lkdGggPiBzdGVwO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVYQXhpc1RpdGxlKFxuICAgIGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRpY2tBcmVhSGVpZ2h0OiBudW1iZXIsXG4gICAgZ2FwQmVsb3dUaWNrcyA9IHRoaXMuVElDS19BUkVBX0dBUCxcbiAgKTogdm9pZCB7XG4gICAgLy8gVGl0bGUgcG9zaXRpb25lZCBkaXJlY3RseSBiZWxvdyB0aWNrIGFyZWEgd2l0aCBhIGNvbnNpc3RlbnQgZ2FwXG4gICAgY29uc3QgbGFiZWxZID0gdGhpcy5oZWlnaHQgKyB0aWNrQXJlYUhlaWdodCArIGdhcEJlbG93VGlja3M7XG5cbiAgICBheGVzR3JvdXBcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1heGlzLWxhYmVsIGF4LXgtYXhpcy1sYWJlbCcpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJykgLy8gQWxpZ24gdG8gdG9wIG9mIHRleHQgZm9yIGJldHRlciBwb3NpdGlvbmluZ1xuICAgICAgLmF0dHIoJ3gnLCB0aGlzLndpZHRoIC8gMilcbiAgICAgIC5hdHRyKCd5JywgbGFiZWxZKVxuICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHt0aGlzLlhfQVhJU19USVRMRV9GT05UX1NJWkV9cHhgKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc1MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1heGlzLWxhYmVsLWNvbG9yKSknKVxuICAgICAgLnRleHQodGl0bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVZQXhpc1RpdGxlKGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PiwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhhY3QgcG9zaXRpb24gZm9yIFktYXhpcyB0aXRsZVxuICAgIC8vIFktYXhpcyB0aWNrIGxhYmVscyB1c2UgdGV4dC1hbmNob3I6IGVuZCwgc28gdGhleSBleHRlbmQgTEVGVCBvZiB0aGUgWS1heGlzIGxpbmVcbiAgICAvLyBZLWF4aXMgaXMgYXQgWCA9IDAgd2l0aGluIHRoZSBjaGFydCBncm91cFxuICAgIC8vIENoYXJ0IGdyb3VwIGlzIHRyYW5zbGF0ZWQgYnkgKG1hcmdpbi5sZWZ0LCBtYXJnaW4udG9wKVxuICAgIC8vIFNvIFktYXhpcyBpcyBhdCBYID0gbWFyZ2luLmxlZnQgaW4gU1ZHIGNvb3JkaW5hdGVzXG5cbiAgICBjb25zdCBtYXhUaWNrTGFiZWxXaWR0aCA9IHRoaXMuY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLllfQVhJU19QQURESU5HO1xuXG4gICAgLy8gUG9zaXRpb24gdGl0bGUgdG8gdGhlIGxlZnQgb2YgdGhlIHRpY2sgbGFiZWxzXG4gICAgLy8gU2luY2UgdGV4dC1hbmNob3I6IGVuZCBhbGlnbnMgdGhlIHRleHQgdG8gdGhlIFktYXhpcywgd2UgbmVlZCB0byBnbyBmdXJ0aGVyIGxlZnRcbiAgICBjb25zdCBsYWJlbFkgPSAtbWF4VGlja0xhYmVsV2lkdGggLSBwYWRkaW5nO1xuXG4gICAgLy8gQ2VudGVyIHRoZSB0aXRsZSB2ZXJ0aWNhbGx5XG4gICAgY29uc3QgbGFiZWxYID0gLXRoaXMuaGVpZ2h0IC8gMjtcblxuICAgIGF4ZXNHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWF4aXMtbGFiZWwgYXgteS1heGlzLWxhYmVsJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcbiAgICAgIC5hdHRyKCd4JywgbGFiZWxYKVxuICAgICAgLmF0dHIoJ3knLCBsYWJlbFkpXG4gICAgICAuYXR0cignZGlyZWN0aW9uJywgJ2x0cicpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxNHB4JylcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtYXhpcy1sYWJlbC1jb2xvcikpJylcbiAgICAgIC50ZXh0KHRpdGxlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aCgpOiBudW1iZXIge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSB3aWR0aCBuZWVkZWQgZm9yIFktYXhpcyB0aWNrIGxhYmVsc1xuICAgIGNvbnN0IHJhdyA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEocmF3KTtcblxuICAgIGxldCBtYXhWYWx1ZSA9IDA7XG4gICAgaWYgKGlzQ2x1c3RlcmVkKSB7XG4gICAgICBjb25zdCBncm91cHMgPSByYXcgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXTtcbiAgICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBzZXJpZXNMYWJlbHMuZmlsdGVyKChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHMpKTtcblxuICAgICAgZm9yIChjb25zdCBnIG9mIGdyb3Vwcykge1xuICAgICAgICB2aXNpYmxlU2VyaWVzLmZvckVhY2goKGxhYmVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGcuY2hhcnREYXRhLmZpbmQoKGQpID0+IGQubGFiZWwgPT09IGxhYmVsKTtcbiAgICAgICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicpIG1heFZhbHVlID0gTWF0aC5tYXgobWF4VmFsdWUsIGl0ZW0udmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmlzaWJsZURhdGEgPSAocmF3IGFzIEFYQmFyQ2hhcnREYXRhW10pLmZpbHRlcigoZCkgPT4gIXRoaXMuaXNCYXJIaWRkZW4oZC5pZCkpO1xuICAgICAgbWF4VmFsdWUgPSB2aXNpYmxlRGF0YS5yZWR1Y2UoKGFjYywgZCkgPT4gKGQudmFsdWUgPiBhY2MgPyBkLnZhbHVlIDogYWNjKSwgMCk7XG4gICAgfVxuXG4gICAgLy8gVXNlIGZvcm1hdHRlZCBudW1iZXIgZm9yIHdpZHRoIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgdGlja0xhYmVsVGV4dCA9IE51bWJlci5pc0Zpbml0ZShtYXhWYWx1ZSkgPyBmb3JtYXRMYXJnZU51bWJlcihtYXhWYWx1ZSkgOiAnMDAwMDAnO1xuICAgIHJldHVybiB0aWNrTGFiZWxUZXh0Lmxlbmd0aCAqIHRoaXMuREVGQVVMVF9GT05UX1NJWkUgKiB0aGlzLkZPTlRfV0lEVEhfTVVMVElQTElFUiArIHRoaXMuRk9OVF9QQURESU5HO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHcmlkTGluZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydFxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWdyaWQnKVxuICAgICAgLmNhbGwoXG4gICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAuYXhpc0xlZnQodGhpcy55U2NhbGUpXG4gICAgICAgICAgLnRpY2tTaXplKC10aGlzLndpZHRoKVxuICAgICAgICAgIC50aWNrRm9ybWF0KCgpID0+ICcnKSxcbiAgICAgIClcbiAgICAgIC5zZWxlY3RBbGwoJ2xpbmUnKVxuICAgICAgLnN0eWxlKCdzdHJva2UnLCAncmdiKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpKScpXG4gICAgICAuc3R5bGUoJ3N0cm9rZS1vcGFjaXR5JywgMC4yKTtcblxuICAgIC8vIFJlbW92ZSB1bm5lZWRlZCBlbGVtZW50cyBmcm9tIGdyaWRcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdCgnLmF4LWJhci1jaGFydC1ncmlkJykuc2VsZWN0QWxsKCdwYXRoLCB0ZXh0JykucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBheGVzIGZvciBjbHVzdGVyZWQgY2hhcnRzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUF4ZXNDbHVzdGVyZWQob3B0aW9uczogQVhCYXJDaGFydE9wdGlvbiwgZ3JvdXBzOiBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93R3JpZCA9IG9wdGlvbnMuc2hvd0dyaWQgIT09IGZhbHNlO1xuXG4gICAgY29uc3QgYXhlc0dyb3VwID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhlcycpO1xuXG4gICAgaWYgKHNob3dYQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVYQXhpc0NsdXN0ZXJlZChheGVzR3JvdXAsIG9wdGlvbnMsIGdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dZQXhpcykge1xuICAgICAgdGhpcy5jcmVhdGVZQXhpcyhheGVzR3JvdXAsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChzaG93R3JpZCkge1xuICAgICAgdGhpcy5jcmVhdGVHcmlkTGluZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVhBeGlzQ2x1c3RlcmVkKFxuICAgIGF4ZXNHcm91cDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5kMy5zZWxlY3Q8U1ZHR0VsZW1lbnQsIHVua25vd24+PixcbiAgICBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLFxuICAgIGdyb3VwczogQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaWRUb0xhYmVsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oZ3JvdXBzLm1hcCgoZykgPT4gW2cuaWQsIGcubGFiZWxdKSk7XG4gICAgdGhpcy5idWlsZFhBeGlzQ29tbW9uKGF4ZXNHcm91cCwgaWRUb0xhYmVsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBiYXJzIHdpdGggYW5pbWF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCYXJzKGRhdGE6IEFYQmFyQ2hhcnREYXRhW10pOiB2b2lkIHtcbiAgICAvLyBGaWx0ZXIgb3V0IGhpZGRlbiBiYXJzXG4gICAgY29uc3QgdmlzaWJsZURhdGEgPSBkYXRhLmZpbHRlcigoZCkgPT4gIXRoaXMuaXNCYXJIaWRkZW4oZC5pZCkpO1xuICAgIGNvbnN0IG9yaWdpbmFsRnVsbERhdGEgPSAodGhpcy5kYXRhKCkgYXMgQVhCYXJDaGFydERhdGFbXSkgfHwgW107XG5cbiAgICAvLyBSZXNldCBhbmltYXRpb24gc3RhdGVcbiAgICB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KGZhbHNlKTtcblxuICAgIC8vIEdldCBjb3JuZXIgcmFkaXVzIGZyb20gb3B0aW9uc1xuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmNvcm5lclJhZGl1cztcblxuICAgIC8vIEdldCBhbmltYXRpb24gb3B0aW9uc1xuICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRHVyYXRpb247XG4gICAgY29uc3QgYW5pbWF0aW9uRWFzaW5nID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYWxsIGJhcnNcbiAgICBjb25zdCBiYXJzQ29udGFpbmVyID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFycy1jb250YWluZXInKTtcblxuICAgIC8vIENyZWF0ZSBncm91cHMgZm9yIGVhY2ggYmFyIHRvIGhhbmRsZSB0cmFuc2Zvcm1hdGlvbnNcbiAgICBjb25zdCBiYXJHcm91cHMgPSBiYXJzQ29udGFpbmVyXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpXG4gICAgICAuZGF0YSh2aXNpYmxlRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWJhci1jaGFydC1iYXItZ3JvdXAnKTtcblxuICAgIC8vIEFkZCBiYXJzIGluc2lkZSBncm91cHNcbiAgICBjb25zdCBiYXJzID0gYmFyR3JvdXBzXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFyJylcbiAgICAgIC5hdHRyKCdkJywgKGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLnhTY2FsZShkLmlkKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKTtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuaGVpZ2h0IC0gMC41OyAvLyBpbml0aWFsIGhlaWdodCBpcyB6ZXJvXG4gICAgICAgIHJldHVybiBgTSR7eH0sJHt5fSBMJHt4fSwke3l9IEwke3ggKyB3aWR0aH0sJHt5fSBMJHt4ICsgd2lkdGh9LCR7eX0gWmA7XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgYmFyIChkKSBpbiB0aGUgb3JpZ2luYWwgZGF0YSBhcnJheVxuICAgICAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxGdWxsRGF0YS5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGQuaWQpO1xuICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbG9yIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZ2V0IGNvbG9yIGZyb20gcGFsZXR0ZSB1c2luZyBvcmlnaW5hbCBpbmRleFxuICAgICAgICAvLyBGYWxsYmFjayB0byBpbmRleCAwIGlmIG5vdCBmb3VuZCwgdGhvdWdoIHRoaXMgc2hvdWxkbid0IGhhcHBlbiB3aXRoIHZhbGlkIGRhdGEuXG4gICAgICAgIHJldHVybiBkLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3Iob3JpZ2luYWxJbmRleCAhPT0gLTEgPyBvcmlnaW5hbEluZGV4IDogMCk7XG4gICAgICB9KTtcblxuICAgIC8vIEFkZCBkYXRhIGxhYmVscyBpZiB0aGV5J3JlIGVuYWJsZWRcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0RhdGFMYWJlbHMgIT09IGZhbHNlKSB7XG4gICAgICBiYXJHcm91cHNcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAuYXR0cigneCcsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4gdGhpcy54U2NhbGUoZC5pZCkgKyB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXG4gICAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQpIC8vIFN0YXJ0IGZyb20gYm90dG9tIGZvciBhbmltYXRpb25cbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnY2xhbXAoOHB4LCAydm1pbiwgMTJweCknKVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzUwMCcpXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZGF0YS1sYWJlbHMtY29sb3IpKScpXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApIC8vIFN0YXJ0IGludmlzaWJsZSBmb3IgYW5pbWF0aW9uXG4gICAgICAgIC50ZXh0KChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICAgIC8vIEZvcm1hdCBsYXJnZSBudW1iZXJzIGluIGRhdGEgbGFiZWxzXG4gICAgICAgICAgcmV0dXJuIGQudmFsdWUgPj0gMTAwMCA/IGZvcm1hdExhcmdlTnVtYmVyKGQudmFsdWUpIDogZC52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFuaW1hdGUgZGF0YSBsYWJlbHMgd2l0aCBzbWFydCBwb3NpdGlvbmluZyB0byBhdm9pZCBjbGlwcGluZ1xuICAgICAgY29uc3QgYW5pbWF0aW9uRGVsYXkgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EZWxheSA/PyB0aGlzLkRFRkFVTFRfQU5JTUFUSU9OX0RFTEFZO1xuICAgICAgYmFyR3JvdXBzXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAuZGVsYXkoKGQ6IEFYQmFyQ2hhcnREYXRhLCBpOiBudW1iZXIpID0+IGkgKiBhbmltYXRpb25EZWxheSArIHRoaXMuTEFCRUxfQU5JTUFUSU9OX0RFTEFZKVxuICAgICAgICAuYXR0cigneScsIChkOiBBWEJhckNoYXJ0RGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhclRvcCA9IHRoaXMueVNjYWxlKGQudmFsdWUpO1xuXG4gICAgICAgICAgLy8gSWYgYmFyIGlzIG5lYXIgdGhlIHRvcCAoMTAwJSBvciBjbG9zZSksIHBvc2l0aW9uIGxhYmVsIGluc2lkZSB0aGUgYmFyXG4gICAgICAgICAgaWYgKGJhclRvcCA8IHRoaXMuTUlOX1RPUF9TUEFDRV9GT1JfTEFCRUwpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXJUb3AgKyB0aGlzLkxBQkVMX09GRlNFVDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPdGhlcndpc2UsIHBvc2l0aW9uIGFib3ZlIHRoZSBiYXJcbiAgICAgICAgICByZXR1cm4gYmFyVG9wIC0gdGhpcy5MQUJFTF9PRkZTRVQ7XG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCdkYXRhLWluc2lkZS1iYXInLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBiYXJUb3AgPSB0aGlzLnlTY2FsZShkLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gYmFyVG9wIDwgdGhpcy5NSU5fVE9QX1NQQUNFX0ZPUl9MQUJFTCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgIH0pXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGhhbmRsZXJzIG9uIGVhY2ggZ3JvdXBcbiAgICBiYXJHcm91cHNcbiAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudDogTW91c2VFdmVudCwgZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgLy8gT25seSBhcHBseSBob3ZlciBlZmZlY3RzIGlmIGluaXRpYWwgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBiYXJFbCA9IHRoaXMuZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNlbGVjdCgncGF0aCcpO1xuXG4gICAgICAgIC8vIFN0YW5kYXJkIGhvdmVyIGVmZmVjdCAtIGRhcmtlbiB0aGUgYmFyIHNsaWdodGx5IGFuZCBhZGQgYSBzdWJ0bGUgc2hhZG93XG4gICAgICAgIGJhckVsXG4gICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgIC5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAgICAgLnN0eWxlKCdmaWx0ZXInLCAnYnJpZ2h0bmVzcygwLjcpIGRyb3Atc2hhZG93KDAgMCAycHggcmdiYSgwLDAsMCwwLjEpKScpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlQmFySG92ZXIoZXZlbnQsIGQpO1xuICAgICAgfSlcbiAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdXBkYXRlIHRvb2x0aXAgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYXBwbHkgaG92ZXIgZWZmZWN0cyBpZiBpbml0aWFsIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcblxuICAgICAgICAvLyBSZW1vdmUgaG92ZXIgZWZmZWN0XG4gICAgICAgIGJhckVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pLnN0eWxlKCdmaWx0ZXInLCBudWxsKTtcblxuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IEFYQmFyQ2hhcnREYXRhKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgdHJpZ2dlciBjbGljayBldmVudHMgaWYgaW5pdGlhbCBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVCYXJDbGljayhldmVudCwgZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIGFuaW1hdGlvblxuICAgIGNvbnN0IGFuaW1hdGlvbkRlbGF5ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRGVsYXkgPz8gdGhpcy5ERUZBVUxUX0FOSU1BVElPTl9ERUxBWTtcbiAgICBiYXJzXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZGVsYXkoKGQ6IEFYQmFyQ2hhcnREYXRhLCBpOiBudW1iZXIpID0+IGkgKiBhbmltYXRpb25EZWxheSlcbiAgICAgIC5hdHRyVHdlZW4oJ2QnLCAoZDogQVhCYXJDaGFydERhdGEpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMueFNjYWxlKGQuaWQpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMueFNjYWxlLmJhbmR3aWR0aCgpO1xuICAgICAgICBjb25zdCBmaW5hbEhlaWdodCA9IHRoaXMuaGVpZ2h0IC0gdGhpcy55U2NhbGUoZC52YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuICh0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gZmluYWxIZWlnaHQgKiB0O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRZID0gdGhpcy5oZWlnaHQgLSBjdXJyZW50SGVpZ2h0O1xuICAgICAgICAgIGNvbnN0IGJvdHRvbVkgPSB0aGlzLmhlaWdodCAtIDAuNTsgLy8gQWRkIHNtYWxsIGdhcCB0byBwcmV2ZW50IG92ZXJsYXAgd2l0aCB4LWF4aXNcblxuICAgICAgICAgIGlmIChyYWRpdXMgPiAwICYmIGN1cnJlbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCByYWRpdXMgdG8gcHJldmVudCBpdCBmcm9tIGV4Y2VlZGluZyBoYWxmIHRoZSBiYXIgd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVJhZGl1cyA9IE1hdGgubWluKHJhZGl1cywgd2lkdGggLyAyKTtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBRJHt4fSwke2N1cnJlbnRZfSAke3ggKyBlZmZlY3RpdmVSYWRpdXN9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aCAtIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gUSR7eCArIHdpZHRofSwke2N1cnJlbnRZfSAke3ggKyB3aWR0aH0sJHtjdXJyZW50WSArIGVmZmVjdGl2ZVJhZGl1c30gTCR7eCArIHdpZHRofSwke2JvdHRvbVl9IFpgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYE0ke3h9LCR7Ym90dG9tWX0gTCR7eH0sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRofSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZykgLy8gVXNlIHRoZSBjb25maWd1cmVkIGVhc2luZyBmdW5jdGlvblxuICAgICAgLmVuZCgpIC8vIFdhaXQgZm9yIGFsbCBhbmltYXRpb25zIHRvIGNvbXBsZXRlXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIE1hcmsgYW5pbWF0aW9uIGFzIGNvbXBsZXRlIHRvIGVuYWJsZSBob3ZlciBlZmZlY3RzXG4gICAgICAgIHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZS5zZXQodHJ1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGJhcnMgZm9yIGNsdXN0ZXJlZCBjaGFydHNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmFyc0NsdXN0ZXJlZChncm91cHM6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pOiB2b2lkIHtcbiAgICBjb25zdCBzZXJpZXNMYWJlbHMgPSB0aGlzLmdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzKTtcbiAgICBjb25zdCB2aXNpYmxlU2VyaWVzID0gc2VyaWVzTGFiZWxzLmZpbHRlcigocykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzKSk7XG5cbiAgICB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmNvcm5lclJhZGl1cztcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICBjb25zdCBiYXJzQ29udGFpbmVyID0gdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYmFycy1jb250YWluZXInKTtcblxuICAgIGNvbnN0IGdyb3VwU2VsID0gYmFyc0NvbnRhaW5lclxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1ncm91cCcpXG4gICAgICAuZGF0YShncm91cHMpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWdyb3VwJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZzogQVhCYXJDaGFydENsdXN0ZXJlZERhdGEpID0+IGB0cmFuc2xhdGUoJHt0aGlzLnhTY2FsZShnLmlkKX0sMClgKTtcblxuICAgIHR5cGUgQ2x1c3RlcmVkQmFyRGF0dW0gPSB7XG4gICAgICBncm91cDogQVhCYXJDaGFydENsdXN0ZXJlZERhdGE7XG4gICAgICBzZXJpZXNMYWJlbDogc3RyaW5nO1xuICAgICAgc2VyaWVzSW5kZXg6IG51bWJlcjtcbiAgICAgIGl0ZW06IEFYQmFyQ2hhcnREYXRhIHwgdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBjb25zdCBiYXJHcm91cHMgPSBncm91cFNlbFxuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXItZ3JvdXAnKVxuICAgICAgLmRhdGEoKGc6IEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhKSA9PlxuICAgICAgICB2aXNpYmxlU2VyaWVzLm1hcCgobGFiZWwpOiBDbHVzdGVyZWRCYXJEYXR1bSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VyaWVzSW5kZXggPSBzZXJpZXNMYWJlbHMuaW5kZXhPZihsYWJlbCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyb3VwOiBnLFxuICAgICAgICAgICAgc2VyaWVzTGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgc2VyaWVzSW5kZXgsXG4gICAgICAgICAgICBpdGVtOiBnLmNoYXJ0RGF0YS5maW5kKChkKSA9PiBkLmxhYmVsID09PSBsYWJlbCkgPz8gZy5jaGFydERhdGFbc2VyaWVzSW5kZXhdLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhci1ncm91cCcpO1xuXG4gICAgY29uc3QgYmFycyA9IGJhckdyb3Vwc1xuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAuYXR0cignZGF0YS1zZXJpZXMnLCAoZDogQ2x1c3RlcmVkQmFyRGF0dW0pID0+IGQuc2VyaWVzTGFiZWwpXG4gICAgICAuYXR0cignZCcsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLmhlaWdodCAtIDAuNTtcbiAgICAgICAgcmV0dXJuIGBNJHt4fSwke3l9IEwke3h9LCR7eX0gTCR7eCArIHdpZHRofSwke3l9IEwke3ggKyB3aWR0aH0sJHt5fSBaYDtcbiAgICAgIH0pXG4gICAgICAuYXR0cignZmlsbCcsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4ge1xuICAgICAgICByZXR1cm4gZC5pdGVtPy5jb2xvciB8fCB0aGlzLmdldENvbG9yKGQuc2VyaWVzSW5kZXgpO1xuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0RhdGFMYWJlbHMgIT09IGZhbHNlKSB7XG4gICAgICBiYXJHcm91cHNcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtZGF0YS1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAuYXR0cigneCcsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4gKHRoaXMueFN1YlNjYWxlKGQuc2VyaWVzTGFiZWwpIHx8IDApICsgdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxuICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0KVxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICdjbGFtcCg4cHgsIDJ2bWluLCAxMnB4KScpXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNTAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWJhci1jaGFydC1kYXRhLWxhYmVscy1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgLnRleHQoKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkLml0ZW0/LnZhbHVlO1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID49IDEwMDAgPyBmb3JtYXRMYXJnZU51bWJlcih2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFuaW1hdGlvbkRlbGF5ID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuYW5pbWF0aW9uRGVsYXkgPz8gdGhpcy5ERUZBVUxUX0FOSU1BVElPTl9ERUxBWTtcbiAgICAgIGJhckdyb3Vwc1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWRhdGEtbGFiZWwnKVxuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgICAgLmRlbGF5KChfZDogdW5rbm93biwgaTogbnVtYmVyKSA9PiBpICogYW5pbWF0aW9uRGVsYXkgKyB0aGlzLkxBQkVMX0FOSU1BVElPTl9ERUxBWSlcbiAgICAgICAgLmF0dHIoJ3knLCAoZDogQ2x1c3RlcmVkQmFyRGF0dW0pID0+IHtcbiAgICAgICAgICBpZiAoIWQuaXRlbSkgcmV0dXJuIHRoaXMuaGVpZ2h0O1xuXG4gICAgICAgICAgY29uc3QgYmFyVG9wID0gdGhpcy55U2NhbGUoZC5pdGVtLnZhbHVlKTtcblxuICAgICAgICAgIC8vIElmIGJhciBpcyBuZWFyIHRoZSB0b3AgKDEwMCUgb3IgY2xvc2UpLCBwb3NpdGlvbiBsYWJlbCBpbnNpZGUgdGhlIGJhclxuICAgICAgICAgIGlmIChiYXJUb3AgPCB0aGlzLk1JTl9UT1BfU1BBQ0VfRk9SX0xBQkVMKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFyVG9wICsgdGhpcy5MQUJFTF9PRkZTRVQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3NpdGlvbiBhYm92ZSB0aGUgYmFyXG4gICAgICAgICAgcmV0dXJuIGJhclRvcCAtIHRoaXMuTEFCRUxfT0ZGU0VUO1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cignZGF0YS1pbnNpZGUtYmFyJywgKGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgICAgaWYgKCFkLml0ZW0pIHJldHVybiAnZmFsc2UnO1xuXG4gICAgICAgICAgY29uc3QgYmFyVG9wID0gdGhpcy55U2NhbGUoZC5pdGVtLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gYmFyVG9wIDwgdGhpcy5NSU5fVE9QX1NQQUNFX0ZPUl9MQUJFTCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgIH0pXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZyk7XG4gICAgfVxuXG4gICAgYmFyR3JvdXBzXG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcbiAgICAgICAgYmFyRWxcbiAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgLmR1cmF0aW9uKHRoaXMuSE9WRVJfVFJBTlNJVElPTl9EVVJBVElPTilcbiAgICAgICAgICAuc3R5bGUoJ2ZpbHRlcicsICdicmlnaHRuZXNzKDAuNykgZHJvcC1zaGFkb3coMCAwIDJweCByZ2JhKDAsMCwwLDAuMSkpJyk7XG4gICAgICAgIGlmIChkLml0ZW0pIHRoaXMuaGFuZGxlQmFySG92ZXIoZXZlbnQsIGQuaXRlbSwgZC5ncm91cCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBbmltYXRpb25Db21wbGV0ZSgpKSB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmFyRWwgPSB0aGlzLmQzLnNlbGVjdChldmVudC5jdXJyZW50VGFyZ2V0KS5zZWxlY3QoJ3BhdGgnKTtcbiAgICAgICAgYmFyRWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuSE9WRVJfVFJBTlNJVElPTl9EVVJBVElPTikuc3R5bGUoJ2ZpbHRlcicsIG51bGwpO1xuICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgfSlcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IENsdXN0ZXJlZEJhckRhdHVtKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdGlhbEFuaW1hdGlvbkNvbXBsZXRlKCkpIHJldHVybjtcbiAgICAgICAgaWYgKGQuaXRlbSkgdGhpcy5oYW5kbGVCYXJDbGljayhldmVudCwgZC5pdGVtKTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgYW5pbWF0aW9uRGVsYXkgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5hbmltYXRpb25EZWxheSA/PyB0aGlzLkRFRkFVTFRfQU5JTUFUSU9OX0RFTEFZO1xuICAgIGJhcnNcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgIC5kZWxheSgoX2Q6IHVua25vd24sIGk6IG51bWJlcikgPT4gaSAqIGFuaW1hdGlvbkRlbGF5KVxuICAgICAgLmF0dHJUd2VlbignZCcsIChkOiBDbHVzdGVyZWRCYXJEYXR1bSkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54U3ViU2NhbGUoZC5zZXJpZXNMYWJlbCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy54U3ViU2NhbGUuYmFuZHdpZHRoKCk7XG4gICAgICAgIGNvbnN0IGZpbmFsSGVpZ2h0ID0gZC5pdGVtID8gdGhpcy5oZWlnaHQgLSB0aGlzLnlTY2FsZShkLml0ZW0udmFsdWUpIDogMDtcblxuICAgICAgICByZXR1cm4gKHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBmaW5hbEhlaWdodCAqIHQ7XG4gICAgICAgICAgY29uc3QgY3VycmVudFkgPSB0aGlzLmhlaWdodCAtIGN1cnJlbnRIZWlnaHQ7XG4gICAgICAgICAgY29uc3QgYm90dG9tWSA9IHRoaXMuaGVpZ2h0IC0gMC41OyAvLyBBZGQgc21hbGwgZ2FwIHRvIHByZXZlbnQgb3ZlcmxhcCB3aXRoIHgtYXhpc1xuXG4gICAgICAgICAgaWYgKHJhZGl1cyA+IDAgJiYgY3VycmVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgIC8vIExpbWl0IHJhZGl1cyB0byBwcmV2ZW50IGl0IGZyb20gZXhjZWVkaW5nIGhhbGYgdGhlIGJhciB3aWR0aFxuICAgICAgICAgICAgY29uc3QgZWZmZWN0aXZlUmFkaXVzID0gTWF0aC5taW4ocmFkaXVzLCB3aWR0aCAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIGBNJHt4fSwke2JvdHRvbVl9IEwke3h9LCR7Y3VycmVudFkgKyBlZmZlY3RpdmVSYWRpdXN9IFEke3h9LCR7Y3VycmVudFl9ICR7eCArIGVmZmVjdGl2ZVJhZGl1c30sJHtjdXJyZW50WX0gTCR7eCArIHdpZHRoIC0gZWZmZWN0aXZlUmFkaXVzfSwke2N1cnJlbnRZfSBRJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9ICR7eCArIHdpZHRofSwke2N1cnJlbnRZICsgZWZmZWN0aXZlUmFkaXVzfSBMJHt4ICsgd2lkdGh9LCR7Ym90dG9tWX0gWmA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgTSR7eH0sJHtib3R0b21ZfSBMJHt4fSwke2N1cnJlbnRZfSBMJHt4ICsgd2lkdGh9LCR7Y3VycmVudFl9IEwke3ggKyB3aWR0aH0sJHtib3R0b21ZfSBaYDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmVhc2UoYW5pbWF0aW9uRWFzaW5nKVxuICAgICAgLmVuZCgpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLl9pbml0aWFsQW5pbWF0aW9uQ29tcGxldGUuc2V0KHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBEMyBlYXNpbmcgZnVuY3Rpb24gYmFzZWQgb24gdGhlIG9wdGlvbiBzdHJpbmdcbiAgICovXG4gIC8vIGdldEVhc2luZ0Z1bmN0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGJhciBob3ZlciBldmVudCBhbmQgc2hvd3MgdG9vbHRpcFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVCYXJIb3ZlcihldmVudDogTW91c2VFdmVudCwgZGF0dW06IEFYQmFyQ2hhcnREYXRhLCBncm91cD86IHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgZGF0YVZhbHVlID0gdGhpcy5kYXRhKCkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgICAgY29uc3QgaXNDbHVzdGVyZWQgPSB0aGlzLmlzQ2x1c3RlcmVkRGF0YShkYXRhVmFsdWUpO1xuICAgICAgY29uc3QgZmxhdERhdGE6IEFYQmFyQ2hhcnREYXRhW10gPSBpc0NsdXN0ZXJlZFxuICAgICAgICA/IChkYXRhVmFsdWUgYXMgQVhCYXJDaGFydENsdXN0ZXJlZERhdGFbXSkuZmxhdE1hcCgoZykgPT4gZy5jaGFydERhdGEpXG4gICAgICAgIDogKGRhdGFWYWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKSB8fCBbXTtcbiAgICAgIGNvbnN0IGluZGV4ID0gZmxhdERhdGEuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXR1bS5pZCAmJiBpdGVtLmxhYmVsID09PSBkYXR1bS5sYWJlbCk7XG4gICAgICBjb25zdCBjb2xvciA9IGRhdHVtLmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXggIT09IC0xID8gaW5kZXggOiAwKTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBlcmNlbnRhZ2Ugb2YgdG90YWxcbiAgICAgIGNvbnN0IHRvdGFsID0gaXNDbHVzdGVyZWRcbiAgICAgICAgPyAoZGF0YVZhbHVlIGFzIEFYQmFyQ2hhcnRDbHVzdGVyZWREYXRhW10pLnJlZHVjZShcbiAgICAgICAgICAgIChzdW0sIGcpID0+IHN1bSArIGcuY2hhcnREYXRhLnJlZHVjZSgocywgaXQpID0+IHMgKyBpdC52YWx1ZSwgMCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgIClcbiAgICAgICAgOiAoZmxhdERhdGEgYXMgQVhCYXJDaGFydERhdGFbXSkucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0udmFsdWUsIDApO1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/ICgoZGF0dW0udmFsdWUgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMSkgOiAnMCc7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICAgIHRpdGxlOiBncm91cCA/IGAke2RhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbH0g4oCUICR7Z3JvdXAubGFiZWx9YCA6IGRhdHVtLnRvb2x0aXBMYWJlbCB8fCBkYXR1bS5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGZvcm1hdExhcmdlTnVtYmVyKGRhdHVtLnZhbHVlKSxcbiAgICAgICAgcGVyY2VudGFnZTogYCR7cGVyY2VudGFnZX0lYCxcbiAgICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5zY2hlZHVsZVRvb2x0aXBQb3NpdGlvbigwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVUb29sdGlwUG9zaXRpb24oYXR0ZW1wdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzO1xuICAgICAgaWYgKCFjb29yZHMpIHtcbiAgICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkge1xuICAgICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvb2x0aXBFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCF0b29sdGlwRWwgJiYgdGhpcy5fdG9vbHRpcFZpc2libGUoKSAmJiBhdHRlbXB0IDwgMykge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVG9vbHRpcFBvc2l0aW9uKGF0dGVtcHQgKyAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwRWwgPyB0b29sdGlwRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsO1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5jb21wdXRlRW5oYW5jZWRUb29sdGlwUG9zaXRpb24oY29udGFpbmVyUmVjdCwgdG9vbHRpcFJlY3QsIGNvb3Jkcy54LCBjb29yZHMueSk7XG4gICAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgdG9vbHRpcCBwb3NpdGlvbmluZyB0aGF0IGNvbnNpZGVycyBjaGFydCBib3VuZGFyaWVzIGFuZCBwcmV2ZW50cyBvdmVyZmxvd1xuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlRW5oYW5jZWRUb29sdGlwUG9zaXRpb24oXG4gICAgY29udGFpbmVyUmVjdDogRE9NUmVjdCxcbiAgICB0b29sdGlwUmVjdDogRE9NUmVjdCB8IG51bGwsXG4gICAgY2xpZW50WDogbnVtYmVyLFxuICAgIGNsaWVudFk6IG51bWJlcixcbiAgKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICBjb25zdCBjb250YWluZXJMZWZ0ID0gY29udGFpbmVyUmVjdC5sZWZ0O1xuICAgIGNvbnN0IGNvbnRhaW5lclRvcCA9IGNvbnRhaW5lclJlY3QudG9wO1xuICAgIGNvbnN0IGNvbnRhaW5lclJpZ2h0ID0gY29udGFpbmVyUmVjdC5yaWdodDtcbiAgICBjb25zdCBjb250YWluZXJCb3R0b20gPSBjb250YWluZXJSZWN0LmJvdHRvbTtcblxuICAgIGlmICghdG9vbHRpcFJlY3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IE1hdGgubWluKGNsaWVudFggKyB0aGlzLlRPT0xUSVBfR0FQLCBjb250YWluZXJSaWdodCAtIHRoaXMuVE9PTFRJUF9HQVApLFxuICAgICAgICB5OiBNYXRoLm1heChcbiAgICAgICAgICBjb250YWluZXJUb3AgKyB0aGlzLlRPT0xUSVBfR0FQLFxuICAgICAgICAgIE1hdGgubWluKGNsaWVudFkgKyB0aGlzLlRPT0xUSVBfR0FQLCBjb250YWluZXJCb3R0b20gLSB0aGlzLlRPT0xUSVBfR0FQKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2VSaWdodCA9IGNvbnRhaW5lclJpZ2h0IC0gY2xpZW50WDtcbiAgICBjb25zdCBzcGFjZUxlZnQgPSBjbGllbnRYIC0gY29udGFpbmVyTGVmdDtcbiAgICBjb25zdCBzcGFjZUJlbG93ID0gY29udGFpbmVyQm90dG9tIC0gY2xpZW50WTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gY2xpZW50WSAtIGNvbnRhaW5lclRvcDtcblxuICAgIGxldCB4OiBudW1iZXI7XG4gICAgaWYgKHNwYWNlUmlnaHQgPj0gdG9vbHRpcFJlY3Qud2lkdGggKyB0aGlzLlRPT0xUSVBfR0FQKSB7XG4gICAgICB4ID0gY2xpZW50WCArIHRoaXMuVE9PTFRJUF9HQVA7XG4gICAgfSBlbHNlIGlmIChzcGFjZUxlZnQgPj0gdG9vbHRpcFJlY3Qud2lkdGggKyB0aGlzLlRPT0xUSVBfR0FQKSB7XG4gICAgICB4ID0gY2xpZW50WCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gdGhpcy5UT09MVElQX0dBUDtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IE1hdGgubWF4KFxuICAgICAgICBjb250YWluZXJMZWZ0ICsgdGhpcy5UT09MVElQX0dBUCxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgY29udGFpbmVyTGVmdCArIChjb250YWluZXJSZWN0LndpZHRoIC0gdG9vbHRpcFJlY3Qud2lkdGgpIC8gMixcbiAgICAgICAgICBjb250YWluZXJSaWdodCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gdGhpcy5UT09MVElQX0dBUCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHk6IG51bWJlcjtcbiAgICBpZiAoc3BhY2VCZWxvdyA+PSB0b29sdGlwUmVjdC5oZWlnaHQgKyB0aGlzLlRPT0xUSVBfR0FQKSB7XG4gICAgICB5ID0gY2xpZW50WSArIHRoaXMuVE9PTFRJUF9HQVA7XG4gICAgfSBlbHNlIGlmIChzcGFjZUFib3ZlID49IHRvb2x0aXBSZWN0LmhlaWdodCArIHRoaXMuVE9PTFRJUF9HQVApIHtcbiAgICAgIHkgPSBjbGllbnRZIC0gdG9vbHRpcFJlY3QuaGVpZ2h0IC0gdGhpcy5UT09MVElQX0dBUDtcbiAgICB9IGVsc2Uge1xuICAgICAgeSA9IE1hdGgubWF4KFxuICAgICAgICBjb250YWluZXJUb3AgKyB0aGlzLlRPT0xUSVBfR0FQLFxuICAgICAgICBNYXRoLm1pbihcbiAgICAgICAgICBjb250YWluZXJUb3AgKyAoY29udGFpbmVyUmVjdC5oZWlnaHQgLSB0b29sdGlwUmVjdC5oZWlnaHQpIC8gMixcbiAgICAgICAgICBjb250YWluZXJCb3R0b20gLSB0b29sdGlwUmVjdC5oZWlnaHQgLSB0aGlzLlRPT0xUSVBfR0FQLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB4ID0gTWF0aC5tYXgoXG4gICAgICBjb250YWluZXJMZWZ0ICsgdGhpcy5UT09MVElQX0dBUCxcbiAgICAgIE1hdGgubWluKHgsIGNvbnRhaW5lclJpZ2h0IC0gdG9vbHRpcFJlY3Qud2lkdGggLSB0aGlzLlRPT0xUSVBfR0FQKSxcbiAgICApO1xuICAgIHkgPSBNYXRoLm1heChcbiAgICAgIGNvbnRhaW5lclRvcCArIHRoaXMuVE9PTFRJUF9HQVAsXG4gICAgICBNYXRoLm1pbih5LCBjb250YWluZXJCb3R0b20gLSB0b29sdGlwUmVjdC5oZWlnaHQgLSB0aGlzLlRPT0xUSVBfR0FQKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYmFyIGNsaWNrIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUJhckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBkYXR1bTogQVhCYXJDaGFydERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmJhckNsaWNrLmVtaXQoeyBpdGVtOiBkYXR1bSwgZXZlbnQ6IHsgbmF0aXZlRXZlbnQ6IGV2ZW50LCBzZW5kZXI6IHRoaXMgfSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm9EYXRhTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpO1xuICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIGNvbnRhaW5lckVsZW1lbnQsIHtcbiAgICAgIGljb246IG1lc3NhZ2VzLm5vRGF0YUljb24sXG4gICAgICB0aXRsZTogbWVzc2FnZXMubm9EYXRhLFxuICAgICAgaGVscDogbWVzc2FnZXMubm9EYXRhSGVscCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG1lc3NhZ2Ugd2hlbiBhbGwgYmFycyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHNob3dBbGxCYXJzSGlkZGVuTWVzc2FnZShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpO1xuICAgIHJlbmRlckNoYXJ0RW1wdHlNZXNzYWdlKHRoaXMuZDMsIGNvbnRhaW5lckVsZW1lbnQsIHtcbiAgICAgIGljb246IG1lc3NhZ2VzLmFsbEhpZGRlbkljb24sXG4gICAgICB0aXRsZTogbWVzc2FnZXMuYWxsSGlkZGVuLFxuICAgICAgaGVscDogbWVzc2FnZXMuYWxsSGlkZGVuSGVscCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb2xvciBmb3IgYSBiYXIgYmFzZWQgb24gaXRzIGluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q29sb3IoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldENoYXJ0Q29sb3IoaW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGJhciBpcyBoaWRkZW5cbiAgICovXG4gIHByb3RlY3RlZCBpc0JhckhpZGRlbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuQmFycy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlIGludGVyZmFjZVxuICAgKiBSZXR1cm5zIGxlZ2VuZCBpdGVtcyBiYXNlZCBvbiB0aGUgY2hhcnQgZGF0YVxuICAgKi9cbiAgZ2V0TGVnZW5kSXRlbXMoKTogQVhDaGFydExlZ2VuZEl0ZW1bXSB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBpZiAodGhpcy5pc0NsdXN0ZXJlZERhdGEodmFsdWUpKSB7XG4gICAgICBjb25zdCBncm91cHMgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgICAgY29uc3Qgc2VyaWVzTGFiZWxzID0gZ3JvdXBzLmxlbmd0aCA+IDAgPyB0aGlzLmdldENsdXN0ZXJTZXJpZXNMYWJlbHMoZ3JvdXBzKSA6IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSBncm91cHMucmVkdWNlKFxuICAgICAgICAoc3VtLCBnKSA9PiBzdW0gKyBnLmNoYXJ0RGF0YS5yZWR1Y2UoKHMsIGl0KSA9PiBzICsgKHR5cGVvZiBpdC52YWx1ZSA9PT0gJ251bWJlcicgPyBpdC52YWx1ZSA6IDApLCAwKSxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2VyaWVzTGFiZWxzLm1hcCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc1RvdGFsID0gZ3JvdXBzLnJlZHVjZSgocywgZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBnLmNoYXJ0RGF0YVtpbmRleF07XG4gICAgICAgICAgY29uc3QgdiA9IGl0ZW0gJiYgdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICAgICAgcmV0dXJuIHMgKyB2O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/IChzZXJpZXNUb3RhbCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGdyb3Vwc1swXT8uY2hhcnREYXRhW2luZGV4XTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogbGFiZWwsXG4gICAgICAgICAgbmFtZTogbGFiZWwgfHwgYFNlcmllcyAke2luZGV4ICsgMX1gLFxuICAgICAgICAgIHZhbHVlOiBzZXJpZXNUb3RhbCxcbiAgICAgICAgICBwZXJjZW50YWdlLFxuICAgICAgICAgIGNvbG9yOiBmaXJzdEl0ZW0/LmNvbG9yIHx8IHRoaXMuZ2V0Q29sb3IoaW5kZXgpLFxuICAgICAgICAgIGhpZGRlbjogdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGxhYmVsKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYXQgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdO1xuICAgIGNvbnN0IHRvdGFsID0gZmxhdC5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgKHR5cGVvZiBpdGVtLnZhbHVlID09PSAnbnVtYmVyJyA/IGl0ZW0udmFsdWUgOiAwKSwgMCk7XG4gICAgcmV0dXJuIGZsYXQubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdHlwZW9mIGl0ZW0udmFsdWUgPT09ICdudW1iZXInID8gaXRlbS52YWx1ZSA6IDA7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdG90YWwgPiAwID8gKHZhbCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCB8fCBgSXRlbSAke2luZGV4ICsgMX1gLFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5nZXRDb2xvcihpbmRleCksXG4gICAgICAgIGhpZGRlbjogdGhpcy5pc0JhckhpZGRlbihpdGVtLmlkKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIEhpZ2hsaWdodHMgYSBzcGVjaWZpYyBiYXIgYnkgSURcbiAgICovXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLmRhdGEoKSB8fCBbXSkgYXMgQVhCYXJDaGFydFZhbHVlO1xuICAgIGNvbnN0IGlzQ2x1c3RlcmVkID0gdGhpcy5pc0NsdXN0ZXJlZERhdGEodmFsdWUpO1xuXG4gICAgY29uc3QgcmVzZXRBbGwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN2Z1xuICAgICAgICAuc2VsZWN0QWxsKCcuYXgtYmFyLWNoYXJ0LWJhcicpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtaGlnaGxpZ2h0ZWQnLCBmYWxzZSlcbiAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1kaW1tZWQnLCBmYWxzZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKVxuICAgICAgICAuYXR0cignZmlsdGVyJywgbnVsbClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIG51bGwpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBudWxsKVxuICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCBudWxsKTtcbiAgICB9O1xuXG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICByZXNldEFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNDbHVzdGVyZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzQmFySGlkZGVuKGlkIGFzIHN0cmluZykpIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0QmFyID0gdGhpcy5zdmdcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgICAuZmlsdGVyKChkOiB1bmtub3duKSA9PiAoZCBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZCk/LmlkID09PSBpZCk7XG4gICAgICBpZiAodGFyZ2V0QmFyLmVtcHR5KCkpIHJldHVybjtcbiAgICAgIGNvbnN0IGlzQ3VycmVudGx5SGlnaGxpZ2h0ZWQgPSB0YXJnZXRCYXIuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJyk7XG4gICAgICBpZiAoaXNDdXJyZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgICByZXNldEFsbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRBbGwoKTtcbiAgICAgICAgdGFyZ2V0QmFyXG4gICAgICAgICAgLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcsIHRydWUpXG4gICAgICAgICAgLmF0dHIoJ2ZpbHRlcicsICdkcm9wLXNoYWRvdygwIDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4zKSknKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnIzAwMCcpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsICcxcHgnKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsICcwLjMnKVxuICAgICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdhbGwgMC4ycyBlYXNlLWluLW91dCcpO1xuICAgICAgICB0aGlzLnN2Z1xuICAgICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgICAuZmlsdGVyKChkOiB1bmtub3duKSA9PiAoZCBhcyBBWEJhckNoYXJ0RGF0YSB8IHVuZGVmaW5lZCk/LmlkICE9PSBpZClcbiAgICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWRpbW1lZCcsIHRydWUpXG4gICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwLjUpXG4gICAgICAgICAgLnN0eWxlKCd0cmFuc2l0aW9uJywgJ29wYWNpdHkgMC4ycyBlYXNlLWluLW91dCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEJhcnMgPSB0aGlzLnN2Z1xuICAgICAgLnNlbGVjdEFsbCgnLmF4LWJhci1jaGFydC1iYXInKVxuICAgICAgLmZpbHRlcigoX2Q6IHVua25vd24sIGk6IG51bWJlciwgbm9kZXM6IFNWR1BhdGhFbGVtZW50W10pID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VyaWVzJykgPT09IGlkO1xuICAgICAgfSk7XG4gICAgaWYgKHRhcmdldEJhcnMuZW1wdHkoKSkgcmV0dXJuO1xuICAgIGNvbnN0IGlzSGlnaGxpZ2h0ZWQgPSB0YXJnZXRCYXJzLmNsYXNzZWQoJ2F4LWJhci1jaGFydC1oaWdobGlnaHRlZCcpO1xuICAgIGlmIChpc0hpZ2hsaWdodGVkKSB7XG4gICAgICByZXNldEFsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNldEFsbCgpO1xuICAgICAgdGFyZ2V0QmFyc1xuICAgICAgICAuY2xhc3NlZCgnYXgtYmFyLWNoYXJ0LWhpZ2hsaWdodGVkJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ2ZpbHRlcicsICdkcm9wLXNoYWRvdygwIDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4zKSknKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJyMwMDAnKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgJzFweCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsICcwLjMnKVxuICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnYWxsIDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICAgIHRoaXMuc3ZnXG4gICAgICAgIC5zZWxlY3RBbGwoJy5heC1iYXItY2hhcnQtYmFyJylcbiAgICAgICAgLmZpbHRlcigoX2Q6IHVua25vd24sIGk6IG51bWJlciwgbm9kZXM6IFNWR1BhdGhFbGVtZW50W10pID0+IG5vZGVzW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1zZXJpZXMnKSAhPT0gaWQpXG4gICAgICAgIC5jbGFzc2VkKCdheC1iYXItY2hhcnQtZGltbWVkJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwLjUpXG4gICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgQVhDaGFydExlZ2VuZENvbXBhdGlibGUgaW50ZXJmYWNlXG4gICAqIFRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIGJhciBieSBJRFxuICAgKiBAcmV0dXJucyBOZXcgdmlzaWJpbGl0eSBzdGF0ZSAodHJ1ZSA9IHZpc2libGUsIGZhbHNlID0gaGlkZGVuKVxuICAgKi9cbiAgdG9nZ2xlU2VnbWVudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5kYXRhKCkgfHwgW10pIGFzIEFYQmFyQ2hhcnRWYWx1ZTtcbiAgICBjb25zdCBpc0NsdXN0ZXJlZCA9IHRoaXMuaXNDbHVzdGVyZWREYXRhKHZhbHVlKTtcblxuICAgIGlmICghaXNDbHVzdGVyZWQpIHtcbiAgICAgIGNvbnN0IHdhc0FsbEhpZGRlbiA9XG4gICAgICAgICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5sZW5ndGggPiAwICYmICh2YWx1ZSBhcyBBWEJhckNoYXJ0RGF0YVtdKS5ldmVyeSgoZCkgPT4gdGhpcy5pc0JhckhpZGRlbihkLmlkKSk7XG4gICAgICBpZiAodGhpcy5oaWRkZW5CYXJzLmhhcyhpZCkpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5CYXJzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDaGFydEFyZWEodGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRkZW5CYXJzLmFkZChpZCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhdGhpcy5oaWRkZW5CYXJzLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLy8gQ2x1c3RlcmVkIG1vZGU6IHRvZ2dsZSBzZXJpZXMgYnkgbGFiZWxcbiAgICBjb25zdCBncm91cHMgPSB2YWx1ZSBhcyBBWEJhckNoYXJ0Q2x1c3RlcmVkRGF0YVtdO1xuICAgIGNvbnN0IHNlcmllc0xhYmVscyA9IGdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5nZXRDbHVzdGVyU2VyaWVzTGFiZWxzKGdyb3VwcykgOiBbXTtcbiAgICBjb25zdCBzZXJpZXNDb3VudCA9IHNlcmllc0xhYmVscy5sZW5ndGg7XG4gICAgY29uc3Qgd2FzQWxsSGlkZGVuID0gc2VyaWVzQ291bnQgPiAwICYmIHRoaXMuaGlkZGVuU2VyaWVzLnNpemUgPj0gc2VyaWVzQ291bnQ7XG5cbiAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5oaWRkZW5TZXJpZXMuZGVsZXRlKGlkKTtcbiAgICAgIGlmICh3YXNBbGxIaWRkZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5jbGVhckNoYXJ0QXJlYSh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGRlblNlcmllcy5hZGQoaWQpO1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKTtcbiAgfVxuXG4gIC8vID09PT09IEhlbHBlciB1dGlsaXRpZXMgZm9yIG1vZHVsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eSA9PT09PVxuXG4gIHByaXZhdGUgZ2V0Q29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNoYXJ0QXJlYShjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kMykgcmV0dXJuO1xuICAgIHRoaXMuZDMuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpLnNlbGVjdEFsbCgnc3ZnLCAuYXgtY2hhcnQtZW1wdHksIC5heC1jaGFydC1tZXNzYWdlLWNvbnRhaW5lcicpLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyBsb25nIGxhYmVscyB3aXRoIGVsbGlwc2lzXG4gICAqL1xuICBwcml2YXRlIHRydW5jYXRlTGFiZWwobGFiZWw6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIgPSB0aGlzLk1BWF9MQUJFTF9MRU5HVEgpOiBzdHJpbmcge1xuICAgIGlmIChsYWJlbC5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gbGFiZWw7XG4gICAgcmV0dXJuIGxhYmVsLnN1YnN0cmluZygwLCBtYXhMZW5ndGggLSAxKSArICfigKYnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWRhcHRpdmUgZm9udCBzaXplIGZvciBYLWF4aXMgYmFzZWQgb24gd2lkdGggYW5kIGl0ZW0gY291bnRcbiAgICovXG4gIHByaXZhdGUgZ2V0WEF4aXNUaWNrRm9udFNpemVCYXNlZE9uV2lkdGgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpdGVtQ291bnQgPSB0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGg7XG4gICAgY29uc3QgYmFzZVNpemUgPSBNYXRoLnJvdW5kKHRoaXMud2lkdGggLyA1MCk7XG5cbiAgICAvLyBSZWR1Y2UgZm9udCBzaXplIGZvciBtYW55IGl0ZW1zXG4gICAgbGV0IGFkanVzdGVkU2l6ZSA9IGJhc2VTaXplO1xuICAgIGlmIChpdGVtQ291bnQgPiB0aGlzLlZFUllfTUFOWV9JVEVNU19USFJFU0hPTEQpIHtcbiAgICAgIGFkanVzdGVkU2l6ZSA9IE1hdGgucm91bmQoYmFzZVNpemUgKiAwLjcpO1xuICAgIH0gZWxzZSBpZiAoaXRlbUNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgYWRqdXN0ZWRTaXplID0gTWF0aC5yb3VuZChiYXNlU2l6ZSAqIDAuODUpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLk1JTl9GT05UX1NJWkVfWF9BWElTLCBNYXRoLm1pbih0aGlzLk1BWF9GT05UX1NJWkVfWF9BWElTLCBhZGp1c3RlZFNpemUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFkYXB0aXZlIGZvbnQgc2l6ZSBmb3IgWS1heGlzIGJhc2VkIG9uIGhlaWdodFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRZQXhpc1RpY2tGb250U2l6ZUJhc2VkT25IZWlnaHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBiYXNlU2l6ZSA9IE1hdGgucm91bmQodGhpcy5oZWlnaHQgLyAzMCk7XG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuTUlOX0ZPTlRfU0laRV9ZX0FYSVMsIE1hdGgubWluKHRoaXMuTUFYX0ZPTlRfU0laRV9ZX0FYSVMsIGJhc2VTaXplKSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkWEF4aXNDb21tb24oXG4gICAgYXhlc0dyb3VwOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmQzLnNlbGVjdDxTVkdHRWxlbWVudCwgdW5rbm93bj4+LFxuICAgIGlkVG9MYWJlbDogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBvcHRpb25zOiBBWEJhckNoYXJ0T3B0aW9uLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtQ291bnQgPSB0aGlzLnhTY2FsZS5kb21haW4oKS5sZW5ndGg7XG5cbiAgICAvLyBTbWFydCB0aWNrIHJlZHVjdGlvbiBmb3IgbWFueSBpdGVtc1xuICAgIGxldCB0aWNrVmFsdWVzID0gdGhpcy54U2NhbGUuZG9tYWluKCk7XG4gICAgaWYgKGl0ZW1Db3VudCA+IHRoaXMuVkVSWV9NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgLy8gU2hvdyBldmVyeSA1dGggdGlja1xuICAgICAgdGlja1ZhbHVlcyA9IHRpY2tWYWx1ZXMuZmlsdGVyKChfZCwgaSkgPT4gaSAlIDUgPT09IDApO1xuICAgIH0gZWxzZSBpZiAoaXRlbUNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgLy8gU2hvdyBldmVyeSAybmQgdGlja1xuICAgICAgdGlja1ZhbHVlcyA9IHRpY2tWYWx1ZXMuZmlsdGVyKChfZCwgaSkgPT4gaSAlIDIgPT09IDApO1xuICAgIH1cblxuICAgIGNvbnN0IGF4aXMgPSB0aGlzLmQzXG4gICAgICAuYXhpc0JvdHRvbSh0aGlzLnhTY2FsZSlcbiAgICAgIC50aWNrVmFsdWVzKHRpY2tWYWx1ZXMpXG4gICAgICAudGlja0Zvcm1hdCgoaWQ6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGlkVG9MYWJlbC5nZXQoaWQpID8/IFN0cmluZyhpZCk7XG4gICAgICAgIC8vIFRydW5jYXRlIGxvbmcgbGFiZWxzIGludGVsbGlnZW50bHlcbiAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gaXRlbUNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCA/IDEwIDogdGhpcy5NQVhfTEFCRUxfTEVOR1RIO1xuICAgICAgICByZXR1cm4gdGhpcy50cnVuY2F0ZUxhYmVsKGxhYmVsLCBtYXhMZW5ndGgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnhBeGlzID0gYXhlc0dyb3VwXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1iYXItY2hhcnQtYXhpcy14JylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt0aGlzLmhlaWdodH0pYClcbiAgICAgIC5jYWxsKGF4aXMpO1xuXG4gICAgY29uc3QgZHluYW1pY0ZvbnRTaXplID0gdGhpcy5nZXRYQXhpc1RpY2tGb250U2l6ZUJhc2VkT25XaWR0aCgpO1xuICAgIGNvbnN0IHhBeGlzVGlja3MgPSB0aGlzLnhBeGlzXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7ZHluYW1pY0ZvbnRTaXplfXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNDAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2JhKHZhcigtLWF4LWNvbXAtYmFyLWNoYXJ0LWxhYmVscy1jb2xvciksIDAuNyknKVxuICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKTtcblxuICAgIGNvbnN0IGlzUm90YXRlZCA9IHRoaXMuc2hvdWxkUm90YXRlWEF4aXNMYWJlbHMoaWRUb0xhYmVsLCBkeW5hbWljRm9udFNpemUpO1xuICAgIGlmIChpc1JvdGF0ZWQpIHtcbiAgICAgIHhBeGlzVGlja3MuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtNDUpJykuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ2VuZCcpLmF0dHIoJ2R4JywgJy0wLjhlbScpLmF0dHIoJ2R5JywgJzAuMTVlbScpO1xuICAgIH1cblxuICAgIHRoaXMueEF4aXMuc2VsZWN0QWxsKCdsaW5lLCBwYXRoJykuc3R5bGUoJ3N0cm9rZScsICdyZ2IodmFyKC0tYXgtY29tcC1iYXItY2hhcnQtZ3JpZC1saW5lcy1jb2xvcikpJyk7XG5cbiAgICBpZiAob3B0aW9ucy54QXhpc0xhYmVsICYmICFpc1JvdGF0ZWQpIHtcbiAgICAgIGNvbnN0IHRpY2tOb2RlcyA9ICh0aGlzLnhBeGlzLnNlbGVjdEFsbCgndGV4dCcpLm5vZGVzKCkgfHwgW10pIGFzIFNWR1RleHRFbGVtZW50W107XG4gICAgICBjb25zdCBtZWFzdXJlZFRpY2tIZWlnaHQgPVxuICAgICAgICB0aWNrTm9kZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIC4uLnRpY2tOb2Rlcy5tYXAoKG4pID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG4/LmdldEJCb3g/LigpPy5oZWlnaHQgPz8gZHluYW1pY0ZvbnRTaXplO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNGb250U2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogZHluYW1pY0ZvbnRTaXplO1xuICAgICAgY29uc3QgdGlja0FyZWFIZWlnaHQgPSBtZWFzdXJlZFRpY2tIZWlnaHQgKyB0aGlzLlRJQ0tfQVJFQV9QQURESU5HO1xuICAgICAgY29uc3QgZ2FwQmVsb3dUaWNrcyA9IHRoaXMuWF9BWElTX1RJVExFX0dBUDtcbiAgICAgIHRoaXMuY3JlYXRlWEF4aXNUaXRsZShheGVzR3JvdXAsIG9wdGlvbnMueEF4aXNMYWJlbCwgdGlja0FyZWFIZWlnaHQsIGdhcEJlbG93VGlja3MpO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiYXgtYmFyLWNoYXJ0XCIgcm9sZT1cImltZ1wiICNjaGFydENvbnRhaW5lcj5cbiAgPCEtLSBTaGFyZWQgdG9vbHRpcCBjb21wb25lbnQgLS0+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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"}
|