axidio-styleguide-library1-v2 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,8 +16,8 @@ export class GuageChartComponent extends ComponentUniqueId {
16
16
  this.chartConfiguration = {};
17
17
  this.dataType = '';
18
18
  this.datatype_status = false;
19
- this.isHeaderVisible = true;
20
19
  this.uniqueId = this.getUniqueId();
20
+ this.isHeaderVisible = true;
21
21
  this.defaultConfiguration = {
22
22
  margin: { top: 40, right: 20, bottom: 20, left: 20 },
23
23
  minAngle: -90,
@@ -55,158 +55,189 @@ export class GuageChartComponent extends ComponentUniqueId {
55
55
  ngOnChanges() {
56
56
  this.redrawChart();
57
57
  }
58
- onResized(_) {
58
+ onResized(_event) {
59
59
  this.redrawChart();
60
60
  }
61
+ /**
62
+ * Clears the previous SVG and redraws chart
63
+ */
61
64
  redrawChart() {
62
- d3.select(`#${this.uniqueId}`).remove();
63
- this.initializeChartConfig();
64
- this.drawGaugeChart();
65
+ d3.select('#' + this.uniqueId).remove();
66
+ this.initializeLineChart();
67
+ }
68
+ /**
69
+ * Main entry point for chart rendering
70
+ */
71
+ initializeLineChart() {
72
+ this.prepareConfiguration();
73
+ const { data, metaData, colorMaps, data_ready, angleValue, radius } = this.processChartData();
74
+ const svg = this.createSvgContainer(radius);
75
+ this.drawArcs(svg, data_ready, colorMaps, metaData);
76
+ this.drawPointer(svg, metaData, data_ready, radius);
77
+ this.drawLabels(svg, data_ready, radius, metaData);
78
+ this.drawTexts(svg, metaData, radius);
65
79
  }
66
- initializeChartConfig() {
80
+ /**
81
+ * Prepare chart configuration
82
+ */
83
+ prepareConfiguration() {
67
84
  for (const key in this.defaultConfiguration) {
68
85
  this.chartConfiguration[key] = ChartHelper.getValueByConfigurationType(key, this.defaultConfiguration, this.customChartConfiguration);
69
86
  }
70
- if (this.chartConfiguration.isHeaderVisible !== undefined) {
87
+ if (this.chartConfiguration.isHeaderVisible !== undefined)
71
88
  this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
72
- }
89
+ }
90
+ /**
91
+ * Process data, calculate colors and angles
92
+ */
93
+ processChartData() {
73
94
  const metaData = this.chartData.metaData;
95
+ const data = this.chartData.data;
96
+ const colorType = metaData.colorType || 'high';
97
+ const colorMaps = colorType === 'low'
98
+ ? this.chartConfiguration.low_colorMap
99
+ : this.chartConfiguration.high_colorMap;
74
100
  if (metaData.dataType) {
75
101
  this.dataType = metaData.dataType === 'USD' ? '$ ' : metaData.dataType;
76
- this.datatype_status = metaData.dataType === 'USD';
102
+ this.datatype_status = true;
77
103
  }
78
- }
79
- drawGaugeChart() {
80
- const { data, metaData } = this.chartData;
81
- const colorMaps = metaData.colorType === 'low'
82
- ? this.chartConfiguration.low_colorMap
83
- : this.chartConfiguration.high_colorMap;
84
- const chartContainer = d3.select(this.containerElt.nativeElement);
85
- const guagecontainer = d3.select(this.guagecontainerElt.nativeElement);
86
- const margin = this.chartConfiguration.margin;
87
- const width = parseInt(chartContainer.style('width')) - margin.left - margin.right;
88
- const height = parseInt(guagecontainer.style('height')) - margin.top - margin.bottom - 56;
89
- const svg = this.createSvg(chartContainer, width, height);
104
+ const data_ready = data.slice(0, -1).map((v, i) => data[i + 1] - v);
105
+ const total = d3.sum(data_ready);
106
+ const angleValue = data_ready.reduce((acc, curr, i) => {
107
+ const prev = acc[i - 1] || 0;
108
+ acc.push(prev + (curr / total) * 180);
109
+ return acc;
110
+ }, []);
111
+ const width = parseInt(d3.select(this.containerElt.nativeElement).style('width')) -
112
+ this.chartConfiguration.margin.left -
113
+ this.chartConfiguration.margin.right;
114
+ const height = parseInt(d3.select(this.guagecontainerElt.nativeElement).style('height')) -
115
+ this.chartConfiguration.margin.top -
116
+ this.chartConfiguration.margin.bottom -
117
+ 56;
90
118
  const radius = Math.min(width, height) / 2;
91
- this.adjustForScreenAndDrilldown(radius);
92
- const { data_ready, angleValue, labelArray, range } = this.prepareGaugeData(data);
93
- this.drawArcs(svg, data_ready, angleValue, radius, colorMaps, metaData);
94
- this.drawPointer(svg, radius, data, metaData);
95
- this.drawLabels(svg, radius, labelArray, range, metaData);
96
- this.drawCenterTexts(svg, radius, metaData);
97
- this.alignSvg(svg, chartContainer, margin);
119
+ return { data, metaData, colorMaps, data_ready, angleValue, radius };
98
120
  }
99
- createSvg(chartContainer, width, height) {
100
- return chartContainer
121
+ /**
122
+ * Create SVG base container
123
+ */
124
+ createSvgContainer(radius) {
125
+ const margin = this.chartConfiguration.margin;
126
+ const chartContainer = d3.select(this.containerElt.nativeElement);
127
+ const width = parseInt(chartContainer.style('width'));
128
+ const height = parseInt(chartContainer.style('height'));
129
+ const svg = chartContainer
101
130
  .append('svg')
102
131
  .attr('id', this.uniqueId)
103
132
  .attr('width', width)
104
133
  .attr('height', height)
105
134
  .call(ChartHelper.responsivefy)
106
- .append('g');
107
- }
108
- adjustForScreenAndDrilldown(radius) {
109
- if (this.chartConfiguration.isDrilldownChart) {
110
- this.chartConfiguration.currentValueWidthScaleFactor += 40;
111
- this.chartConfiguration.currentValueHeightScaleFactor += 20;
112
- }
113
- else if (window.innerWidth > 1400) {
114
- this.chartConfiguration.currentValueHeightScaleFactor += 15;
115
- this.chartConfiguration.currentValueWidthScaleFactor *= 2;
116
- }
117
- }
118
- prepareGaugeData(data) {
119
- const data_ready = data.slice(1).map((d, i) => d - data[i]);
120
- const total = data_ready.reduce((a, b) => a + b, 0);
121
- const angleValue = data_ready.map(((sum) => (unit) => (sum += (unit / total) * 180))(0));
122
- const labelArray = [{ name: data[0], value: 0 }];
123
- data_ready.reduce((acc, val, i) => {
124
- const next = acc + val;
125
- labelArray.push({ name: data[i + 1], value: next });
126
- return next;
127
- }, 0);
128
- const range = data[data.length - 1] - data[0];
129
- return { data_ready, angleValue, labelArray, range };
135
+ .append('g')
136
+ .attr('transform', `translate(${margin.left + radius}, ${margin.top + radius})`);
137
+ return svg;
130
138
  }
131
- drawArcs(svg, data_ready, angleValue, radius, colorMaps, metaData) {
139
+ /**
140
+ * Draw gauge arcs
141
+ */
142
+ drawArcs(svg, data_ready, colorMaps, metaData) {
132
143
  const arc = d3
133
144
  .arc()
134
- .innerRadius(radius - this.chartConfiguration.ringWidth - this.chartConfiguration.ringInset)
135
- .outerRadius(radius)
136
- .startAngle((_, i) => this.deg2rad(i === 0 ? this.chartConfiguration.minAngle : this.chartConfiguration.minAngle + angleValue[i - 1]))
137
- .endAngle((_, i) => this.deg2rad(i === data_ready.length - 1
138
- ? this.chartConfiguration.maxAngle
139
- : this.chartConfiguration.minAngle + angleValue[i]));
140
- const arcs = svg.append('g').attr('class', 'arc').attr('transform', `translate(${radius},${radius})`);
141
- arcs
145
+ .innerRadius(this.chartConfiguration.ringWidth +
146
+ this.chartConfiguration.ringInset -
147
+ 20)
148
+ .outerRadius(this.chartConfiguration.ringWidth + 40)
149
+ .startAngle((_, i) => this.deg2rad(this.chartConfiguration.minAngle + (i ? i * 60 : 0)))
150
+ .endAngle((_, i) => this.deg2rad(this.chartConfiguration.minAngle + (i + 1) * 60));
151
+ const isClickable = metaData.hasDrillDown && metaData.currentValue > 0;
152
+ svg
153
+ .append('g')
154
+ .attr('class', 'arc')
142
155
  .selectAll('path')
143
156
  .data(data_ready)
144
157
  .enter()
145
158
  .append('path')
146
159
  .attr('fill', (_, i) => colorMaps[i])
147
160
  .attr('d', arc)
148
- .style('cursor', () => metaData.currentValue > 0 && metaData.hasDrillDown ? 'pointer' : 'default')
161
+ .style('cursor', isClickable ? 'pointer' : 'default')
149
162
  .on('click', (event, d) => {
150
- if (metaData.hasDrillDown && metaData.currentValue > 0) {
151
- this.handleClick(this.getRange(d, data_ready, metaData));
152
- }
163
+ if (isClickable)
164
+ this.handleClick(d);
153
165
  });
154
166
  }
155
- drawPointer(svg, radius, data, metaData) {
167
+ /**
168
+ * Draw the pointer/needle
169
+ */
170
+ drawPointer(svg, metaData, data_ready, radius) {
171
+ const pointerValue = metaData.currentValue - this.chartData.data[0];
172
+ const range = this.chartData.data[this.chartData.data.length - 1] -
173
+ this.chartData.data[0];
174
+ const pointerAngle = this.chartConfiguration.minAngle + (pointerValue / range) * 180;
156
175
  const pointerHeadLength = Math.round(radius * this.chartConfiguration.pointerHeadLengthPercent);
157
176
  const lineData = [
158
177
  [this.chartConfiguration.pointerWidth / 2, 0],
159
178
  [0, -pointerHeadLength],
160
- [-(this.chartConfiguration.pointerWidth / 2), 0],
179
+ [-this.chartConfiguration.pointerWidth / 2, 0],
161
180
  [0, this.chartConfiguration.pointerTailLength],
162
181
  [this.chartConfiguration.pointerWidth / 2, 0],
163
182
  ];
164
- const pointerLine = d3.line();
165
- const pointerValue = metaData.currentValue - data[0];
166
- const range = data[data.length - 1] - data[0];
167
- const pointerAngle = this.chartConfiguration.minAngle + (pointerValue / range) * 180;
168
183
  svg
169
184
  .append('g')
170
- .data([lineData])
171
185
  .attr('class', 'pointer')
172
- .attr('transform', `translate(${radius},${radius})`)
173
186
  .append('path')
174
- .attr('d', pointerLine)
187
+ .attr('d', d3.line()(lineData))
175
188
  .attr('fill', this.chartConfiguration.pointerColor)
176
- .attr('transform', `rotate(${pointerAngle}) translate(0,${-radius + this.chartConfiguration.ringWidth + pointerHeadLength})`);
189
+ .attr('transform', `rotate(${pointerAngle}) translate(0, ${-radius +
190
+ this.chartConfiguration.ringWidth +
191
+ pointerHeadLength})`);
177
192
  }
178
- drawLabels(svg, radius, labelArray, range, metaData) {
179
- const lg = svg.append('g').attr('class', 'label').attr('transform', `translate(${radius},${radius})`);
180
- const labelGroups = lg
181
- .selectAll('.bubble')
193
+ /**
194
+ * Draw numeric labels around gauge
195
+ */
196
+ drawLabels(svg, data_ready, radius, metaData) {
197
+ const data = this.chartData.data;
198
+ const range = data[data.length - 1] - data[0];
199
+ const labelArray = [{ name: data[0], value: 0 }];
200
+ data_ready.reduce((sum, val, i) => {
201
+ const newSum = sum + val;
202
+ labelArray.push({ name: data[i + 1], value: newSum });
203
+ return newSum;
204
+ }, 0);
205
+ const labelGroup = svg.append('g').attr('class', 'labels');
206
+ labelGroup
207
+ .selectAll('text')
182
208
  .data(labelArray)
183
209
  .enter()
184
- .append('g')
185
- .attr('transform', (d) => {
186
- const angle = this.chartConfiguration.minAngle + (d.value / range) * 180;
187
- return `rotate(${angle}) translate(0,${this.chartConfiguration.labelInset - radius - 20})`;
188
- });
189
- labelGroups
190
210
  .append('text')
211
+ .attr('transform', (d) => {
212
+ const newAngle = this.chartConfiguration.minAngle + (d.value / range) * 180;
213
+ return `rotate(${newAngle}) translate(0, ${this.chartConfiguration.labelInset - radius - 20})`;
214
+ })
191
215
  .attr('fill', 'var(--chart-text-color)')
192
- .style('font-size', window.innerWidth < 1400 ? '12px' : '14px')
216
+ .style('font-size', '14px')
193
217
  .style('font-weight', '600')
194
- .text((d) => `${d.name}${metaData.dataType || ''}`);
218
+ .text((d) => metaData.dataType ? `${d.name}${metaData.dataType}` : d.name);
195
219
  }
196
- drawCenterTexts(svg, radius, metaData) {
220
+ /**
221
+ * Draw texts (value, status, date)
222
+ */
223
+ drawTexts(svg, metaData, radius) {
224
+ const topY = radius / 2 - 10;
225
+ const midY = topY + this.chartConfiguration.currentValueHeightScaleFactor;
226
+ const bottomY = midY + this.chartConfiguration.currentValueHeightScaleFactor;
197
227
  svg
198
228
  .append('foreignObject')
199
- .attr('transform', `translate(${radius - this.chartConfiguration.currentValueWidthScaleFactor / 2},${radius / 2 - 10})`)
200
- .attr('width', this.chartConfiguration.currentValueWidthScaleFactor)
201
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
229
+ .attr('transform', `translate(${radius - 50}, ${topY})`)
230
+ .attr('width', 100)
231
+ .attr('height', 40)
202
232
  .append('xhtml:div')
203
233
  .attr('class', 'value-display')
204
234
  .html(`${metaData.currentValue}${metaData.dataType || ''}`);
205
235
  if (metaData.status) {
206
236
  svg
207
237
  .append('foreignObject')
208
- .attr('transform', `translate(${radius - 60},${radius / 2 + 20})`)
238
+ .attr('transform', `translate(${radius - 60}, ${midY})`)
209
239
  .attr('width', 120)
240
+ .attr('height', 40)
210
241
  .append('xhtml:div')
211
242
  .attr('class', 'status-display')
212
243
  .html(metaData.status);
@@ -214,22 +245,15 @@ export class GuageChartComponent extends ComponentUniqueId {
214
245
  if (metaData.dateRange) {
215
246
  svg
216
247
  .append('foreignObject')
217
- .attr('transform', `translate(${radius - 105},${radius / 2 + 50})`)
248
+ .attr('transform', `translate(${radius - 105}, ${bottomY})`)
218
249
  .attr('width', 210)
250
+ .attr('height', 40)
219
251
  .append('xhtml:div')
220
252
  .attr('class', 'daterange-display')
221
253
  .html(`<span class="marginright-3"><i class="fa fa-calendar"></i></span>${metaData.dateRange}`);
222
254
  }
223
255
  }
224
- alignSvg(svg, chartContainer, margin) {
225
- const containerMid = parseInt(chartContainer.style('width')) / 2;
226
- const nodeHalf = svg.node().getBoundingClientRect().width / 2;
227
- svg.attr('transform', `translate(${containerMid - nodeHalf + margin.left},${margin.top})`);
228
- }
229
- getRange(d, data_ready, metaData) {
230
- const data = this.chartData.data;
231
- return `${data[0]} and ${data[data.length - 1]}`;
232
- }
256
+ /** Convert degrees to radians */
233
257
  deg2rad(deg) {
234
258
  return (deg * Math.PI) / 180;
235
259
  }
@@ -260,4 +284,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
260
284
  }], headerMenuclickEvent: [{
261
285
  type: Output
262
286
  }] } });
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhZ2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2d1YWdlLWNoYXJ0L2d1YWdlLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ndWFnZS1jaGFydC9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVFsRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsaUJBQWlCO0lBNkN4RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBeENBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsYUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVyQix5QkFBb0IsR0FBRztZQUM5QixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVB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QyxDQUFNO1FBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxFQUFPO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQzsrR0F6U1UsbUJBQW1CO21HQUFuQixtQkFBbUIseWdCQ3ZCaEMsc2dDQVlNOzs0RkRXTyxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLGlCQUdaLGlCQUFpQixDQUFDLElBQUk7d0RBR2UsWUFBWTtzQkFBL0QsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0gsaUJBQWlCO3NCQUEvRCxTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFcEMsU0FBUztzQkFBakIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZ3VhZ2UtY2hhcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhZ2UtY2hhcnQuY29tcG9uZW50Lmxlc3MnLCAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWdlQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRVbmlxdWVJZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBAVmlld0NoaWxkKCdndWFnZWNoYXJ0Y29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgY29udGFpbmVyRWx0ITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdndWFnZWNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGd1YWdlY29udGFpbmVyRWx0ITogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCkgY2hhcnREYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uOiBhbnk7XHJcbiAgQE91dHB1dCgpIGNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaGVhZGVyTWVudWNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgY2hhcnRDb25maWd1cmF0aW9uOiBhbnkgPSB7fTtcclxuICBkYXRhVHlwZTogc3RyaW5nID0gJyc7XHJcbiAgZGF0YXR5cGVfc3RhdHVzID0gZmFsc2U7XHJcbiAgaXNIZWFkZXJWaXNpYmxlID0gdHJ1ZTtcclxuICB1bmlxdWVJZCA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuXHJcbiAgcmVhZG9ubHkgZGVmYXVsdENvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICBtYXJnaW46IHsgdG9wOiA0MCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiAyMCB9LFxyXG4gICAgbWluQW5nbGU6IC05MCxcclxuICAgIG1heEFuZ2xlOiA5MCxcclxuICAgIHJpbmdJbnNldDogMjAsXHJcbiAgICByaW5nV2lkdGg6IDIwLFxyXG4gICAgbWFqb3JUaWNrczogMyxcclxuICAgIHN2Z0hlaWdodDogODAsXHJcbiAgICBsb3dfY29sb3JNYXA6IFsnIzQzQ0MwMCcsICcjRkZFRjBDJywgJyNGRjRFMEMnXSxcclxuICAgIGhpZ2hfY29sb3JNYXA6IFsnI0ZGNEUwQycsICcjRkZFRjBDJywgJyM0M0NDMDAnXSxcclxuICAgIGlzSGVhZGVyVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgcG9pbnRlcldpZHRoOiAxMCxcclxuICAgIHBvaW50ZXJUYWlsTGVuZ3RoOiA1LFxyXG4gICAgcG9pbnRlckhlYWRMZW5ndGhQZXJjZW50OiAwLjcsXHJcbiAgICBsYWJlbEluc2V0OiAxMCxcclxuICAgIGxlZ2VuZEp1c3RpZmllZDogZmFsc2UsXHJcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjRkZGRkZGJyxcclxuICAgIGlzRHJpbGxkb3duQ2hhcnQ6IHVuZGVmaW5lZCxcclxuICAgIHJpbmdTY2FsZUZhY3RvcjogMCxcclxuICAgIHRleHRzQXRDZW50ZXJTY2FsZUZhY3RvcjogMCxcclxuICAgIGN1cnJlbnRWYWx1ZVdpZHRoU2NhbGVGYWN0b3I6IDYwLFxyXG4gICAgY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3I6IDMwLFxyXG4gICAgcG9pbnRlckNvbG9yOiAnIzY4Njg2OCcsXHJcbiAgICBpc1RvZ2dsZVZpc2libGU6IHVuZGVmaW5lZCxcclxuICAgIHNlbGVjdGVkS3BpVG9vbHRvcDogdW5kZWZpbmVkLFxyXG4gICAgaXNWYWx1ZUxhYmxlQWRqdXN0OiB1bmRlZmluZWQsXHJcbiAgICBpc1RpdGxlSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBoZWFkZXJNZW51T3B0aW9uczogSGVhZGVyQ29uZmlnSGVscGVyLmhlYWRlckNvbmZpZy5oZWFkZXJNZW51T3B0aW9ucyxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbGVydEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24/LmhlYWRlck1lbnVPcHRpb25zPy5zb21lKChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCcpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7fVxyXG5cclxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMucmVkcmF3Q2hhcnQoKTtcclxuICB9XHJcblxyXG4gIG9uUmVzaXplZChfOiBSZXNpemVkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucmVkcmF3Q2hhcnQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVkcmF3Q2hhcnQoKTogdm9pZCB7XHJcbiAgICBkMy5zZWxlY3QoYCMke3RoaXMudW5pcXVlSWR9YCkucmVtb3ZlKCk7XHJcbiAgICB0aGlzLmluaXRpYWxpemVDaGFydENvbmZpZygpO1xyXG4gICAgdGhpcy5kcmF3R2F1Z2VDaGFydCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2hhcnRDb25maWcoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWV0YURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YTtcclxuICAgIGlmIChtZXRhRGF0YS5kYXRhVHlwZSkge1xyXG4gICAgICB0aGlzLmRhdGFUeXBlID0gbWV0YURhdGEuZGF0YVR5cGUgPT09ICdVU0QnID8gJyQgJyA6IG1ldGFEYXRhLmRhdGFUeXBlO1xyXG4gICAgICB0aGlzLmRhdGF0eXBlX3N0YXR1cyA9IG1ldGFEYXRhLmRhdGFUeXBlID09PSAnVVNEJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd0dhdWdlQ2hhcnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGRhdGEsIG1ldGFEYXRhIH0gPSB0aGlzLmNoYXJ0RGF0YTtcclxuICAgIGNvbnN0IGNvbG9yTWFwcyA9XHJcbiAgICAgIG1ldGFEYXRhLmNvbG9yVHlwZSA9PT0gJ2xvdydcclxuICAgICAgICA/IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxvd19jb2xvck1hcFxyXG4gICAgICAgIDogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaGlnaF9jb2xvck1hcDtcclxuXHJcbiAgICBjb25zdCBjaGFydENvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KTtcclxuICAgIGNvbnN0IGd1YWdlY29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuZ3VhZ2Vjb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCBtYXJnaW4gPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW47XHJcblxyXG4gICAgY29uc3Qgd2lkdGggPSBwYXJzZUludChjaGFydENvbnRhaW5lci5zdHlsZSgnd2lkdGgnKSkgLSBtYXJnaW4ubGVmdCAtIG1hcmdpbi5yaWdodDtcclxuICAgIGNvbnN0IGhlaWdodCA9XHJcbiAgICAgIHBhcnNlSW50KGd1YWdlY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbSAtIDU2O1xyXG5cclxuICAgIGNvbnN0IHN2ZyA9IHRoaXMuY3JlYXRlU3ZnKGNoYXJ0Q29udGFpbmVyLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgIGNvbnN0IHJhZGl1cyA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjtcclxuXHJcbiAgICB0aGlzLmFkanVzdEZvclNjcmVlbkFuZERyaWxsZG93bihyYWRpdXMpO1xyXG5cclxuICAgIGNvbnN0IHsgZGF0YV9yZWFkeSwgYW5nbGVWYWx1ZSwgbGFiZWxBcnJheSwgcmFuZ2UgfSA9IHRoaXMucHJlcGFyZUdhdWdlRGF0YShkYXRhKTtcclxuXHJcbiAgICB0aGlzLmRyYXdBcmNzKHN2ZywgZGF0YV9yZWFkeSwgYW5nbGVWYWx1ZSwgcmFkaXVzLCBjb2xvck1hcHMsIG1ldGFEYXRhKTtcclxuICAgIHRoaXMuZHJhd1BvaW50ZXIoc3ZnLCByYWRpdXMsIGRhdGEsIG1ldGFEYXRhKTtcclxuICAgIHRoaXMuZHJhd0xhYmVscyhzdmcsIHJhZGl1cywgbGFiZWxBcnJheSwgcmFuZ2UsIG1ldGFEYXRhKTtcclxuICAgIHRoaXMuZHJhd0NlbnRlclRleHRzKHN2ZywgcmFkaXVzLCBtZXRhRGF0YSk7XHJcbiAgICB0aGlzLmFsaWduU3ZnKHN2ZywgY2hhcnRDb250YWluZXIsIG1hcmdpbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVN2ZyhjaGFydENvbnRhaW5lcjogYW55LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIGNoYXJ0Q29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgIC5hdHRyKCdpZCcsIHRoaXMudW5pcXVlSWQpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHdpZHRoKVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0KVxyXG4gICAgICAuY2FsbChDaGFydEhlbHBlci5yZXNwb25zaXZlZnkpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRqdXN0Rm9yU2NyZWVuQW5kRHJpbGxkb3duKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVXaWR0aFNjYWxlRmFjdG9yICs9IDQwO1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvciArPSAyMDtcclxuICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiAxNDAwKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yICs9IDE1O1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVXaWR0aFNjYWxlRmFjdG9yICo9IDI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVHYXVnZURhdGEoZGF0YTogbnVtYmVyW10pIHtcclxuICAgIGNvbnN0IGRhdGFfcmVhZHkgPSBkYXRhLnNsaWNlKDEpLm1hcCgoZCwgaSkgPT4gZCAtIGRhdGFbaV0pO1xyXG4gICAgY29uc3QgdG90YWwgPSBkYXRhX3JlYWR5LnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xyXG5cclxuICAgIGNvbnN0IGFuZ2xlVmFsdWUgPSBkYXRhX3JlYWR5Lm1hcChcclxuICAgICAgKChzdW0pID0+ICh1bml0OiBudW1iZXIpID0+IChzdW0gKz0gKHVuaXQgLyB0b3RhbCkgKiAxODApKSgwKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBsYWJlbEFycmF5ID0gW3sgbmFtZTogZGF0YVswXSwgdmFsdWU6IDAgfV07XHJcbiAgICBkYXRhX3JlYWR5LnJlZHVjZSgoYWNjLCB2YWwsIGkpID0+IHtcclxuICAgICAgY29uc3QgbmV4dCA9IGFjYyArIHZhbDtcclxuICAgICAgbGFiZWxBcnJheS5wdXNoKHsgbmFtZTogZGF0YVtpICsgMV0sIHZhbHVlOiBuZXh0IH0pO1xyXG4gICAgICByZXR1cm4gbmV4dDtcclxuICAgIH0sIDApO1xyXG5cclxuICAgIGNvbnN0IHJhbmdlID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdIC0gZGF0YVswXTtcclxuICAgIHJldHVybiB7IGRhdGFfcmVhZHksIGFuZ2xlVmFsdWUsIGxhYmVsQXJyYXksIHJhbmdlIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYXdBcmNzKHN2ZzogYW55LCBkYXRhX3JlYWR5OiBhbnlbXSwgYW5nbGVWYWx1ZTogbnVtYmVyW10sIHJhZGl1czogbnVtYmVyLCBjb2xvck1hcHM6IHN0cmluZ1tdLCBtZXRhRGF0YTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBhcmMgPSBkM1xyXG4gICAgICAuYXJjKClcclxuICAgICAgLmlubmVyUmFkaXVzKHJhZGl1cyAtIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCAtIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdJbnNldClcclxuICAgICAgLm91dGVyUmFkaXVzKHJhZGl1cylcclxuICAgICAgLnN0YXJ0QW5nbGUoKF86IGFueSwgaTogbnVtYmVyKSA9PlxyXG4gICAgICAgIHRoaXMuZGVnMnJhZChpID09PSAwID8gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgOiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5taW5BbmdsZSArIGFuZ2xlVmFsdWVbaSAtIDFdKVxyXG4gICAgICApXHJcbiAgICAgIC5lbmRBbmdsZSgoXzogYW55LCBpOiBudW1iZXIpID0+XHJcbiAgICAgICAgdGhpcy5kZWcycmFkKFxyXG4gICAgICAgICAgaSA9PT0gZGF0YV9yZWFkeS5sZW5ndGggLSAxXHJcbiAgICAgICAgICAgID8gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWF4QW5nbGVcclxuICAgICAgICAgICAgOiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5taW5BbmdsZSArIGFuZ2xlVmFsdWVbaV1cclxuICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgYXJjcyA9IHN2Zy5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdhcmMnKS5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cmFkaXVzfSwke3JhZGl1c30pYCk7XHJcblxyXG4gICAgYXJjc1xyXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcclxuICAgICAgLmRhdGEoZGF0YV9yZWFkeSlcclxuICAgICAgLmVudGVyKClcclxuICAgICAgLmFwcGVuZCgncGF0aCcpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgKF8sIGkpID0+IGNvbG9yTWFwc1tpXSlcclxuICAgICAgLmF0dHIoJ2QnLCBhcmMpXHJcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgKCkgPT5cclxuICAgICAgICBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwICYmIG1ldGFEYXRhLmhhc0RyaWxsRG93biA/ICdwb2ludGVyJyA6ICdkZWZhdWx0J1xyXG4gICAgICApXHJcbiAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IGFueSwgZDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKHRoaXMuZ2V0UmFuZ2UoZCwgZGF0YV9yZWFkeSwgbWV0YURhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3UG9pbnRlcihzdmc6IGFueSwgcmFkaXVzOiBudW1iZXIsIGRhdGE6IG51bWJlcltdLCBtZXRhRGF0YTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBwb2ludGVySGVhZExlbmd0aCA9IE1hdGgucm91bmQocmFkaXVzICogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckhlYWRMZW5ndGhQZXJjZW50KTtcclxuICAgIGNvbnN0IGxpbmVEYXRhID0gW1xyXG4gICAgICBbdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlcldpZHRoIC8gMiwgMF0sXHJcbiAgICAgIFswLCAtcG9pbnRlckhlYWRMZW5ndGhdLFxyXG4gICAgICBbLSh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyKSwgMF0sXHJcbiAgICAgIFswLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyVGFpbExlbmd0aF0sXHJcbiAgICAgIFt0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgIF07XHJcbiAgICBjb25zdCBwb2ludGVyTGluZSA9IGQzLmxpbmUoKTtcclxuICAgIGNvbnN0IHBvaW50ZXJWYWx1ZSA9IG1ldGFEYXRhLmN1cnJlbnRWYWx1ZSAtIGRhdGFbMF07XHJcbiAgICBjb25zdCByYW5nZSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXSAtIGRhdGFbMF07XHJcbiAgICBjb25zdCBwb2ludGVyQW5nbGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5taW5BbmdsZSArIChwb2ludGVyVmFsdWUgLyByYW5nZSkgKiAxODA7XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuZGF0YShbbGluZURhdGFdKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAncG9pbnRlcicpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cmFkaXVzfSwke3JhZGl1c30pYClcclxuICAgICAgLmFwcGVuZCgncGF0aCcpXHJcbiAgICAgIC5hdHRyKCdkJywgcG9pbnRlckxpbmUpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckNvbG9yKVxyXG4gICAgICAuYXR0cihcclxuICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICBgcm90YXRlKCR7cG9pbnRlckFuZ2xlfSkgdHJhbnNsYXRlKDAsJHtcclxuICAgICAgICAgIC1yYWRpdXMgKyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5yaW5nV2lkdGggKyBwb2ludGVySGVhZExlbmd0aFxyXG4gICAgICAgIH0pYFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3TGFiZWxzKHN2ZzogYW55LCByYWRpdXM6IG51bWJlciwgbGFiZWxBcnJheTogYW55W10sIHJhbmdlOiBudW1iZXIsIG1ldGFEYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2xhYmVsJykuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3JhZGl1c30sJHtyYWRpdXN9KWApO1xyXG5cclxuICAgIGNvbnN0IGxhYmVsR3JvdXBzID0gbGdcclxuICAgICAgLnNlbGVjdEFsbCgnLmJ1YmJsZScpXHJcbiAgICAgIC5kYXRhKGxhYmVsQXJyYXkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHtcclxuICAgICAgICBjb25zdCBhbmdsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlICsgKGQudmFsdWUgLyByYW5nZSkgKiAxODA7XHJcbiAgICAgICAgcmV0dXJuIGByb3RhdGUoJHthbmdsZX0pIHRyYW5zbGF0ZSgwLCR7dGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxJbnNldCAtIHJhZGl1cyAtIDIwfSlgO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBsYWJlbEdyb3Vwc1xyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCA/ICcxMnB4JyA6ICcxNHB4JylcclxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxyXG4gICAgICAudGV4dCgoZCkgPT4gYCR7ZC5uYW1lfSR7bWV0YURhdGEuZGF0YVR5cGUgfHwgJyd9YCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYXdDZW50ZXJUZXh0cyhzdmc6IGFueSwgcmFkaXVzOiBudW1iZXIsIG1ldGFEYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtyYWRpdXMgLSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVXaWR0aFNjYWxlRmFjdG9yIC8gMn0sJHtyYWRpdXMgLyAyIC0gMTB9KWApXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZVdpZHRoU2NhbGVGYWN0b3IpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcilcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3ZhbHVlLWRpc3BsYXknKVxyXG4gICAgICAuaHRtbChgJHttZXRhRGF0YS5jdXJyZW50VmFsdWV9JHttZXRhRGF0YS5kYXRhVHlwZSB8fCAnJ31gKTtcclxuXHJcbiAgICBpZiAobWV0YURhdGEuc3RhdHVzKSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cmFkaXVzIC0gNjB9LCR7cmFkaXVzIC8gMiArIDIwfSlgKVxyXG4gICAgICAgIC5hdHRyKCd3aWR0aCcsIDEyMClcclxuICAgICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdzdGF0dXMtZGlzcGxheScpXHJcbiAgICAgICAgLmh0bWwobWV0YURhdGEuc3RhdHVzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWV0YURhdGEuZGF0ZVJhbmdlKSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cmFkaXVzIC0gMTA1fSwke3JhZGl1cyAvIDIgKyA1MH0pYClcclxuICAgICAgICAuYXR0cignd2lkdGgnLCAyMTApXHJcbiAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZGF0ZXJhbmdlLWRpc3BsYXknKVxyXG4gICAgICAgIC5odG1sKFxyXG4gICAgICAgICAgYDxzcGFuIGNsYXNzPVwibWFyZ2lucmlnaHQtM1wiPjxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXJcIj48L2k+PC9zcGFuPiR7bWV0YURhdGEuZGF0ZVJhbmdlfWBcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhbGlnblN2Zyhzdmc6IGFueSwgY2hhcnRDb250YWluZXI6IGFueSwgbWFyZ2luOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lck1pZCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAvIDI7XHJcbiAgICBjb25zdCBub2RlSGFsZiA9IHN2Zy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAyO1xyXG4gICAgc3ZnLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtjb250YWluZXJNaWQgLSBub2RlSGFsZiArIG1hcmdpbi5sZWZ0fSwke21hcmdpbi50b3B9KWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSYW5nZShkOiBhbnksIGRhdGFfcmVhZHk6IGFueVtdLCBtZXRhRGF0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gICAgcmV0dXJuIGAke2RhdGFbMF19IGFuZCAke2RhdGFbZGF0YS5sZW5ndGggLSAxXX1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWcycmFkKGRlZzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoZGVnICogTWF0aC5QSSkgLyAxODA7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDbGljayhkOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlSGVhZGVyTWVudUNsaWNrKGlkOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaGVhZGVyTWVudWNsaWNrRXZlbnQuZW1pdChpZCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgI2d1YWdlY29udGFpbmVyIGNsYXNzPVwibGliLWNoYXJ0LXdyYXBwZXJcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHZhcigtLWNhcmQtYmcpO1wiXHJcbiAgKHJlc2l6ZWQpPVwib25SZXNpemVkKCRldmVudClcIj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFsdFwiICpuZ0lmPVwiIWlzSGVhZGVyVmlzaWJsZVwiPlxyXG4gICAgPGxpYi1jaGFydC1oZWFkZXItdjIgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIiBbY2hhcnRDb25maWd1cmF0aW9uXT1cImNoYXJ0Q29uZmlndXJhdGlvblwiXHJcbiAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIj48L2xpYi1jaGFydC1oZWFkZXItdjI+XHJcbiAgPC9kaXY+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjEgW3RpdGxlXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS50aXRsZVwiIFtoYXNEcmlsbERvd25dPVwiY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93blwiXHJcbiAgICBbaXNFZGl0RW5hYmxlZF09XCJjaGFydERhdGEubWV0YURhdGEuaXNFZGl0RW5hYmxlZFwiIFtpc3JpYV09XCJjdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWFcIiBbbWVudU9wdGlvbnNdPVwiY2hhcnRDb25maWd1cmF0aW9uLmhlYWRlck1lbnVPcHRpb25zXCJcclxuICAgIFtzZWxlY3RlZEtwaVRvb2x0b3BdPVwiY2hhcnRDb25maWd1cmF0aW9uLnNlbGVjdGVkS3BpVG9vbHRvcFwiIChtZW51T3B0aW9uQ2xpY2tFdmVudCk9XCJoYW5kbGVIZWFkZXJNZW51Q2xpY2soJGV2ZW50KVwiXHJcbiAgICBbaXNBbGVydEVuYWJsZWRdPVwiaXNBbGVydEVuYWJsZWRcIiAqbmdJZj1cImlzSGVhZGVyVmlzaWJsZVwiPjwvbGliLWNoYXJ0LWhlYWRlci12MT5cclxuICA8ZGl2IFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFwiIGlkPVwiZ3VhZ2VjaGFydGNvbnRhaW5lclwiICNndWFnZWNoYXJ0Y29udGFpbmVyXHJcbiAgICBjbGFzcz1cImxpYi1jaGFydC1zdmcgZ3VhZ2Vjb250YWluZXJcIj48L2Rpdj5cclxuPC9kaXY+Il19
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhZ2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2d1YWdlLWNoYXJ0L2d1YWdlLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ndWFnZS1jaGFydC9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVFsRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsaUJBQWlCO0lBNkN4RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBeENBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixhQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRXZCLHlCQUFvQixHQUFHO1lBQ3JCLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFB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QUFDO1FBQ04sQ0FBQztJQUNILENBQUM7SUFFRCxpQ0FBaUM7SUFDekIsT0FBTyxDQUFDLEdBQVc7UUFDekIsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXLENBQUMsQ0FBTTtRQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQscUJBQXFCLENBQUMsRUFBVTtRQUM5QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBdlVVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHlnQkN0QmhDLHNnQ0FZTTs7NEZEVU8sbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixpQkFHWixpQkFBaUIsQ0FBQyxJQUFJO3dEQUdlLFlBQVk7c0JBQS9ELFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNILGlCQUFpQjtzQkFBL0QsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZ3VhZ2UtY2hhcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhZ2UtY2hhcnQuY29tcG9uZW50Lmxlc3MnLCAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWdlQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRVbmlxdWVJZCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2VjaGFydGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2Vjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBndWFnZWNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgZGF0YVR5cGUgPSAnJztcclxuICBkYXRhdHlwZV9zdGF0dXMgPSBmYWxzZTtcclxuICB1bmlxdWVJZCA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuICBpc0hlYWRlclZpc2libGUgPSB0cnVlO1xyXG5cclxuICBkZWZhdWx0Q29uZmlndXJhdGlvbiA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDQwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDIwIH0sXHJcbiAgICBtaW5BbmdsZTogLTkwLFxyXG4gICAgbWF4QW5nbGU6IDkwLFxyXG4gICAgcmluZ0luc2V0OiAyMCxcclxuICAgIHJpbmdXaWR0aDogMjAsXHJcbiAgICBtYWpvclRpY2tzOiAzLFxyXG4gICAgc3ZnSGVpZ2h0OiA4MCxcclxuICAgIGxvd19jb2xvck1hcDogWycjNDNDQzAwJywgJyNGRkVGMEMnLCAnI0ZGNEUwQyddLFxyXG4gICAgaGlnaF9jb2xvck1hcDogWycjRkY0RTBDJywgJyNGRkVGMEMnLCAnIzQzQ0MwMCddLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBwb2ludGVyV2lkdGg6IDEwLFxyXG4gICAgcG9pbnRlclRhaWxMZW5ndGg6IDUsXHJcbiAgICBwb2ludGVySGVhZExlbmd0aFBlcmNlbnQ6IDAuNyxcclxuICAgIGxhYmVsSW5zZXQ6IDEwLFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiBmYWxzZSxcclxuICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgaXNEcmlsbGRvd25DaGFydDogdW5kZWZpbmVkLFxyXG4gICAgcmluZ1NjYWxlRmFjdG9yOiAwLFxyXG4gICAgdGV4dHNBdENlbnRlclNjYWxlRmFjdG9yOiAwLFxyXG4gICAgY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvcjogNjAsXHJcbiAgICBjdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcjogMzAsXHJcbiAgICBwb2ludGVyQ29sb3I6ICcjNjg2ODY4JyxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgc2VsZWN0ZWRLcGlUb29sdG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1ZhbHVlTGFibGVBZGp1c3Q6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGhlYWRlck1lbnVPcHRpb25zOiBIZWFkZXJDb25maWdIZWxwZXIuaGVhZGVyQ29uZmlnLmhlYWRlck1lbnVPcHRpb25zLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsZXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbj8uaGVhZGVyTWVudU9wdGlvbnM/LnNvbWUoXHJcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5yZWRyYXdDaGFydCgpO1xyXG4gIH1cclxuXHJcbiAgb25SZXNpemVkKF9ldmVudDogUmVzaXplZEV2ZW50KSB7XHJcbiAgICB0aGlzLnJlZHJhd0NoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogQ2xlYXJzIHRoZSBwcmV2aW91cyBTVkcgYW5kIHJlZHJhd3MgY2hhcnQgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWRyYXdDaGFydCgpOiB2b2lkIHtcclxuICAgIGQzLnNlbGVjdCgnIycgKyB0aGlzLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUxpbmVDaGFydCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIE1haW4gZW50cnkgcG9pbnQgZm9yIGNoYXJ0IHJlbmRlcmluZyBcclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxpemVMaW5lQ2hhcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnByZXBhcmVDb25maWd1cmF0aW9uKCk7XHJcbiAgICBjb25zdCB7IGRhdGEsIG1ldGFEYXRhLCBjb2xvck1hcHMsIGRhdGFfcmVhZHksIGFuZ2xlVmFsdWUsIHJhZGl1cyB9ID1cclxuICAgICAgdGhpcy5wcm9jZXNzQ2hhcnREYXRhKCk7XHJcblxyXG4gICAgY29uc3Qgc3ZnID0gdGhpcy5jcmVhdGVTdmdDb250YWluZXIocmFkaXVzKTtcclxuICAgIHRoaXMuZHJhd0FyY3Moc3ZnLCBkYXRhX3JlYWR5LCBjb2xvck1hcHMsIG1ldGFEYXRhKTtcclxuICAgIHRoaXMuZHJhd1BvaW50ZXIoc3ZnLCBtZXRhRGF0YSwgZGF0YV9yZWFkeSwgcmFkaXVzKTtcclxuICAgIHRoaXMuZHJhd0xhYmVscyhzdmcsIGRhdGFfcmVhZHksIHJhZGl1cywgbWV0YURhdGEpO1xyXG4gICAgdGhpcy5kcmF3VGV4dHMoc3ZnLCBtZXRhRGF0YSwgcmFkaXVzKTtcclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBQcmVwYXJlIGNoYXJ0IGNvbmZpZ3VyYXRpb24gXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcmVwYXJlQ29uZmlndXJhdGlvbigpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb25ba2V5XSA9IENoYXJ0SGVscGVyLmdldFZhbHVlQnlDb25maWd1cmF0aW9uVHlwZShcclxuICAgICAgICBrZXksXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbixcclxuICAgICAgICB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvblxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUgIT09IHVuZGVmaW5lZClcclxuICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogUHJvY2VzcyBkYXRhLCBjYWxjdWxhdGUgY29sb3JzIGFuZCBhbmdsZXMgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcm9jZXNzQ2hhcnREYXRhKCkge1xyXG4gICAgY29uc3QgbWV0YURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YTtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gICAgY29uc3QgY29sb3JUeXBlID0gbWV0YURhdGEuY29sb3JUeXBlIHx8ICdoaWdoJztcclxuICAgIGNvbnN0IGNvbG9yTWFwcyA9XHJcbiAgICAgIGNvbG9yVHlwZSA9PT0gJ2xvdydcclxuICAgICAgICA/IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxvd19jb2xvck1hcFxyXG4gICAgICAgIDogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaGlnaF9jb2xvck1hcDtcclxuXHJcbiAgICBpZiAobWV0YURhdGEuZGF0YVR5cGUpIHtcclxuICAgICAgdGhpcy5kYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlID09PSAnVVNEJyA/ICckICcgOiBtZXRhRGF0YS5kYXRhVHlwZTtcclxuICAgICAgdGhpcy5kYXRhdHlwZV9zdGF0dXMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFfcmVhZHkgPSBkYXRhLnNsaWNlKDAsIC0xKS5tYXAoKHYsIGkpID0+IGRhdGFbaSArIDFdIC0gdik7XHJcbiAgICBjb25zdCB0b3RhbCA9IGQzLnN1bShkYXRhX3JlYWR5KTtcclxuICAgIGNvbnN0IGFuZ2xlVmFsdWUgPSBkYXRhX3JlYWR5LnJlZHVjZSgoYWNjLCBjdXJyLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByZXYgPSBhY2NbaSAtIDFdIHx8IDA7XHJcbiAgICAgIGFjYy5wdXNoKHByZXYgKyAoY3VyciAvIHRvdGFsKSAqIDE4MCk7XHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCBbXSBhcyBudW1iZXJbXSk7XHJcblxyXG4gICAgY29uc3Qgd2lkdGggPVxyXG4gICAgICBwYXJzZUludChkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCkuc3R5bGUoJ3dpZHRoJykpIC1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLmxlZnQgLVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4ucmlnaHQ7XHJcbiAgICBjb25zdCBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludChkMy5zZWxlY3QodGhpcy5ndWFnZWNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KS5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLnRvcCAtXHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbi5ib3R0b20gLVxyXG4gICAgICA1NjtcclxuXHJcbiAgICBjb25zdCByYWRpdXMgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XHJcblxyXG4gICAgcmV0dXJuIHsgZGF0YSwgbWV0YURhdGEsIGNvbG9yTWFwcywgZGF0YV9yZWFkeSwgYW5nbGVWYWx1ZSwgcmFkaXVzIH07XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogQ3JlYXRlIFNWRyBiYXNlIGNvbnRhaW5lciBcclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZVN2Z0NvbnRhaW5lcihyYWRpdXM6IG51bWJlcikge1xyXG4gICAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG4gICAgY29uc3QgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKTtcclxuICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSk7XHJcblxyXG4gICAgY29uc3Qgc3ZnID0gY2hhcnRDb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ2lkJywgdGhpcy51bmlxdWVJZClcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQpXHJcbiAgICAgIC5jYWxsKENoYXJ0SGVscGVyLnJlc3BvbnNpdmVmeSlcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKFxyXG4gICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgIGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdCArIHJhZGl1c30sICR7bWFyZ2luLnRvcCArIHJhZGl1c30pYFxyXG4gICAgICApO1xyXG5cclxuICAgIHJldHVybiBzdmc7XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogRHJhdyBnYXVnZSBhcmNzIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZHJhd0FyY3Moc3ZnLCBkYXRhX3JlYWR5LCBjb2xvck1hcHMsIG1ldGFEYXRhKSB7XHJcbiAgICBjb25zdCBhcmMgPSBkM1xyXG4gICAgICAuYXJjKClcclxuICAgICAgLmlubmVyUmFkaXVzKFxyXG4gICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCArXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5yaW5nSW5zZXQgLVxyXG4gICAgICAgICAgMjBcclxuICAgICAgKVxyXG4gICAgICAub3V0ZXJSYWRpdXModGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucmluZ1dpZHRoICsgNDApXHJcbiAgICAgIC5zdGFydEFuZ2xlKChfLCBpKSA9PiB0aGlzLmRlZzJyYWQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAoaSA/IGkgKiA2MCA6IDApKSlcclxuICAgICAgLmVuZEFuZ2xlKChfLCBpKSA9PiB0aGlzLmRlZzJyYWQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAoaSArIDEpICogNjApKTtcclxuXHJcbiAgICBjb25zdCBpc0NsaWNrYWJsZSA9IG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2FyYycpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxyXG4gICAgICAuZGF0YShkYXRhX3JlYWR5KVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdwYXRoJylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoXywgaSkgPT4gY29sb3JNYXBzW2ldKVxyXG4gICAgICAuYXR0cignZCcsIGFyYylcclxuICAgICAgLnN0eWxlKCdjdXJzb3InLCBpc0NsaWNrYWJsZSA/ICdwb2ludGVyJyA6ICdkZWZhdWx0JylcclxuICAgICAgLm9uKCdjbGljaycsIChldmVudCwgZCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0NsaWNrYWJsZSkgdGhpcy5oYW5kbGVDbGljayhkKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogRHJhdyB0aGUgcG9pbnRlci9uZWVkbGUgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkcmF3UG9pbnRlcihzdmcsIG1ldGFEYXRhLCBkYXRhX3JlYWR5LCByYWRpdXMpIHtcclxuICAgIGNvbnN0IHBvaW50ZXJWYWx1ZSA9IG1ldGFEYXRhLmN1cnJlbnRWYWx1ZSAtIHRoaXMuY2hhcnREYXRhLmRhdGFbMF07XHJcbiAgICBjb25zdCByYW5nZSA9XHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLmRhdGFbdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggLSAxXSAtXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLmRhdGFbMF07XHJcbiAgICBjb25zdCBwb2ludGVyQW5nbGUgPVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5taW5BbmdsZSArIChwb2ludGVyVmFsdWUgLyByYW5nZSkgKiAxODA7XHJcblxyXG4gICAgY29uc3QgcG9pbnRlckhlYWRMZW5ndGggPSBNYXRoLnJvdW5kKFxyXG4gICAgICByYWRpdXMgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVySGVhZExlbmd0aFBlcmNlbnRcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbGluZURhdGEgPSBbXHJcbiAgICAgIFt0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgICAgWzAsIC1wb2ludGVySGVhZExlbmd0aF0sXHJcbiAgICAgIFstdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlcldpZHRoIC8gMiwgMF0sXHJcbiAgICAgIFswLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyVGFpbExlbmd0aF0sXHJcbiAgICAgIFt0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgIF07XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAncG9pbnRlcicpXHJcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAuYXR0cignZCcsIGQzLmxpbmUoKShsaW5lRGF0YSkpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckNvbG9yKVxyXG4gICAgICAuYXR0cihcclxuICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICBgcm90YXRlKCR7cG9pbnRlckFuZ2xlfSkgdHJhbnNsYXRlKDAsICR7XHJcbiAgICAgICAgICAtcmFkaXVzICtcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCArXHJcbiAgICAgICAgICBwb2ludGVySGVhZExlbmd0aFxyXG4gICAgICAgIH0pYFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIERyYXcgbnVtZXJpYyBsYWJlbHMgYXJvdW5kIGdhdWdlIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZHJhd0xhYmVscyhzdmcsIGRhdGFfcmVhZHksIHJhZGl1cywgbWV0YURhdGEpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gLSBkYXRhWzBdO1xyXG4gICAgY29uc3QgbGFiZWxBcnJheSA9IFt7IG5hbWU6IGRhdGFbMF0sIHZhbHVlOiAwIH1dO1xyXG4gICAgZGF0YV9yZWFkeS5yZWR1Y2UoKHN1bSwgdmFsLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1N1bSA9IHN1bSArIHZhbDtcclxuICAgICAgbGFiZWxBcnJheS5wdXNoKHsgbmFtZTogZGF0YVtpICsgMV0sIHZhbHVlOiBuZXdTdW0gfSk7XHJcbiAgICAgIHJldHVybiBuZXdTdW07XHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICBjb25zdCBsYWJlbEdyb3VwID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2xhYmVscycpO1xyXG4gICAgbGFiZWxHcm91cFxyXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgICAgLmRhdGEobGFiZWxBcnJheSlcclxuICAgICAgLmVudGVyKClcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld0FuZ2xlID1cclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlICsgKGQudmFsdWUgLyByYW5nZSkgKiAxODA7XHJcbiAgICAgICAgcmV0dXJuIGByb3RhdGUoJHtuZXdBbmdsZX0pIHRyYW5zbGF0ZSgwLCAke1xyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxJbnNldCAtIHJhZGl1cyAtIDIwXHJcbiAgICAgICAgfSlgO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzE0cHgnKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzYwMCcpXHJcbiAgICAgIC50ZXh0KChkKSA9PlxyXG4gICAgICAgIG1ldGFEYXRhLmRhdGFUeXBlID8gYCR7ZC5uYW1lfSR7bWV0YURhdGEuZGF0YVR5cGV9YCA6IGQubmFtZVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIERyYXcgdGV4dHMgKHZhbHVlLCBzdGF0dXMsIGRhdGUpIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZHJhd1RleHRzKHN2ZywgbWV0YURhdGEsIHJhZGl1cykge1xyXG4gICAgY29uc3QgdG9wWSA9IHJhZGl1cyAvIDIgLSAxMDtcclxuICAgIGNvbnN0IG1pZFkgPSB0b3BZICsgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3I7XHJcbiAgICBjb25zdCBib3R0b21ZID1cclxuICAgICAgbWlkWSArIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtyYWRpdXMgLSA1MH0sICR7dG9wWX0pYClcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgMTAwKVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgNDApXHJcbiAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd2YWx1ZS1kaXNwbGF5JylcclxuICAgICAgLmh0bWwoYCR7bWV0YURhdGEuY3VycmVudFZhbHVlfSR7bWV0YURhdGEuZGF0YVR5cGUgfHwgJyd9YCk7XHJcblxyXG4gICAgaWYgKG1ldGFEYXRhLnN0YXR1cykge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3JhZGl1cyAtIDYwfSwgJHttaWRZfSlgKVxyXG4gICAgICAgIC5hdHRyKCd3aWR0aCcsIDEyMClcclxuICAgICAgICAuYXR0cignaGVpZ2h0JywgNDApXHJcbiAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnc3RhdHVzLWRpc3BsYXknKVxyXG4gICAgICAgIC5odG1sKG1ldGFEYXRhLnN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1ldGFEYXRhLmRhdGVSYW5nZSkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3JhZGl1cyAtIDEwNX0sICR7Ym90dG9tWX0pYClcclxuICAgICAgICAuYXR0cignd2lkdGgnLCAyMTApXHJcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDQwKVxyXG4gICAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RhdGVyYW5nZS1kaXNwbGF5JylcclxuICAgICAgICAuaHRtbChcclxuICAgICAgICAgIGA8c3BhbiBjbGFzcz1cIm1hcmdpbnJpZ2h0LTNcIj48aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCI+PC9pPjwvc3Bhbj4ke21ldGFEYXRhLmRhdGVSYW5nZX1gXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBDb252ZXJ0IGRlZ3JlZXMgdG8gcmFkaWFucyAqL1xyXG4gIHByaXZhdGUgZGVnMnJhZChkZWc6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGRlZyAqIE1hdGguUEkpIC8gMTgwO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KSB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNndWFnZWNvbnRhaW5lciBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJnKTtcIlxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlci1hbHRcIiAqbmdJZj1cIiFpc0hlYWRlclZpc2libGVcIj5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYyIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCIgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCI+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG4gIDwvZGl2PlxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxIFt0aXRsZV09XCJjaGFydERhdGEubWV0YURhdGEudGl0bGVcIiBbaGFzRHJpbGxEb3duXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd25cIlxyXG4gICAgW2lzRWRpdEVuYWJsZWRdPVwiY2hhcnREYXRhLm1ldGFEYXRhLmlzRWRpdEVuYWJsZWRcIiBbaXNyaWFdPVwiY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhXCIgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgICBbc2VsZWN0ZWRLcGlUb29sdG9wXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zZWxlY3RlZEtwaVRvb2x0b3BcIiAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gICAgW2lzQWxlcnRFbmFibGVkXT1cImlzQWxlcnRFbmFibGVkXCIgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIj48L2xpYi1jaGFydC1oZWFkZXItdjE+XHJcbiAgPGRpdiBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIiBpZD1cImd1YWdlY2hhcnRjb250YWluZXJcIiAjZ3VhZ2VjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnIGd1YWdlY29udGFpbmVyXCI+PC9kaXY+XHJcbjwvZGl2PiJdfQ==