@eqproject/eqp-dynamic-module 2.10.66 → 2.10.68

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 (73) hide show
  1. package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +33 -16
  2. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +658 -32
  3. package/esm2020/lib/components/private/action-button-creator/action-button-creator.component.mjs +2 -2
  4. package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +809 -15
  5. package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +1 -1
  6. package/esm2020/lib/components/private/field-templates/action-button-field-template/action-button-field-template.component.mjs +98 -20
  7. package/esm2020/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +132 -69
  8. package/esm2020/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +159 -24
  9. package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +152 -7
  10. package/esm2020/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +180 -39
  11. package/esm2020/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +100 -78
  12. package/esm2020/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.mjs +103 -88
  13. package/esm2020/lib/components/private/field-templates/label-field-template/label-field-template.component.mjs +90 -17
  14. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +217 -54
  15. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +220 -37
  16. package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +263 -29
  17. package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +210 -18
  18. package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +35 -13
  19. package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +1 -1
  20. package/esm2020/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +1 -1
  21. package/esm2020/lib/components/private/tmw-image-marker/tmw-image-marker.component.mjs +4 -3
  22. package/esm2020/lib/components/private/trigger-creator/trigger-creator.component.mjs +2 -2
  23. package/esm2020/lib/models/endPointConfiguration.model.mjs +7 -2
  24. package/esm2020/lib/models/fields/actionButton.model.mjs +3 -1
  25. package/esm2020/lib/models/fields/attachmentField.model.mjs +3 -1
  26. package/esm2020/lib/models/fields/booleanField.model.mjs +3 -1
  27. package/esm2020/lib/models/fields/dateField.model.mjs +3 -1
  28. package/esm2020/lib/models/fields/imageField.model.mjs +3 -1
  29. package/esm2020/lib/models/fields/imageSelectorField.model.mjs +3 -1
  30. package/esm2020/lib/models/fields/imageWithMarkersField.model.mjs +3 -1
  31. package/esm2020/lib/models/fields/labelField.model.mjs +3 -1
  32. package/esm2020/lib/models/fields/listValueField.model.mjs +3 -1
  33. package/esm2020/lib/models/fields/numericField.model.mjs +8 -1
  34. package/esm2020/lib/models/fields/textField.model.mjs +3 -1
  35. package/esm2020/lib/models/fields/textareaField.model.mjs +8 -1
  36. package/esm2020/lib/models/form.model.mjs +1 -1
  37. package/esm2020/lib/utils/google-fonts-injector.mjs +78 -0
  38. package/fesm2015/eqproject-eqp-dynamic-module.mjs +3621 -535
  39. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
  40. package/fesm2020/eqproject-eqp-dynamic-module.mjs +3530 -538
  41. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
  42. package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +5 -1
  43. package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +74 -6
  44. package/lib/components/private/add-form-field/add-form-field.component.d.ts +208 -1
  45. package/lib/components/private/field-templates/action-button-field-template/action-button-field-template.component.d.ts +16 -10
  46. package/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.d.ts +17 -33
  47. package/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.d.ts +24 -11
  48. package/lib/components/private/field-templates/date-field-template/date-field-template.component.d.ts +21 -4
  49. package/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.d.ts +20 -16
  50. package/lib/components/private/field-templates/image-field-template/image-field-template.component.d.ts +15 -36
  51. package/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.d.ts +16 -37
  52. package/lib/components/private/field-templates/label-field-template/label-field-template.component.d.ts +16 -12
  53. package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +21 -28
  54. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +25 -18
  55. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +38 -10
  56. package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +26 -12
  57. package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +12 -2
  58. package/lib/models/endPointConfiguration.model.d.ts +1 -0
  59. package/lib/models/fields/actionButton.model.d.ts +12 -0
  60. package/lib/models/fields/attachmentField.model.d.ts +31 -3
  61. package/lib/models/fields/booleanField.model.d.ts +15 -0
  62. package/lib/models/fields/dateField.model.d.ts +46 -0
  63. package/lib/models/fields/imageField.model.d.ts +9 -0
  64. package/lib/models/fields/imageSelectorField.model.d.ts +23 -0
  65. package/lib/models/fields/imageWithMarkersField.model.d.ts +9 -0
  66. package/lib/models/fields/labelField.model.d.ts +5 -0
  67. package/lib/models/fields/listValueField.model.d.ts +38 -0
  68. package/lib/models/fields/numericField.model.d.ts +34 -0
  69. package/lib/models/fields/textField.model.d.ts +33 -0
  70. package/lib/models/fields/textareaField.model.d.ts +39 -0
  71. package/lib/models/form.model.d.ts +6 -0
  72. package/lib/utils/google-fonts-injector.d.ts +7 -0
  73. package/package.json +3 -3
@@ -8,24 +8,29 @@ import * as i1 from "@angular/material/dialog";
8
8
  import * as i2 from "../../../../services/utilityHelper.services";
9
9
  import * as i3 from "@angular/common";
10
10
  import * as i4 from "../../tmw-image-drawer/tmw-image-drawer.component";
11
- /**
12
- * Metodo per recuperare, a partire da un Blob, la stringa contenente il base64 del file.
13
- * Usato per prendere il base64 dell'immagine dopo che l'utente ci ha disegnato sopra.
14
- * @param file Blob che rappresenta l'immagine.
15
- */
16
11
  const toBase64 = file => new Promise((resolve, reject) => {
17
12
  const reader = new FileReader();
18
13
  reader.readAsDataURL(file);
19
14
  reader.onload = () => resolve(reader.result.toString());
20
15
  reader.onerror = error => reject(error);
21
16
  });
