sf-crud 12.0.5 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/bundles/sf-crud.umd.js +2563 -1306
  2. package/bundles/sf-crud.umd.js.map +1 -1
  3. package/esm2015/lib/components/control/control.component.js +285 -73
  4. package/esm2015/lib/components/file-upload/file-upload.component.js +143 -0
  5. package/esm2015/lib/components/form/form.component.js +267 -0
  6. package/esm2015/lib/components/registro/registro.component.js +507 -407
  7. package/esm2015/lib/components/step/step.component.js +79 -0
  8. package/esm2015/lib/components/tablero/tablero.component.js +87 -27
  9. package/esm2015/lib/sf-crud.module.js +27 -15
  10. package/esm2015/lib/sf-crud.routing.module.js +23 -0
  11. package/esm2015/lib/sf-crud.service.js +486 -12
  12. package/esm2015/lib/shared/models/Conditions.model.js +81 -0
  13. package/esm2015/lib/shared/models/Empresa.model.js +2 -0
  14. package/esm2015/lib/shared/models/Reason.model.js +7 -0
  15. package/esm2015/lib/shared/models/crud-config.model.js +36 -13
  16. package/esm2015/lib/shared/models/shema.model.js +5 -1
  17. package/esm2015/lib/shared/services/general.service.js +41 -17
  18. package/esm2015/lib/shared/services/notification.service.js +83 -0
  19. package/esm2015/lib/shared/services/step.service.js +65 -0
  20. package/esm2015/public-api.js +7 -1
  21. package/fesm2015/sf-crud.js +2194 -1151
  22. package/fesm2015/sf-crud.js.map +1 -1
  23. package/lib/components/control/control.component.d.ts +39 -10
  24. package/lib/components/file-upload/file-upload.component.d.ts +34 -0
  25. package/lib/components/form/form.component.d.ts +58 -0
  26. package/lib/components/registro/registro.component.d.ts +81 -54
  27. package/lib/components/step/step.component.d.ts +27 -0
  28. package/lib/components/tablero/tablero.component.d.ts +15 -5
  29. package/lib/sf-crud.module.d.ts +80 -76
  30. package/lib/sf-crud.routing.module.d.ts +7 -0
  31. package/lib/sf-crud.service.d.ts +115 -5
  32. package/lib/shared/models/Conditions.model.d.ts +32 -0
  33. package/lib/shared/models/Empresa.model.d.ts +11 -0
  34. package/lib/shared/models/Reason.model.d.ts +5 -0
  35. package/lib/shared/models/crud-config.model.d.ts +76 -24
  36. package/lib/shared/models/shema.model.d.ts +27 -0
  37. package/lib/shared/services/general.service.d.ts +8 -1
  38. package/lib/shared/services/notification.service.d.ts +27 -0
  39. package/lib/shared/services/step.service.d.ts +27 -0
  40. package/package.json +9 -2
  41. package/public-api.d.ts +6 -0
  42. package/esm2015/lib/components/registro-child/registro-child.component.js +0 -348
  43. package/esm2015/lib/components/registro-detalle/registro-detalle.component.js +0 -232
  44. package/esm2015/lib/shared/models/data-temp-crud.model.js +0 -6
  45. package/lib/components/registro-child/registro-child.component.d.ts +0 -48
  46. package/lib/components/registro-detalle/registro-detalle.component.d.ts +0 -36
  47. package/lib/shared/models/data-temp-crud.model.d.ts +0 -4
@@ -0,0 +1,23 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { RouterModule } from '@angular/router';
3
+ import { FormComponent } from './components/form/form.component';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/router";
6
+ const routes = [
7
+ { path: ':idStep',
8
+ component: FormComponent
9
+ }
10
+ ];
11
+ export class SfCrudRoutingModule {
12
+ }
13
+ SfCrudRoutingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
14
+ SfCrudRoutingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] });
15
+ SfCrudRoutingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudRoutingModule, imports: [[RouterModule.forChild(routes)], RouterModule] });
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudRoutingModule, decorators: [{
17
+ type: NgModule,
18
+ args: [{
19
+ imports: [RouterModule.forChild(routes)],
20
+ exports: [RouterModule]
21
+ }]
22
+ }] });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtY3J1ZC5yb3V0aW5nLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NmLWNydWQvc3JjL2xpYi9zZi1jcnVkLnJvdXRpbmcubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBSWpFLE1BQU0sTUFBTSxHQUFXO0lBQ2pCLEVBQUMsSUFBSSxFQUFFLFNBQVM7UUFDaEIsU0FBUyxFQUFFLGFBQWE7S0FDdkI7Q0FFTixDQUFDO0FBTUYsTUFBTSxPQUFPLG1CQUFtQjs7aUhBQW5CLG1CQUFtQjtrSEFBbkIsbUJBQW1CLHdDQUZwQixZQUFZO2tIQUVYLG1CQUFtQixZQUhyQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDOUIsWUFBWTs0RkFFWCxtQkFBbUI7a0JBSi9CLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlck1vZHVsZSwgUm91dGVzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9mb3JtL2Zvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmVnaXN0cm9Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50JztcclxuXHJcblxyXG5jb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcclxuICAgICAge3BhdGg6ICc6aWRTdGVwJyxcclxuICAgICAgY29tcG9uZW50OiBGb3JtQ29tcG9uZW50XHJcbiAgICAgIH1cclxuICBcclxuXTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1JvdXRlck1vZHVsZS5mb3JDaGlsZChyb3V0ZXMpXSxcclxuICBleHBvcnRzOiBbUm91dGVyTW9kdWxlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2ZDcnVkUm91dGluZ01vZHVsZSB7IH0iXX0=
@@ -1,20 +1,487 @@
1
1
  import { Injectable } from '@angular/core';
2
+ import * as jsonpath from 'jsonpath';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { Condition } from './shared/models/Conditions.model';
5
+ import * as moment from 'moment';
2
6
  import * as i0 from "@angular/core";
