tango-app-ui-analyse-traffic 3.0.1-dev → 3.3.0-alpha.0

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.
Files changed (22) hide show
  1. package/esm2022/lib/components/chart-detail-modal/chart-detail-modal.component.mjs +55 -0
  2. package/esm2022/lib/components/image-doc/image-doc.component.mjs +105 -0
  3. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +80 -0
  4. package/esm2022/lib/components/tango-analyse-traffic/tango-analyse-traffic.component.mjs +22 -6
  5. package/esm2022/lib/components/traffic-analysis/traffic-analysis.component.mjs +579 -130
  6. package/esm2022/lib/components/traffic-card-charts/traffic-card-charts.component.mjs +937 -0
  7. package/esm2022/lib/components/traffic-charts/traffic-charts.component.mjs +422 -0
  8. package/esm2022/lib/services/traffic.service.mjs +69 -0
  9. package/esm2022/lib/tango-analyse-traffic-routing.module.mjs +4 -4
  10. package/esm2022/lib/tango-analyse-traffic.module.mjs +27 -9
  11. package/fesm2022/tango-app-ui-analyse-traffic.mjs +2234 -136
  12. package/fesm2022/tango-app-ui-analyse-traffic.mjs.map +1 -1
  13. package/lib/components/chart-detail-modal/chart-detail-modal.component.d.ts +16 -0
  14. package/lib/components/image-doc/image-doc.component.d.ts +31 -0
  15. package/lib/components/reactive-select/reactive-select.component.d.ts +23 -0
  16. package/lib/components/tango-analyse-traffic/tango-analyse-traffic.component.d.ts +7 -1
  17. package/lib/components/traffic-analysis/traffic-analysis.component.d.ts +62 -3
  18. package/lib/components/traffic-card-charts/traffic-card-charts.component.d.ts +81 -0
  19. package/lib/components/traffic-charts/traffic-charts.component.d.ts +55 -0
  20. package/lib/services/traffic.service.d.ts +26 -0
  21. package/lib/tango-analyse-traffic.module.d.ts +10 -3
  22. package/package.json +1 -1
