sf-crud 12.0.1-beta4 → 12.0.1-beta40

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 (29) hide show
  1. package/bundles/sf-crud.umd.js +804 -105
  2. package/bundles/sf-crud.umd.js.map +1 -1
  3. package/esm2015/lib/components/control/control.component.js +104 -9
  4. package/esm2015/lib/components/registro/registro.component.js +238 -32
  5. package/esm2015/lib/components/registro-child/registro-child.component.js +232 -0
  6. package/esm2015/lib/components/tablero/tablero.component.js +81 -19
  7. package/esm2015/lib/sf-crud.module.js +32 -20
  8. package/esm2015/lib/sf-crud.service.js +16 -2
  9. package/esm2015/lib/shared/models/crud-config.model.js +43 -0
  10. package/esm2015/lib/shared/models/data-temp-crud.model.js +6 -0
  11. package/esm2015/lib/shared/models/shema.model.js +7 -0
  12. package/esm2015/lib/shared/services/general.service.js +1 -1
  13. package/esm2015/public-api.js +2 -1
  14. package/fesm2015/sf-crud.js +679 -79
  15. package/fesm2015/sf-crud.js.map +1 -1
  16. package/lib/components/control/control.component.d.ts +15 -2
  17. package/lib/components/registro/registro.component.d.ts +33 -9
  18. package/lib/components/registro-child/registro-child.component.d.ts +36 -0
  19. package/lib/components/tablero/tablero.component.d.ts +17 -4
  20. package/lib/sf-crud.module.d.ts +75 -73
  21. package/lib/sf-crud.service.d.ts +4 -0
  22. package/lib/shared/{services/models → models}/crud-config.model.d.ts +8 -2
  23. package/lib/shared/models/data-temp-crud.model.d.ts +4 -0
  24. package/lib/shared/{services/models → models}/shema.model.d.ts +1 -0
  25. package/lib/shared/services/general.service.d.ts +1 -1
  26. package/package.json +1 -1
  27. package/public-api.d.ts +1 -0
  28. package/esm2015/lib/shared/services/models/crud-config.model.js +0 -43
  29. package/esm2015/lib/shared/services/models/shema.model.js +0 -7