17
+ const ELEMENT_SELECTORS = {
18
+ Container: ' .imageContainer',
19
+ Descrizione: ' .image-label',
20
+ BottoneDisegna: ' .drawButton button.btn',
21
+ };
22
+ const ELEMENTS = Object.keys(ELEMENT_SELECTORS);
23
+ const STATES = ['Normale', 'Mouseover'];
24
+ const DEFAULT_FIELD_STYLES = {};
22
25
  export class ImageFieldTemplateComponent {
23
- //#endregion
24
- constructor(dialog, utilityHelperService) {
26
+ constructor(dialog, utilityHelperService, renderer) {
25
27
  this.dialog = dialog;
26
28
  this.utilityHelperService = utilityHelperService;
29
+ this.renderer = renderer;
27
30
  this.formulaObject = {};
28
31
  this.inConfig = false;
32
+ this.styleVersion = 0;
33
+ this.forceState = null;
29
34
  this.recordChange = new EventEmitter();
30
35
  this.imageDraw = new EventEmitter();
31
36
  this.imageWidth = 0;
@@ -33,8 +38,6 @@ export class ImageFieldTemplateComponent {
33
38
  this.FileBase64 = "";
34
39
  this.DrawFileBase64 = "";
35
40
  this.FileDataBase64 = "";
36
- //preLoadedImageMetadataFormGroup: UntypedFormGroup;
37
- //#region Proprietà per configurare il componente ngx-image-drawing e aprire il relativo dialog.
38
41
  this.width = null;
39
42
  this.height = null;
40
43
  this.i18n = {
@@ -42,8 +45,17 @@ export class ImageFieldTemplateComponent {
42
45
  cancelBtn: 'Ricarica originale',
43
46
  closeDialog: 'Annulla disegno',
44
47
  };
48
+ this.styleEl = null;
45
49
  }
46
50
  ngOnInit() {
51
+ this.fieldUid = 'img-' + Math.random().toString(36).slice(2, 10);
52
+ this.injectStyles();
53
+ // In anteprima configuratore senza un'immagine reale: non caricare DynAttachment
54
+ if (this.inConfig && !this.field.DynAttachment) {
55
+ this.imageWidth = 200;
56
+ this.updateField();
57
+ return;
58
+ }
47
59
  if (this.record[this.field.Name] == null || this.record[this.field.Name] == 0) {
48
60
  this.FileDataBase64 = this.field.DynAttachment.FileDataBase64;
49
61
  this.imageWidth = (this.field.DynAttachment.ResizedImageHeightPx / this.field.DynAttachment.ImageHeightPx * this.field.DynAttachment.ImageWidthPx) + 50;
@@ -69,30 +81,81 @@ export class ImageFieldTemplateComponent {
69
81
  this.AttachmentID = this.imageDrawAttachment.ID;
70
82
  }
71
83
  this.recordChange.emit(this.record);
72
- // Clono l'attachment originale, gli cambio il FileBase e gli azzero l'ID
73
- // this.imageDrawAttachment.FileName = "";
74
- // this.imageDrawAttachment.FilePath = "";
75
84
  this.imageDraw.emit(this.imageDrawAttachment);
76
85
  this.updateField();
77
86
  }
78
87
  ngOnChanges(changes) {
79
- // Se viene modificato il valore di "ngModelInput" allora aggiorna l'input
88
+ if (changes['styleVersion'] && !changes['styleVersion'].firstChange) {
89
+ this.injectStyles();
90
+ this.updateStateClasses();
91
+ }
92
+ if (changes['forceState']) {
93
+ this.updateStateClasses();
94
+ }
80
95
  if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {
81
96
  this.record = changes['record'].currentValue;
82
97
  this.updateField();
83
98
  }
84
99
  }
85
- // updateMetadataValidity() {
86
- // if (this.preLoadedImageMetadataFormGroup.invalid) {
87
- // this.field.FormFormGroup.controls[this.field.Name].setErrors({ 'incorrect': true });
88
- // } else {
89
- // this.field.FormFormGroup.controls[this.field.Name].setErrors(null);
90
- // }
91
- // this.onRecordValueChange();
92
- // }
93
- /**
94
- * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.
95
- */
100
+ ngOnDestroy() {
101
+ if (this.styleEl?.parentNode) {
102
+ this.styleEl.parentNode.removeChild(this.styleEl);
103
+ }
104
+ }
105
+ injectStyles() {
106
+ if (!this.fieldUid)
107
+ return;
108
+ const css = this.field?.ImageFieldStyleCSS ?? {};
109
+ const rules = this.buildCssRules(this.fieldUid, css);
110
+ if (!this.styleEl) {
111
+ this.styleEl = this.renderer.createElement('style');
112
+ this.styleEl.id = 'style-' + this.fieldUid;
113
+ this.renderer.appendChild(document.head, this.styleEl);
114
+ }
115
+ this.styleEl.textContent = rules;
116
+ }
117
+ getSelector(uid, state, s) {
118
+ switch (state) {
119
+ case 'Normale': return `#${uid}${s}`;
120
+ case 'Mouseover': return `#${uid}:hover${s}, #${uid}.eqp-state-hover${s}`;
121
+ default: return null;
122
+ }
123
+ }
124
+ buildCssRules(uid, css) {
125
+ const lines = [];
126
+ for (const el of ELEMENTS) {
127
+ const s = ELEMENT_SELECTORS[el];
128
+ for (const state of STATES) {
129
+ const key = el + state;
130
+ const defaultVal = DEFAULT_FIELD_STYLES[key];
131
+ const userVal = css[key];
132
+ if (!defaultVal?.trim() && !userVal?.trim())
133
+ continue;
134
+ const selector = this.getSelector(uid, state, s);
135
+ if (!selector)
136
+ continue;
137
+ if (defaultVal?.trim())
138
+ lines.push(`${selector} { ${defaultVal} }`);
139
+ if (userVal?.trim())
140
+ lines.push(`${selector} { ${userVal} }`);
141
+ }
142
+ }
143
+ return lines.join('\n');
144
+ }
145
+ updateStateClasses() {
146
+ if (!this.fieldUid)
147
+ return;
148
+ const wrapper = document.getElementById(this.fieldUid);
149
+ if (!wrapper)
150
+ return;
151
+ this.toggleClass(wrapper, 'eqp-state-hover', this.forceState === 'Mouseover');
152
+ }
153
+ toggleClass(el, cls, condition) {
154
+ if (condition)
155
+ this.renderer.addClass(el, cls);
156
+ else
157
+ this.renderer.removeClass(el, cls);
158
+ }
96
159
  updateField() {
97
160
  if ((this.field.DataGetter.DataGetterType == DataGetterTypeEnum.Manuale || this.field.DataGetter.DataGetterType == DataGetterTypeEnum.Formula) && this.field.Formula) {
98
161
  this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, this.formulaObject);
@@ -104,39 +167,21 @@ export class ImageFieldTemplateComponent {
104
167
  resetPreLoadedImage() {
105
168
  this.width = null;
106
169
  this.height = null;
107
- /*this.record[this.field.Name] = [JSON.parse(JSON.stringify(this.field.ContextualAttachment))];*/
108
170
  this.getImageDimensions();
109
171
  }
110
- /**
111
- * Metodo invocato quando vengono aggiunti o eliminati gli allegati nel componente AttachmentFieldTemplate.
112
- * Se l'ImageField è abilitato al disegno (EnableDrawing == true), non permette allegati multipli (IsMulitAttach == false)
113
- * e nel Record corrente è presente l'immagine caricata dall'utente allora recupera le dimensioni dell'immagine e
114
- * apre il dialog con il componente image-drawing per permettere il disegno sull'immagine appena caricata.
115
- */
116
172
  onAttachmentsChange() {
117
173
  /*
118
174
  if (!this.field.AttachDefinition.IsMultiAttach && this.field.EnableDrawing && this.record[this.field.Name] && this.record[this.field.Name][0]) {
119
175
  this.getImageDimensions();
120
- this.dialogImageDrowingRef = this.dialog.open(this.dialogImageDrowing, {
121
- disableClose: true,
122
- hasBackdrop: true,
123
- width: '75%'
124
- });
176
+ this.dialogImageDrowingRef = this.dialog.open(this.dialogImageDrowing, { disableClose: true, hasBackdrop: true, width: '75%' });
125
177
  }
126
178
  */
127
179
  }
128
- /**
129
- * Metodo invocato al salvataggio dell'immagine dal componente image-drawing.
130
- * Trasforma il Blob ricevuto in un base64, aggiorna il FileContetType e il FileDataBase64
131
- * dell'allegato caricato e chiude il dialog in cui disegnare.
132
- * @param drawnPicture Blob dell'immagine disegnata.
133
- */
134
180
  async saveDraw(drawnPicture) {
135
181
  let base64File = await toBase64(drawnPicture);
136
182
  if (base64File) {
137
183
  this.DrawFileBase64 = base64File.split(",")[1];
138
184
  this.FileDataBase64 = this.DrawFileBase64;
139
- // Clono l'attachment originale, gli cambio il FileBase e gli azzero l'ID
140
185
  this.imageDrawAttachment.FileDataBase64 = this.DrawFileBase64;
141
186
  this.imageDraw.emit(this.imageDrawAttachment);
142
187
  }
@@ -144,19 +189,11 @@ export class ImageFieldTemplateComponent {
144
189
  this.closeImageDrowingDialog();
145
190
  }
146
191
  }
147
- /**
148
- * Metodo per chiudere il dialog in cui disegnare sull'immagine cariata e svuotare le dimensioni.
149
- */
150
192
  closeImageDrowingDialog() {
151
193
  this.dialogImageDrawingRef.close();
152
194
  this.width = null;
153
195
  this.height = null;
154
196
  }
155
- /**
156
- * Metodo per recuperare le dimensioni dell'immagine caricata per mostrare correttamente
157
- * il componente image-drawing. Se non viene eseguito questo passaggio l'area in cui disegnare
158
- * è più grande dell'immagine stessa e al salvataggio i tratti disegnati vengono spostati.
159
- */
160
197
  getImageDimensions() {
161
198
  var blob = this.getBlobFromBase64();
162
199
  const reader = new FileReader();
@@ -170,12 +207,6 @@ export class ImageFieldTemplateComponent {
170
207
  };
171
208
  reader.readAsDataURL(blob);
172
209
  }
173
- /**
174
- * Metodo per convertire il base64 di un'immagine in un Blob.
175
- * Necessario per il recupero delle dimensioni dell'immagine caricata a partire dal suo base64.
176
- * Viene eseguito solo nel caso in cui l'ImageField non ammette allegati multipli.
177
- * @returns Restituisce il Blob dell'immagine caricata.
178
- */
179
210
  getBlobFromBase64() {
180
211
  const byteCharacters = atob(this.record[this.field.Name][0].FileDataBase64);
181
212
  const byteNumbers = new Array(byteCharacters.length);
@@ -185,9 +216,6 @@ export class ImageFieldTemplateComponent {
185
216
  const byteArray = new Uint8Array(byteNumbers);
186
217
  return new Blob([byteArray], { type: this.record[this.field.Name][0].FileContentType });
187
218
  }
188
- /**
189
- * Metodo per emettere l'evento che il valore del record è cambiato.
190
- */
191
219
  onRecordValueChange() {
192
220
  if (!this.field.Formula) {
193
221
  this.recordChange.emit(this.record);
@@ -210,35 +238,25 @@ export class ImageFieldTemplateComponent {
210
238
  }
211
239
  load(ID, Types) {
212
240
  this.drawingLoaded = false;
213
- // preparo la versione corretta del form
214
241
  var dynamicModuleParams = [
215
- {
216
- ParamName: "AttachmentID",
217
- ParamValue: ID,
218
- ParamType: ParamTypeEnum["Query param"],
219
- },
220
- {
221
- ParamName: "Types",
222
- ParamValue: Types,
223
- ParamType: ParamTypeEnum["Query param"],
224
- },
242
+ { ParamName: "AttachmentID", ParamValue: ID, ParamType: ParamTypeEnum["Query param"] },
243
+ { ParamName: "Types", ParamValue: Types, ParamType: ParamTypeEnum["Query param"] },
225
244
  ];
226
245
  this.utilityHelperService.RunEndPointCall(this.endPointConfiguration.Forms.GetAttachmentWithBases64, dynamicModuleParams, (res) => {
227
246
  this.FileBase64 = res.FileBases64[ImageFolderEnum.Regular];
228
247
  this.drawingLoaded = true;
229
- }, (err) => {
230
- });
248
+ }, (err) => { });
231
249
  }
232
250
  loadOriginal() {
233
251
  this.load(this.field.DynAttachment.ID, [ImageFolderEnum.Regular]);
234
252
  }
235
253
  }
236
- ImageFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImageFieldTemplateComponent, deps: [{ token: i1.MatDialog }, { token: i2.UtilityHelperService }], target: i0.ɵɵFactoryTarget.Component });
237
- ImageFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ImageFieldTemplateComponent, selector: "image-field-template", inputs: { endPointConfiguration: "endPointConfiguration", record: "record", formulaObject: "formulaObject", field: "field", inConfig: "inConfig" }, outputs: { recordChange: "recordChange", imageDraw: "imageDraw" }, viewQueries: [{ propertyName: "dialogImageDrawing", first: true, predicate: ["dialogImageDrawing"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "\r\n<div class=\"row imageContainer\" style=\"width: {{imageWidth}}px;\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">{{field.Description}}</div>\r\n <div class=\"col-12\">\r\n <img *ngIf=\"field.DynAttachment\"\r\n src=\"data:{{field.DynAttachment.FileContentType}};base64,{{FileDataBase64}}\"\r\n [height]=\"field.DynAttachment.ResizedImageHeightPx != null ? field.DynAttachment.ResizedImageHeightPx : 128\"\r\n class=\"singleImage\">\r\n </div>\r\n <div *ngIf=\"field.EnableDrawing\" class=\"col-12 drawButton\">\r\n <button class=\"btn btn-primary btn-w100\" (click)=\"openDraw()\">Disegna</button>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonKey != null && field.DynAttachment.ButtonKey != ''\" class=\"col-12 flex justify-content-around buttonkey\">\r\n <div>Etichetta</div><div>{{field.DynAttachment.ButtonKey}}</div>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonValue != null && field.DynAttachment.ButtonValue != ''\" class=\"col-12 flex justify-content-around buttonvalue\"> \r\n <div>Valore</div><div>{{field.DynAttachment.ButtonValue}}</div>\r\n </div>\r\n </div> \r\n</div>\r\n\r\n<!-- DIALOG PER DISEGNARE SUL NUOVO ALLEGATO CARICATO -->\r\n<ng-template #dialogImageDrawing>\r\n <div class=\"padder\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-12 col-md-12\">\r\n <tmw-image-drawer *ngIf=\"drawingLoaded\"\r\n [src]=\"'data:'+ field.DynAttachment.FileContentType + ';base64,'+ FileBase64\" \r\n [inConfig]=\"inConfig\"\r\n [showCancelButton]=\"false\" \r\n [enableLoadAnotherImage]=\"false\" \r\n [enableRemoveImage]=\"false\" \r\n [width]=\"field.DynAttachment.ImageWidthPx\"\r\n [height]=\"field.DynAttachment.ImageHeightPx\" \r\n [i18n]=\"i18n\" \r\n [showCancelButton]=\"true\" \r\n (save)=\"saveDraw($event)\" \r\n (loadOriginal)=\"loadOriginal()\" \r\n (closeDialog)=\"closeImageDrowingDialog()\"\r\n >\r\n </tmw-image-drawer>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["::ng-deep image-drawing>button{background-color:var(--primary)!important;color:#fff!important}.imageContainer .singleImage{margin-top:5px;display:block}.drawButton{margin:5px 0}.buttonkey{border-top:1px solid black;padding-top:10px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TmwImageDrawerComponent, selector: "tmw-image-drawer", inputs: ["src", "width", "height", "forceSizeCanvas", "forceSizeExport", "enableRemoveImage", "enableLoadAnotherImage", "enableTooltip", "showCancelButton", "inConfig", "i18n", "locale", "loadingTemplate", "errorTemplate", "outputMimeType", "outputQuality", "borderCss", "drawingSizes", "colors"], outputs: ["closeDialog", "save", "loadOriginal"] }] });
254
+ ImageFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImageFieldTemplateComponent, deps: [{ token: i1.MatDialog }, { token: i2.UtilityHelperService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
255
+ ImageFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ImageFieldTemplateComponent, selector: "image-field-template", inputs: { endPointConfiguration: "endPointConfiguration", record: "record", formulaObject: "formulaObject", field: "field", inConfig: "inConfig", styleVersion: "styleVersion", forceState: "forceState" }, outputs: { recordChange: "recordChange", imageDraw: "imageDraw" }, viewQueries: [{ propertyName: "dialogImageDrawing", first: true, predicate: ["dialogImageDrawing"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"{{fieldUid}}\">\r\n <div class=\"row imageContainer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 image-label\">{{field.Description}}</div>\r\n <div class=\"col-12\">\r\n <img *ngIf=\"field.DynAttachment\"\r\n src=\"data:{{field.DynAttachment.FileContentType}};base64,{{FileDataBase64}}\"\r\n [height]=\"field.DynAttachment.ResizedImageHeightPx != null ? field.DynAttachment.ResizedImageHeightPx : 128\"\r\n class=\"singleImage\">\r\n </div>\r\n <div *ngIf=\"field.EnableDrawing\" class=\"col-12 drawButton\">\r\n <button class=\"btn btn-primary btn-w100\" (click)=\"openDraw()\">Disegna</button>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonKey != null && field.DynAttachment.ButtonKey != ''\"\r\n class=\"col-12 flex justify-content-around buttonkey\">\r\n <div>Etichetta</div>\r\n <div>{{field.DynAttachment.ButtonKey}}</div>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonValue != null && field.DynAttachment.ButtonValue != ''\"\r\n class=\"col-12 flex justify-content-around buttonvalue\">\r\n <div>Valore</div>\r\n <div>{{field.DynAttachment.ButtonValue}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- DIALOG PER DISEGNARE SUL NUOVO ALLEGATO CARICATO -->\r\n<ng-template #dialogImageDrawing>\r\n <div class=\"padder\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-12 col-md-12\">\r\n <tmw-image-drawer *ngIf=\"drawingLoaded\"\r\n [src]=\"'data:'+ field.DynAttachment.FileContentType + ';base64,'+ FileBase64\"\r\n [inConfig]=\"inConfig\" [showCancelButton]=\"false\" [enableLoadAnotherImage]=\"false\"\r\n [enableRemoveImage]=\"false\" [width]=\"field.DynAttachment.ImageWidthPx\"\r\n [height]=\"field.DynAttachment.ImageHeightPx\" [i18n]=\"i18n\" [showCancelButton]=\"true\"\r\n (save)=\"saveDraw($event)\" (loadOriginal)=\"loadOriginal()\"\r\n (closeDialog)=\"closeImageDrowingDialog()\">\r\n </tmw-image-drawer>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["::ng-deep image-drawing>button{background-color:var(--primary)!important;color:#fff!important}.imageContainer .singleImage{margin-top:5px;display:block}.drawButton{margin:5px 0}.buttonkey{border-top:1px solid black;padding-top:10px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TmwImageDrawerComponent, selector: "tmw-image-drawer", inputs: ["src", "width", "height", "forceSizeCanvas", "forceSizeExport", "enableRemoveImage", "enableLoadAnotherImage", "enableTooltip", "showCancelButton", "inConfig", "i18n", "locale", "loadingTemplate", "errorTemplate", "outputMimeType", "outputQuality", "borderCss", "drawingSizes", "colors"], outputs: ["closeDialog", "save", "loadOriginal"] }] });
238
256
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImageFieldTemplateComponent, decorators: [{
239
257
  type: Component,
240
- args: [{ selector: 'image-field-template', template: "\r\n<div class=\"row imageContainer\" style=\"width: {{imageWidth}}px;\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">{{field.Description}}</div>\r\n <div class=\"col-12\">\r\n <img *ngIf=\"field.DynAttachment\"\r\n src=\"data:{{field.DynAttachment.FileContentType}};base64,{{FileDataBase64}}\"\r\n [height]=\"field.DynAttachment.ResizedImageHeightPx != null ? field.DynAttachment.ResizedImageHeightPx : 128\"\r\n class=\"singleImage\">\r\n </div>\r\n <div *ngIf=\"field.EnableDrawing\" class=\"col-12 drawButton\">\r\n <button class=\"btn btn-primary btn-w100\" (click)=\"openDraw()\">Disegna</button>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonKey != null && field.DynAttachment.ButtonKey != ''\" class=\"col-12 flex justify-content-around buttonkey\">\r\n <div>Etichetta</div><div>{{field.DynAttachment.ButtonKey}}</div>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonValue != null && field.DynAttachment.ButtonValue != ''\" class=\"col-12 flex justify-content-around buttonvalue\"> \r\n <div>Valore</div><div>{{field.DynAttachment.ButtonValue}}</div>\r\n </div>\r\n </div> \r\n</div>\r\n\r\n<!-- DIALOG PER DISEGNARE SUL NUOVO ALLEGATO CARICATO -->\r\n<ng-template #dialogImageDrawing>\r\n <div class=\"padder\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-12 col-md-12\">\r\n <tmw-image-drawer *ngIf=\"drawingLoaded\"\r\n [src]=\"'data:'+ field.DynAttachment.FileContentType + ';base64,'+ FileBase64\" \r\n [inConfig]=\"inConfig\"\r\n [showCancelButton]=\"false\" \r\n [enableLoadAnotherImage]=\"false\" \r\n [enableRemoveImage]=\"false\" \r\n [width]=\"field.DynAttachment.ImageWidthPx\"\r\n [height]=\"field.DynAttachment.ImageHeightPx\" \r\n [i18n]=\"i18n\" \r\n [showCancelButton]=\"true\" \r\n (save)=\"saveDraw($event)\" \r\n (loadOriginal)=\"loadOriginal()\" \r\n (closeDialog)=\"closeImageDrowingDialog()\"\r\n >\r\n </tmw-image-drawer>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["::ng-deep image-drawing>button{background-color:var(--primary)!important;color:#fff!important}.imageContainer .singleImage{margin-top:5px;display:block}.drawButton{margin:5px 0}.buttonkey{border-top:1px solid black;padding-top:10px}\n"] }]
241
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.UtilityHelperService }]; }, propDecorators: { endPointConfiguration: [{
258
+ args: [{ selector: 'image-field-template', template: "<div id=\"{{fieldUid}}\">\r\n <div class=\"row imageContainer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 image-label\">{{field.Description}}</div>\r\n <div class=\"col-12\">\r\n <img *ngIf=\"field.DynAttachment\"\r\n src=\"data:{{field.DynAttachment.FileContentType}};base64,{{FileDataBase64}}\"\r\n [height]=\"field.DynAttachment.ResizedImageHeightPx != null ? field.DynAttachment.ResizedImageHeightPx : 128\"\r\n class=\"singleImage\">\r\n </div>\r\n <div *ngIf=\"field.EnableDrawing\" class=\"col-12 drawButton\">\r\n <button class=\"btn btn-primary btn-w100\" (click)=\"openDraw()\">Disegna</button>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonKey != null && field.DynAttachment.ButtonKey != ''\"\r\n class=\"col-12 flex justify-content-around buttonkey\">\r\n <div>Etichetta</div>\r\n <div>{{field.DynAttachment.ButtonKey}}</div>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonValue != null && field.DynAttachment.ButtonValue != ''\"\r\n class=\"col-12 flex justify-content-around buttonvalue\">\r\n <div>Valore</div>\r\n <div>{{field.DynAttachment.ButtonValue}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- DIALOG PER DISEGNARE SUL NUOVO ALLEGATO CARICATO -->\r\n<ng-template #dialogImageDrawing>\r\n <div class=\"padder\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-12 col-md-12\">\r\n <tmw-image-drawer *ngIf=\"drawingLoaded\"\r\n [src]=\"'data:'+ field.DynAttachment.FileContentType + ';base64,'+ FileBase64\"\r\n [inConfig]=\"inConfig\" [showCancelButton]=\"false\" [enableLoadAnotherImage]=\"false\"\r\n [enableRemoveImage]=\"false\" [width]=\"field.DynAttachment.ImageWidthPx\"\r\n [height]=\"field.DynAttachment.ImageHeightPx\" [i18n]=\"i18n\" [showCancelButton]=\"true\"\r\n (save)=\"saveDraw($event)\" (loadOriginal)=\"loadOriginal()\"\r\n (closeDialog)=\"closeImageDrowingDialog()\">\r\n </tmw-image-drawer>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["::ng-deep image-drawing>button{background-color:var(--primary)!important;color:#fff!important}.imageContainer .singleImage{margin-top:5px;display:block}.drawButton{margin:5px 0}.buttonkey{border-top:1px solid black;padding-top:10px}\n"] }]
259
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.UtilityHelperService }, { type: i0.Renderer2 }]; }, propDecorators: { endPointConfiguration: [{
242
260
  type: Input
243
261
  }], record: [{
244
262
  type: Input
@@ -248,6 +266,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
248
266
  type: Input
249
267
  }], inConfig: [{
250
268
  type: Input
269
+ }], styleVersion: [{
270
+ type: Input
271
+ }], forceState: [{
272
+ type: Input
251
273
  }], recordChange: [{
252
274
  type: Output
253
275
  }], imageDraw: [{
@@ -256,4 +278,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
256
278
  type: ViewChild,
257
279
  args: ["dialogImageDrawing", { static: true }]
258
280
  }] } });
259
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2ZpZWxkLXRlbXBsYXRlcy9pbWFnZS1maWVsZC10ZW1wbGF0ZS9pbWFnZS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL2ltYWdlLWZpZWxkLXRlbXBsYXRlL2ltYWdlLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUE4QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakksT0FBTyxFQUFjLGVBQWUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBR3pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBR25GLE9BQU8sRUFBeUIsYUFBYSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFdEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7OztBQUV4RTs7OztHQUlHO0FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxP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LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJbWFnZUZpZWxkLCBJbWFnZUZvbGRlckVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL2ltYWdlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvcmVjb3JkLm1vZGVsJztcclxuaW1wb3J0IHsgSUJhc2VGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2ludGVyZmFjZXMvaUJhc2VGaWVsZENvbXBvbmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEkxOG5JbnRlcmZhY2UgfSBmcm9tICcuLi8uLi90bXctaW1hZ2UtZHJhd2VyL2kxOG4nO1xyXG5pbXBvcnQgeyBFbmRQb2ludENvbmZpZ3VyYXRpb24sIFBhcmFtVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRHluQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9keW5BdHRhY2htZW50JztcclxuaW1wb3J0IHsgRGF0YUdldHRlclR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Jhc2VGaWVsZC5tb2RlbCc7XHJcblxyXG4vKipcclxuICogTWV0b2RvIHBlciByZWN1cGVyYXJlLCBhIHBhcnRpcmUgZGEgdW4gQmxvYiwgbGEgc3RyaW5nYSBjb250ZW5lbnRlIGlsIGJhc2U2NCBkZWwgZmlsZS5cclxuICogVXNhdG8gcGVyIHByZW5kZXJlIGlsIGJhc2U2NCBkZWxsJ2ltbWFnaW5lIGRvcG8gY2hlIGwndXRlbnRlIGNpIGhhIGRpc2VnbmF0byBzb3ByYS5cclxuICogQHBhcmFtIGZpbGUgQmxvYiBjaGUgcmFwcHJlc2VudGEgbCdpbW1hZ2luZS5cclxuICovXHJcbmNvbnN0IHRvQmFzZTY0ID0gZmlsZSA9PiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xyXG59KTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaW1hZ2UtZmllbGQtdGVtcGxhdGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW1hZ2UtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW1hZ2VGaWVsZFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIElCYXNlRmllbGRDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICBASW5wdXQoKSByZWNvcmQ6IFJlY29yZDtcclxuICBASW5wdXQoKSBmb3JtdWxhT2JqZWN0OiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBmaWVsZDogSW1hZ2VGaWVsZDtcclxuICBASW5wdXQoKSBpbkNvbmZpZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgQE91dHB1dCgpIGltYWdlRHJhdzogRXZlbnRFbWl0dGVyPER5bkF0dGFjaG1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5BdHRhY2htZW50PigpO1xyXG5cclxuICBpbWFnZVdpZHRoOiBudW1iZXIgPSAwO1xyXG4gIGRyYXdpbmdMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBGaWxlQmFzZTY0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIERyYXdGaWxlQmFzZTY0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIEZpbGVEYXRhQmFzZTY0OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBBdHRhY2htZW50SUQ6IHN0cmluZyB8IG51bWJlcjtcclxuXHJcbiAgaW1hZ2VEcmF3QXR0YWNobWVudDogRHluQXR0YWNobWVudDtcclxuICBcclxuXHJcbiAgLy9wcmVMb2FkZWRJbWFnZU1ldGFkYXRhRm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICAvLyNyZWdpb24gUHJvcHJpZXTDoCBwZXIgY29uZmlndXJhcmUgaWwgY29tcG9uZW50ZSBuZ3gtaW1hZ2UtZHJhd2luZyBlIGFwcmlyZSBpbCByZWxhdGl2byBkaWFsb2cuXHJcbiAgcHVibGljIHdpZHRoID0gbnVsbDtcclxuICBwdWJsaWMgaGVpZ2h0ID0gbnVsbDtcclxuICBwdWJsaWMgaTE4bjogSTE4bkludGVyZmFjZSA9IHtcclxuICAgIHNhdmVCdG46ICdTYWx2YSBtb2RpZmljaGUnLFxyXG4gICAgY2FuY2VsQnRuOiAnUmljYXJpY2Egb3JpZ2luYWxlJyxcclxuICAgIGNsb3NlRGlhbG9nOiAnQW5udWxsYSBkaXNlZ25vJyxcclxuICB9O1xyXG4gIGRpYWxvZ0ltYWdlRHJhd2luZ1JlZjogTWF0RGlhbG9nUmVmPFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dJbWFnZURyYXdpbmdcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nSW1hZ2VEcmF3aW5nOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIHV0aWxpdHlIZWxwZXJTZXJ2aWNlOiBVdGlsaXR5SGVscGVyU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID09IG51bGwgfHwgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9PSAwKXtcclxuICAgICAgdGhpcy5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NDtcclxuICAgICAgdGhpcy5pbWFnZVdpZHRoID0gICh0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggLyB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VIZWlnaHRQeCAqIHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JbWFnZVdpZHRoUHgpICsgNTA7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQ7XHJcblxyXG4gICAgICB0aGlzLmltYWdlRHJhd0F0dGFjaG1lbnQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZmllbGQuRHluQXR0YWNobWVudCkpO1xyXG4gICAgICB0aGlzLmltYWdlRHJhd0F0dGFjaG1lbnQuSUQgPSAwO1xyXG5cclxuICAgICAgdGhpcy5BdHRhY2htZW50SUQgPSB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSUQ7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID09PSAnc3RyaW5nJyl7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9IEpTT04ucGFyc2UodGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbWFnZVdpZHRoID0gICh0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggLyB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VIZWlnaHRQeCAqIHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JbWFnZVdpZHRoUHgpICsgNTA7XHJcblxyXG4gICAgICBpZiAoKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gYXMgRHluQXR0YWNobWVudCkuRmlsZUJhc2VzNjQgIT0gbnVsbCl7XHJcbiAgICAgICAgdGhpcy5GaWxlRGF0YUJhc2U2NCA9ICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdIGFzIER5bkF0dGFjaG1lbnQpLkZpbGVCYXNlczY0W0ltYWdlRm9sZGVyRW51bS5SZWd1bGFyXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLkZpbGVEYXRhQmFzZTY0ID0gKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gYXMgRHluQXR0YWNobWVudCkuRmlsZURhdGFCYXNlNjQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdIGFzIER5bkF0dGFjaG1lbnQpLkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5GaWxlRGF0YUJhc2U2NDtcclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VEcmF3QXR0YWNobWVudCA9IHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV07XHJcbiAgICAgIHRoaXMuaW1hZ2VEcmF3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuRmlsZURhdGFCYXNlNjQ7XHJcblxyXG4gICAgICB0aGlzLkF0dGFjaG1lbnRJRCA9IHRoaXMuaW1hZ2VEcmF3QXR0YWNobWVudC5JRDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlY29yZENoYW5nZS5lbWl0KHRoaXMucmVjb3JkKTtcclxuXHJcblxyXG4gICAgLy8gQ2xvbm8gbCdhdHRhY2htZW50IG9yaWdpbmFsZSwgZ2xpIGNhbWJpbyBpbCBGaWxlQmFzZSBlIGdsaSBhenplcm8gbCdJRFxyXG5cclxuICAgIC8vIHRoaXMuaW1hZ2VEcmF3QXR0YWNobWVudC5GaWxlTmFtZSA9IFwiXCI7XHJcbiAgICAvLyB0aGlzLmltYWdlRHJhd0F0dGFjaG1lbnQuRmlsZVBhdGggPSBcIlwiO1xyXG5cclxuICAgIHRoaXMuaW1hZ2VEcmF3LmVtaXQodGhpcy5pbWFnZURyYXdBdHRhY2htZW50KTtcclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWVsZCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgLy8gU2UgdmllbmUgbW9kaWZpY2F0byBpbCB2YWxvcmUgZGkgXCJuZ01vZGVsSW5wdXRcIiBhbGxvcmEgYWdnaW9ybmEgbCdpbnB1dFxyXG4gICAgaWYgKGNoYW5nZXNbJ3JlY29yZCddICE9IHVuZGVmaW5lZCAmJiBjaGFuZ2VzWydyZWNvcmQnXS5maXJzdENoYW5nZSA9PSBmYWxzZSAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5jdXJyZW50VmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3JlY29yZCddLnByZXZpb3VzVmFsdWUpKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkID0gY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpZWxkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gdXBkYXRlTWV0YWRhdGFWYWxpZGl0eSgpIHtcclxuICAvLyAgIGlmICh0aGlzLnByZUxvYWRlZEltYWdlTWV0YWRhdGFGb3JtR3JvdXAuaW52YWxpZCkge1xyXG4gIC8vICAgICB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5OYW1lXS5zZXRFcnJvcnMoeyAnaW5jb3JyZWN0JzogdHJ1ZSB9KTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuZmllbGQuRm9ybUZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZpZWxkLk5hbWVdLnNldEVycm9ycyhudWxsKTtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMub25SZWNvcmRWYWx1ZUNoYW5nZSgpO1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgYWdnaW9ybmFyZSBpbCB2YWxvcmUgZGVsIGNhbXBvIHF1YW5kbyBxdWVzdG8gw6ggcmFwcHJlc2VudGF0byBkYSB1bmEgZm9ybXVsYS5cclxuICAgKi9cclxuICB1cGRhdGVGaWVsZCgpIHtcclxuICAgIGlmICgodGhpcy5maWVsZC5EYXRhR2V0dGVyLkRhdGFHZXR0ZXJUeXBlID09IERhdGFHZXR0ZXJUeXBlRW51bS5NYW51YWxlIHx8IHRoaXMuZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZSA9PSBEYXRhR2V0dGVyVHlwZUVudW0uRm9ybXVsYSkgJiYgdGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLkZvcm11bGEsIHRoaXMucmVjb3JkLCB0aGlzLmZvcm11bGFPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmllbGQuVmlzaWJsZUlmKSB7XHJcbiAgICAgIHRoaXMuZmllbGQuSW5MaXN0VmlldyA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKHRoaXMuZmllbGQuVmlzaWJsZUlmLCB0aGlzLnJlY29yZCwgdGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICByZXNldFByZUxvYWRlZEltYWdlKCkge1xyXG4gICAgdGhpcy53aWR0aCA9IG51bGw7XHJcbiAgICB0aGlzLmhlaWdodCA9IG51bGw7XHJcbiAgICAvKnRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSBbSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZpZWxkLkNvbnRleHR1YWxBdHRhY2htZW50KSldOyovXHJcbiAgICB0aGlzLmdldEltYWdlRGltZW5zaW9ucygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIHF1YW5kbyB2ZW5nb25vIGFnZ2l1bnRpIG8gZWxpbWluYXRpIGdsaSBhbGxlZ2F0aSBuZWwgY29tcG9uZW50ZSBBdHRhY2htZW50RmllbGRUZW1wbGF0ZS5cclxuICAgKiBTZSBsJ0ltYWdlRmllbGQgw6ggYWJpbGl0YXRvIGFsIGRpc2Vnbm8gKEVuYWJsZURyYXdpbmcgPT0gdHJ1ZSksIG5vbiBwZXJtZXR0ZSBhbGxlZ2F0aSBtdWx0aXBsaSAoSXNNdWxpdEF0dGFjaCA9PSBmYWxzZSlcclxuICAgKiBlIG5lbCBSZWNvcmQgY29ycmVudGUgw6ggcHJlc2VudGUgbCdpbW1hZ2luZSBjYXJpY2F0YSBkYWxsJ3V0ZW50ZSBhbGxvcmEgcmVjdXBlcmEgbGUgZGltZW5zaW9uaSBkZWxsJ2ltbWFnaW5lIGVcclxuICAgKiBhcHJlIGlsIGRpYWxvZyBjb24gaWwgY29tcG9uZW50ZSBpbWFnZS1kcmF3aW5nIHBlciBwZXJtZXR0ZXJlIGlsIGRpc2Vnbm8gc3VsbCdpbW1hZ2luZSBhcHBlbmEgY2FyaWNhdGEuXHJcbiAgICovXHJcbiAgb25BdHRhY2htZW50c0NoYW5nZSgpIHtcclxuICAgIC8qXHJcbiAgICBpZiAoIXRoaXMuZmllbGQuQXR0YWNoRGVmaW5pdGlvbi5Jc011bHRpQXR0YWNoICYmIHRoaXMuZmllbGQuRW5hYmxlRHJhd2luZyAmJiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdICYmIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV1bMF0pIHtcclxuICAgICAgdGhpcy5nZXRJbWFnZURpbWVuc2lvbnMoKTtcclxuICAgICAgdGhpcy5kaWFsb2dJbWFnZURyb3dpbmdSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nSW1hZ2VEcm93aW5nLCB7XHJcbiAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxyXG4gICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgIHdpZHRoOiAnNzUlJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgICovXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gaW52b2NhdG8gYWwgc2FsdmF0YWdnaW8gZGVsbCdpbW1hZ2luZSBkYWwgY29tcG9uZW50ZSBpbWFnZS1kcmF3aW5nLlxyXG4gICAqIFRyYXNmb3JtYSBpbCBCbG9iIHJpY2V2dXRvIGluIHVuIGJhc2U2NCwgYWdnaW9ybmEgaWwgRmlsZUNvbnRldFR5cGUgZSBpbCBGaWxlRGF0YUJhc2U2NFxyXG4gICAqIGRlbGwnYWxsZWdhdG8gY2FyaWNhdG8gZSBjaGl1ZGUgaWwgZGlhbG9nIGluIGN1aSBkaXNlZ25hcmUuXHJcbiAgICogQHBhcmFtIGRyYXduUGljdHVyZSBCbG9iIGRlbGwnaW1tYWdpbmUgZGlzZWduYXRhLlxyXG4gICAqL1xyXG4gIGFzeW5jIHNhdmVEcmF3KGRyYXduUGljdHVyZTogQmxvYikge1xyXG4gICAgbGV0IGJhc2U2NEZpbGUgPSBhd2FpdCB0b0Jhc2U2NChkcmF3blBpY3R1cmUpO1xyXG4gICAgaWYgKGJhc2U2NEZpbGUpIHtcclxuICAgICAgdGhpcy5EcmF3RmlsZUJhc2U2NCA9IGJhc2U2NEZpbGUuc3BsaXQoXCIsXCIpWzFdO1xyXG4gICAgICB0aGlzLkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5EcmF3RmlsZUJhc2U2NDtcclxuXHJcbiAgICAgIC8vIENsb25vIGwnYXR0YWNobWVudCBvcmlnaW5hbGUsIGdsaSBjYW1iaW8gaWwgRmlsZUJhc2UgZSBnbGkgYXp6ZXJvIGwnSURcclxuICAgICAgdGhpcy5pbWFnZURyYXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5EcmF3RmlsZUJhc2U2NDtcclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VEcmF3LmVtaXQodGhpcy5pbWFnZURyYXdBdHRhY2htZW50KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGlhbG9nSW1hZ2VEcmF3aW5nUmVmKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VJbWFnZURyb3dpbmdEaWFsb2coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY2hpdWRlcmUgaWwgZGlhbG9nIGluIGN1aSBkaXNlZ25hcmUgc3VsbCdpbW1hZ2luZSBjYXJpYXRhIGUgc3Z1b3RhcmUgbGUgZGltZW5zaW9uaS5cclxuICAgKi9cclxuICBjbG9zZUltYWdlRHJvd2luZ0RpYWxvZygpIHtcclxuICAgIHRoaXMuZGlhbG9nSW1hZ2VEcmF3aW5nUmVmLmNsb3NlKCk7XHJcbiAgICB0aGlzLndpZHRoID0gbnVsbDtcclxuICAgIHRoaXMuaGVpZ2h0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgcmVjdXBlcmFyZSBsZSBkaW1lbnNpb25pIGRlbGwnaW1tYWdpbmUgY2FyaWNhdGEgcGVyIG1vc3RyYXJlIGNvcnJldHRhbWVudGVcclxuICAgKiBpbCBjb21wb25lbnRlIGltYWdlLWRyYXdpbmcuIFNlIG5vbiB2aWVuZSBlc2VndWl0byBxdWVzdG8gcGFzc2FnZ2lvIGwnYXJlYSBpbiBjdWkgZGlzZWduYXJlIFxyXG4gICAqIMOoIHBpw7kgZ3JhbmRlIGRlbGwnaW1tYWdpbmUgc3Rlc3NhIGUgYWwgc2FsdmF0YWdnaW8gaSB0cmF0dGkgZGlzZWduYXRpIHZlbmdvbm8gc3Bvc3RhdGkuIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW1hZ2VEaW1lbnNpb25zKCkge1xyXG4gICAgdmFyIGJsb2I6IEJsb2IgPSB0aGlzLmdldEJsb2JGcm9tQmFzZTY0KCk7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1hZ2Uuc3JjID0gZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICBpbWFnZS5vbmxvYWQgPSBycyA9PiB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBycy5jdXJyZW50VGFyZ2V0WydoZWlnaHQnXTtcclxuICAgICAgICB0aGlzLndpZHRoID0gcnMuY3VycmVudFRhcmdldFsnd2lkdGgnXTtcclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY29udmVydGlyZSBpbCBiYXNlNjQgZGkgdW4naW1tYWdpbmUgaW4gdW4gQmxvYi5cclxuICAgKiBOZWNlc3NhcmlvIHBlciBpbCByZWN1cGVybyBkZWxsZSBkaW1lbnNpb25pIGRlbGwnaW1tYWdpbmUgY2FyaWNhdGEgYSBwYXJ0aXJlIGRhbCBzdW8gYmFzZTY0LlxyXG4gICAqIFZpZW5lIGVzZWd1aXRvIHNvbG8gbmVsIGNhc28gaW4gY3VpIGwnSW1hZ2VGaWVsZCBub24gYW1tZXR0ZSBhbGxlZ2F0aSBtdWx0aXBsaS5cclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSBpbCBCbG9iIGRlbGwnaW1tYWdpbmUgY2FyaWNhdGEuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRCbG9iRnJvbUJhc2U2NCgpIHtcclxuICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYih0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdWzBdLkZpbGVEYXRhQmFzZTY0KTtcclxuICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGJ5dGVOdW1iZXJzW2ldID0gYnl0ZUNoYXJhY3RlcnMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcclxuICAgIHJldHVybiBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdWzBdLkZpbGVDb250ZW50VHlwZSB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgZW1ldHRlcmUgbCdldmVudG8gY2hlIGlsIHZhbG9yZSBkZWwgcmVjb3JkIMOoIGNhbWJpYXRvLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25SZWNvcmRWYWx1ZUNoYW5nZSgpIHtcclxuICAgIGlmICghdGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkQ2hhbmdlLmVtaXQodGhpcy5yZWNvcmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5EcmF3KCl7XHJcbiAgICB0aGlzLmRpYWxvZ0ltYWdlRHJhd2luZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4odGhpcy5kaWFsb2dJbWFnZURyYXdpbmcsIHtcclxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxyXG4gICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgcGFuZWxDbGFzczogJ2ltYWdlLW1vZGFsJyxcclxuICAgICAgd2lkdGg6ICc3NSUnXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5BdHRhY2htZW50SUQgIT0gbnVsbCAmJiBOdW1iZXIodGhpcy5BdHRhY2htZW50SUQpID4gMCl7XHJcbiAgICAgIHRoaXMubG9hZCh0aGlzLkF0dGFjaG1lbnRJRCxbSW1hZ2VGb2xkZXJFbnVtLlJlZ3VsYXJdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuRmlsZUJhc2U2NCA9IHRoaXMuRmlsZURhdGFCYXNlNjQ7XHJcbiAgICAgIHRoaXMuZHJhd2luZ0xvYWRlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbG9hZChJRCxUeXBlcyl7XHJcblxyXG4gICAgdGhpcy5kcmF3aW5nTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBwcmVwYXJvIGxhIHZlcnNpb25lIGNvcnJldHRhIGRlbCBmb3JtXHJcbiAgICAgIHZhciBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIFBhcmFtTmFtZTogXCJBdHRhY2htZW50SURcIixcclxuICAgICAgICAgIFBhcmFtVmFsdWU6IElELFxyXG4gICAgICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBQYXJhbU5hbWU6IFwiVHlwZXNcIixcclxuICAgICAgICAgIFBhcmFtVmFsdWU6IFR5cGVzLFxyXG4gICAgICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXTsgICAgXHJcbiAgICAgIFxyXG4gICAgdGhpcy51dGlsaXR5SGVscGVyU2VydmljZS5SdW5FbmRQb2ludENhbGwoXHJcbiAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLkZvcm1zLkdldEF0dGFjaG1lbnRXaXRoQmFzZXM2NCxcclxuICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyxcclxuICAgICAgKHJlczogRHluQXR0YWNobWVudCkgPT4ge1xyXG5cclxuICAgICAgICB0aGlzLkZpbGVCYXNlNjQgPSByZXMuRmlsZUJhc2VzNjRbSW1hZ2VGb2xkZXJFbnVtLlJlZ3VsYXJdO1xyXG4gICAgICAgIHRoaXMuZHJhd2luZ0xvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyKSA9PiB7XHJcblxyXG4gICAgICB9XHJcbiAgICApOyAgICBcclxuICB9XHJcblxyXG4gIGxvYWRPcmlnaW5hbCgpe1xyXG4gICAgdGhpcy5sb2FkKHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JRCxbSW1hZ2VGb2xkZXJFbnVtLlJlZ3VsYXJdKTtcclxuICB9XHJcbiAgXHJcbn0iLCJcclxuPGRpdiBjbGFzcz1cInJvdyBpbWFnZUNvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IHt7aW1hZ2VXaWR0aH19cHg7XCI+XHJcbiAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj57e2ZpZWxkLkRlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICA8aW1nICpuZ0lmPVwiZmllbGQuRHluQXR0YWNobWVudFwiXHJcbiAgICAgICAgICAgICAgIHNyYz1cImRhdGE6e3tmaWVsZC5EeW5BdHRhY2htZW50LkZpbGVDb250ZW50VHlwZX19O2Jhc2U2NCx7e0ZpbGVEYXRhQmFzZTY0fX1cIlxyXG4gICAgICAgICAgICAgICBbaGVpZ2h0XT1cImZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggIT0gbnVsbCA/IGZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggOiAxMjhcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cInNpbmdsZUltYWdlXCI+XHJcbiAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQuRW5hYmxlRHJhd2luZ1wiIGNsYXNzPVwiY29sLTEyIGRyYXdCdXR0b25cIj5cclxuICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tdzEwMFwiIChjbGljayk9XCJvcGVuRHJhdygpXCI+RGlzZWduYTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25LZXkgIT0gbnVsbCAmJiBmaWVsZC5EeW5BdHRhY2htZW50LkJ1dHRvbktleSAhPSAnJ1wiIGNsYXNzPVwiY29sLTEyIGZsZXgganVzdGlmeS1jb250ZW50LWFyb3VuZCBidXR0b25rZXlcIj5cclxuICAgICAgICAgICAgICAgPGRpdj5FdGljaGV0dGE8L2Rpdj48ZGl2Pnt7ZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25LZXl9fTwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25WYWx1ZSAhPSBudWxsICYmIGZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uVmFsdWUgIT0gJydcIiBjbGFzcz1cImNvbC0xMiBmbGV4IGp1c3RpZnktY29udGVudC1hcm91bmQgYnV0dG9udmFsdWVcIj4gXHJcbiAgICAgICAgICAgICAgIDxkaXY+VmFsb3JlPC9kaXY+PGRpdj57e2ZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uVmFsdWV9fTwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgPC9kaXY+ICAgXHJcbjwvZGl2PlxyXG5cclxuPCEtLSBESUFMT0cgUEVSIERJU0VHTkFSRSBTVUwgTlVPVk8gQUxMRUdBVE8gQ0FSSUNBVE8gLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nSW1hZ2VEcmF3aW5nPlxyXG4gICAgIDxkaXYgY2xhc3M9XCJwYWRkZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dG13LWltYWdlLWRyYXdlciAqbmdJZj1cImRyYXdpbmdMb2FkZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCInZGF0YTonKyBmaWVsZC5EeW5BdHRhY2htZW50LkZpbGVDb250ZW50VHlwZSArICc7YmFzZTY0LCcrIEZpbGVCYXNlNjRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtpbkNvbmZpZ109XCJpbkNvbmZpZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NhbmNlbEJ1dHRvbl09XCJmYWxzZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZUxvYWRBbm90aGVySW1hZ2VdPVwiZmFsc2VcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVSZW1vdmVJbWFnZV09XCJmYWxzZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cImZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VXaWR0aFB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiZmllbGQuRHluQXR0YWNobWVudC5JbWFnZUhlaWdodFB4XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaTE4bl09XCJpMThuXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NhbmNlbEJ1dHRvbl09XCJ0cnVlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoc2F2ZSk9XCJzYXZlRHJhdygkZXZlbnQpXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZE9yaWdpbmFsKT1cImxvYWRPcmlnaW5hbCgpXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VEaWFsb2cpPVwiY2xvc2VJbWFnZURyb3dpbmdEaWFsb2coKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdG13LWltYWdlLWRyYXdlcj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2ZpZWxkLXRlbXBsYXRlcy9pbWFnZS1maWVsZC10ZW1wbGF0ZS9pbWFnZS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL2ltYWdlLWZpZWxkLXRlbXBsYXRlL2ltYWdlLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUF5QyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkosT0FBTyxFQUFrQyxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUc3RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUduRixPQUFPLEVBQXlCLGFBQWEsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRXRHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7QUFFeEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFB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bmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEltYWdlRmllbGQsIEltYWdlRmllbGRTdHlsZUNTUywgSW1hZ2VGb2xkZXJFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9pbWFnZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IElCYXNlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL2lCYXNlRmllbGRDb21wb25lbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVXRpbGl0eUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXR5SGVscGVyLnNlcnZpY2VzJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBJMThuSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vdG13LWltYWdlLWRyYXdlci9pMThuJztcclxuaW1wb3J0IHsgRW5kUG9pbnRDb25maWd1cmF0aW9uLCBQYXJhbVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IER5bkF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZHluQXR0YWNobWVudCc7XHJcbmltcG9ydCB7IERhdGFHZXR0ZXJUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5cclxuY29uc3QgdG9CYXNlNjQgPSBmaWxlID0+IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdC50b1N0cmluZygpKTtcclxuICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XHJcbn0pO1xyXG5cclxuY29uc3QgRUxFTUVOVF9TRUxFQ1RPUlM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgQ29udGFpbmVyOiAgICAgICcgLmltYWdlQ29udGFpbmVyJyxcclxuICBEZXNjcml6aW9uZTogICAgJyAuaW1hZ2UtbGFiZWwnLFxyXG4gIEJvdHRvbmVEaXNlZ25hOiAnIC5kcmF3QnV0dG9uIGJ1dHRvbi5idG4nLFxyXG59O1xyXG5jb25zdCBFTEVNRU5UUyA9IE9iamVjdC5rZXlzKEVMRU1FTlRfU0VMRUNUT1JTKTtcclxuY29uc3QgU1RBVEVTID0gWydOb3JtYWxlJywgJ01vdXNlb3ZlciddO1xyXG5jb25zdCBERUZBVUxUX0ZJRUxEX1NUWUxFUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpbWFnZS1maWVsZC10ZW1wbGF0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbWFnZUZpZWxkVGVtcGxhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBJQmFzZUZpZWxkQ29tcG9uZW50IHtcclxuXHJcbiAgQElucHV0KCkgZW5kUG9pbnRDb25maWd1cmF0aW9uOiBFbmRQb2ludENvbmZpZ3VyYXRpb247XHJcbiAgQElucHV0KCkgcmVjb3JkOiBSZWNvcmQ7XHJcbiAgQElucHV0KCkgZm9ybXVsYU9iamVjdDogYW55ID0ge307XHJcbiAgQElucHV0KCkgZmllbGQ6IEltYWdlRmllbGQ7XHJcbiAgQElucHV0KCkgaW5Db25maWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzdHlsZVZlcnNpb246IG51bWJlciA9IDA7XHJcbiAgQElucHV0KCkgZm9yY2VTdGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgQE91dHB1dCgpIHJlY29yZENoYW5nZTogRXZlbnRFbWl0dGVyPFJlY29yZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcclxuICBAT3V0cHV0KCkgaW1hZ2VEcmF3OiBFdmVudEVtaXR0ZXI8RHluQXR0YWNobWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPER5bkF0dGFjaG1lbnQ+KCk7XHJcblxyXG4gIGltYWdlV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgZHJhd2luZ0xvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEZpbGVCYXNlNjQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgRHJhd0ZpbGVCYXNlNjQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgRmlsZURhdGFCYXNlNjQ6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIEF0dGFjaG1lbnRJRDogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGltYWdlRHJhd0F0dGFjaG1lbnQ6IER5bkF0dGFjaG1lbnQ7XHJcblxyXG4gIHB1YmxpYyB3aWR0aCA9IG51bGw7XHJcbiAgcHVibGljIGhlaWdodCA9IG51bGw7XHJcbiAgcHVibGljIGkxOG46IEkxOG5JbnRlcmZhY2UgPSB7XHJcbiAgICBzYXZlQnRuOiAnU2FsdmEgbW9kaWZpY2hlJyxcclxuICAgIGNhbmNlbEJ0bjogJ1JpY2FyaWNhIG9yaWdpbmFsZScsXHJcbiAgICBjbG9zZURpYWxvZzogJ0FubnVsbGEgZGlzZWdubycsXHJcbiAgfTtcclxuICBkaWFsb2dJbWFnZURyYXdpbmdSZWY6IE1hdERpYWxvZ1JlZjxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICBAVmlld0NoaWxkKFwiZGlhbG9nSW1hZ2VEcmF3aW5nXCIsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWxvZ0ltYWdlRHJhd2luZzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgZmllbGRVaWQ6IHN0cmluZztcclxuICBwcml2YXRlIHN0eWxlRWw6IEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSB1dGlsaXR5SGVscGVyU2VydmljZTogVXRpbGl0eUhlbHBlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmllbGRVaWQgPSAnaW1nLScgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCk7XHJcbiAgICB0aGlzLmluamVjdFN0eWxlcygpO1xyXG5cclxuICAgIC8vIEluIGFudGVwcmltYSBjb25maWd1cmF0b3JlIHNlbnphIHVuJ2ltbWFnaW5lIHJlYWxlOiBub24gY2FyaWNhcmUgRHluQXR0YWNobWVudFxyXG4gICAgaWYgKHRoaXMuaW5Db25maWcgJiYgIXRoaXMuZmllbGQuRHluQXR0YWNobWVudCkge1xyXG4gICAgICB0aGlzLmltYWdlV2lkdGggPSAyMDA7XHJcbiAgICAgIHRoaXMudXBkYXRlRmllbGQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID09IG51bGwgfHwgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9PSAwKXtcclxuICAgICAgdGhpcy5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NDtcclxuICAgICAgdGhpcy5pbWFnZVdpZHRoID0gICh0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggLyB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VIZWlnaHRQeCAqIHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JbWFnZVdpZHRoUHgpICsgNTA7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQ7XHJcblxyXG4gICAgICB0aGlzLmltYWdlRHJhd0F0dGFjaG1lbnQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZmllbGQuRHluQXR0YWNobWVudCkpO1xyXG4gICAgICB0aGlzLmltYWdlRHJhd0F0dGFjaG1lbnQuSUQgPSAwO1xyXG5cclxuICAgICAgdGhpcy5BdHRhY2htZW50SUQgPSB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSUQ7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID09PSAnc3RyaW5nJyl7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9IEpTT04ucGFyc2UodGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbWFnZVdpZHRoID0gICh0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggLyB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VIZWlnaHRQeCAqIHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JbWFnZVdpZHRoUHgpICsgNTA7XHJcblxyXG4gICAgICBpZiAoKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gYXMgRHluQXR0YWNobWVudCkuRmlsZUJhc2VzNjQgIT0gbnVsbCl7XHJcbiAgICAgICAgdGhpcy5GaWxlRGF0YUJhc2U2NCA9ICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdIGFzIER5bkF0dGFjaG1lbnQpLkZpbGVCYXNlczY0W0ltYWdlRm9sZGVyRW51bS5SZWd1bGFyXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLkZpbGVEYXRhQmFzZTY0ID0gKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gYXMgRHluQXR0YWNobWVudCkuRmlsZURhdGFCYXNlNjQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdIGFzIER5bkF0dGFjaG1lbnQpLkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5GaWxlRGF0YUJhc2U2NDtcclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VEcmF3QXR0YWNobWVudCA9IHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV07XHJcbiAgICAgIHRoaXMuaW1hZ2VEcmF3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuRmlsZURhdGFCYXNlNjQ7XHJcblxyXG4gICAgICB0aGlzLkF0dGFjaG1lbnRJRCA9IHRoaXMuaW1hZ2VEcmF3QXR0YWNobWVudC5JRDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlY29yZENoYW5nZS5lbWl0KHRoaXMucmVjb3JkKTtcclxuICAgIHRoaXMuaW1hZ2VEcmF3LmVtaXQodGhpcy5pbWFnZURyYXdBdHRhY2htZW50KTtcclxuICAgIHRoaXMudXBkYXRlRmllbGQoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWydzdHlsZVZlcnNpb24nXSAmJiAhY2hhbmdlc1snc3R5bGVWZXJzaW9uJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5pbmplY3RTdHlsZXMoKTtcclxuICAgICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydmb3JjZVN0YXRlJ10pIHtcclxuICAgICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydyZWNvcmQnXSAhPSB1bmRlZmluZWQgJiYgY2hhbmdlc1sncmVjb3JkJ10uZmlyc3RDaGFuZ2UgPT0gZmFsc2UgJiYgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlKSAhPSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLnJlY29yZCA9IGNoYW5nZXNbJ3JlY29yZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGaWVsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zdHlsZUVsPy5wYXJlbnROb2RlKSB7XHJcbiAgICAgIHRoaXMuc3R5bGVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc3R5bGVFbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluamVjdFN0eWxlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZFVpZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgY3NzID0gKHRoaXMuZmllbGQgYXMgSW1hZ2VGaWVsZCk/LkltYWdlRmllbGRTdHlsZUNTUyA/PyAoe30gYXMgSW1hZ2VGaWVsZFN0eWxlQ1NTKTtcclxuICAgIGNvbnN0IHJ1bGVzID0gdGhpcy5idWlsZENzc1J1bGVzKHRoaXMuZmllbGRVaWQsIGNzcyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnN0eWxlRWwpIHtcclxuICAgICAgdGhpcy5zdHlsZUVsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpIGFzIEhUTUxTdHlsZUVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuc3R5bGVFbC5pZCA9ICdzdHlsZS0nICsgdGhpcy5maWVsZFVpZDtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5oZWFkLCB0aGlzLnN0eWxlRWwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdHlsZUVsLnRleHRDb250ZW50ID0gcnVsZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlbGVjdG9yKHVpZDogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCBzOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgY2FzZSAnTm9ybWFsZSc6ICAgcmV0dXJuIGAjJHt1aWR9JHtzfWA7XHJcbiAgICAgIGNhc2UgJ01vdXNlb3Zlcic6IHJldHVybiBgIyR7dWlkfTpob3ZlciR7c30sICMke3VpZH0uZXFwLXN0YXRlLWhvdmVyJHtzfWA7XHJcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZENzc1J1bGVzKHVpZDogc3RyaW5nLCBjc3M6IEltYWdlRmllbGRTdHlsZUNTUyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcclxuICAgIGZvciAoY29uc3QgZWwgb2YgRUxFTUVOVFMpIHtcclxuICAgICAgY29uc3QgcyA9IEVMRU1FTlRfU0VMRUNUT1JTW2VsXTtcclxuICAgICAgZm9yIChjb25zdCBzdGF0ZSBvZiBTVEFURVMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBlbCArIHN0YXRlO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IERFRkFVTFRfRklFTERfU1RZTEVTW2tleV07XHJcbiAgICAgICAgY29uc3QgdXNlclZhbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gKGNzcyBhcyBhbnkpW2tleV07XHJcbiAgICAgICAgaWYgKCFkZWZhdWx0VmFsPy50cmltKCkgJiYgIXVzZXJWYWw/LnRyaW0oKSkgY29udGludWU7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmdldFNlbGVjdG9yKHVpZCwgc3RhdGUsIHMpO1xyXG4gICAgICAgIGlmICghc2VsZWN0b3IpIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmIChkZWZhdWx0VmFsPy50cmltKCkpIGxpbmVzLnB1c2goYCR7c2VsZWN0b3J9IHsgJHtkZWZhdWx0VmFsfSB9YCk7XHJcbiAgICAgICAgaWYgKHVzZXJWYWw/LnRyaW0oKSkgICAgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyAke3VzZXJWYWx9IH1gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTdGF0ZUNsYXNzZXMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGRVaWQpIHJldHVybjtcclxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmZpZWxkVWlkKTtcclxuICAgIGlmICghd3JhcHBlcikgcmV0dXJuO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXN0YXRlLWhvdmVyJywgdGhpcy5mb3JjZVN0YXRlID09PSAnTW91c2VvdmVyJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvZ2dsZUNsYXNzKGVsOiBFbGVtZW50LCBjbHM6IHN0cmluZywgY29uZGl0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoY29uZGl0aW9uKSB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsLCBjbHMpO1xyXG4gICAgZWxzZSB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLCBjbHMpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRmllbGQoKSB7XHJcbiAgICBpZiAoKHRoaXMuZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZSA9PSBEYXRhR2V0dGVyVHlwZUVudW0uTWFudWFsZSB8fCB0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gRGF0YUdldHRlclR5cGVFbnVtLkZvcm11bGEpICYmIHRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEodGhpcy5maWVsZC5Gb3JtdWxhLCB0aGlzLnJlY29yZCwgdGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLlZpc2libGVJZikge1xyXG4gICAgICB0aGlzLmZpZWxkLkluTGlzdFZpZXcgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLlZpc2libGVJZiwgdGhpcy5yZWNvcmQsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldFByZUxvYWRlZEltYWdlKCkge1xyXG4gICAgdGhpcy53aWR0aCA9IG51bGw7XHJcbiAgICB0aGlzLmhlaWdodCA9IG51bGw7XHJcbiAgICB0aGlzLmdldEltYWdlRGltZW5zaW9ucygpO1xyXG4gIH1cclxuXHJcbiAgb25BdHRhY2htZW50c0NoYW5nZSgpIHtcclxuICAgIC8qXHJcbiAgICBpZiAoIXRoaXMuZmllbGQuQXR0YWNoRGVmaW5pdGlvbi5Jc011bHRpQXR0YWNoICYmIHRoaXMuZmllbGQuRW5hYmxlRHJhd2luZyAmJiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdICYmIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV1bMF0pIHtcclxuICAgICAgdGhpcy5nZXRJbWFnZURpbWVuc2lvbnMoKTtcclxuICAgICAgdGhpcy5kaWFsb2dJbWFnZURyb3dpbmdSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nSW1hZ2VEcm93aW5nLCB7IGRpc2FibGVDbG9zZTogdHJ1ZSwgaGFzQmFja2Ryb3A6IHRydWUsIHdpZHRoOiAnNzUlJyB9KTtcclxuICAgIH1cclxuICAgICovXHJcbiAgfVxyXG5cclxuICBhc3luYyBzYXZlRHJhdyhkcmF3blBpY3R1cmU6IEJsb2IpIHtcclxuICAgIGxldCBiYXNlNjRGaWxlID0gYXdhaXQgdG9CYXNlNjQoZHJhd25QaWN0dXJlKTtcclxuICAgIGlmIChiYXNlNjRGaWxlKSB7XHJcbiAgICAgIHRoaXMuRHJhd0ZpbGVCYXNlNjQgPSBiYXNlNjRGaWxlLnNwbGl0KFwiLFwiKVsxXTtcclxuICAgICAgdGhpcy5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuRHJhd0ZpbGVCYXNlNjQ7XHJcbiAgICAgIHRoaXMuaW1hZ2VEcmF3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuRHJhd0ZpbGVCYXNlNjQ7XHJcbiAgICAgIHRoaXMuaW1hZ2VEcmF3LmVtaXQodGhpcy5pbWFnZURyYXdBdHRhY2htZW50KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRpYWxvZ0ltYWdlRHJhd2luZ1JlZikge1xyXG4gICAgICB0aGlzLmNsb3NlSW1hZ2VEcm93aW5nRGlhbG9nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZUltYWdlRHJvd2luZ0RpYWxvZygpIHtcclxuICAgIHRoaXMuZGlhbG9nSW1hZ2VEcmF3aW5nUmVmLmNsb3NlKCk7XHJcbiAgICB0aGlzLndpZHRoID0gbnVsbDtcclxuICAgIHRoaXMuaGVpZ2h0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SW1hZ2VEaW1lbnNpb25zKCkge1xyXG4gICAgdmFyIGJsb2I6IEJsb2IgPSB0aGlzLmdldEJsb2JGcm9tQmFzZTY0KCk7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1hZ2Uuc3JjID0gZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICBpbWFnZS5vbmxvYWQgPSBycyA9PiB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBycy5jdXJyZW50VGFyZ2V0WydoZWlnaHQnXTtcclxuICAgICAgICB0aGlzLndpZHRoID0gcnMuY3VycmVudFRhcmdldFsnd2lkdGgnXTtcclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QmxvYkZyb21CYXNlNjQoKSB7XHJcbiAgICBjb25zdCBieXRlQ2hhcmFjdGVycyA9IGF0b2IodGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXVswXS5GaWxlRGF0YUJhc2U2NCk7XHJcbiAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShieXRlQ2hhcmFjdGVycy5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBieXRlTnVtYmVyc1tpXSA9IGJ5dGVDaGFyYWN0ZXJzLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShieXRlTnVtYmVycyk7XHJcbiAgICByZXR1cm4gbmV3IEJsb2IoW2J5dGVBcnJheV0sIHsgdHlwZTogdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXVswXS5GaWxlQ29udGVudFR5cGUgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uUmVjb3JkVmFsdWVDaGFuZ2UoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZENoYW5nZS5lbWl0KHRoaXMucmVjb3JkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuRHJhdygpe1xyXG4gICAgdGhpcy5kaWFsb2dJbWFnZURyYXdpbmdSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nSW1hZ2VEcmF3aW5nLCB7XHJcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgIHBhbmVsQ2xhc3M6ICdpbWFnZS1tb2RhbCcsXHJcbiAgICAgIHdpZHRoOiAnNzUlJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuQXR0YWNobWVudElEICE9IG51bGwgJiYgTnVtYmVyKHRoaXMuQXR0YWNobWVudElEKSA+IDApe1xyXG4gICAgICB0aGlzLmxvYWQodGhpcy5BdHRhY2htZW50SUQsW0ltYWdlRm9sZGVyRW51bS5SZWd1bGFyXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkZpbGVCYXNlNjQgPSB0aGlzLkZpbGVEYXRhQmFzZTY0O1xyXG4gICAgICB0aGlzLmRyYXdpbmdMb2FkZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZChJRCxUeXBlcyl7XHJcbiAgICB0aGlzLmRyYXdpbmdMb2FkZWQgPSBmYWxzZTtcclxuICAgIHZhciBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICB7IFBhcmFtTmFtZTogXCJBdHRhY2htZW50SURcIiwgUGFyYW1WYWx1ZTogSUQsIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdIH0sXHJcbiAgICAgIHsgUGFyYW1OYW1lOiBcIlR5cGVzXCIsICAgICAgICBQYXJhbVZhbHVlOiBUeXBlcywgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0gfSxcclxuICAgIF07XHJcbiAgICB0aGlzLnV0aWxpdHlIZWxwZXJTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbChcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uRm9ybXMuR2V0QXR0YWNobWVudFdpdGhCYXNlczY0LFxyXG4gICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAocmVzOiBEeW5BdHRhY2htZW50KSA9PiB7XHJcbiAgICAgICAgdGhpcy5GaWxlQmFzZTY0ID0gcmVzLkZpbGVCYXNlczY0W0ltYWdlRm9sZGVyRW51bS5SZWd1bGFyXTtcclxuICAgICAgICB0aGlzLmRyYXdpbmdMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyKSA9PiB7fVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGxvYWRPcmlnaW5hbCgpe1xyXG4gICAgdGhpcy5sb2FkKHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JRCxbSW1hZ2VGb2xkZXJFbnVtLlJlZ3VsYXJdKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBpZD1cInt7ZmllbGRVaWR9fVwiPlxyXG4gICAgIDxkaXYgY2xhc3M9XCJyb3cgaW1hZ2VDb250YWluZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBpbWFnZS1sYWJlbFwiPnt7ZmllbGQuRGVzY3JpcHRpb259fTwvZGl2PlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImZpZWxkLkR5bkF0dGFjaG1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiZGF0YTp7e2ZpZWxkLkR5bkF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlfX07YmFzZTY0LHt7RmlsZURhdGFCYXNlNjR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cImZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggIT0gbnVsbCA/IGZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggOiAxMjhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaW5nbGVJbWFnZVwiPlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLkVuYWJsZURyYXdpbmdcIiBjbGFzcz1cImNvbC0xMiBkcmF3QnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tdzEwMFwiIChjbGljayk9XCJvcGVuRHJhdygpXCI+RGlzZWduYTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uS2V5ICE9IG51bGwgJiYgZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25LZXkgIT0gJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLTEyIGZsZXgganVzdGlmeS1jb250ZW50LWFyb3VuZCBidXR0b25rZXlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PkV0aWNoZXR0YTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3tmaWVsZC5EeW5BdHRhY2htZW50LkJ1dHRvbktleX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25WYWx1ZSAhPSBudWxsICYmIGZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uVmFsdWUgIT0gJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLTEyIGZsZXgganVzdGlmeS1jb250ZW50LWFyb3VuZCBidXR0b252YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+VmFsb3JlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj57e2ZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uVmFsdWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gRElBTE9HIFBFUiBESVNFR05BUkUgU1VMIE5VT1ZPIEFMTEVHQVRPIENBUklDQVRPIC0tPlxyXG48bmctdGVtcGxhdGUgI2RpYWxvZ0ltYWdlRHJhd2luZz5cclxuICAgICA8ZGl2IGNsYXNzPVwicGFkZGVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRtdy1pbWFnZS1kcmF3ZXIgKm5nSWY9XCJkcmF3aW5nTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiJ2RhdGE6JysgZmllbGQuRHluQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgKyAnO2Jhc2U2NCwnKyBGaWxlQmFzZTY0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtpbkNvbmZpZ109XCJpbkNvbmZpZ1wiIFtzaG93Q2FuY2VsQnV0dG9uXT1cImZhbHNlXCIgW2VuYWJsZUxvYWRBbm90aGVySW1hZ2VdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZVJlbW92ZUltYWdlXT1cImZhbHNlXCIgW3dpZHRoXT1cImZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VXaWR0aFB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiZmllbGQuRHluQXR0YWNobWVudC5JbWFnZUhlaWdodFB4XCIgW2kxOG5dPVwiaTE4blwiIFtzaG93Q2FuY2VsQnV0dG9uXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKHNhdmUpPVwic2F2ZURyYXcoJGV2ZW50KVwiIChsb2FkT3JpZ2luYWwpPVwibG9hZE9yaWdpbmFsKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlRGlhbG9nKT1cImNsb3NlSW1hZ2VEcm93aW5nRGlhbG9nKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Rtdy1pbWFnZS1kcmF3ZXI+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19