@c8y/ngx-components 1021.64.0 → 1021.67.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 (162) hide show
  1. package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts +7 -2
  2. package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts.map +1 -1
  3. package/core/breadcrumb/breadcrumb-item.component.d.ts +1 -1
  4. package/core/breadcrumb/breadcrumb-item.component.d.ts.map +1 -1
  5. package/core/breadcrumb/breadcrumb-outlet.component.d.ts +1 -1
  6. package/core/breadcrumb/breadcrumb-outlet.component.d.ts.map +1 -1
  7. package/core/breadcrumb/breadcrumb.component.d.ts +1 -1
  8. package/core/breadcrumb/breadcrumb.component.d.ts.map +1 -1
  9. package/core/breadcrumb/breadcrumb.module.d.ts +7 -7
  10. package/core/breadcrumb/breadcrumb.module.d.ts.map +1 -1
  11. package/core/common/common.module.d.ts +38 -38
  12. package/core/common/date-format.service.d.ts +30 -0
  13. package/core/common/date-format.service.d.ts.map +1 -0
  14. package/core/common/date.pipe.d.ts +7 -3
  15. package/core/common/date.pipe.d.ts.map +1 -1
  16. package/core/common/index.d.ts +1 -0
  17. package/core/common/index.d.ts.map +1 -1
  18. package/core/common/outlet.directive.d.ts +1 -1
  19. package/core/common/outlet.directive.d.ts.map +1 -1
  20. package/core/common/user-preferences/user-preferences-store-current-user.d.ts +11 -0
  21. package/core/common/user-preferences/user-preferences-store-current-user.d.ts.map +1 -0
  22. package/core/common/user-preferences/user-preferences.service.d.ts +40 -1
  23. package/core/common/user-preferences/user-preferences.service.d.ts.map +1 -1
  24. package/core/date-picker/date-picker.component.d.ts +3 -1
  25. package/core/date-picker/date-picker.component.d.ts.map +1 -1
  26. package/core/date-time-picker/date-time-picker.component.d.ts +6 -3
  27. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  28. package/core/dynamic-forms/date/date.type.component.d.ts +3 -0
  29. package/core/dynamic-forms/date/date.type.component.d.ts.map +1 -1
  30. package/core/plugins/plugins.service.d.ts +3 -1
  31. package/core/plugins/plugins.service.d.ts.map +1 -1
  32. package/core/time-interval/time-interval.component.d.ts +4 -2
  33. package/core/time-interval/time-interval.component.d.ts.map +1 -1
  34. package/ecosystem/ecosystem.module.d.ts +2 -1
  35. package/ecosystem/ecosystem.module.d.ts.map +1 -1
  36. package/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.d.ts +15 -0
  37. package/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.d.ts.map +1 -0
  38. package/ecosystem/packages/package-changelog.guard.d.ts +10 -0
  39. package/ecosystem/packages/package-changelog.guard.d.ts.map +1 -0
  40. package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts +2 -0
  41. package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts.map +1 -1
  42. package/ecosystem/shared/index.d.ts +1 -0
  43. package/ecosystem/shared/index.d.ts.map +1 -1
  44. package/ecosystem/shared/package-changelog/package-changelog.component.d.ts +24 -0
  45. package/ecosystem/shared/package-changelog/package-changelog.component.d.ts.map +1 -0
  46. package/ecosystem/shared/shared-ecosystem.module.d.ts +2 -1
  47. package/ecosystem/shared/shared-ecosystem.module.d.ts.map +1 -1
  48. package/esm2022/auth-configuration/sso-configuration/template-parts/signature-configuration.component.mjs +11 -7
  49. package/esm2022/core/breadcrumb/breadcrumb-item.component.mjs +3 -3
  50. package/esm2022/core/breadcrumb/breadcrumb-outlet.component.mjs +19 -9
  51. package/esm2022/core/breadcrumb/breadcrumb.component.mjs +3 -3
  52. package/esm2022/core/breadcrumb/breadcrumb.module.mjs +16 -5
  53. package/esm2022/core/common/common.module.mjs +6 -6
  54. package/esm2022/core/common/date-format.service.mjs +81 -0
  55. package/esm2022/core/common/date.pipe.mjs +29 -6
  56. package/esm2022/core/common/index.mjs +2 -1
  57. package/esm2022/core/common/outlet.directive.mjs +4 -3
  58. package/esm2022/core/common/user-preferences/user-preferences-store-current-user.mjs +22 -0
  59. package/esm2022/core/common/user-preferences/user-preferences.service.mjs +106 -16
  60. package/esm2022/core/date-picker/date-picker.component.mjs +11 -4
  61. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +20 -11
  62. package/esm2022/core/dynamic-forms/date/date.type.component.mjs +12 -4
  63. package/esm2022/core/plugins/plugins.service.mjs +14 -8
  64. package/esm2022/core/time-interval/time-interval.component.mjs +9 -2
  65. package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +4 -4
  66. package/esm2022/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.mjs +3 -3
  67. package/esm2022/ecosystem/ecosystem.module.mjs +21 -5
  68. package/esm2022/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.mjs +33 -0
  69. package/esm2022/ecosystem/packages/package-changelog.guard.mjs +22 -0
  70. package/esm2022/ecosystem/packages/package-versions/package-contents/packages-contents.component.mjs +17 -5
  71. package/esm2022/ecosystem/shared/index.mjs +2 -1
  72. package/esm2022/ecosystem/shared/package-changelog/package-changelog.component.mjs +82 -0
  73. package/esm2022/ecosystem/shared/package-version-select/package-version-select.component.mjs +3 -3
  74. package/esm2022/ecosystem/shared/shared-ecosystem.module.mjs +12 -6
  75. package/esm2022/operations/bulk-operation-scheduler/operation-scheduler.component.mjs +9 -7
  76. package/esm2022/operations/bulk-operations-list/bulk-operations-list.component.mjs +1 -1
  77. package/esm2022/upgrade/ng1/downgraded.services.mjs +3 -2
  78. package/esm2022/upgrade/ng1/index.mjs +3 -2
  79. package/esm2022/widgets/cockpit/index.mjs +3 -1
  80. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  81. package/esm2022/widgets/definitions/index.mjs +2 -1
  82. package/esm2022/widgets/definitions/radial-gauge/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +5 -0
  83. package/esm2022/widgets/definitions/radial-gauge/index.mjs +33 -0
  84. package/esm2022/widgets/implementations/info-gauge/index.mjs +2 -2
  85. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.mjs +295 -0
  86. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.mjs +141 -11
  87. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.mjs +67 -0
  88. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.mjs +34 -6
  89. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget.module.mjs +9 -4
  90. package/esm2022/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.mjs +97 -0
  91. package/esm2022/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.mjs +369 -0
  92. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +9 -5
  93. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  94. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +5 -5
  95. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  96. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +94 -11
  97. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  98. package/fesm2022/c8y-ngx-components-ecosystem.mjs +83 -14
  99. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  100. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +7 -5
  101. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
  102. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +1 -1
  103. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  104. package/fesm2022/c8y-ngx-components-upgrade.mjs +3 -1
  105. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  106. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  107. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  108. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +2 -0
  109. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  110. package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +40 -0
  111. package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -0
  112. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  113. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  114. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +991 -28
  115. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  116. package/fesm2022/c8y-ngx-components.mjs +809 -552
  117. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  118. package/locales/de.po +42 -6
  119. package/locales/es.po +42 -6
  120. package/locales/fr.po +42 -6
  121. package/locales/ja_JP.po +42 -6
  122. package/locales/ko.po +42 -6
  123. package/locales/locales.pot +40 -4
  124. package/locales/nl.po +42 -6
  125. package/locales/pl.po +42 -6
  126. package/locales/pt_BR.po +42 -6
  127. package/locales/zh_CN.po +42 -6
  128. package/locales/zh_TW.po +42 -6
  129. package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts +4 -2
  130. package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts.map +1 -1
  131. package/package.json +1 -1
  132. package/upgrade/ng1/downgraded.services.d.ts +1 -0
  133. package/upgrade/ng1/downgraded.services.d.ts.map +1 -1
  134. package/upgrade/ng1/index.d.ts.map +1 -1
  135. package/widgets/cockpit/index.d.ts +29 -0
  136. package/widgets/cockpit/index.d.ts.map +1 -1
  137. package/widgets/cockpit-exports/index.d.ts +6 -0
  138. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  139. package/widgets/definitions/index.d.ts +1 -0
  140. package/widgets/definitions/index.d.ts.map +1 -1
  141. package/widgets/definitions/radial-gauge/c8y-ngx-components-widgets-definitions-radial-gauge.d.ts.map +1 -0
  142. package/widgets/definitions/radial-gauge/index.d.ts +33 -0
  143. package/widgets/definitions/radial-gauge/index.d.ts.map +1 -0
  144. package/widgets/implementations/info-gauge/index.d.ts +1 -1
  145. package/widgets/implementations/info-gauge/index.d.ts.map +1 -1
  146. package/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.d.ts +339 -0
  147. package/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.d.ts.map +1 -0
  148. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts +27 -7
  149. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts.map +1 -1
  150. package/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.d.ts +33 -0
  151. package/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.d.ts.map +1 -0
  152. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts +7 -3
  153. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts.map +1 -1
  154. package/widgets/implementations/info-gauge/info-gauge-widget.module.d.ts +2 -1
  155. package/widgets/implementations/info-gauge/info-gauge-widget.module.d.ts.map +1 -1
  156. package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.d.ts +37 -0
  157. package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.d.ts.map +1 -0
  158. package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.d.ts +146 -0
  159. package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.d.ts.map +1 -0
  160. package/esm2022/widgets/implementations/info-gauge/info-gauge.model.mjs +0 -2
  161. package/widgets/implementations/info-gauge/info-gauge.model.d.ts +0 -7
  162. package/widgets/implementations/info-gauge/info-gauge.model.d.ts.map +0 -1