@@ -1,46 +1,60 @@
1
- import { Component, Input } from '@angular/core';
2
- import { CrudConfig, Operations } from '../../shared/services/models/crud-config.model';
3
- import * as jsonpath from 'jsonpath';
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { CrudConfig, Operations } from '../../shared/models/crud-config.model';
3
+ import { DialogService, DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';
4
4
  import { MessageService } from 'primeng/api';
5
+ import { RegistroChildComponent } from '../registro-child/registro-child.component';
6
+ import * as jsonpath from 'jsonpath';
7
+ import * as moment from 'moment';
5
8
  import * as i0 from "@angular/core";
6
9
  import * as i1 from "../../shared/services/general.service";
7
10
  import * as i2 from "@angular/router";
8
11
  import * as i3 from "primeng/api";
9
- import * as i4 from "primeng/blockui";
10
- import * as i5 from "primeng/toast";
11
- import * as i6 from "../control/control.component";
12
- import * as i7 from "@angular/common";
13
- import * as i8 from "primeng/button";
14
- import * as i9 from "primeng/ripple";
12
+ import * as i4 from "primeng/dynamicdialog";
13
+ import * as i5 from "../../sf-crud.service";
14
+ import * as i6 from "primeng/blockui";
15
+ import * as i7 from "primeng/toast";
16
+ import * as i8 from "../control/control.component";
17
+ import * as i9 from "primeng/table";
18
+ import * as i10 from "@angular/common";
19
+ import * as i11 from "primeng/button";
20
+ import * as i12 from "primeng/ripple";
15
21
  export class RegistroComponent {
16
- constructor(generalService, router, messageSerice) {
22
+ constructor(generalService, router, messageSerice, dialogService, sfCrudService) {
17
23
  this.generalService = generalService;
18
24
  this.router = router;
19
25
  this.messageSerice = messageSerice;
26
+ this.dialogService = dialogService;
27
+ this.sfCrudService = sfCrudService;
20
28
  this.idKatios = '';
21
29
  this.idEntidad = '';
22
30
  this.trx = '';
23
31
  this.id = '';
24
- this.enProceso = false;
32
+ this.sendData = new EventEmitter();
33
+ this.onSubmit = new EventEmitter();
34
+ this.dataTemp = [];
25
35
  this.crudConfig = new CrudConfig();
36
+ this.enProceso = false;
26
37
  this.configOperation = new Operations();
38
+ this.isLocal = false;
39
+ this.dataTemp = this.sfCrudService.getDataTemp();
27
40
  }
28
41
  ngOnInit() {
29
42
  this.loadConfigCrud();
30
- this.setLabelSumbit();
31
43
  }
32
44
  loadConfigCrud() {
33
45
  this.enProceso = true;
34
46
  this.generalService.getCrudByEntidad(this.idKatios, this.idEntidad)
35
47
  .then(res => {
48
+ this.setDataTemp(res.esquema, this.dataTemp);
36
49
  this.crudConfig = res;
37
- if (this.trx != 'c')
38
- this.getInfoRegistro(this.crudConfig.registro);
39
- else {
50
+ if (this.trx == 'c') {
40
51
  this.data = this.createObject(this.crudConfig.esquema);
52
+ this.setLabelSumbit();
41
53
  this.enProceso = false;
54
+ this.configOperation = this.crudConfig.registro.operations.find(x => x.type.startsWith(this.trx)) || new Operations();
42
55
  }
43
- this.configOperation = this.crudConfig.registro.operations.find(x => x.type.startsWith(this.trx)) || new Operations();
56
+ else
57
+ this.getInfoRegistro(this.crudConfig.registro);
44
58
  })
45
59
  .catch(err => {
46
60
  console.log(err);
@@ -61,11 +75,25 @@ export class RegistroComponent {
61
75
  let op = configRegistro.operations.find(x => x.type == 'read');
62
76
  let endpoint = (op === null || op === void 0 ? void 0 : op.endpoint) || '';
63
77
  endpoint = endpoint.replace('@idKatios', this.idKatios);
78
+ endpoint = endpoint.replace('@ndocactivo', this.user.UsuarioSistema.NDOC);
64
79
  endpoint = endpoint.replace('@id', this.id);
65
80
  this.generalService.genericRequest((op === null || op === void 0 ? void 0 : op.method) || '', (op === null || op === void 0 ? void 0 : op.server) || '', endpoint)
66
81
  .then((res) => {
67
- this.data = res.data;
82
+ if (res === null || res === void 0 ? void 0 : res.data) {
83
+ if (Array.isArray(res.data))
84
+ this.data = res.data[0];
85
+ else
86
+ this.data = res.data;
87
+ this.trx = 'u';
88
+ }
89
+ else {
90
+ this.trx = 'c';
91
+ this.data = this.createObject(this.crudConfig.esquema);
92
+ console.log(this.data);
93
+ }
68
94
  this.enProceso = false;
95
+ this.configOperation = this.crudConfig.registro.operations.find(x => x.type.startsWith(this.trx)) || new Operations();
96
+ this.setLabelSumbit();
69
97
  })
70
98
  .catch(err => {
71
99
  console.log(err);
@@ -82,19 +110,33 @@ export class RegistroComponent {
82
110
  return jsonpath.query(this.data, scope.replace('.properties', ''))[0];
83
111
  }
84
112
  setValue(value, scope) {
85
- jsonpath.value(this.data, scope.replace('.properties', ''), value);
113
+ switch (typeof (value)) {
114
+ case 'object':
115
+ if (Array.isArray(value))
116
+ value.forEach((val) => jsonpath.value(this.data, val.scope.replace('.properties', ''), val.value));
117
+ else
118
+ jsonpath.value(this.data, scope.replace('.properties', ''), value);
119
+ break;
120
+ default:
121
+ jsonpath.value(this.data, scope.replace('.properties', ''), value);
122
+ break;
123
+ }
124
+ this.applyValuesOnEvent('onChange', this.crudConfig.esquema);
86
125
  }
87
126
  createObject(esquema) {
88
127
  let object = {};
89
128
  switch (esquema.type) {
129
+ case 'numeric':
130
+ return (esquema === null || esquema === void 0 ? void 0 : esquema.default) || 0;
90
131
  case 'string':
91
- case 'number':
92
132
  case 'date':
93
133
  return (esquema === null || esquema === void 0 ? void 0 : esquema.default) ? this.setDefaultValue(esquema.default) : null;
94
134
  case 'boolean':
95
135
  return (esquema === null || esquema === void 0 ? void 0 : esquema.default) || false;
96
136
  case 'array':
97
137
  return [];
138
+ case 'file':
139
+ return null;
98
140
  case 'object':
99
141
  for (const key in esquema === null || esquema === void 0 ? void 0 : esquema.properties) {
100
142
  Object.defineProperty(object, key, { value: this.createObject(esquema === null || esquema === void 0 ? void 0 : esquema.properties[key]), writable: true, enumerable: true, configurable: true });
@@ -106,8 +148,10 @@ export class RegistroComponent {
106
148
  return object;
107
149
  }
108
150
  submit() {
151
+ console.log(this.data);
109
152
  if (!this.validateData())
110
153
  return;
154
+ this.applyValuesOnEvent('onSubmit', this.crudConfig.esquema);
111
155
  this.enProceso = true;
112
156
  let endpoint = this.configOperation.endpoint;
113
157
  endpoint = endpoint.replace('@idKatios', this.idKatios);
@@ -115,9 +159,13 @@ export class RegistroComponent {
115
159
  this.generalService.genericRequest(this.configOperation.method, this.configOperation.server, endpoint, this.data)
116
160
  .then(() => {
117
161
  this.messageSerice.add({ severity: 'success', detail: `Proceso exitoso!` });
162
+ this.enProceso = false;
118
163
  setTimeout(() => {
119
- this.enProceso = false;
120
- this.back();
164
+ var _a, _b;
165
+ if ((_a = this.configOperation) === null || _a === void 0 ? void 0 : _a.redirect)
166
+ this.router.navigate([(_b = this.configOperation) === null || _b === void 0 ? void 0 : _b.redirect]);
167
+ else
168
+ this.onSubmit.emit(this.data);
121
169
  }, 2000);
122
170
  })
123
171
  .catch(err => {
@@ -132,11 +180,24 @@ export class RegistroComponent {
132
180
  return true;
133
181
  }
134
182
  validateDataLocal() {
183
+ var _a, _b, _c, _d;
135
184
  let err = [];
136
- this.configOperation.validations.required.forEach(x => {
185
+ (_b = (_a = this.configOperation.validations) === null || _a === void 0 ? void 0 : _a.required) === null || _b === void 0 ? void 0 : _b.forEach(x => {
137
186
  if (!jsonpath.query(this.data, x.field)[0])
138
187
  err.push(x.message);
139
188
  });
189
+ (_d = (_c = this.configOperation.validations) === null || _c === void 0 ? void 0 : _c.operations) === null || _d === void 0 ? void 0 : _d.forEach((op) => {
190
+ switch (op.action) {
191
+ case 'sumArray':
192
+ let var1 = jsonpath.query(this.data, op.scope[0]).reduce((acc, cur) => acc += cur[op.key], 0);
193
+ let var2 = jsonpath.query(this.data, op.scope[1]).reduce((acc, cur) => acc += cur[op.key], 0);
194
+ if (var1 != var2)
195
+ err.push(op.message);
196
+ break;
197
+ default:
198
+ break;
199
+ }
200
+ });
140
201
  if (err.length != 0)
141
202
  this.messageSerice.add({ severity: 'warn', detail: err.join('. ') });
142
203
  return err.length == 0;
@@ -145,11 +206,13 @@ export class RegistroComponent {
145
206
  let data = null;
146
207
  switch (value) {
147
208
  case '@uactivo':
148
- let uactivo = JSON.parse(localStorage.getItem('oSessionTFM') || '{}');
149
- if (!uactivo)
150
- console.log('Validar configuracion de sesion');
151
- else
152
- data = `${uactivo.UsuarioSistema.TDOC}-${uactivo.UsuarioSistema.NDOC}`;
209
+ data = `${this.user.UsuarioSistema.TDOC}-${this.user.UsuarioSistema.NDOC}`;
210
+ break;
211
+ case '@tdocactivo':
212
+ data = this.user.UsuarioSistema.TDOC;
213
+ break;
214
+ case '@ndocactivo':
215
+ data = this.user.UsuarioSistema.NDOC;
153
216
  break;
154
217
  case '@hoy':
155
218
  data = new Date();
@@ -160,17 +223,154 @@ export class RegistroComponent {
160
223
  }
161
224
  return data;
162
225
  }
226
+ sendNotification(message) {
227
+ this.messageSerice.add(message);
228
+ }
229
+ addObjectArray(element) {
230
+ this.dialogRef = this.dialogService.open(RegistroChildComponent, {
231
+ header: `Detalle`,
232
+ width: '70%',
233
+ modal: true,
234
+ closable: false,
235
+ data: {
236
+ uiEsquema: Object.assign({}, element.elements),
237
+ esquema: this.getControl(element.scope),
238
+ id: this.getValue(element.scope).length + 1
239
+ }
240
+ });
241
+ this.dialogRef.onClose.subscribe((data) => {
242
+ if (data)
243
+ this.data[element.scope.replace('$..properties.', '')].push(data);
244
+ this.applyValuesOnEvent('onChange', this.crudConfig.esquema, element.scope.replace('$..properties.', ''));
245
+ });
246
+ }
247
+ editRow(element, data) {
248
+ this.dialogRef = this.dialogService.open(RegistroChildComponent, {
249
+ header: `Detalle`,
250
+ width: '70%',
251
+ modal: true,
252
+ closable: false,
253
+ data: {
254
+ uiEsquema: Object.assign({}, element.elements),
255
+ esquema: this.getControl(element.scope),
256
+ data: Object.assign({}, data)
257
+ }
258
+ });
259
+ this.dialogRef.onClose.subscribe((data) => {
260
+ if (data)
261
+ this.data[element.scope.replace('$..properties.', '')][data.id - 1] = data;
262
+ this.applyValuesOnEvent('onChange', this.crudConfig.esquema, element.scope.replace('$..properties.', ''));
263
+ });
264
+ }
265
+ deleteRow(element, index) {
266
+ this.data[element.scope.replace('$..properties.', '')].splice(index - 1, 1);
267
+ index = 1;
268
+ this.data[element.scope.replace('$..properties.', '')].forEach((el) => {
269
+ el.id = index;
270
+ index++;
271
+ });
272
+ this.applyValuesOnEvent('onChange', this.crudConfig.esquema, element.scope.replace('$..properties.', ''));
273
+ }
274
+ applyValuesOnEvent(event, esquema, key) {
275
+ if (key) {
276
+ if (esquema.properties[key][event]) {
277
+ esquema.properties[key][event].forEach((value) => {
278
+ this.setValueEvent(this.data, value);
279
+ });
280
+ }
281
+ }
282
+ else {
283
+ for (const key in esquema.properties) {
284
+ if (esquema.properties[key][event]) {
285
+ esquema.properties[key][event].forEach((value) => {
286
+ this.setValueEvent(this.data, value);
287
+ });
288
+ }
289
+ }
290
+ }
291
+ }
292
+ setValueEvent(data, params) {
293
+ var _a;
294
+ let date = moment(new Date());
295
+ switch (params.op) {
296
+ case 'sum':
297
+ jsonpath.value(data, params.scope[1], jsonpath.query(data, params.scope[0]).reduce((acc, cur) => acc += (params === null || params === void 0 ? void 0 : params.key) ? cur[params.key] : cur, 0));
298
+ break;
299
+ case 'concat':
300
+ let array = [];
301
+ (_a = params === null || params === void 0 ? void 0 : params.key) === null || _a === void 0 ? void 0 : _a.reduce((acc, cur) => {
302
+ array.push(jsonpath.query(data, cur)[0]);
303
+ }, []);
304
+ if (params === null || params === void 0 ? void 0 : params.separator)
305
+ jsonpath.value(data, params.scope[0], array.join((params === null || params === void 0 ? void 0 : params.separator) || ' '));
306
+ break;
307
+ case 'enable':
308
+ jsonpath.value(this.crudConfig.esquema, params.scope[0], false);
309
+ break;
310
+ case 'disabled':
311
+ jsonpath.value(this.crudConfig.esquema, params.scope[0], true);
312
+ break;
313
+ case 'replace:endpoint':
314
+ jsonpath.value(this.crudConfig.esquema, params.scope[0], this.crudConfig.esquema.config.endpointtemp.replace(params.scope[1], jsonpath.query(data, `$..${params.key}`)));
315
+ break;
316
+ case 'setNull':
317
+ jsonpath.value(this.data, `$.${params.key}`, null);
318
+ break;
319
+ case 'datediff:years':
320
+ jsonpath.value(this.data, params.scope[0], date.diff(moment(jsonpath.query(this.data, params.scope[1])[0]), 'years'));
321
+ break;
322
+ case 'datediff:months':
323
+ jsonpath.value(this.data, params.scope[0], date.diff(moment(jsonpath.query(this.data, params.scope[1])[0]), 'months'));
324
+ break;
325
+ case 'datediff:weeks':
326
+ jsonpath.value(this.data, params.scope[0], date.diff(moment(jsonpath.query(this.data, params.scope[1])[0]), 'weeks'));
327
+ break;
328
+ case 'datediff:days':
329
+ jsonpath.value(this.data, params.scope[0], date.diff(moment(jsonpath.query(this.data, params.scope[1])[0]), 'days'));
330
+ break;
331
+ default:
332
+ break;
333
+ }
334
+ }
335
+ setDataTemp(esquema, dataTemp) {
336
+ dataTemp.forEach(data => {
337
+ jsonpath.value(esquema, data.scope, data.value);
338
+ });
339
+ }
340
+ applyValuesFromObject(event) {
341
+ if (event.data)
342
+ event.optionValue.forEach((value) => jsonpath.value(this.data, value.scope.replace('.properties', ''), this.aplyFormatValue(value.scope, event.data[value.key])));
343
+ else
344
+ event.optionValue.forEach((value) => jsonpath.value(this.data, value.scope.replace('.properties', ''), null));
345
+ }
346
+ aplyFormatValue(scope, value) {
347
+ let control = jsonpath.query(this.crudConfig.esquema, scope)[0];
348
+ let resp;
349
+ switch (control.type) {
350
+ case 'date':
351
+ resp = new Date(`${value}`);
352
+ break;
353
+ case 'numeric':
354
+ resp = +value;
355
+ break;
356
+ default:
357
+ resp = value;
358
+ break;
359
+ }
360
+ return resp;
361
+ }
163
362
  }
164
- RegistroComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, deps: [{ token: i1.GeneralService }, { token: i2.Router }, { token: i3.MessageService }], target: i0.ɵɵFactoryTarget.Component });
165
- RegistroComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RegistroComponent, selector: "sf-registro", inputs: { idKatios: "idKatios", idEntidad: "idEntidad", trx: "trx", id: "id" }, providers: [MessageService], ngImport: i0, template: "<p-blockUI [blocked]=\"enProceso\">\r\n <i class=\"pi pi-cog pi-spin\" style=\"font-size: 50px\"></i>\r\n</p-blockUI>\r\n\r\n<p-toast></p-toast>\r\n\r\n<div class=\"card\" *ngIf=\"!enProceso\">\r\n <h5 class=\"card-header mb-2\" style=\"display: flex; justify-content: space-between;align-items: center;\">\r\n <span>{{idEntidad}} {{id != '' ? '-' + id : ''}}</span>\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-arrow-left\" (click)=\"back()\"></button>\r\n </h5>\r\n <div *ngFor=\"let element of crudConfig.uiEsquema.elements\" [class]=\"element?.class\">\r\n <ng-container [ngSwitch]=\"element.type\">\r\n <div *ngSwitchCase=\"'Label'\" [style]=\"element?.style\">\r\n {{element?.label}}\r\n </div>\r\n <ng-container *ngSwitchCase=\"'HorizontalLayout'\">\r\n <div *ngFor=\"let el of element.elements\" [class]=\"el?.class\">\r\n <ng-container [ngSwitch]=\"el.type\" >\r\n <sf-control *ngSwitchCase=\"'Control'\" [control]=\"getControl(el.scope)\" [label]=\"el.label\" [value]=\"getValue(el.scope)\" (setValue)=\"setValue($event, el.scope)\"></sf-control>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngSwitchCase=\"'Control'\">\r\n <sf-control *ngSwitchCase=\"'Control'\" [control]=\"getControl(element.scope)\" [label]=\"element.label\"></sf-control>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"btnSubmit\">\r\n <button pButton pRipple type=\"button\" [icon]=\"btnSubmit.icon\" [label]=\"btnSubmit.label\" (click)=\"submit()\"></button>\r\n </div>\r\n</div>", components: [{ type: i4.BlockUI, selector: "p-blockUI", inputs: ["autoZIndex", "baseZIndex", "blocked", "target", "styleClass"] }, { type: i5.Toast, selector: "p-toast", inputs: ["autoZIndex", "baseZIndex", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "key", "style", "styleClass", "breakpoints"], outputs: ["onClose"] }, { type: i6.ControlComponent, selector: "sf-control", inputs: ["control", "label", "value"], outputs: ["setValue"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i9.Ripple, selector: "[pRipple]" }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
363
+ RegistroComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, deps: [{ token: i1.GeneralService }, { token: i2.Router }, { token: i3.MessageService }, { token: i4.DialogService }, { token: i5.SfCrudService }], target: i0.ɵɵFactoryTarget.Component });
364
+ RegistroComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RegistroComponent, selector: "sf-registro", inputs: { idKatios: "idKatios", idEntidad: "idEntidad", trx: "trx", id: "id", user: "user" }, outputs: { sendData: "sendData", onSubmit: "onSubmit" }, providers: [MessageService, DialogService, DynamicDialogConfig, DynamicDialogRef], ngImport: i0, template: "<p-blockUI [blocked]=\"enProceso\">\r\n <i class=\"pi pi-cog pi-spin\" style=\"font-size: 50px\"></i>\r\n</p-blockUI>\r\n\r\n<p-toast></p-toast>\r\n\r\n<div class=\"card\" *ngIf=\"!enProceso\">\r\n <h5 class=\"card-header mb-2\" style=\"display: flex; justify-content: space-between;align-items: center;\">\r\n <span>{{crudConfig.registro?.label || idEntidad}} {{id != '' ? '-' + id : ''}}</span>\r\n <button *ngIf=\"crudConfig.registro?.canBack\" pButton pRipple type=\"button\" icon=\"pi pi-arrow-left\" (click)=\"back()\"></button>\r\n </h5>\r\n <div *ngFor=\"let element of crudConfig.uiEsquema.elements\" [class]=\"element?.class\">\r\n <ng-container [ngSwitch]=\"element.type\">\r\n <div *ngSwitchCase=\"'Label'\" [style]=\"element?.style\">\r\n {{element?.label}}\r\n </div>\r\n <ng-container *ngSwitchCase=\"'HorizontalLayout'\">\r\n <div *ngFor=\"let el of element.elements\" [class]=\"el?.class\">\r\n <ng-container [ngSwitch]=\"el.type\">\r\n <sf-control *ngSwitchCase=\"'Control'\" [control]=\"getControl(el.scope)\" [label]=\"el.label\"\r\n [value]=\"getValue(el.scope)\" (setValue)=\"setValue($event, el.scope)\"\r\n (sendNotification)=\"sendNotification($event)\" (sendObject)=\"applyValuesFromObject($event)\"></sf-control>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'VerticalLayout'\">\r\n <div *ngFor=\"let el of element.elements\" [class]=\"el?.class\">\r\n <ng-container [ngSwitch]=\"el.type\">\r\n <sf-control *ngSwitchCase=\"'Control'\" [control]=\"getControl(el.scope)\" [label]=\"el.label\"\r\n [value]=\"getValue(el.scope)\" (setValue)=\"setValue($event, el.scope)\"\r\n (sendNotification)=\"sendNotification($event)\" (sendObject)=\"applyValuesFromObject($event)\"></sf-control>\r\n <ng-container *ngSwitchCase=\"'Table'\">\r\n <p-table [value]=\"getValue(el.scope)\" [columns]=\"getControl(el.scope).config.columns\">\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex align-items-center justify-content-between\">\r\n <button pButton pRipple icon=\"pi pi-plus\" (click)=\"addObjectArray(el)\"\r\n class=\"p-button-success\"></button>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\">\r\n {{col.label}}\r\n </th>\r\n <ng-container *ngIf=\"trx == 'c' || trx == 'u'\">\r\n <th></th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n <tr>\r\n <ng-container *ngFor=\"let col of columns\" [ngSwitch]=\"col.type\">\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <td>{{rowData[col.col]}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'currency:USD'\">\r\n <td>{{rowData[col.col] | currency: 'USD'}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date:yyyy-mm-dd'\">\r\n <td>{{rowData[col.col] | date: 'yyyy-mm-dd'}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date:dd/mm/yyyy'\">\r\n <td>{{rowData[col.col] | date: 'dd/MM/yyyy'}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <td>\r\n <i *ngIf=\"rowData[col.col]\" class=\"pi pi-check\"></i>\r\n <i *ngIf=\"!rowData[col.col]\" class=\"pi pi-times\"></i>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"trx == 'c' || trx == 'u'\">\r\n <td>\r\n <button pButton pRipple type=\"button\" (click)=\"editRow(el, rowData)\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-info mr-1\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"deleteRow(el, rowIndex)\" icon=\"pi pi-trash\" class=\"p-button-rounded p-button-danger\"></button>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Control'\">\r\n <sf-control [control]=\"getControl(element.scope)\" [label]=\"element.label\"></sf-control>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"card-footer mt-2\" *ngIf=\"btnSubmit\">\r\n <button pButton pRipple type=\"button\" [icon]=\"btnSubmit.icon\" [label]=\"btnSubmit.label\"\r\n (click)=\"submit()\"></button>\r\n </div>\r\n</div>\r\n", components: [{ type: i6.BlockUI, selector: "p-blockUI", inputs: ["target", "autoZIndex", "baseZIndex", "styleClass", "blocked"] }, { type: i7.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { type: i8.ControlComponent, selector: "sf-control", inputs: ["control", "label", "value", "appendTo"], outputs: ["setValue", "sendNotification", "sendObject"] }, { type: i9.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection"], outputs: ["selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i12.Ripple, selector: "[pRipple]" }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i10.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }], pipes: { "currency": i10.CurrencyPipe, "date": i10.DatePipe } });
166
365
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, decorators: [{
167
366
  type: Component,
168
367
  args: [{
169
368
  selector: 'sf-registro',
170
369
  templateUrl: './registro.component.html',
171
- providers: [MessageService]
370
+ providers: [MessageService, DialogService, DynamicDialogConfig, DynamicDialogRef],
371
+ entryComponents: [RegistroComponent]
172
372
  }]
173
- }], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.Router }, { type: i3.MessageService }]; }, propDecorators: { idKatios: [{
373
+ }], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.Router }, { type: i3.MessageService }, { type: i4.DialogService }, { type: i5.SfCrudService }]; }, propDecorators: { idKatios: [{
174
374
  type: Input
175
375
  }], idEntidad: [{
176
376
  type: Input
@@ -178,5 +378,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
178
378
  type: Input
179
379
  }], id: [{
180
380
  type: Input
381
+ }], user: [{
382
+ type: Input
383
+ }], sendData: [{
384
+ type: Output
385
+ }], onSubmit: [{
386
+ type: Output
181
387
  }] } });
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFHekQsT0FBTyxFQUFrQixVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDeEcsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFFckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7QUFRN0MsTUFBTSxPQUFPLGlCQUFpQjtJQWE1QixZQUNVLGNBQThCLEVBQzlCLE1BQWMsRUFDZCxhQUE2QjtRQUY3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGtCQUFhLEdBQWIsYUFBYSxDQUFnQjtRQWQ5QixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsUUFBRyxHQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFFLEdBQVcsRUFBRSxDQUFDO1FBRWxCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsZUFBVSxHQUFlLElBQUksVUFBVSxFQUFFLENBQUM7UUFHMUMsb0JBQWUsR0FBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBTWxELENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFD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Q0FBQyxjQUFjLENBQUM7aUJBQzVCO3VKQUdVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEdlbmVyYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2dlbmVyYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmZpZ1JlZ2lzdHJvLCBDcnVkQ29uZmlnLCBPcGVyYXRpb25zIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL21vZGVscy9jcnVkLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCAqIGFzIGpzb25wYXRoIGZyb20gJ2pzb25wYXRoJztcclxuaW1wb3J0IHsgU2hlbWEgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbW9kZWxzL3NoZW1hLm1vZGVsJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZi1yZWdpc3RybycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JlZ2lzdHJvLmNvbXBvbmVudC5odG1sJyxcclxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgaWRLYXRpb3M6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlkRW50aWRhZDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdHJ4OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHB1YmxpYyBlblByb2Nlc286IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY3J1ZENvbmZpZzogQ3J1ZENvbmZpZyA9IG5ldyBDcnVkQ29uZmlnKCk7XHJcbiAgcHVibGljIGJ0blN1Ym1pdDogYW55O1xyXG4gIHB1YmxpYyBkYXRhOiBhbnk7XHJcbiAgcHVibGljIGNvbmZpZ09wZXJhdGlvbjogT3BlcmF0aW9ucyA9IG5ldyBPcGVyYXRpb25zKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VyaWNlOiBNZXNzYWdlU2VydmljZSxcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZENvbmZpZ0NydWQoKTtcclxuICAgIHRoaXMuc2V0TGFiZWxTdW1iaXQoKTtcclxuICB9XHJcblxyXG4gIGxvYWRDb25maWdDcnVkKCkge1xyXG4gICAgdGhpcy5lblByb2Nlc28gPSB0cnVlO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZXRDcnVkQnlFbnRpZGFkKHRoaXMuaWRLYXRpb3MsIHRoaXMuaWRFbnRpZGFkKVxyXG4gICAgICAudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuY3J1ZENvbmZpZyA9IHJlcztcclxuICAgICAgICBpZiAodGhpcy50cnggIT0gJ2MnKSB0aGlzLmdldEluZm9SZWdpc3Rybyh0aGlzLmNydWRDb25maWcucmVnaXN0cm8pO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5jcmVhdGVPYmplY3QodGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEpO1xyXG4gICAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb25maWdPcGVyYXRpb24gPSB0aGlzLmNydWRDb25maWcucmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlLnN0YXJ0c1dpdGgodGhpcy50cngpKSB8fCBuZXcgT3BlcmF0aW9ucygpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgIHRoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZXRMYWJlbFN1bWJpdCgpIHtcclxuICAgIGlmICh0aGlzLnRyeCA9PSAnYycpIHRoaXMuYnRuU3VibWl0ID0geyBsYWJlbDogJ0d1YXJkYXInLCBpY29uOiAncGkgcGktc2F2ZScgfVxyXG4gICAgZWxzZSBpZiAodGhpcy50cnggPT0gJ3InKSB0aGlzLmJ0blN1Ym1pdCA9IHVuZGVmaW5lZDtcclxuICAgIGVsc2UgaWYgKHRoaXMudHJ4ID09ICd1JykgdGhpcy5idG5TdWJtaXQgPSB7IGxhYmVsOiAnQWN0dWFsaXphcicsIGljb246ICdwaSBwaS1zeW5jJyB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnRyeCA9PSAnZCcpIHRoaXMuYnRuU3VibWl0ID0geyBsYWJlbDogJ0VsaW1pbmFyJywgaWNvbjogJ3BpIHBpLXRyYXNoJyB9XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0SW5mb1JlZ2lzdHJvKGNvbmZpZ1JlZ2lzdHJvOiBDb25maWdSZWdpc3Rybykge1xyXG4gICAgbGV0IG9wID0gY29uZmlnUmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlID09ICdyZWFkJyk7XHJcbiAgICBsZXQgZW5kcG9pbnQgPSBvcD8uZW5kcG9pbnQgfHwgJyc7XHJcbiAgICBlbmRwb2ludCA9IGVuZHBvaW50LnJlcGxhY2UoJ0BpZEthdGlvcycsIHRoaXMuaWRLYXRpb3MpO1xyXG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5yZXBsYWNlKCdAaWQnLCB0aGlzLmlkKTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3Qob3A/Lm1ldGhvZCB8fCAnJywgb3A/LnNlcnZlciB8fCAnJywgZW5kcG9pbnQpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHJlcy5kYXRhO1xyXG4gICAgICAgIHRoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGJhY2soKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuY3J1ZENvbmZpZy5yZWdpc3Ryby5idG5CYWNrKTtcclxuICB9XHJcblxyXG4gIGdldENvbnRyb2woc2NvcGU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGpzb25wYXRoLnF1ZXJ5KHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLCBzY29wZSlbMF07XHJcbiAgfVxyXG5cclxuICBnZXRWYWx1ZShzY29wZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4ganNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCBzY29wZS5yZXBsYWNlKCcucHJvcGVydGllcycsICcnKSlbMF07XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZSh2YWx1ZTogYW55LCBzY29wZTogc3RyaW5nKSB7XHJcbiAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmRhdGEsIHNjb3BlLnJlcGxhY2UoJy5wcm9wZXJ0aWVzJywgJycpLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVPYmplY3QoZXNxdWVtYTogU2hlbWEpIHtcclxuICAgIGxldCBvYmplY3QgPSB7fTtcclxuICAgIHN3aXRjaCAoZXNxdWVtYS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3N0cmluZyc6XHJcbiAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgIHJldHVybiBlc3F1ZW1hPy5kZWZhdWx0ID8gdGhpcy5zZXREZWZhdWx0VmFsdWUoZXNxdWVtYS5kZWZhdWx0KSA6IG51bGw7XHJcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxyXG4gICAgICAgIHJldHVybiBlc3F1ZW1hPy5kZWZhdWx0IHx8IGZhbHNlO1xyXG4gICAgICBjYXNlICdhcnJheSc6XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVzcXVlbWE/LnByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwgeyB2YWx1ZTogdGhpcy5jcmVhdGVPYmplY3QoZXNxdWVtYT8ucHJvcGVydGllc1trZXldKSwgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBzdWJtaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVEYXRhKCkpIHJldHVybjtcclxuICAgIHRoaXMuZW5Qcm9jZXNvID0gdHJ1ZTtcclxuICAgIGxldCBlbmRwb2ludCA9IHRoaXMuY29uZmlnT3BlcmF0aW9uLmVuZHBvaW50O1xyXG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5yZXBsYWNlKCdAaWRLYXRpb3MnLCB0aGlzLmlkS2F0aW9zKVxyXG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5yZXBsYWNlKCdAaWQnLCB0aGlzLmlkKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbmZpZ09wZXJhdGlvbi5tZXRob2QsIHRoaXMuY29uZmlnT3BlcmF0aW9uLnNlcnZlciwgZW5kcG9pbnQsIHRoaXMuZGF0YSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBkZXRhaWw6IGBQcm9jZXNvIGV4aXRvc28hYCB9KVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuYmFjaygpXHJcbiAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcmljZS5hZGQoeyBzZXZlcml0eTogJ3dhcm4nLCBkZXRhaWw6IGAke2Vycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0Vycm9yIG5vIGNvbnRyb2xhZG8sIHBvciBmYXZvciBjb211bmljYXJzZSBjb24gZGVsIGFkbWluLid9YCB9KVxyXG4gICAgICAgIHRoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZURhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWdPcGVyYXRpb24udmFsaWRhdGlvbnMudHlwZSA9PSAnbG9jYWwnKSByZXR1cm4gdGhpcy52YWxpZGF0ZURhdGFMb2NhbCgpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZURhdGFMb2NhbCgpIHtcclxuICAgIGxldCBlcnI6IHN0cmluZ1tdID0gW11cclxuICAgIHRoaXMuY29uZmlnT3BlcmF0aW9uLnZhbGlkYXRpb25zLnJlcXVpcmVkLmZvckVhY2goeCA9PiB7XHJcbiAgICAgIGlmICghanNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCB4LmZpZWxkKVswXSkgZXJyLnB1c2goeC5tZXNzYWdlKTtcclxuICAgIH0pXHJcbiAgICBpZiAoZXJyLmxlbmd0aCAhPSAwKSB0aGlzLm1lc3NhZ2VTZXJpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOiBlcnIuam9pbignLiAnKSB9KVxyXG4gICAgcmV0dXJuIGVyci5sZW5ndGggPT0gMDtcclxuICB9XHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZGF0YSA9IG51bGw7XHJcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgIGNhc2UgJ0B1YWN0aXZvJzpcclxuICAgICAgICBsZXQgdWFjdGl2byA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ29TZXNzaW9uVEZNJykgfHwgJ3t9JylcclxuICAgICAgICBpZiAoIXVhY3Rpdm8pIGNvbnNvbGUubG9nKCdWYWxpZGFyIGNvbmZpZ3VyYWNpb24gZGUgc2VzaW9uJylcclxuICAgICAgICBlbHNlIGRhdGEgPSBgJHt1YWN0aXZvLlVzdWFyaW9TaXN0ZW1hLlRET0N9LSR7dWFjdGl2by5Vc3VhcmlvU2lzdGVtYS5ORE9DfWBcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQGhveSc6XHJcbiAgICAgICAgZGF0YSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFcclxuICB9XHJcblxyXG59XHJcbiIsIjxwLWJsb2NrVUkgW2Jsb2NrZWRdPVwiZW5Qcm9jZXNvXCI+XHJcbiAgICA8aSBjbGFzcz1cInBpIHBpLWNvZyBwaS1zcGluXCIgc3R5bGU9XCJmb250LXNpemU6IDUwcHhcIj48L2k+XHJcbjwvcC1ibG9ja1VJPlxyXG5cclxuPHAtdG9hc3Q+PC9wLXRvYXN0PlxyXG5cclxuPGRpdiBjbGFzcz1cImNhcmRcIiAqbmdJZj1cIiFlblByb2Nlc29cIj5cclxuICAgIDxoNSBjbGFzcz1cImNhcmQtaGVhZGVyIG1iLTJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyO1wiPlxyXG4gICAgICAgIDxzcGFuPnt7aWRFbnRpZGFkfX0ge3tpZCAhPSAnJyA/ICctJyArIGlkIDogJyd9fTwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWFycm93LWxlZnRcIiAoY2xpY2spPVwiYmFjaygpXCI+PC9idXR0b24+XHJcbiAgICA8L2g1PlxyXG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgZWxlbWVudCBvZiBjcnVkQ29uZmlnLnVpRXNxdWVtYS5lbGVtZW50c1wiIFtjbGFzc109XCJlbGVtZW50Py5jbGFzc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImVsZW1lbnQudHlwZVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTGFiZWwnXCIgW3N0eWxlXT1cImVsZW1lbnQ/LnN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICB7e2VsZW1lbnQ/LmxhYmVsfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidIb3Jpem9udGFsTGF5b3V0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZWwgb2YgZWxlbWVudC5lbGVtZW50c1wiIFtjbGFzc109XCJlbD8uY2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJlbC50eXBlXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2YtY29udHJvbCAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChlbC5zY29wZSlcIiBbbGFiZWxdPVwiZWwubGFiZWxcIiBbdmFsdWVdPVwiZ2V0VmFsdWUoZWwuc2NvcGUpXCIgKHNldFZhbHVlKT1cInNldFZhbHVlKCRldmVudCwgZWwuc2NvcGUpXCI+PC9zZi1jb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInQ29udHJvbCdcIj5cclxuICAgICAgICAgICAgICAgIDxzZi1jb250cm9sICpuZ1N3aXRjaENhc2U9XCInQ29udHJvbCdcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGVsZW1lbnQuc2NvcGUpXCIgW2xhYmVsXT1cImVsZW1lbnQubGFiZWxcIj48L3NmLWNvbnRyb2w+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXJcIiAqbmdJZj1cImJ0blN1Ym1pdFwiPlxyXG4gICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBbaWNvbl09XCJidG5TdWJtaXQuaWNvblwiIFtsYWJlbF09XCJidG5TdWJtaXQubGFiZWxcIiAoY2xpY2spPVwic3VibWl0KClcIj48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQWtCLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRixPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0YsT0FBTyxFQUFXLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUdwRixPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUdyQyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFRakMsTUFBTSxPQUFPLGlCQUFpQjtJQW1CNUIsWUFDVSxjQUE4QixFQUM5QixNQUFjLEVBQ2QsYUFBNkIsRUFDN0IsYUFBNEIsRUFDNUIsYUFBNEI7UUFKNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxrQkFBYSxHQUFiLGFBQWEsQ0FBZ0I7UUFDN0Isa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUF0QjdCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFXLEVB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Z0JBQ0UsSUFBSSxHQUFHLEtBQUssQ0FBQTtnQkFDWixNQUFNO1NBQ1Q7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7OytHQXRWVSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2TEFIakIsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLDBCQ2hCbkYsNi9NQThGQTs0RkQzRWEsaUJBQWlCO2tCQU43QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixXQUFXLEVBQUUsMkJBQTJCO29CQUN4QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDO29CQUNqRixlQUFlLEVBQUUsbUJBQW1CO2lCQUNyQzsrTUFHVSxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25maWdSZWdpc3RybywgQ3J1ZENvbmZpZywgT3BlcmF0aW9ucyB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvY3J1ZC1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlLCBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgR2VuZXJhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZ2VuZXJhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFJlZ2lzdHJvQ2hpbGRDb21wb25lbnQgfSBmcm9tICcuLi9yZWdpc3Ryby1jaGlsZC9yZWdpc3Ryby1jaGlsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvc2hlbWEubW9kZWwnO1xyXG5pbXBvcnQgKiBhcyBqc29ucGF0aCBmcm9tICdqc29ucGF0aCc7XHJcbmltcG9ydCB7IERhdGFUZW1wQ3J1ZCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvZGF0YS10ZW1wLWNydWQubW9kZWwnO1xyXG5pbXBvcnQgeyBTZkNydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2YtY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NmLXJlZ2lzdHJvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlLCBEaWFsb2dTZXJ2aWNlLCBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmXSxcclxuICBlbnRyeUNvbXBvbmVudHM6IFtSZWdpc3Ryb0NvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgaWRLYXRpb3M6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlkRW50aWRhZDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdHJ4OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdXNlcjogYW55O1xyXG4gIEBPdXRwdXQoKSBzZW5kRGF0YTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25TdWJtaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgZGF0YVRlbXA6IERhdGFUZW1wQ3J1ZFtdID0gW107XHJcbiAgcHVibGljIGNydWRDb25maWc6IENydWRDb25maWcgPSBuZXcgQ3J1ZENvbmZpZygpO1xyXG4gIHB1YmxpYyBlblByb2Nlc286IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYnRuU3VibWl0OiBhbnk7XHJcbiAgcHVibGljIGRhdGE6IGFueTtcclxuICBwdWJsaWMgY29uZmlnT3BlcmF0aW9uOiBPcGVyYXRpb25zID0gbmV3IE9wZXJhdGlvbnMoKTtcclxuICBwdWJsaWMgaXNMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkaWFsb2dSZWY/OiBEeW5hbWljRGlhbG9nUmVmXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VyaWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgc2ZDcnVkU2VydmljZTogU2ZDcnVkU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5kYXRhVGVtcCA9IHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhVGVtcCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRDb25maWdDcnVkKCk7XHJcbiAgfVxyXG5cclxuICBsb2FkQ29uZmlnQ3J1ZCgpIHtcclxuICAgIHRoaXMuZW5Qcm9jZXNvID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2V0Q3J1ZEJ5RW50aWRhZCh0aGlzLmlkS2F0aW9zLCB0aGlzLmlkRW50aWRhZClcclxuICAgICAgLnRoZW4ocmVzID0+IHtcclxuICAgICAgICB0aGlzLnNldERhdGFUZW1wKHJlcy5lc3F1ZW1hLCB0aGlzLmRhdGFUZW1wKTtcclxuICAgICAgICB0aGlzLmNydWRDb25maWcgPSByZXM7XHJcbiAgICAgICAgaWYgKHRoaXMudHJ4ID09ICdjJykge1xyXG4gICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5jcmVhdGVPYmplY3QodGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEpO1xyXG4gICAgICAgICAgdGhpcy5zZXRMYWJlbFN1bWJpdCgpO1xyXG4gICAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY29uZmlnT3BlcmF0aW9uID0gdGhpcy5jcnVkQ29uZmlnLnJlZ2lzdHJvLm9wZXJhdGlvbnMuZmluZCh4ID0+IHgudHlwZS5zdGFydHNXaXRoKHRoaXMudHJ4KSkgfHwgbmV3IE9wZXJhdGlvbnMoKTtcclxuICAgICAgICB9IGVsc2UgdGhpcy5nZXRJbmZvUmVnaXN0cm8odGhpcy5jcnVkQ29uZmlnLnJlZ2lzdHJvKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2V0TGFiZWxTdW1iaXQoKSB7XHJcbiAgICBpZiAodGhpcy50cnggPT0gJ2MnKSB0aGlzLmJ0blN1Ym1pdCA9IHsgbGFiZWw6ICdHdWFyZGFyJywgaWNvbjogJ3BpIHBpLXNhdmUnIH1cclxuICAgIGVsc2UgaWYgKHRoaXMudHJ4ID09ICdyJykgdGhpcy5idG5TdWJtaXQgPSB1bmRlZmluZWQ7XHJcbiAgICBlbHNlIGlmICh0aGlzLnRyeCA9PSAndScpIHRoaXMuYnRuU3VibWl0ID0geyBsYWJlbDogJ0FjdHVhbGl6YXInLCBpY29uOiAncGkgcGktc3luYycgfVxyXG4gICAgZWxzZSBpZiAodGhpcy50cnggPT0gJ2QnKSB0aGlzLmJ0blN1Ym1pdCA9IHsgbGFiZWw6ICdFbGltaW5hcicsIGljb246ICdwaSBwaS10cmFzaCcgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SW5mb1JlZ2lzdHJvKGNvbmZpZ1JlZ2lzdHJvOiBDb25maWdSZWdpc3Rybykge1xyXG4gICAgbGV0IG9wID0gY29uZmlnUmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlID09ICdyZWFkJyk7XHJcbiAgICBsZXQgZW5kcG9pbnQgPSBvcD8uZW5kcG9pbnQgfHwgJyc7XHJcbiAgICBlbmRwb2ludCA9IGVuZHBvaW50LnJlcGxhY2UoJ0BpZEthdGlvcycsIHRoaXMuaWRLYXRpb3MpO1xyXG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5yZXBsYWNlKCdAbmRvY2FjdGl2bycsIHRoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DKTtcclxuICAgIGVuZHBvaW50ID0gZW5kcG9pbnQucmVwbGFjZSgnQGlkJywgdGhpcy5pZCk7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KG9wPy5tZXRob2QgfHwgJycsIG9wPy5zZXJ2ZXIgfHwgJycsIGVuZHBvaW50KVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5kYXRhKXtcclxuICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzLmRhdGEpKSB0aGlzLmRhdGEgPSByZXMuZGF0YVswXVxyXG4gICAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSByZXMuZGF0YTtcclxuICAgICAgICAgIHRoaXMudHJ4ID0gJ3UnO1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRyeCA9ICdjJztcclxuICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlT2JqZWN0KHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZGF0YSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvbmZpZ09wZXJhdGlvbiA9IHRoaXMuY3J1ZENvbmZpZy5yZWdpc3Ryby5vcGVyYXRpb25zLmZpbmQoeCA9PiB4LnR5cGUuc3RhcnRzV2l0aCh0aGlzLnRyeCkpIHx8IG5ldyBPcGVyYXRpb25zKCk7XHJcbiAgICAgICAgdGhpcy5zZXRMYWJlbFN1bWJpdCgpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgIHRoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBiYWNrKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmNydWRDb25maWcucmVnaXN0cm8uYnRuQmFjayk7XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sKHNjb3BlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBqc29ucGF0aC5xdWVyeSh0aGlzLmNydWRDb25maWcuZXNxdWVtYSwgc2NvcGUpWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0VmFsdWUoc2NvcGU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGpzb25wYXRoLnF1ZXJ5KHRoaXMuZGF0YSwgc2NvcGUucmVwbGFjZSgnLnByb3BlcnRpZXMnLCAnJykpWzBdO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsdWUodmFsdWU6IGFueSwgc2NvcGU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoICh0eXBlb2YgKHZhbHVlKSkge1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgdmFsdWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgdmFsLnNjb3BlLnJlcGxhY2UoJy5wcm9wZXJ0aWVzJywgJycpLCB2YWwudmFsdWUpKVxyXG4gICAgICAgIGVsc2UganNvbnBhdGgudmFsdWUodGhpcy5kYXRhLCBzY29wZS5yZXBsYWNlKCcucHJvcGVydGllcycsICcnKSwgdmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgc2NvcGUucmVwbGFjZSgnLnByb3BlcnRpZXMnLCAnJyksIHZhbHVlKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHRoaXMuYXBwbHlWYWx1ZXNPbkV2ZW50KCdvbkNoYW5nZScsIHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZU9iamVjdChlc3F1ZW1hOiBTaGVtYSkge1xyXG4gICAgbGV0IG9iamVjdCA9IHt9O1xyXG4gICAgc3dpdGNoIChlc3F1ZW1hLnR5cGUpIHtcclxuICAgICAgY2FzZSAnbnVtZXJpYyc6XHJcbiAgICAgICAgcmV0dXJuIGVzcXVlbWE/LmRlZmF1bHQgfHwgMDtcclxuICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgcmV0dXJuIGVzcXVlbWE/LmRlZmF1bHQgPyB0aGlzLnNldERlZmF1bHRWYWx1ZShlc3F1ZW1hLmRlZmF1bHQpIDogbnVsbDtcclxuICAgICAgY2FzZSAnYm9vbGVhbic6XHJcbiAgICAgICAgcmV0dXJuIGVzcXVlbWE/LmRlZmF1bHQgfHwgZmFsc2U7XHJcbiAgICAgIGNhc2UgJ2FycmF5JzpcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIGNhc2UgJ2ZpbGUnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVzcXVlbWE/LnByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwgeyB2YWx1ZTogdGhpcy5jcmVhdGVPYmplY3QoZXNxdWVtYT8ucHJvcGVydGllc1trZXldKSwgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBzdWJtaXQoKSB7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmRhdGEpXHJcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVEYXRhKCkpIHJldHVybjtcclxuICAgIHRoaXMuYXBwbHlWYWx1ZXNPbkV2ZW50KCdvblN1Ym1pdCcsIHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hKVxyXG4gICAgdGhpcy5lblByb2Nlc28gPSB0cnVlO1xyXG4gICAgbGV0IGVuZHBvaW50ID0gdGhpcy5jb25maWdPcGVyYXRpb24uZW5kcG9pbnQ7XHJcbiAgICBlbmRwb2ludCA9IGVuZHBvaW50LnJlcGxhY2UoJ0BpZEthdGlvcycsIHRoaXMuaWRLYXRpb3MpXHJcbiAgICBlbmRwb2ludCA9IGVuZHBvaW50LnJlcGxhY2UoJ0BpZCcsIHRoaXMuaWQpXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29uZmlnT3BlcmF0aW9uLm1ldGhvZCwgdGhpcy5jb25maWdPcGVyYXRpb24uc2VydmVyLCBlbmRwb2ludCwgdGhpcy5kYXRhKVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VyaWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIGRldGFpbDogYFByb2Nlc28gZXhpdG9zbyFgIH0pXHJcbiAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ09wZXJhdGlvbj8ucmVkaXJlY3QpIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZ09wZXJhdGlvbj8ucmVkaXJlY3RdKVxyXG4gICAgICAgICAgZWxzZSB0aGlzLm9uU3VibWl0LmVtaXQodGhpcy5kYXRhKVxyXG4gICAgICAgIH0sIDIwMDApO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOiBgJHtlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBubyBjb250cm9sYWRvLCBwb3IgZmF2b3IgY29tdW5pY2Fyc2UgY29uIGRlbCBhZG1pbi4nfWAgfSlcclxuICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnT3BlcmF0aW9uLnZhbGlkYXRpb25zLnR5cGUgPT0gJ2xvY2FsJykgcmV0dXJuIHRoaXMudmFsaWRhdGVEYXRhTG9jYWwoKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEYXRhTG9jYWwoKSB7XHJcbiAgICBsZXQgZXJyOiBzdHJpbmdbXSA9IFtdXHJcbiAgICB0aGlzLmNvbmZpZ09wZXJhdGlvbi52YWxpZGF0aW9ucz8ucmVxdWlyZWQ/LmZvckVhY2goeCA9PiB7XHJcbiAgICAgIGlmICghanNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCB4LmZpZWxkKVswXSkgZXJyLnB1c2goeC5tZXNzYWdlKTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmNvbmZpZ09wZXJhdGlvbi52YWxpZGF0aW9ucz8ub3BlcmF0aW9ucz8uZm9yRWFjaCgob3A6IGFueSkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKG9wLmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgJ3N1bUFycmF5JzpcclxuICAgICAgICAgIGxldCB2YXIxID0ganNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCBvcC5zY29wZVswXSkucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICs9IGN1cltvcC5rZXldLCAwKTtcclxuICAgICAgICAgIGxldCB2YXIyID0ganNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCBvcC5zY29wZVsxXSkucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICs9IGN1cltvcC5rZXldLCAwKTtcclxuICAgICAgICAgIGlmICh2YXIxICE9IHZhcjIpIGVyci5wdXNoKG9wLm1lc3NhZ2UpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoZXJyLmxlbmd0aCAhPSAwKSB0aGlzLm1lc3NhZ2VTZXJpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOiBlcnIuam9pbignLiAnKSB9KVxyXG4gICAgcmV0dXJuIGVyci5sZW5ndGggPT0gMDtcclxuICB9XHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZGF0YSA9IG51bGw7XHJcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgIGNhc2UgJ0B1YWN0aXZvJzpcclxuICAgICAgICBkYXRhID0gYCR7dGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLlRET0N9LSR7dGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0N9YFxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdAdGRvY2FjdGl2byc6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0BuZG9jYWN0aXZvJzpcclxuICAgICAgICBkYXRhID0gdGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0NcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQGhveSc6XHJcbiAgICAgICAgZGF0YSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFcclxuICB9XHJcblxyXG4gIHNlbmROb3RpZmljYXRpb24obWVzc2FnZTogTWVzc2FnZSkge1xyXG4gICAgdGhpcy5tZXNzYWdlU2VyaWNlLmFkZChtZXNzYWdlKVxyXG4gIH1cclxuXHJcbiAgYWRkT2JqZWN0QXJyYXkoZWxlbWVudDogYW55KSB7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKFJlZ2lzdHJvQ2hpbGRDb21wb25lbnQsIHtcclxuICAgICAgaGVhZGVyOiBgRGV0YWxsZWAsXHJcbiAgICAgIHdpZHRoOiAnNzAlJyxcclxuICAgICAgbW9kYWw6IHRydWUsXHJcbiAgICAgIGNsb3NhYmxlOiBmYWxzZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHVpRXNxdWVtYTogeyAuLi5lbGVtZW50LmVsZW1lbnRzIH0sXHJcbiAgICAgICAgZXNxdWVtYTogdGhpcy5nZXRDb250cm9sKGVsZW1lbnQuc2NvcGUpLFxyXG4gICAgICAgIGlkOiB0aGlzLmdldFZhbHVlKGVsZW1lbnQuc2NvcGUpLmxlbmd0aCArIDFcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRhdGEpIHRoaXMuZGF0YVtlbGVtZW50LnNjb3BlLnJlcGxhY2UoJyQuLnByb3BlcnRpZXMuJywgJycpXS5wdXNoKGRhdGEpO1xyXG4gICAgICB0aGlzLmFwcGx5VmFsdWVzT25FdmVudCgnb25DaGFuZ2UnLCB0aGlzLmNydWRDb25maWcuZXNxdWVtYSwgZWxlbWVudC5zY29wZS5yZXBsYWNlKCckLi5wcm9wZXJ0aWVzLicsICcnKSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBlZGl0Um93KGVsZW1lbnQ6IGFueSwgZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKFJlZ2lzdHJvQ2hpbGRDb21wb25lbnQsIHtcclxuICAgICAgaGVhZGVyOiBgRGV0YWxsZWAsXHJcbiAgICAgIHdpZHRoOiAnNzAlJyxcclxuICAgICAgbW9kYWw6IHRydWUsXHJcbiAgICAgIGNsb3NhYmxlOiBmYWxzZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHVpRXNxdWVtYTogeyAuLi5lbGVtZW50LmVsZW1lbnRzIH0sXHJcbiAgICAgICAgZXNxdWVtYTogdGhpcy5nZXRDb250cm9sKGVsZW1lbnQuc2NvcGUpLFxyXG4gICAgICAgIGRhdGE6IHsgLi4uZGF0YSB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5vbkNsb3NlLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChkYXRhKSB0aGlzLmRhdGFbZWxlbWVudC5zY29wZS5yZXBsYWNlKCckLi5wcm9wZXJ0aWVzLicsICcnKV1bZGF0YS5pZCAtIDFdID0gZGF0YTtcclxuICAgICAgdGhpcy5hcHBseVZhbHVlc09uRXZlbnQoJ29uQ2hhbmdlJywgdGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEsIGVsZW1lbnQuc2NvcGUucmVwbGFjZSgnJC4ucHJvcGVydGllcy4nLCAnJykpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZGVsZXRlUm93KGVsZW1lbnQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5kYXRhW2VsZW1lbnQuc2NvcGUucmVwbGFjZSgnJC4ucHJvcGVydGllcy4nLCAnJyldLnNwbGljZShpbmRleCAtIDEsIDEpO1xyXG4gICAgaW5kZXggPSAxO1xyXG4gICAgdGhpcy5kYXRhW2VsZW1lbnQuc2NvcGUucmVwbGFjZSgnJC4ucHJvcGVydGllcy4nLCAnJyldLmZvckVhY2goKGVsOiBhbnkpID0+IHtcclxuICAgICAgZWwuaWQgPSBpbmRleDtcclxuICAgICAgaW5kZXgrKztcclxuICAgIH0pXHJcbiAgICB0aGlzLmFwcGx5VmFsdWVzT25FdmVudCgnb25DaGFuZ2UnLCB0aGlzLmNydWRDb25maWcuZXNxdWVtYSwgZWxlbWVudC5zY29wZS5yZXBsYWNlKCckLi5wcm9wZXJ0aWVzLicsICcnKSlcclxuICB9XHJcblxyXG4gIGFwcGx5VmFsdWVzT25FdmVudChldmVudDogc3RyaW5nLCBlc3F1ZW1hOiBTaGVtYSwga2V5Pzogc3RyaW5nKSB7XHJcbiAgICBpZiAoa2V5KSB7XHJcbiAgICAgIGlmIChlc3F1ZW1hLnByb3BlcnRpZXNba2V5XVtldmVudF0pIHtcclxuICAgICAgICBlc3F1ZW1hLnByb3BlcnRpZXNba2V5XVtldmVudF0uZm9yRWFjaCgodmFsdWU6IHsgc2NvcGU6IHN0cmluZ1tdLCBvcDogc3RyaW5nLCBrZXk/OiBzdHJpbmcgfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZUV2ZW50KHRoaXMuZGF0YSwgdmFsdWUpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGVzcXVlbWEucHJvcGVydGllcykge1xyXG4gICAgICAgIGlmIChlc3F1ZW1hLnByb3BlcnRpZXNba2V5XVtldmVudF0pIHtcclxuICAgICAgICAgIGVzcXVlbWEucHJvcGVydGllc1trZXldW2V2ZW50XS5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVFdmVudCh0aGlzLmRhdGEsIHZhbHVlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZUV2ZW50KGRhdGE6IGFueSwgcGFyYW1zOiB7IHNjb3BlOiBzdHJpbmdbXSwgb3A6IHN0cmluZywga2V5PzogYW55LCBzZXBhcmF0b3I/OiBzdHJpbmcgfSkge1xyXG4gICAgbGV0IGRhdGUgPSBtb21lbnQobmV3IERhdGUoKSk7XHJcbiAgICBzd2l0Y2ggKHBhcmFtcy5vcCkge1xyXG4gICAgICBjYXNlICdzdW0nOlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKGRhdGEsIHBhcmFtcy5zY29wZVsxXSwganNvbnBhdGgucXVlcnkoZGF0YSwgcGFyYW1zLnNjb3BlWzBdKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKz0gcGFyYW1zPy5rZXkgPyBjdXJbcGFyYW1zLmtleV0gOiBjdXIsIDApKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjb25jYXQnOlxyXG4gICAgICAgIGxldCBhcnJheTogc3RyaW5nW10gPSBbXVxyXG4gICAgICAgIHBhcmFtcz8ua2V5Py5yZWR1Y2UoKGFjYzogYW55W10sIGN1cjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBhcnJheS5wdXNoKGpzb25wYXRoLnF1ZXJ5KGRhdGEsIGN1cilbMF0pXHJcbiAgICAgICAgfSwgW10pXHJcbiAgICAgICAgaWYgKHBhcmFtcz8uc2VwYXJhdG9yKSBqc29ucGF0aC52YWx1ZShkYXRhLCBwYXJhbXMuc2NvcGVbMF0sIGFycmF5LmpvaW4ocGFyYW1zPy5zZXBhcmF0b3IgfHwgJyAnKSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZW5hYmxlJzpcclxuICAgICAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmNydWRDb25maWcuZXNxdWVtYSwgcGFyYW1zLnNjb3BlWzBdLCBmYWxzZSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZGlzYWJsZWQnOlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLCBwYXJhbXMuc2NvcGVbMF0sIHRydWUpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3JlcGxhY2U6ZW5kcG9pbnQnOlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLCBwYXJhbXMuc2NvcGVbMF0sIHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLmNvbmZpZy5lbmRwb2ludHRlbXAucmVwbGFjZShwYXJhbXMuc2NvcGVbMV0sIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIGAkLi4ke3BhcmFtcy5rZXl9YCkpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdzZXROdWxsJzpcclxuICAgICAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmRhdGEsIGAkLiR7cGFyYW1zLmtleX1gLCBudWxsKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdkYXRlZGlmZjp5ZWFycyc6XHJcbiAgICAgICAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmRhdGEsIHBhcmFtcy5zY29wZVswXSwgZGF0ZS5kaWZmKG1vbWVudChqc29ucGF0aC5xdWVyeSh0aGlzLmRhdGEsIHBhcmFtcy5zY29wZVsxXSlbMF0pLCAneWVhcnMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGVkaWZmOm1vbnRocyc6XHJcbiAgICAgICAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmRhdGEsIHBhcmFtcy5zY29wZVswXSwgZGF0ZS5kaWZmKG1vbWVudChqc29ucGF0aC5xdWVyeSh0aGlzLmRhdGEsIHBhcmFtcy5zY29wZVsxXSlbMF0pLCAnbW9udGhzJykpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdkYXRlZGlmZjp3ZWVrcyc6XHJcbiAgICAgICAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmRhdGEsIHBhcmFtcy5zY29wZVswXSwgZGF0ZS5kaWZmKG1vbWVudChqc29ucGF0aC5xdWVyeSh0aGlzLmRhdGEsIHBhcmFtcy5zY29wZVsxXSlbMF0pLCAnd2Vla3MnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGVkaWZmOmRheXMnOlxyXG4gICAgICAgICAganNvbnBhdGgudmFsdWUodGhpcy5kYXRhLCBwYXJhbXMuc2NvcGVbMF0sIGRhdGUuZGlmZihtb21lbnQoanNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCBwYXJhbXMuc2NvcGVbMV0pWzBdKSwgJ2RheXMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RGF0YVRlbXAoZXNxdWVtYTogU2hlbWEsIGRhdGFUZW1wOiBhbnlbXSkge1xyXG4gICAgZGF0YVRlbXAuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAganNvbnBhdGgudmFsdWUoZXNxdWVtYSwgZGF0YS5zY29wZSwgZGF0YS52YWx1ZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlWYWx1ZXNGcm9tT2JqZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudC5kYXRhKSBldmVudC5vcHRpb25WYWx1ZS5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiBqc29ucGF0aC52YWx1ZSh0aGlzLmRhdGEsIHZhbHVlLnNjb3BlLnJlcGxhY2UoJy5wcm9wZXJ0aWVzJywnJyksIHRoaXMuYXBseUZvcm1hdFZhbHVlKHZhbHVlLnNjb3BlLCBldmVudC5kYXRhW3ZhbHVlLmtleV0pKSk7XHJcbiAgICBlbHNlIGV2ZW50Lm9wdGlvblZhbHVlLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgdmFsdWUuc2NvcGUucmVwbGFjZSgnLnByb3BlcnRpZXMnLCcnKSwgbnVsbCkpO1xyXG4gIH1cclxuICBhcGx5Rm9ybWF0VmFsdWUoc2NvcGU6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgbGV0IGNvbnRyb2wgPSBqc29ucGF0aC5xdWVyeSh0aGlzLmNydWRDb25maWcuZXNxdWVtYSwgc2NvcGUpWzBdXHJcbiAgICBsZXQgcmVzcDtcclxuICAgIHN3aXRjaCAoY29udHJvbC50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgIHJlc3AgPSBuZXcgRGF0ZShgJHt2YWx1ZX1gKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdudW1lcmljJzpcclxuICAgICAgICByZXNwID0gK3ZhbHVlXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmVzcCA9IHZhbHVlXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcFxyXG4gIH1cclxufVxyXG4iLCI8cC1ibG9ja1VJIFtibG9ja2VkXT1cImVuUHJvY2Vzb1wiPlxyXG4gICAgPGkgY2xhc3M9XCJwaSBwaS1jb2cgcGktc3BpblwiIHN0eWxlPVwiZm9udC1zaXplOiA1MHB4XCI+PC9pPlxyXG48L3AtYmxvY2tVST5cclxuXHJcbjxwLXRvYXN0PjwvcC10b2FzdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJjYXJkXCIgKm5nSWY9XCIhZW5Qcm9jZXNvXCI+XHJcbiAgICA8aDUgY2xhc3M9XCJjYXJkLWhlYWRlciBtYi0yXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cclxuICAgICAgICA8c3Bhbj57e2NydWRDb25maWcucmVnaXN0cm8/LmxhYmVsIHx8IGlkRW50aWRhZH19IHt7aWQgIT0gJycgPyAnLScgKyBpZCA6ICcnfX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNydWRDb25maWcucmVnaXN0cm8/LmNhbkJhY2tcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1hcnJvdy1sZWZ0XCIgKGNsaWNrKT1cImJhY2soKVwiPjwvYnV0dG9uPlxyXG4gICAgPC9oNT5cclxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgY3J1ZENvbmZpZy51aUVzcXVlbWEuZWxlbWVudHNcIiBbY2xhc3NdPVwiZWxlbWVudD8uY2xhc3NcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJlbGVtZW50LnR5cGVcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0xhYmVsJ1wiIFtzdHlsZV09XCJlbGVtZW50Py5zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAge3tlbGVtZW50Py5sYWJlbH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInSG9yaXpvbnRhbExheW91dCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVsIG9mIGVsZW1lbnQuZWxlbWVudHNcIiBbY2xhc3NdPVwiZWw/LmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZWwudHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2YtY29udHJvbCAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChlbC5zY29wZSlcIiBbbGFiZWxdPVwiZWwubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFZhbHVlKGVsLnNjb3BlKVwiIChzZXRWYWx1ZSk9XCJzZXRWYWx1ZSgkZXZlbnQsIGVsLnNjb3BlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZE5vdGlmaWNhdGlvbik9XCJzZW5kTm90aWZpY2F0aW9uKCRldmVudClcIiAoc2VuZE9iamVjdCk9XCJhcHBseVZhbHVlc0Zyb21PYmplY3QoJGV2ZW50KVwiPjwvc2YtY29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1ZlcnRpY2FsTGF5b3V0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZWwgb2YgZWxlbWVudC5lbGVtZW50c1wiIFtjbGFzc109XCJlbD8uY2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJlbC50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZi1jb250cm9sICpuZ1N3aXRjaENhc2U9XCInQ29udHJvbCdcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGVsLnNjb3BlKVwiIFtsYWJlbF09XCJlbC5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0VmFsdWUoZWwuc2NvcGUpXCIgKHNldFZhbHVlKT1cInNldFZhbHVlKCRldmVudCwgZWwuc2NvcGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5kTm90aWZpY2F0aW9uKT1cInNlbmROb3RpZmljYXRpb24oJGV2ZW50KVwiIChzZW5kT2JqZWN0KT1cImFwcGx5VmFsdWVzRnJvbU9iamVjdCgkZXZlbnQpXCI+PC9zZi1jb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInVGFibGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwiZ2V0VmFsdWUoZWwuc2NvcGUpXCIgW2NvbHVtbnNdPVwiZ2V0Q29udHJvbChlbC5zY29wZSkuY29uZmlnLmNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGljb249XCJwaSBwaS1wbHVzXCIgKGNsaWNrKT1cImFkZE9iamVjdEFycmF5KGVsKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb2wubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0cnggPT0gJ2MnIHx8IHRyeCA9PSAndSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93RGF0YSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIFtuZ1N3aXRjaF09XCJjb2wudHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tyb3dEYXRhW2NvbC5jb2xdfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeTpVU0QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jvd0RhdGFbY29sLmNvbF0gfCBjdXJyZW5jeTogJ1VTRCd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGU6eXl5eS1tbS1kZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7cm93RGF0YVtjb2wuY29sXSB8IGRhdGU6ICd5eXl5LW1tLWRkJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZTpkZC9tbS95eXl5J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tyb3dEYXRhW2NvbC5jb2xdIHwgZGF0ZTogJ2RkL01NL3l5eXknfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cInJvd0RhdGFbY29sLmNvbF1cIiBjbGFzcz1cInBpIHBpLWNoZWNrXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCIhcm93RGF0YVtjb2wuY29sXVwiIGNsYXNzPVwicGkgcGktdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0cnggPT0gJ2MnIHx8IHRyeCA9PSAndSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZWRpdFJvdyhlbCwgcm93RGF0YSlcIiBpY29uPVwicGkgcGktcGVuY2lsXCIgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWluZm8gbXItMVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZVJvdyhlbCwgcm93SW5kZXgpXCIgaWNvbj1cInBpIHBpLXRyYXNoXCIgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlclwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCI+XHJcbiAgICAgICAgICAgICAgICA8c2YtY29udHJvbCBbY29udHJvbF09XCJnZXRDb250cm9sKGVsZW1lbnQuc2NvcGUpXCIgW2xhYmVsXT1cImVsZW1lbnQubGFiZWxcIj48L3NmLWNvbnRyb2w+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgbXQtMlwiICpuZ0lmPVwiYnRuU3VibWl0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIFtpY29uXT1cImJ0blN1Ym1pdC5pY29uXCIgW2xhYmVsXT1cImJ0blN1Ym1pdC5sYWJlbFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzdWJtaXQoKVwiPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=