dmencu 3.2.20 → 3.2.21

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 (34) hide show
  1. package/dist/client/unlogged/calculos-encuesta.d.ts +7 -0
  2. package/dist/client/unlogged/calculos-encuesta.js +139 -0
  3. package/dist/client/unlogged/helpers-casilleros.d.ts +14 -0
  4. package/dist/client/unlogged/helpers-casilleros.js +129 -0
  5. package/dist/server/server/procedures-dmencu.js +141 -28
  6. package/dist/server/server/table-rea.js +9 -5
  7. package/dist/server/server/table-rea_sup.js +8 -4
  8. package/dist/test/test-ejemplo.d.ts +1 -0
  9. package/dist/test/test-ejemplo.js +29 -0
  10. package/dist/test/test-rea-no-rea.d.ts +1 -0
  11. package/dist/test/test-rea-no-rea.js +589 -0
  12. package/dist/test/test.d.ts +2 -0
  13. package/dist/test/test.js +15 -0
  14. package/dist/unlogged/bypass-formulario.d.ts +198 -0
  15. package/dist/unlogged/bypass-formulario.js +1226 -0
  16. package/dist/unlogged/calculos-encuesta.d.ts +7 -0
  17. package/dist/unlogged/calculos-encuesta.js +213 -0
  18. package/dist/unlogged/helpers-casilleros.d.ts +14 -0
  19. package/dist/unlogged/helpers-casilleros.js +129 -0
  20. package/dist/unlogged/redux-formulario.d.ts +440 -0
  21. package/dist/unlogged/redux-formulario.js +324 -0
  22. package/dist/unlogged/render-config.d.ts +52 -0
  23. package/dist/unlogged/render-config.js +161 -0
  24. package/dist/unlogged/tipos.d.ts +575 -0
  25. package/dist/unlogged/tipos.js +21 -0
  26. package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +198 -0
  27. package/dist/unlogged/unlogged/bypass-formulario copy.js +1226 -0
  28. package/dist/unlogged/unlogged/calculos-encuesta.d.ts +7 -0
  29. package/dist/unlogged/unlogged/calculos-encuesta.js +213 -0
  30. package/dist/unlogged/unlogged/helpers-casilleros.d.ts +14 -0
  31. package/dist/unlogged/unlogged/helpers-casilleros.js +130 -0
  32. package/dist/unlogged/unlogged/helpers.d.ts +14 -0
  33. package/dist/unlogged/unlogged/helpers.js +129 -0
  34. package/package.json +1 -1