@@ -1,14 +1,23 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Input, Optional, ViewChild } from '@angular/core';
2
2
  import { ControlContainer, FormBuilder, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';
3
3
  import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
4
4
  import { WidgetConfigComponent } from '@c8y/ngx-components/context-dashboard';
5
- import { CoreModule } from '@c8y/ngx-components';
5
+ import { CommonModule, DynamicComponentComponent, FormGroupComponent, FormsModule, gettext, MeasurementRealtimeService, MessagesComponent } from '@c8y/ngx-components';
6
+ import { Subject, takeUntil } from 'rxjs';
7
+ import { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';
8
+ import { RadialGaugeViewComponent } from '../radial-gauge/radial-gauge.component';
9
+ import { InfoGaugeCurrentMeasurementPipe } from '../current-measurement.pipe';
10
+ import { GAUGE_PRESET_NAMES, GAUGE_PRESETS } from './gauge.model';
11
+ import { EditorComponent, MonacoEditorMarkerValidatorDirective } from '@c8y/ngx-components/editor';
12
+ import { CollapseModule } from 'ngx-bootstrap/collapse';
13
+ import { PresetPreviewComponent } from './preset-preview/preset-preview.component';
6
14
  import * as i0 from "@angular/core";
7
15
  import * as i1 from "@angular/forms";
8
16
  import * as i2 from "@c8y/ngx-components/context-dashboard";
9
17
  import * as i3 from "@c8y/ngx-components";
10
18
  import * as i4 from "@angular/common";
11
- import * as i5 from "@c8y/ngx-components/datapoint-selector";
19
+ import * as i5 from "ngx-bootstrap/collapse";
20
+ import * as i6 from "@c8y/ngx-components/datapoint-selector";
12
21
  function ensureAtLeastOneDatapointSelectedAndActive(datapointListAttributes) {
13
22
  return (control) => {
14
23
  const formValue = control.value;
@@ -25,24 +34,37 @@ function ensureAtLeastOneDatapointSelectedAndActive(datapointListAttributes) {
25
34
  };
26
35
  }
27
36
  export class InfoGaugeWidgetConfigComponent {
28
- constructor(formBuilder, form, widgetConfig) {
37
+ constructor(formBuilder, form, widgetConfig, dynamicComponent) {
29
38
  this.formBuilder = formBuilder;
30
39
  this.form = form;
31
40
  this.widgetConfig = widgetConfig;
41
+ this.dynamicComponent = dynamicComponent;
32
42
  this.datapointSelectionConfig = {};
33
43
  this.defaultFormOptions = {
34
44
  showRedRange: true,
35
45
  showYellowRange: true,
36
- showRange: true
46
+ showRange: true,
47
+ selectableChartRenderTypes: []
37
48
  };
49
+ this.showAdvancedOptions = false;
50
+ this.gaugeOptionsString = '';
51
+ this.showAdvancedOptionsLabel = gettext('Show advanced options');
52
+ this.hideAdvancedOptionsLabel = gettext('Hide advanced options');
53
+ this.ALL_GAUGE_PRESETS = [...GAUGE_PRESETS];
38
54
  this.limits = {
39
55
  numberOfDecimalPlacesMax: 10,
40
56
  numberOfDecimalPlacesMin: 0
41
57
  };
58
+ this.GAUGE_PRESETS = GAUGE_PRESETS;
59
+ this.destroy$ = new Subject();
42
60
  }
43
61
  onBeforeSave(config) {
44
62
  if (this.formGroup.valid) {
45
63
  Object.assign(config, this.formGroup.value);
64
+ Object.assign(config, {
65
+ gaugeOptions: this.gaugeOptions,
66
+ selectedPresetId: this.isInfoGauge ? null : this.getPresetId(this.gaugeOptions)
67
+ });
46
68
  return true;
47
69
  }
48
70
  return false;
@@ -61,6 +83,95 @@ export class InfoGaugeWidgetConfigComponent {
61
83
  if (typeof this.config?.fractionSize === 'number' && !Number.isNaN(this.config?.fractionSize)) {
62
84
  this.formGroup.patchValue({ fractionSize: this.config.fractionSize });
63
85
  }
86
+ this.isInfoGauge = this.dynamicComponent?.componentId === defaultWidgetIds.INFO_GAUGE;
87
+ const isRadialGauge = !this.isInfoGauge;
88
+ if (isRadialGauge) {
89
+ this.setupRadialGauge();
90
+ }
91
+ this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {
92
+ if (value.datapointsGauge) {
93
+ this.activeDatapointGauge = value.datapointsGauge.find(dp => dp.__active);
94
+ }
95
+ });
96
+ }
97
+ ngOnDestroy() {
98
+ this.destroy$.next();
99
+ this.destroy$.complete();
100
+ }
101
+ onRadioPresetChange(presetId) {
102
+ // Find the selected preset
103
+ const selectedPreset = this.ALL_GAUGE_PRESETS.find(preset => preset.id === presetId);
104
+ if (selectedPreset) {
105
+ this.gaugeOptions = { ...selectedPreset }; // Update gaugeOptions with the selected preset
106
+ this.gaugeOptionsString = JSON.stringify(this.gaugeOptions, null, 2);
107
+ // If the selected preset is not custom, hide advanced options
108
+ if (selectedPreset.id !== 'custom') {
109
+ this.showAdvancedOptions = false;
110
+ }
111
+ // Update the form control value
112
+ this.formGroup.patchValue({ gaugePresetId: selectedPreset.id });
113
+ }
114
+ }
115
+ async assignSchema() {
116
+ const { schema } = await import('c8y-schema-loader?interfaceName=GaugeOptions!@c8y/ngx-components/widgets/implementations/info-gauge');
117
+ this.editorComponent.monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
118
+ validate: true,
119
+ schemas: [
120
+ {
121
+ uri: 'gauge-schema.json',
122
+ schema: schema,
123
+ fileMatch: ['*']
124
+ }
125
+ ],
126
+ enableSchemaRequest: false,
127
+ allowComments: false
128
+ });
129
+ }
130
+ gaugeJSONChange(value) {
131
+ try {
132
+ const parsedOptions = JSON.parse(value);
133
+ // Check if the parsed options match any existing preset
134
+ const matchingPreset = this.GAUGE_PRESETS.find(preset => JSON.stringify(preset) === JSON.stringify(parsedOptions));
135
+ if (matchingPreset) {
136
+ this.formGroup.patchValue({ gaugePresetId: matchingPreset.id });
137
+ }
138
+ else {
139
+ this.gaugeOptions = parsedOptions;
140
+ this.gaugeOptions.name = GAUGE_PRESET_NAMES.CUSTOM;
141
+ this.gaugeOptions.id = 'custom';
142
+ const customPresetExists = this.ALL_GAUGE_PRESETS.some(preset => preset.id === 'custom');
143
+ if (!customPresetExists) {
144
+ this.ALL_GAUGE_PRESETS = [...this.ALL_GAUGE_PRESETS, this.gaugeOptions];
145
+ }
146
+ else {
147
+ this.ALL_GAUGE_PRESETS = this.ALL_GAUGE_PRESETS.map(preset => preset.id === 'custom' ? this.gaugeOptions : preset);
148
+ }
149
+ this.formGroup.patchValue({ gaugePresetId: 'custom' });
150
+ }
151
+ }
152
+ catch (error) {
153
+ console.error('Invalid JSON:', error);
154
+ }
155
+ }
156
+ trackByFn(_index, item) {
157
+ return item.id;
158
+ }
159
+ getPresetId(gaugeOptions) {
160
+ const matchingPreset = this.GAUGE_PRESETS.find(preset => preset.id === gaugeOptions.id);
161
+ return matchingPreset ? matchingPreset.id : 'custom';
162
+ }
163
+ setupRadialGauge() {
164
+ if (this.config.datapoints && !this.config.datapointsGauge) {
165
+ this.config.datapointsGauge = this.config.datapoints;
166
+ }
167
+ this.gaugeOptions = this.config.gaugeOptions || { ...this.GAUGE_PRESETS[0] };
168
+ if (this.config.selectedPresetId === 'custom') {
169
+ this.gaugeOptions.name = GAUGE_PRESET_NAMES.CUSTOM;
170
+ this.gaugeOptions.id = 'custom';
171
+ this.ALL_GAUGE_PRESETS = [...this.GAUGE_PRESETS, this.config.gaugeOptions];
172
+ this.formGroup.patchValue({ gaugePresetId: 'custom' });
173
+ }
174
+ this.gaugeOptionsString = JSON.stringify(this.gaugeOptions, null, 2);
64
175
  }
65
176
  initForm() {
66
177
  this.formGroup = this.createForm();
@@ -78,20 +189,39 @@ export class InfoGaugeWidgetConfigComponent {
78
189
  ]
79
190
  ],
80
191
  datapointsLabels: this.formBuilder.control(new Array(), []),
81
- datapointsGauge: this.formBuilder.control(new Array(), [])
192
+ datapointsGauge: this.formBuilder.control(new Array(), []),
193
+ gaugePresetId: [this.config.selectedPresetId || 'default']
82
194
  }, {
83
195
  validators: [
84
196
  ensureAtLeastOneDatapointSelectedAndActive(['datapointsLabels', 'datapointsGauge'])
85
197
  ]
86
198
  });
87
199
  }
