sf-crud 12.3.3 → 13.0.1

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 (49) hide show
  1. package/fesm2022/sf-crud.mjs +3254 -0
  2. package/fesm2022/sf-crud.mjs.map +1 -0
  3. package/{sf-crud.d.ts → index.d.ts} +5 -5
  4. package/lib/components/control/control.component.d.ts +67 -67
  5. package/lib/components/file-upload/file-upload.component.d.ts +34 -34
  6. package/lib/components/form/form.component.d.ts +63 -63
  7. package/lib/components/registro/registro.component.d.ts +109 -109
  8. package/lib/components/step/step.component.d.ts +27 -27
  9. package/lib/components/tablero/tablero.component.d.ts +53 -52
  10. package/lib/directives/format-address.pipe.d.ts +7 -7
  11. package/lib/sf-crud.component.d.ts +8 -8
  12. package/lib/sf-crud.module.d.ts +94 -90
  13. package/lib/sf-crud.routing.module.d.ts +7 -7
  14. package/lib/sf-crud.service.d.ts +135 -135
  15. package/lib/shared/models/Conditions.model.d.ts +32 -32
  16. package/lib/shared/models/Empresa.model.d.ts +11 -11
  17. package/lib/shared/models/Reason.model.d.ts +5 -5
  18. package/lib/shared/models/crud-config.model.d.ts +109 -110
  19. package/lib/shared/models/shema.model.d.ts +37 -37
  20. package/lib/shared/services/general.service.d.ts +20 -20
  21. package/lib/shared/services/notification.service.d.ts +26 -27
  22. package/lib/shared/services/step.service.d.ts +27 -27
  23. package/package.json +20 -15
  24. package/public-api.d.ts +12 -12
  25. package/bundles/sf-crud.umd.js +0 -3795
  26. package/bundles/sf-crud.umd.js.map +0 -1
  27. package/esm2015/lib/components/control/control.component.js +0 -403
  28. package/esm2015/lib/components/file-upload/file-upload.component.js +0 -143
  29. package/esm2015/lib/components/form/form.component.js +0 -289
  30. package/esm2015/lib/components/registro/registro.component.js +0 -757
  31. package/esm2015/lib/components/step/step.component.js +0 -79
  32. package/esm2015/lib/components/tablero/tablero.component.js +0 -220
  33. package/esm2015/lib/directives/format-address.pipe.js +0 -22
  34. package/esm2015/lib/sf-crud.component.js +0 -26
  35. package/esm2015/lib/sf-crud.module.js +0 -359
  36. package/esm2015/lib/sf-crud.routing.module.js +0 -23
  37. package/esm2015/lib/sf-crud.service.js +0 -531
  38. package/esm2015/lib/shared/models/Conditions.model.js +0 -81
  39. package/esm2015/lib/shared/models/Empresa.model.js +0 -2
  40. package/esm2015/lib/shared/models/Reason.model.js +0 -7
  41. package/esm2015/lib/shared/models/crud-config.model.js +0 -76
  42. package/esm2015/lib/shared/models/shema.model.js +0 -11
  43. package/esm2015/lib/shared/services/general.service.js +0 -74
  44. package/esm2015/lib/shared/services/notification.service.js +0 -83
  45. package/esm2015/lib/shared/services/step.service.js +0 -63
  46. package/esm2015/public-api.js +0 -16
  47. package/esm2015/sf-crud.js +0 -5
  48. package/fesm2015/sf-crud.js +0 -3143
  49. 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=