@@ -0,0 +1,589 @@
1
+ (function (factory) {
2
+ if (typeof module === "object" && typeof module.exports === "object") {
3
+ var v = factory(require, exports);
4
+ if (v !== undefined) module.exports = v;
5
+ }
6
+ else if (typeof define === "function" && define.amd) {
7
+ define(["require", "exports", "mocha", "expre-parser", "node:assert", "../unlogged/calculos-encuesta", "../unlogged/helpers-casilleros"], factory);
8
+ }
9
+ })(function (require, exports) {
10
+ "use strict";
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const mocha_1 = require("mocha");
13
+ const ExpresionParser = require("expre-parser");
14
+ const assert = require("node:assert");
15
+ const calculos_encuesta_1 = require("../unlogged/calculos-encuesta");
16
+ const helpers_casilleros_1 = require("../unlogged/helpers-casilleros");
17
+ // Evaluador simple para tests: compila la expresión JS con new Function
18
+ const evaluarMock = (condicionJs, valores) => {
19
+ var internalFun = new Function('valores', 'helpers', 'return ' + condicionJs);
20
+ try {
21
+ var result = internalFun(valores, helpers_casilleros_1.helpersCasilleros);
22
+ }
23
+ catch (err) {
24
+ throw err;
25
+ }
26
+ return result;
27
+ };
28
+ const operativo = 'dmencu';
29
+ const uaPrincipalMock = {
30
+ unidad_analisis: 'viviendas',
31
+ padre: undefined,
32
+ pk_agregada: 'vivienda',
33
+ hijas: {
34
+ hogares: { unidad_analisis: 'hogares', padre: 'viviendas', pk_agregada: 'hogar', hijas: {} }
35
+ }
36
+ };
37
+ const uaTresNivelesMock = {
38
+ unidad_analisis: 'viviendas',
39
+ padre: undefined,
40
+ pk_agregada: 'vivienda',
41
+ hijas: {
42
+ hogares: {
43
+ unidad_analisis: 'hogares',
44
+ padre: 'viviendas',
45
+ pk_agregada: 'hogar',
46
+ hijas: {
47
+ personas: {
48
+ unidad_analisis: 'personas',
49
+ padre: 'hogares',
50
+ pk_agregada: 'persona',
51
+ hijas: {}
52
+ }
53
+ }
54
+ }
55
+ }
56
+ };
57
+ const uaViviendaConVisitasMock = {
58
+ unidad_analisis: 'viviendas',
59
+ padre: undefined,
60
+ pk_agregada: 'vivienda',
61
+ hijas: {
62
+ hogares: {
63
+ unidad_analisis: 'hogares',
64
+ padre: 'viviendas',
65
+ pk_agregada: 'hogar',
66
+ hijas: {
67
+ personas: {
68
+ unidad_analisis: 'personas',
69
+ padre: 'hogares',
70
+ pk_agregada: 'persona',
71
+ hijas: {}
72
+ }
73
+ }
74
+ },
75
+ //@ts-ignore visitas es una ua
76
+ visitas: {
77
+ unidad_analisis: 'visitas',
78
+ padre: 'viviendas',
79
+ pk_agregada: 'visita',
80
+ hijas: {}
81
+ }
82
+ }
83
+ };
84
+ var funcionesConocidas = {};
85
+ var compiler = new ExpresionParser.Compiler({
86
+ language: 'js',
87
+ varWrapper: (var_name) => `helpers.null2zero(valores.${var_name})`,
88
+ funWrapper: (functionName) => {
89
+ if (!funcionesConocidas[functionName]) {
90
+ funcionesConocidas[functionName] = true;
91
+ }
92
+ return `helpers.funs.${functionName}`;
93
+ }
94
+ });
95
+ function compilarExpresion(expresion) {
96
+ return compiler.toCode(ExpresionParser.parse(expresion
97
+ .replace(/\bis distinct from\b/gi, ' <> ')
98
+ .replace(/!!/gi, ' '))).replace(/helpers\.funs\.blanco\(helpers.null2zero\(/g, 'helpers.funs.blanco((')
99
+ .replace(/helpers\.funs\.informado\(helpers.null2zero\(/g, 'helpers.funs.informado((');
100
+ }
101
+ function conCondicionJs(input) {
102
+ if (Array.isArray(input)) {
103
+ return input.map((item) => (Object.assign(Object.assign({}, item), { condicion_js: compilarExpresion(item.condicion) })));
104
+ }
105
+ return Object.assign(Object.assign({}, input), { condicion_js: compilarExpresion(input.condicion) });
106
+ }
107
+ // ---- Fixtures de datos ----
108
+ const reasBase = conCondicionJs([
109
+ { operativo, rea: 1, descripcion: 'Completa', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: 'encu' },
110
+ { operativo, rea: 2, descripcion: 'Incompleta', condicion: "v_rea = 2", orden: 2, es_positiva: false, tarea: 'encu' },
111
+ ]);
112
+ const reasSinTarea = conCondicionJs([
113
+ { operativo, rea: 1, descripcion: 'Global', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: null },
114
+ ]);
115
+ const reasConMultiplesTareas = conCondicionJs([
116
+ { operativo, rea: 1, descripcion: 'Encu', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: 'encu' },
117
+ { operativo, rea: 2, descripcion: 'Recu', condicion: "v_rea = 1", orden: 2, es_positiva: true, tarea: 'recu' },
118
+ ]);
119
+ const reasSup = conCondicionJs([
120
+ { operativo, rea_sup: 10, descripcion: 'Sup Completa', condicion: "v_rea_sup = 1", orden: 1, es_positiva: false, tarea: null },
121
+ ]);
122
+ const noReas = [
123
+ { operativo, no_rea: 101, descripcion: 'Ausente', grupo: 'G1', variable: 'v_norea', valor: '1', grupo0: '0', orden: 1 },
124
+ ];
125
+ const noReasSup = [
126
+ { operativo, no_rea_sup: 201, desc_norea_sup: 'Ausente Sup', grupo_sup: 'GS1', variable_sup: 'v_norea_sup', valor_sup: '1', grupo0_sup: '0', orden: 1 },
127
+ ];
128
+ // =========================================================
129
+ (0, mocha_1.describe)('dmencu - buscarReaNoReaEnRespuestas', () => {
130
+ // ---- Casos Borde y Listas Vacías ----
131
+ (0, mocha_1.describe)('casos borde y estructuras vacías', () => {
132
+ (0, mocha_1.it)('devuelve { codigo: null, resultado: false } si la lista de REA/NO_REA está vacía', () => {
133
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, [], 'rea', 'encu', evaluarMock);
134
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
135
+ });
136
+ (0, mocha_1.it)('devuelve { codigo: null, resultado: false } si el objeto respuestas está vacío', () => {
137
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, {}, reasBase, 'rea', 'encu', evaluarMock);
138
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
139
+ });
140
+ (0, mocha_1.it)('ignora REAs con tarea específica cuando se busca otra tarea distinta', () => {
141
+ const reasSoloRecu = conCondicionJs([
142
+ { operativo, rea: 9, descripcion: 'Solo Recu', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: 'recu' },
143
+ ]);
144
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasSoloRecu, 'rea', 'encu', evaluarMock);
145
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
146
+ });
147
+ });
148
+ // ---- REA ----
149
+ (0, mocha_1.describe)('rea: evaluación de condición JS', () => {
150
+ (0, mocha_1.it)('encuentra una rea cuando la condición JS es verdadera', () => {
151
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasBase, 'rea', 'encu', evaluarMock);
152
+ assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
153
+ });
154
+ (0, mocha_1.it)('devuelve resultado=false cuando es_positiva=false', () => {
155
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '2' }, reasBase, 'rea', 'encu', evaluarMock);
156
+ assert.deepStrictEqual(resultado, { codigo: 2, resultado: false });
157
+ });
158
+ (0, mocha_1.it)('devuelve { codigo: null, resultado: false } si ninguna condición se cumple', () => {
159
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '99' }, reasBase, 'rea', 'encu', evaluarMock);
160
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
161
+ });
162
+ (0, mocha_1.it)('respeta el orden de prioridad aunque la lista llegue desordenada', () => {
163
+ const listaDesordenada = conCondicionJs([
164
+ { operativo, rea: 2, descripcion: 'Segundo', condicion: "v_rea = 2", orden: 2, es_positiva: false, tarea: null },
165
+ { operativo, rea: 1, descripcion: 'Primero', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: null },
166
+ ]);
167
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, listaDesordenada, 'rea', 'encu', evaluarMock);
168
+ assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
169
+ });
170
+ (0, mocha_1.it)('aplica una condición JS compleja con múltiples variables', () => {
171
+ const reasComplejas = conCondicionJs([
172
+ { operativo, rea: 5, descripcion: 'Doble condición', condicion: "v1 = 1 and v2 = 2", orden: 1, es_positiva: true, tarea: null },
173
+ ]);
174
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v1: '1', v2: '2' }, reasComplejas, 'rea', 'encu', evaluarMock);
175
+ assert.deepStrictEqual(resultado, { codigo: 5, resultado: true });
176
+ });
177
+ (0, mocha_1.it)('no confunde rea de una tarea con la de otra tarea', () => {
178
+ const resultadoEncu = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasConMultiplesTareas, 'rea', 'encu', evaluarMock);
179
+ assert.deepStrictEqual(resultadoEncu, { codigo: 1, resultado: true });
180
+ const resultadoRecu = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasConMultiplesTareas, 'rea', 'recu', evaluarMock);
181
+ assert.deepStrictEqual(resultadoRecu, { codigo: 2, resultado: true });
182
+ const resultadoSupe = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasConMultiplesTareas, 'rea', 'supe', evaluarMock);
183
+ assert.deepStrictEqual(resultadoSupe, { codigo: null, resultado: false });
184
+ });
185
+ (0, mocha_1.it)('una rea sin tarea aplica a cualquier tarea', () => {
186
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasSinTarea, 'rea', 'recu', evaluarMock);
187
+ assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
188
+ });
189
+ (0, mocha_1.it)('lanza error si condicion_js está definida pero no se pasa evaluarExpresion', () => {
190
+ assert.throws(() => (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasBase, 'rea', 'encu'), /Se requiere evaluarExpresion/);
191
+ });
192
+ });
193
+ // ---- REA_SUP ----
194
+ (0, mocha_1.describe)('rea_sup: evaluación de condición JS', () => {
195
+ (0, mocha_1.it)('encuentra una rea_sup cuando la condición JS es verdadera', () => {
196
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea_sup: '1' }, reasSup, 'rea_sup', 'encu', evaluarMock);
197
+ assert.deepStrictEqual(resultado, { codigo: 10, resultado: false });
198
+ });
199
+ (0, mocha_1.it)('devuelve { codigo: null, resultado: false } si no cumple', () => {
200
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea_sup: '9' }, reasSup, 'rea_sup', 'encu', evaluarMock);
201
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
202
+ });
203
+ });
204
+ // ---- NO_REA ----
205
+ (0, mocha_1.describe)('no_rea: comparación simple variable/valor', () => {
206
+ (0, mocha_1.it)('encuentra una no_rea cuando variable == valor', () => {
207
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_norea: '1' }, noReas, 'no_rea', 'encu');
208
+ assert.deepStrictEqual(resultado, { codigo: 101, resultado: true });
209
+ });
210
+ (0, mocha_1.it)('devuelve { codigo: null, resultado: false } si el valor no coincide', () => {
211
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_norea: '9' }, noReas, 'no_rea', 'encu');
212
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
213
+ });
214
+ });
215
+ // ---- NO_REA_SUP ----
216
+ (0, mocha_1.describe)('no_rea_sup: comparación simple variable_sup/valor_sup', () => {
217
+ (0, mocha_1.it)('encuentra una no_rea_sup cuando variable_sup == valor_sup', () => {
218
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_norea_sup: '1' }, noReasSup, 'no_rea_sup', 'encu');
219
+ assert.deepStrictEqual(resultado, { codigo: 201, resultado: true });
220
+ });
221
+ (0, mocha_1.it)('devuelve { codigo: null, resultado: false } si no coincide', () => {
222
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_norea_sup: '9' }, noReasSup, 'no_rea_sup', 'encu');
223
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
224
+ });
225
+ });
226
+ // ---- Búsqueda recursiva y Multinivel ----
227
+ (0, mocha_1.describe)('búsqueda recursiva en unidades hijas', () => {
228
+ (0, mocha_1.it)('encuentra una no_rea dentro de un array de unidad hija (hogares)', () => {
229
+ const respuestas = {
230
+ vivienda_id: 1,
231
+ hogares: [
232
+ { id: 1, v_norea: '9' },
233
+ { id: 2, v_norea: '1' },
234
+ ]
235
+ };
236
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, noReas, 'no_rea', 'encu');
237
+ assert.deepStrictEqual(resultado, { codigo: 101, resultado: true });
238
+ });
239
+ (0, mocha_1.it)('devuelve nulo si ninguna unidad hija cumple la condición', () => {
240
+ const respuestas = {
241
+ vivienda_id: 1,
242
+ hogares: [{ id: 1, v_norea: '9' }]
243
+ };
244
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, noReas, 'no_rea', 'encu');
245
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
246
+ });
247
+ (0, mocha_1.it)('maneja de forma segura hogares null, vacíos o undefined', () => {
248
+ const resultadoNull = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { vivienda_id: 1, hogares: null }, noReas, 'no_rea', 'encu');
249
+ assert.deepStrictEqual(resultadoNull, { codigo: null, resultado: false });
250
+ const resultadoVacio = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { vivienda_id: 1, hogares: [] }, noReas, 'no_rea', 'encu');
251
+ assert.deepStrictEqual(resultadoVacio, { codigo: null, resultado: false });
252
+ });
253
+ (0, mocha_1.it)('encuentra una rea en unidad hija cuando todos cumplen condición JS (es_positiva = true)', () => {
254
+ const respuestas = {
255
+ vivienda_id: 1,
256
+ hogares: [
257
+ { id: 1, v_rea: '1' },
258
+ { id: 2, v_rea: '1' },
259
+ ]
260
+ };
261
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasBase, 'rea', 'encu', evaluarMock);
262
+ assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
263
+ });
264
+ (0, mocha_1.it)('evalúa una rea con condición que combina una variable de la UA principal (vivienda) y una de la UA hija (hogar)', () => {
265
+ const reasMultilevel = conCondicionJs([
266
+ {
267
+ operativo,
268
+ rea: 10,
269
+ descripcion: 'Vivienda habitada con hogar completo',
270
+ condicion: "vivienda_habitada = 1 and hogar_completo = 1",
271
+ orden: 1,
272
+ es_positiva: true,
273
+ tarea: 'encu'
274
+ },
275
+ ]);
276
+ const respuestas = {
277
+ vivienda_id: 1,
278
+ vivienda_habitada: '1',
279
+ hogares: [
280
+ { id: 1, hogar_completo: '0' },
281
+ { id: 2, hogar_completo: '1' },
282
+ ]
283
+ };
284
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasMultilevel, 'rea', 'encu', evaluarMock);
285
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
286
+ });
287
+ (0, mocha_1.it)('evalúa una rea_sup con condición que combina una variable de la UA principal y una de la UA hija', () => {
288
+ const reasSupMultilevel = conCondicionJs([
289
+ {
290
+ operativo,
291
+ rea_sup: 20,
292
+ descripcion: 'Supervisión aprobada multinivel',
293
+ condicion: "vivienda_status = 1 and hogar_supervisado = 1",
294
+ orden: 1,
295
+ es_positiva: true,
296
+ tarea: 'encu'
297
+ },
298
+ ]);
299
+ const respuestas = {
300
+ vivienda_id: 1,
301
+ vivienda_status: '1',
302
+ hogares: [
303
+ { id: 1, hogar_supervisado: '1' },
304
+ ]
305
+ };
306
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasSupMultilevel, 'rea_sup', 'encu', evaluarMock);
307
+ assert.deepStrictEqual(resultado, { codigo: 20, resultado: true });
308
+ });
309
+ (0, mocha_1.it)('encuentra una no_rea anidada a 3 niveles (Vivienda -> Hogar -> Persona)', () => {
310
+ const respuestas = {
311
+ vivienda_id: 1,
312
+ hogares: [
313
+ {
314
+ hogar_id: 1,
315
+ personas: [
316
+ { persona_id: 1, v_norea: '9' },
317
+ { persona_id: 2, v_norea: '1' }
318
+ ]
319
+ }
320
+ ]
321
+ };
322
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaTresNivelesMock, respuestas, noReas, 'no_rea', 'encu');
323
+ assert.deepStrictEqual(resultado, { codigo: 101, resultado: true });
324
+ });
325
+ (0, mocha_1.describe)('evaluación de es_positiva en múltiples unidades hijas', () => {
326
+ (0, mocha_1.it)('si es_positiva = true y NO todos los hogares cumplen la condición, NO debe matchear la rea positiva', () => {
327
+ const reasPositiva = conCondicionJs([
328
+ {
329
+ operativo,
330
+ rea: 1,
331
+ descripcion: 'Todos los hogares completos',
332
+ condicion: "hogar_completo = 1",
333
+ orden: 1,
334
+ es_positiva: true,
335
+ tarea: 'encu'
336
+ },
337
+ ]);
338
+ const respuestas = {
339
+ vivienda_id: 1,
340
+ hogares: [
341
+ { id: 1, hogar_completo: '1' },
342
+ { id: 2, hogar_completo: '0' },
343
+ ]
344
+ };
345
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
346
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
347
+ });
348
+ (0, mocha_1.it)('si es_positiva = true y una unidad hija anterior no tiene un campo cargado aún (undefined), NO debe matchear la rea positiva', () => {
349
+ const reasPositiva = conCondicionJs([
350
+ {
351
+ operativo,
352
+ rea: 1,
353
+ descripcion: 'Todos los hogares completos',
354
+ condicion: "hogar_completo = 1",
355
+ orden: 1,
356
+ es_positiva: true,
357
+ tarea: 'encu'
358
+ },
359
+ ]);
360
+ const respuestas = {
361
+ vivienda_id: 1,
362
+ hogares: [
363
+ { id: 1 }, // Primer hogar sin 'hogar_completo' cargado aún
364
+ { id: 2, hogar_completo: '1' }, // Último hogar cumple la condición
365
+ ]
366
+ };
367
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
368
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
369
+ });
370
+ (0, mocha_1.it)('si es_positiva = true y TODOS los hogares cumplen la condición, debe matchear la rea positiva', () => {
371
+ const reasPositiva = conCondicionJs([
372
+ {
373
+ operativo,
374
+ rea: 1,
375
+ descripcion: 'Todos los hogares completos',
376
+ condicion: "hogar_completo = 1",
377
+ orden: 1,
378
+ es_positiva: true,
379
+ tarea: 'encu'
380
+ },
381
+ ]);
382
+ const respuestas = {
383
+ vivienda_id: 1,
384
+ hogares: [
385
+ { id: 1, hogar_completo: '1' },
386
+ { id: 2, hogar_completo: '1' },
387
+ ]
388
+ };
389
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
390
+ assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
391
+ });
392
+ (0, mocha_1.it)('si es_positiva = false y al menos un hogar cumple la condición, debe matchear la rea negativa', () => {
393
+ const reasNegativa = conCondicionJs([
394
+ {
395
+ operativo,
396
+ rea: 2,
397
+ descripcion: 'Al menos un hogar rechazado',
398
+ condicion: "hogar_rechazado = 1",
399
+ orden: 1,
400
+ es_positiva: false,
401
+ tarea: 'encu'
402
+ },
403
+ ]);
404
+ const respuestas = {
405
+ vivienda_id: 1,
406
+ hogares: [
407
+ { id: 1, hogar_rechazado: '0' },
408
+ { id: 2, hogar_rechazado: '1' },
409
+ ]
410
+ };
411
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasNegativa, 'rea', 'encu', evaluarMock);
412
+ assert.deepStrictEqual(resultado, { codigo: 2, resultado: false });
413
+ });
414
+ (0, mocha_1.it)('evalúa 2 REAs (positiva y negativa): si la positiva no se cumple para todos los hogares pero la negativa sí, devuelve la REA negativa', () => {
415
+ const reasMixtas = conCondicionJs([
416
+ {
417
+ operativo,
418
+ rea: 1,
419
+ descripcion: 'Todos los hogares completos',
420
+ condicion: "hogar_completo = 1",
421
+ orden: 1,
422
+ es_positiva: true,
423
+ tarea: 'encu'
424
+ },
425
+ {
426
+ operativo,
427
+ rea: 2,
428
+ descripcion: 'Al menos un hogar completo',
429
+ condicion: "hogar_completo = 1",
430
+ orden: 2,
431
+ es_positiva: false,
432
+ tarea: 'encu'
433
+ }
434
+ ]);
435
+ const respuestas = {
436
+ vivienda_id: 1,
437
+ hogares: [
438
+ { id: 1, hogar_completo: '1' },
439
+ { id: 2, hogar_completo: '0' },
440
+ ]
441
+ };
442
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasMixtas, 'rea', 'encu', evaluarMock);
443
+ assert.deepStrictEqual(resultado, { codigo: 2, resultado: false });
444
+ });
445
+ (0, mocha_1.it)('si es_positiva = true y una persona de OTRO hogar (prima) no cumple la condición, NO debe matchear la rea positiva', () => {
446
+ const reasPositiva = conCondicionJs([
447
+ {
448
+ operativo,
449
+ rea: 1,
450
+ descripcion: 'Todas las personas con p2 = 1',
451
+ condicion: "p2 = 1",
452
+ orden: 1,
453
+ es_positiva: true,
454
+ tarea: 'encu'
455
+ },
456
+ ]);
457
+ const respuestasConPrimaFallida = {
458
+ vivienda_id: 1,
459
+ hogares: [
460
+ {
461
+ hogar_id: 1,
462
+ personas: [
463
+ { persona_id: 1, p2: '1' },
464
+ { persona_id: 2, p2: '1' }
465
+ ]
466
+ },
467
+ {
468
+ hogar_id: 2,
469
+ personas: [
470
+ { persona_id: 3, p2: '0' } // La "prima" en el Hogar 2 no cumple
471
+ ]
472
+ }
473
+ ]
474
+ };
475
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaTresNivelesMock, respuestasConPrimaFallida, reasPositiva, 'rea', 'encu', evaluarMock);
476
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
477
+ });
478
+ (0, mocha_1.it)('si es_positiva = true y hay un segundo hogar sin personas cargadas aún, NO debe matchear la REA positiva', () => {
479
+ const reasPositiva = conCondicionJs([
480
+ {
481
+ operativo,
482
+ rea: 1,
483
+ descripcion: 'Todas las personas completas en vivienda y hogar válidos',
484
+ condicion: "vivienda_habitada = 1 and hogar_valido = 1 and persona_completa = 1",
485
+ orden: 1,
486
+ es_positiva: true,
487
+ tarea: 'encu'
488
+ },
489
+ ]);
490
+ const respuestas = {
491
+ vivienda_id: 1,
492
+ vivienda_habitada: '1',
493
+ hogares: [
494
+ {
495
+ hogar_id: 1,
496
+ hogar_valido: '1',
497
+ personas: [
498
+ { persona_id: 1, persona_completa: '1' }
499
+ ]
500
+ },
501
+ {
502
+ hogar_id: 2,
503
+ hogar_valido: '1',
504
+ personas: [] // Sin personas cargadas aún (incompleto)
505
+ }
506
+ ]
507
+ };
508
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaTresNivelesMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
509
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
510
+ });
511
+ (0, mocha_1.it)('si es_positiva = true y hay un segundo hogar sin personas cargadas aún (sin inicializar array), NO debe matchear la REA positiva', () => {
512
+ const reasPositiva = conCondicionJs([
513
+ {
514
+ operativo,
515
+ rea: 1,
516
+ descripcion: 'Todas las personas completas en vivienda y hogar válidos',
517
+ condicion: "vivienda_habitada = 1 and hogar_valido = 1 and persona_completa = 1",
518
+ orden: 1,
519
+ es_positiva: true,
520
+ tarea: 'encu'
521
+ },
522
+ ]);
523
+ const respuestas = {
524
+ vivienda_id: 1,
525
+ vivienda_habitada: '1',
526
+ hogares: [
527
+ {
528
+ hogar_id: 1,
529
+ hogar_valido: '1',
530
+ personas: [
531
+ { persona_id: 1, persona_completa: '1' }
532
+ ]
533
+ },
534
+ {
535
+ hogar_id: 2,
536
+ hogar_valido: '1',
537
+ }
538
+ ]
539
+ };
540
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaTresNivelesMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
541
+ assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
542
+ });
543
+ (0, mocha_1.it)('evalúa correctamente una REA positiva multinivel (vivienda + hogar + persona) existiendo ramas independientes de visitas', () => {
544
+ const reasPositiva = conCondicionJs([
545
+ {
546
+ operativo,
547
+ rea: 1,
548
+ descripcion: 'Todas las personas completas en hogares completos de viviendas habitadas',
549
+ condicion: "vivienda_habitada = 1 and hogar_completo = 1 and persona_completa = 1",
550
+ orden: 1,
551
+ es_positiva: true,
552
+ tarea: 'encu'
553
+ },
554
+ ]);
555
+ const respuestas = {
556
+ vivienda_id: 1,
557
+ vivienda_habitada: '1', // Nivel Vivienda
558
+ visitas: [
559
+ { id: 1, fecha: '2026-10-01', resultado_visita: '1' },
560
+ { id: 2, fecha: '2026-10-05', resultado_visita: '1' }
561
+ ],
562
+ hogares: [
563
+ {
564
+ hogar_id: 1,
565
+ hogar_completo: '1', // Nivel Hogar 1
566
+ personas: [
567
+ { persona_id: 1, persona_completa: '1' }, // Nivel Persona
568
+ { persona_id: 2, persona_completa: '1' }
569
+ ]
570
+ },
571
+ {
572
+ hogar_id: 2,
573
+ hogar_completo: '1', // Nivel Hogar 2
574
+ personas: [
575
+ { persona_id: 3, persona_completa: '1' } // Nivel Persona (Prima)
576
+ ]
577
+ }
578
+ ]
579
+ };
580
+ const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaViviendaConVisitasMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
581
+ assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
582
+ const resultado2 = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaViviendaConVisitasMock, respuestas, reasPositiva, 'rea', 'recu', evaluarMock);
583
+ assert.deepStrictEqual(resultado2, { codigo: null, resultado: false });
584
+ });
585
+ });
586
+ });
587
+ });
588
+ });
589
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1yZWEtbm8tcmVhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdGVzdC1yZWEtbm8tcmVhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBQUEsaUNBQXFDO0lBQ3JDLGdEQUFnRDtJQUVoRCxzQ0FBdUM7SUFFdkMscUVBQStGO0lBQy9GLHVFQUFtRTtJQUduRSx3RUFBd0U7SUFDeEUsTUFBTSxXQUFXLEdBQXVCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQzdELElBQUksV0FBVyxHQUFHLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQztZQUNELElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsc0NBQWlCLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNYLE1BQU0sR0FBRyxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUMsQ0FBQTtJQUVELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUUzQixNQUFNLGVBQWUsR0FBbUI7UUFDcEMsZUFBZSxFQUFFLFdBQVc7UUFDNUIsS0FBSyxFQUFFLFNBQVM7UUFDaEIsV0FBVyxFQUFFLFVBQVU7UUFDdkIsS0FBSyxFQUFFO1lBQ0gsT0FBTyxFQUFFLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtTQUMvRjtLQUNKLENBQUM7SUFFRixNQUFNLGlCQUFpQixHQUFtQjtRQUN0QyxlQUFlLEVBQUUsV0FBVztRQUM1QixLQUFLLEVBQUUsU0FBUztRQUNoQixXQUFXLEVBQUUsVUFBVTtRQUN2QixLQUFLLEVBQUU7WUFDSCxPQUFPLEVBQUU7Z0JBQ0wsZUFBZSxF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QVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQ2pGLENBQUM7b0JBQ0YsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDLENBQUMsQ0FBQztZQUVQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ21vY2hhJztcbmltcG9ydCAqIGFzIEV4cHJlc2lvblBhcnNlciBmcm9tICdleHByZS1wYXJzZXInO1xuXG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKTtcblxuaW1wb3J0IHsgYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMsIEV2YWx1YWRvckV4cHJlc2lvbiB9IGZyb20gJy4uL3VubG9nZ2VkL2NhbGN1bG9zLWVuY3Vlc3RhJztcbmltcG9ydCB7IGhlbHBlcnNDYXNpbGxlcm9zIH0gZnJvbSAnLi4vdW5sb2dnZWQvaGVscGVycy1jYXNpbGxlcm9zJztcbmltcG9ydCB0eXBlIHsgTm9SZWEsIE5vUmVhU3VwLCBSZWEsIFJlYVN1cCwgVW5pZGFkQW5hbGlzaXMgfSBmcm9tICcuLi91bmxvZ2dlZC90aXBvcyc7XG5cbi8vIEV2YWx1YWRvciBzaW1wbGUgcGFyYSB0ZXN0czogY29tcGlsYSBsYSBleHByZXNpw7NuIEpTIGNvbiBuZXcgRnVuY3Rpb25cbmNvbnN0IGV2YWx1YXJNb2NrOiBFdmFsdWFkb3JFeHByZXNpb24gPSAoY29uZGljaW9uSnMsIHZhbG9yZXMpID0+IHtcbiAgICB2YXIgaW50ZXJuYWxGdW4gPSBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJyArIGNvbmRpY2lvbkpzKTtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaW50ZXJuYWxGdW4odmFsb3JlcywgaGVscGVyc0Nhc2lsbGVyb3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IG9wZXJhdGl2byA9ICdkbWVuY3UnO1xuXG5jb25zdCB1YVByaW5jaXBhbE1vY2s6IFVuaWRhZEFuYWxpc2lzID0ge1xuICAgIHVuaWRhZF9hbmFsaXNpczogJ3ZpdmllbmRhcycsXG4gICAgcGFkcmU6IHVuZGVmaW5lZCxcbiAgICBwa19hZ3JlZ2FkYTogJ3ZpdmllbmRhJyxcbiAgICBoaWphczoge1xuICAgICAgICBob2dhcmVzOiB7IHVuaWRhZF9hbmFsaXNpczogJ2hvZ2FyZXMnLCBwYWRyZTogJ3ZpdmllbmRhcycsIHBrX2FncmVnYWRhOiAnaG9nYXInLCBoaWphczoge30gfVxuICAgIH1cbn07XG5cbmNvbnN0IHVhVHJlc05pdmVsZXNNb2NrOiBVbmlkYWRBbmFsaXNpcyA9IHtcbiAgICB1bmlkYWRfYW5hbGlzaXM6ICd2aXZpZW5kYXMnLFxuICAgIHBhZHJlOiB1bmRlZmluZWQsXG4gICAgcGtfYWdyZWdhZGE6ICd2aXZpZW5kYScsXG4gICAgaGlqYXM6IHtcbiAgICAgICAgaG9nYXJlczoge1xuICAgICAgICAgICAgdW5pZGFkX2FuYWxpc2lzOiAnaG9nYXJlcycsXG4gICAgICAgICAgICBwYWRyZTogJ3ZpdmllbmRhcycsXG4gICAgICAgICAgICBwa19hZ3JlZ2FkYTogJ2hvZ2FyJyxcbiAgICAgICAgICAgIGhpamFzOiB7XG4gICAgICAgICAgICAgICAgcGVyc29uYXM6IHtcbiAgICAgICAgICAgICAgICAgICAgdW5pZGFkX2FuYWxpc2lzOiAncGVyc29uYXMnLFxuICAgICAgICAgICAgICAgICAgICBwYWRyZTogJ2hvZ2FyZXMnLFxuICAgICAgICAgICAgICAgICAgICBwa19hZ3JlZ2FkYTogJ3BlcnNvbmEnLFxuICAgICAgICAgICAgICAgICAgICBoaWphczoge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCB1YVZpdmllbmRhQ29uVmlzaXRhc01vY2s6IFVuaWRhZEFuYWxpc2lzID0ge1xuICAgIHVuaWRhZF9hbmFsaXNpczogJ3ZpdmllbmRhcycsXG4gICAgcGFkcmU6IHVuZGVmaW5lZCxcbiAgICBwa19hZ3JlZ2FkYTogJ3ZpdmllbmRhJyxcbiAgICBoaWphczoge1xuICAgICAgICBob2dhcmVzOiB7XG4gICAgICAgICAgICB1bmlkYWRfYW5hbGlzaXM6ICdob2dhcmVzJyxcbiAgICAgICAgICAgIHBhZHJlOiAndml2aWVuZGFzJyxcbiAgICAgICAgICAgIHBrX2FncmVnYWRhOiAnaG9nYXInLFxuICAgICAgICAgICAgaGlqYXM6IHtcbiAgICAgICAgICAgICAgICBwZXJzb25hczoge1xuICAgICAgICAgICAgICAgICAgICB1bmlkYWRfYW5hbGlzaXM6ICdwZXJzb25hcycsXG4gICAgICAgICAgICAgICAgICAgIHBhZHJlOiAnaG9nYXJlcycsXG4gICAgICAgICAgICAgICAgICAgIHBrX2FncmVnYWRhOiAncGVyc29uYScsXG4gICAgICAgICAgICAgICAgICAgIGhpamFzOiB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy9AdHMtaWdub3JlIHZpc2l0YXMgZXMgdW5hIHVhXG4gICAgICAgIHZpc2l0YXM6IHtcbiAgICAgICAgICAgIHVuaWRhZF9hbmFsaXNpczogJ3Zpc2l0YXMnLFxuICAgICAgICAgICAgcGFkcmU6ICd2aXZpZW5kYXMnLFxuICAgICAgICAgICAgcGtfYWdyZWdhZGE6ICd2aXNpdGEnLFxuICAgICAgICAgICAgaGlqYXM6IHt9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgZnVuY2lvbmVzQ29ub2NpZGFzOiB7IFtrIGluIHN0cmluZ106IGJvb2xlYW4gfSA9IHt9XG5cbnZhciBjb21waWxlciA9IG5ldyBFeHByZXNpb25QYXJzZXIuQ29tcGlsZXIoe1xuICAgIGxhbmd1YWdlOiAnanMnLFxuICAgIHZhcldyYXBwZXI6ICh2YXJfbmFtZTogc3RyaW5nKSA9PiBgaGVscGVycy5udWxsMnplcm8odmFsb3Jlcy4ke3Zhcl9uYW1lfSlgLFxuICAgIGZ1bldyYXBwZXI6IChmdW5jdGlvbk5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIWZ1bmNpb25lc0Nvbm9jaWRhc1tmdW5jdGlvbk5hbWVdKSB7XG4gICAgICAgICAgICBmdW5jaW9uZXNDb25vY2lkYXNbZnVuY3Rpb25OYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBoZWxwZXJzLmZ1bnMuJHtmdW5jdGlvbk5hbWV9YFxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbXBpbGFyRXhwcmVzaW9uKGV4cHJlc2lvbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNvbXBpbGVyLnRvQ29kZShFeHByZXNpb25QYXJzZXIucGFyc2UoXG4gICAgICAgIGV4cHJlc2lvblxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcYmlzIGRpc3RpbmN0IGZyb21cXGIvZ2ksICcgPD4gJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8hIS9naSwgJyAnKVxuICAgICkpLnJlcGxhY2UoL2hlbHBlcnNcXC5mdW5zXFwuYmxhbmNvXFwoaGVscGVycy5udWxsMnplcm9cXCgvZywgJ2hlbHBlcnMuZnVucy5ibGFuY28oKCcpXG4gICAgICAgIC5yZXBsYWNlKC9oZWxwZXJzXFwuZnVuc1xcLmluZm9ybWFkb1xcKGhlbHBlcnMubnVsbDJ6ZXJvXFwoL2csICdoZWxwZXJzLmZ1bnMuaW5mb3JtYWRvKCgnKTtcbn1cblxuLy8gSGVscGVyIHBhcmEgY29tcGlsYXIgZSBpbnllY3RhciBjb25kaWNpb25fanMgYSB1biBvYmpldG8gbyBhcnJheVxuZnVuY3Rpb24gY29uQ29uZGljaW9uSnM8VCBleHRlbmRzIHsgY29uZGljaW9uOiBzdHJpbmcgfT4oaXRlbTogVCk6IFQgJiB7IGNvbmRpY2lvbl9qczogc3RyaW5nIH07XG5mdW5jdGlvbiBjb25Db25kaWNpb25KczxUIGV4dGVuZHMgeyBjb25kaWNpb246IHN0cmluZyB9PihpdGVtczogVFtdKTogKFQgJiB7IGNvbmRpY2lvbl9qczogc3RyaW5nIH0pW107XG5mdW5jdGlvbiBjb25Db25kaWNpb25KcyhpbnB1dDogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgY29uZGljaW9uX2pzOiBjb21waWxhckV4cHJlc2lvbihpdGVtLmNvbmRpY2lvbilcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgY29uZGljaW9uX2pzOiBjb21waWxhckV4cHJlc2lvbihpbnB1dC5jb25kaWNpb24pXG4gICAgfTtcbn1cblxuLy8gLS0tLSBGaXh0dXJlcyBkZSBkYXRvcyAtLS0tXG5cbmNvbnN0IHJlYXNCYXNlID0gY29uQ29uZGljaW9uSnMoW1xuICAgIHsgb3BlcmF0aXZvLCByZWE6IDEsIGRlc2NyaXBjaW9uOiAnQ29tcGxldGEnLCBjb25kaWNpb246IFwidl9yZWEgPSAxXCIsIG9yZGVuOiAxLCBlc19wb3NpdGl2YTogdHJ1ZSwgdGFyZWE6ICdlbmN1JyB9LFxuICAgIHsgb3BlcmF0aXZvLCByZWE6IDIsIGRlc2NyaXBjaW9uOiAnSW5jb21wbGV0YScsIGNvbmRpY2lvbjogXCJ2X3JlYSA9IDJcIiwgb3JkZW46IDIsIGVzX3Bvc2l0aXZhOiBmYWxzZSwgdGFyZWE6ICdlbmN1JyB9LFxuXSk7XG5cbmNvbnN0IHJlYXNTaW5UYXJlYSA9IGNvbkNvbmRpY2lvbkpzKFtcbiAgICB7IG9wZXJhdGl2bywgcmVhOiAxLCBkZXNjcmlwY2lvbjogJ0dsb2JhbCcsIGNvbmRpY2lvbjogXCJ2X3JlYSA9IDFcIiwgb3JkZW46IDEsIGVzX3Bvc2l0aXZhOiB0cnVlLCB0YXJlYTogbnVsbCB9LFxuXSk7XG5cbmNvbnN0IHJlYXNDb25NdWx0aXBsZXNUYXJlYXMgPSBjb25Db25kaWNpb25KcyhbXG4gICAgeyBvcGVyYXRpdm8sIHJlYTogMSwgZGVzY3JpcGNpb246ICdFbmN1JywgY29uZGljaW9uOiBcInZfcmVhID0gMVwiLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiAnZW5jdScgfSxcbiAgICB7IG9wZXJhdGl2bywgcmVhOiAyLCBkZXNjcmlwY2lvbjogJ1JlY3UnLCBjb25kaWNpb246IFwidl9yZWEgPSAxXCIsIG9yZGVuOiAyLCBlc19wb3NpdGl2YTogdHJ1ZSwgdGFyZWE6ICdyZWN1JyB9LFxuXSk7XG5cbmNvbnN0IHJlYXNTdXAgPSBjb25Db25kaWNpb25KcyhbXG4gICAgeyBvcGVyYXRpdm8sIHJlYV9zdXA6IDEwLCBkZXNjcmlwY2lvbjogJ1N1cCBDb21wbGV0YScsIGNvbmRpY2lvbjogXCJ2X3JlYV9zdXAgPSAxXCIsIG9yZGVuOiAxLCBlc19wb3NpdGl2YTogZmFsc2UsIHRhcmVhOiBudWxsIH0sXG5dKTtcblxuY29uc3Qgbm9SZWFzOiBOb1JlYVtdID0gW1xuICAgIHsgb3BlcmF0aXZvLCBub19yZWE6IDEwMSwgZGVzY3JpcGNpb246ICdBdXNlbnRlJywgZ3J1cG86ICdHMScsIHZhcmlhYmxlOiAndl9ub3JlYScsIHZhbG9yOiAnMScsIGdydXBvMDogJzAnLCBvcmRlbjogMSB9LFxuXTtcblxuY29uc3Qgbm9SZWFzU3VwOiBOb1JlYVN1cFtdID0gW1xuICAgIHsgb3BlcmF0aXZvLCBub19yZWFfc3VwOiAyMDEsIGRlc2Nfbm9yZWFfc3VwOiAnQXVzZW50ZSBTdXAnLCBncnVwb19zdXA6ICdHUzEnLCB2YXJpYWJsZV9zdXA6ICd2X25vcmVhX3N1cCcsIHZhbG9yX3N1cDogJzEnLCBncnVwbzBfc3VwOiAnMCcsIG9yZGVuOiAxIH0sXG5dO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmRlc2NyaWJlKCdkbWVuY3UgLSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcycsICgpID0+IHtcblxuICAgIC8vIC0tLS0gQ2Fzb3MgQm9yZGUgeSBMaXN0YXMgVmFjw61hcyAtLS0tXG4gICAgZGVzY3JpYmUoJ2Nhc29zIGJvcmRlIHkgZXN0cnVjdHVyYXMgdmFjw61hcycsICgpID0+IHtcbiAgICAgICAgaXQoJ2RldnVlbHZlIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0gc2kgbGEgbGlzdGEgZGUgUkVBL05PX1JFQSBlc3TDoSB2YWPDrWEnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgW10sICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGV2dWVsdmUgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSBzaSBlbCBvYmpldG8gcmVzcHVlc3RhcyBlc3TDoSB2YWPDrW8nLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHt9IGFzIGFueSwgcmVhc0Jhc2UsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnaWdub3JhIFJFQXMgY29uIHRhcmVhIGVzcGVjw61maWNhIGN1YW5kbyBzZSBidXNjYSBvdHJhIHRhcmVhIGRpc3RpbnRhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhc1NvbG9SZWN1ID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgIHsgb3BlcmF0aXZvLCByZWE6IDksIGRlc2NyaXBjaW9uOiAnU29sbyBSZWN1JywgY29uZGljaW9uOiBcInZfcmVhID0gMVwiLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiAncmVjdScgfSxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgcmVhc1NvbG9SZWN1LCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAtLS0tIFJFQSAtLS0tXG4gICAgZGVzY3JpYmUoJ3JlYTogZXZhbHVhY2nDs24gZGUgY29uZGljacOzbiBKUycsICgpID0+IHtcblxuICAgICAgICBpdCgnZW5jdWVudHJhIHVuYSByZWEgY3VhbmRvIGxhIGNvbmRpY2nDs24gSlMgZXMgdmVyZGFkZXJhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZfcmVhOiAnMScgfSBhcyBhbnksIHJlYXNCYXNlLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMSwgcmVzdWx0YWRvOiB0cnVlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGV2dWVsdmUgcmVzdWx0YWRvPWZhbHNlIGN1YW5kbyBlc19wb3NpdGl2YT1mYWxzZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2X3JlYTogJzInIH0gYXMgYW55LCByZWFzQmFzZSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDIsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkZXZ1ZWx2ZSB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9IHNpIG5pbmd1bmEgY29uZGljacOzbiBzZSBjdW1wbGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICc5OScgfSBhcyBhbnksIHJlYXNCYXNlLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Jlc3BldGEgZWwgb3JkZW4gZGUgcHJpb3JpZGFkIGF1bnF1ZSBsYSBsaXN0YSBsbGVndWUgZGVzb3JkZW5hZGEnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaXN0YURlc29yZGVuYWRhID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgIHsgb3BlcmF0aXZvLCByZWE6IDIsIGRlc2NyaXBjaW9uOiAnU2VndW5kbycsIGNvbmRpY2lvbjogXCJ2X3JlYSA9IDJcIiwgb3JkZW46IDIsIGVzX3Bvc2l0aXZhOiBmYWxzZSwgdGFyZWE6IG51bGwgfSxcbiAgICAgICAgICAgICAgICB7IG9wZXJhdGl2bywgcmVhOiAxLCBkZXNjcmlwY2lvbjogJ1ByaW1lcm8nLCBjb25kaWNpb246IFwidl9yZWEgPSAxXCIsIG9yZGVuOiAxLCBlc19wb3NpdGl2YTogdHJ1ZSwgdGFyZWE6IG51bGwgfSxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgbGlzdGFEZXNvcmRlbmFkYSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FwbGljYSB1bmEgY29uZGljacOzbiBKUyBjb21wbGVqYSBjb24gbcO6bHRpcGxlcyB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWFzQ29tcGxlamFzID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgIHsgb3BlcmF0aXZvLCByZWE6IDUsIGRlc2NyaXBjaW9uOiAnRG9ibGUgY29uZGljacOzbicsIGNvbmRpY2lvbjogXCJ2MSA9IDEgYW5kIHYyID0gMlwiLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH0sXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHYxOiAnMScsIHYyOiAnMicgfSBhcyBhbnksIHJlYXNDb21wbGVqYXMsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiA1LCByZXN1bHRhZG86IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdubyBjb25mdW5kZSByZWEgZGUgdW5hIHRhcmVhIGNvbiBsYSBkZSBvdHJhIHRhcmVhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvRW5jdSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2X3JlYTogJzEnIH0gYXMgYW55LCByZWFzQ29uTXVsdGlwbGVzVGFyZWFzLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvRW5jdSwgeyBjb2RpZ286IDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvUmVjdSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2X3JlYTogJzEnIH0gYXMgYW55LCByZWFzQ29uTXVsdGlwbGVzVGFyZWFzLCAncmVhJywgJ3JlY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvUmVjdSwgeyBjb2RpZ286IDIsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvU3VwZSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2X3JlYTogJzEnIH0gYXMgYW55LCByZWFzQ29uTXVsdGlwbGVzVGFyZWFzLCAncmVhJywgJ3N1cGUnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvU3VwZSwgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd1bmEgcmVhIHNpbiB0YXJlYSBhcGxpY2EgYSBjdWFscXVpZXIgdGFyZWEnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgcmVhc1NpblRhcmVhLCAncmVhJywgJ3JlY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMSwgcmVzdWx0YWRvOiB0cnVlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbGFuemEgZXJyb3Igc2kgY29uZGljaW9uX2pzIGVzdMOhIGRlZmluaWRhIHBlcm8gbm8gc2UgcGFzYSBldmFsdWFyRXhwcmVzaW9uJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAgICAgICAoKSA9PiBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3Rhcyh1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgcmVhc0Jhc2UsICdyZWEnLCAnZW5jdScpLFxuICAgICAgICAgICAgICAgIC9TZSByZXF1aWVyZSBldmFsdWFyRXhwcmVzaW9uL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAtLS0tIFJFQV9TVVAgLS0tLVxuICAgIGRlc2NyaWJlKCdyZWFfc3VwOiBldmFsdWFjacOzbiBkZSBjb25kaWNpw7NuIEpTJywgKCkgPT4ge1xuXG4gICAgICAgIGl0KCdlbmN1ZW50cmEgdW5hIHJlYV9zdXAgY3VhbmRvIGxhIGNvbmRpY2nDs24gSlMgZXMgdmVyZGFkZXJhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZfcmVhX3N1cDogJzEnIH0gYXMgYW55LCByZWFzU3VwLCAncmVhX3N1cCcsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDEwLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGV2dWVsdmUgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSBzaSBubyBjdW1wbGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWFfc3VwOiAnOScgfSBhcyBhbnksIHJlYXNTdXAsICdyZWFfc3VwJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAtLS0tIE5PX1JFQSAtLS0tXG4gICAgZGVzY3JpYmUoJ25vX3JlYTogY29tcGFyYWNpw7NuIHNpbXBsZSB2YXJpYWJsZS92YWxvcicsICgpID0+IHtcblxuICAgICAgICBpdCgnZW5jdWVudHJhIHVuYSBub19yZWEgY3VhbmRvIHZhcmlhYmxlID09IHZhbG9yJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZfbm9yZWE6ICcxJyB9IGFzIGFueSwgbm9SZWFzLCAnbm9fcmVhJywgJ2VuY3UnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAxMDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2RldnVlbHZlIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0gc2kgZWwgdmFsb3Igbm8gY29pbmNpZGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9ub3JlYTogJzknIH0gYXMgYW55LCBub1JlYXMsICdub19yZWEnLCAnZW5jdSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gLS0tLSBOT19SRUFfU1VQIC0tLS1cbiAgICBkZXNjcmliZSgnbm9fcmVhX3N1cDogY29tcGFyYWNpw7NuIHNpbXBsZSB2YXJpYWJsZV9zdXAvdmFsb3Jfc3VwJywgKCkgPT4ge1xuXG4gICAgICAgIGl0KCdlbmN1ZW50cmEgdW5hIG5vX3JlYV9zdXAgY3VhbmRvIHZhcmlhYmxlX3N1cCA9PSB2YWxvcl9zdXAnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9ub3JlYV9zdXA6ICcxJyB9IGFzIGFueSwgbm9SZWFzU3VwLCAnbm9fcmVhX3N1cCcsICdlbmN1J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMjAxLCByZXN1bHRhZG86IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkZXZ1ZWx2ZSB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9IHNpIG5vIGNvaW5jaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZfbm9yZWFfc3VwOiAnOScgfSBhcyBhbnksIG5vUmVhc1N1cCwgJ25vX3JlYV9zdXAnLCAnZW5jdSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gLS0tLSBCw7pzcXVlZGEgcmVjdXJzaXZhIHkgTXVsdGluaXZlbCAtLS0tXG4gICAgZGVzY3JpYmUoJ2LDunNxdWVkYSByZWN1cnNpdmEgZW4gdW5pZGFkZXMgaGlqYXMnLCAoKSA9PiB7XG5cbiAgICAgICAgaXQoJ2VuY3VlbnRyYSB1bmEgbm9fcmVhIGRlbnRybyBkZSB1biBhcnJheSBkZSB1bmlkYWQgaGlqYSAoaG9nYXJlcyknLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNwdWVzdGFzID0ge1xuICAgICAgICAgICAgICAgIHZpdmllbmRhX2lkOiAxLFxuICAgICAgICAgICAgICAgIGhvZ2FyZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogMSwgdl9ub3JlYTogJzknIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IDIsIHZfbm9yZWE6ICcxJyB9LFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCByZXNwdWVzdGFzLCBub1JlYXMsICdub19yZWEnLCAnZW5jdSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDEwMSwgcmVzdWx0YWRvOiB0cnVlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGV2dWVsdmUgbnVsbyBzaSBuaW5ndW5hIHVuaWRhZCBoaWphIGN1bXBsZSBsYSBjb25kaWNpw7NuJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICBob2dhcmVzOiBbeyBpZDogMSwgdl9ub3JlYTogJzknIH1dXG4gICAgICAgICAgICB9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3Rhcywgbm9SZWFzLCAnbm9fcmVhJywgJ2VuY3UnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbWFuZWphIGRlIGZvcm1hIHNlZ3VyYSBob2dhcmVzIG51bGwsIHZhY8Otb3MgbyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG9OdWxsID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZpdmllbmRhX2lkOiAxLCBob2dhcmVzOiBudWxsIH0gYXMgYW55LCBub1JlYXMsICdub19yZWEnLCAnZW5jdSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkb051bGwsIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG9WYWNpbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2aXZpZW5kYV9pZDogMSwgaG9nYXJlczogW10gfSBhcyBhbnksIG5vUmVhcywgJ25vX3JlYScsICdlbmN1J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvVmFjaW8sIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZW5jdWVudHJhIHVuYSByZWEgZW4gdW5pZGFkIGhpamEgY3VhbmRvIHRvZG9zIGN1bXBsZW4gY29uZGljacOzbiBKUyAoZXNfcG9zaXRpdmEgPSB0cnVlKScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICB7IGlkOiAxLCB2X3JlYTogJzEnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IDIsIHZfcmVhOiAnMScgfSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3RhcywgcmVhc0Jhc2UsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAxLCByZXN1bHRhZG86IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdldmFsw7phIHVuYSByZWEgY29uIGNvbmRpY2nDs24gcXVlIGNvbWJpbmEgdW5hIHZhcmlhYmxlIGRlIGxhIFVBIHByaW5jaXBhbCAodml2aWVuZGEpIHkgdW5hIGRlIGxhIFVBIGhpamEgKGhvZ2FyKScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYXNNdWx0aWxldmVsID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICByZWE6IDEwLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1ZpdmllbmRhIGhhYml0YWRhIGNvbiBob2dhciBjb21wbGV0bycsXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJ2aXZpZW5kYV9oYWJpdGFkYSA9IDEgYW5kIGhvZ2FyX2NvbXBsZXRvID0gMVwiLFxuICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgdml2aWVuZGFfaGFiaXRhZGE6ICcxJyxcbiAgICAgICAgICAgICAgICBob2dhcmVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IDEsIGhvZ2FyX2NvbXBsZXRvOiAnMCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgaG9nYXJfY29tcGxldG86ICcxJyB9LFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHJlc3B1ZXN0YXMsIHJlYXNNdWx0aWxldmVsLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2V2YWzDumEgdW5hIHJlYV9zdXAgY29uIGNvbmRpY2nDs24gcXVlIGNvbWJpbmEgdW5hIHZhcmlhYmxlIGRlIGxhIFVBIHByaW5jaXBhbCB5IHVuYSBkZSBsYSBVQSBoaWphJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhc1N1cE11bHRpbGV2ZWwgPSBjb25Db25kaWNpb25KcyhbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXG4gICAgICAgICAgICAgICAgICAgIHJlYV9zdXA6IDIwLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1N1cGVydmlzacOzbiBhcHJvYmFkYSBtdWx0aW5pdmVsJyxcbiAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uOiBcInZpdmllbmRhX3N0YXR1cyA9IDEgYW5kIGhvZ2FyX3N1cGVydmlzYWRvID0gMVwiLFxuICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgdml2aWVuZGFfc3RhdHVzOiAnMScsXG4gICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICB7IGlkOiAxLCBob2dhcl9zdXBlcnZpc2FkbzogJzEnIH0sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3RhcywgcmVhc1N1cE11bHRpbGV2ZWwsICdyZWFfc3VwJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMjAsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2VuY3VlbnRyYSB1bmEgbm9fcmVhIGFuaWRhZGEgYSAzIG5pdmVsZXMgKFZpdmllbmRhIC0+IEhvZ2FyIC0+IFBlcnNvbmEpJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICBob2dhcmVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDEsIHZfbm9yZWE6ICc5JyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGVyc29uYV9pZDogMiwgdl9ub3JlYTogJzEnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVRyZXNOaXZlbGVzTW9jaywgcmVzcHVlc3Rhcywgbm9SZWFzLCAnbm9fcmVhJywgJ2VuY3UnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAxMDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2V2YWx1YWNpw7NuIGRlIGVzX3Bvc2l0aXZhIGVuIG3Dumx0aXBsZXMgdW5pZGFkZXMgaGlqYXMnLCAoKSA9PiB7XG5cbiAgICAgICAgICAgIGl0KCdzaSBlc19wb3NpdGl2YSA9IHRydWUgeSBOTyB0b2RvcyBsb3MgaG9nYXJlcyBjdW1wbGVuIGxhIGNvbmRpY2nDs24sIE5PIGRlYmUgbWF0Y2hlYXIgbGEgcmVhIHBvc2l0aXZhJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNQb3NpdGl2YSA9IGNvbkNvbmRpY2lvbkpzKFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246ICdUb2RvcyBsb3MgaG9nYXJlcyBjb21wbGV0b3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uOiBcImhvZ2FyX2NvbXBsZXRvID0gMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBlc19wb3NpdGl2YTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZpdmllbmRhX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICBob2dhcmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAxLCBob2dhcl9jb21wbGV0bzogJzEnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAyLCBob2dhcl9jb21wbGV0bzogJzAnIH0sXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9IGFzIGFueTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHJlc3B1ZXN0YXMsIHJlYXNQb3NpdGl2YSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2kgZXNfcG9zaXRpdmEgPSB0cnVlIHkgdW5hIHVuaWRhZCBoaWphIGFudGVyaW9yIG5vIHRpZW5lIHVuIGNhbXBvIGNhcmdhZG8gYcO6biAodW5kZWZpbmVkKSwgTk8gZGViZSBtYXRjaGVhciBsYSByZWEgcG9zaXRpdmEnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc1Bvc2l0aXZhID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXG4gICAgICAgICAgICAgICAgICAgICAgICByZWE6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1RvZG9zIGxvcyBob2dhcmVzIGNvbXBsZXRvcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb246IFwiaG9nYXJfY29tcGxldG8gPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWE6ICdlbmN1J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIGhvZ2FyZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IDEgfSwgLy8gUHJpbWVyIGhvZ2FyIHNpbiAnaG9nYXJfY29tcGxldG8nIGNhcmdhZG8gYcO6blxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgaG9nYXJfY29tcGxldG86ICcxJyB9LCAvLyDDmmx0aW1vIGhvZ2FyIGN1bXBsZSBsYSBjb25kaWNpw7NuXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9IGFzIGFueTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHJlc3B1ZXN0YXMsIHJlYXNQb3NpdGl2YSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2kgZXNfcG9zaXRpdmEgPSB0cnVlIHkgVE9ET1MgbG9zIGhvZ2FyZXMgY3VtcGxlbiBsYSBjb25kaWNpw7NuLCBkZWJlIG1hdGNoZWFyIGxhIHJlYSBwb3NpdGl2YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFzUG9zaXRpdmEgPSBjb25Db25kaWNpb25KcyhbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXBjaW9uOiAnVG9kb3MgbG9zIGhvZ2FyZXMgY29tcGxldG9zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJob2dhcl9jb21wbGV0byA9IDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVuOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYTogJ2VuY3UnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwdWVzdGFzID0ge1xuICAgICAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMSwgaG9nYXJfY29tcGxldG86ICcxJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgaG9nYXJfY29tcGxldG86ICcxJyB9LFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCByZXNwdWVzdGFzLCByZWFzUG9zaXRpdmEsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2kgZXNfcG9zaXRpdmEgPSBmYWxzZSB5IGFsIG1lbm9zIHVuIGhvZ2FyIGN1bXBsZSBsYSBjb25kaWNpw7NuLCBkZWJlIG1hdGNoZWFyIGxhIHJlYSBuZWdhdGl2YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFzTmVnYXRpdmEgPSBjb25Db25kaWNpb25KcyhbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYTogMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXBjaW9uOiAnQWwgbWVub3MgdW4gaG9nYXIgcmVjaGF6YWRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJob2dhcl9yZWNoYXphZG8gPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZpdmllbmRhX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICBob2dhcmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAxLCBob2dhcl9yZWNoYXphZG86ICcwJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgaG9nYXJfcmVjaGF6YWRvOiAnMScgfSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3RhcywgcmVhc05lZ2F0aXZhLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAyLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdldmFsw7phIDIgUkVBcyAocG9zaXRpdmEgeSBuZWdhdGl2YSk6IHNpIGxhIHBvc2l0aXZhIG5vIHNlIGN1bXBsZSBwYXJhIHRvZG9zIGxvcyBob2dhcmVzIHBlcm8gbGEgbmVnYXRpdmEgc8OtLCBkZXZ1ZWx2ZSBsYSBSRUEgbmVnYXRpdmEnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc01peHRhcyA9IGNvbkNvbmRpY2lvbkpzKFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246ICdUb2RvcyBsb3MgaG9nYXJlcyBjb21wbGV0b3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uOiBcImhvZ2FyX2NvbXBsZXRvID0gMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBlc19wb3NpdGl2YTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246ICdBbCBtZW5vcyB1biBob2dhciBjb21wbGV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb246IFwiaG9nYXJfY29tcGxldG8gPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIGhvZ2FyZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IDEsIGhvZ2FyX2NvbXBsZXRvOiAnMScgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IDIsIGhvZ2FyX2NvbXBsZXRvOiAnMCcgfSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3RhcywgcmVhc01peHRhcywgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMiwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXQoJ3NpIGVzX3Bvc2l0aXZhID0gdHJ1ZSB5IHVuYSBwZXJzb25hIGRlIE9UUk8gaG9nYXIgKHByaW1hKSBubyBjdW1wbGUgbGEgY29uZGljacOzbiwgTk8gZGViZSBtYXRjaGVhciBsYSByZWEgcG9zaXRpdmEnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc1Bvc2l0aXZhID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXG4gICAgICAgICAgICAgICAgICAgICAgICByZWE6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1RvZGFzIGxhcyBwZXJzb25hcyBjb24gcDIgPSAxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJwMiA9IDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVuOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYTogJ2VuY3UnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwdWVzdGFzQ29uUHJpbWFGYWxsaWRhID0ge1xuICAgICAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGVyc29uYV9pZDogMSwgcDI6ICcxJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDIsIHAyOiAnMScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9nYXJfaWQ6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwZXJzb25hX2lkOiAzLCBwMjogJzAnIH0gLy8gTGEgXCJwcmltYVwiIGVuIGVsIEhvZ2FyIDIgbm8gY3VtcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICAgICAgdWFUcmVzTml2ZWxlc01vY2ssIHJlc3B1ZXN0YXNDb25QcmltYUZhbGxpZGEsIHJlYXNQb3NpdGl2YSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2kgZXNfcG9zaXRpdmEgPSB0cnVlIHkgaGF5IHVuIHNlZ3VuZG8gaG9nYXIgc2luIHBlcnNvbmFzIGNhcmdhZGFzIGHDum4sIE5PIGRlYmUgbWF0Y2hlYXIgbGEgUkVBIHBvc2l0aXZhJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNQb3NpdGl2YSA9IGNvbkNvbmRpY2lvbkpzKFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246ICdUb2RhcyBsYXMgcGVyc29uYXMgY29tcGxldGFzIGVuIHZpdmllbmRhIHkgaG9nYXIgdsOhbGlkb3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uOiBcInZpdmllbmRhX2hhYml0YWRhID0gMSBhbmQgaG9nYXJfdmFsaWRvID0gMSBhbmQgcGVyc29uYV9jb21wbGV0YSA9IDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVuOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYTogJ2VuY3UnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwdWVzdGFzID0ge1xuICAgICAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaGFiaXRhZGE6ICcxJyxcbiAgICAgICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX3ZhbGlkbzogJzEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGVyc29uYV9pZDogMSwgcGVyc29uYV9jb21wbGV0YTogJzEnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX3ZhbGlkbzogJzEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFzOiBbXSAvLyBTaW4gcGVyc29uYXMgY2FyZ2FkYXMgYcO6biAoaW5jb21wbGV0bylcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhVHJlc05pdmVsZXNNb2NrLCByZXNwdWVzdGFzLCByZWFzUG9zaXRpdmEsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3NpIGVzX3Bvc2l0aXZhID0gdHJ1ZSB5IGhheSB1biBzZWd1bmRvIGhvZ2FyIHNpbiBwZXJzb25hcyBjYXJnYWRhcyBhw7puIChzaW4gaW5pY2lhbGl6YXIgYXJyYXkpLCBOTyBkZWJlIG1hdGNoZWFyIGxhIFJFQSBwb3NpdGl2YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFzUG9zaXRpdmEgPSBjb25Db25kaWNpb25KcyhbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXBjaW9uOiAnVG9kYXMgbGFzIHBlcnNvbmFzIGNvbXBsZXRhcyBlbiB2aXZpZW5kYSB5IGhvZ2FyIHbDoWxpZG9zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJ2aXZpZW5kYV9oYWJpdGFkYSA9IDEgYW5kIGhvZ2FyX3ZhbGlkbyA9IDEgYW5kIHBlcnNvbmFfY29tcGxldGEgPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWE6ICdlbmN1J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIHZpdmllbmRhX2hhYml0YWRhOiAnMScsXG4gICAgICAgICAgICAgICAgICAgIGhvZ2FyZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcl9pZDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcl92YWxpZG86ICcxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDEsIHBlcnNvbmFfY29tcGxldGE6ICcxJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcl9pZDogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcl92YWxpZG86ICcxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhVHJlc05pdmVsZXNNb2NrLCByZXNwdWVzdGFzLCByZWFzUG9zaXRpdmEsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ2V2YWzDumEgY29ycmVjdGFtZW50ZSB1bmEgUkVBIHBvc2l0aXZhIG11bHRpbml2ZWwgKHZpdmllbmRhICsgaG9nYXIgKyBwZXJzb25hKSBleGlzdGllbmRvIHJhbWFzIGluZGVwZW5kaWVudGVzIGRlIHZpc2l0YXMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc1Bvc2l0aXZhID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXG4gICAgICAgICAgICAgICAgICAgICAgICByZWE6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1RvZGFzIGxhcyBwZXJzb25hcyBjb21wbGV0YXMgZW4gaG9nYXJlcyBjb21wbGV0b3MgZGUgdml2aWVuZGFzIGhhYml0YWRhcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb246IFwidml2aWVuZGFfaGFiaXRhZGEgPSAxIGFuZCBob2dhcl9jb21wbGV0byA9IDEgYW5kIHBlcnNvbmFfY29tcGxldGEgPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWE6ICdlbmN1J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIHZpdmllbmRhX2hhYml0YWRhOiAnMScsIC8vIE5pdmVsIFZpdmllbmRhXG4gICAgICAgICAgICAgICAgICAgIHZpc2l0YXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IDEsIGZlY2hhOiAnMjAyNi0xMC0wMScsIHJlc3VsdGFkb192aXNpdGE6ICcxJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgZmVjaGE6ICcyMDI2LTEwLTA1JywgcmVzdWx0YWRvX3Zpc2l0YTogJzEnIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2NvbXBsZXRvOiAnMScsIC8vIE5pdmVsIEhvZ2FyIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDEsIHBlcnNvbmFfY29tcGxldGE6ICcxJyB9LCAvLyBOaXZlbCBQZXJzb25hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGVyc29uYV9pZDogMiwgcGVyc29uYV9jb21wbGV0YTogJzEnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2NvbXBsZXRvOiAnMScsIC8vIE5pdmVsIEhvZ2FyIDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDMsIHBlcnNvbmFfY29tcGxldGE6ICcxJyB9IC8vIE5pdmVsIFBlcnNvbmEgKFByaW1hKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhVml2aWVuZGFDb25WaXNpdGFzTW9jaywgcmVzcHVlc3RhcywgcmVhc1Bvc2l0aXZhLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAxLCByZXN1bHRhZG86IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvMiA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgICAgICB1YVZpdmllbmRhQ29uVmlzaXRhc01vY2ssIHJlc3B1ZXN0YXMsIHJlYXNQb3NpdGl2YSwgJ3JlYScsICdyZWN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvMiwgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICB9KTtcbiAgICB9KTtcbn0pOyJdfQ==