88
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InfoGaugeWidgetConfigComponent, deps: [{ token: i1.FormBuilder }, { token: i1.NgForm }, { token: i2.WidgetConfigComponent }], target: i0.ɵɵFactoryTarget.Component }); }
89
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InfoGaugeWidgetConfigComponent, isStandalone: true, selector: "c8y-info-gauge-widget-config", inputs: { config: "config" }, ngImport: i0, template: "<div class=\"p-l-24 p-r-24\">\n <form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n >\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group class=\"p-t-8\">\n <label translate>Decimal places</label>\n <input\n class=\"form-control\"\n name=\"fractionSize\"\n type=\"number\"\n formControlName=\"fractionSize\"\n step=\"1\"\n />\n <c8y-messages [show]=\"formGroup.controls.fractionSize.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6 p-t-8\">\n <div\n class=\"alert alert-info\"\n role=\"alert\"\n *ngIf=\"formGroup.errors?.noActiveDatapoint\"\n translate\n >\n At least one data point for the labels or the gauge needs to be selected.\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n name=\"datapoints\"\n listTitle=\"{{ 'Multiple label and value pairs' | translate }}\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n formControlName=\"datapointsLabels\"\n ></c8y-datapoint-selection-list>\n </div>\n <div class=\"col-md-6\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n name=\"datapoints\"\n listTitle=\"{{ 'Gauge`display`' | translate }}\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n [maxActiveCount]=\"1\"\n formControlName=\"datapointsGauge\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i3.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i5.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
200
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InfoGaugeWidgetConfigComponent, deps: [{ token: i1.FormBuilder }, { token: i1.NgForm }, { token: i2.WidgetConfigComponent }, { token: i3.DynamicComponentComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
201
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InfoGaugeWidgetConfigComponent, isStandalone: true, selector: "c8y-info-gauge-widget-config", inputs: { config: "config" }, providers: [MeasurementRealtimeService], viewQueries: [{ propertyName: "editorComponent", first: true, predicate: EditorComponent, descendants: true }], ngImport: i0, template: "<form\n class=\"fit-h\"\n [formGroup]=\"formGroup\"\n>\n <div\n class=\"m-l-16 m-r-16\"\n *ngIf=\"isInfoGauge; else radialGauge\"\n >\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group class=\"p-t-8\">\n <label translate>Decimal places</label>\n <input\n class=\"form-control\"\n name=\"fractionSize\"\n type=\"number\"\n formControlName=\"fractionSize\"\n step=\"1\"\n />\n <c8y-messages [show]=\"formGroup.controls.fractionSize.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6 p-t-8\">\n <div\n class=\"alert alert-info\"\n role=\"alert\"\n *ngIf=\"formGroup.errors?.noActiveDatapoint\"\n translate\n >\n At least one data point for the labels or the gauge needs to be selected.\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Multiple label and value pairs' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n formControlName=\"datapointsLabels\"\n ></c8y-datapoint-selection-list>\n </div>\n <div class=\"col-md-6\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Gauge`display`' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n [maxActiveCount]=\"1\"\n formControlName=\"datapointsGauge\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n </div>\n\n <ng-template #radialGauge>\n <div class=\"d-flex-md fit-h\">\n <div class=\"col-md-6 inner-scroll p-0 bg-component\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit d-block\"\n listTitle=\"{{ 'Data points`display`' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n [maxActiveCount]=\"1\"\n formControlName=\"datapointsGauge\"\n ></c8y-datapoint-selection-list>\n\n <c8y-form-group class=\"p-t-8 p-r-16 p-l-16\">\n <label translate>Decimal places</label>\n <input\n class=\"form-control\"\n name=\"fractionSize\"\n type=\"number\"\n formControlName=\"fractionSize\"\n step=\"1\"\n />\n <c8y-messages [show]=\"formGroup.controls.fractionSize.errors\"></c8y-messages>\n </c8y-form-group>\n\n <div class=\"form-group p-r-16 p-l-16 m-b-0\">\n <legend>\n {{ 'Presets' | translate }}\n </legend>\n <c8y-preset-preview\n formControlName=\"gaugePresetId\"\n [ALL_GAUGE_PRESETS]=\"ALL_GAUGE_PRESETS\"\n (onPresetChange)=\"onRadioPresetChange($event)\"\n ></c8y-preset-preview>\n </div>\n\n <div class=\"p-16\">\n <button\n class=\"btn btn-default\"\n aria-controls=\"advancedCollapse\"\n [attr.aria-expanded]=\"showAdvancedOptions\"\n type=\"button\"\n (click)=\"showAdvancedOptions = !showAdvancedOptions\"\n >\n {{ showAdvancedOptions ? hideAdvancedOptionsLabel : showAdvancedOptionsLabel }}\n </button>\n </div>\n\n <div\n class=\"collapse\"\n id=\"advancedCollapse\"\n [collapse]=\"!showAdvancedOptions\"\n [isAnimated]=\"true\"\n >\n <div\n class=\"fit-h\"\n style=\"min-height: 400px\"\n >\n <c8y-editor\n [ngModel]=\"gaugeOptionsString\"\n (ngModelChange)=\"gaugeJSONChange($event)\"\n (editorInit)=\"assignSchema()\"\n [ngModelOptions]=\"{ standalone: true }\"\n monacoEditorMarkerValidator\n ></c8y-editor>\n </div>\n </div>\n </div>\n <div\n class=\"col-md-6\"\n *ngIf=\"\n this.formGroup.value.datapointsGauge.length > 0 && activeDatapointGauge;\n else emptyState\n \"\n >\n <!-- Radial Gauge -->\n <c8y-radial-gauge\n class=\"c8y-radial-gauge--square\"\n *ngIf=\"activeDatapointGauge | infoGaugeCurrentMeasurement | async as measurement\"\n [activeDatapointGauge]=\"activeDatapointGauge\"\n [measurement]=\"measurement\"\n [fractionSize]=\"formGroup.value.fractionSize\"\n [gaugeOptions]=\"gaugeOptions\"\n [selectedPresetId]=\"formGroup.value.gaugePresetId\"\n ></c8y-radial-gauge>\n </div>\n </div>\n </ng-template>\n</form>\n\n<ng-template #emptyState>\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'Please select a data point first.' | translate\"\n [horizontal]=\"false\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i5.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: EditorComponent, selector: "c8y-editor", inputs: ["editorOptions"], outputs: ["editorInit"] }, { kind: "directive", type: MonacoEditorMarkerValidatorDirective, selector: "c8y-editor [monacoEditorMarkerValidator]" }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i6.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "component", type: RadialGaugeViewComponent, selector: "c8y-radial-gauge", inputs: ["activeDatapointGauge", "measurement", "fractionSize", "gaugeOptions", "selectedPresetId"] }, { kind: "pipe", type: InfoGaugeCurrentMeasurementPipe, name: "infoGaugeCurrentMeasurement" }, { kind: "component", type: PresetPreviewComponent, selector: "c8y-preset-preview", inputs: ["ALL_GAUGE_PRESETS"], outputs: ["onPresetChange"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
90
202
  }
91
203
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InfoGaugeWidgetConfigComponent, decorators: [{
92
204
  type: Component,
93
- args: [{ selector: 'c8y-info-gauge-widget-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], standalone: true, imports: [CoreModule, ReactiveFormsModule, DatapointSelectorModule], template: "<div class=\"p-l-24 p-r-24\">\n <form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n >\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group class=\"p-t-8\">\n <label translate>Decimal places</label>\n <input\n class=\"form-control\"\n name=\"fractionSize\"\n type=\"number\"\n formControlName=\"fractionSize\"\n step=\"1\"\n />\n <c8y-messages [show]=\"formGroup.controls.fractionSize.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6 p-t-8\">\n <div\n class=\"alert alert-info\"\n role=\"alert\"\n *ngIf=\"formGroup.errors?.noActiveDatapoint\"\n translate\n >\n At least one data point for the labels or the gauge needs to be selected.\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n name=\"datapoints\"\n listTitle=\"{{ 'Multiple label and value pairs' | translate }}\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n formControlName=\"datapointsLabels\"\n ></c8y-datapoint-selection-list>\n </div>\n <div class=\"col-md-6\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n name=\"datapoints\"\n listTitle=\"{{ 'Gauge`display`' | translate }}\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n [maxActiveCount]=\"1\"\n formControlName=\"datapointsGauge\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n </form>\n</div>\n" }]
94
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i1.NgForm }, { type: i2.WidgetConfigComponent }], propDecorators: { config: [{
205
+ args: [{ selector: 'c8y-info-gauge-widget-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], providers: [MeasurementRealtimeService], standalone: true, imports: [
206
+ FormGroupComponent,
207
+ MessagesComponent,
208
+ CommonModule,
209
+ FormsModule,
210
+ CollapseModule,
211
+ ReactiveFormsModule,
212
+ EditorComponent,
213
+ MonacoEditorMarkerValidatorDirective,
214
+ DatapointSelectorModule,
215
+ RadialGaugeViewComponent,
216
+ InfoGaugeCurrentMeasurementPipe,
217
+ PresetPreviewComponent
218
+ ], template: "<form\n class=\"fit-h\"\n [formGroup]=\"formGroup\"\n>\n <div\n class=\"m-l-16 m-r-16\"\n *ngIf=\"isInfoGauge; else radialGauge\"\n >\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group class=\"p-t-8\">\n <label translate>Decimal places</label>\n <input\n class=\"form-control\"\n name=\"fractionSize\"\n type=\"number\"\n formControlName=\"fractionSize\"\n step=\"1\"\n />\n <c8y-messages [show]=\"formGroup.controls.fractionSize.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6 p-t-8\">\n <div\n class=\"alert alert-info\"\n role=\"alert\"\n *ngIf=\"formGroup.errors?.noActiveDatapoint\"\n translate\n >\n At least one data point for the labels or the gauge needs to be selected.\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Multiple label and value pairs' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n formControlName=\"datapointsLabels\"\n ></c8y-datapoint-selection-list>\n </div>\n <div class=\"col-md-6\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Gauge`display`' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n [maxActiveCount]=\"1\"\n formControlName=\"datapointsGauge\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n </div>\n\n <ng-template #radialGauge>\n <div class=\"d-flex-md fit-h\">\n <div class=\"col-md-6 inner-scroll p-0 bg-component\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit d-block\"\n listTitle=\"{{ 'Data points`display`' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"0\"\n [maxActiveCount]=\"1\"\n formControlName=\"datapointsGauge\"\n ></c8y-datapoint-selection-list>\n\n <c8y-form-group class=\"p-t-8 p-r-16 p-l-16\">\n <label translate>Decimal places</label>\n <input\n class=\"form-control\"\n name=\"fractionSize\"\n type=\"number\"\n formControlName=\"fractionSize\"\n step=\"1\"\n />\n <c8y-messages [show]=\"formGroup.controls.fractionSize.errors\"></c8y-messages>\n </c8y-form-group>\n\n <div class=\"form-group p-r-16 p-l-16 m-b-0\">\n <legend>\n {{ 'Presets' | translate }}\n </legend>\n <c8y-preset-preview\n formControlName=\"gaugePresetId\"\n [ALL_GAUGE_PRESETS]=\"ALL_GAUGE_PRESETS\"\n (onPresetChange)=\"onRadioPresetChange($event)\"\n ></c8y-preset-preview>\n </div>\n\n <div class=\"p-16\">\n <button\n class=\"btn btn-default\"\n aria-controls=\"advancedCollapse\"\n [attr.aria-expanded]=\"showAdvancedOptions\"\n type=\"button\"\n (click)=\"showAdvancedOptions = !showAdvancedOptions\"\n >\n {{ showAdvancedOptions ? hideAdvancedOptionsLabel : showAdvancedOptionsLabel }}\n </button>\n </div>\n\n <div\n class=\"collapse\"\n id=\"advancedCollapse\"\n [collapse]=\"!showAdvancedOptions\"\n [isAnimated]=\"true\"\n >\n <div\n class=\"fit-h\"\n style=\"min-height: 400px\"\n >\n <c8y-editor\n [ngModel]=\"gaugeOptionsString\"\n (ngModelChange)=\"gaugeJSONChange($event)\"\n (editorInit)=\"assignSchema()\"\n [ngModelOptions]=\"{ standalone: true }\"\n monacoEditorMarkerValidator\n ></c8y-editor>\n </div>\n </div>\n </div>\n <div\n class=\"col-md-6\"\n *ngIf=\"\n this.formGroup.value.datapointsGauge.length > 0 && activeDatapointGauge;\n else emptyState\n \"\n >\n <!-- Radial Gauge -->\n <c8y-radial-gauge\n class=\"c8y-radial-gauge--square\"\n *ngIf=\"activeDatapointGauge | infoGaugeCurrentMeasurement | async as measurement\"\n [activeDatapointGauge]=\"activeDatapointGauge\"\n [measurement]=\"measurement\"\n [fractionSize]=\"formGroup.value.fractionSize\"\n [gaugeOptions]=\"gaugeOptions\"\n [selectedPresetId]=\"formGroup.value.gaugePresetId\"\n ></c8y-radial-gauge>\n </div>\n </div>\n </ng-template>\n</form>\n\n<ng-template #emptyState>\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'Please select a data point first.' | translate\"\n [horizontal]=\"false\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n" }]
219
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i1.NgForm }, { type: i2.WidgetConfigComponent }, { type: i3.DynamicComponentComponent, decorators: [{
220
+ type: Optional
221
+ }] }], propDecorators: { config: [{
95
222
  type: Input
223
+ }], editorComponent: [{
224
+ type: ViewChild,
225
+ args: [EditorComponent]
96
226
  }] } });
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby1nYXVnZS13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2luZm8tZ2F1Z2UvaW5mby1nYXVnZS13aWRnZXQtY29uZmlnL2luZm8tZ2F1Z2Utd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9pbmZvLWdhdWdlL2luZm8tZ2F1Z2Utd2lkZ2V0LWNvbmZpZy9pbmZvLWdhdWdlLXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsTUFBTSxFQUNOLG1CQUFtQixFQUVuQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBSXhCLE1BQU0sd0NBQXdDLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQUkvRCxTQUFTLDBDQUEwQyxDQUNqRCx1QkFBaUM7SUFFakMsT0FBTyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtRQUNsQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2hDLEtBQUssTUFBTSxpQkFBaUIsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1lBQ3hELE1BQU0sWUFBWSxHQUFpQixTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3JDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFTRCxNQUFNLE9BQU8sOEJBQThCO0lBY3pDLFlBQ1UsV0FBd0IsRUFDeEIsSUFBWSxFQUNaLFlBQW1DO1FBRm5DLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFkN0MsNkJBQXdCLEdBQTJDLEVBQUUsQ0FBQztRQUN0RSx1QkFBa0IsR0FBMkM7WUFDM0QsWUFBWSxFQUFFLElBQUk7WUFDbEIsZUFBZSxFQUFFLElBQUk7WUFDckIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztRQUNNLFdBQU0sR0FBRztZQUNmLHdCQUF3QixFQUFFLEVBQUU7WUFDNUIsd0JBQXdCLEVBQUUsQ0FBQztTQUNuQixDQUFDO0lBTVIsQ0FBQztJQUVKLFlBQVksQ0FDVixNQUFpRDtRQUVqRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzlGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLFFBQVE7UUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FDM0I7WUFDRSxZQUFZLEVBQUU7Z0JBQ1osQ0FBQztnQkFDRDtvQkFDRSxVQUFVLENBQUMsUUFBUTtvQkFDbkIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDO29CQUNwRCxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUM7aUJBQ3JEO2FBQ0Y7WUFDRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssRUFBYyxFQUFFLEVBQUUsQ0FBQztZQUN2RSxlQUFlLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLEVBQWMsRUFBRSxFQUFFLENBQUM7U0FDdkUsRUFDRDtZQUNFLFVBQVUsRUFBRTtnQkFDViwwQ0FBMEMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUM7YUFDcEY7U0FDRixDQUNGLENBQUM7SUFDSixDQUFDOytHQXhFVSw4QkFBOEI7bUdBQTlCLDhCQUE4QixzSEMvQzNDLDA2REEwREEsMkNEYlksVUFBVSxnd0RBQUUsbUJBQW1CLDhCQUFFLHVCQUF1QiwyU0FGbkQsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7OzRGQUl4RCw4QkFBOEI7a0JBUDFDLFNBQVM7K0JBQ0UsOEJBQThCLGlCQUV6QixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxjQUN2RCxJQUFJLFdBQ1AsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLENBQUM7eUlBRzFELE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sQ29udGFpbmVyLFxuICBGb3JtQnVpbGRlcixcbiAgTmdGb3JtLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBEYXRhcG9pbnRTZWxlY3Rvck1vZHVsZSxcbiAgdHlwZSBEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZyxcbiAgdHlwZSBEYXRhcG9pbnRTZWxlY3Rvck1vZGFsT3B0aW9ucyxcbiAgdHlwZSBLUElEZXRhaWxzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IFdpZGdldENvbmZpZ0NvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHsgQ29yZU1vZHVsZSwgT25CZWZvcmVTYXZlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmZvR2F1Z2VXaWRnZXRDb25maWcgfSBmcm9tICcuLi9pbmZvLWdhdWdlLm1vZGVsJztcblxuZnVuY3Rpb24gZW5zdXJlQXRMZWFzdE9uZURhdGFwb2ludFNlbGVjdGVkQW5kQWN0aXZlKFxuICBkYXRhcG9pbnRMaXN0QXR0cmlidXRlczogc3RyaW5nW11cbik6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGZvciAoY29uc3QgbGlzdEF0dHJpYnV0ZU5hbWUgb2YgZGF0YXBvaW50TGlzdEF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlRm9yTGlzdDogS1BJRGV0YWlsc1tdID0gZm9ybVZhbHVlW2xpc3RBdHRyaWJ1dGVOYW1lXTtcbiAgICAgIGlmICghdmFsdWVGb3JMaXN0IHx8ICFBcnJheS5pc0FycmF5KHZhbHVlRm9yTGlzdCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZUZvckxpc3QuZmluZChkcCA9PiBkcC5fX2FjdGl2ZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG5vQWN0aXZlRGF0YXBvaW50OiB0cnVlIH07XG4gIH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1pbmZvLWdhdWdlLXdpZGdldC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5mby1nYXVnZS13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvcmVNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIERhdGFwb2ludFNlbGVjdG9yTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBJbmZvR2F1Z2VXaWRnZXRDb25maWdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQmVmb3JlU2F2ZSB7XG4gIEBJbnB1dCgpIGNvbmZpZzogSW5mb0dhdWdlV2lkZ2V0Q29uZmlnO1xuICBmb3JtR3JvdXA6IFJldHVyblR5cGU8SW5mb0dhdWdlV2lkZ2V0Q29uZmlnQ29tcG9uZW50WydjcmVhdGVGb3JtJ10+O1xuICBkYXRhcG9pbnRTZWxlY3Rpb25Db25maWc6IFBhcnRpYWw8RGF0YXBvaW50U2VsZWN0b3JNb2RhbE9wdGlvbnM+ID0ge307XG4gIGRlZmF1bHRGb3JtT3B0aW9uczogUGFydGlhbDxEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZz4gPSB7XG4gICAgc2hvd1JlZFJhbmdlOiB0cnVlLFxuICAgIHNob3dZZWxsb3dSYW5nZTogdHJ1ZSxcbiAgICBzaG93UmFuZ2U6IHRydWVcbiAgfTtcbiAgcHJpdmF0ZSBsaW1pdHMgPSB7XG4gICAgbnVtYmVyT2ZEZWNpbWFsUGxhY2VzTWF4OiAxMCxcbiAgICBudW1iZXJPZkRlY2ltYWxQbGFjZXNNaW46IDBcbiAgfSBhcyBjb25zdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGZvcm06IE5nRm9ybSxcbiAgICBwcml2YXRlIHdpZGdldENvbmZpZzogV2lkZ2V0Q29uZmlnQ29tcG9uZW50XG4gICkge31cblxuICBvbkJlZm9yZVNhdmUoXG4gICAgY29uZmlnPzogSW5mb0dhdWdlV2lkZ2V0Q29uZmlnQ29tcG9uZW50Wydjb25maWcnXVxuICApOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cC52YWxpZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihjb25maWcsIHRoaXMuZm9ybUdyb3VwLnZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy53aWRnZXRDb25maWcuY29udGV4dD8uaWQpIHtcbiAgICAgIHRoaXMuZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnLmNvbnRleHRBc3NldCA9IHRoaXMud2lkZ2V0Q29uZmlnPy5jb250ZXh0O1xuICAgIH1cbiAgICB0aGlzLmluaXRGb3JtKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnPy5kYXRhcG9pbnRzTGFiZWxzKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgZGF0YXBvaW50c0xhYmVsczogdGhpcy5jb25maWcuZGF0YXBvaW50c0xhYmVscyB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnPy5kYXRhcG9pbnRzR2F1Z2UpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyBkYXRhcG9pbnRzR2F1Z2U6IHRoaXMuY29uZmlnLmRhdGFwb2ludHNHYXVnZSB9KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZz8uZnJhY3Rpb25TaXplID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKHRoaXMuY29uZmlnPy5mcmFjdGlvblNpemUpKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgZnJhY3Rpb25TaXplOiB0aGlzLmNvbmZpZy5mcmFjdGlvblNpemUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuY3JlYXRlRm9ybSgpO1xuICAgIHRoaXMuZm9ybS5mb3JtLmFkZENvbnRyb2woJ2NvbmZpZycsIHRoaXMuZm9ybUdyb3VwKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cChcbiAgICAgIHtcbiAgICAgICAgZnJhY3Rpb25TaXplOiBbXG4gICAgICAgICAgMixcbiAgICAgICAgICBbXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5taW4odGhpcy5saW1pdHMubnVtYmVyT2ZEZWNpbWFsUGxhY2VzTWluKSxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4KHRoaXMubGltaXRzLm51bWJlck9mRGVjaW1hbFBsYWNlc01heClcbiAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIGRhdGFwb2ludHNMYWJlbHM6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChuZXcgQXJyYXk8S1BJRGV0YWlscz4oKSwgW10pLFxuICAgICAgICBkYXRhcG9pbnRzR2F1Z2U6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChuZXcgQXJyYXk8S1BJRGV0YWlscz4oKSwgW10pXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWxpZGF0b3JzOiBbXG4gICAgICAgICAgZW5zdXJlQXRMZWFzdE9uZURhdGFwb2ludFNlbGVjdGVkQW5kQWN0aXZlKFsnZGF0YXBvaW50c0xhYmVscycsICdkYXRhcG9pbnRzR2F1Z2UnXSlcbiAgICAgICAgXVxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwLWwtMjQgcC1yLTI0XCI+XG4gIDxmb3JtXG4gICAgY2xhc3M9XCJuby1jYXJkLWNvbnRleHRcIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLXQtOFwiPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+RGVjaW1hbCBwbGFjZXM8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgbmFtZT1cImZyYWN0aW9uU2l6ZVwiXG4gICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZyYWN0aW9uU2l6ZVwiXG4gICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8Yzh5LW1lc3NhZ2VzIFtzaG93XT1cImZvcm1Hcm91cC5jb250cm9scy5mcmFjdGlvblNpemUuZXJyb3JzXCI+PC9jOHktbWVzc2FnZXM+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBwLXQtOFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCJcbiAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmVycm9ycz8ubm9BY3RpdmVEYXRhcG9pbnRcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgQXQgbGVhc3Qgb25lIGRhdGEgcG9pbnQgZm9yIHRoZSBsYWJlbHMgb3IgdGhlIGdhdWdlIG5lZWRzIHRvIGJlIHNlbGVjdGVkLlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgIDxjOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0XG4gICAgICAgICAgY2xhc3M9XCJiZy1pbmhlcml0IHNlcGFyYXRvci10b3AgcC10LTE2IGQtYmxvY2tcIlxuICAgICAgICAgIG5hbWU9XCJkYXRhcG9pbnRzXCJcbiAgICAgICAgICBsaXN0VGl0bGU9XCJ7eyAnTXVsdGlwbGUgbGFiZWwgYW5kIHZhbHVlIHBhaXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgW2RlZmF1bHRGb3JtT3B0aW9uc109XCJkZWZhdWx0Rm9ybU9wdGlvbnNcIlxuICAgICAgICAgIFtjb25maWddPVwiZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnXCJcbiAgICAgICAgICBbbWluQWN0aXZlQ291bnRdPVwiMFwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YXBvaW50c0xhYmVsc1wiXG4gICAgICAgID48L2M4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICA8Yzh5LWRhdGFwb2ludC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctaW5oZXJpdCBzZXBhcmF0b3ItdG9wIHAtdC0xNiBkLWJsb2NrXCJcbiAgICAgICAgICBuYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgICAgbGlzdFRpdGxlPVwie3sgJ0dhdWdlYGRpc3BsYXlgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgW2RlZmF1bHRGb3JtT3B0aW9uc109XCJkZWZhdWx0Rm9ybU9wdGlvbnNcIlxuICAgICAgICAgIFtjb25maWddPVwiZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnXCJcbiAgICAgICAgICBbbWluQWN0aXZlQ291bnRdPVwiMFwiXG4gICAgICAgICAgW21heEFjdGl2ZUNvdW50XT1cIjFcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGFwb2ludHNHYXVnZVwiXG4gICAgICAgID48L2M4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9kaXY+XG4iXX0=
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby1nYXVnZS13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2luZm8tZ2F1Z2UvaW5mby1nYXVnZS13aWRnZXQtY29uZmlnL2luZm8tZ2F1Z2Utd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9pbmZvLWdhdWdlL2luZm8tZ2F1Z2Utd2lkZ2V0LWNvbmZpZy9pbmZvLWdhdWdlLXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxNQUFNLEVBQ04sbUJBQW1CLEVBRW5CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCx1QkFBdUIsRUFJeEIsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQ0wsWUFBWSxFQUNaLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLE9BQU8sRUFDUCwwQkFBMEIsRUFDMUIsaUJBQWlCLEVBRWxCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDbEYsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7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QThCLGlCQUV6QixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxhQUN4RCxDQUFDLDBCQUEwQixDQUFDLGNBQzNCLElBQUksV0FDUDt3QkFDUCxrQkFBa0I7d0JBQ2xCLGlCQUFpQjt3QkFDakIsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGNBQWM7d0JBQ2QsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLG9DQUFvQzt3QkFDcEMsdUJBQXVCO3dCQUN2Qix3QkFBd0I7d0JBQ3hCLCtCQUErQjt3QkFDL0Isc0JBQXNCO3FCQUN2Qjs7MEJBaUNFLFFBQVE7eUNBOUJGLE1BQU07c0JBQWQsS0FBSztnQkFDc0IsZUFBZTtzQkFBMUMsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPcHRpb25hbCwgVmlld0NoaWxkLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbENvbnRhaW5lcixcbiAgRm9ybUJ1aWxkZXIsXG4gIE5nRm9ybSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVmFsaWRhdG9yRm4sXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gIHR5cGUgRGF0YXBvaW50QXR0cmlidXRlc0Zvcm1Db25maWcsXG4gIHR5cGUgRGF0YXBvaW50U2VsZWN0b3JNb2RhbE9wdGlvbnMsXG4gIHR5cGUgS1BJRGV0YWlsc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBXaWRnZXRDb25maWdDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2NvbnRleHQtZGFzaGJvYXJkJztcbmltcG9ydCB7XG4gIENvbW1vbk1vZHVsZSxcbiAgRHluYW1pY0NvbXBvbmVudENvbXBvbmVudCxcbiAgRm9ybUdyb3VwQ29tcG9uZW50LFxuICBGb3Jtc01vZHVsZSxcbiAgZ2V0dGV4dCxcbiAgTWVhc3VyZW1lbnRSZWFsdGltZVNlcnZpY2UsXG4gIE1lc3NhZ2VzQ29tcG9uZW50LFxuICBPbkJlZm9yZVNhdmVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlZmF1bHRXaWRnZXRJZHMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3dpZGdldHMvZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgUmFkaWFsR2F1Z2VWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vcmFkaWFsLWdhdWdlL3JhZGlhbC1nYXVnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5mb0dhdWdlQ3VycmVudE1lYXN1cmVtZW50UGlwZSB9IGZyb20gJy4uL2N1cnJlbnQtbWVhc3VyZW1lbnQucGlwZSc7XG5pbXBvcnQge1xuICBHQVVHRV9QUkVTRVRfTkFNRVMsXG4gIEdBVUdFX1BSRVNFVFMsXG4gIEdhdWdlT3B0aW9ucyxcbiAgSW5mb0dhdWdlV2lkZ2V0Q29uZmlnXG59IGZyb20gJy4vZ2F1Z2UubW9kZWwnO1xuaW1wb3J0IHsgRWRpdG9yQ29tcG9uZW50LCBNb25hY29FZGl0b3JNYXJrZXJWYWxpZGF0b3JEaXJlY3RpdmUgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2VkaXRvcic7XG5pbXBvcnQgeyBDb2xsYXBzZU1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvY29sbGFwc2UnO1xuaW1wb3J0IHsgUHJlc2V0UHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4vcHJlc2V0LXByZXZpZXcvcHJlc2V0LXByZXZpZXcuY29tcG9uZW50JztcblxuZnVuY3Rpb24gZW5zdXJlQXRMZWFzdE9uZURhdGFwb2ludFNlbGVjdGVkQW5kQWN0aXZlKFxuICBkYXRhcG9pbnRMaXN0QXR0cmlidXRlczogc3RyaW5nW11cbik6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGZvciAoY29uc3QgbGlzdEF0dHJpYnV0ZU5hbWUgb2YgZGF0YXBvaW50TGlzdEF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlRm9yTGlzdDogS1BJRGV0YWlsc1tdID0gZm9ybVZhbHVlW2xpc3RBdHRyaWJ1dGVOYW1lXTtcbiAgICAgIGlmICghdmFsdWVGb3JMaXN0IHx8ICFBcnJheS5pc0FycmF5KHZhbHVlRm9yTGlzdCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZUZvckxpc3QuZmluZChkcCA9PiBkcC5fX2FjdGl2ZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG5vQWN0aXZlRGF0YXBvaW50OiB0cnVlIH07XG4gIH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1pbmZvLWdhdWdlLXdpZGdldC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5mby1nYXVnZS13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XSxcbiAgcHJvdmlkZXJzOiBbTWVhc3VyZW1lbnRSZWFsdGltZVNlcnZpY2VdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybUdyb3VwQ29tcG9uZW50LFxuICAgIE1lc3NhZ2VzQ29tcG9uZW50LFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDb2xsYXBzZU1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEVkaXRvckNvbXBvbmVudCxcbiAgICBNb25hY29FZGl0b3JNYXJrZXJWYWxpZGF0b3JEaXJlY3RpdmUsXG4gICAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gICAgUmFkaWFsR2F1Z2VWaWV3Q29tcG9uZW50LFxuICAgIEluZm9HYXVnZUN1cnJlbnRNZWFzdXJlbWVudFBpcGUsXG4gICAgUHJlc2V0UHJldmlld0NvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEluZm9HYXVnZVdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25CZWZvcmVTYXZlLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjb25maWc6IEluZm9HYXVnZVdpZGdldENvbmZpZztcbiAgQFZpZXdDaGlsZChFZGl0b3JDb21wb25lbnQpIGVkaXRvckNvbXBvbmVudCE6IEVkaXRvckNvbXBvbmVudDtcbiAgZm9ybUdyb3VwOiBSZXR1cm5UeXBlPEluZm9HYXVnZVdpZGdldENvbmZpZ0NvbXBvbmVudFsnY3JlYXRlRm9ybSddPjtcbiAgZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnOiBQYXJ0aWFsPERhdGFwb2ludFNlbGVjdG9yTW9kYWxPcHRpb25zPiA9IHt9O1xuICBkZWZhdWx0Rm9ybU9wdGlvbnM6IFBhcnRpYWw8RGF0YXBvaW50QXR0cmlidXRlc0Zvcm1Db25maWc+ID0ge1xuICAgIHNob3dSZWRSYW5nZTogdHJ1ZSxcbiAgICBzaG93WWVsbG93UmFuZ2U6IHRydWUsXG4gICAgc2hvd1JhbmdlOiB0cnVlLFxuICAgIHNlbGVjdGFibGVDaGFydFJlbmRlclR5cGVzOiBbXVxuICB9O1xuICBpc0luZm9HYXVnZTogYm9vbGVhbjtcbiAgYWN0aXZlRGF0YXBvaW50R2F1Z2U6IEtQSURldGFpbHM7XG4gIHNob3dBZHZhbmNlZE9wdGlvbnMgPSBmYWxzZTtcbiAgZ2F1Z2VPcHRpb25zU3RyaW5nID0gJyc7XG4gIGdhdWdlT3B0aW9uczogR2F1Z2VPcHRpb25zO1xuICBzaG93QWR2YW5jZWRPcHRpb25zTGFiZWwgPSBnZXR0ZXh0KCdTaG93IGFkdmFuY2VkIG9wdGlvbnMnKTtcbiAgaGlkZUFkdmFuY2VkT3B0aW9uc0xhYmVsID0gZ2V0dGV4dCgnSGlkZSBhZHZhbmNlZCBvcHRpb25zJyk7XG4gIEFMTF9HQVVHRV9QUkVTRVRTID0gWy4uLkdBVUdFX1BSRVNFVFNdO1xuICBwcml2YXRlIGxpbWl0cyA9IHtcbiAgICBudW1iZXJPZkRlY2ltYWxQbGFjZXNNYXg6IDEwLFxuICAgIG51bWJlck9mRGVjaW1hbFBsYWNlc01pbjogMFxuICB9IGFzIGNvbnN0O1xuXG4gIHJlYWRvbmx5IEdBVUdFX1BSRVNFVFMgPSBHQVVHRV9QUkVTRVRTO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGZvcm06IE5nRm9ybSxcbiAgICBwcml2YXRlIHdpZGdldENvbmZpZzogV2lkZ2V0Q29uZmlnQ29tcG9uZW50LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudD86IER5bmFtaWNDb21wb25lbnRDb21wb25lbnRcbiAgKSB7fVxuXG4gIG9uQmVmb3JlU2F2ZShcbiAgICBjb25maWc/OiBJbmZvR2F1Z2VXaWRnZXRDb25maWdDb21wb25lbnRbJ2NvbmZpZyddXG4gICk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgdGhpcy5mb3JtR3JvdXAudmFsdWUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihjb25maWcsIHtcbiAgICAgICAgZ2F1Z2VPcHRpb25zOiB0aGlzLmdhdWdlT3B0aW9ucyxcbiAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZDogdGhpcy5pc0luZm9HYXVnZSA/IG51bGwgOiB0aGlzLmdldFByZXNldElkKHRoaXMuZ2F1Z2VPcHRpb25zKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2lkZ2V0Q29uZmlnLmNvbnRleHQ/LmlkKSB7XG4gICAgICB0aGlzLmRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZy5jb250ZXh0QXNzZXQgPSB0aGlzLndpZGdldENvbmZpZz8uY29udGV4dDtcbiAgICB9XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIGlmICh0aGlzLmNvbmZpZz8uZGF0YXBvaW50c0xhYmVscykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IGRhdGFwb2ludHNMYWJlbHM6IHRoaXMuY29uZmlnLmRhdGFwb2ludHNMYWJlbHMgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZz8uZGF0YXBvaW50c0dhdWdlKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgZGF0YXBvaW50c0dhdWdlOiB0aGlzLmNvbmZpZy5kYXRhcG9pbnRzR2F1Z2UgfSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWc/LmZyYWN0aW9uU2l6ZSA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTih0aGlzLmNvbmZpZz8uZnJhY3Rpb25TaXplKSkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IGZyYWN0aW9uU2l6ZTogdGhpcy5jb25maWcuZnJhY3Rpb25TaXplIH0pO1xuICAgIH1cbiAgICB0aGlzLmlzSW5mb0dhdWdlID0gdGhpcy5keW5hbWljQ29tcG9uZW50Py5jb21wb25lbnRJZCA9PT0gZGVmYXVsdFdpZGdldElkcy5JTkZPX0dBVUdFO1xuXG4gICAgY29uc3QgaXNSYWRpYWxHYXVnZSA9ICF0aGlzLmlzSW5mb0dhdWdlO1xuXG4gICAgaWYgKGlzUmFkaWFsR2F1Z2UpIHtcbiAgICAgIHRoaXMuc2V0dXBSYWRpYWxHYXVnZSgpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIGlmICh2YWx1ZS5kYXRhcG9pbnRzR2F1Z2UpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRhcG9pbnRHYXVnZSA9IHZhbHVlLmRhdGFwb2ludHNHYXVnZS5maW5kKGRwID0+IGRwLl9fYWN0aXZlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uUmFkaW9QcmVzZXRDaGFuZ2UocHJlc2V0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIHByZXNldFxuICAgIGNvbnN0IHNlbGVjdGVkUHJlc2V0ID0gdGhpcy5BTExfR0FVR0VfUFJFU0VUUy5maW5kKHByZXNldCA9PiBwcmVzZXQuaWQgPT09IHByZXNldElkKTtcblxuICAgIGlmIChzZWxlY3RlZFByZXNldCkge1xuICAgICAgdGhpcy5nYXVnZU9wdGlvbnMgPSB7IC4uLnNlbGVjdGVkUHJlc2V0IH07IC8vIFVwZGF0ZSBnYXVnZU9wdGlvbnMgd2l0aCB0aGUgc2VsZWN0ZWQgcHJlc2V0XG4gICAgICB0aGlzLmdhdWdlT3B0aW9uc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZ2F1Z2VPcHRpb25zLCBudWxsLCAyKTtcblxuICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIHByZXNldCBpcyBub3QgY3VzdG9tLCBoaWRlIGFkdmFuY2VkIG9wdGlvbnNcbiAgICAgIGlmIChzZWxlY3RlZFByZXNldC5pZCAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRPcHRpb25zID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZm9ybSBjb250cm9sIHZhbHVlXG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgZ2F1Z2VQcmVzZXRJZDogc2VsZWN0ZWRQcmVzZXQuaWQgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXNzaWduU2NoZW1hKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgc2NoZW1hIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAnYzh5LXNjaGVtYS1sb2FkZXI/aW50ZXJmYWNlTmFtZT1HYXVnZU9wdGlvbnMhQGM4eS9uZ3gtY29tcG9uZW50cy93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9pbmZvLWdhdWdlJ1xuICAgICk7XG4gICAgdGhpcy5lZGl0b3JDb21wb25lbnQubW9uYWNvLmxhbmd1YWdlcy5qc29uLmpzb25EZWZhdWx0cy5zZXREaWFnbm9zdGljc09wdGlvbnMoe1xuICAgICAgdmFsaWRhdGU6IHRydWUsXG4gICAgICBzY2hlbWFzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB1cmk6ICdnYXVnZS1zY2hlbWEuanNvbicsXG4gICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgZmlsZU1hdGNoOiBbJyonXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgZW5hYmxlU2NoZW1hUmVxdWVzdDogZmFsc2UsXG4gICAgICBhbGxvd0NvbW1lbnRzOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgZ2F1Z2VKU09OQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IEpTT04ucGFyc2UodmFsdWUpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFyc2VkIG9wdGlvbnMgbWF0Y2ggYW55IGV4aXN0aW5nIHByZXNldFxuICAgICAgY29uc3QgbWF0Y2hpbmdQcmVzZXQgPSB0aGlzLkdBVUdFX1BSRVNFVFMuZmluZChcbiAgICAgICAgcHJlc2V0ID0+IEpTT04uc3RyaW5naWZ5KHByZXNldCkgPT09IEpTT04uc3RyaW5naWZ5KHBhcnNlZE9wdGlvbnMpXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdQcmVzZXQpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IGdhdWdlUHJlc2V0SWQ6IG1hdGNoaW5nUHJlc2V0LmlkIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nYXVnZU9wdGlvbnMgPSBwYXJzZWRPcHRpb25zO1xuICAgICAgICB0aGlzLmdhdWdlT3B0aW9ucy5uYW1lID0gR0FVR0VfUFJFU0VUX05BTUVTLkNVU1RPTTtcbiAgICAgICAgdGhpcy5nYXVnZU9wdGlvbnMuaWQgPSAnY3VzdG9tJztcblxuICAgICAgICBjb25zdCBjdXN0b21QcmVzZXRFeGlzdHMgPSB0aGlzLkFMTF9HQVVHRV9QUkVTRVRTLnNvbWUocHJlc2V0ID0+IHByZXNldC5pZCA9PT0gJ2N1c3RvbScpO1xuXG4gICAgICAgIGlmICghY3VzdG9tUHJlc2V0RXhpc3RzKSB7XG4gICAgICAgICAgdGhpcy5BTExfR0FVR0VfUFJFU0VUUyA9IFsuLi50aGlzLkFMTF9HQVVHRV9QUkVTRVRTLCB0aGlzLmdhdWdlT3B0aW9uc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5BTExfR0FVR0VfUFJFU0VUUyA9IHRoaXMuQUxMX0dBVUdFX1BSRVNFVFMubWFwKHByZXNldCA9PlxuICAgICAgICAgICAgcHJlc2V0LmlkID09PSAnY3VzdG9tJyA/IHRoaXMuZ2F1Z2VPcHRpb25zIDogcHJlc2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyBnYXVnZVByZXNldElkOiAnY3VzdG9tJyB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBKU09OOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIGl0ZW06IEdhdWdlT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cblxuICBwcml2YXRlIGdldFByZXNldElkKGdhdWdlT3B0aW9uczogR2F1Z2VPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXRjaGluZ1ByZXNldCA9IHRoaXMuR0FVR0VfUFJFU0VUUy5maW5kKHByZXNldCA9PiBwcmVzZXQuaWQgPT09IGdhdWdlT3B0aW9ucy5pZCk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmdQcmVzZXQgPyBtYXRjaGluZ1ByZXNldC5pZCA6ICdjdXN0b20nO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJhZGlhbEdhdWdlKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5kYXRhcG9pbnRzICYmICF0aGlzLmNvbmZpZy5kYXRhcG9pbnRzR2F1Z2UpIHtcbiAgICAgIHRoaXMuY29uZmlnLmRhdGFwb2ludHNHYXVnZSA9IHRoaXMuY29uZmlnLmRhdGFwb2ludHM7XG4gICAgfVxuXG4gICAgdGhpcy5nYXVnZU9wdGlvbnMgPSB0aGlzLmNvbmZpZy5nYXVnZU9wdGlvbnMgfHwgeyAuLi50aGlzLkdBVUdFX1BSRVNFVFNbMF0gfTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJykge1xuICAgICAgdGhpcy5nYXVnZU9wdGlvbnMubmFtZSA9IEdBVUdFX1BSRVNFVF9OQU1FUy5DVVNUT007XG4gICAgICB0aGlzLmdhdWdlT3B0aW9ucy5pZCA9ICdjdXN0b20nO1xuICAgICAgdGhpcy5BTExfR0FVR0VfUFJFU0VUUyA9IFsuLi50aGlzLkdBVUdFX1BSRVNFVFMsIHRoaXMuY29uZmlnLmdhdWdlT3B0aW9uc107XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgZ2F1Z2VQcmVzZXRJZDogJ2N1c3RvbScgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5nYXVnZU9wdGlvbnNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmdhdWdlT3B0aW9ucywgbnVsbCwgMik7XG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5jcmVhdGVGb3JtKCk7XG4gICAgdGhpcy5mb3JtLmZvcm0uYWRkQ29udHJvbCgnY29uZmlnJywgdGhpcy5mb3JtR3JvdXApO1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUodGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFxuICAgICAge1xuICAgICAgICBmcmFjdGlvblNpemU6IFtcbiAgICAgICAgICAyLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgICBWYWxpZGF0b3JzLm1pbih0aGlzLmxpbWl0cy5udW1iZXJPZkRlY2ltYWxQbGFjZXNNaW4pLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXgodGhpcy5saW1pdHMubnVtYmVyT2ZEZWNpbWFsUGxhY2VzTWF4KVxuICAgICAgICAgIF1cbiAgICAgICAgXSxcbiAgICAgICAgZGF0YXBvaW50c0xhYmVsczogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG5ldyBBcnJheTxLUElEZXRhaWxzPigpLCBbXSksXG4gICAgICAgIGRhdGFwb2ludHNHYXVnZTogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG5ldyBBcnJheTxLUElEZXRhaWxzPigpLCBbXSksXG4gICAgICAgIGdhdWdlUHJlc2V0SWQ6IFt0aGlzLmNvbmZpZy5zZWxlY3RlZFByZXNldElkIHx8ICdkZWZhdWx0J11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRvcnM6IFtcbiAgICAgICAgICBlbnN1cmVBdExlYXN0T25lRGF0YXBvaW50U2VsZWN0ZWRBbmRBY3RpdmUoWydkYXRhcG9pbnRzTGFiZWxzJywgJ2RhdGFwb2ludHNHYXVnZSddKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwiPGZvcm1cbiAgY2xhc3M9XCJmaXQtaFwiXG4gIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibS1sLTE2IG0tci0xNlwiXG4gICAgKm5nSWY9XCJpc0luZm9HYXVnZTsgZWxzZSByYWRpYWxHYXVnZVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwicC10LThcIj5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPkRlY2ltYWwgcGxhY2VzPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIG5hbWU9XCJmcmFjdGlvblNpemVcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmcmFjdGlvblNpemVcIlxuICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGM4eS1tZXNzYWdlcyBbc2hvd109XCJmb3JtR3JvdXAuY29udHJvbHMuZnJhY3Rpb25TaXplLmVycm9yc1wiPjwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgcC10LThcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiXG4gICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5lcnJvcnM/Lm5vQWN0aXZlRGF0YXBvaW50XCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgPlxuICAgICAgICAgIEF0IGxlYXN0IG9uZSBkYXRhIHBvaW50IGZvciB0aGUgbGFiZWxzIG9yIHRoZSBnYXVnZSBuZWVkcyB0byBiZSBzZWxlY3RlZC5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICA8Yzh5LWRhdGFwb2ludC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctaW5oZXJpdCBzZXBhcmF0b3ItdG9wIHAtdC0xNiBkLWJsb2NrXCJcbiAgICAgICAgICBsaXN0VGl0bGU9XCJ7eyAnTXVsdGlwbGUgbGFiZWwgYW5kIHZhbHVlIHBhaXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgbmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9ybU9wdGlvbnNdPVwiZGVmYXVsdEZvcm1PcHRpb25zXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZ1wiXG4gICAgICAgICAgW21pbkFjdGl2ZUNvdW50XT1cIjBcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGFwb2ludHNMYWJlbHNcIlxuICAgICAgICA+PC9jOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgPGM4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWluaGVyaXQgc2VwYXJhdG9yLXRvcCBwLXQtMTYgZC1ibG9ja1wiXG4gICAgICAgICAgbGlzdFRpdGxlPVwie3sgJ0dhdWdlYGRpc3BsYXlgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgbmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9ybU9wdGlvbnNdPVwiZGVmYXVsdEZvcm1PcHRpb25zXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZ1wiXG4gICAgICAgICAgW21pbkFjdGl2ZUNvdW50XT1cIjBcIlxuICAgICAgICAgIFttYXhBY3RpdmVDb3VudF09XCIxXCJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkYXRhcG9pbnRzR2F1Z2VcIlxuICAgICAgICA+PC9jOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxuZy10ZW1wbGF0ZSAjcmFkaWFsR2F1Z2U+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleC1tZCBmaXQtaFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IGlubmVyLXNjcm9sbCBwLTAgYmctY29tcG9uZW50XCI+XG4gICAgICAgIDxjOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0XG4gICAgICAgICAgY2xhc3M9XCJiZy1pbmhlcml0IGQtYmxvY2tcIlxuICAgICAgICAgIGxpc3RUaXRsZT1cInt7ICdEYXRhIHBvaW50c2BkaXNwbGF5YCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIG5hbWU9XCJkYXRhcG9pbnRzXCJcbiAgICAgICAgICBbZGVmYXVsdEZvcm1PcHRpb25zXT1cImRlZmF1bHRGb3JtT3B0aW9uc1wiXG4gICAgICAgICAgW2NvbmZpZ109XCJkYXRhcG9pbnRTZWxlY3Rpb25Db25maWdcIlxuICAgICAgICAgIFttaW5BY3RpdmVDb3VudF09XCIwXCJcbiAgICAgICAgICBbbWF4QWN0aXZlQ291bnRdPVwiMVwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YXBvaW50c0dhdWdlXCJcbiAgICAgICAgPjwvYzh5LWRhdGFwb2ludC1zZWxlY3Rpb24tbGlzdD5cblxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLXQtOCBwLXItMTYgcC1sLTE2XCI+XG4gICAgICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5EZWNpbWFsIHBsYWNlczwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBuYW1lPVwiZnJhY3Rpb25TaXplXCJcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZnJhY3Rpb25TaXplXCJcbiAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxjOHktbWVzc2FnZXMgW3Nob3ddPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmZyYWN0aW9uU2l6ZS5lcnJvcnNcIj48L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwLXItMTYgcC1sLTE2IG0tYi0wXCI+XG4gICAgICAgICAgPGxlZ2VuZD5cbiAgICAgICAgICAgIHt7ICdQcmVzZXRzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgIDxjOHktcHJlc2V0LXByZXZpZXdcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImdhdWdlUHJlc2V0SWRcIlxuICAgICAgICAgICAgW0FMTF9HQVVHRV9QUkVTRVRTXT1cIkFMTF9HQVVHRV9QUkVTRVRTXCJcbiAgICAgICAgICAgIChvblByZXNldENoYW5nZSk9XCJvblJhZGlvUHJlc2V0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L2M4eS1wcmVzZXQtcHJldmlldz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtMTZcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiYWR2YW5jZWRDb2xsYXBzZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3dBZHZhbmNlZE9wdGlvbnNcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0FkdmFuY2VkT3B0aW9ucyA9ICFzaG93QWR2YW5jZWRPcHRpb25zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBzaG93QWR2YW5jZWRPcHRpb25zID8gaGlkZUFkdmFuY2VkT3B0aW9uc0xhYmVsIDogc2hvd0FkdmFuY2VkT3B0aW9uc0xhYmVsIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNvbGxhcHNlXCJcbiAgICAgICAgICBpZD1cImFkdmFuY2VkQ29sbGFwc2VcIlxuICAgICAgICAgIFtjb2xsYXBzZV09XCIhc2hvd0FkdmFuY2VkT3B0aW9uc1wiXG4gICAgICAgICAgW2lzQW5pbWF0ZWRdPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZpdC1oXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWluLWhlaWdodDogNDAwcHhcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjOHktZWRpdG9yXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdhdWdlT3B0aW9uc1N0cmluZ1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImdhdWdlSlNPTkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGVkaXRvckluaXQpPVwiYXNzaWduU2NoZW1hKClcIlxuICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgICAgICAgICBtb25hY29FZGl0b3JNYXJrZXJWYWxpZGF0b3JcbiAgICAgICAgICAgID48L2M4eS1lZGl0b3I+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY29sLW1kLTZcIlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmRhdGFwb2ludHNHYXVnZS5sZW5ndGggPiAwICYmIGFjdGl2ZURhdGFwb2ludEdhdWdlO1xuICAgICAgICAgIGVsc2UgZW1wdHlTdGF0ZVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8IS0tIFJhZGlhbCBHYXVnZSAtLT5cbiAgICAgICAgPGM4eS1yYWRpYWwtZ2F1Z2VcbiAgICAgICAgICBjbGFzcz1cImM4eS1yYWRpYWwtZ2F1Z2UtLXNxdWFyZVwiXG4gICAgICAgICAgKm5nSWY9XCJhY3RpdmVEYXRhcG9pbnRHYXVnZSB8IGluZm9HYXVnZUN1cnJlbnRNZWFzdXJlbWVudCB8IGFzeW5jIGFzIG1lYXN1cmVtZW50XCJcbiAgICAgICAgICBbYWN0aXZlRGF0YXBvaW50R2F1Z2VdPVwiYWN0aXZlRGF0YXBvaW50R2F1Z2VcIlxuICAgICAgICAgIFttZWFzdXJlbWVudF09XCJtZWFzdXJlbWVudFwiXG4gICAgICAgICAgW2ZyYWN0aW9uU2l6ZV09XCJmb3JtR3JvdXAudmFsdWUuZnJhY3Rpb25TaXplXCJcbiAgICAgICAgICBbZ2F1Z2VPcHRpb25zXT1cImdhdWdlT3B0aW9uc1wiXG4gICAgICAgICAgW3NlbGVjdGVkUHJlc2V0SWRdPVwiZm9ybUdyb3VwLnZhbHVlLmdhdWdlUHJlc2V0SWRcIlxuICAgICAgICA+PC9jOHktcmFkaWFsLWdhdWdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Zvcm0+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTdGF0ZT5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC02IGQtY29sIGEtaS1zdGFydCBqLWMtY2VudGVyXCI+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgW2ljb25dPVwiJ2M4eS1kYXRhLXBvaW50cydcIlxuICAgICAgW3RpdGxlXT1cIidQbGVhc2Ugc2VsZWN0IGEgZGF0YSBwb2ludCBmaXJzdC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtob3Jpem9udGFsXT1cImZhbHNlXCJcbiAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,67 @@
1
+ import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';
2
+ import { RadialGaugeViewComponent } from '../../radial-gauge/radial-gauge.component';
3
+ import { CommonModule } from '@c8y/ngx-components';
4
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@c8y/ngx-components";
7
+ import * as i2 from "@angular/common";
8
+ export class PresetPreviewComponent {
9
+ constructor() {
10
+ this.onPresetChange = new EventEmitter();
11
+ this.measurement = {
12
+ value: Math.floor(Math.random() * 9) + 1,
13
+ unit: 'ºC',
14
+ date: '2025-04-22T20:07:49.354Z'
15
+ };
16
+ this.activeDatapointGauge = {
17
+ fragment: 'c8y_Kpi',
18
+ series: 'preview',
19
+ unit: 'ºC',
20
+ min: 0,
21
+ max: 10,
22
+ yellowRangeMax: 8,
23
+ yellowRangeMin: 5,
24
+ redRangeMin: 8,
25
+ redRangeMax: 10
26
+ };
27
+ this.selectedPresetId = null;
28
+ }
29
+ writeValue(value) {
30
+ this.selectedPresetId = value;
31
+ }
32
+ registerOnChange(fn) {
33
+ this.onChange = fn;
34
+ }
35
+ registerOnTouched(fn) {
36
+ this.onTouched = fn;
37
+ }
38
+ emitPresetChange(presetId) {
39
+ this.selectedPresetId = presetId;
40
+ this.onChange(presetId);
41
+ this.onTouched();
42
+ this.onPresetChange.emit(presetId);
43
+ }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PresetPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
45
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PresetPreviewComponent, isStandalone: true, selector: "c8y-preset-preview", inputs: { ALL_GAUGE_PRESETS: "ALL_GAUGE_PRESETS" }, outputs: { onPresetChange: "onPresetChange" }, providers: [
46
+ {
47
+ provide: NG_VALUE_ACCESSOR,
48
+ useExisting: forwardRef(() => PresetPreviewComponent),
49
+ multi: true
50
+ }
51
+ ], ngImport: i0, template: "<div class=\"d-grid grid__col--4-4-4 gap-4\">\n <button\n class=\"c8y-radial-gauge__preset preset-{{ preset.id }}\"\n [class.selected]=\"preset.id === selectedPresetId\"\n [attr.aria-label]=\"preset.name | translate\"\n type=\"button\"\n *ngFor=\"let preset of ALL_GAUGE_PRESETS\"\n (click)=\"emitPresetChange(preset.id)\"\n >\n <c8y-radial-gauge\n class=\"c8y-radial-gauge--square\"\n *ngIf=\"preset.id !== 'custom'\"\n [activeDatapointGauge]=\"activeDatapointGauge\"\n [measurement]=\"measurement\"\n [fractionSize]=\"2\"\n [selectedPresetId]=\"preset.id\"\n [gaugeOptions]=\"preset\"\n ></c8y-radial-gauge>\n <span>{{ preset.name | translate }}</span>\n </button>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: RadialGaugeViewComponent, selector: "c8y-radial-gauge", inputs: ["activeDatapointGauge", "measurement", "fractionSize", "gaugeOptions", "selectedPresetId"] }] }); }
52
+ }
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PresetPreviewComponent, decorators: [{
54
+ type: Component,
55
+ args: [{ selector: 'c8y-preset-preview', standalone: true, imports: [CommonModule, RadialGaugeViewComponent], providers: [
56
+ {
57
+ provide: NG_VALUE_ACCESSOR,
58
+ useExisting: forwardRef(() => PresetPreviewComponent),
59
+ multi: true
60
+ }
61
+ ], template: "<div class=\"d-grid grid__col--4-4-4 gap-4\">\n <button\n class=\"c8y-radial-gauge__preset preset-{{ preset.id }}\"\n [class.selected]=\"preset.id === selectedPresetId\"\n [attr.aria-label]=\"preset.name | translate\"\n type=\"button\"\n *ngFor=\"let preset of ALL_GAUGE_PRESETS\"\n (click)=\"emitPresetChange(preset.id)\"\n >\n <c8y-radial-gauge\n class=\"c8y-radial-gauge--square\"\n *ngIf=\"preset.id !== 'custom'\"\n [activeDatapointGauge]=\"activeDatapointGauge\"\n [measurement]=\"measurement\"\n [fractionSize]=\"2\"\n [selectedPresetId]=\"preset.id\"\n [gaugeOptions]=\"preset\"\n ></c8y-radial-gauge>\n <span>{{ preset.name | translate }}</span>\n </button>\n</div>\n" }]
62
+ }], propDecorators: { ALL_GAUGE_PRESETS: [{
63
+ type: Input
64
+ }], onPresetChange: [{
65
+ type: Output
66
+ }] } });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LXByZXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvaW5mby1nYXVnZS9pbmZvLWdhdWdlLXdpZGdldC1jb25maWcvcHJlc2V0LXByZXZpZXcvcHJlc2V0LXByZXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvaW5mby1nYXVnZS9pbmZvLWdhdWdlLXdpZGdldC1jb25maWcvcHJlc2V0LXByZXZpZXcvcHJlc2V0LXByZXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBZW5ELE1BQU0sT0FBTyxzQkFBc0I7SUFibkM7UUFlWSxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdEQsZ0JBQVcsR0FBRztZQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3hDLElBQUksRUFBRSxJQUFJO1lBQ1YsSUFBSSxFQUFFLDBCQUEwQjtTQUNqQyxDQUFDO1FBQ0YseUJBQW9CLEdBQUc7WUFDckIsUUFBUSxFQUFFLFNBQVM7WUFDbkIsTUFBTSxFQUFFLFNBQVM7WUFDakIsSUFBSSxFQUFFLElBQUk7WUFDVixHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxFQUFFO1lBQ1AsY0FBYyxFQUFFLENBQUM7WUFDakIsY0FBYyxFQUFFLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUM7WUFDZCxXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDO1FBQ0YscUJBQWdCLEdBQWtCLElBQUksQ0FBQztLQXVCeEM7SUFsQkMsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBMkI7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQWM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQzsrR0ExQ1Usc0JBQXNCO21HQUF0QixzQkFBc0Isb0tBUnRCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDckQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDBCQ2pCSCx1dUJBcUJBLDJDRFhZLFlBQVksZ1VBQUUsd0JBQXdCOzs0RkFTckMsc0JBQXNCO2tCQWJsQyxTQUFTOytCQUNFLG9CQUFvQixjQUVsQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLENBQUMsYUFDdEM7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLENBQUM7NEJBQ3JELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhCQUdRLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJhZGlhbEdhdWdlVmlld0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3JhZGlhbC1nYXVnZS9yYWRpYWwtZ2F1Z2UuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgR2F1Z2VPcHRpb25zIH0gZnJvbSAnLi4vZ2F1Z2UubW9kZWwnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1wcmVzZXQtcHJldmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcmVzZXQtcHJldmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJhZGlhbEdhdWdlVmlld0NvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUHJlc2V0UHJldmlld0NvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBQcmVzZXRQcmV2aWV3Q29tcG9uZW50IHtcbiAgQElucHV0KCkgQUxMX0dBVUdFX1BSRVNFVFM6IEdhdWdlT3B0aW9uc1tdO1xuICBAT3V0cHV0KCkgb25QcmVzZXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBtZWFzdXJlbWVudCA9IHtcbiAgICB2YWx1ZTogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOSkgKyAxLFxuICAgIHVuaXQ6ICfCukMnLFxuICAgIGRhdGU6ICcyMDI1LTA0LTIyVDIwOjA3OjQ5LjM1NFonXG4gIH07XG4gIGFjdGl2ZURhdGFwb2ludEdhdWdlID0ge1xuICAgIGZyYWdtZW50OiAnYzh5X0twaScsXG4gICAgc2VyaWVzOiAncHJldmlldycsXG4gICAgdW5pdDogJ8K6QycsXG4gICAgbWluOiAwLFxuICAgIG1heDogMTAsXG4gICAgeWVsbG93UmFuZ2VNYXg6IDgsXG4gICAgeWVsbG93UmFuZ2VNaW46IDUsXG4gICAgcmVkUmFuZ2VNaW46IDgsXG4gICAgcmVkUmFuZ2VNYXg6IDEwXG4gIH07XG4gIHNlbGVjdGVkUHJlc2V0SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZDtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0SWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgZW1pdFByZXNldENoYW5nZShwcmVzZXRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFByZXNldElkID0gcHJlc2V0SWQ7XG4gICAgdGhpcy5vbkNoYW5nZShwcmVzZXRJZCk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLm9uUHJlc2V0Q2hhbmdlLmVtaXQocHJlc2V0SWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1ncmlkIGdyaWRfX2NvbC0tNC00LTQgZ2FwLTRcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYzh5LXJhZGlhbC1nYXVnZV9fcHJlc2V0IHByZXNldC17eyBwcmVzZXQuaWQgfX1cIlxuICAgIFtjbGFzcy5zZWxlY3RlZF09XCJwcmVzZXQuaWQgPT09IHNlbGVjdGVkUHJlc2V0SWRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicHJlc2V0Lm5hbWUgfCB0cmFuc2xhdGVcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgICpuZ0Zvcj1cImxldCBwcmVzZXQgb2YgQUxMX0dBVUdFX1BSRVNFVFNcIlxuICAgIChjbGljayk9XCJlbWl0UHJlc2V0Q2hhbmdlKHByZXNldC5pZClcIlxuICA+XG4gICAgPGM4eS1yYWRpYWwtZ2F1Z2VcbiAgICAgIGNsYXNzPVwiYzh5LXJhZGlhbC1nYXVnZS0tc3F1YXJlXCJcbiAgICAgICpuZ0lmPVwicHJlc2V0LmlkICE9PSAnY3VzdG9tJ1wiXG4gICAgICBbYWN0aXZlRGF0YXBvaW50R2F1Z2VdPVwiYWN0aXZlRGF0YXBvaW50R2F1Z2VcIlxuICAgICAgW21lYXN1cmVtZW50XT1cIm1lYXN1cmVtZW50XCJcbiAgICAgIFtmcmFjdGlvblNpemVdPVwiMlwiXG4gICAgICBbc2VsZWN0ZWRQcmVzZXRJZF09XCJwcmVzZXQuaWRcIlxuICAgICAgW2dhdWdlT3B0aW9uc109XCJwcmVzZXRcIlxuICAgID48L2M4eS1yYWRpYWwtZ2F1Z2U+XG4gICAgPHNwYW4+e3sgcHJlc2V0Lm5hbWUgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=