@@ -0,0 +1,422 @@
1
+ import { Component, HostListener, ViewChild } from '@angular/core';
2
+ import * as am5 from '@amcharts/amcharts5';
3
+ import * as am5xy from '@amcharts/amcharts5/xy';
4
+ import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
5
+ import { FormControl } from '@angular/forms';
6
+ import { Subject, takeUntil } from "rxjs";
7
+ import { debounceTime } from 'rxjs/operators';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@ng-bootstrap/ng-bootstrap";
10
+ import * as i2 from "../../services/traffic.service";
11
+ import * as i3 from "tango-app-ui-global";
12
+ import * as i4 from "@angular/common";
13
+ import * as i5 from "@angular/forms";
14
+ import * as i6 from "../reactive-select/reactive-select.component";
15
+ export class TrafficChartsComponent {
16
+ zone;
17
+ modalService;
18
+ service;
19
+ gs;
20
+ cd;
21
+ chart;
22
+ root;
23
+ yAxis;
24
+ xAxis;
25
+ legend;
26
+ tooltipContainer;
27
+ tooltipData;
28
+ datasets = [
29
+ { value: 'footfall', label: 'Footfall' },
30
+ { value: 'bounced footfall', label: 'Bounced Footfall' },
31
+ { value: 'engagers', label: 'Engagers' },
32
+ { value: 'missed opportunity', label: 'Missed Opportunity' },
33
+ { value: 'potential buyer', label: 'Potential Buyer' },
34
+ { value: 'conversion', label: 'Conversion' }
35
+ ];
36
+ // data = {
37
+ // dataset1: [
38
+ // { year: 'Store-1', engagers: 10, bounced: 8, billable: 5, missedOpportunity: 3, conversion: 2, expenses: 20 },
39
+ // { year: '2013', engagers: 15, bounced: 10, billable: 7, missedOpportunity: 4, conversion: 3, expenses: 25 },
40
+ // { year: '2014', engagers: 20, bounced: 12, billable: 9, missedOpportunity: 5, conversion: 4, expenses: 10 },
41
+ // { year: '2015', engagers: 25, bounced: 15, billable: 10, missedOpportunity: 6, conversion: 5, expenses: 35 },
42
+ // { year: '2016', engagers: 10, bounced: 8, billable: 5, missedOpportunity: 3, conversion: 2, expenses: 20 },
43
+ // { year: '2017', engagers: 15, bounced: 10, billable: 7, missedOpportunity: 4, conversion: 3, expenses: 25 },
44
+ // { year: '2018', engagers: 20, bounced: 12, billable: 9, missedOpportunity: 5, conversion: 4, expenses: 10 },
45
+ // { year: '2019', engagers: 25, bounced: 15, billable: 10, missedOpportunity: 6, conversion: 5, expenses: 35 },
46
+ // { year: '2020', engagers: 30, bounced: 18, billable: 12, missedOpportunity: 7, conversion: 6, expenses: 10 },
47
+ // { year: '2021', engagers: 2, bounced: 12, billable: 19, missedOpportunity: 4, conversion: 14, expenses: 10 },
48
+ // { year: '2022', engagers: 5, bounced: 25, billable: 3, missedOpportunity: 6, conversion: 5, expenses: 5,columnSettings: {
49
+ // fillOpacity: 0.5,
50
+ // strokeWidth: 2,
51
+ // strokeDasharray: [5, 5]
52
+ // },
53
+ // strokeSettings: {
54
+ // stroke: am5.color(0xff0000),
55
+ // strokeWidth: 2,
56
+ // strokeDasharray: [5, 5]
57
+ // } },
58
+ // { year: '2023', engagers: 13, bounced: 8, billable: 12, missedOpportunity: 7, conversion: 6, expenses: 10, columnSettings: {
59
+ // fillOpacity: 0.3,
60
+ // strokeWidth: 1,
61
+ // strokeDasharray: [3, 3]
62
+ // }, },
63
+ // { year: '2024', engagers: 17, bounced: 18, billable: 12, missedOpportunity: 7, conversion: 16, expenses: 30, columnSettings: {
64
+ // fillOpacity: 0.3,
65
+ // strokeWidth: 1,
66
+ // strokeDasharray: [3, 3]
67
+ // }, }
68
+ // ],
69
+ // dataset2: [
70
+ // { year: '2016', engagers: 5, bounced: 4, billable: 3, missedOpportunity: 2, conversion: 1, expenses: 10, },
71
+ // { year: '2017', engagers: 8, bounced: 6, billable: 5, missedOpportunity: 3, conversion: 2, expenses: 15 },
72
+ // { year: '2018', engagers: 10, bounced: 8, billable: 6, missedOpportunity: 4, conversion: 3, expenses: 20 },
73
+ // { year: '2019', engagers: 12, bounced: 10, billable: 8, missedOpportunity: 5, conversion: 4, expenses: 25 },
74
+ // { year: '2020', engagers: 15, bounced: 12, billable: 10, missedOpportunity: 6, conversion: 5, expenses: 30 }
75
+ // ],
76
+ // dataset3: [
77
+ // { year: '2016', engagers: 12, bounced: 11, billable: 8, missedOpportunity: 7, conversion: 6, expenses: 18 },
78
+ // { year: '2017', engagers: 14, bounced: 13, billable: 10, missedOpportunity: 9, conversion: 8, expenses: 22 },
79
+ // { year: '2018', engagers: 18, bounced: 15, billable: 12, missedOpportunity: 11, conversion: 10, expenses: 27 },
80
+ // { year: '2019', engagers: 20, bounced: 18, billable: 15, missedOpportunity: 12, conversion: 11, expenses: 32 },
81
+ // { year: '2020', engagers: 22, bounced: 20, billable: 17, missedOpportunity: 14, conversion: 12, expenses: 37 }
82
+ // ]
83
+ // };
84
+ type = "daily";
85
+ // currentData = this.data.dataset1;
86
+ sharedTooltip;
87
+ selectValue = new FormControl("dataset1");
88
+ clickListener;
89
+ objData;
90
+ destroy$ = new Subject();
91
+ getFootfallTrendData;
92
+ processType = "footfall";
93
+ typeValue;
94
+ headerData;
95
+ constructor(zone, modalService, service, gs, cd) {
96
+ this.zone = zone;
97
+ this.modalService = modalService;
98
+ this.service = service;
99
+ this.gs = gs;
100
+ this.cd = cd;
101
+ }
102
+ offset = 1;
103
+ limit = 10;
104
+ ngOnInit() {
105
+ this.gs.dataRangeValue
106
+ .pipe(takeUntil(this.destroy$), debounceTime(300))
107
+ .subscribe((data) => {
108
+ this.headerData = data;
109
+ this.objData = {
110
+ fromDate: this.headerData.date.startDate,
111
+ toDate: this.headerData.date.endDate,
112
+ storeId: data.stores.filter((store) => store.checked).map((store) => store.storeId),
113
+ clientId: data.client,
114
+ processType: this.processType,
115
+ filterBy: this.processType,
116
+ limit: this.limit,
117
+ offset: this.offset
118
+ };
119
+ this.footfallTrend();
120
+ this.selectValue.valueChanges.subscribe((value) => {
121
+ this.onDatasetChange(value);
122
+ });
123
+ // this.onDatasetChange(this.selectValue.value);
124
+ });
125
+ }
126
+ ngOnDestroy() {
127
+ if (this.root) {
128
+ this.root.dispose();
129
+ }
130
+ this.destroy$.next(true);
131
+ this.destroy$.complete();
132
+ }
133
+ footfallTrend() {
134
+ this.service
135
+ .getfootfallTrend(this.objData)
136
+ .pipe(takeUntil(this.destroy$))
137
+ ?.subscribe({
138
+ next: (res) => {
139
+ if (res && res.code === 200) {
140
+ this.getFootfallTrendData = res?.data.footfallTrendData;
141
+ this.cd.detectChanges();
142
+ setTimeout(() => this.createChart(), 0); // Call with a delay to ensure the element is in the DOM
143
+ }
144
+ },
145
+ error: (err) => {
146
+ this.cd.detectChanges();
147
+ },
148
+ complete: () => { },
149
+ });
150
+ }
151
+ selectPlan(type) {
152
+ this.type = type;
153
+ // this.currentData = this.data.dataset2;
154
+ this.updateChartData();
155
+ }
156
+ createChart() {
157
+ setTimeout(() => {
158
+ const chartDiv = document.getElementById("Footfalltrend");
159
+ if (!chartDiv) {
160
+ console.error("Could not find HTML element with id `Footfalltrend`");
161
+ return;
162
+ }
163
+ if (this.root) {
164
+ this.root.dispose();
165
+ }
166
+ this.root = am5.Root.new('Footfalltrend');
167
+ this.root.setThemes([am5themes_Animated.new(this.root)]);
168
+ this.chart = this.root.container.children.push(am5xy.XYChart.new(this.root, {
169
+ panX: false,
170
+ panY: false,
171
+ wheelX: 'panX',
172
+ wheelY: 'zoomX',
173
+ layout: this.root.verticalLayout
174
+ }));
175
+ this.chart.set("scrollbarX", am5.Scrollbar.new(this.root, {
176
+ orientation: "horizontal"
177
+ }));
178
+ const xAxis = this.chart.xAxes.push(am5xy.CategoryAxis.new(this.root, {
179
+ categoryField: 'storeName',
180
+ renderer: am5xy.AxisRendererX.new(this.root, {
181
+ minGridDistance: 30
182
+ }),
183
+ tooltip: am5.Tooltip.new(this.root, {})
184
+ }));
185
+ this.getFootfallTrendData = this.getFootfallTrendData?.map((item) => ({
186
+ storeName: item.storeName,
187
+ footfall: Number(item.footfallRate),
188
+ conversion: Number(item.conversionRate),
189
+ bounced: Number(item.bouncedRate),
190
+ engagers: Number(item.engagersRate),
191
+ missedopportunities: Number(item.missedopportunitiesRate),
192
+ avgDownTime: Number(item.avgDownTime),
193
+ }));
194
+ xAxis.data.setAll(this.getFootfallTrendData);
195
+ const yAxis = this.chart.yAxes.push(am5xy.ValueAxis.new(this.root, {
196
+ renderer: am5xy.AxisRendererY.new(this.root, {})
197
+ }));
198
+ // Set the title of the y-axis
199
+ yAxis.children.unshift(am5.Label.new(this.root, {
200
+ rotation: -90,
201
+ text: 'Footfall',
202
+ y: am5.p50,
203
+ centerX: am5.p50
204
+ }));
205
+ this.createColumnSeries('Engagers', 'engagers', xAxis, yAxis, false, am5.color(0xB3E3FF));
206
+ this.createColumnSeries('Bounced', 'bounced', xAxis, yAxis, true, am5.color(0x80D1FF));
207
+ this.createColumnSeries('Billable', 'footfall', xAxis, yAxis, true, am5.color(0x66C8FF));
208
+ this.createColumnSeries('Missed Opportunity', 'missedopportunities', xAxis, yAxis, true, am5.color(0x4DBFFF));
209
+ this.createColumnSeries('Conversion', 'conversion', xAxis, yAxis, true, am5.color(0x33B5FF));
210
+ this.createLineSeries('Expenses', 'avgDownTime', xAxis, yAxis, am5.color(0x33B5FF));
211
+ const legend = this.chart.children.push(am5.Legend.new(this.root, {
212
+ centerX: am5.p50,
213
+ x: am5.p50
214
+ }));
215
+ legend.data.setAll(this.chart.series.values);
216
+ this.chart.set('cursor', am5xy.XYCursor.new(this.root, {
217
+ behavior: 'none'
218
+ }));
219
+ this.chart.series.each((series) => {
220
+ if (series.columns) {
221
+ series.columns.template.set("interactive", true);
222
+ series.columns.template.events.on("click", (ev) => {
223
+ const data = ev.target.dataItem.dataContext;
224
+ const { clientX, clientY } = ev.originalEvent;
225
+ this.showTooltip(data, clientX, clientY);
226
+ });
227
+ }
228
+ });
229
+ this.chart.appear(1000, 100);
230
+ }, 0);
231
+ }
232
+ tooltipVisible = false;
233
+ showTooltip(data, x, y) {
234
+ this.tooltipVisible = false;
235
+ this.tooltipData = data;
236
+ const tooltipElement = this.tooltipContainer.nativeElement;
237
+ // Set tooltip content and make it visible to calculate dimensions
238
+ tooltipElement.style.display = 'block';
239
+ tooltipElement.style.visibility = 'hidden'; // Make it invisible but still present in the DOM
240
+ // Force a reflow to ensure dimensions are up-to-date
241
+ tooltipElement.style.position = 'absolute';
242
+ // Wait for the next event loop to get accurate dimensions
243
+ setTimeout(() => {
244
+ const tooltipWidth = tooltipElement.offsetWidth;
245
+ const tooltipHeight = tooltipElement.offsetHeight;
246
+ const screenWidth = window.innerWidth;
247
+ const screenHeight = window.innerHeight;
248
+ // Calculate if there is enough space on the right side, otherwise place it on the left
249
+ if (x + tooltipWidth > screenWidth) {
250
+ tooltipElement.style.left = `${x - tooltipWidth}px`;
251
+ }
252
+ else {
253
+ tooltipElement.style.left = `${x}px`;
254
+ }
255
+ // Calculate if there is enough space at the bottom, otherwise place it at the top
256
+ if (y + tooltipHeight > screenHeight) {
257
+ tooltipElement.style.top = `${y - tooltipHeight}px`;
258
+ }
259
+ else {
260
+ tooltipElement.style.top = `${y}px`;
261
+ }
262
+ tooltipElement.style.visibility = 'visible'; // Make it visible again
263
+ this.tooltipVisible = true;
264
+ }, 0);
265
+ }
266
+ hideTooltip() {
267
+ this.tooltipVisible = false;
268
+ const tooltipElement = this.tooltipContainer.nativeElement;
269
+ tooltipElement.style.display = 'none';
270
+ }
271
+ onClick(event) {
272
+ const tooltipElement = this.tooltipContainer.nativeElement;
273
+ // Check if the click was outside the tooltip
274
+ if (tooltipElement && !tooltipElement.contains(event.target) && this.tooltipVisible) {
275
+ this.hideTooltip();
276
+ }
277
+ }
278
+ // openModal(data: any,clientX: number, clientY: number) {
279
+ // const modalRef = this.modalService.open(ChartDetailModalComponent,{
280
+ // centered: true,
281
+ // windowClass: 'custom-modal',
282
+ // size: "sm",
283
+ // });
284
+ // modalRef.componentInstance.data = data;
285
+ // modalRef.componentInstance.clientX = clientX;
286
+ // modalRef.componentInstance.clientY = clientY;
287
+ // }
288
+ onDatasetChange(selectedValue) {
289
+ // const selectedDataset = selectedValue as keyof Dataset;
290
+ // this.currentData = this.data[selectedDataset];
291
+ this.updateChartData();
292
+ // this.updateYAxisLabel(selectedValue);
293
+ }
294
+ // updateYAxisLabel(selectedValue: string) {
295
+ // const newLabelText = `Footfall - ${selectedValue}`; // Customize your label text as needed
296
+ // console.log('Updating Y-axis label to:', newLabelText);
297
+ // const label = this.yAxis.children.getIndex(0) as am5.Label;
298
+ // label.set("text", newLabelText);
299
+ // }
300
+ updateChartData() {
301
+ const xAxis = this.chart.xAxes.getIndex(0);
302
+ xAxis.data.setAll(this.getFootfallTrendData);
303
+ this.chart.series.each((series) => {
304
+ series.data.setAll(this.getFootfallTrendData);
305
+ });
306
+ }
307
+ createColumnSeries(name, fieldName, xAxis, yAxis, stacked, color) {
308
+ const series = this.chart.series.push(am5xy.ColumnSeries.new(this.root, {
309
+ name: name,
310
+ xAxis: xAxis,
311
+ yAxis: yAxis,
312
+ valueYField: fieldName,
313
+ categoryXField: 'storeName',
314
+ stacked: stacked,
315
+ }));
316
+ series.data.setAll(this.getFootfallTrendData);
317
+ // Adapter to apply custom column settings
318
+ series.columns.template.adapters.add("fillOpacity", (fillOpacity, target) => {
319
+ const dataItem = target.dataItem.dataContext;
320
+ return dataItem.columnSettings ? dataItem.columnSettings.fillOpacity : fillOpacity;
321
+ });
322
+ series.columns.template.adapters.add("strokeDasharray", (strokeDasharray, target) => {
323
+ const dataItem = target.dataItem.dataContext;
324
+ return dataItem.columnSettings ? dataItem.columnSettings.strokeDasharray : strokeDasharray;
325
+ });
326
+ series.columns.template.adapters.add("strokeWidth", (strokeWidth, target) => {
327
+ const dataItem = target.dataItem.dataContext;
328
+ return dataItem.columnSettings ? dataItem.columnSettings.strokeWidth : strokeWidth;
329
+ });
330
+ series.columns.template.setAll({
331
+ // tooltipText: "{name}: {valueY.formatNumber('#.#')}%", // Ensure proper formatting for single value display
332
+ // tooltipY: am5.percent(10),
333
+ fill: color,
334
+ stroke: color // Set custom stroke color for the bars
335
+ });
336
+ series.bullets.push(() => {
337
+ return am5.Bullet.new(this.root, {
338
+ sprite: am5.Label.new(this.root, {
339
+ text: "{valueY.formatNumber('#.#')}%",
340
+ fill: this.root.interfaceColors.get("alternativeText"),
341
+ centerY: am5.p50,
342
+ centerX: am5.p50,
343
+ populateText: true,
344
+ fontSize: 12 // Reduce font size
345
+ })
346
+ });
347
+ });
348
+ series.appear();
349
+ }
350
+ createLineSeries(name, fieldName, xAxis, yAxis, color) {
351
+ const series = this.chart.series.push(am5xy.LineSeries.new(this.root, {
352
+ name: name,
353
+ xAxis: xAxis,
354
+ yAxis: yAxis,
355
+ valueYField: fieldName,
356
+ categoryXField: 'storeName',
357
+ tooltip: am5.Tooltip.new(this.root, {
358
+ pointerOrientation: "horizontal",
359
+ labelText: "{name}: {valueY.formatNumber('#.#')}%",
360
+ background: am5.Rectangle.new(this.root, {
361
+ fill: am5.color(0xffcc00) // Set the desired tooltip background color
362
+ })
363
+ })
364
+ }));
365
+ series.strokes.template.setAll({
366
+ strokeWidth: 2,
367
+ stroke: color,
368
+ templateField: "strokeSettings",
369
+ fontSize: 12 // Reduce font size
370
+ });
371
+ series.data.setAll(this.getFootfallTrendData);
372
+ // Adapter to apply custom stroke settings
373
+ series.strokes.template.adapters.add("stroke", (stroke, target) => {
374
+ const dataItem = target.dataItem;
375
+ if (dataItem && dataItem.dataContext && dataItem.dataContext.strokeSettings) {
376
+ return dataItem.dataContext.strokeSettings.stroke ?? stroke;
377
+ }
378
+ return stroke;
379
+ });
380
+ series.strokes.template.adapters.add("strokeWidth", (strokeWidth, target) => {
381
+ const dataItem = target.dataItem;
382
+ if (dataItem && dataItem.dataContext && dataItem.dataContext.strokeSettings) {
383
+ return dataItem.dataContext.strokeSettings.strokeWidth ?? strokeWidth;
384
+ }
385
+ return strokeWidth;
386
+ });
387
+ series.strokes.template.adapters.add("strokeDasharray", (strokeDasharray, target) => {
388
+ const dataItem = target.dataItem;
389
+ if (dataItem && dataItem.dataContext && dataItem.dataContext.strokeSettings) {
390
+ return dataItem.dataContext.strokeSettings.strokeDasharray ?? strokeDasharray;
391
+ }
392
+ return strokeDasharray;
393
+ });
394
+ series.bullets.push(() => {
395
+ return am5.Bullet.new(this.root, {
396
+ sprite: am5.Circle.new(this.root, {
397
+ strokeWidth: 1,
398
+ stroke: series.get("stroke"),
399
+ radius: 1,
400
+ fill: this.root.interfaceColors.get("background")
401
+ }),
402
+ });
403
+ });
404
+ series.appear();
405
+ }
406
+ changeStatus(type) {
407
+ this.typeValue = type;
408
+ }
409
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrafficChartsComponent, deps: [{ token: i0.NgZone }, { token: i1.NgbModal }, { token: i2.TrafficService }, { token: i3.GlobalStateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
410
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TrafficChartsComponent, selector: "lib-traffic-charts", host: { listeners: { "document:click": "onClick($event)" } }, viewQueries: [{ propertyName: "tooltipContainer", first: true, predicate: ["tooltipContainer"], descendants: true }], ngImport: i0, template: "<div class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Footfall Trend</span>\r\n <span class=\"text-sub mb-2\">Based on 31 May, 2024\u2013 06 Jun, 2024</span>\r\n </h3>\r\n <div class=\"card-toolbar text-nowrap\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <!--begin::Nav group-->\r\n <div class=\"nav-group nav-group-outline border-1 btn-group p-0\">\r\n <button class=\"btn btn-outline\" [ngClass]=\"type === 'daily'? 'activePlanBtn':'inactivePlanBtn'\"\r\n (click)=\"selectPlan('daily')\">\r\n Daily\r\n </button>\r\n\r\n <button class=\"btn btn-outline px-6 py-3\"\r\n [ngClass]=\"type === 'week'? 'activePlanBtn':'inactivePlanBtn'\" (click)=\"selectPlan('week')\">\r\n Week\r\n </button>\r\n <button class=\"btn btn-outline px-6 py-3\"\r\n [ngClass]=\"type === 'month'? 'activePlanBtn':'inactivePlanBtn'\"\r\n (click)=\"selectPlan('month')\">\r\n Month\r\n </button>\r\n </div>\r\n <!--end::Nav group-->\r\n <div class=\"d-flex\">\r\n <span class=\"mx-2 mt-3\">Trend</span>\r\n\r\n <lib-reactive-select [formControl]=\"selectValue\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"datasets\" class=\"w-100\"></lib-reactive-select>\r\n <!-- <select class=\"form-select form-select-sm\" (change)=\"onDatasetChange($event)\">\r\n <option *ngFor=\"let dataset of datasets\" [value]=\"dataset.value\">{{ dataset.label }}\r\n </option>\r\n </select> -->\r\n </div>\r\n <div class=\"d-flex mt-1\">\r\n <span class=\"d-flex ms-3 cursor-pointer text-nowrap\">Forecast\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_2645_27459)\">\r\n <path\r\n d=\"M3.33398 1.33331L3.46065 1.95998C3.55142 2.40998 3.75683 2.82893 4.05699 3.17628C4.35715 3.52362 4.74189 3.78759 5.17398 3.94265L5.33398 3.99998L5.17398 4.05731C4.74189 4.21237 4.35715 4.47634 4.05699 4.82368C3.75683 5.17103 3.55142 5.58998 3.46065 6.03998L3.33398 6.66665L3.20732 6.03998C3.11654 5.58998 2.91114 5.17103 2.61098 4.82368C2.31082 4.47634 1.92607 4.21237 1.49398 4.05731L1.33398 3.99998L1.49398 3.94265C1.92607 3.78759 2.31082 3.52362 2.61098 3.17628C2.91114 2.82893 3.11654 2.40998 3.20732 1.95998L3.33398 1.33331ZM5.33398 10.6666L5.48732 11.5173C5.52713 11.7392 5.62256 11.9474 5.76468 12.1224C5.9068 12.2974 6.09098 12.4335 6.29998 12.518L6.66732 12.6666L6.29998 12.8153C6.09094 12.8997 5.90668 13.0356 5.76445 13.2105C5.62221 13.3854 5.52663 13.5935 5.48665 13.8153L5.33398 14.6666L5.18065 13.816C5.14084 13.5941 5.04541 13.3859 4.90329 13.2109C4.76117 13.0359 4.57699 12.8998 4.36798 12.8153L4.00065 12.6666L4.36798 12.518C4.57703 12.4336 4.76129 12.2977 4.90352 12.1228C5.04576 11.9479 5.14133 11.7398 5.18132 11.518L5.33398 10.6666ZM10.6673 1.99998L11.038 3.76931C11.2269 4.67137 11.6463 5.50908 12.2554 6.20076C12.8645 6.89244 13.6424 7.41448 14.5133 7.71598L15.334 7.99998L14.5133 8.28398C13.6424 8.58548 12.8645 9.10752 12.2554 9.7992C11.6463 10.4909 11.2269 11.3286 11.038 12.2306L10.6673 14L10.2967 12.2306C10.1077 11.3286 9.6883 10.4909 9.07922 9.7992C8.47015 9.10752 7.69223 8.58548 6.82132 8.28398L6.00065 7.99998L6.82132 7.71598C7.69223 7.41448 8.47015 6.89244 9.07922 6.20076C9.6883 5.50908 10.1077 4.67137 10.2967 3.76931L10.6673 1.99998Z\"\r\n stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2645_27459\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <span class=\"form-check form-switch mx-6\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\">\r\n </span>\r\n\r\n </span>\r\n <span class=\"cursor-pointer dropdown1\">\r\n <span \r\n data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n \r\n <ul class=\"dropdown-menu p-0\">\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='normailze' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('normailze')\">Normailze\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='normailze' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='average' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('average')\">Average\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='average' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='target' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('target')\">Target\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='target' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></button></li>\r\n \r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='weekend' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('weekend')\">Weekends\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='weekend' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></button></li>\r\n \r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='weekdays' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('weekdays')\">Weekdays\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='weekdays' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n </ul>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-0\">\r\n <div class=\"text-center\" id=\"Footfalltrend\"></div>\r\n <div #tooltipContainer class=\"tooltip-container\" >\r\n <div class=\"tooltip-content\" *ngIf=\"tooltipData\">\r\n <div class=\"content p-5\">\r\n <div class=\"container\">\r\n <div class=\"title text-start\">{{tooltipData.storeName}}</div>\r\n </div>\r\n <div class=\"grid-container\">\r\n <div class=\"grid-item label\">Total Footfall</div>\r\n <div class=\"grid-item value\">100</div>\r\n <div class=\"grid-item label\">Bounced Footfall</div>\r\n <div class=\"grid-item value\">{{tooltipData.bounced}}</div>\r\n <div class=\"grid-item label\">Engagers</div>\r\n <div class=\"grid-item value\">{{tooltipData.engagers}}</div>\r\n <div class=\"grid-item label\">Avg Dwell Time</div>\r\n <div class=\"grid-item value\">34 Mins</div>\r\n <div class=\"grid-item label\">Conversion Rate</div>\r\n <div class=\"grid-item value\">{{tooltipData.conversion}}%</div>\r\n <div class=\"grid-item label\">Missed Opportunities</div>\r\n <div class=\"grid-item value\">{{tooltipData.missedopportunities}}</div>\r\n <div class=\"grid-item label\">Down Time</div>\r\n <div class=\"grid-item value\">23%</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mx-3 my-2\">\r\n <span class=\"mx-3\"><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\"/>\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\"/>\r\n <path d=\"M18.6667 11.3334L12 19.3334H18L17.3333 24.6667L24 16.6667H18L18.6667 11.3334Z\" stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n <span class=\"mx-2 my-2\"><span class=\"text-week\">Weekend staffing lower than weekdays</span> <span class=\"text-cause ms-2\">cause potentially 20% fewer weekend conversions.</span></span>\r\n </div>\r\n </div>\r\n</div>", styles: ["#Footfalltrend{width:100%;height:500px}.activePlanBtn{border-radius:6px;background:var(--Primary-50, #EAF8FF);color:var(--Gray-700, #344054);font-size:14px!important;font-weight:500!important;line-height:20px}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-size:14px;font-weight:500!important;line-height:20px}.text-week{color:#000;font-size:16px;font-style:normal;font-weight:700;line-height:24px}.text-cause{color:#000;font-size:16px;font-style:normal;font-weight:400;line-height:24px}.tooltip-content{font-size:12px}.tooltip-container{display:none;position:absolute;padding:8px;z-index:1;top:150px!important;border-radius:8px;background:var(--Primary-25, #ffffff)}.title{color:var(--Black, #101828);font-size:16px;font-style:normal;font-weight:600;line-height:24px}.grid-container{display:grid;grid-template-columns:1fr 1fr}.grid-item{padding:8px;border:0px solid #ddd;text-align:left;border-bottom:1px solid var(--Gray-200, #EAECF0)}.label{background-color:#fff;font-weight:700;color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:500;line-height:18px;white-space:nowrap}.value{text-align:end;background-color:#fff;color:var(--Gray-900, #101828);font-size:12px;font-style:normal;font-weight:600;line-height:18px}.dropdown-item:hover,.dropdown-item:focus,.bg-forcast{color:var(--bs-dropdown-link-hover-color)!important;background:#eaf8ff!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }] });
411
+ }
412
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrafficChartsComponent, decorators: [{
413
+ type: Component,
414
+ args: [{ selector: 'lib-traffic-charts', template: "<div class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Footfall Trend</span>\r\n <span class=\"text-sub mb-2\">Based on 31 May, 2024\u2013 06 Jun, 2024</span>\r\n </h3>\r\n <div class=\"card-toolbar text-nowrap\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <!--begin::Nav group-->\r\n <div class=\"nav-group nav-group-outline border-1 btn-group p-0\">\r\n <button class=\"btn btn-outline\" [ngClass]=\"type === 'daily'? 'activePlanBtn':'inactivePlanBtn'\"\r\n (click)=\"selectPlan('daily')\">\r\n Daily\r\n </button>\r\n\r\n <button class=\"btn btn-outline px-6 py-3\"\r\n [ngClass]=\"type === 'week'? 'activePlanBtn':'inactivePlanBtn'\" (click)=\"selectPlan('week')\">\r\n Week\r\n </button>\r\n <button class=\"btn btn-outline px-6 py-3\"\r\n [ngClass]=\"type === 'month'? 'activePlanBtn':'inactivePlanBtn'\"\r\n (click)=\"selectPlan('month')\">\r\n Month\r\n </button>\r\n </div>\r\n <!--end::Nav group-->\r\n <div class=\"d-flex\">\r\n <span class=\"mx-2 mt-3\">Trend</span>\r\n\r\n <lib-reactive-select [formControl]=\"selectValue\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"datasets\" class=\"w-100\"></lib-reactive-select>\r\n <!-- <select class=\"form-select form-select-sm\" (change)=\"onDatasetChange($event)\">\r\n <option *ngFor=\"let dataset of datasets\" [value]=\"dataset.value\">{{ dataset.label }}\r\n </option>\r\n </select> -->\r\n </div>\r\n <div class=\"d-flex mt-1\">\r\n <span class=\"d-flex ms-3 cursor-pointer text-nowrap\">Forecast\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_2645_27459)\">\r\n <path\r\n d=\"M3.33398 1.33331L3.46065 1.95998C3.55142 2.40998 3.75683 2.82893 4.05699 3.17628C4.35715 3.52362 4.74189 3.78759 5.17398 3.94265L5.33398 3.99998L5.17398 4.05731C4.74189 4.21237 4.35715 4.47634 4.05699 4.82368C3.75683 5.17103 3.55142 5.58998 3.46065 6.03998L3.33398 6.66665L3.20732 6.03998C3.11654 5.58998 2.91114 5.17103 2.61098 4.82368C2.31082 4.47634 1.92607 4.21237 1.49398 4.05731L1.33398 3.99998L1.49398 3.94265C1.92607 3.78759 2.31082 3.52362 2.61098 3.17628C2.91114 2.82893 3.11654 2.40998 3.20732 1.95998L3.33398 1.33331ZM5.33398 10.6666L5.48732 11.5173C5.52713 11.7392 5.62256 11.9474 5.76468 12.1224C5.9068 12.2974 6.09098 12.4335 6.29998 12.518L6.66732 12.6666L6.29998 12.8153C6.09094 12.8997 5.90668 13.0356 5.76445 13.2105C5.62221 13.3854 5.52663 13.5935 5.48665 13.8153L5.33398 14.6666L5.18065 13.816C5.14084 13.5941 5.04541 13.3859 4.90329 13.2109C4.76117 13.0359 4.57699 12.8998 4.36798 12.8153L4.00065 12.6666L4.36798 12.518C4.57703 12.4336 4.76129 12.2977 4.90352 12.1228C5.04576 11.9479 5.14133 11.7398 5.18132 11.518L5.33398 10.6666ZM10.6673 1.99998L11.038 3.76931C11.2269 4.67137 11.6463 5.50908 12.2554 6.20076C12.8645 6.89244 13.6424 7.41448 14.5133 7.71598L15.334 7.99998L14.5133 8.28398C13.6424 8.58548 12.8645 9.10752 12.2554 9.7992C11.6463 10.4909 11.2269 11.3286 11.038 12.2306L10.6673 14L10.2967 12.2306C10.1077 11.3286 9.6883 10.4909 9.07922 9.7992C8.47015 9.10752 7.69223 8.58548 6.82132 8.28398L6.00065 7.99998L6.82132 7.71598C7.69223 7.41448 8.47015 6.89244 9.07922 6.20076C9.6883 5.50908 10.1077 4.67137 10.2967 3.76931L10.6673 1.99998Z\"\r\n stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2645_27459\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <span class=\"form-check form-switch mx-6\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\">\r\n </span>\r\n\r\n </span>\r\n <span class=\"cursor-pointer dropdown1\">\r\n <span \r\n data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n \r\n <ul class=\"dropdown-menu p-0\">\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='normailze' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('normailze')\">Normailze\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='normailze' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='average' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('average')\">Average\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='average' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='target' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('target')\">Target\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='target' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></button></li>\r\n \r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='weekend' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('weekend')\">Weekends\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='weekend' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></button></li>\r\n \r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='weekdays' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('weekdays')\">Weekdays\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='weekdays' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n </ul>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-0\">\r\n <div class=\"text-center\" id=\"Footfalltrend\"></div>\r\n <div #tooltipContainer class=\"tooltip-container\" >\r\n <div class=\"tooltip-content\" *ngIf=\"tooltipData\">\r\n <div class=\"content p-5\">\r\n <div class=\"container\">\r\n <div class=\"title text-start\">{{tooltipData.storeName}}</div>\r\n </div>\r\n <div class=\"grid-container\">\r\n <div class=\"grid-item label\">Total Footfall</div>\r\n <div class=\"grid-item value\">100</div>\r\n <div class=\"grid-item label\">Bounced Footfall</div>\r\n <div class=\"grid-item value\">{{tooltipData.bounced}}</div>\r\n <div class=\"grid-item label\">Engagers</div>\r\n <div class=\"grid-item value\">{{tooltipData.engagers}}</div>\r\n <div class=\"grid-item label\">Avg Dwell Time</div>\r\n <div class=\"grid-item value\">34 Mins</div>\r\n <div class=\"grid-item label\">Conversion Rate</div>\r\n <div class=\"grid-item value\">{{tooltipData.conversion}}%</div>\r\n <div class=\"grid-item label\">Missed Opportunities</div>\r\n <div class=\"grid-item value\">{{tooltipData.missedopportunities}}</div>\r\n <div class=\"grid-item label\">Down Time</div>\r\n <div class=\"grid-item value\">23%</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mx-3 my-2\">\r\n <span class=\"mx-3\"><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\"/>\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\"/>\r\n <path d=\"M18.6667 11.3334L12 19.3334H18L17.3333 24.6667L24 16.6667H18L18.6667 11.3334Z\" stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n <span class=\"mx-2 my-2\"><span class=\"text-week\">Weekend staffing lower than weekdays</span> <span class=\"text-cause ms-2\">cause potentially 20% fewer weekend conversions.</span></span>\r\n </div>\r\n </div>\r\n</div>", styles: ["#Footfalltrend{width:100%;height:500px}.activePlanBtn{border-radius:6px;background:var(--Primary-50, #EAF8FF);color:var(--Gray-700, #344054);font-size:14px!important;font-weight:500!important;line-height:20px}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-size:14px;font-weight:500!important;line-height:20px}.text-week{color:#000;font-size:16px;font-style:normal;font-weight:700;line-height:24px}.text-cause{color:#000;font-size:16px;font-style:normal;font-weight:400;line-height:24px}.tooltip-content{font-size:12px}.tooltip-container{display:none;position:absolute;padding:8px;z-index:1;top:150px!important;border-radius:8px;background:var(--Primary-25, #ffffff)}.title{color:var(--Black, #101828);font-size:16px;font-style:normal;font-weight:600;line-height:24px}.grid-container{display:grid;grid-template-columns:1fr 1fr}.grid-item{padding:8px;border:0px solid #ddd;text-align:left;border-bottom:1px solid var(--Gray-200, #EAECF0)}.label{background-color:#fff;font-weight:700;color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:500;line-height:18px;white-space:nowrap}.value{text-align:end;background-color:#fff;color:var(--Gray-900, #101828);font-size:12px;font-style:normal;font-weight:600;line-height:18px}.dropdown-item:hover,.dropdown-item:focus,.bg-forcast{color:var(--bs-dropdown-link-hover-color)!important;background:#eaf8ff!important}\n"] }]
415
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.NgbModal }, { type: i2.TrafficService }, { type: i3.GlobalStateService }, { type: i0.ChangeDetectorRef }], propDecorators: { tooltipContainer: [{
416
+ type: ViewChild,
417
+ args: ['tooltipContainer']
418
+ }], onClick: [{
419
+ type: HostListener,
420
+ args: ['document:click', ['$event']]
421
+ }] } });
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZmZpYy1jaGFydHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmFmZmljL3NyYy9saWIvY29tcG9uZW50cy90cmFmZmljLWNoYXJ0cy90cmFmZmljLWNoYXJ0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL3RyYWZmaWMtY2hhcnRzL3RyYWZmaWMtY2hhcnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBMEMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFJLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLGtCQUFrQixNQUFNLHFDQUFxQyxDQUFDO0FBSXJFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBTzlDLE1BQU0sT0FBTyxzQkFBc0I7SUE2RWI7SUFBcUI7SUFBK0I7SUFBZ0M7SUFDOUY7SUE3RVYsS0FBSyxDQUFNO0lBQ1gsSUFBSSxDQUFNO0lBQ1YsS0FBSyxDQUFNO0lBQ1gsS0FBSyxDQUFNO0lBQ1gsTUFBTSxDQUFNO0lBQ21CLGdCQUFnQixDQUE2QjtJQUM1RSxXQUFXLENBQU07SUFFakIsUUFBUSxHQUFHO1FBQ1QsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7UUFDeEMsRUFBRSxLQUFLLEVBQUUsa0JB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LEVBQUU7Z0JBQy9CLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNoQyxXQUFXLEVBQUUsQ0FBQztvQkFDZCxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7b0JBQzVCLE1BQU0sRUFBRSxDQUFDO29CQUNULElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO2lCQUNsRCxDQUFDO2FBRUgsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUdELFlBQVksQ0FBQyxJQUFRO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7d0dBamNVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDhPQ2xCbkMsZytZQXlKTTs7NEZEdklPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0I7Z01BVUMsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFtUjdCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBhbTUgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNSc7XHJcbmltcG9ydCAqIGFzIGFtNXh5IGZyb20gJ0BhbWNoYXJ0cy9hbWNoYXJ0czUveHknO1xyXG5pbXBvcnQgYW01dGhlbWVzX0FuaW1hdGVkIGZyb20gJ0BhbWNoYXJ0cy9hbWNoYXJ0czUvdGhlbWVzL0FuaW1hdGVkJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IENoYXJ0RGV0YWlsTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9jaGFydC1kZXRhaWwtbW9kYWwvY2hhcnQtZGV0YWlsLW1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nYlRvb2x0aXAgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmFmZmljU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYWZmaWMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10cmFmZmljLWNoYXJ0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RyYWZmaWMtY2hhcnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdHJhZmZpYy1jaGFydHMuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmFmZmljQ2hhcnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LE9uRGVzdHJveSB7XHJcbiAgY2hhcnQ6IGFueTtcclxuICByb290OiBhbnk7XHJcbiAgeUF4aXM6IGFueTtcclxuICB4QXhpczogYW55O1xyXG4gIGxlZ2VuZDogYW55O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2x0aXBDb250YWluZXInKSB0b29sdGlwQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICB0b29sdGlwRGF0YTogYW55O1xyXG5cclxuICBkYXRhc2V0cyA9IFtcclxuICAgIHsgdmFsdWU6ICdmb290ZmFsbCcsIGxhYmVsOiAnRm9vdGZhbGwnIH0sXHJcbiAgICB7IHZhbHVlOiAnYm91bmNlZCBmb290ZmFsbCcsIGxhYmVsOiAnQm91bmNlZCBGb290ZmFsbCcgfSxcclxuICAgIHsgdmFsdWU6ICdlbmdhZ2VycycsIGxhYmVsOiAnRW5nYWdlcnMnIH0sXHJcbiAgICB7IHZhbHVlOiAnbWlzc2VkIG9wcG9ydHVuaXR5JywgbGFiZWw6ICdNaXNzZWQgT3Bwb3J0dW5pdHknIH0sXHJcbiAgICB7IHZhbHVlOiAncG90ZW50aWFsIGJ1eWVyJywgbGFiZWw6ICdQb3RlbnRpYWwgQnV5ZXInIH0sXHJcbiAgICB7IHZhbHVlOiAnY29udmVyc2lvbicsIGxhYmVsOiAnQ29udmVyc2lvbicgfVxyXG4gIF07XHJcblxyXG4gIC8vIGRhdGEgPSB7XHJcbiAgLy8gICBkYXRhc2V0MTogW1xyXG4gIC8vICAgICB7IHllYXI6ICdTdG9yZS0xJywgZW5nYWdlcnM6IDEwLCBib3VuY2VkOiA4LCBiaWxsYWJsZTogNSwgbWlzc2VkT3Bwb3J0dW5pdHk6IDMsIGNvbnZlcnNpb246IDIsIGV4cGVuc2VzOiAyMCB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDEzJywgZW5nYWdlcnM6IDE1LCBib3VuY2VkOiAxMCwgYmlsbGFibGU6IDcsIG1pc3NlZE9wcG9ydHVuaXR5OiA0LCBjb252ZXJzaW9uOiAzLCBleHBlbnNlczogMjUgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxNCcsIGVuZ2FnZXJzOiAyMCwgYm91bmNlZDogMTIsIGJpbGxhYmxlOiA5LCBtaXNzZWRPcHBvcnR1bml0eTogNSwgY29udmVyc2lvbjogNCwgZXhwZW5zZXM6IDEwIH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTUnLCBlbmdhZ2VyczogMjUsIGJvdW5jZWQ6IDE1LCBiaWxsYWJsZTogMTAsIG1pc3NlZE9wcG9ydHVuaXR5OiA2LCBjb252ZXJzaW9uOiA1LCBleHBlbnNlczogMzUgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxNicsIGVuZ2FnZXJzOiAxMCwgYm91bmNlZDogOCwgYmlsbGFibGU6IDUsIG1pc3NlZE9wcG9ydHVuaXR5OiAzLCBjb252ZXJzaW9uOiAyLCBleHBlbnNlczogMjAgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxNycsIGVuZ2FnZXJzOiAxNSwgYm91bmNlZDogMTAsIGJpbGxhYmxlOiA3LCBtaXNzZWRPcHBvcnR1bml0eTogNCwgY29udmVyc2lvbjogMywgZXhwZW5zZXM6IDI1IH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTgnLCBlbmdhZ2VyczogMjAsIGJvdW5jZWQ6IDEyLCBiaWxsYWJsZTogOSwgbWlzc2VkT3Bwb3J0dW5pdHk6IDUsIGNvbnZlcnNpb246IDQsIGV4cGVuc2VzOiAxMCB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDE5JywgZW5nYWdlcnM6IDI1LCBib3VuY2VkOiAxNSwgYmlsbGFibGU6IDEwLCBtaXNzZWRPcHBvcnR1bml0eTogNiwgY29udmVyc2lvbjogNSwgZXhwZW5zZXM6IDM1IH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMjAnLCBlbmdhZ2VyczogMzAsIGJvdW5jZWQ6IDE4LCBiaWxsYWJsZTogMTIsIG1pc3NlZE9wcG9ydHVuaXR5OiA3LCBjb252ZXJzaW9uOiA2LCBleHBlbnNlczogMTAgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAyMScsIGVuZ2FnZXJzOiAyLCBib3VuY2VkOiAxMiwgYmlsbGFibGU6IDE5LCBtaXNzZWRPcHBvcnR1bml0eTogNCwgY29udmVyc2lvbjogMTQsIGV4cGVuc2VzOiAxMCB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDIyJywgZW5nYWdlcnM6IDUsIGJvdW5jZWQ6IDI1LCBiaWxsYWJsZTogMywgbWlzc2VkT3Bwb3J0dW5pdHk6IDYsIGNvbnZlcnNpb246IDUsIGV4cGVuc2VzOiA1LGNvbHVtblNldHRpbmdzOiB7XHJcbiAgLy8gICAgICAgZmlsbE9wYWNpdHk6IDAuNSxcclxuICAvLyAgICAgICBzdHJva2VXaWR0aDogMixcclxuICAvLyAgICAgICBzdHJva2VEYXNoYXJyYXk6IFs1LCA1XVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBzdHJva2VTZXR0aW5nczoge1xyXG4gIC8vICAgICAgIHN0cm9rZTogYW01LmNvbG9yKDB4ZmYwMDAwKSxcclxuICAvLyAgICAgICBzdHJva2VXaWR0aDogMixcclxuICAvLyAgICAgICBzdHJva2VEYXNoYXJyYXk6IFs1LCA1XVxyXG4gIC8vICAgICB9IH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMjMnLCBlbmdhZ2VyczogMTMsIGJvdW5jZWQ6IDgsIGJpbGxhYmxlOiAxMiwgbWlzc2VkT3Bwb3J0dW5pdHk6IDcsIGNvbnZlcnNpb246IDYsIGV4cGVuc2VzOiAxMCwgY29sdW1uU2V0dGluZ3M6IHtcclxuICAvLyAgICAgICBmaWxsT3BhY2l0eTogMC4zLFxyXG4gIC8vICAgICAgIHN0cm9rZVdpZHRoOiAxLFxyXG4gIC8vICAgICAgIHN0cm9rZURhc2hhcnJheTogWzMsIDNdXHJcbiAgLy8gICAgIH0sIH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMjQnLCBlbmdhZ2VyczogMTcsIGJvdW5jZWQ6IDE4LCBiaWxsYWJsZTogMTIsIG1pc3NlZE9wcG9ydHVuaXR5OiA3LCBjb252ZXJzaW9uOiAxNiwgZXhwZW5zZXM6IDMwLCBjb2x1bW5TZXR0aW5nczoge1xyXG4gIC8vICAgICAgIGZpbGxPcGFjaXR5OiAwLjMsXHJcbiAgLy8gICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgLy8gICAgICAgc3Ryb2tlRGFzaGFycmF5OiBbMywgM11cclxuICAvLyAgICAgfSwgfVxyXG4gIC8vICAgXSxcclxuICAvLyAgIGRhdGFzZXQyOiBbXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTYnLCBlbmdhZ2VyczogNSwgYm91bmNlZDogNCwgYmlsbGFibGU6IDMsIG1pc3NlZE9wcG9ydHVuaXR5OiAyLCBjb252ZXJzaW9uOiAxLCBleHBlbnNlczogMTAsIH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTcnLCBlbmdhZ2VyczogOCwgYm91bmNlZDogNiwgYmlsbGFibGU6IDUsIG1pc3NlZE9wcG9ydHVuaXR5OiAzLCBjb252ZXJzaW9uOiAyLCBleHBlbnNlczogMTUgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxOCcsIGVuZ2FnZXJzOiAxMCwgYm91bmNlZDogOCwgYmlsbGFibGU6IDYsIG1pc3NlZE9wcG9ydHVuaXR5OiA0LCBjb252ZXJzaW9uOiAzLCBleHBlbnNlczogMjAgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxOScsIGVuZ2FnZXJzOiAxMiwgYm91bmNlZDogMTAsIGJpbGxhYmxlOiA4LCBtaXNzZWRPcHBvcnR1bml0eTogNSwgY29udmVyc2lvbjogNCwgZXhwZW5zZXM6IDI1IH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMjAnLCBlbmdhZ2VyczogMTUsIGJvdW5jZWQ6IDEyLCBiaWxsYWJsZTogMTAsIG1pc3NlZE9wcG9ydHVuaXR5OiA2LCBjb252ZXJzaW9uOiA1LCBleHBlbnNlczogMzAgfVxyXG4gIC8vICAgXSxcclxuICAvLyAgIGRhdGFzZXQzOiBbXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTYnLCBlbmdhZ2VyczogMTIsIGJvdW5jZWQ6IDExLCBiaWxsYWJsZTogOCwgbWlzc2VkT3Bwb3J0dW5pdHk6IDcsIGNvbnZlcnNpb246IDYsIGV4cGVuc2VzOiAxOCB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDE3JywgZW5nYWdlcnM6IDE0LCBib3VuY2VkOiAxMywgYmlsbGFibGU6IDEwLCBtaXNzZWRPcHBvcnR1bml0eTogOSwgY29udmVyc2lvbjogOCwgZXhwZW5zZXM6IDIyIH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTgnLCBlbmdhZ2VyczogMTgsIGJvdW5jZWQ6IDE1LCBiaWxsYWJsZTogMTIsIG1pc3NlZE9wcG9ydHVuaXR5OiAxMSwgY29udmVyc2lvbjogMTAsIGV4cGVuc2VzOiAyNyB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDE5JywgZW5nYWdlcnM6IDIwLCBib3VuY2VkOiAxOCwgYmlsbGFibGU6IDE1LCBtaXNzZWRPcHBvcnR1bml0eTogMTIsIGNvbnZlcnNpb246IDExLCBleHBlbnNlczogMzIgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAyMCcsIGVuZ2FnZXJzOiAyMiwgYm91bmNlZDogMjAsIGJpbGxhYmxlOiAxNywgbWlzc2VkT3Bwb3J0dW5pdHk6IDE0LCBjb252ZXJzaW9uOiAxMiwgZXhwZW5zZXM6IDM3IH1cclxuICAvLyAgIF1cclxuICAvLyB9O1xyXG4gIHR5cGU6IGFueSA9IFwiZGFpbHlcIjtcclxuICAvLyBjdXJyZW50RGF0YSA9IHRoaXMuZGF0YS5kYXRhc2V0MTtcclxuICBwcml2YXRlIHNoYXJlZFRvb2x0aXA6IGFtNS5Ub29sdGlwO1xyXG4gIHNlbGVjdFZhbHVlPSBuZXcgRm9ybUNvbnRyb2woXCJkYXRhc2V0MVwiKTtcclxuICBwcml2YXRlIGNsaWNrTGlzdGVuZXI6ICgpID0+IHZvaWQ7XHJcbiAgb2JqRGF0YTogYW55O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIGdldEZvb3RmYWxsVHJlbmREYXRhOiBhbnk7XHJcbiAgcHJvY2Vzc1R5cGU9XCJmb290ZmFsbFwiXHJcbiAgdHlwZVZhbHVlOiBhbnk7XHJcbiAgaGVhZGVyRGF0YTogYW55O1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lLHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxwcml2YXRlIHNlcnZpY2U6IFRyYWZmaWNTZXJ2aWNlLCBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG4gICAgb2Zmc2V0OiBudW1iZXIgPSAxO1xyXG4gICAgbGltaXQ6IG51bWJlciA9IDEwO1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgICB0aGlzLm9iakRhdGEgPSB7XHJcbiAgICAgICAgICAgIGZyb21EYXRlOiB0aGlzLmhlYWRlckRhdGEuZGF0ZS5zdGFydERhdGUsXHJcbiAgICAgICAgICAgIHRvRGF0ZTogdGhpcy5oZWFkZXJEYXRhLmRhdGUuZW5kRGF0ZSxcclxuICAgICAgICAgICAgc3RvcmVJZDogIGRhdGEuc3RvcmVzLmZpbHRlcigoc3RvcmU6YW55KSA9PiBzdG9yZS5jaGVja2VkKS5tYXAoKHN0b3JlOmFueSkgPT4gc3RvcmUuc3RvcmVJZCksXHJcbiAgICAgICAgICAgIGNsaWVudElkOmRhdGEuY2xpZW50LFxyXG4gICAgICAgICAgICBwcm9jZXNzVHlwZTogdGhpcy5wcm9jZXNzVHlwZSxcclxuICAgICAgICAgICAgZmlsdGVyQnk6dGhpcy5wcm9jZXNzVHlwZSxcclxuICAgICAgICAgICAgbGltaXQ6dGhpcy5saW1pdCxcclxuICAgICAgICAgICAgb2Zmc2V0OnRoaXMub2Zmc2V0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5mb290ZmFsbFRyZW5kKCk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdFZhbHVlLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkRhdGFzZXRDaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyB0aGlzLm9uRGF0YXNldENoYW5nZSh0aGlzLnNlbGVjdFZhbHVlLnZhbHVlKTtcclxuICAgICAgICBcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJvb3QpIHtcclxuICAgICAgdGhpcy5yb290LmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIGZvb3RmYWxsVHJlbmQoKXsgIFxyXG4gICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAuZ2V0Zm9vdGZhbGxUcmVuZCh0aGlzLm9iakRhdGEpXHJcbiAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICA/LnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRGb290ZmFsbFRyZW5kRGF0YSA9IHJlcz8uZGF0YS5mb290ZmFsbFRyZW5kRGF0YTtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpOyBcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jcmVhdGVDaGFydCgpLCAwKTsgLy8gQ2FsbCB3aXRoIGEgZGVsYXkgdG8gZW5zdXJlIHRoZSBlbGVtZW50IGlzIGluIHRoZSBET01cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHt9LFxyXG4gICAgfSk7XHJcbiAgICBcclxuICB9XHJcbiAgc2VsZWN0UGxhbih0eXBlOiBhbnkpIHtcclxuICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcbiAgICAvLyB0aGlzLmN1cnJlbnREYXRhID0gdGhpcy5kYXRhLmRhdGFzZXQyO1xyXG4gICAgdGhpcy51cGRhdGVDaGFydERhdGEoKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUNoYXJ0KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNoYXJ0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJGb290ZmFsbHRyZW5kXCIpO1xyXG4gICAgICBpZiAoIWNoYXJ0RGl2KSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBmaW5kIEhUTUwgZWxlbWVudCB3aXRoIGlkIGBGb290ZmFsbHRyZW5kYFwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMucm9vdCkge1xyXG4gICAgICAgIHRoaXMucm9vdC5kaXNwb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIHRoaXMucm9vdCA9IGFtNS5Sb290Lm5ldygnRm9vdGZhbGx0cmVuZCcpO1xyXG4gICAgdGhpcy5yb290LnNldFRoZW1lcyhbYW01dGhlbWVzX0FuaW1hdGVkLm5ldyh0aGlzLnJvb3QpXSk7XHJcblxyXG4gICAgdGhpcy5jaGFydCA9IHRoaXMucm9vdC5jb250YWluZXIuY2hpbGRyZW4ucHVzaChcclxuICAgICAgYW01eHkuWFlDaGFydC5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgcGFuWDogZmFsc2UsXHJcbiAgICAgICAgcGFuWTogZmFsc2UsXHJcbiAgICAgICAgd2hlZWxYOiAncGFuWCcsXHJcbiAgICAgICAgd2hlZWxZOiAnem9vbVgnLFxyXG4gICAgICAgIGxheW91dDogdGhpcy5yb290LnZlcnRpY2FsTGF5b3V0XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuY2hhcnQuc2V0KFwic2Nyb2xsYmFyWFwiLCBhbTUuU2Nyb2xsYmFyLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiXHJcbiAgICB9KSk7XHJcblxyXG4gICAgY29uc3QgeEF4aXMgPSB0aGlzLmNoYXJ0LnhBeGVzLnB1c2goXHJcbiAgICAgIGFtNXh5LkNhdGVnb3J5QXhpcy5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ3N0b3JlTmFtZScsXHJcbiAgICAgICAgcmVuZGVyZXI6IGFtNXh5LkF4aXNSZW5kZXJlclgubmV3KHRoaXMucm9vdCwge1xyXG4gICAgICAgICAgbWluR3JpZERpc3RhbmNlOiAzMFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRvb2x0aXA6IGFtNS5Ub29sdGlwLm5ldyh0aGlzLnJvb3QsIHt9KVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEgPSB0aGlzLmdldEZvb3RmYWxsVHJlbmREYXRhPy5tYXAoXHJcbiAgICAgIChpdGVtOiBhbnkpID0+ICh7XHJcbiAgICAgICAgc3RvcmVOYW1lOiBpdGVtLnN0b3JlTmFtZSxcclxuICAgICAgICBmb290ZmFsbDogTnVtYmVyKGl0ZW0uZm9vdGZhbGxSYXRlKSxcclxuICAgICAgICBjb252ZXJzaW9uOiBOdW1iZXIoaXRlbS5jb252ZXJzaW9uUmF0ZSksXHJcbiAgICAgICAgYm91bmNlZDogTnVtYmVyKGl0ZW0uYm91bmNlZFJhdGUpLFxyXG4gICAgICAgIGVuZ2FnZXJzOiBOdW1iZXIoaXRlbS5lbmdhZ2Vyc1JhdGUpLFxyXG4gICAgICAgIG1pc3NlZG9wcG9ydHVuaXRpZXM6IE51bWJlcihpdGVtLm1pc3NlZG9wcG9ydHVuaXRpZXNSYXRlKSxcclxuICAgICAgICBhdmdEb3duVGltZTogTnVtYmVyKGl0ZW0uYXZnRG93blRpbWUpLFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHhBeGlzLmRhdGEuc2V0QWxsKHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEpO1xyXG5cclxuICAgIGNvbnN0IHlBeGlzID0gdGhpcy5jaGFydC55QXhlcy5wdXNoKFxyXG4gICAgICBhbTV4eS5WYWx1ZUF4aXMubmV3KHRoaXMucm9vdCwge1xyXG4gICAgICAgIHJlbmRlcmVyOiBhbTV4eS5BeGlzUmVuZGVyZXJZLm5ldyh0aGlzLnJvb3QsIHt9KVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBTZXQgdGhlIHRpdGxlIG9mIHRoZSB5LWF4aXNcclxuICAgIHlBeGlzLmNoaWxkcmVuLnVuc2hpZnQoYW01LkxhYmVsLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgcm90YXRpb246IC05MCxcclxuICAgICAgdGV4dDogJ0Zvb3RmYWxsJyxcclxuICAgICAgeTogYW01LnA1MCxcclxuICAgICAgY2VudGVyWDogYW01LnA1MFxyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlQ29sdW1uU2VyaWVzKCdFbmdhZ2VycycsICdlbmdhZ2VycycsIHhBeGlzLCB5QXhpcywgZmFsc2UsIGFtNS5jb2xvcigweEIzRTNGRikpO1xyXG4gICAgdGhpcy5jcmVhdGVDb2x1bW5TZXJpZXMoJ0JvdW5jZWQnLCAnYm91bmNlZCcsIHhBeGlzLCB5QXhpcywgdHJ1ZSwgYW01LmNvbG9yKDB4ODBEMUZGKSk7XHJcbiAgICB0aGlzLmNyZWF0ZUNvbHVtblNlcmllcygnQmlsbGFibGUnLCAnZm9vdGZhbGwnLCB4QXhpcywgeUF4aXMsIHRydWUsIGFtNS5jb2xvcigweDY2QzhGRikpO1xyXG4gICAgdGhpcy5jcmVhdGVDb2x1bW5TZXJpZXMoJ01pc3NlZCBPcHBvcnR1bml0eScsICdtaXNzZWRvcHBvcnR1bml0aWVzJywgeEF4aXMsIHlBeGlzLCB0cnVlLCBhbTUuY29sb3IoMHg0REJGRkYpKTtcclxuICAgIHRoaXMuY3JlYXRlQ29sdW1uU2VyaWVzKCdDb252ZXJzaW9uJywgJ2NvbnZlcnNpb24nLCB4QXhpcywgeUF4aXMsIHRydWUsIGFtNS5jb2xvcigweDMzQjVGRikpO1xyXG4gICAgdGhpcy5jcmVhdGVMaW5lU2VyaWVzKCdFeHBlbnNlcycsICdhdmdEb3duVGltZScsIHhBeGlzLCB5QXhpcywgYW01LmNvbG9yKDB4MzNCNUZGKSk7XHJcblxyXG4gICAgY29uc3QgbGVnZW5kID0gdGhpcy5jaGFydC5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICBhbTUuTGVnZW5kLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICBjZW50ZXJYOiBhbTUucDUwLFxyXG4gICAgICAgIHg6IGFtNS5wNTBcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgbGVnZW5kLmRhdGEuc2V0QWxsKHRoaXMuY2hhcnQuc2VyaWVzLnZhbHVlcyk7XHJcblxyXG4gICAgdGhpcy5jaGFydC5zZXQoJ2N1cnNvcicsIGFtNXh5LlhZQ3Vyc29yLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgYmVoYXZpb3I6ICdub25lJ1xyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuY2hhcnQuc2VyaWVzLmVhY2goKHNlcmllczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChzZXJpZXMuY29sdW1ucykge1xyXG4gICAgICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLnNldChcImludGVyYWN0aXZlXCIsIHRydWUpO1xyXG4gICAgICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLmV2ZW50cy5vbihcImNsaWNrXCIsIChldjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhID0gZXYudGFyZ2V0LmRhdGFJdGVtLmRhdGFDb250ZXh0O1xyXG4gICAgICAgICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBldi5vcmlnaW5hbEV2ZW50O1xyXG4gICAgICAgICAgdGhpcy5zaG93VG9vbHRpcChkYXRhLCBjbGllbnRYLCBjbGllbnRZKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNoYXJ0LmFwcGVhcigxMDAwLCAxMDApO1xyXG4gIH0sMClcclxuICB9XHJcblxyXG4gIHRvb2x0aXBWaXNpYmxlID0gZmFsc2U7XHJcbiAgc2hvd1Rvb2x0aXAoZGF0YTogYW55LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy50b29sdGlwVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy50b29sdGlwRGF0YSA9IGRhdGE7XHJcbiAgICBjb25zdCB0b29sdGlwRWxlbWVudCA9IHRoaXMudG9vbHRpcENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gIFxyXG4gICAgLy8gU2V0IHRvb2x0aXAgY29udGVudCBhbmQgbWFrZSBpdCB2aXNpYmxlIHRvIGNhbGN1bGF0ZSBkaW1lbnNpb25zXHJcbiAgICB0b29sdGlwRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsgLy8gTWFrZSBpdCBpbnZpc2libGUgYnV0IHN0aWxsIHByZXNlbnQgaW4gdGhlIERPTVxyXG4gIFxyXG4gICAgLy8gRm9yY2UgYSByZWZsb3cgdG8gZW5zdXJlIGRpbWVuc2lvbnMgYXJlIHVwLXRvLWRhdGVcclxuICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgIFxyXG4gICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgZXZlbnQgbG9vcCB0byBnZXQgYWNjdXJhdGUgZGltZW5zaW9uc1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRvb2x0aXBXaWR0aCA9IHRvb2x0aXBFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICBjb25zdCB0b29sdGlwSGVpZ2h0ID0gdG9vbHRpcEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgICBjb25zdCBzY3JlZW5IZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgXHJcbiAgICAgIC8vIENhbGN1bGF0ZSBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlIHJpZ2h0IHNpZGUsIG90aGVyd2lzZSBwbGFjZSBpdCBvbiB0aGUgbGVmdFxyXG4gICAgICBpZiAoeCArIHRvb2x0aXBXaWR0aCA+IHNjcmVlbldpZHRoKSB7XHJcbiAgICAgICAgdG9vbHRpcEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke3ggLSB0b29sdGlwV2lkdGh9cHhgO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHt4fXB4YDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvLyBDYWxjdWxhdGUgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF0IHRoZSBib3R0b20sIG90aGVyd2lzZSBwbGFjZSBpdCBhdCB0aGUgdG9wXHJcbiAgICAgIGlmICh5ICsgdG9vbHRpcEhlaWdodCA+IHNjcmVlbkhlaWdodCkge1xyXG4gICAgICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLnRvcCA9IGAke3kgLSB0b29sdGlwSGVpZ2h0fXB4YDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0b29sdGlwRWxlbWVudC5zdHlsZS50b3AgPSBgJHt5fXB4YDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICB0b29sdGlwRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOyAvLyBNYWtlIGl0IHZpc2libGUgYWdhaW5cclxuICAgICAgdGhpcy50b29sdGlwVmlzaWJsZSA9IHRydWU7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGhpZGVUb29sdGlwKCk6IHZvaWQge1xyXG4gICAgdGhpcy50b29sdGlwVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgY29uc3QgdG9vbHRpcEVsZW1lbnQgPSB0aGlzLnRvb2x0aXBDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgdG9vbHRpcEVsZW1lbnQgPSB0aGlzLnRvb2x0aXBDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgd2FzIG91dHNpZGUgdGhlIHRvb2x0aXBcclxuICAgIGlmICh0b29sdGlwRWxlbWVudCAmJiAhdG9vbHRpcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpICYmIHRoaXMudG9vbHRpcFZpc2libGUpIHtcclxuICAgICAgdGhpcy5oaWRlVG9vbHRpcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBcclxuICBcclxuICAvLyBvcGVuTW9kYWwoZGF0YTogYW55LGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKSB7XHJcbiAgLy8gICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQ2hhcnREZXRhaWxNb2RhbENvbXBvbmVudCx7XHJcbiAgLy8gICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gIC8vICAgICB3aW5kb3dDbGFzczogJ2N1c3RvbS1tb2RhbCcsXHJcbiAgLy8gICAgIHNpemU6IFwic21cIixcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IGRhdGE7XHJcbiAgLy8gICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRYID0gY2xpZW50WDtcclxuICAvLyAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsaWVudFkgPSBjbGllbnRZO1xyXG4gIC8vIH1cclxuICBcclxuXHJcbiAgb25EYXRhc2V0Q2hhbmdlKHNlbGVjdGVkVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gY29uc3Qgc2VsZWN0ZWREYXRhc2V0ID0gc2VsZWN0ZWRWYWx1ZSBhcyBrZXlvZiBEYXRhc2V0O1xyXG4gICAgLy8gdGhpcy5jdXJyZW50RGF0YSA9IHRoaXMuZGF0YVtzZWxlY3RlZERhdGFzZXRdO1xyXG4gICAgdGhpcy51cGRhdGVDaGFydERhdGEoKTtcclxuICAgIC8vIHRoaXMudXBkYXRlWUF4aXNMYWJlbChzZWxlY3RlZFZhbHVlKTtcclxuICB9XHJcbiAgLy8gdXBkYXRlWUF4aXNMYWJlbChzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAvLyAgIGNvbnN0IG5ld0xhYmVsVGV4dCA9IGBGb290ZmFsbCAtICR7c2VsZWN0ZWRWYWx1ZX1gOyAvLyBDdXN0b21pemUgeW91ciBsYWJlbCB0ZXh0IGFzIG5lZWRlZFxyXG4gIC8vICAgY29uc29sZS5sb2coJ1VwZGF0aW5nIFktYXhpcyBsYWJlbCB0bzonLCBuZXdMYWJlbFRleHQpO1xyXG4gIC8vICAgY29uc3QgbGFiZWwgPSB0aGlzLnlBeGlzLmNoaWxkcmVuLmdldEluZGV4KDApIGFzIGFtNS5MYWJlbDtcclxuICAvLyAgIGxhYmVsLnNldChcInRleHRcIiwgbmV3TGFiZWxUZXh0KTtcclxuICAvLyB9XHJcbiAgdXBkYXRlQ2hhcnREYXRhKCk6IHZvaWQge1xyXG4gICAgY29uc3QgeEF4aXMgPSB0aGlzLmNoYXJ0LnhBeGVzLmdldEluZGV4KDApIGFzIGFtNXh5LkNhdGVnb3J5QXhpczxhbTV4eS5BeGlzUmVuZGVyZXI+O1xyXG4gICAgeEF4aXMuZGF0YS5zZXRBbGwodGhpcy5nZXRGb290ZmFsbFRyZW5kRGF0YSk7XHJcblxyXG4gICAgdGhpcy5jaGFydC5zZXJpZXMuZWFjaCgoc2VyaWVzOiBhbnkpID0+IHtcclxuICAgICAgc2VyaWVzLmRhdGEuc2V0QWxsKHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVDb2x1bW5TZXJpZXMobmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgeEF4aXM6IGFtNXh5LkNhdGVnb3J5QXhpczxhbTV4eS5BeGlzUmVuZGVyZXI+LCB5QXhpczogYW01eHkuVmFsdWVBeGlzPGFtNXh5LkF4aXNSZW5kZXJlcj4sIHN0YWNrZWQ6IGJvb2xlYW4sY29sb3I6IGFtNS5Db2xvcik6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5jaGFydC5zZXJpZXMucHVzaChcclxuICAgICAgYW01eHkuQ29sdW1uU2VyaWVzLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICAgIHhBeGlzOiB4QXhpcyxcclxuICAgICAgICB5QXhpczogeUF4aXMsXHJcbiAgICAgICAgdmFsdWVZRmllbGQ6IGZpZWxkTmFtZSxcclxuICAgICAgICBjYXRlZ29yeVhGaWVsZDogJ3N0b3JlTmFtZScsXHJcbiAgICAgICAgc3RhY2tlZDogc3RhY2tlZCxcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgc2VyaWVzLmRhdGEuc2V0QWxsKHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEpO1xyXG5cclxuICAvLyBBZGFwdGVyIHRvIGFwcGx5IGN1c3RvbSBjb2x1bW4gc2V0dGluZ3NcclxuICBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS5hZGFwdGVycy5hZGQoXCJmaWxsT3BhY2l0eVwiLCAoZmlsbE9wYWNpdHk6YW55LCB0YXJnZXQ6YW55KSA9PiB7XHJcbiAgICBjb25zdCBkYXRhSXRlbSA9IHRhcmdldC5kYXRhSXRlbS5kYXRhQ29udGV4dCBhcyBhbnk7XHJcbiAgICByZXR1cm4gZGF0YUl0ZW0uY29sdW1uU2V0dGluZ3MgPyBkYXRhSXRlbS5jb2x1bW5TZXR0aW5ncy5maWxsT3BhY2l0eSA6IGZpbGxPcGFjaXR5O1xyXG4gIH0pO1xyXG5cclxuICBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS5hZGFwdGVycy5hZGQoXCJzdHJva2VEYXNoYXJyYXlcIiwgKHN0cm9rZURhc2hhcnJheTphbnksIHRhcmdldDphbnkpID0+IHtcclxuICAgIGNvbnN0IGRhdGFJdGVtID0gdGFyZ2V0LmRhdGFJdGVtLmRhdGFDb250ZXh0IGFzIGFueTtcclxuICAgIHJldHVybiBkYXRhSXRlbS5jb2x1bW5TZXR0aW5ncyA/IGRhdGFJdGVtLmNvbHVtblNldHRpbmdzLnN0cm9rZURhc2hhcnJheSA6IHN0cm9rZURhc2hhcnJheTtcclxuICB9KTtcclxuXHJcbiAgc2VyaWVzLmNvbHVtbnMudGVtcGxhdGUuYWRhcHRlcnMuYWRkKFwic3Ryb2tlV2lkdGhcIiwgKHN0cm9rZVdpZHRoOmFueSwgdGFyZ2V0OmFueSkgPT4ge1xyXG4gICAgY29uc3QgZGF0YUl0ZW0gPSB0YXJnZXQuZGF0YUl0ZW0uZGF0YUNvbnRleHQgYXMgYW55O1xyXG4gICAgcmV0dXJuIGRhdGFJdGVtLmNvbHVtblNldHRpbmdzID8gZGF0YUl0ZW0uY29sdW1uU2V0dGluZ3Muc3Ryb2tlV2lkdGggOiBzdHJva2VXaWR0aDtcclxuICB9KTtcclxuICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLnNldEFsbCh7XHJcbiAgICAvLyAgIHRvb2x0aXBUZXh0OiBcIntuYW1lfToge3ZhbHVlWS5mb3JtYXROdW1iZXIoJyMuIycpfSVcIiwgLy8gRW5zdXJlIHByb3BlciBmb3JtYXR0aW5nIGZvciBzaW5nbGUgdmFsdWUgZGlzcGxheVxyXG4gICAgLy8gICB0b29sdGlwWTogYW01LnBlcmNlbnQoMTApLFxyXG4gICAgICBmaWxsOiBjb2xvciwgLy8gU2V0IGN1c3RvbSBmaWxsIGNvbG9yIGZvciB0aGUgYmFyc1xyXG4gICAgICBzdHJva2U6IGNvbG9yIC8vIFNldCBjdXN0b20gc3Ryb2tlIGNvbG9yIGZvciB0aGUgYmFyc1xyXG4gICAgfSk7XHJcblxyXG4gICAgc2VyaWVzLmJ1bGxldHMucHVzaCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBhbTUuQnVsbGV0Lm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICBzcHJpdGU6IGFtNS5MYWJlbC5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgICB0ZXh0OiBcInt2YWx1ZVkuZm9ybWF0TnVtYmVyKCcjLiMnKX0lXCIsXHJcbiAgICAgICAgICBmaWxsOiB0aGlzLnJvb3QuaW50ZXJmYWNlQ29sb3JzLmdldChcImFsdGVybmF0aXZlVGV4dFwiKSxcclxuICAgICAgICAgIGNlbnRlclk6IGFtNS5wNTAsXHJcbiAgICAgICAgICBjZW50ZXJYOiBhbTUucDUwLFxyXG4gICAgICAgICAgcG9wdWxhdGVUZXh0OiB0cnVlLFxyXG4gICAgICAgICAgZm9udFNpemU6IDEyICAvLyBSZWR1Y2UgZm9udCBzaXplXHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBzZXJpZXMuYXBwZWFyKCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGNyZWF0ZUxpbmVTZXJpZXMobmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgeEF4aXM6IGFtNXh5LkNhdGVnb3J5QXhpczxhbTV4eS5BeGlzUmVuZGVyZXI+LCB5QXhpczogYW01eHkuVmFsdWVBeGlzPGFtNXh5LkF4aXNSZW5kZXJlcj4sY29sb3I6IGFtNS5Db2xvcik6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5jaGFydC5zZXJpZXMucHVzaChcclxuICAgICAgYW01eHkuTGluZVNlcmllcy5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICB4QXhpczogeEF4aXMsXHJcbiAgICAgICAgeUF4aXM6IHlBeGlzLFxyXG4gICAgICAgIHZhbHVlWUZpZWxkOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgY2F0ZWdvcnlYRmllbGQ6ICdzdG9yZU5hbWUnLFxyXG4gICAgICAgIHRvb2x0aXA6IGFtNS5Ub29sdGlwLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICAgIHBvaW50ZXJPcmllbnRhdGlvbjogXCJob3Jpem9udGFsXCIsXHJcbiAgICAgICAgICBsYWJlbFRleHQ6IFwie25hbWV9OiB7dmFsdWVZLmZvcm1hdE51bWJlcignIy4jJyl9JVwiLFxyXG4gICAgICAgICAgYmFja2dyb3VuZDogYW01LlJlY3RhbmdsZS5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgICAgIGZpbGw6IGFtNS5jb2xvcigweGZmY2MwMCkgLy8gU2V0IHRoZSBkZXNpcmVkIHRvb2x0aXAgYmFja2dyb3VuZCBjb2xvclxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICBzZXJpZXMuc3Ryb2tlcy50ZW1wbGF0ZS5zZXRBbGwoe1xyXG4gICAgICBzdHJva2VXaWR0aDogMixcclxuICAgICAgc3Ryb2tlOiBjb2xvcixcclxuICAgICAgIHRlbXBsYXRlRmllbGQ6IFwic3Ryb2tlU2V0dGluZ3NcIixcclxuICAgICAgIGZvbnRTaXplOiAxMiAgLy8gUmVkdWNlIGZvbnQgc2l6ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgc2VyaWVzLmRhdGEuc2V0QWxsKHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEpO1xyXG5cclxuICAgICAgLy8gQWRhcHRlciB0byBhcHBseSBjdXN0b20gc3Ryb2tlIHNldHRpbmdzXHJcbiAgICAgIHNlcmllcy5zdHJva2VzLnRlbXBsYXRlLmFkYXB0ZXJzLmFkZChcInN0cm9rZVwiLCAoc3Ryb2tlOmFueSwgdGFyZ2V0OmFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGFJdGVtID0gdGFyZ2V0LmRhdGFJdGVtO1xyXG4gICAgICAgIGlmIChkYXRhSXRlbSAmJiBkYXRhSXRlbS5kYXRhQ29udGV4dCAmJiBkYXRhSXRlbS5kYXRhQ29udGV4dC5zdHJva2VTZXR0aW5ncykge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGFJdGVtLmRhdGFDb250ZXh0LnN0cm9rZVNldHRpbmdzLnN0cm9rZSA/PyBzdHJva2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJva2U7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgc2VyaWVzLnN0cm9rZXMudGVtcGxhdGUuYWRhcHRlcnMuYWRkKFwic3Ryb2tlV2lkdGhcIiwgKHN0cm9rZVdpZHRoOmFueSwgdGFyZ2V0OmFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGFJdGVtID0gdGFyZ2V0LmRhdGFJdGVtO1xyXG4gICAgICAgIGlmIChkYXRhSXRlbSAmJiBkYXRhSXRlbS5kYXRhQ29udGV4dCAmJiBkYXRhSXRlbS5kYXRhQ29udGV4dC5zdHJva2VTZXR0aW5ncykge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGFJdGVtLmRhdGFDb250ZXh0LnN0cm9rZVNldHRpbmdzLnN0cm9rZVdpZHRoID8/IHN0cm9rZVdpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3Ryb2tlV2lkdGg7XHJcbiAgICAgIH0pO1xyXG5cclxuICBzZXJpZXMuc3Ryb2tlcy50ZW1wbGF0ZS5hZGFwdGVycy5hZGQoXCJzdHJva2VEYXNoYXJyYXlcIiwgKHN0cm9rZURhc2hhcnJheTphbnksIHRhcmdldDphbnkpID0+IHtcclxuICAgIGNvbnN0IGRhdGFJdGVtID0gdGFyZ2V0LmRhdGFJdGVtO1xyXG4gICAgaWYgKGRhdGFJdGVtICYmIGRhdGFJdGVtLmRhdGFDb250ZXh0ICYmIGRhdGFJdGVtLmRhdGFDb250ZXh0LnN0cm9rZVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBkYXRhSXRlbS5kYXRhQ29udGV4dC5zdHJva2VTZXR0aW5ncy5zdHJva2VEYXNoYXJyYXkgPz8gc3Ryb2tlRGFzaGFycmF5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cm9rZURhc2hhcnJheTtcclxuICB9KTtcclxuXHJcbiAgICBzZXJpZXMuYnVsbGV0cy5wdXNoKCgpID0+IHtcclxuICAgICAgcmV0dXJuIGFtNS5CdWxsZXQubmV3KHRoaXMucm9vdCwge1xyXG4gICAgICAgIHNwcml0ZTogYW01LkNpcmNsZS5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgICBzdHJva2VXaWR0aDogMSxcclxuICAgICAgICAgIHN0cm9rZTogc2VyaWVzLmdldChcInN0cm9rZVwiKSxcclxuICAgICAgICAgIHJhZGl1czogMSxcclxuICAgICAgICAgIGZpbGw6IHRoaXMucm9vdC5pbnRlcmZhY2VDb2xvcnMuZ2V0KFwiYmFja2dyb3VuZFwiKVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNlcmllcy5hcHBlYXIoKTtcclxuICB9XHJcblxyXG5cclxuICBjaGFuZ2VTdGF0dXModHlwZTphbnkpe1xyXG50aGlzLnR5cGVWYWx1ZSA9IHR5cGU7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBwdC0zXCI+XHJcbiAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtbGFiZWwgbWItMlwiPkZvb3RmYWxsIFRyZW5kPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc3ViIG1iLTJcIj5CYXNlZCBvbiAzMSBNYXksIDIwMjTigJMgMDYgSnVuLCAyMDI0PC9zcGFuPlxyXG4gICAgICAgIDwvaDM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhciB0ZXh0LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwb3NpdGlvbi1yZWxhdGl2ZSBteS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLWJlZ2luOjpOYXYgZ3JvdXAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWdyb3VwIG5hdi1ncm91cC1vdXRsaW5lIGJvcmRlci0xIGJ0bi1ncm91cCBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIFtuZ0NsYXNzXT1cInR5cGUgPT09ICdkYWlseSc/ICdhY3RpdmVQbGFuQnRuJzonaW5hY3RpdmVQbGFuQnRuJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGxhbignZGFpbHknKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFpbHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lICBweC02IHB5LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidHlwZSA9PT0gJ3dlZWsnPyAnYWN0aXZlUGxhbkJ0bic6J2luYWN0aXZlUGxhbkJ0bidcIiAoY2xpY2spPVwic2VsZWN0UGxhbignd2VlaycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWVrXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHB4LTYgcHktM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0eXBlID09PSAnbW9udGgnPyAnYWN0aXZlUGxhbkJ0bic6J2luYWN0aXZlUGxhbkJ0bidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFBsYW4oJ21vbnRoJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1lbmQ6Ok5hdiBncm91cC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0yIG10LTNcIj5UcmVuZDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJzZWxlY3RWYWx1ZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJkYXRhc2V0c1wiIGNsYXNzPVwidy0xMDBcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgKGNoYW5nZSk9XCJvbkRhdGFzZXRDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZGF0YXNldCBvZiBkYXRhc2V0c1wiIFt2YWx1ZV09XCJkYXRhc2V0LnZhbHVlXCI+e3sgZGF0YXNldC5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWZsZXggbXMtMyBjdXJzb3ItcG9pbnRlciB0ZXh0LW5vd3JhcFwiPkZvcmVjYXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMjY0NV8yNzQ1OSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy4zMzM5OCAxLjMzMzMxTDMuNDYwNjUgMS45NTk5OEMzLjU1MTQyIDIuNDA5OTggMy43NTY4MyAyLjgyODkzIDQuMDU2OTkgMy4xNzYyOEM0LjM1NzE1IDMuNTIzNjIgNC43NDE4OSAzLjc4NzU5IDUuMTczOTggMy45NDI2NUw1LjMzMzk4IDMuOTk5OThMNS4xNzM5OCA0LjA1NzMxQzQuNzQxODkgNC4yMTIzNyA0LjM1NzE1IDQuNDc2MzQgNC4wNTY5OSA0LjgyMzY4QzMuNzU2ODMgNS4xNzEwMyAzLjU1MTQyIDUuNTg5OTggMy40NjA2NSA2LjAzOTk4TDMuMzMzOTggNi42NjY2NUwzLjIwNzMyIDYuMDM5OThDMy4xMTY1NCA1LjU4OTk4IDIuOTExMTQgNS4xNzEwMyAyLjYxMDk4IDQuODIzNjhDMi4zMTA4MiA0LjQ3NjM0IDEuOTI2MDcgNC4yMTIzNyAxLjQ5Mzk4IDQuMDU3MzFMMS4zMzM5OCAzLjk5OTk4TDEuNDkzOTggMy45NDI2NUMxLjkyNjA3IDMuNzg3NTkgMi4zMTA4MiAzLjUyMzYyIDIuNjEwOTggMy4xNzYyOEMyLjkxMTE0IDIuODI4OTMgMy4xMTY1NCAyLjQwOTk4IDMuMjA3MzIgMS45NTk5OEwzLjMzMzk4IDEuMzMzMzFaTTUuMzMzOTggMTAuNjY2Nkw1LjQ4NzMyIDExLjUxNzNDNS41MjcxMyAxMS43MzkyIDUuNjIyNTYgMTEuOTQ3NCA1Ljc2NDY4IDEyLjEyMjRDNS45MDY4IDEyLjI5NzQgNi4wOTA5OCAxMi40MzM1IDYuMjk5OTggMTIuNTE4TDYuNjY3MzIgMTIuNjY2Nkw2LjI5OTk4IDEyLjgxNTNDNi4wOTA5NCAxMi44OTk3IDUuOTA2NjggMTMuMDM1NiA1Ljc2NDQ1IDEzLjIxMDVDNS42MjIyMSAxMy4zODU0IDUuNTI2NjMgMTMuNTkzNSA1LjQ4NjY1IDEzLjgxNTNMNS4zMzM5OCAxNC42NjY2TDUuMTgwNjUgMTMuODE2QzUuMTQwODQgMTMuNTk0MSA1LjA0NTQxIDEzLjM4NTkgNC45MDMyOSAxMy4yMTA5QzQuNzYxMTcgMTMuMDM1OSA0LjU3Njk5IDEyLjg5OTggNC4zNjc5OCAxMi44MTUzTDQuMDAwNjUgMTIuNjY2Nkw0LjM2Nzk4IDEyLjUxOEM0LjU3NzAzIDEyLjQzMzYgNC43NjEyOSAxMi4yOTc3IDQuOTAzNTIgMTIuMTIyOEM1LjA0NTc2IDExLjk0NzkgNS4xNDEzMyAxMS43Mzk4IDUuMTgxMzIgMTEuNTE4TDUuMzMzOTggMTAuNjY2NlpNMTAuNjY3MyAxLjk5OTk4TDExLjAzOCAzLjc2OTMxQzExLjIyNjkgNC42NzEzNyAxMS42NDYzIDUuNTA5MDggMTIuMjU1NCA2LjIwMDc2QzEyLjg2NDUgNi44OTI0NCAxMy42NDI0IDcuNDE0NDggMTQuNTEzMyA3LjcxNTk4TDE1LjMzNCA3Ljk5OTk4TDE0LjUxMzMgOC4yODM5OEMxMy42NDI0IDguNTg1NDggMTIuODY0NSA5LjEwNzUyIDEyLjI1NTQgOS43OTkyQzExLjY0NjMgMTAuNDkwOSAxMS4yMjY5IDExLjMyODYgMTEuMDM4IDEyLjIzMDZMMTAuNjY3MyAxNEwxMC4yOTY3IDEyLjIzMDZDMTAuMTA3NyAxMS4zMjg2IDkuNjg4MyAxMC40OTA5IDkuMDc5MjIgOS43OTkyQzguNDcwMTUgOS4xMDc1MiA3LjY5MjIzIDguNTg1NDggNi44MjEzMiA4LjI4Mzk4TDYuMDAwNjUgNy45OTk5OEw2LjgyMTMyIDcuNzE1OThDNy42OTIyMyA3LjQxNDQ4IDguNDcwMTUgNi44OTI0NCA5LjA3OTIyIDYuMjAwNzZDOS42ODgzIDUuNTA5MDggMTAuMTA3NyA0LjY3MTM3IDEwLjI5NjcgMy43NjkzMUwxMC42NjczIDEuOTk5OThaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzI2NDVfMjc0NTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG14LTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZHJvcGRvd24xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDEwSDE1TTIuNSA1SDE3LjVNNy41IDE1SDEyLjVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgW25nQ2xhc3NdPVwidHlwZVZhbHVlID09PSdub3JtYWlsemUnID8gJ2JnLWZvcmNhc3QnOicnXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU3RhdHVzKCdub3JtYWlsemUnKVwiPk5vcm1haWx6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInRleHQtZW5kXCIgKm5nSWY9XCJ0eXBlVmFsdWUgPT09J25vcm1haWx6ZScgPyAnYmctZm9yY2FzdCc6JydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMjcgNEw1Ljk5OTM1IDExLjMzMzNMMi42NjYwMiA4XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBbbmdDbGFzc109XCJ0eXBlVmFsdWUgPT09J2F2ZXJhZ2UnID8gJ2JnLWZvcmNhc3QnOicnXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU3RhdHVzKCdhdmVyYWdlJylcIj5BdmVyYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInR5cGVWYWx1ZSA9PT0nYXZlcmFnZScgPyAnYmctZm9yY2FzdCc6JydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMjcgNEw1Ljk5OTM1IDExLjMzMzNMMi42NjYwMiA4XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBbbmdDbGFzc109XCJ0eXBlVmFsdWUgPT09J3RhcmdldCcgPyAnYmctZm9yY2FzdCc6JydcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTdGF0dXMoJ3RhcmdldCcpXCI+VGFyZ2V0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInR5cGVWYWx1ZSA9PT0ndGFyZ2V0JyA/ICdiZy1mb3JjYXN0JzonJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMjcgNEw1Ljk5OTM1IDExLjMzMzNMMi42NjYwMiA4XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9idXR0b24+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIFtuZ0NsYXNzXT1cInR5cGVWYWx1ZSA9PT0nd2Vla2VuZCcgPyAnYmctZm9yY2FzdCc6JydcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTdGF0dXMoJ3dlZWtlbmQnKVwiPldlZWtlbmRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInR5cGVWYWx1ZSA9PT0nd2Vla2VuZCcgPyAnYmctZm9yY2FzdCc6JydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMy4zMzI3IDRMNS45OTkzNSAxMS4zMzMzTDIuNjY2MDIgOFwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvYnV0dG9uPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBbbmdDbGFzc109XCJ0eXBlVmFsdWUgPT09J3dlZWtkYXlzJyA/ICdiZy1mb3JjYXN0JzonJ1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVN0YXR1cygnd2Vla2RheXMnKVwiPldlZWtkYXlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInR5cGVWYWx1ZSA9PT0nd2Vla2RheXMnID8gJ2JnLWZvcmNhc3QnOicnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMy4zMzI3IDRMNS45OTkzNSAxMS4zMzMzTDIuNjY2MDIgOFwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiIGlkPVwiRm9vdGZhbGx0cmVuZFwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgI3Rvb2x0aXBDb250YWluZXIgY2xhc3M9XCJ0b29sdGlwLWNvbnRhaW5lclwiID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2x0aXAtY29udGVudFwiICpuZ0lmPVwidG9vbHRpcERhdGFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50IHAtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZSB0ZXh0LXN0YXJ0XCI+e3t0b29sdGlwRGF0YS5zdG9yZU5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSBsYWJlbFwiPlRvdGFsIEZvb3RmYWxsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIHZhbHVlXCI+MTAwPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIGxhYmVsXCI+Qm91bmNlZCBGb290ZmFsbDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSB2YWx1ZVwiPnt7dG9vbHRpcERhdGEuYm91bmNlZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIGxhYmVsXCI+RW5nYWdlcnM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gdmFsdWVcIj57e3Rvb2x0aXBEYXRhLmVuZ2FnZXJzfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gbGFiZWxcIj5BdmcgRHdlbGwgVGltZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSB2YWx1ZVwiPjM0IE1pbnM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gbGFiZWxcIj5Db252ZXJzaW9uIFJhdGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gdmFsdWVcIj57e3Rvb2x0aXBEYXRhLmNvbnZlcnNpb259fSU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gbGFiZWxcIj5NaXNzZWQgT3Bwb3J0dW5pdGllczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSB2YWx1ZVwiPnt7dG9vbHRpcERhdGEubWlzc2Vkb3Bwb3J0dW5pdGllc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIGxhYmVsXCI+RG93biBUaW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIHZhbHVlXCI+MjMlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXgtMyBteS0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtM1wiPjxzdmcgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgdmlld0JveD1cIjAgMCAzNiAzNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0RBRjFGRlwiLz5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjRcIi8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4LjY2NjcgMTEuMzMzNEwxMiAxOS4zMzM0SDE4TDE3LjMzMzMgMjQuNjY2N0wyNCAxNi42NjY3SDE4TDE4LjY2NjcgMTEuMzMzNFpcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0yIG15LTJcIj48c3BhbiBjbGFzcz1cInRleHQtd2Vla1wiPldlZWtlbmQgc3RhZmZpbmcgbG93ZXIgdGhhbiB3ZWVrZGF5czwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJ0ZXh0LWNhdXNlIG1zLTJcIj5jYXVzZSBwb3RlbnRpYWxseSAyMCUgZmV3ZXIgd2Vla2VuZCBjb252ZXJzaW9ucy48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==