3
7
  export class SfCrudService {
4
8
  constructor() {
5
- this._dataTemp = [];
9
+ this._esquemas = [];
10
+ this._uiEsquemas = [];
11
+ this._registros = [];
12
+ this._answers = [];
13
+ this._dataSet = [];
14
+ this._ids = [];
15
+ this.__index = 0;
16
+ this._configEmpresa = undefined;
17
+ this._trx = [];
18
+ this._changeData = new BehaviorSubject(undefined);
19
+ this.__formLoading = new BehaviorSubject({ inProgress: false, target: undefined });
20
+ this._crudLoaded = new BehaviorSubject(false);
6
21
  }
7
- saveDataTemp(scope, value) {
8
- this._dataTemp.push({ scope, value });
9
- sessionStorage.setItem('dataTemp', JSON.stringify(this._dataTemp));
22
+ get user() {
23
+ if (!this._tfmUser)
24
+ this._tfmUser = JSON.parse(localStorage.getItem("oSessionTFM"));
25
+ return this._tfmUser;
10
26
  }
11
- getDataTemp() {
12
- let dataTemp = sessionStorage.getItem('dataTemp');
13
- sessionStorage.removeItem('dataTemp');
14
- return dataTemp ? JSON.parse(dataTemp) : [];
27
+ get currentOperation() {
28
+ return this.registros[this.index].operations.find(x => x.type.startsWith(this._trx[this.index]));
15
29
  }
16
- cleanDataTemp() {
17
- sessionStorage.removeItem('dataTemp');
30
+ set environment(val) {
31
+ this.jsonConfig = val;
32
+ }
33
+ get environment() {
34
+ return this.jsonConfig;
35
+ }
36
+ get onCrudLoaded$() {
37
+ return this._crudLoaded.asObservable();
38
+ }
39
+ set crudLoaded(value) {
40
+ this._crudLoaded.next(value);
41
+ }
42
+ get dataExt() {
43
+ return this._dataExt;
44
+ }
45
+ set dataExt(val) {
46
+ this._dataExt = val;
47
+ }
48
+ get index() {
49
+ return this.__index;
50
+ }
51
+ set index(value) {
52
+ this.__index = value;
53
+ }
54
+ get idKatios() {
55
+ return this._idKatios;
56
+ }
57
+ set idKatios(value) {
58
+ var _a;
59
+ this._idKatios = (_a = value === null || value === void 0 ? void 0 : value.trim()) === null || _a === void 0 ? void 0 : _a.toUpperCase();
60
+ }
61
+ get configEmpresa() {
62
+ return this._configEmpresa;
63
+ }
64
+ set configEmpresa(value) {
65
+ this._configEmpresa = value;
66
+ }
67
+ getURL(operation, index = undefined, id = undefined) {
68
+ let url = operation.url || `${this.jsonConfig[operation.server]}${operation.endpoint}`;
69
+ url = url.replace('@idKatios', this.idKatios);
70
+ if (id)
71
+ url = url.replace('@id', id);
72
+ url = this.applyStringKeys(url, index);
73
+ return url;
74
+ }
75
+ getRegistro(index) {
76
+ return this._registros[index];
77
+ }
78
+ getId(index) {
79
+ return this._ids.length == 1 ? this._ids[0] : this._ids[index];
80
+ }
81
+ get dataset() {
82
+ return this._dataSet;
83
+ }
84
+ getData(index) {
85
+ return this._dataSet.length == 1 ? this._dataSet[0] : this._dataSet[index];
86
+ }
87
+ getTrx(index) {
88
+ return this._trx[index];
89
+ }
90
+ get totalData() {
91
+ return this._dataSet.length;
92
+ }
93
+ get totalRegistros() {
94
+ return this._registros.length;
95
+ }
96
+ get uiEsquemas() {
97
+ return this._uiEsquemas;
98
+ }
99
+ getEsquema(index) {
100
+ return this._esquemas.length == 1 ? this._esquemas[0] : this._esquemas[index];
101
+ }
102
+ reset() {
103
+ this._ids = [];
104
+ this._dataSet = [];
105
+ }
106
+ getURLRedirect(initialURL) {
107
+ let finalUrl = this.applyStringKeys(initialURL, undefined);
108
+ finalUrl = finalUrl.replace("@URLBASE", window.location.href.split('?')[0]);
109
+ return finalUrl;
110
+ }
111
+ getUIEsquema(index) {
112
+ return this._uiEsquemas[index];
113
+ }
114
+ /**
115
+ * using data, apply each keyEsquema over each dataset indicated on indexData of each key
116
+ * @param data
117
+ * @param content
118
+ * @returns
119
+ */
120
+ applyObjectKeys(data, keysEsquema, registro) {
121
+ var _a;
122
+ for (let i = 0; i < keysEsquema.length; i++) {
123
+ const opt = keysEsquema[i];
124
+ let value = undefined;
125
+ if (opt.indexKey) {
126
+ let keyFound = ((_a = registro.keys) !== null && _a !== void 0 ? _a : [undefined])[opt.indexKey];
127
+ this.applyKey(keyFound, registro, data);
128
+ }
129
+ else if (opt.indexData !== undefined) {
130
+ if (opt.isArray) {
131
+ value = jsonpath.query(data, opt.scope);
132
+ }
133
+ else {
134
+ value = jsonpath.query(data, opt.scope)[0];
135
+ }
136
+ }
137
+ if (opt.key == "$")
138
+ Object.assign(this._dataSet[opt.indexData], value);
139
+ else if (opt.key && ((value !== undefined && value !== null) || (opt.canBeValueUndefined === undefined || opt.canBeValueUndefined === true)))
140
+ jsonpath.value(this._dataSet[opt.indexData], opt.key, value);
141
+ }
142
+ return data;
143
+ }
144
+ applyKey(key, registro, data) {
145
+ var _a, _b, _c, _d;
146
+ if (key === null || key === void 0 ? void 0 : key.overrideControl) {
147
+ let newVal = undefined;
148
+ let esquemaToSet = this.getControl(key.scope, this.esquemas[(_a = key.indexData) !== null && _a !== void 0 ? _a : this.index]);
149
+ if (!esquemaToSet) {
150
+ console.error({ message: "la key esta mal configurada", data: key });
151
+ return;
152
+ }
153
+ let completed = this.isConditionsCompleted((_b = key.overrideControl.conditions) !== null && _b !== void 0 ? _b : [], registro.conditions || [], data);
154
+ if ((_c = key.overrideControl) === null || _c === void 0 ? void 0 : _c.property)
155
+ jsonpath.value(esquemaToSet, key.overrideControl.property, completed ? key.overrideControl.value : key.overrideControl.elseValue);
156
+ if (completed && key.overrideControl.newPropertyValue !== undefined) {
157
+ if (key.overrideControl.newPropertyValue == 'RESETOBJECT')
158
+ newVal = this.createObject(esquemaToSet, this.currentOperation);
159
+ else
160
+ newVal = key.overrideControl.newPropertyValue;
161
+ }
162
+ else if (!completed && key.overrideControl.elseNewPropertyValue !== undefined) {
163
+ if (key.overrideControl.elseNewPropertyValue == 'RESETOBJECT')
164
+ newVal = this.createObject(esquemaToSet, this.currentOperation);
165
+ else
166
+ newVal = key.overrideControl.elseNewPropertyValue;
167
+ }
168
+ if (newVal !== undefined)
169
+ jsonpath.value(this._dataSet[(_d = key.indexData) !== null && _d !== void 0 ? _d : this.index], key.scope.replaceAll('..properties', ''), newVal);
170
+ }
171
+ }
172
+ /**
173
+ * Validate conditions on datas
174
+ * @param conditions
175
+ * @param index
176
+ */
177
+ isConditionsCompleted(iConditions, conditions, data) {
178
+ let cumple = true;
179
+ iConditions.forEach(iCond => {
180
+ const c = Condition.instanceContidion(iCond, conditions);
181
+ let dataToEvaluate = c.indexData !== undefined ? this._dataSet[c.indexData] : data;
182
+ if (!c.isValid(dataToEvaluate))
183
+ cumple = false;
184
+ });
185
+ return cumple;
186
+ }
187
+ /**
188
+ * Apply each key from register over string content
189
+ * @param indexRegistro
190
+ * @param content
191
+ * @returns
192
+ */
193
+ applyStringKeys(content, index = undefined) {
194
+ var _a;
195
+ let indexRegistro = index || this.__index;
196
+ (_a = this._registros[indexRegistro].keys) === null || _a === void 0 ? void 0 : _a.forEach((opt) => {
197
+ let value;
198
+ if (opt.indexId !== undefined && opt.indexId < this._ids.length)
199
+ value = this._ids[opt.indexId];
200
+ else if (opt.indexAnswer !== undefined && opt.indexAnswer < this._answers.length)
201
+ value = jsonpath.query(this._answers[opt.indexAnswer], opt.scope)[0];
202
+ else if (opt.indexData !== undefined)
203
+ value = jsonpath.query(this._dataSet[opt.indexData], opt.scope)[0];
204
+ if (value === null)
205
+ value = '';
206
+ content = content.replace(opt.key, value);
207
+ });
208
+ return content;
209
+ }
210
+ validateDataLocal(operation, data, conditions) {
211
+ var _a, _b, _c, _d, _e, _f, _g, _h;
212
+ const err = [];
213
+ //Solo si se cumple la condicion, se valida
214
+ (_b = (_a = operation.validations) === null || _a === void 0 ? void 0 : _a.required) === null || _b === void 0 ? void 0 : _b.forEach(x => {
215
+ const cumpleCond = x.conditions ? this.isConditionsCompleted(x.conditions, conditions, data) : true;
216
+ if (cumpleCond && (!jsonpath.query(data, x.field)[0] ||
217
+ (Array.isArray(jsonpath.query(data, x.field)[0]) && jsonpath.query(data, x.field)[0].length == 0)))
218
+ err.push(x.message);
219
+ });
220
+ (_d = (_c = operation.validations) === null || _c === void 0 ? void 0 : _c.different) === null || _d === void 0 ? void 0 : _d.forEach(x => {
221
+ const cumpleCond = x.conditions ? this.isConditionsCompleted(x.conditions, conditions, data) : true;
222
+ if (cumpleCond && jsonpath.query(data, x.field)[0] === x.value)
223
+ err.push(x.message);
224
+ });
225
+ (_f = (_e = operation.validations) === null || _e === void 0 ? void 0 : _e.equals) === null || _f === void 0 ? void 0 : _f.forEach(x => {
226
+ const cumpleCond = x.conditions ? this.isConditionsCompleted(x.conditions, conditions, data) : true;
227
+ if (cumpleCond && jsonpath.query(data, x.field)[0] != x.value)
228
+ err.push(x.message);
229
+ });
230
+ (_h = (_g = operation.validations) === null || _g === void 0 ? void 0 : _g.operations) === null || _h === void 0 ? void 0 : _h.forEach((op) => {
231
+ switch (op.action) {
232
+ case 'sumArray':
233
+ const var1 = jsonpath.query(data, op.scope[0]).reduce((acc, cur) => acc += cur[op.key], 0);
234
+ const var2 = jsonpath.query(data, op.scope[1]).reduce((acc, cur) => acc += cur[op.key], 0);
235
+ if (var1 != var2)
236
+ err.push(op.message);
237
+ break;
238
+ default:
239
+ break;
240
+ }
241
+ });
242
+ return err;
243
+ }
244
+ set esquemas(esquemas) {
245
+ this._esquemas = esquemas;
246
+ }
247
+ get esquemas() {
248
+ return this._esquemas;
249
+ }
250
+ set ids(ids) {
251
+ this._ids = ids;
252
+ }
253
+ set uiEsquemas(uiEsquemas) {
254
+ this._uiEsquemas = uiEsquemas;
255
+ }
256
+ get registros() {
257
+ return this._registros;
258
+ }
259
+ set registros(registros) {
260
+ this._registros = registros;
261
+ }
262
+ setDataSet(data, index = undefined) {
263
+ index = index ? index : this.__index;
264
+ if (index >= this.totalData) {
265
+ this._dataSet.push(data);
266
+ }
267
+ }
268
+ setTrx(trx, index) {
269
+ if (Array.isArray(trx))
270
+ this._trx = trx;
271
+ else if (index >= this._trx.length)
272
+ this._trx.push(trx);
273
+ else
274
+ this._trx[index] = trx;
275
+ }
276
+ setAnswers(answer, index) {
277
+ if (Array.isArray(answer))
278
+ this._answers = answer;
279
+ else {
280
+ if (index >= this._answers.length)
281
+ this._answers.push(answer);
282
+ else
283
+ this._answers[index] = answer;
284
+ }
285
+ }
286
+ getControl(scope, esquema) {
287
+ return jsonpath.query(esquema, scope)[0];
288
+ }
289
+ getValue(scope, data) {
290
+ return jsonpath.query(data, scope.replaceAll('.properties', ''))[0];
291
+ }
292
+ createObject(esquema, operation) {
293
+ var _a;
294
+ const object = {};
295
+ switch (esquema.type) {
296
+ case 'numeric':
297
+ case 'string':
298
+ case 'date':
299
+ if (esquema.default && operation) {
300
+ return this.setDefaultValue(esquema.default, operation);
301
+ }
302
+ else
303
+ return (_a = esquema.default) !== null && _a !== void 0 ? _a : null;
304
+ case 'boolean':
305
+ return (esquema === null || esquema === void 0 ? void 0 : esquema.default) || false;
306
+ case 'array':
307
+ return [];
308
+ case 'file':
309
+ return null;
310
+ case 'object':
311
+ Object.getOwnPropertyNames(esquema === null || esquema === void 0 ? void 0 : esquema.properties).forEach(key => {
312
+ let aux = esquema === null || esquema === void 0 ? void 0 : esquema.properties[key];
313
+ if (aux)
314
+ object[key] = this.createObject(aux, operation);
315
+ });
316
+ return object;
317
+ default:
318
+ return null;
319
+ }
320
+ }
321
+ getValueKey(key) {
322
+ let data;
323
+ switch ((key === null || key === void 0 ? void 0 : key.data) || 'externa') {
324
+ case "user":
325
+ data = this.user;
326
+ break;
327
+ default:
328
+ data = this.dataExt;
329
+ break;
330
+ }
331
+ if (data && key) {
332
+ const aux = jsonpath.query(data, key.scope);
333
+ if (aux.length == 0)
334
+ return undefined;
335
+ if (aux.length == 1)
336
+ return aux[0];
337
+ else
338
+ return aux;
339
+ }
340
+ return undefined;
341
+ }
342
+ setDefaultValue(value, operation) {
343
+ let data = null;
344
+ if (value.key && operation.keys) {
345
+ data = this.getValueKey(operation.keys.find(k => k.key == value.key));
346
+ value = data;
347
+ }
348
+ switch (value) {
349
+ case '@uactivo':
350
+ data = `${this.user.UsuarioSistema.TDOC}-${this.user.UsuarioSistema.NDOC}`;
351
+ break;
352
+ case '@tdocactivo':
353
+ data = this.user.UsuarioSistema.TDOC;
354
+ break;
355
+ case '@ndocactivo':
356
+ data = this.user.UsuarioSistema.NDOC;
357
+ break;
358
+ case '@hoy':
359
+ data = new Date();
360
+ break;
361
+ default:
362
+ data = value;
363
+ break;
364
+ }
365
+ return data;
366
+ }
367
+ /**
368
+ * Validate if schema has pdfsign and it's signed, else return false
369
+ * @param index
370
+ * @returns
371
+ */
372
+ isSignedPDF(index) {
373
+ return this._dataSet[index].signed;
374
+ }
375
+ get changeData$() {
376
+ return this._changeData.asObservable();
377
+ }
378
+ set changeData(value) {
379
+ this._changeData.next(value);
380
+ }
381
+ get formLoading$() {
382
+ return this.__formLoading.asObservable();
383
+ }
384
+ set formLoading(value) {
385
+ this.__formLoading.next(value);
386
+ }
387
+ loadSession() {
388
+ const existSession = localStorage.getItem("esquemas") !== null;
389
+ if (existSession) {
390
+ this._esquemas = JSON.parse(localStorage.getItem("esquemas"));
391
+ this._uiEsquemas = JSON.parse(localStorage.getItem("uiEsquemas"));
392
+ this._registros = JSON.parse(localStorage.getItem("registros"));
393
+ this._dataSet = JSON.parse(localStorage.getItem("dataSet"));
394
+ this._answers = JSON.parse(localStorage.getItem("answers"));
395
+ this._trx = JSON.parse(localStorage.getItem("trx"));
396
+ this.__index = +localStorage.getItem("index");
397
+ localStorage.clear();
398
+ }
399
+ return existSession;
400
+ }
401
+ get reasons() {
402
+ const reasonsStorage = localStorage.getItem("reasons");
403
+ if (reasonsStorage)
404
+ return JSON.parse(reasonsStorage);
405
+ return [];
406
+ }
407
+ saveProgress(reasons) {
408
+ localStorage.setItem("reasons", JSON.stringify(reasons));
409
+ localStorage.setItem("esquemas", JSON.stringify(this._esquemas));
410
+ localStorage.setItem("trx", JSON.stringify(this._trx));
411
+ localStorage.setItem("uiEsquemas", JSON.stringify(this._uiEsquemas));
412
+ localStorage.setItem("registros", JSON.stringify(this._registros));
413
+ localStorage.setItem("dataSet", JSON.stringify(this._dataSet));
414
+ localStorage.setItem("answers", JSON.stringify(this._answers));
415
+ localStorage.setItem("index", this.__index.toString());
416
+ }
417
+ redirectToInicio() {
418
+ window.location.href = window.location.href.split('?')[0];
419
+ window.location.reload();
420
+ }
421
+ applyValuesOnEvent(event, esquema, key, data) {
422
+ if (key) {
423
+ if (esquema.properties[key][event]) {
424
+ esquema.properties[key][event].forEach((value) => {
425
+ this.setValueEvent(data, value, esquema);
426
+ });
427
+ }
428
+ }
429
+ else {
430
+ for (const key in esquema.properties) {
431
+ if (esquema.properties[key][event]) {
432
+ esquema.properties[key][event].forEach((value) => {
433
+ this.setValueEvent(data, value, esquema);
434
+ });
435
+ }
436
+ }
437
+ }
438
+ }
439
+ setValueEvent(data, params, esquema) {
440
+ var _a;
441
+ let date = moment(new Date());
442
+ switch (params.op) {
443
+ case 'sum':
444
+ 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));
445
+ break;
446
+ case 'concat':
447
+ let array = [];
448
+ (_a = params === null || params === void 0 ? void 0 : params.key) === null || _a === void 0 ? void 0 : _a.reduce((acc, cur) => {
449
+ array.push(jsonpath.query(data, cur)[0]);
450
+ }, []);
451
+ if (params === null || params === void 0 ? void 0 : params.separator)
452
+ jsonpath.value(data, params.scope[0], array.join((params === null || params === void 0 ? void 0 : params.separator) || ' '));
453
+ break;
454
+ case 'enable':
455
+ jsonpath.value(esquema, params.scope[0], false);
456
+ break;
457
+ case 'disabled':
458
+ jsonpath.value(esquema, params.scope[0], true);
459
+ break;
460
+ case 'replace:endpoint':
461
+ jsonpath.value(esquema, params.scope[0], esquema.config.endpointtemp.replace(params.scope[1], jsonpath.query(data, `$..${params.key}`)));
462
+ break;
463
+ case 'setNull':
464
+ jsonpath.value(data, `$.${params.key}`, null);
465
+ break;
466
+ case 'datediff:years':
467
+ jsonpath.value(data, params.scope[0], date.diff(moment(jsonpath.query(data, params.scope[1])[0]), 'years'));
468
+ break;
469
+ case 'datediff:months':
470
+ jsonpath.value(data, params.scope[0], date.diff(moment(jsonpath.query(data, params.scope[1])[0]), 'months'));
471
+ break;
472
+ case 'datediff:weeks':
473
+ jsonpath.value(data, params.scope[0], date.diff(moment(jsonpath.query(data, params.scope[1])[0]), 'weeks'));
474
+ break;
475
+ case 'datediff:days':
476
+ jsonpath.value(data, params.scope[0], date.diff(moment(jsonpath.query(data, params.scope[1])[0]), 'days'));
477
+ break;
478
+ default:
479
+ break;
480
+ }
481
+ console.log('setValueEvent sale:');
482
+ console.log(data);
483
+ console.log(esquema);
484
+ console.log(params);
18
485
  }
19
486
  }
20
487
  SfCrudService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SfCrudService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -24,5 +491,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
24
491
  args: [{
25
492
  providedIn: 'root'
26
493
  }]
27
- }], ctorParameters: function () { return []; } });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtY3J1ZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL3NmLWNydWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0zQyxNQUFNLE9BQU8sYUFBYTtJQUl4QjtRQUZRLGNBQVMsR0FBbUIsRUFBRSxDQUFDO0lBRXZCLENBQUM7SUFFakIsWUFBWSxDQUFDLEtBQWEsRUFBRSxLQUFVO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDckMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDakQsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNyQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQzdDLENBQUM7SUFFRCxhQUFhO1FBQ1gsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN2QyxDQUFDOzsyR0FuQlUsYUFBYTsrR0FBYixhQUFhLGNBRlosTUFBTTs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0YVRlbXBDcnVkIH0gZnJvbSAnLi9zaGFyZWQvbW9kZWxzL2RhdGEtdGVtcC1jcnVkLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNmQ3J1ZFNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIF9kYXRhVGVtcDogRGF0YVRlbXBDcnVkW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgc2F2ZURhdGFUZW1wKHNjb3BlOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX2RhdGFUZW1wLnB1c2goeyBzY29wZSwgdmFsdWUgfSlcclxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2RhdGFUZW1wJywgSlNPTi5zdHJpbmdpZnkodGhpcy5fZGF0YVRlbXApKVxyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YVRlbXAoKSB7XHJcbiAgICBsZXQgZGF0YVRlbXAgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdkYXRhVGVtcCcpXHJcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdkYXRhVGVtcCcpXHJcbiAgICByZXR1cm4gZGF0YVRlbXAgPyBKU09OLnBhcnNlKGRhdGFUZW1wKSA6IFtdXHJcbiAgfVxyXG5cclxuICBjbGVhbkRhdGFUZW1wKCl7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdkYXRhVGVtcCcpXHJcbiAgfVxyXG59XHJcbiJdfQ==
494
+ }] });
495
+ export class ChangeData {
496
+ constructor(value, scope, index) {
497
+ this.value = value;
498
+ this.scope = scope;
499
+ this.index = index;
500
+ }
501
+ }
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtY3J1ZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL3NmLWNydWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTdELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDOztBQUtqQyxNQUFNLE9BQU8sYUFBYTtJQUgxQjtRQUlVLGNBQVMsR0FBWSxFQUFFLENBQUM7UUFDeEIsZ0JBQVcsR0FBVSxFQUFFLENBQUE7UUFDdkIsZUFBVSxHQUFxQixFQUFFLENBQUM7UUFDbEMsYUFBUSxHQUFVLEVBQUUsQ0FBQztRQUNyQixhQUFRLEdBQVUsRUFBRSxDQUFDO1FBQ3JCLFNBQUksR0FBYSxFQUFFLENBQUM7UUFDcEIsWUFBTyxHQUFXLENBQUMsQ0FBQztRQUVwQixtQkFBYyxHQUF3QixTQUFTLENBQUM7UUFDaEQsU0FBSSxHQUFhLEVBQUUsQ0FBQztRQUVwQixnQkFBVyxHQUFHLElBQUksZUFBZSxDQUF5QixTQUFTLENBQUMsQ0FBQztRQUNyRSxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFVLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQztRQUdyRixnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBOGVsRDtJQTVlQyxJQUFJLElBQUk7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFD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O0FBaWdCQyxNQUFNLE9BQU8sVUFBVTtJQUNyQixZQUNTLEtBQWEsRUFDYixLQUFhLEVBQ2IsS0FBYTtRQUZiLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUNwQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGpzb25wYXRoIGZyb20gJ2pzb25wYXRoJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNoZW1hIH0gZnJvbSAnLi9zaGFyZWQvbW9kZWxzL3NoZW1hLm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZmlnUmVnaXN0cm8sIEtleSwgT3BlcmF0aW9uLCBrZXlFc3F1ZW1hIH0gZnJvbSAnLi9zaGFyZWQvbW9kZWxzL2NydWQtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgRW1wcmVzYSB9IGZyb20gJy4vc2hhcmVkL21vZGVscy9FbXByZXNhLm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi9zaGFyZWQvbW9kZWxzL0NvbmRpdGlvbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBSZWFzb24gfSBmcm9tICcuL3NoYXJlZC9tb2RlbHMvUmVhc29uLm1vZGVsJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZkNydWRTZXJ2aWNlIHtcclxuICBwcml2YXRlIF9lc3F1ZW1hczogU2hlbWFbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3VpRXNxdWVtYXM6IGFueVtdID0gW11cclxuICBwcml2YXRlIF9yZWdpc3Ryb3M6IENvbmZpZ1JlZ2lzdHJvW10gPSBbXTtcclxuICBwcml2YXRlIF9hbnN3ZXJzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2RhdGFTZXQgOmFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfaWRzIDpzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgX19pbmRleDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9pZEthdGlvcyE6IHN0cmluZztcclxuICBwcml2YXRlIF9jb25maWdFbXByZXNhOiBFbXByZXNhIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3RyeDogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIGpzb25Db25maWc6IGFueTtcclxuICBwcml2YXRlIF9jaGFuZ2VEYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFuZ2VEYXRhIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xyXG4gIHByaXZhdGUgX19mb3JtTG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TG9hZGluZz4oe2luUHJvZ3Jlc3M6IGZhbHNlLCB0YXJnZXQ6IHVuZGVmaW5lZH0pO1xyXG4gIHByaXZhdGUgX2RhdGFFeHQ6IGFueTtcclxuICBwcml2YXRlIF90Zm1Vc2VyOiBhbnk7XHJcbiAgcHJpdmF0ZSBfY3J1ZExvYWRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG5cclxuICBnZXQgdXNlcigpe1xyXG4gICAgaWYgKCF0aGlzLl90Zm1Vc2VyKSB0aGlzLl90Zm1Vc2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIm9TZXNzaW9uVEZNXCIpISlcclxuICAgIHJldHVybiB0aGlzLl90Zm1Vc2VyXHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudE9wZXJhdGlvbigpe1xyXG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cm9zW3RoaXMuaW5kZXhdLm9wZXJhdGlvbnMuZmluZCh4ID0+IHgudHlwZS5zdGFydHNXaXRoKHRoaXMuX3RyeFt0aGlzLmluZGV4XSkpXHJcbiAgfVxyXG5cclxuICBzZXQgZW52aXJvbm1lbnQodmFsOiBhbnkpe1xyXG4gICAgdGhpcy5qc29uQ29uZmlnID0gdmFsXHJcbiAgfVxyXG5cclxuICBnZXQgZW52aXJvbm1lbnQoKXtcclxuICAgIHJldHVybiB0aGlzLmpzb25Db25maWdcclxuICB9XHJcblxyXG4gIGdldCBvbkNydWRMb2FkZWQkKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fY3J1ZExvYWRlZC5hc09ic2VydmFibGUoKVxyXG4gIH1cclxuXHJcbiAgc2V0IGNydWRMb2FkZWQodmFsdWU6IGJvb2xlYW4pe1xyXG4gICAgdGhpcy5fY3J1ZExvYWRlZC5uZXh0KHZhbHVlKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFFeHQoKXtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhRXh0XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0YUV4dCh2YWwpe1xyXG4gICAgdGhpcy5fZGF0YUV4dCA9IHZhbFxyXG4gIH1cclxuXHJcbiAgZ2V0IGluZGV4KCl7XHJcbiAgICByZXR1cm4gdGhpcy5fX2luZGV4XHJcbiAgfVxyXG5cclxuICBzZXQgaW5kZXgodmFsdWU6IG51bWJlcil7XHJcbiAgICB0aGlzLl9faW5kZXggPSB2YWx1ZVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlkS2F0aW9zKCl7XHJcbiAgICByZXR1cm4gdGhpcy5faWRLYXRpb3NcclxuICB9XHJcblxyXG4gIHNldCBpZEthdGlvcyh2YWx1ZTogc3RyaW5nKXtcclxuICAgIHRoaXMuX2lkS2F0aW9zID0gdmFsdWU/LnRyaW0oKT8udG9VcHBlckNhc2UoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbmZpZ0VtcHJlc2EoKTogRW1wcmVzYSB8IHVuZGVmaW5lZHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWdFbXByZXNhXHJcbiAgfVxyXG5cclxuICBzZXQgY29uZmlnRW1wcmVzYSh2YWx1ZTogRW1wcmVzYSB8IHVuZGVmaW5lZCl7XHJcbiAgICB0aGlzLl9jb25maWdFbXByZXNhID0gdmFsdWVcclxuICB9XHJcblxyXG4gIGdldFVSTChvcGVyYXRpb246IE9wZXJhdGlvbiwgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCwgaWQ6IGFueT11bmRlZmluZWQpe1xyXG5cclxuICAgICAgbGV0IHVybCA9IG9wZXJhdGlvbi51cmwgfHwgYCR7dGhpcy5qc29uQ29uZmlnW29wZXJhdGlvbi5zZXJ2ZXIhXX0ke29wZXJhdGlvbi5lbmRwb2ludH1gXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKCdAaWRLYXRpb3MnLCB0aGlzLmlkS2F0aW9zKVxyXG4gICAgICBpZiAoaWQpIHVybCA9IHVybC5yZXBsYWNlKCdAaWQnLCBpZClcclxuXHJcbiAgICAgIHVybCA9IHRoaXMuYXBwbHlTdHJpbmdLZXlzKHVybCwgaW5kZXgpXHJcbiAgICAgIHJldHVybiB1cmxcclxuICB9XHJcblxyXG4gIGdldFJlZ2lzdHJvKGluZGV4OiBudW1iZXIpe1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJvc1tpbmRleF07XHJcbiAgfVxyXG5cclxuICBnZXRJZChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9pZHMubGVuZ3RoID09IDEgPyB0aGlzLl9pZHNbMF0gOiB0aGlzLl9pZHNbaW5kZXhdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFzZXQoKXtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhU2V0XHJcbiAgfVxyXG4gIGdldERhdGEoaW5kZXg6IG51bWJlcil7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNldC5sZW5ndGggPT0gMSA/IHRoaXMuX2RhdGFTZXRbMF0gOiB0aGlzLl9kYXRhU2V0W2luZGV4XTtcclxuICB9XHJcblxyXG4gIGdldFRyeChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90cnhbaW5kZXhdXHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxEYXRhKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNldC5sZW5ndGhcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFJlZ2lzdHJvcygpe1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJvcy5sZW5ndGhcclxuICB9XHJcblxyXG4gIGdldCB1aUVzcXVlbWFzKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fdWlFc3F1ZW1hc1xyXG4gIH1cclxuXHJcbiAgZ2V0RXNxdWVtYShpbmRleDogbnVtYmVyKXtcclxuICAgIHJldHVybiB0aGlzLl9lc3F1ZW1hcy5sZW5ndGggPT0gMSA/IHRoaXMuX2VzcXVlbWFzWzBdIDogdGhpcy5fZXNxdWVtYXNbaW5kZXhdO1xyXG4gIH1cclxuXHJcbiAgcmVzZXQoKXtcclxuICAgIHRoaXMuX2lkcyA9IFtdXHJcbiAgICB0aGlzLl9kYXRhU2V0ID0gW11cclxuICB9XHJcblxyXG4gIGdldFVSTFJlZGlyZWN0KGluaXRpYWxVUkw6IHN0cmluZyl7XHJcbiAgICBsZXQgZmluYWxVcmwgPSB0aGlzLmFwcGx5U3RyaW5nS2V5cyhpbml0aWFsVVJMLCB1bmRlZmluZWQpXHJcbiAgICBmaW5hbFVybCA9IGZpbmFsVXJsLnJlcGxhY2UoXCJAVVJMQkFTRVwiLCB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnPycpWzBdKVxyXG4gICAgcmV0dXJuIGZpbmFsVXJsXHJcbiAgfVxyXG5cclxuICBnZXRVSUVzcXVlbWEoaW5kZXg6IG51bWJlcil7XHJcbiAgICByZXR1cm4gdGhpcy5fdWlFc3F1ZW1hc1tpbmRleF07XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogdXNpbmcgZGF0YSwgYXBwbHkgZWFjaCBrZXlFc3F1ZW1hIG92ZXIgZWFjaCBkYXRhc2V0IGluZGljYXRlZCBvbiBpbmRleERhdGEgb2YgZWFjaCBrZXlcclxuICAgKiBAcGFyYW0gZGF0YVxyXG4gICAqIEBwYXJhbSBjb250ZW50XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhcHBseU9iamVjdEtleXMoZGF0YTogYW55LCBrZXlzRXNxdWVtYToga2V5RXNxdWVtYVtdLCByZWdpc3RybzogQ29uZmlnUmVnaXN0cm8pOiBhbnl7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNFc3F1ZW1hLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG9wdCA9IGtleXNFc3F1ZW1hW2ldO1xyXG4gICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChvcHQuaW5kZXhLZXkpe1xyXG4gICAgICAgIGxldCBrZXlGb3VuZCA9IChyZWdpc3Ryby5rZXlzID8/IFt1bmRlZmluZWRdKVtvcHQuaW5kZXhLZXldXHJcbiAgICAgICAgdGhpcy5hcHBseUtleShrZXlGb3VuZCwgcmVnaXN0cm8sIGRhdGEpXHJcblxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG9wdC5pbmRleERhdGEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChvcHQuaXNBcnJheSl7XHJcbiAgICAgICAgICB2YWx1ZSA9IGpzb25wYXRoLnF1ZXJ5KGRhdGEsIG9wdC5zY29wZSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHZhbHVlID0ganNvbnBhdGgucXVlcnkoZGF0YSwgb3B0LnNjb3BlKVswXVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAob3B0LmtleSA9PSBcIiRcIikgT2JqZWN0LmFzc2lnbih0aGlzLl9kYXRhU2V0W29wdC5pbmRleERhdGEhXSwgdmFsdWUpXHJcbiAgICAgIGVsc2UgaWYgKG9wdC5rZXkgJiYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB8fCAob3B0LmNhbkJlVmFsdWVVbmRlZmluZWQgPT09IHVuZGVmaW5lZCB8fCBvcHQuY2FuQmVWYWx1ZVVuZGVmaW5lZCA9PT0gdHJ1ZSkpKSBqc29ucGF0aC52YWx1ZSh0aGlzLl9kYXRhU2V0W29wdC5pbmRleERhdGEhXSwgb3B0LmtleSwgdmFsdWUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YVxyXG4gIH1cclxuXHJcblxyXG4gIGFwcGx5S2V5KGtleTogS2V5IHwgdW5kZWZpbmVkLCByZWdpc3RybzogQ29uZmlnUmVnaXN0cm8sIGRhdGE6IGFueSl7XHJcbiAgICBpZiAoa2V5Py5vdmVycmlkZUNvbnRyb2wpe1xyXG4gICAgICBsZXQgbmV3VmFsID0gdW5kZWZpbmVkO1xyXG4gICAgICBsZXQgZXNxdWVtYVRvU2V0ID0gdGhpcy5nZXRDb250cm9sKGtleS5zY29wZSwgdGhpcy5lc3F1ZW1hc1trZXkuaW5kZXhEYXRhID8/IHRoaXMuaW5kZXhdKVxyXG4gICAgICBpZiAoIWVzcXVlbWFUb1NldCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3Ioe21lc3NhZ2U6IFwibGEga2V5IGVzdGEgbWFsIGNvbmZpZ3VyYWRhXCIsIGRhdGE6IGtleX0pXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjb21wbGV0ZWQgPSB0aGlzLmlzQ29uZGl0aW9uc0NvbXBsZXRlZChrZXkub3ZlcnJpZGVDb250cm9sLmNvbmRpdGlvbnMgPz8gW10sIHJlZ2lzdHJvLmNvbmRpdGlvbnMgfHwgW10sIGRhdGEpXHJcbiAgICAgIGlmIChrZXkub3ZlcnJpZGVDb250cm9sPy5wcm9wZXJ0eSkganNvbnBhdGgudmFsdWUoZXNxdWVtYVRvU2V0LCBrZXkub3ZlcnJpZGVDb250cm9sLnByb3BlcnR5LCBjb21wbGV0ZWQgPyBrZXkub3ZlcnJpZGVDb250cm9sLnZhbHVlIDoga2V5Lm92ZXJyaWRlQ29udHJvbC5lbHNlVmFsdWUpXHJcblxyXG4gICAgICBpZiAoY29tcGxldGVkICYmIGtleS5vdmVycmlkZUNvbnRyb2wubmV3UHJvcGVydHlWYWx1ZSAhPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICBpZiAoa2V5Lm92ZXJyaWRlQ29udHJvbC5uZXdQcm9wZXJ0eVZhbHVlID09ICdSRVNFVE9CSkVDVCcpIG5ld1ZhbCA9IHRoaXMuY3JlYXRlT2JqZWN0KGVzcXVlbWFUb1NldCwgdGhpcy5jdXJyZW50T3BlcmF0aW9uKVxyXG4gICAgICAgIGVsc2UgbmV3VmFsID0ga2V5Lm92ZXJyaWRlQ29udHJvbC5uZXdQcm9wZXJ0eVZhbHVlXHJcbiAgICAgIH1lbHNlIGlmICghY29tcGxldGVkICYmIGtleS5vdmVycmlkZUNvbnRyb2wuZWxzZU5ld1Byb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgaWYgKGtleS5vdmVycmlkZUNvbnRyb2wuZWxzZU5ld1Byb3BlcnR5VmFsdWUgPT0gJ1JFU0VUT0JKRUNUJykgbmV3VmFsID0gdGhpcy5jcmVhdGVPYmplY3QoZXNxdWVtYVRvU2V0LCB0aGlzLmN1cnJlbnRPcGVyYXRpb24pXHJcbiAgICAgICAgZWxzZSBuZXdWYWwgPSBrZXkub3ZlcnJpZGVDb250cm9sLmVsc2VOZXdQcm9wZXJ0eVZhbHVlXHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld1ZhbCAhPT0gdW5kZWZpbmVkKSBqc29ucGF0aC52YWx1ZSh0aGlzLl9kYXRhU2V0W2tleS5pbmRleERhdGEgPz8gdGhpcy5pbmRleF0sIGtleS5zY29wZS5yZXBsYWNlQWxsKCcuLnByb3BlcnRpZXMnLCAnJyksIG5ld1ZhbClcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBjb25kaXRpb25zIG9uIGRhdGFzXHJcbiAgICogQHBhcmFtIGNvbmRpdGlvbnNcclxuICAgKiBAcGFyYW0gaW5kZXhcclxuICAgKi9cclxuICBpc0NvbmRpdGlvbnNDb21wbGV0ZWQoaUNvbmRpdGlvbnM6IG51bWJlcltdLCBjb25kaXRpb25zOiBDb25kaXRpb25bXSwgZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY3VtcGxlID0gIHRydWVcclxuICAgIGlDb25kaXRpb25zLmZvckVhY2goIGlDb25kID0+IHtcclxuICAgICAgY29uc3QgYyA9IENvbmRpdGlvbi5pbnN0YW5jZUNvbnRpZGlvbihpQ29uZCwgY29uZGl0aW9ucylcclxuICAgICAgbGV0IGRhdGFUb0V2YWx1YXRlID0gYy5pbmRleERhdGEgIT09IHVuZGVmaW5lZCA/IHRoaXMuX2RhdGFTZXRbYy5pbmRleERhdGFdIDogZGF0YVxyXG4gICAgICBpZiAoIWMuaXNWYWxpZChkYXRhVG9FdmFsdWF0ZSkpIGN1bXBsZSA9IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIGN1bXBsZVxyXG4gIH1cclxuICAgIC8qKlxyXG4gICAgICogQXBwbHkgZWFjaCBrZXkgZnJvbSByZWdpc3RlciBvdmVyIHN0cmluZyBjb250ZW50XHJcbiAgICAgKiBAcGFyYW0gaW5kZXhSZWdpc3Ryb1xyXG4gICAgICogQHBhcmFtIGNvbnRlbnRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFwcGx5U3RyaW5nS2V5cyhjb250ZW50OiBzdHJpbmcsIGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpOiBzdHJpbmd7XHJcbiAgICAgIGxldCBpbmRleFJlZ2lzdHJvID0gaW5kZXggfHwgdGhpcy5fX2luZGV4XHJcbiAgICAgIHRoaXMuX3JlZ2lzdHJvc1tpbmRleFJlZ2lzdHJvXS5rZXlzPy5mb3JFYWNoKChvcHQpID0+IHtcclxuICAgICAgICBsZXQgdmFsdWU7XHJcbiAgICAgICAgaWYgKG9wdC5pbmRleElkICE9PSB1bmRlZmluZWQgJiYgb3B0LmluZGV4SWQgPCB0aGlzLl9pZHMubGVuZ3RoKSB2YWx1ZSA9IHRoaXMuX2lkc1tvcHQuaW5kZXhJZF1cclxuICAgICAgICBlbHNlIGlmIChvcHQuaW5kZXhBbnN3ZXIgIT09IHVuZGVmaW5lZCAmJiBvcHQuaW5kZXhBbnN3ZXIgPCB0aGlzLl9hbnN3ZXJzLmxlbmd0aCkgdmFsdWUgPSBqc29ucGF0aC5xdWVyeSh0aGlzLl9hbnN3ZXJzW29wdC5pbmRleEFuc3dlcl0sIG9wdC5zY29wZSlbMF1cclxuICAgICAgICBlbHNlIGlmIChvcHQuaW5kZXhEYXRhICE9PSB1bmRlZmluZWQpIHZhbHVlID0ganNvbnBhdGgucXVlcnkodGhpcy5fZGF0YVNldFtvcHQuaW5kZXhEYXRhXSwgb3B0LnNjb3BlKVswXVxyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgdmFsdWUgPSAnJ1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob3B0LmtleSwgdmFsdWUpXHJcbiAgICAgIH0pXHJcbiAgICByZXR1cm4gY29udGVudFxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEYXRhTG9jYWwob3BlcmF0aW9uOiBPcGVyYXRpb24sIGRhdGE6IGFueSwgY29uZGl0aW9uczogQ29uZGl0aW9uW10pIHtcclxuICAgIGNvbnN0IGVycjogc3RyaW5nW10gPSBbXVxyXG4gICAgLy9Tb2xvIHNpIHNlIGN1bXBsZSBsYSBjb25kaWNpb24sIHNlIHZhbGlkYVxyXG4gICAgb3BlcmF0aW9uLnZhbGlkYXRpb25zPy5yZXF1aXJlZD8uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgY29uc3QgY3VtcGxlQ29uZCA9IHguY29uZGl0aW9ucyA/IHRoaXMuaXNDb25kaXRpb25zQ29tcGxldGVkKHguY29uZGl0aW9ucywgY29uZGl0aW9ucywgZGF0YSk6IHRydWU7XHJcbiAgICAgIGlmIChjdW1wbGVDb25kICYmICghanNvbnBhdGgucXVlcnkoZGF0YSwgeC5maWVsZClbMF0gfHxcclxuICAgICAgKEFycmF5LmlzQXJyYXkoanNvbnBhdGgucXVlcnkoZGF0YSwgeC5maWVsZClbMF0pICYmIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHguZmllbGQpWzBdLmxlbmd0aCA9PSAwKSkpIGVyci5wdXNoKHgubWVzc2FnZSk7XHJcbiAgICB9KVxyXG5cclxuICAgIG9wZXJhdGlvbi52YWxpZGF0aW9ucz8uZGlmZmVyZW50Py5mb3JFYWNoKHggPT57XHJcbiAgICAgIGNvbnN0IGN1bXBsZUNvbmQgPSB4LmNvbmRpdGlvbnMgPyB0aGlzLmlzQ29uZGl0aW9uc0NvbXBsZXRlZCh4LmNvbmRpdGlvbnMsIGNvbmRpdGlvbnMsIGRhdGEpOiB0cnVlO1xyXG4gICAgICBpZiAoY3VtcGxlQ29uZCAmJiBqc29ucGF0aC5xdWVyeShkYXRhLCB4LmZpZWxkKVswXSA9PT0geC52YWx1ZSkgZXJyLnB1c2goeC5tZXNzYWdlKTtcclxuICAgIH0pXHJcblxyXG4gICAgb3BlcmF0aW9uLnZhbGlkYXRpb25zPy5lcXVhbHM/LmZvckVhY2goeCA9PntcclxuICAgICAgY29uc3QgY3VtcGxlQ29uZCA9IHguY29uZGl0aW9ucyA/IHRoaXMuaXNDb25kaXRpb25zQ29tcGxldGVkKHguY29uZGl0aW9ucywgY29uZGl0aW9ucywgZGF0YSk6IHRydWU7XHJcbiAgICAgIGlmIChjdW1wbGVDb25kICYmIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHguZmllbGQpWzBdICE9IHgudmFsdWUpIGVyci5wdXNoKHgubWVzc2FnZSk7XHJcbiAgICB9KVxyXG4gICAgb3BlcmF0aW9uLnZhbGlkYXRpb25zPy5vcGVyYXRpb25zPy5mb3JFYWNoKChvcDogYW55KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAob3AuYWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSAnc3VtQXJyYXknOlxyXG4gICAgICAgICAgY29uc3QgdmFyMSA9IGpzb25wYXRoLnF1ZXJ5KGRhdGEsIG9wLnNjb3BlWzBdKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKz0gY3VyW29wLmtleV0sIDApO1xyXG4gICAgICAgICAgY29uc3QgdmFyMiA9IGpzb25wYXRoLnF1ZXJ5KGRhdGEsIG9wLnNjb3BlWzFdKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKz0gY3VyW29wLmtleV0sIDApO1xyXG4gICAgICAgICAgaWYgKHZhcjEgIT0gdmFyMikgZXJyLnB1c2gob3AubWVzc2FnZSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHJldHVybiBlcnI7XHJcbiAgfVxyXG5cclxuICBzZXQgZXNxdWVtYXMoZXNxdWVtYXM6IFNoZW1hW10pe1xyXG4gICAgdGhpcy5fZXNxdWVtYXMgPSBlc3F1ZW1hc1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVzcXVlbWFzKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fZXNxdWVtYXNcclxuICB9XHJcblxyXG4gIHNldCBpZHMoaWRzOiBzdHJpbmdbXSl7XHJcbiAgICB0aGlzLl9pZHMgPSBpZHNcclxuICB9XHJcblxyXG4gIHNldCB1aUVzcXVlbWFzKHVpRXNxdWVtYXM6IGFueVtdKXtcclxuICAgIHRoaXMuX3VpRXNxdWVtYXMgPSB1aUVzcXVlbWFzXHJcbiAgfVxyXG5cclxuICBnZXQgcmVnaXN0cm9zKCl7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0cm9zXHJcbiAgfVxyXG5cclxuICBzZXQgcmVnaXN0cm9zKHJlZ2lzdHJvczogQ29uZmlnUmVnaXN0cm9bXSl7XHJcbiAgICB0aGlzLl9yZWdpc3Ryb3MgPSByZWdpc3Ryb3NcclxuICB9XHJcblxyXG4gIHNldERhdGFTZXQoZGF0YTogYW55LCBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKXtcclxuICAgIGluZGV4ID0gaW5kZXggPyBpbmRleCA6IHRoaXMuX19pbmRleFxyXG4gICAgaWYgKGluZGV4ID49IHRoaXMudG90YWxEYXRhKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFTZXQucHVzaChkYXRhKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0VHJ4KHRyeDogYW55LCBpbmRleDogbnVtYmVyKXtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRyeCkpIHRoaXMuX3RyeCA9IHRyeDtcclxuICAgIGVsc2UgaWYgKGluZGV4ID49IHRoaXMuX3RyeC5sZW5ndGgpIHRoaXMuX3RyeC5wdXNoKHRyeClcclxuICAgIGVsc2UgdGhpcy5fdHJ4W2luZGV4XSA9IHRyeFxyXG4gIH1cclxuXHJcbiAgc2V0QW5zd2VycyhhbnN3ZXI6IGFueSwgaW5kZXg6IG51bWJlcil7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhbnN3ZXIpKSB0aGlzLl9hbnN3ZXJzID0gYW5zd2VyO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChpbmRleCA+PSB0aGlzLl9hbnN3ZXJzLmxlbmd0aCkgdGhpcy5fYW5zd2Vycy5wdXNoKGFuc3dlcik7XHJcbiAgICAgIGVsc2UgdGhpcy5fYW5zd2Vyc1tpbmRleF0gPSBhbnN3ZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sKHNjb3BlOiBzdHJpbmcsIGVzcXVlbWE6IFNoZW1hKSB7XHJcbiAgICByZXR1cm4ganNvbnBhdGgucXVlcnkoZXNxdWVtYSwgc2NvcGUpWzBdO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldFZhbHVlKHNjb3BlOiBhbnksIGRhdGE6IGFueSkge1xyXG4gICAgcmV0dXJuIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHNjb3BlLnJlcGxhY2VBbGwoJy5wcm9wZXJ0aWVzJywgJycpKVswXTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZU9iamVjdChlc3F1ZW1hOiBTaGVtYSwgb3BlcmF0aW9uOiBPcGVyYXRpb24gfCB1bmRlZmluZWQpIHtcclxuICAgIGNvbnN0IG9iamVjdDogYW55ID0ge307XHJcbiAgICBzd2l0Y2ggKGVzcXVlbWEudHlwZSkge1xyXG4gICAgICBjYXNlICdudW1lcmljJzpcclxuICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgaWYgKGVzcXVlbWEuZGVmYXVsdCAmJiBvcGVyYXRpb24pe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2V0RGVmYXVsdFZhbHVlKGVzcXVlbWEuZGVmYXVsdCwgb3BlcmF0aW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHJldHVybiBlc3F1ZW1hLmRlZmF1bHQgPz8gbnVsbDtcclxuICAgICAgY2FzZSAnYm9vbGVhbic6XHJcbiAgICAgICAgcmV0dXJuIGVzcXVlbWE/LmRlZmF1bHQgfHwgZmFsc2U7XHJcbiAgICAgIGNhc2UgJ2FycmF5JzpcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIGNhc2UgJ2ZpbGUnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVzcXVlbWE/LnByb3BlcnRpZXMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGxldCBhdXggPSBlc3F1ZW1hPy5wcm9wZXJ0aWVzW2tleV1cclxuICAgICAgICAgIGlmIChhdXgpIG9iamVjdFtrZXldID0gdGhpcy5jcmVhdGVPYmplY3QoYXV4LCBvcGVyYXRpb24pXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAgIGdldFZhbHVlS2V5KGtleTogS2V5IHwgdW5kZWZpbmVkKTogYW55IHtcclxuICAgIGxldCBkYXRhO1xyXG4gICAgc3dpdGNoIChrZXk/LmRhdGEgfHwgJ2V4dGVybmEnKSB7XHJcbiAgICAgIGNhc2UgXCJ1c2VyXCI6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMudXNlclxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGRhdGEgPSB0aGlzLmRhdGFFeHRcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChkYXRhICYmIGtleSl7XHJcbiAgICAgIGNvbnN0IGF1eCA9IGpzb25wYXRoLnF1ZXJ5KGRhdGEsIGtleS5zY29wZSlcclxuICAgICAgaWYgKGF1eC5sZW5ndGggPT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICBpZiAoYXV4Lmxlbmd0aCA9PSAxKSByZXR1cm4gYXV4WzBdXHJcbiAgICAgIGVsc2UgcmV0dXJuIGF1eFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gIH1cclxuXHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZSh2YWx1ZTogYW55LCBvcGVyYXRpb246IE9wZXJhdGlvbikge1xyXG4gICAgbGV0IGRhdGEgPSBudWxsO1xyXG4gICAgaWYgKHZhbHVlLmtleSAmJiBvcGVyYXRpb24ua2V5cyl7XHJcbiAgICAgIGRhdGEgPSB0aGlzLmdldFZhbHVlS2V5KG9wZXJhdGlvbi5rZXlzLmZpbmQoayA9PiBrLmtleSA9PSB2YWx1ZS5rZXkpISlcclxuICAgICAgdmFsdWUgPSBkYXRhXHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgIGNhc2UgJ0B1YWN0aXZvJzpcclxuICAgICAgICBkYXRhID0gYCR7dGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLlRET0N9LSR7dGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0N9YFxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdAdGRvY2FjdGl2byc6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0BuZG9jYWN0aXZvJzpcclxuICAgICAgICBkYXRhID0gdGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0NcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQGhveSc6XHJcbiAgICAgICAgZGF0YSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGlmIHNjaGVtYSBoYXMgcGRmc2lnbiBhbmQgaXQncyBzaWduZWQsIGVsc2UgcmV0dXJuIGZhbHNlXHJcbiAgICogQHBhcmFtIGluZGV4XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBpc1NpZ25lZFBERihpbmRleDogbnVtYmVyKXtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhU2V0W2luZGV4XS5zaWduZWRcclxuICB9XHJcblxyXG4gIGdldCBjaGFuZ2VEYXRhJCgpe1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZURhdGEuYXNPYnNlcnZhYmxlKClcclxuICB9XHJcblxyXG4gIHNldCBjaGFuZ2VEYXRhKHZhbHVlOiBDaGFuZ2VEYXRhKXtcclxuICAgIHRoaXMuX2NoYW5nZURhdGEubmV4dCh2YWx1ZSlcclxuICB9XHJcblxyXG4gIGdldCBmb3JtTG9hZGluZyQoKXtcclxuICAgIHJldHVybiB0aGlzLl9fZm9ybUxvYWRpbmcuYXNPYnNlcnZhYmxlKClcclxuICB9XHJcblxyXG4gIHNldCBmb3JtTG9hZGluZyh2YWx1ZTogTG9hZGluZyl7XHJcbiAgICB0aGlzLl9fZm9ybUxvYWRpbmcubmV4dCh2YWx1ZSlcclxuICB9XHJcblxyXG4gIGxvYWRTZXNzaW9uKCkge1xyXG4gICAgY29uc3QgZXhpc3RTZXNzaW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJlc3F1ZW1hc1wiKSAhPT0gbnVsbFxyXG4gICAgaWYgKGV4aXN0U2Vzc2lvbil7XHJcbiAgICAgIHRoaXMuX2VzcXVlbWFzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImVzcXVlbWFzXCIpISlcclxuICAgICAgdGhpcy5fdWlFc3F1ZW1hcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1aUVzcXVlbWFzXCIpISlcclxuICAgICAgdGhpcy5fcmVnaXN0cm9zID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInJlZ2lzdHJvc1wiKSEpXHJcbiAgICAgIHRoaXMuX2RhdGFTZXQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZGF0YVNldFwiKSEpXHJcbiAgICAgIHRoaXMuX2Fuc3dlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYW5zd2Vyc1wiKSEpXHJcbiAgICAgIHRoaXMuX3RyeCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ0cnhcIikhKVxyXG4gICAgICB0aGlzLl9faW5kZXggPSArbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpbmRleFwiKSFcclxuICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKClcclxuICAgIH1cclxuICAgIHJldHVybiBleGlzdFNlc3Npb25cclxuICB9XHJcblxyXG4gIGdldCByZWFzb25zKCk6IFJlYXNvbltde1xyXG4gICAgY29uc3QgcmVhc29uc1N0b3JhZ2UgPWxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicmVhc29uc1wiKVxyXG4gICAgaWYgKHJlYXNvbnNTdG9yYWdlKSByZXR1cm4gPFJlYXNvbltdPkpTT04ucGFyc2UocmVhc29uc1N0b3JhZ2UpXHJcbiAgICByZXR1cm4gW11cclxuICB9XHJcblxyXG4gIHNhdmVQcm9ncmVzcyhyZWFzb25zOiBSZWFzb25bXSl7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInJlYXNvbnNcIiwgSlNPTi5zdHJpbmdpZnkocmVhc29ucykpXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVzcXVlbWFzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuX2VzcXVlbWFzKSlcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidHJ4XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuX3RyeCkpXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVpRXNxdWVtYXNcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5fdWlFc3F1ZW1hcykpXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInJlZ2lzdHJvc1wiLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9yZWdpc3Ryb3MpKVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJkYXRhU2V0XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuX2RhdGFTZXQpKVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhbnN3ZXJzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuX2Fuc3dlcnMpKVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJpbmRleFwiLCB0aGlzLl9faW5kZXgudG9TdHJpbmcoKSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWRpcmVjdFRvSW5pY2lvKCl7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXVxyXG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICB9XHJcblxyXG5cclxuYXBwbHlWYWx1ZXNPbkV2ZW50KGV2ZW50OiBzdHJpbmcsIGVzcXVlbWE6IFNoZW1hLCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGF0YTogYW55KSB7XHJcbiAgICBpZiAoa2V5KSB7IFxyXG4gICAgICBpZiAoZXNxdWVtYS5wcm9wZXJ0aWVzW2tleV1bZXZlbnRdKSB7XHJcbiAgICAgICAgZXNxdWVtYS5wcm9wZXJ0aWVzW2tleV1bZXZlbnRdLmZvckVhY2goKHZhbHVlOiB7IHNjb3BlOiBzdHJpbmdbXSwgb3A6IHN0cmluZywga2V5Pzogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICAgIHRoaXMuc2V0VmFsdWVFdmVudChkYXRhLCB2YWx1ZSwgZXNxdWVtYSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXNxdWVtYS5wcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgaWYgKGVzcXVlbWEucHJvcGVydGllc1trZXldW2V2ZW50XSkge1xyXG4gICAgICAgICAgZXNxdWVtYS5wcm9wZXJ0aWVzW2tleV1bZXZlbnRdLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUV2ZW50KGRhdGEsIHZhbHVlLCBlc3F1ZW1hKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZUV2ZW50KGRhdGE6IGFueSwgcGFyYW1zOiB7IHNjb3BlOiBzdHJpbmdbXSwgb3A6IHN0cmluZywga2V5PzogYW55LCBzZXBhcmF0b3I/OiBzdHJpbmcgfSwgZXNxdWVtYTogU2hlbWEpIHtcclxuICAgIGxldCBkYXRlID0gbW9tZW50KG5ldyBEYXRlKCkpO1xyXG4gICAgc3dpdGNoIChwYXJhbXMub3ApIHtcclxuICAgICAgY2FzZSAnc3VtJzpcclxuICAgICAgICBqc29ucGF0aC52YWx1ZShkYXRhLCBwYXJhbXMuc2NvcGVbMV0sIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHBhcmFtcy5zY29wZVswXSkucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICs9IHBhcmFtcz8ua2V5ID8gY3VyW3BhcmFtcy5rZXldIDogY3VyLCAwKSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY29uY2F0JzpcclxuICAgICAgICBsZXQgYXJyYXk6IHN0cmluZ1tdID0gW11cclxuICAgICAgICBwYXJhbXM/LmtleT8ucmVkdWNlKChhY2M6IGFueVtdLCBjdXI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgYXJyYXkucHVzaChqc29ucGF0aC5xdWVyeShkYXRhLCBjdXIpWzBdKVxyXG4gICAgICAgIH0sIFtdKVxyXG4gICAgICAgIGlmIChwYXJhbXM/LnNlcGFyYXRvcikganNvbnBhdGgudmFsdWUoZGF0YSwgcGFyYW1zLnNjb3BlWzBdLCBhcnJheS5qb2luKHBhcmFtcz8uc2VwYXJhdG9yIHx8ICcgJykpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2VuYWJsZSc6XHJcbiAgICAgICAganNvbnBhdGgudmFsdWUoZXNxdWVtYSwgcGFyYW1zLnNjb3BlWzBdLCBmYWxzZSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZGlzYWJsZWQnOlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKGVzcXVlbWEsIHBhcmFtcy5zY29wZVswXSwgdHJ1ZSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmVwbGFjZTplbmRwb2ludCc6XHJcbiAgICAgICAganNvbnBhdGgudmFsdWUoZXNxdWVtYSwgcGFyYW1zLnNjb3BlWzBdLCBlc3F1ZW1hLmNvbmZpZy5lbmRwb2ludHRlbXAucmVwbGFjZShwYXJhbXMuc2NvcGVbMV0sIGpzb25wYXRoLnF1ZXJ5KGRhdGEsIGAkLi4ke3BhcmFtcy5rZXl9YCkpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdzZXROdWxsJzpcclxuICAgICAgICBqc29ucGF0aC52YWx1ZShkYXRhLCBgJC4ke3BhcmFtcy5rZXl9YCwgbnVsbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZGF0ZWRpZmY6eWVhcnMnOlxyXG4gICAgICAgICAganNvbnBhdGgudmFsdWUoZGF0YSwgcGFyYW1zLnNjb3BlWzBdLCBkYXRlLmRpZmYobW9tZW50KGpzb25wYXRoLnF1ZXJ5KGRhdGEsIHBhcmFtcy5zY29wZVsxXSlbMF0pLCAneWVhcnMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGVkaWZmOm1vbnRocyc6XHJcbiAgICAgICAgICBqc29ucGF0aC52YWx1ZShkYXRhLCBwYXJhbXMuc2NvcGVbMF0sIGRhdGUuZGlmZihtb21lbnQoanNvbnBhdGgucXVlcnkoZGF0YSwgcGFyYW1zLnNjb3BlWzFdKVswXSksICdtb250aHMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGVkaWZmOndlZWtzJzpcclxuICAgICAgICAgIGpzb25wYXRoLnZhbHVlKGRhdGEsIHBhcmFtcy5zY29wZVswXSwgZGF0ZS5kaWZmKG1vbWVudChqc29ucGF0aC5xdWVyeShkYXRhLCBwYXJhbXMuc2NvcGVbMV0pWzBdKSwgJ3dlZWtzJykpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdkYXRlZGlmZjpkYXlzJzpcclxuICAgICAgICAgIGpzb25wYXRoLnZhbHVlKGRhdGEsIHBhcmFtcy5zY29wZVswXSwgZGF0ZS5kaWZmKG1vbWVudChqc29ucGF0aC5xdWVyeShkYXRhLCBwYXJhbXMuc2NvcGVbMV0pWzBdKSwgJ2RheXMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ3NldFZhbHVlRXZlbnQgc2FsZTonKVxyXG4gICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgIGNvbnNvbGUubG9nKGVzcXVlbWEpXHJcbiAgICBjb25zb2xlLmxvZyhwYXJhbXMpXHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG4gIGV4cG9ydCBjbGFzcyBDaGFuZ2VEYXRhIHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyxcclxuICAgICAgcHVibGljIHNjb3BlOiBzdHJpbmcsXHJcbiAgICAgIHB1YmxpYyBpbmRleDogbnVtYmVyXHJcbiAgICApe31cclxuICB9XHJcblxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIExvYWRpbmcge1xyXG4gICAgdGFyZ2V0OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgIGluUHJvZ3Jlc3M6IGJvb2xlYW5cclxuICB9XHJcbiJdfQ==