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