dmencu 1.0.34 → 2.0.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/client/client.js +35 -6
- package/dist/client/server/table-tem.d.ts +3 -0
- package/dist/client/server/table-tem.js +239 -0
- package/dist/client/server/types-dmencu.d.ts +49 -0
- package/dist/client/server/types-dmencu.js +33 -0
- package/dist/client/unlogged/abrir-formulario.d.ts +1 -0
- package/dist/client/unlogged/abrir-formulario.js +6 -3
- package/dist/client/unlogged/bypass-formulario.js +2 -1
- package/dist/server/server/app-dmencu.js +2 -2
- package/dist/server/server/procedures-dmencu.js +21 -14
- package/dist/server/server/table-inconsistencias_no_cumple_condicion.d.ts +2 -0
- package/dist/server/server/table-inconsistencias_no_cumple_condicion.js +31 -0
- package/dist/server/server/table-inconsistencias_no_cumplen_condicion.d.ts +3 -0
- package/dist/server/server/table-inconsistencias_no_cumplen_condicion.js +38 -0
- package/dist/server/server/table-momento_consistencia_tarea_rol.d.ts +2 -0
- package/dist/server/server/table-momento_consistencia_tarea_rol.js +34 -0
- package/dist/server/server/table-momento_consistencia_tarea_roles.d.ts +2 -0
- package/dist/server/server/table-momento_consistencia_tarea_roles.js +33 -0
- package/dist/server/server/table-roles copy.d.ts +2 -0
- package/dist/server/server/table-roles copy.js +33 -0
- package/dist/server/server/table-tareas_tem_fin_campo copy.d.ts +3 -0
- package/dist/server/server/table-tareas_tem_fin_campo copy.js +46 -0
- package/dist/server/server/table-tem copy.d.ts +3 -0
- package/dist/server/server/table-tem copy.js +238 -0
- package/dist/server/server/table-tem.js +2 -1
- package/dist/server/server/types-dmencu.d.ts +1 -0
- package/dist/server/server/types-dmencu.js +1 -1
- package/dist/unlogged/unlogged/server/table-tem.d.ts +3 -0
- package/dist/unlogged/unlogged/server/table-tem.js +239 -0
- package/dist/unlogged/unlogged/server/types-dmencu.d.ts +49 -0
- package/dist/unlogged/unlogged/server/types-dmencu.js +33 -0
- package/dist/unlogged/unlogged/unlogged/abrir-formulario.d.ts +13 -0
- package/dist/unlogged/unlogged/unlogged/abrir-formulario.js +109 -0
- package/dist/unlogged/unlogged/unlogged/adapt.d.ts +0 -0
- package/dist/unlogged/unlogged/unlogged/adapt.js +8 -0
- package/dist/unlogged/unlogged/unlogged/bypass-formulario.d.ts +202 -0
- package/dist/unlogged/unlogged/unlogged/bypass-formulario.js +1100 -0
- package/dist/unlogged/unlogged/unlogged/redux-formulario.d.ts +349 -0
- package/dist/unlogged/unlogged/unlogged/redux-formulario.js +318 -0
- package/dist/unlogged/unlogged/unlogged/render-formulario.d.ts +86 -0
- package/dist/unlogged/unlogged/unlogged/render-formulario.js +1692 -0
- package/dist/unlogged/unlogged/unlogged/render-general.d.ts +127 -0
- package/dist/unlogged/unlogged/unlogged/render-general.js +176 -0
- package/dist/unlogged/unlogged/unlogged/tipos.d.ts +486 -0
- package/dist/unlogged/unlogged/unlogged/tipos.js +22 -0
- package/dist/unlogged/unlogged/unlogged/unlogged.d.ts +1 -0
- package/dist/unlogged/unlogged/unlogged/unlogged.js +180 -0
- package/package.json +1 -1
- package/dist/server/server/Copiar (1) procedures-dmencu.d.ts +0 -11
- package/dist/server/server/Copiar (1) procedures-dmencu.js +0 -1531
- package/dist/server/server/Copiar (2) procedures-dmencu.d.ts +0 -11
- package/dist/server/server/Copiar (2) procedures-dmencu.js +0 -1655
- package/dist/server/server/procedures-dmencu_raquel.d.ts +0 -11
- package/dist/server/server/procedures-dmencu_raquel.js +0 -1655
- package/dist/server/server/table-varcal.d.ts +0 -1
- package/dist/server/server/table-varcal.js +0 -25
- package/dist/server/server/table-variables_c.d.ts +0 -2
- package/dist/server/server/table-variables_c.js +0 -23
|
@@ -1,1655 +0,0 @@
|
|
|
1
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
2
|
-
if (k2 === undefined) k2 = k;
|
|
3
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
4
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
5
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
6
|
-
}
|
|
7
|
-
Object.defineProperty(o, k2, desc);
|
|
8
|
-
}) : (function(o, m, k, k2) {
|
|
9
|
-
if (k2 === undefined) k2 = k;
|
|
10
|
-
o[k2] = m[k];
|
|
11
|
-
}));
|
|
12
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
13
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
14
|
-
};
|
|
15
|
-
(function (factory) {
|
|
16
|
-
if (typeof module === "object" && typeof module.exports === "object") {
|
|
17
|
-
var v = factory(require, exports);
|
|
18
|
-
if (v !== undefined) module.exports = v;
|
|
19
|
-
}
|
|
20
|
-
else if (typeof define === "function" && define.amd) {
|
|
21
|
-
define(["require", "exports", "like-ar", "./types-dmencu", "procesamiento", "pg-promise-strict", "best-globals", "fs", "expre-parser", "./table-tareas_tem", "console"], factory);
|
|
22
|
-
}
|
|
23
|
-
})(function (require, exports) {
|
|
24
|
-
"use strict";
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.ProceduresDmEncu = exports.ACCION_PASAR_PROIE = exports.setHdrQuery = exports.getOperativoActual = exports.setMaxAgenerar = exports.setGenerarIdEncFun = void 0;
|
|
27
|
-
const likeAr = require("like-ar");
|
|
28
|
-
__exportStar(require("./types-dmencu"), exports);
|
|
29
|
-
const procesamiento_1 = require("procesamiento");
|
|
30
|
-
const pg_promise_strict_1 = require("pg-promise-strict");
|
|
31
|
-
const best_globals_1 = require("best-globals");
|
|
32
|
-
const fs_1 = require("fs");
|
|
33
|
-
const ExpresionParser = require("expre-parser");
|
|
34
|
-
const table_tareas_tem_1 = require("./table-tareas_tem");
|
|
35
|
-
const console_1 = require("console");
|
|
36
|
-
var path = require('path');
|
|
37
|
-
var sqlTools = require('sql-tools');
|
|
38
|
-
var discrepances = require('discrepances');
|
|
39
|
-
const formPrincipal = 'F:F1';
|
|
40
|
-
const ESTADO_POSTERIOR_CARGA = 'C';
|
|
41
|
-
const ESTADO_POSTERIOR_DESCARGA = 'D';
|
|
42
|
-
var generarIdEncFun;
|
|
43
|
-
var maxAGenerar = 50;
|
|
44
|
-
const setGenerarIdEncFun = (fun) => generarIdEncFun = fun;
|
|
45
|
-
exports.setGenerarIdEncFun = setGenerarIdEncFun;
|
|
46
|
-
const setMaxAgenerar = (max) => maxAGenerar = max;
|
|
47
|
-
exports.setMaxAgenerar = setMaxAgenerar;
|
|
48
|
-
(0, exports.setGenerarIdEncFun)((area, index) => area.toString() + (index + 10).toString());
|
|
49
|
-
(0, exports.setMaxAgenerar)(100);
|
|
50
|
-
const getOperativoActual = async (context) => {
|
|
51
|
-
var _a;
|
|
52
|
-
var be = context.be;
|
|
53
|
-
var result = await be.procedure.table_data.coreFunction(context, { table: `parametros`, fixedFields: [] });
|
|
54
|
-
if ((_a = result[0]) === null || _a === void 0 ? void 0 : _a.operativo) {
|
|
55
|
-
return result[0].operativo;
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
throw Error('no se configuró un operativo en la tabla parámetros');
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
exports.getOperativoActual = getOperativoActual;
|
|
62
|
-
function createStructure(context, tableName) {
|
|
63
|
-
var be = context.be;
|
|
64
|
-
var mainTableDef = be.tableStructures[tableName](context);
|
|
65
|
-
var getPkFromTableDef = function getPkFromTableDef(tableDef) {
|
|
66
|
-
return tableDef.primaryKey.map(function (pk) {
|
|
67
|
-
return { fieldName: pk };
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
var getFkFromTableDef = function getFkFromTableDef(tableDef, parentTableName) {
|
|
71
|
-
// return tableDef.foreignKeys? tableDef.foreignKeys.map(fk=>fk.fields): [];
|
|
72
|
-
let parentFk = tableDef.foreignKeys.find(fk => fk.references == parentTableName);
|
|
73
|
-
return parentFk ? parentFk.fields : [];
|
|
74
|
-
};
|
|
75
|
-
var struct = {
|
|
76
|
-
tableName: mainTableDef.name,
|
|
77
|
-
pkFields: getPkFromTableDef(mainTableDef),
|
|
78
|
-
childTables: []
|
|
79
|
-
};
|
|
80
|
-
if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
|
|
81
|
-
mainTableDef.detailTables.forEach(function (detailTable) {
|
|
82
|
-
struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), { fkFields: getFkFromTableDef(be.tableStructures[detailTable.table](context), tableName) }));
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
return struct;
|
|
86
|
-
}
|
|
87
|
-
var getSettersAndParametersForReaNoReaResumenEstado = (funParams) => {
|
|
88
|
-
let { tarea, respuestasUAPrincipal, setters, params } = funParams;
|
|
89
|
-
let { resumenEstadoSup, codNoReaSup, codReaSup, resumenEstado, codNoRea, codRea } = respuestasUAPrincipal;
|
|
90
|
-
setters = setters.concat([
|
|
91
|
-
`resumen_estado${tarea == 'supe' ? '_sup' : ''}=$${params.length + 1}`,
|
|
92
|
-
`norea${tarea == 'supe' ? '_sup' : ''}=$${params.length + 2}`,
|
|
93
|
-
`rea${tarea == 'supe' ? '_sup' : ''}=$${params.length + 3}`
|
|
94
|
-
]);
|
|
95
|
-
params = params.concat([
|
|
96
|
-
tarea == 'supe' ? resumenEstadoSup : resumenEstado,
|
|
97
|
-
tarea == 'supe' ? codNoReaSup : codNoRea,
|
|
98
|
-
tarea == 'supe' ? codReaSup : codRea
|
|
99
|
-
]);
|
|
100
|
-
return { setters, params };
|
|
101
|
-
};
|
|
102
|
-
var guardarEncuestaEnTem = async (context, operativo, idEnc, respuestasUAPrincipal, tarea) => {
|
|
103
|
-
var { params, setters } = getSettersAndParametersForReaNoReaResumenEstado({
|
|
104
|
-
tarea,
|
|
105
|
-
respuestasUAPrincipal,
|
|
106
|
-
setters: [`json_encuesta = $3`, `fecha_modif_encuesta = current_timestamp`],
|
|
107
|
-
params: [operativo, idEnc, respuestasUAPrincipal]
|
|
108
|
-
});
|
|
109
|
-
return await context.client.query(`update tem
|
|
110
|
-
set ${setters.join(',')}
|
|
111
|
-
where operativo= $1 and enc = $2
|
|
112
|
-
returning 'ok'`, params).fetchUniqueRow();
|
|
113
|
-
};
|
|
114
|
-
var simularGuardadoDeEncuestaDesdeAppEscritorio = async (context, operativo, enc, tarea, json_encuesta) => {
|
|
115
|
-
var be = context.be;
|
|
116
|
-
const UA_PRINCIPAL = await getUAPrincipal(context.client, operativo);
|
|
117
|
-
return await be.procedure.dm_forpkraiz_descargar.coreFunction(context, {
|
|
118
|
-
operativo: operativo,
|
|
119
|
-
persistentes: {
|
|
120
|
-
respuestas: {
|
|
121
|
-
[UA_PRINCIPAL]: {
|
|
122
|
-
[enc]: json_encuesta
|
|
123
|
-
}
|
|
124
|
-
},
|
|
125
|
-
informacionHdr: {
|
|
126
|
-
[enc]: {
|
|
127
|
-
tarea: {
|
|
128
|
-
tarea
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
};
|
|
135
|
-
var getHdrQuery = function getHdrQuery(quotedCondViv, context) {
|
|
136
|
-
return `
|
|
137
|
-
with ${context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)} as
|
|
138
|
-
(select t.enc, t.json_encuesta as respuestas, t.resumen_estado as "resumenEstado",
|
|
139
|
-
jsonb_build_object(
|
|
140
|
-
'dominio' , dominio ,
|
|
141
|
-
'nomcalle' , nomcalle ,
|
|
142
|
-
'sector' , sector ,
|
|
143
|
-
'edificio' , edificio ,
|
|
144
|
-
'entrada' , entrada ,
|
|
145
|
-
'nrocatastral' , nrocatastral ,
|
|
146
|
-
'piso' , piso ,
|
|
147
|
-
'departamento' , departamento ,
|
|
148
|
-
'habitacion' , habitacion ,
|
|
149
|
-
'casa' , casa ,
|
|
150
|
-
'prioridad' , reserva+1 ,
|
|
151
|
-
'observaciones' , tt.carga_observaciones ,
|
|
152
|
-
'cita' , cita ,
|
|
153
|
-
'carga' , t.area
|
|
154
|
-
) as tem, t.area,
|
|
155
|
-
--TODO: GENERALIZAR
|
|
156
|
-
jsonb_build_object(
|
|
157
|
-
'tarea', tt.tarea,
|
|
158
|
-
'fecha_asignacion', fecha_asignacion,
|
|
159
|
-
'asignado', asignado,
|
|
160
|
-
'main_form', main_form
|
|
161
|
-
) as tarea,
|
|
162
|
-
min(fecha_asignacion) as fecha_asignacion
|
|
163
|
-
from tem t left join tareas_tem tt on (t.operativo = tt.operativo and t.enc = tt.enc and t.tarea_actual = tt.tarea)
|
|
164
|
-
left join tareas ta on t.tarea_actual = ta.tarea
|
|
165
|
-
where t.habilitada and ${quotedCondViv}
|
|
166
|
-
group by t.enc, t.json_encuesta, t.resumen_estado, dominio, nomcalle,sector,edificio, entrada, nrocatastral, piso,departamento,habitacion,casa,reserva,tt.carga_observaciones, cita, t.area, tt.tarea, fecha_asignacion, asignado, main_form
|
|
167
|
-
)
|
|
168
|
-
select jsonb_build_object(
|
|
169
|
-
'viviendas', ${(0, pg_promise_strict_1.jsono)(`select enc, respuestas, jsonb_build_object('resumenEstado',"resumenEstado") as otras from ${context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)}`, 'enc', `otras || coalesce(respuestas,'{}'::jsonb)`)}
|
|
170
|
-
) as respuestas,
|
|
171
|
-
${(0, pg_promise_strict_1.json)(`
|
|
172
|
-
select area as carga, observaciones_hdr as observaciones, min(fecha_asignacion) as fecha
|
|
173
|
-
from ${context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)} inner join areas using (area)
|
|
174
|
-
group by area, observaciones_hdr`, 'fecha')} as cargas,
|
|
175
|
-
${(0, pg_promise_strict_1.jsono)(`select enc, jsonb_build_object('tem', tem, 'tarea', tarea) as otras from ${context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)}`, 'enc', `otras ||'{}'::jsonb`)}
|
|
176
|
-
as "informacionHdr"
|
|
177
|
-
`;
|
|
178
|
-
};
|
|
179
|
-
var setHdrQuery = (myFun) => getHdrQuery = myFun;
|
|
180
|
-
exports.setHdrQuery = setHdrQuery;
|
|
181
|
-
const getUAPrincipal = async (client, operativo) => (await client.query(`select unidad_analisis
|
|
182
|
-
from unidad_analisis
|
|
183
|
-
where operativo= $1 and principal
|
|
184
|
-
`, [operativo]).fetchUniqueValue()).value;
|
|
185
|
-
var funcionesConocidas = {};
|
|
186
|
-
var compiler = new ExpresionParser.Compiler({
|
|
187
|
-
language: 'js',
|
|
188
|
-
varWrapper: (var_name) => `helpers.null2zero(valores.${var_name})`,
|
|
189
|
-
funWrapper: (functionName) => {
|
|
190
|
-
if (!funcionesConocidas[functionName]) {
|
|
191
|
-
console.log(functionName);
|
|
192
|
-
funcionesConocidas[functionName] = true;
|
|
193
|
-
}
|
|
194
|
-
return `helpers.funs.${functionName}`;
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
function compilarExpresion(expresion) {
|
|
198
|
-
return compiler.toCode(ExpresionParser.parse(expresion
|
|
199
|
-
.replace(/\bis distinct from\b/gi, ' <> ')
|
|
200
|
-
.replace(/!!/gi, ' '))).replace(/helpers\.funs\.blanco\(helpers.null2zero\(/g, 'helpers.funs.blanco((')
|
|
201
|
-
.replace(/helpers\.funs\.informado\(helpers.null2zero\(/g, 'helpers.funs.informado((');
|
|
202
|
-
}
|
|
203
|
-
function compilarExpresiones(casillero) {
|
|
204
|
-
var _a, _b;
|
|
205
|
-
if (!casillero) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
if (casillero.data.expresion_habilitar) {
|
|
209
|
-
casillero.data.expresion_habilitar_js = compilarExpresion(casillero.data.expresion_habilitar);
|
|
210
|
-
}
|
|
211
|
-
if ((_a = casillero.data.especial) === null || _a === void 0 ? void 0 : _a.autoing) {
|
|
212
|
-
var partes = (_b = casillero.data.especial) === null || _b === void 0 ? void 0 : _b.autoing.split('=>');
|
|
213
|
-
if (partes.length > 1) {
|
|
214
|
-
var precondicion = partes[0];
|
|
215
|
-
var valor = partes.slice(1).join('=>');
|
|
216
|
-
casillero.data.expresion_autoingresar_js = `(${compilarExpresion(precondicion)})?(${compilarExpresion(valor)}):null`;
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
casillero.data.expresion_autoingresar_js = compilarExpresion(partes[0]);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
for (var casilleroInterno of casillero.childs)
|
|
223
|
-
compilarExpresiones(casilleroInterno);
|
|
224
|
-
}
|
|
225
|
-
const generarTareasTemFaltantes = async (context, operativo) => await context.client.query(`
|
|
226
|
-
insert into tareas_tem (operativo, enc, tarea)
|
|
227
|
-
select ta.operativo, ta.enc, ta.tarea
|
|
228
|
-
from (select ta.*, t.enc,t.area from tareas ta, tem t where ta.operativo=t.operativo) ta
|
|
229
|
-
where ta.operativo = $1
|
|
230
|
-
and not (ta.operativo, ta.enc, ta.tarea) in (select operativo, enc, tarea from tareas_tem)
|
|
231
|
-
order by 1,3,2;
|
|
232
|
-
`, [operativo]).execute();
|
|
233
|
-
exports.ACCION_PASAR_PROIE = 'encuestas_procesamiento_pasar';
|
|
234
|
-
exports.ProceduresDmEncu = [
|
|
235
|
-
{
|
|
236
|
-
action: 'operativo_estructura_completa',
|
|
237
|
-
parameters: [
|
|
238
|
-
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
239
|
-
],
|
|
240
|
-
resultOk: 'desplegarFormulario',
|
|
241
|
-
coreFunction: async function (context, parameters) {
|
|
242
|
-
var be = context.be;
|
|
243
|
-
var result = await context.client.query(`select casilleros_jerarquizados($1) as formularios,
|
|
244
|
-
${(0, pg_promise_strict_1.jsono)(`select unidad_analisis, padre, pk_agregada, '{}'::jsonb as hijas from unidad_analisis where operativo = $2`, 'unidad_analisis')} as unidades_analisis
|
|
245
|
-
`, [parameters.operativo, parameters.operativo]).fetchUniqueRow();
|
|
246
|
-
likeAr(result.row.formularios).forEach(f => compilarExpresiones(f));
|
|
247
|
-
// Hermanos son los formularios que están implantados en otro formulario de la misma UA. Por ejemplo el A1 en el S1
|
|
248
|
-
var resultHermanos = await context.client.query(`
|
|
249
|
-
select o.id_casillero as id_formulario, o.unidad_analisis, 'BF_'||o.casillero boton, bf.casillero, bf.padre, fp.casillero, fp.unidad_analisis
|
|
250
|
-
from casilleros o left join casilleros bf
|
|
251
|
-
on bf.tipoc='BF'
|
|
252
|
-
and bf.casillero = 'BF_'||o.casillero
|
|
253
|
-
and bf.operativo = o.operativo
|
|
254
|
-
left join casilleros fp
|
|
255
|
-
on fp.id_casillero = bf.padre
|
|
256
|
-
and fp.operativo = bf.operativo
|
|
257
|
-
where o.tipoc = 'F'
|
|
258
|
-
and o.unidad_analisis = fp.unidad_analisis
|
|
259
|
-
and o.operativo = $1`, [parameters.operativo]).fetchAll();
|
|
260
|
-
resultHermanos.rows.forEach(row => {
|
|
261
|
-
result.row.formularios[row.id_formulario].data.hermano = true;
|
|
262
|
-
});
|
|
263
|
-
function completarUA(ua, idUa, uAs) {
|
|
264
|
-
if (ua.padre) {
|
|
265
|
-
uAs[ua.padre].hijas[idUa] = ua;
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
ua.principal = true;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
likeAr(result.row.unidades_analisis).forEach((ua, idUa) => completarUA(ua, idUa, result.row.unidades_analisis));
|
|
272
|
-
var { con_rea_hogar: conReaHogar, config_sorteo: configSorteo, habilitacion_boton_formulario: habilitacionBotonFormulario, permite_generar_muestra: permiteGenerarMuestra } = (await context.client.query(`
|
|
273
|
-
select config_sorteo, con_rea_hogar, habilitacion_boton_formulario, permite_generar_muestra
|
|
274
|
-
from operativos
|
|
275
|
-
where operativo = $1
|
|
276
|
-
`, [parameters.operativo]).fetchUniqueRow()).row;
|
|
277
|
-
let compilarExpresionesDominios = (expresionesDominio) => likeAr(expresionesDominio)
|
|
278
|
-
.map((expr, dominio) => ({ dominio, expr: compilarExpresion(expr.expr) }))
|
|
279
|
-
.plain();
|
|
280
|
-
if (configSorteo) {
|
|
281
|
-
likeAr(configSorteo).forEach((configSorteoFormulario) => {
|
|
282
|
-
configSorteoFormulario.expr_incompletitud_js = compilarExpresionesDominios(configSorteoFormulario.expr_incompletitud);
|
|
283
|
-
configSorteoFormulario.filtro_js = compilarExpresionesDominios(configSorteoFormulario.filtro);
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
if (habilitacionBotonFormulario) {
|
|
287
|
-
likeAr(habilitacionBotonFormulario).forEach((form) => {
|
|
288
|
-
form.expr_habilitar_boton_js = compilarExpresion(form.expr_habilitar_boton);
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
return { timestamp: be.caches.timestampEstructura, ...result.row, operativo: parameters.operativo, conReaHogar, configSorteo, habilitacionBotonFormulario, permiteGenerarMuestra, noReas: be.caches.tableContent.no_rea, noReasSup: be.caches.tableContent.no_rea_sup };
|
|
292
|
-
}
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
action: 'generar_formularios',
|
|
296
|
-
parameters: [
|
|
297
|
-
{ name: 'annio', typeName: 'integer', references: 'annio' },
|
|
298
|
-
{ name: 'mes', typeName: 'integer', references: 'mes' },
|
|
299
|
-
{ name: 'lote', typeName: 'integer', references: 'lotes' },
|
|
300
|
-
],
|
|
301
|
-
coreFunction: async function (context, parameters) {
|
|
302
|
-
var be = context.be;
|
|
303
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
304
|
-
let resultUA = await context.client.query(`select *
|
|
305
|
-
from unidad_analisis
|
|
306
|
-
where principal = true and operativo = $1
|
|
307
|
-
`, [OPERATIVO]).fetchOneRowIfExists();
|
|
308
|
-
if (resultUA.rowCount === 0) {
|
|
309
|
-
throw new Error('No se configuró una unidad de analisis como principal');
|
|
310
|
-
}
|
|
311
|
-
let row = resultUA.row;
|
|
312
|
-
let resultPreguntas = await be.procedure.preguntas_ua_traer.coreFunction(context, row);
|
|
313
|
-
var contenedorVacio = {};
|
|
314
|
-
resultPreguntas.forEach(function (defPregunta) {
|
|
315
|
-
contenedorVacio[defPregunta.var_name] = defPregunta.unidad_analisis ? [] : null;
|
|
316
|
-
});
|
|
317
|
-
contenedorVacio.annio = parameters.annio;
|
|
318
|
-
contenedorVacio.mes = parameters.mes;
|
|
319
|
-
contenedorVacio.lote = parameters.lote;
|
|
320
|
-
var result = await context.client.query(`select debe_haber.id_caso, s as id
|
|
321
|
-
from (select lote, armar_id(annio, mes, lote, s) as id_caso, s
|
|
322
|
-
from (select annio,mes,lote, cant_cues from lotes where (annio,mes,lote)=($2,$3,$4)) r, lateral generate_series(1,cant_cues) s
|
|
323
|
-
) debe_haber left join defgen hay on hay.id_caso = debe_haber.id_caso and hay.operativo=$1
|
|
324
|
-
where hay.id_caso is null`, [OPERATIVO, parameters.annio, parameters.mes, parameters.lote]).fetchAll();
|
|
325
|
-
var params = { operativo: OPERATIVO };
|
|
326
|
-
for (var i = 0; i < result.rowCount; i++) {
|
|
327
|
-
await be.procedure.caso_guardar.coreFunction(context, (0, best_globals_1.changing)(params, { id_caso: result.rows[i].id_caso, datos_caso: (0, best_globals_1.changing)(contenedorVacio, { id: result.rows[i].id }) }));
|
|
328
|
-
}
|
|
329
|
-
return { agregadas: result.rowCount };
|
|
330
|
-
}
|
|
331
|
-
},
|
|
332
|
-
{
|
|
333
|
-
action: 'upload_file',
|
|
334
|
-
progress: true,
|
|
335
|
-
parameters: [
|
|
336
|
-
{ name: 'id_adjunto', typeName: 'integer' },
|
|
337
|
-
{ name: 'nombre', typeName: 'text' },
|
|
338
|
-
],
|
|
339
|
-
files: { count: 1 },
|
|
340
|
-
coreFunction: function (context, parameters, files) {
|
|
341
|
-
let be = context.be;
|
|
342
|
-
let client = context.client;
|
|
343
|
-
context.informProgress({ message: be.messages.fileUploaded });
|
|
344
|
-
let file = files[0];
|
|
345
|
-
let ext = path.extname(file.path).substr(1);
|
|
346
|
-
let originalFilename = file.originalFilename.slice(0, -(ext.length + 1));
|
|
347
|
-
let filename = parameters.nombre || originalFilename;
|
|
348
|
-
let newPath = 'local-attachments/file-';
|
|
349
|
-
var createResponse = function createResponse(adjuntoRow) {
|
|
350
|
-
let resultado = {
|
|
351
|
-
message: 'La subida se realizó correctamente (update)',
|
|
352
|
-
nombre: adjuntoRow.nombre,
|
|
353
|
-
nombre_original: adjuntoRow.nombre_original,
|
|
354
|
-
ext: adjuntoRow.ext,
|
|
355
|
-
fecha: adjuntoRow.fecha,
|
|
356
|
-
hora: adjuntoRow.hora,
|
|
357
|
-
id_adjunto: adjuntoRow.id_adjunto
|
|
358
|
-
};
|
|
359
|
-
return resultado;
|
|
360
|
-
};
|
|
361
|
-
var moveFile = function moveFile(file, id_adjunto, extension) {
|
|
362
|
-
fs_1.promises.move(file.path, newPath + id_adjunto + '.' + extension, { overwrite: true });
|
|
363
|
-
};
|
|
364
|
-
return Promise.resolve().then(function () {
|
|
365
|
-
if (parameters.id_adjunto) {
|
|
366
|
-
return context.client.query(`update adjuntos set nombre= $1,nombre_original = $2, ext = $3, ruta = concat('local-attachments/file-',$4::text,'.',$3::text), fecha = now(), hora = date_trunc('seconds',current_timestamp-current_date)
|
|
367
|
-
where id_adjunto = $4 returning *`, [filename, originalFilename, ext, parameters.id_adjunto]).fetchUniqueRow().then(function (result) {
|
|
368
|
-
return createResponse(result.row);
|
|
369
|
-
}).then(function (resultado) {
|
|
370
|
-
moveFile(file, resultado.id_adjunto, resultado.ext);
|
|
371
|
-
return resultado;
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
return context.client.query(`insert into adjuntos (nombre, nombre_original, ext, fecha, hora) values ($1,$2,$3,now(), date_trunc('seconds',current_timestamp-current_date)) returning *`, [filename, originalFilename, ext]).fetchUniqueRow().then(function (result) {
|
|
376
|
-
return context.client.query(`update adjuntos set ruta = concat('local-attachments/file-',id_adjunto::text,'.',ext)
|
|
377
|
-
where id_adjunto = $1 returning *`, [result.row.id_adjunto]).fetchUniqueRow().then(function (result) {
|
|
378
|
-
return createResponse(result.row);
|
|
379
|
-
}).then(function (resultado) {
|
|
380
|
-
moveFile(file, resultado.id_adjunto, resultado.ext);
|
|
381
|
-
return resultado;
|
|
382
|
-
});
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
}).catch(function (err) {
|
|
386
|
-
throw err;
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
},
|
|
390
|
-
{
|
|
391
|
-
action: 'caso_guardar',
|
|
392
|
-
parameters: [
|
|
393
|
-
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
394
|
-
{ name: 'id_caso', typeName: 'text' },
|
|
395
|
-
{ name: 'datos_caso', typeName: 'jsonb' },
|
|
396
|
-
],
|
|
397
|
-
definedIn: 'dmencu',
|
|
398
|
-
//@ts-ignore especifico el tipo de los parámetros
|
|
399
|
-
coreFunction: async function (context, parameters, newClient) {
|
|
400
|
-
var client = newClient || context.client;
|
|
401
|
-
var datos_json = parameters.datos_caso;
|
|
402
|
-
var be = context.be;
|
|
403
|
-
var tableStructures_app = be.tableStructures;
|
|
404
|
-
var struct_dmencu = createStructure(context, procesamiento_1.OperativoGenerator.mainTD);
|
|
405
|
-
datos_json['operativo'] = parameters.operativo;
|
|
406
|
-
datos_json[procesamiento_1.OperativoGenerator.mainTDPK] = parameters.id_caso;
|
|
407
|
-
function completar_ult_pk_en_arr(ult_pk, ua_arr) {
|
|
408
|
-
var con_pk_completa = ua_arr;
|
|
409
|
-
if (ua_arr && ua_arr.length >= 1) {
|
|
410
|
-
con_pk_completa = con_pk_completa.map((una_ua, i) => {
|
|
411
|
-
una_ua[ult_pk] = i + 1;
|
|
412
|
-
return una_ua;
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
;
|
|
416
|
-
return con_pk_completa;
|
|
417
|
-
}
|
|
418
|
-
function recorrer_datos_agregando_pks(datosj) {
|
|
419
|
-
for (var keyName in datosj) {
|
|
420
|
-
var datoK = datosj[keyName];
|
|
421
|
-
if (datoK instanceof Array && datoK.length >= 1) {
|
|
422
|
-
var pk = tableStructures_app[keyName](context).primaryKey;
|
|
423
|
-
var ult_pk = pk[pk.length - 1];
|
|
424
|
-
datoK = completar_ult_pk_en_arr(ult_pk, datoK);
|
|
425
|
-
datoK.forEach((elemI) => {
|
|
426
|
-
elemI = recorrer_datos_agregando_pks(elemI);
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
;
|
|
430
|
-
if (keyName.startsWith('$') || keyName.startsWith('_')) {
|
|
431
|
-
delete datosj[keyName];
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
return datosj;
|
|
435
|
-
}
|
|
436
|
-
datos_json = recorrer_datos_agregando_pks(datos_json);
|
|
437
|
-
delete datos_json.codRea;
|
|
438
|
-
delete datos_json.codNoRea;
|
|
439
|
-
delete datos_json.resumenEstado;
|
|
440
|
-
delete datos_json.codReaSup;
|
|
441
|
-
delete datos_json.codNoReaSup;
|
|
442
|
-
delete datos_json.resumenEstadoSup;
|
|
443
|
-
if (Object.keys(datos_json).length > 2) {
|
|
444
|
-
var queries = sqlTools.structuredData.sqlWrite(datos_json, struct_dmencu);
|
|
445
|
-
return await queries.reduce(function (promise, query) {
|
|
446
|
-
return promise.then(function () {
|
|
447
|
-
return client.query(query).execute().then(function (result) {
|
|
448
|
-
return 'ok';
|
|
449
|
-
});
|
|
450
|
-
});
|
|
451
|
-
}, Promise.resolve()).then(function () {
|
|
452
|
-
return "ok";
|
|
453
|
-
}).catch(function (err) {
|
|
454
|
-
console.log("caso_guardar ENTRA EN EL CATCH: ", err);
|
|
455
|
-
throw err;
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
else {
|
|
459
|
-
return 'vacio';
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
},
|
|
463
|
-
{
|
|
464
|
-
action: 'caso_traer',
|
|
465
|
-
parameters: [
|
|
466
|
-
//{name:'formulario' , typeName:'text'},
|
|
467
|
-
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
468
|
-
{ name: 'id_caso', typeName: 'text' },
|
|
469
|
-
],
|
|
470
|
-
resultOk: 'goToEnc',
|
|
471
|
-
definedIn: 'dmencu',
|
|
472
|
-
coreFunction: async function (context, parameters) {
|
|
473
|
-
var client = context.client;
|
|
474
|
-
var struct_dmencu = createStructure(context, procesamiento_1.OperativoGenerator.mainTD);
|
|
475
|
-
var sql = sqlTools.structuredData.sqlRead({ operativo: parameters.operativo, vivienda: parameters.id_caso }, struct_dmencu);
|
|
476
|
-
var result = await client.query(sql).fetchUniqueValue();
|
|
477
|
-
var response = {
|
|
478
|
-
operativo: parameters.operativo,
|
|
479
|
-
vivienda: parameters.id_caso,
|
|
480
|
-
datos_caso: result.value,
|
|
481
|
-
//formulario: formPrincipal,
|
|
482
|
-
};
|
|
483
|
-
return response;
|
|
484
|
-
}
|
|
485
|
-
},
|
|
486
|
-
{
|
|
487
|
-
action: 'caso_traer_o_crear',
|
|
488
|
-
parameters: [
|
|
489
|
-
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
490
|
-
{ name: 'id_caso', typeName: 'text' },
|
|
491
|
-
],
|
|
492
|
-
resultOk: 'goToEnc',
|
|
493
|
-
// bitacora:{always:true},
|
|
494
|
-
coreFunction: async function (context, parameters) {
|
|
495
|
-
var be = context.be;
|
|
496
|
-
try {
|
|
497
|
-
var result = await be.procedure['caso_traer'].coreFunction(context, parameters);
|
|
498
|
-
return result;
|
|
499
|
-
}
|
|
500
|
-
catch (err) {
|
|
501
|
-
var json = await be.procedure['caso_preparar'].coreFunction(context, parameters);
|
|
502
|
-
await be.procedure['caso_guardar'].coreFunction(context, (0, best_globals_1.changing)(parameters, { datos_caso: json }));
|
|
503
|
-
return await be.procedure['caso_traer'].coreFunction(context, parameters);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
},
|
|
507
|
-
{
|
|
508
|
-
action: 'pasar_json2ua',
|
|
509
|
-
parameters: [],
|
|
510
|
-
coreFunction: async function (context, _parameters) {
|
|
511
|
-
/* GENERALIZAR: */
|
|
512
|
-
var be = context.be;
|
|
513
|
-
/* FIN-GENERALIZAR: */
|
|
514
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
515
|
-
let resultMain = await context.client.query(`SELECT * FROM ${procesamiento_1.OperativoGenerator.mainTD} LIMIT 1`).fetchAll();
|
|
516
|
-
if (resultMain.rowCount > 0) {
|
|
517
|
-
console.log('HAY DATOS', resultMain.rows);
|
|
518
|
-
throw new Error('HAY DATOS. NO SE PUEDE INICIAR EL PASAJE');
|
|
519
|
-
}
|
|
520
|
-
let resultJson = await context.client.query(`SELECT operativo, enc id_caso, json_encuesta datos_caso from tem
|
|
521
|
-
WHERE operativo=$1 and resumen_estado is distinct from 'vacio' and json_encuesta is not null
|
|
522
|
-
order by enc `, [OPERATIVO]).fetchAll();
|
|
523
|
-
var procedureGuardar = be.procedure.caso_guardar;
|
|
524
|
-
if (procedureGuardar.definedIn != 'dmencu') {
|
|
525
|
-
throw new Error('hay que sobreescribir caso_guardar');
|
|
526
|
-
}
|
|
527
|
-
return Promise.all(resultJson.rows.map(async function (row) {
|
|
528
|
-
let resultado = `id caso ${row.id_caso}: `;
|
|
529
|
-
try {
|
|
530
|
-
await be.inTransaction(null, async function (client) {
|
|
531
|
-
resultado += await procedureGuardar.coreFunction(context, row, client);
|
|
532
|
-
});
|
|
533
|
-
}
|
|
534
|
-
catch (err) {
|
|
535
|
-
let errMessage = resultado + "json2ua error. " + err;
|
|
536
|
-
resultado = errMessage;
|
|
537
|
-
console.log(errMessage);
|
|
538
|
-
}
|
|
539
|
-
if (resultado.includes('ok')) {
|
|
540
|
-
var { datos_caso, vivienda, operativo } = await be.procedure.caso_traer.coreFunction(context, { operativo: row.operativo, id_caso: row.id_caso });
|
|
541
|
-
var verQueGrabo = { datos_caso, vivienda, operativo };
|
|
542
|
-
try {
|
|
543
|
-
discrepances.showAndThrow(verQueGrabo, row);
|
|
544
|
-
}
|
|
545
|
-
catch (err) {
|
|
546
|
-
console.log(verQueGrabo, row);
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
return resultado;
|
|
550
|
-
})).catch(function (err) {
|
|
551
|
-
throw err;
|
|
552
|
-
}).then(function (result) {
|
|
553
|
-
return result;
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
},
|
|
557
|
-
{
|
|
558
|
-
action: 'dm_forpkraiz_cargar',
|
|
559
|
-
parameters: [
|
|
560
|
-
{ name: 'operativo', typeName: 'text' },
|
|
561
|
-
{ name: 'vivienda', typeName: 'text' },
|
|
562
|
-
{ name: 'tarea', typeName: 'text', references: "tareas" },
|
|
563
|
-
],
|
|
564
|
-
coreFunction: async function (context, parameters) {
|
|
565
|
-
var be = context.be;
|
|
566
|
-
var { operativo, vivienda, tarea } = parameters;
|
|
567
|
-
var main_form = (await context.client.query(`select main_form
|
|
568
|
-
from tareas
|
|
569
|
-
where operativo= $1 and tarea=$2`, [operativo, tarea]).fetchUniqueValue()).value;
|
|
570
|
-
var condviv = ` t.operativo= $1 and t.enc =$2`;
|
|
571
|
-
var soloLectura = !!(await context.client.query(`select *
|
|
572
|
-
from tareas_tem join estados using (operativo, estado) --pk estado verificada
|
|
573
|
-
where operativo= $1 and enc = $2 and (
|
|
574
|
-
cargado_dm is not null or
|
|
575
|
-
not permite_editar_encuesta and asignado <> ${context.be.db.quoteLiteral(context.user.idper)}
|
|
576
|
-
)`, [operativo, vivienda]).fetchOneRowIfExists()).rowCount;
|
|
577
|
-
var { row } = await context.client.query(getHdrQuery(condviv, context), [operativo, vivienda]).fetchUniqueRow();
|
|
578
|
-
row.informacionHdr[vivienda].tarea = {
|
|
579
|
-
tarea,
|
|
580
|
-
main_form
|
|
581
|
-
};
|
|
582
|
-
return {
|
|
583
|
-
...row,
|
|
584
|
-
operativo,
|
|
585
|
-
soloLectura,
|
|
586
|
-
idPer: context.user.idper,
|
|
587
|
-
cargas: likeAr.createIndex(row.cargas.map(carga => ({ ...carga, fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null })), 'carga'),
|
|
588
|
-
timestampEstructura: be.caches.timestampEstructura
|
|
589
|
-
};
|
|
590
|
-
}
|
|
591
|
-
},
|
|
592
|
-
{
|
|
593
|
-
action: 'dm_forpkraiz_descargar',
|
|
594
|
-
parameters: [
|
|
595
|
-
{ name: 'operativo', typeName: 'text' },
|
|
596
|
-
{ name: 'persistentes', typeName: 'jsonb' },
|
|
597
|
-
],
|
|
598
|
-
coreFunction: async function (context, parameters) {
|
|
599
|
-
var be = context.be;
|
|
600
|
-
var { operativo, persistentes } = parameters;
|
|
601
|
-
const UA_PRINCIPAL = await getUAPrincipal(context.client, operativo);
|
|
602
|
-
await Promise.all(likeAr(persistentes.respuestas[UA_PRINCIPAL]).map(async (respuestasUAPrincipal, idEnc) => {
|
|
603
|
-
if (respuestasUAPrincipal.s1a1_obs == '!prueba de error al grabar!') {
|
|
604
|
-
throw new Error('DIO PRUEBA DE ERROR AL GRABAR');
|
|
605
|
-
}
|
|
606
|
-
await guardarEncuestaEnTem(context, operativo, idEnc, respuestasUAPrincipal, persistentes.informacionHdr[idEnc].tarea.tarea);
|
|
607
|
-
//guardar paralelamente en tablas ua
|
|
608
|
-
var procedureGuardar = be.procedure.caso_guardar;
|
|
609
|
-
let resultado = `id enc ${idEnc}: `;
|
|
610
|
-
let param_guardar = { operativo: operativo, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
|
|
611
|
-
let errMessage;
|
|
612
|
-
try {
|
|
613
|
-
await be.inTransaction(null, async function (client) {
|
|
614
|
-
resultado += await procedureGuardar.coreFunction(context, param_guardar, client);
|
|
615
|
-
});
|
|
616
|
-
}
|
|
617
|
-
catch (err) {
|
|
618
|
-
errMessage = resultado + "dm_forpkraiz_descargar. " + err;
|
|
619
|
-
resultado = errMessage;
|
|
620
|
-
console.log(errMessage);
|
|
621
|
-
}
|
|
622
|
-
await context.client.query(`update tem
|
|
623
|
-
set pase_tabla= $3
|
|
624
|
-
where operativo= $1 and enc = $2
|
|
625
|
-
returning 'ok'`, [operativo, idEnc, resultado]).fetchUniqueRow();
|
|
626
|
-
}).array());
|
|
627
|
-
return 'ok';
|
|
628
|
-
}
|
|
629
|
-
},
|
|
630
|
-
{
|
|
631
|
-
action: 'dm_sincronizar',
|
|
632
|
-
parameters: [
|
|
633
|
-
{ name: 'persistentes', typeName: 'jsonb' },
|
|
634
|
-
],
|
|
635
|
-
coreFunction: async function (context, parameters) {
|
|
636
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
637
|
-
var be = context.be;
|
|
638
|
-
var { persistentes } = parameters;
|
|
639
|
-
var num_sincro = 0;
|
|
640
|
-
var token = persistentes === null || persistentes === void 0 ? void 0 : persistentes.token;
|
|
641
|
-
if (!token) {
|
|
642
|
-
token = (await be.procedure.token_get.coreFunction(context, {
|
|
643
|
-
useragent: context.session.req.useragent,
|
|
644
|
-
username: context.username
|
|
645
|
-
})).token;
|
|
646
|
-
}
|
|
647
|
-
var { value } = await context.client.query(`
|
|
648
|
-
INSERT INTO sincronizaciones (token, usuario, datos)
|
|
649
|
-
VALUES ($1,$2,$3)
|
|
650
|
-
RETURNING sincro
|
|
651
|
-
`, [token, context.username, persistentes]).fetchUniqueValue();
|
|
652
|
-
num_sincro = value;
|
|
653
|
-
var condviv = `
|
|
654
|
-
tt.operativo= $1
|
|
655
|
-
and asignado = $2
|
|
656
|
-
and tt.operacion='cargar'
|
|
657
|
-
and (tt.cargado_dm is null or tt.cargado_dm = ${context.be.db.quoteLiteral(token)})
|
|
658
|
-
`;
|
|
659
|
-
const UA_PRINCIPAL = await getUAPrincipal(context.client, OPERATIVO);
|
|
660
|
-
if (persistentes) {
|
|
661
|
-
await Promise.all(likeAr(persistentes.respuestas[UA_PRINCIPAL]).map(async (respuestasUAPrincipal, idEnc) => {
|
|
662
|
-
var tarea = persistentes.informacionHdr[idEnc].tarea.tarea;
|
|
663
|
-
var puedoGuardarEnTEM = true;
|
|
664
|
-
var { params, setters } = getSettersAndParametersForReaNoReaResumenEstado({
|
|
665
|
-
tarea,
|
|
666
|
-
respuestasUAPrincipal,
|
|
667
|
-
setters: [
|
|
668
|
-
`estado = ${context.be.db.quoteLiteral(ESTADO_POSTERIOR_DESCARGA)}`,
|
|
669
|
-
`cargado_dm=null`
|
|
670
|
-
],
|
|
671
|
-
params: [OPERATIVO, idEnc, tarea, token]
|
|
672
|
-
});
|
|
673
|
-
var queryTareasTem = await context.client.query(`update tareas_tem
|
|
674
|
-
set ${setters.join(',')}
|
|
675
|
-
where operativo= $1 and enc = $2 and tarea = $3 and cargado_dm = $4
|
|
676
|
-
returning 'ok'`, params).fetchOneRowIfExists();
|
|
677
|
-
puedoGuardarEnTEM = queryTareasTem.rowCount == 1;
|
|
678
|
-
if (puedoGuardarEnTEM) {
|
|
679
|
-
await guardarEncuestaEnTem(context, OPERATIVO, idEnc, respuestasUAPrincipal, tarea);
|
|
680
|
-
//guardar paralelamente en tablas ua
|
|
681
|
-
var procedureGuardar = be.procedure.caso_guardar;
|
|
682
|
-
let resultado = `id enc ${idEnc}: `;
|
|
683
|
-
let param_guardar = { operativo: OPERATIVO, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
|
|
684
|
-
let errMessage;
|
|
685
|
-
try {
|
|
686
|
-
await be.inTransaction(null, async function (client) {
|
|
687
|
-
resultado += await procedureGuardar.coreFunction(context, param_guardar, client);
|
|
688
|
-
});
|
|
689
|
-
}
|
|
690
|
-
catch (err) {
|
|
691
|
-
errMessage = resultado + "dm_forpkraiz_descargar. " + err;
|
|
692
|
-
resultado = errMessage;
|
|
693
|
-
console.log(errMessage);
|
|
694
|
-
}
|
|
695
|
-
await context.client.query(`update tem
|
|
696
|
-
set pase_tabla= $3
|
|
697
|
-
where operativo= $1 and enc = $2
|
|
698
|
-
returning 'ok'`, [OPERATIVO, idEnc, resultado]).fetchUniqueRow();
|
|
699
|
-
}
|
|
700
|
-
else {
|
|
701
|
-
await fs_1.promises.appendFile('local-recibido-sin-token.txt', JSON.stringify({ now: new Date(), user: context.username, idCaso: idEnc, vivienda: respuestasUAPrincipal }) + '\n\n', 'utf8');
|
|
702
|
-
}
|
|
703
|
-
}).array());
|
|
704
|
-
}
|
|
705
|
-
var { row } = await context.client.query(getHdrQuery(condviv, context), [OPERATIVO, context.user.idper]).fetchUniqueRow();
|
|
706
|
-
await context.client.query(`update tareas_tem tt
|
|
707
|
-
set estado = $4, cargado_dm=$3::text
|
|
708
|
-
where ${condviv}
|
|
709
|
-
returning enc`, [OPERATIVO, parameters.enc ? parameters.enc : context.user.idper, token, ESTADO_POSTERIOR_CARGA]).fetchAll();
|
|
710
|
-
return {
|
|
711
|
-
...row,
|
|
712
|
-
operativo: OPERATIVO,
|
|
713
|
-
soloLectura: false,
|
|
714
|
-
token,
|
|
715
|
-
num_sincro,
|
|
716
|
-
idper: context.user.idper,
|
|
717
|
-
cargas: likeAr.createIndex(row.cargas.map(carga => ({ ...carga, fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null, estado_carga: 'relevamiento' })), 'carga')
|
|
718
|
-
};
|
|
719
|
-
}
|
|
720
|
-
},
|
|
721
|
-
{
|
|
722
|
-
action: 'dm_backup',
|
|
723
|
-
parameters: [
|
|
724
|
-
{ name: 'token', typeName: 'text' },
|
|
725
|
-
{ name: 'tem', typeName: 'jsonb' },
|
|
726
|
-
],
|
|
727
|
-
unlogged: true,
|
|
728
|
-
coreFunction: async function (context, parameters) {
|
|
729
|
-
var { be, client } = context;
|
|
730
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
731
|
-
var num_sincro = 0;
|
|
732
|
-
var token = parameters.token;
|
|
733
|
-
if (token == null) {
|
|
734
|
-
return { ok: 'ok:N/T' };
|
|
735
|
-
}
|
|
736
|
-
else {
|
|
737
|
-
var { rowCount } = await client.query(`select 1 from tokens where token = $1`, [token]).fetchOneRowIfExists();
|
|
738
|
-
if (!rowCount) {
|
|
739
|
-
return { ok: 'ok:N/T' };
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
if (parameters.tem) {
|
|
743
|
-
await Promise.all(likeAr(parameters.tem).map(async (backup) => {
|
|
744
|
-
context.client.query(`update tem
|
|
745
|
-
set json_backup = $3, fecha_backup = current_timestamp
|
|
746
|
-
where operativo= $1 and enc = $2 and json_backup is distinct from $4
|
|
747
|
-
returning 'ok'`, [OPERATIVO, backup.forPkRaiz.vivienda, backup.respuestasRaiz, backup.respuestasRaiz]).fetchOneRowIfExists();
|
|
748
|
-
}).array());
|
|
749
|
-
}
|
|
750
|
-
return {
|
|
751
|
-
ok: 'ok'
|
|
752
|
-
};
|
|
753
|
-
}
|
|
754
|
-
},
|
|
755
|
-
{
|
|
756
|
-
action: 'consistir_vivienda',
|
|
757
|
-
parameters: [
|
|
758
|
-
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
759
|
-
{ name: 'vivienda', typeName: 'text' },
|
|
760
|
-
],
|
|
761
|
-
coreFunction: async function (context, parameters) {
|
|
762
|
-
var { be, client } = context;
|
|
763
|
-
let param_proc = {
|
|
764
|
-
operativo: parameters.operativo,
|
|
765
|
-
id_caso: parameters.vivienda
|
|
766
|
-
};
|
|
767
|
-
let errMessage;
|
|
768
|
-
let resultado;
|
|
769
|
-
try {
|
|
770
|
-
resultado = await be.procedure.consistir_encuesta.coreFunction(context, param_proc, client);
|
|
771
|
-
}
|
|
772
|
-
catch (err) {
|
|
773
|
-
errMessage = " consistir_vivienda. " + err;
|
|
774
|
-
console.log(errMessage);
|
|
775
|
-
}
|
|
776
|
-
console.log('****** consistir_vivienda resultado:', resultado);
|
|
777
|
-
return {
|
|
778
|
-
ok: 'ok'
|
|
779
|
-
};
|
|
780
|
-
}
|
|
781
|
-
},
|
|
782
|
-
{
|
|
783
|
-
action: 'dm_rescatar',
|
|
784
|
-
parameters: [
|
|
785
|
-
{ name: 'localStorageItem', typeName: 'jsonb' },
|
|
786
|
-
{ name: 'localStorageItemKey', typeName: 'text' },
|
|
787
|
-
],
|
|
788
|
-
unlogged: true,
|
|
789
|
-
coreFunction: async function (context, params) {
|
|
790
|
-
var { localStorageItemKey, localStorageItem } = params;
|
|
791
|
-
try {
|
|
792
|
-
console.log(localStorageItem);
|
|
793
|
-
await fs_1.promises.appendFile('local-rescate.txt', JSON.stringify({ now: new Date(), user: context.username, itemKey: localStorageItemKey, itemData: localStorageItem }) + '\n\n', 'utf8');
|
|
794
|
-
return 'ok';
|
|
795
|
-
}
|
|
796
|
-
catch (err) {
|
|
797
|
-
console.log('ERROR', err);
|
|
798
|
-
throw err;
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
},
|
|
802
|
-
{
|
|
803
|
-
action: 'operativo_get',
|
|
804
|
-
parameters: [],
|
|
805
|
-
unlogged: true,
|
|
806
|
-
coreFunction: async function (context, _parameters) {
|
|
807
|
-
return (0, exports.getOperativoActual)(context);
|
|
808
|
-
}
|
|
809
|
-
},
|
|
810
|
-
{
|
|
811
|
-
action: 'get_random_free_case',
|
|
812
|
-
parameters: [{ name: 'operativo', typeName: 'text' }],
|
|
813
|
-
coreFunction: async function (context, params) {
|
|
814
|
-
const minsToExpire = 30;
|
|
815
|
-
const minsSinceBloqued = `date_part('min', age(current_timestamp, fecha_bloqueo))`;
|
|
816
|
-
const enc = await context.client.query(`select enc from tem where operativo=$1 and (libre or ${minsSinceBloqued} > ${minsToExpire}) limit 1;`, [params.operativo]).fetchUniqueValue();
|
|
817
|
-
await context.client.query(`UPDATE tem set libre = false, fecha_bloqueo=current_timestamp where operativo=$1 and enc=$2`, [params.operativo, enc.value]).execute();
|
|
818
|
-
return enc.value;
|
|
819
|
-
}
|
|
820
|
-
},
|
|
821
|
-
{
|
|
822
|
-
action: 'muestra_generar',
|
|
823
|
-
parameters: [
|
|
824
|
-
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
825
|
-
{ name: 'area', typeName: 'integer', references: "areas" },
|
|
826
|
-
{ name: 'dominio', typeName: 'integer', defaultValue: 3 },
|
|
827
|
-
{ name: 'cant_encuestas', typeName: 'integer' },
|
|
828
|
-
],
|
|
829
|
-
coreFunction: async function (context, params) {
|
|
830
|
-
const be = context.be;
|
|
831
|
-
var { permite_generar_muestra } = (await context.client.query(`
|
|
832
|
-
select permite_generar_muestra
|
|
833
|
-
from operativos
|
|
834
|
-
where operativo = $1
|
|
835
|
-
`, [params.operativo]).fetchUniqueRow()).row;
|
|
836
|
-
if (permite_generar_muestra) {
|
|
837
|
-
var temTableDef = be.tableStructures['tem'](context);
|
|
838
|
-
for (let i = 0; i < Math.min(params.cant_encuestas, maxAGenerar); i++) {
|
|
839
|
-
let enc = generarIdEncFun(params.area, i);
|
|
840
|
-
await context.client.query(`
|
|
841
|
-
INSERT into tem (operativo, enc, area, dominio, habilitada) values ($1, $2, $3, $4, $5)
|
|
842
|
-
on conflict (${sqlTools.quoteIdentArray(temTableDef.primaryKey).join(',')}) do nothing`, [params.operativo, enc, params.area, params.dominio, true])
|
|
843
|
-
.execute();
|
|
844
|
-
}
|
|
845
|
-
await generarTareasTemFaltantes(context, params.operativo);
|
|
846
|
-
return 'ok';
|
|
847
|
-
}
|
|
848
|
-
else {
|
|
849
|
-
throw Error("el operativo no permite generar muestra");
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
},
|
|
853
|
-
{
|
|
854
|
-
action: 'encuesta_blanquear_previsualizar',
|
|
855
|
-
parameters: [
|
|
856
|
-
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
857
|
-
{ name: 'enc', typeName: 'text' },
|
|
858
|
-
],
|
|
859
|
-
roles: ['coor_proc', 'admin'],
|
|
860
|
-
resultOk: 'mostrar_encuesta_a_blanquear_contenido',
|
|
861
|
-
coreFunction: async function (context, params) {
|
|
862
|
-
try {
|
|
863
|
-
var result = await context.client.query(`
|
|
864
|
-
select *
|
|
865
|
-
from tem
|
|
866
|
-
where operativo = $1 and enc = $2 --pk verificada
|
|
867
|
-
`, [params.operativo, params.enc]).fetchUniqueRow();
|
|
868
|
-
}
|
|
869
|
-
catch (err) {
|
|
870
|
-
throw Error(`No se encontró la encuesta ${params.enc} para el operativo ${params.operativo}. ${err.message}`);
|
|
871
|
-
}
|
|
872
|
-
return { casoTem: result.row };
|
|
873
|
-
}
|
|
874
|
-
},
|
|
875
|
-
{
|
|
876
|
-
action: 'encuesta_blanquear',
|
|
877
|
-
parameters: [
|
|
878
|
-
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
879
|
-
{ name: 'enc', typeName: 'text' },
|
|
880
|
-
],
|
|
881
|
-
roles: ['coor_proc', 'admin'],
|
|
882
|
-
coreFunction: async function (context, params) {
|
|
883
|
-
var be = context.be;
|
|
884
|
-
await context.client.query(`delete
|
|
885
|
-
from ${be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD)}
|
|
886
|
-
where operativo=$1 and ${be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTDPK)} = $2
|
|
887
|
-
`, [params.operativo, params.enc]).execute();
|
|
888
|
-
//paso a encu para guardar en historial
|
|
889
|
-
await context.client.query(`
|
|
890
|
-
update tem
|
|
891
|
-
set
|
|
892
|
-
tarea_actual = 'encu'
|
|
893
|
-
where operativo = $1 and enc = $2 --pk verificada
|
|
894
|
-
returning *
|
|
895
|
-
`, [params.operativo, params.enc]).fetchUniqueRow();
|
|
896
|
-
await context.client.query(`
|
|
897
|
-
delete
|
|
898
|
-
from tareas_tem
|
|
899
|
-
where operativo = $1 and enc = $2
|
|
900
|
-
`, [params.operativo, params.enc]).execute();
|
|
901
|
-
await generarTareasTemFaltantes(context, params.operativo);
|
|
902
|
-
//reseteo tem (no se guarda historial porque tarea_actual es null)
|
|
903
|
-
//guardo backup por las dudas
|
|
904
|
-
await context.client.query(`
|
|
905
|
-
update tem
|
|
906
|
-
set
|
|
907
|
-
json_backup = json_encuesta, json_encuesta = null, tarea_actual = null,
|
|
908
|
-
fecha_modif_encuesta = null, fecha_backup = current_timestamp, modificado = null,
|
|
909
|
-
resumen_estado = null, resumen_estado_sup = null, supervision_dirigida = null,
|
|
910
|
-
pase_tabla = null, rea = null, norea = null, rea_sup = null, norea_sup = null
|
|
911
|
-
where operativo = $1 and enc = $2 --pk verificada
|
|
912
|
-
returning *
|
|
913
|
-
`, [params.operativo, params.enc]).fetchUniqueRow();
|
|
914
|
-
await context.client.query(`
|
|
915
|
-
delete
|
|
916
|
-
from inconsistencias
|
|
917
|
-
where operativo = $1 and ${be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTDPK)} = $2
|
|
918
|
-
`, [params.operativo, params.enc]).execute();
|
|
919
|
-
await context.client.query(`
|
|
920
|
-
delete
|
|
921
|
-
from in_con_var
|
|
922
|
-
where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(procesamiento_1.OperativoGenerator.mainTDPK)} = $2
|
|
923
|
-
`, [params.operativo, params.enc]).execute();
|
|
924
|
-
await context.client.query(`
|
|
925
|
-
delete
|
|
926
|
-
from inconsistencias_ultimas
|
|
927
|
-
where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(procesamiento_1.OperativoGenerator.mainTDPK)} = $2
|
|
928
|
-
`, [params.operativo, params.enc]).execute();
|
|
929
|
-
return `la encuesta ${params.enc} se blanqueó correctamente`;
|
|
930
|
-
}
|
|
931
|
-
},
|
|
932
|
-
{
|
|
933
|
-
action: 'accion_tareas_tem_ejecutar',
|
|
934
|
-
parameters: [
|
|
935
|
-
{ name: 'operativo', typeName: 'text' },
|
|
936
|
-
{ name: 'tarea', typeName: 'text' },
|
|
937
|
-
{ name: 'enc', typeName: 'text' },
|
|
938
|
-
{ name: 'condicion', typeName: 'text' },
|
|
939
|
-
{ name: 'accion', typeName: 'jsonb' },
|
|
940
|
-
],
|
|
941
|
-
coreFunction: async function (context, params) {
|
|
942
|
-
var be = context.be;
|
|
943
|
-
var accion = params.accion;
|
|
944
|
-
var cumple = (await context.client.query(`select accion_cumple_condicion($5, $6, $7, $8, (
|
|
945
|
-
select condicion
|
|
946
|
-
from estados_acciones
|
|
947
|
-
where operativo = $1 and estado = $2 and eaccion = $3 and estado_destino = $4
|
|
948
|
-
)
|
|
949
|
-
)`, [
|
|
950
|
-
params.operativo,
|
|
951
|
-
accion.estado,
|
|
952
|
-
accion.eaccion,
|
|
953
|
-
accion.estado_destino,
|
|
954
|
-
params.operativo,
|
|
955
|
-
accion.estado,
|
|
956
|
-
params.enc,
|
|
957
|
-
accion.eaccion,
|
|
958
|
-
]).fetchUniqueValue()).value;
|
|
959
|
-
if (!cumple) {
|
|
960
|
-
throw Error(`No se pudo ejecutar la acción, no se cumple la condición "${params.condicion}" o bien el estado está desactualizado, refresque la grilla.`);
|
|
961
|
-
}
|
|
962
|
-
var result = await context.client.query(`
|
|
963
|
-
UPDATE tareas_tem
|
|
964
|
-
set estado = $4
|
|
965
|
-
where operativo=$1
|
|
966
|
-
and enc=$2
|
|
967
|
-
and tarea = $3
|
|
968
|
-
returning *`, [
|
|
969
|
-
params.operativo,
|
|
970
|
-
params.enc,
|
|
971
|
-
params.tarea,
|
|
972
|
-
accion.estado_destino
|
|
973
|
-
]).fetchUniqueRow();
|
|
974
|
-
if (accion.nombre_procedure) {
|
|
975
|
-
if (be.procedure[accion.nombre_procedure]) {
|
|
976
|
-
await be.procedure[accion.nombre_procedure].coreFunction(context, params);
|
|
977
|
-
}
|
|
978
|
-
else {
|
|
979
|
-
throw Error(`No existe el procedure "${accion.nombre_procedure}" definido en la tabla "estados_acciones" para el
|
|
980
|
-
operativo: ${accion.operativo}, estado: ${accion.estado}, eaccion: ${accion.eaccion}.`);
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
// BUSCO PASE DE TAREA
|
|
984
|
-
var tareaSiguiente = (await context.client.query(`select *
|
|
985
|
-
from tareas_proximas
|
|
986
|
-
where
|
|
987
|
-
operativo = $1 and
|
|
988
|
-
tarea = $2 and estado = $3 and
|
|
989
|
-
tarea_cumple_condicion($4, $5, $6, $7, condicion)
|
|
990
|
-
order by orden
|
|
991
|
-
limit 1`, [
|
|
992
|
-
params.operativo,
|
|
993
|
-
params.tarea,
|
|
994
|
-
accion.estado_destino,
|
|
995
|
-
params.operativo,
|
|
996
|
-
params.tarea,
|
|
997
|
-
accion.estado_destino,
|
|
998
|
-
params.enc
|
|
999
|
-
]).fetchOneRowIfExists()).row;
|
|
1000
|
-
if (tareaSiguiente) {
|
|
1001
|
-
await context.client.query(`
|
|
1002
|
-
update tem
|
|
1003
|
-
set tarea_actual = $3
|
|
1004
|
-
where operativo = $1 and enc = $2
|
|
1005
|
-
returning *`, [params.operativo, params.enc, tareaSiguiente.tarea_destino]).fetchUniqueRow();
|
|
1006
|
-
let autoAsignado = tareaSiguiente.registra_recepcionista ? context.user.idper : null;
|
|
1007
|
-
let q = context.be.db.quoteLiteral;
|
|
1008
|
-
await context.client.query(`
|
|
1009
|
-
update tareas_tem
|
|
1010
|
-
set ts_entrada = current_timestamp, adelantar = null, estado = $4
|
|
1011
|
-
${autoAsignado ?
|
|
1012
|
-
", recepcionista=" + q(autoAsignado)
|
|
1013
|
-
: ""}
|
|
1014
|
-
where operativo = $1 and enc = $2 and tarea = $3
|
|
1015
|
-
returning *`, [params.operativo, params.enc, tareaSiguiente.tarea_destino, tareaSiguiente.estado_destino]).fetchUniqueRow();
|
|
1016
|
-
if (tareaSiguiente.nombre_procedure) {
|
|
1017
|
-
await be.procedure[tareaSiguiente.nombre_procedure].coreFunction(context, params);
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
// FIN PASE DE TAREA
|
|
1021
|
-
return "ok";
|
|
1022
|
-
}
|
|
1023
|
-
},
|
|
1024
|
-
{
|
|
1025
|
-
action: 'encuesta_carga_preparar',
|
|
1026
|
-
parameters: [
|
|
1027
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1028
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1029
|
-
{ name: 'enc', typeName: 'text' },
|
|
1030
|
-
],
|
|
1031
|
-
coreFunction: async function (context, params) {
|
|
1032
|
-
await context.client.query(`
|
|
1033
|
-
UPDATE tareas_tem
|
|
1034
|
-
set operacion = 'cargar'
|
|
1035
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1036
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1037
|
-
.fetchUniqueRow();
|
|
1038
|
-
return 'ok';
|
|
1039
|
-
}
|
|
1040
|
-
},
|
|
1041
|
-
{
|
|
1042
|
-
action: 'encuesta_disponibilizar',
|
|
1043
|
-
parameters: [
|
|
1044
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1045
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1046
|
-
{ name: 'enc', typeName: 'text' },
|
|
1047
|
-
],
|
|
1048
|
-
coreFunction: async function (context, params) {
|
|
1049
|
-
await context.client.query(`
|
|
1050
|
-
UPDATE tareas_tem
|
|
1051
|
-
set asignado = null
|
|
1052
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1053
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1054
|
-
.fetchUniqueRow();
|
|
1055
|
-
return 'ok';
|
|
1056
|
-
}
|
|
1057
|
-
},
|
|
1058
|
-
{
|
|
1059
|
-
action: 'encuesta_no_cargar',
|
|
1060
|
-
parameters: [
|
|
1061
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1062
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1063
|
-
{ name: 'enc', typeName: 'text' },
|
|
1064
|
-
],
|
|
1065
|
-
coreFunction: async function (context, params) {
|
|
1066
|
-
await context.client.query(`
|
|
1067
|
-
UPDATE tareas_tem
|
|
1068
|
-
set operacion = null
|
|
1069
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1070
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1071
|
-
.fetchUniqueRow();
|
|
1072
|
-
return 'ok';
|
|
1073
|
-
}
|
|
1074
|
-
},
|
|
1075
|
-
{
|
|
1076
|
-
action: 'encuesta_descarga_preparar',
|
|
1077
|
-
parameters: [
|
|
1078
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1079
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1080
|
-
{ name: 'enc', typeName: 'text' },
|
|
1081
|
-
],
|
|
1082
|
-
coreFunction: async function (context, params) {
|
|
1083
|
-
await context.client.query(`
|
|
1084
|
-
UPDATE tareas_tem
|
|
1085
|
-
set operacion = 'descargar'
|
|
1086
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1087
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1088
|
-
.fetchUniqueRow();
|
|
1089
|
-
return 'ok';
|
|
1090
|
-
}
|
|
1091
|
-
},
|
|
1092
|
-
{
|
|
1093
|
-
action: 'encuesta_no_descargar',
|
|
1094
|
-
parameters: [
|
|
1095
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1096
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1097
|
-
{ name: 'enc', typeName: 'text' },
|
|
1098
|
-
],
|
|
1099
|
-
coreFunction: async function (context, params) {
|
|
1100
|
-
await context.client.query(`
|
|
1101
|
-
UPDATE tareas_tem
|
|
1102
|
-
set operacion = 'cargar'
|
|
1103
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1104
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1105
|
-
.fetchUniqueRow();
|
|
1106
|
-
return 'ok';
|
|
1107
|
-
}
|
|
1108
|
-
},
|
|
1109
|
-
{
|
|
1110
|
-
action: 'encuesta_analizar',
|
|
1111
|
-
parameters: [
|
|
1112
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1113
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1114
|
-
{ name: 'enc', typeName: 'text' },
|
|
1115
|
-
],
|
|
1116
|
-
coreFunction: async function (context, params) {
|
|
1117
|
-
var be = context.be;
|
|
1118
|
-
await be.procedure.consistir_encuesta.coreFunction(context, { operativo: params.operativo, id_caso: params.enc });
|
|
1119
|
-
return 'ok';
|
|
1120
|
-
}
|
|
1121
|
-
},
|
|
1122
|
-
{
|
|
1123
|
-
action: 'encuesta_verificar',
|
|
1124
|
-
parameters: [
|
|
1125
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1126
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1127
|
-
{ name: 'enc', typeName: 'text' },
|
|
1128
|
-
],
|
|
1129
|
-
coreFunction: async function (context, params) {
|
|
1130
|
-
await context.client.query(`
|
|
1131
|
-
UPDATE tareas_tem
|
|
1132
|
-
set verificado = '1'
|
|
1133
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1134
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1135
|
-
.fetchUniqueRow();
|
|
1136
|
-
return 'ok';
|
|
1137
|
-
}
|
|
1138
|
-
},
|
|
1139
|
-
{
|
|
1140
|
-
action: 'encuesta_no_verificar',
|
|
1141
|
-
parameters: [
|
|
1142
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1143
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1144
|
-
{ name: 'enc', typeName: 'text' },
|
|
1145
|
-
],
|
|
1146
|
-
coreFunction: async function (context, params) {
|
|
1147
|
-
await context.client.query(`
|
|
1148
|
-
UPDATE tareas_tem
|
|
1149
|
-
set verificado = null
|
|
1150
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1151
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1152
|
-
.fetchUniqueRow();
|
|
1153
|
-
return 'ok';
|
|
1154
|
-
}
|
|
1155
|
-
},
|
|
1156
|
-
{
|
|
1157
|
-
action: 'encuesta_cerrar',
|
|
1158
|
-
parameters: [
|
|
1159
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1160
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1161
|
-
{ name: 'enc', typeName: 'text' },
|
|
1162
|
-
],
|
|
1163
|
-
coreFunction: async function (context, params) {
|
|
1164
|
-
await context.client.query(`
|
|
1165
|
-
UPDATE tareas_tem
|
|
1166
|
-
set verificado = '1', asignado = $4
|
|
1167
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1168
|
-
returning *`, [params.operativo, params.tarea, params.enc, context.user.idper])
|
|
1169
|
-
.fetchUniqueRow();
|
|
1170
|
-
return 'ok';
|
|
1171
|
-
}
|
|
1172
|
-
},
|
|
1173
|
-
{
|
|
1174
|
-
action: 'encuesta_no_cerrar',
|
|
1175
|
-
parameters: [
|
|
1176
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1177
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1178
|
-
{ name: 'enc', typeName: 'text' },
|
|
1179
|
-
],
|
|
1180
|
-
coreFunction: async function (context, params) {
|
|
1181
|
-
await context.client.query(`
|
|
1182
|
-
UPDATE tareas_tem
|
|
1183
|
-
set verificado = null
|
|
1184
|
-
where operativo=$1 and tarea= $2 and enc=$3
|
|
1185
|
-
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1186
|
-
.fetchUniqueRow();
|
|
1187
|
-
return 'ok';
|
|
1188
|
-
}
|
|
1189
|
-
},
|
|
1190
|
-
{
|
|
1191
|
-
action: 'encuesta_supervisar_presencial',
|
|
1192
|
-
parameters: [
|
|
1193
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1194
|
-
{ name: 'enc', typeName: 'text' },
|
|
1195
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1196
|
-
],
|
|
1197
|
-
coreFunction: async function (context, params) {
|
|
1198
|
-
await context.client.query(`
|
|
1199
|
-
UPDATE tem
|
|
1200
|
-
set tarea_actual = $3, supervision_dirigida = $4
|
|
1201
|
-
where operativo=$1 and enc=$2
|
|
1202
|
-
returning *`, [params.operativo, params.enc, 'supe', 1])
|
|
1203
|
-
.fetchUniqueRow();
|
|
1204
|
-
return 'ok';
|
|
1205
|
-
}
|
|
1206
|
-
},
|
|
1207
|
-
{
|
|
1208
|
-
action: 'encuesta_supervisar_telefonica',
|
|
1209
|
-
parameters: [
|
|
1210
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1211
|
-
{ name: 'enc', typeName: 'text' },
|
|
1212
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1213
|
-
],
|
|
1214
|
-
coreFunction: async function (context, params) {
|
|
1215
|
-
await context.client.query(`
|
|
1216
|
-
UPDATE tem
|
|
1217
|
-
set tarea_actual = $3, supervision_dirigida = $4
|
|
1218
|
-
where operativo=$1 and enc=$2
|
|
1219
|
-
returning *`, [params.operativo, params.enc, 'supe', 2])
|
|
1220
|
-
.fetchUniqueRow();
|
|
1221
|
-
return 'ok';
|
|
1222
|
-
}
|
|
1223
|
-
},
|
|
1224
|
-
{
|
|
1225
|
-
action: 'encuesta_no_supervisar',
|
|
1226
|
-
parameters: [
|
|
1227
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1228
|
-
{ name: 'enc', typeName: 'text' },
|
|
1229
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1230
|
-
],
|
|
1231
|
-
coreFunction: async function (context, params) {
|
|
1232
|
-
await context.client.query(`
|
|
1233
|
-
UPDATE tem
|
|
1234
|
-
set tarea_actual = $3, supervision_dirigida = null
|
|
1235
|
-
where operativo=$1 and enc=$2
|
|
1236
|
-
returning *`, [params.operativo, params.enc, 'finc'])
|
|
1237
|
-
.fetchUniqueRow();
|
|
1238
|
-
return 'ok';
|
|
1239
|
-
}
|
|
1240
|
-
},
|
|
1241
|
-
{
|
|
1242
|
-
action: 'encuesta_pasar_a_anac',
|
|
1243
|
-
parameters: [
|
|
1244
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1245
|
-
{ name: 'enc', typeName: 'text' },
|
|
1246
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1247
|
-
],
|
|
1248
|
-
coreFunction: async function (context, params) {
|
|
1249
|
-
await context.client.query(`
|
|
1250
|
-
UPDATE tareas_tem
|
|
1251
|
-
set estado = 'CC'
|
|
1252
|
-
where operativo=$1 and enc=$2 and tarea in ($3,$4) --quiero pasar las 2 tareas a CC
|
|
1253
|
-
`, [params.operativo, params.enc, 'anac', 'proc'])
|
|
1254
|
-
.execute();
|
|
1255
|
-
await context.client.query(`
|
|
1256
|
-
UPDATE tem
|
|
1257
|
-
set tarea_actual = $3
|
|
1258
|
-
where operativo=$1 and enc=$2
|
|
1259
|
-
returning *`, [params.operativo, params.enc, 'anac'])
|
|
1260
|
-
.fetchUniqueRow();
|
|
1261
|
-
return 'ok';
|
|
1262
|
-
}
|
|
1263
|
-
},
|
|
1264
|
-
{
|
|
1265
|
-
action: 'encuesta_no_pasar_a_anac',
|
|
1266
|
-
parameters: [
|
|
1267
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1268
|
-
{ name: 'enc', typeName: 'text' },
|
|
1269
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1270
|
-
],
|
|
1271
|
-
coreFunction: async function (context, params) {
|
|
1272
|
-
await context.client.query(`
|
|
1273
|
-
UPDATE tareas_tem
|
|
1274
|
-
set estado = 'A'
|
|
1275
|
-
where operativo=$1 and enc=$2 and tarea= $3
|
|
1276
|
-
returning *`, [params.operativo, params.enc, 'proc'])
|
|
1277
|
-
.fetchUniqueRow();
|
|
1278
|
-
await context.client.query(`
|
|
1279
|
-
UPDATE tareas_tem
|
|
1280
|
-
set estado = '0D'
|
|
1281
|
-
where operativo=$1 and enc=$2 and tarea= $3
|
|
1282
|
-
returning *`, [params.operativo, params.enc, 'anac'])
|
|
1283
|
-
.fetchUniqueRow();
|
|
1284
|
-
await context.client.query(`
|
|
1285
|
-
UPDATE tem
|
|
1286
|
-
set tarea_actual = $3
|
|
1287
|
-
where operativo=$1 and enc=$2
|
|
1288
|
-
returning *`, [params.operativo, params.enc, 'proc'])
|
|
1289
|
-
.fetchUniqueRow();
|
|
1290
|
-
return 'ok';
|
|
1291
|
-
}
|
|
1292
|
-
},
|
|
1293
|
-
{
|
|
1294
|
-
action: 'encuesta_devolver_proc_desde_anac',
|
|
1295
|
-
parameters: [
|
|
1296
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1297
|
-
{ name: 'enc', typeName: 'text' },
|
|
1298
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1299
|
-
],
|
|
1300
|
-
coreFunction: async function (context, params) {
|
|
1301
|
-
var be = context.be;
|
|
1302
|
-
await be.procedure.encuesta_verificar.coreFunction(context, params);
|
|
1303
|
-
await context.client.query(`
|
|
1304
|
-
UPDATE tareas_tem
|
|
1305
|
-
set estado = 'A'
|
|
1306
|
-
where operativo=$1 and enc=$2 and tarea= $3
|
|
1307
|
-
returning *`, [params.operativo, params.enc, 'proc'])
|
|
1308
|
-
.fetchUniqueRow();
|
|
1309
|
-
await context.client.query(`
|
|
1310
|
-
UPDATE tem
|
|
1311
|
-
set tarea_actual = $3
|
|
1312
|
-
where operativo=$1 and enc=$2
|
|
1313
|
-
returning *`, [params.operativo, params.enc, 'proc'])
|
|
1314
|
-
.fetchUniqueRow();
|
|
1315
|
-
return 'ok';
|
|
1316
|
-
}
|
|
1317
|
-
},
|
|
1318
|
-
{
|
|
1319
|
-
action: 'encuesta_no_devolver_proc_desde_anac',
|
|
1320
|
-
parameters: [
|
|
1321
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1322
|
-
{ name: 'enc', typeName: 'text' },
|
|
1323
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1324
|
-
],
|
|
1325
|
-
coreFunction: async function (context, params) {
|
|
1326
|
-
var be = context.be;
|
|
1327
|
-
await context.client.query(`
|
|
1328
|
-
UPDATE tareas_tem
|
|
1329
|
-
set estado = 'CC'
|
|
1330
|
-
where operativo=$1 and enc=$2 and tarea in ($3,$4) --quiero pasar las 2 tareas a CC
|
|
1331
|
-
`, [params.operativo, params.enc, 'anac', 'proc'])
|
|
1332
|
-
.execute();
|
|
1333
|
-
await be.procedure.encuesta_no_verificar.coreFunction(context, params);
|
|
1334
|
-
return 'ok';
|
|
1335
|
-
}
|
|
1336
|
-
},
|
|
1337
|
-
{
|
|
1338
|
-
action: 'encuesta_recuperar_desde_anac',
|
|
1339
|
-
parameters: [
|
|
1340
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1341
|
-
{ name: 'enc', typeName: 'text' },
|
|
1342
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1343
|
-
],
|
|
1344
|
-
coreFunction: async function (context, params) {
|
|
1345
|
-
var be = context.be;
|
|
1346
|
-
var { operativo, enc, tarea } = params;
|
|
1347
|
-
await be.procedure.encuesta_verificar.coreFunction(context, params);
|
|
1348
|
-
await context.client.query(`
|
|
1349
|
-
update tem
|
|
1350
|
-
set tarea_actual = $3
|
|
1351
|
-
where operativo = $1 and enc = $2
|
|
1352
|
-
returning *`, [operativo, enc, 'recu'])
|
|
1353
|
-
.fetchUniqueRow();
|
|
1354
|
-
return 'ok';
|
|
1355
|
-
}
|
|
1356
|
-
},
|
|
1357
|
-
{
|
|
1358
|
-
action: 'encuesta_no_recuperar_desde_anac',
|
|
1359
|
-
parameters: [
|
|
1360
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1361
|
-
{ name: 'enc', typeName: 'text' },
|
|
1362
|
-
{ name: 'tarea', typeName: 'text' },
|
|
1363
|
-
],
|
|
1364
|
-
coreFunction: async function (context, params) {
|
|
1365
|
-
var be = context.be;
|
|
1366
|
-
var { operativo, enc, tarea } = params;
|
|
1367
|
-
await context.client.query(`
|
|
1368
|
-
update tem
|
|
1369
|
-
set tarea_actual = $4
|
|
1370
|
-
where operativo = $1 and enc = $2 and tarea_actual = $3
|
|
1371
|
-
returning *`, [operativo, enc, 'recu', 'anac'])
|
|
1372
|
-
.fetchUniqueRow();
|
|
1373
|
-
await be.procedure.encuesta_no_verificar.coreFunction(context, params);
|
|
1374
|
-
return 'ok';
|
|
1375
|
-
}
|
|
1376
|
-
},
|
|
1377
|
-
{
|
|
1378
|
-
action: 'encuesta_forzar_tarea',
|
|
1379
|
-
parameters: [
|
|
1380
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1381
|
-
{ name: 'enc', typeName: 'text' },
|
|
1382
|
-
{ name: 'tarea_actual', typeName: 'text' },
|
|
1383
|
-
{ name: 'tarea_nueva', typeName: 'text' },
|
|
1384
|
-
],
|
|
1385
|
-
coreFunction: async function (context, params) {
|
|
1386
|
-
var { operativo, enc, tarea_actual, tarea_nueva } = params;
|
|
1387
|
-
await context.client.query(`
|
|
1388
|
-
update tem
|
|
1389
|
-
set tarea_actual = $4
|
|
1390
|
-
where operativo = $1 and enc = $2 and tarea_actual = $3
|
|
1391
|
-
returning *`, [operativo, enc, tarea_actual, tarea_nueva])
|
|
1392
|
-
.fetchUniqueRow();
|
|
1393
|
-
await context.client.query(`
|
|
1394
|
-
update tareas_tem
|
|
1395
|
-
set estado = 'V'
|
|
1396
|
-
where operativo = $1 and enc = $2 and tarea = $3
|
|
1397
|
-
returning *`, [operativo, enc, tarea_actual])
|
|
1398
|
-
.fetchUniqueRow();
|
|
1399
|
-
await context.client.query(`
|
|
1400
|
-
update tareas_tem
|
|
1401
|
-
set estado = '0D'
|
|
1402
|
-
where operativo = $1 and enc = $2 and tarea = $3
|
|
1403
|
-
returning *`, [operativo, enc, tarea_nueva])
|
|
1404
|
-
.fetchUniqueRow();
|
|
1405
|
-
return 'ok';
|
|
1406
|
-
}
|
|
1407
|
-
},
|
|
1408
|
-
{
|
|
1409
|
-
action: 'encuesta_habilitar_deshabilitar',
|
|
1410
|
-
parameters: [
|
|
1411
|
-
{ name: 'operativo', typeName: 'text' },
|
|
1412
|
-
{ name: 'enc', typeName: 'text' },
|
|
1413
|
-
],
|
|
1414
|
-
coreFunction: async function (context, params) {
|
|
1415
|
-
await context.client.query(`
|
|
1416
|
-
UPDATE tem
|
|
1417
|
-
set habilitada = not habilitada
|
|
1418
|
-
where operativo=$1 and enc=$2
|
|
1419
|
-
returning *`, [params.operativo, params.enc])
|
|
1420
|
-
.fetchUniqueRow();
|
|
1421
|
-
return 'ok';
|
|
1422
|
-
}
|
|
1423
|
-
},
|
|
1424
|
-
{
|
|
1425
|
-
action: exports.ACCION_PASAR_PROIE,
|
|
1426
|
-
parameters: [],
|
|
1427
|
-
coreFunction: async function (context, _params) {
|
|
1428
|
-
let parametros = (await context.client.query(`
|
|
1429
|
-
select * from parametros where unico_registro`, []).fetchUniqueRow()).row;
|
|
1430
|
-
var select = `select t.operativo, t.enc, t.tarea_actual, tt.ts_entrada
|
|
1431
|
-
from tareas_tem tt join tem t using (operativo,enc)
|
|
1432
|
-
where tt.operativo=$1 and tt.tarea= $2 and (${(0, table_tareas_tem_1.getDiasAPasarQuery)('tt')} <= 0 or coalesce(tt.adelantar,false)) and tt.tarea = t.tarea_actual
|
|
1433
|
-
`;
|
|
1434
|
-
await context.client.query(`
|
|
1435
|
-
UPDATE tareas_tem tt
|
|
1436
|
-
set estado = 'V'
|
|
1437
|
-
from (${select}) aux
|
|
1438
|
-
where tt.operativo = aux.operativo and tt.enc = aux.enc and tt.tarea = $3
|
|
1439
|
-
returning *`, [parametros.operativo, 'finc', 'finc'])
|
|
1440
|
-
.fetchAll();
|
|
1441
|
-
//TODO asignar en procesamiento
|
|
1442
|
-
await context.client.query(`
|
|
1443
|
-
UPDATE tareas_tem tt
|
|
1444
|
-
set estado = 'A'
|
|
1445
|
-
from (${select}) aux
|
|
1446
|
-
where tt.operativo = aux.operativo and tt.enc = aux.enc and tt.tarea = $3
|
|
1447
|
-
returning *`, [parametros.operativo, 'finc', 'proc'])
|
|
1448
|
-
.fetchAll();
|
|
1449
|
-
await context.client.query(`
|
|
1450
|
-
update tem t
|
|
1451
|
-
set tarea_actual = 'proc'
|
|
1452
|
-
from (${select}) aux
|
|
1453
|
-
where t.operativo = aux.operativo and t.enc = aux.enc
|
|
1454
|
-
returning *`, [parametros.operativo, 'finc']).fetchAll();
|
|
1455
|
-
return 'ok';
|
|
1456
|
-
}
|
|
1457
|
-
},
|
|
1458
|
-
{
|
|
1459
|
-
action: 'intercambiar_encuestas',
|
|
1460
|
-
parameters: [
|
|
1461
|
-
{ name: 'enc1', references: 'tem', typeName: 'text' },
|
|
1462
|
-
{ name: 'rea1', typeName: 'integer' },
|
|
1463
|
-
{ name: 'cantPerEnc1', typeName: 'integer' },
|
|
1464
|
-
{ name: 'enc2', typeName: 'text' },
|
|
1465
|
-
{ name: 'rea2', typeName: 'integer' },
|
|
1466
|
-
{ name: 'cantPerEnc2', typeName: 'integer' },
|
|
1467
|
-
{ name: 'paso', typeName: 'integer' },
|
|
1468
|
-
{ name: 'confirma', typeName: 'boolean', defaultValue: false, label: 'Confirma intercambio de los datos entre las encuestas? ' },
|
|
1469
|
-
],
|
|
1470
|
-
roles: ['coor_proc', 'coor_campo', 'admin'],
|
|
1471
|
-
progress: true,
|
|
1472
|
-
coreFunction: async function (context, params) {
|
|
1473
|
-
/**
|
|
1474
|
-
* Para controlar:
|
|
1475
|
-
* - que las hogares, personas, etc estén intercambiadas
|
|
1476
|
-
* * tanto en el json
|
|
1477
|
-
* * como en las TDs
|
|
1478
|
-
* - cosas que se calculan por la app? cuales? (resumen_estado, rea y norea)
|
|
1479
|
-
*/
|
|
1480
|
-
var param_cantper = [params.cantPerEnc1, params.cantPerEnc2];
|
|
1481
|
-
var param_rea = [params.rea1, params.rea2];
|
|
1482
|
-
if (!params.confirma) {
|
|
1483
|
-
throw new Error('No confirmó intercambio');
|
|
1484
|
-
}
|
|
1485
|
-
if (!params.enc1 || !params.enc2) {
|
|
1486
|
-
throw new Error('Error, Falta ingresar un numero de encuesta!');
|
|
1487
|
-
}
|
|
1488
|
-
if (params.enc1 == params.enc2) {
|
|
1489
|
-
throw new Error('Error, enc1 y enc2 deben ser distintos!');
|
|
1490
|
-
}
|
|
1491
|
-
if ([1, 2].includes(params.paso)) {
|
|
1492
|
-
throw new Error('Error, paso debe ser 1(eliminar datos ) )o 2 (intercambio y regeneracion datos)');
|
|
1493
|
-
}
|
|
1494
|
-
if (params.paso == 1) {
|
|
1495
|
-
param_cantper.forEach((nper, i) => {
|
|
1496
|
-
if (!nper) {
|
|
1497
|
-
throw new Error(`Error, Cantidad de Personas Total de enc${i + 1}, no esta ingresado!`);
|
|
1498
|
-
}
|
|
1499
|
-
});
|
|
1500
|
-
}
|
|
1501
|
-
param_rea.forEach((r, i) => {
|
|
1502
|
-
if (!r) {
|
|
1503
|
-
throw new Error(`Error, rea de enc${i + 1}, no esta ingresado!`);
|
|
1504
|
-
}
|
|
1505
|
-
});
|
|
1506
|
-
// CONTROLAR QUE NINGUNA DE LAS 2 encuestas ESTE CARGADA, ABIERTA FALTA
|
|
1507
|
-
const OPERATIVO = await (0, exports.getOperativoActual)(context);
|
|
1508
|
-
const UA_PRINC = context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTD);
|
|
1509
|
-
const pk_UA_PRINC = context.be.db.quoteIdent(procesamiento_1.OperativoGenerator.mainTDPK);
|
|
1510
|
-
const datos_control = (await context.client.query(`
|
|
1511
|
-
select ${pk_UA_PRINC}, rea, count(*)np
|
|
1512
|
-
from tem t left join personas p on t.operativo=p.operativo and t.enc=p.${pk_UA_PRINC}
|
|
1513
|
-
where p.operativo=$1 and ${pk_UA_PRINC} IN ($2,$3)
|
|
1514
|
-
group by ${pk_UA_PRINC}, rea
|
|
1515
|
-
order by ${pk_UA_PRINC}
|
|
1516
|
-
`, [OPERATIVO, params.enc1, params.enc2]).fetchAll()).rows;
|
|
1517
|
-
datos_control.forEach((dc, i) => {
|
|
1518
|
-
if (param_cantper[i] !== dc.np) {
|
|
1519
|
-
var xmens = `Error, no coincide la cantidad de personas de enc${i + 1}`;
|
|
1520
|
-
throw new Error(xmens);
|
|
1521
|
-
}
|
|
1522
|
-
;
|
|
1523
|
-
if (param_rea[i] !== dc.rea) {
|
|
1524
|
-
var xmens = `Error, no coincide la rea de enc${i + 1}`;
|
|
1525
|
-
throw new Error(xmens);
|
|
1526
|
-
}
|
|
1527
|
-
;
|
|
1528
|
-
});
|
|
1529
|
-
var datos_tem = (await context.client.query(`
|
|
1530
|
-
select t.enc, tarea_actual, json_encuesta, estado
|
|
1531
|
-
from tem t left join tareas_tem tt on t.operativo=tt.operativo and t.enc=tt.enc and t.tarea_actual=tt.tarea
|
|
1532
|
-
where t.operativo=$1 and t.enc in ($2,$3)
|
|
1533
|
-
order by t.enc
|
|
1534
|
-
`, [OPERATIVO, params.enc1, params.enc2]).fetchAll()).rows;
|
|
1535
|
-
//FALTA controlar estado y tarea_actual
|
|
1536
|
-
/*
|
|
1537
|
-
datos_tem.forEach((dt,i)=>{
|
|
1538
|
-
if (!(['P'].includes(dt[i].estado)|| ['proc','finc','anac'].includes(dt[i].tarea_actual))) {
|
|
1539
|
-
var xmens=`Error, solo se puede intercambiar encuestas en tarea proc, finc, anac or en estado P, enc${i+1}`;
|
|
1540
|
-
throw new Error(xmens);
|
|
1541
|
-
}
|
|
1542
|
-
})
|
|
1543
|
-
*/
|
|
1544
|
-
if (datos_tem.length != 2) {
|
|
1545
|
-
throw new Error('Error, No se encontraron 2 encuestas');
|
|
1546
|
-
}
|
|
1547
|
-
else {
|
|
1548
|
-
if (params.paso == 1) {
|
|
1549
|
-
// limpia las TDs
|
|
1550
|
-
for (let dtem of datos_tem) {
|
|
1551
|
-
await context.client.query(`delete from ${UA_PRINC} where operativo=$1 and ${pk_UA_PRINC}=$2`, [OPERATIVO, dtem.enc]).execute();
|
|
1552
|
-
}
|
|
1553
|
-
}
|
|
1554
|
-
else if (params.paso == 2) {
|
|
1555
|
-
const cant_viv = (await context.client.query(`
|
|
1556
|
-
select count(*) nviv
|
|
1557
|
-
from ${pk_UA_PRINC}
|
|
1558
|
-
where p.operativo=$1 and ${pk_UA_PRINC} IN ($2,$3)
|
|
1559
|
-
`, [OPERATIVO, params.enc1, params.enc2]).fetchUniqueValue()).value;
|
|
1560
|
-
if (cant_viv == 0) {
|
|
1561
|
-
//simula guardado
|
|
1562
|
-
let enc1 = datos_tem[0];
|
|
1563
|
-
let enc2 = datos_tem[1];
|
|
1564
|
-
await simularGuardadoDeEncuestaDesdeAppEscritorio(context, OPERATIVO, enc1.enc, enc2.tarea_actual, enc2.json_encuesta);
|
|
1565
|
-
await simularGuardadoDeEncuestaDesdeAppEscritorio(context, OPERATIVO, enc2.enc, enc1.tarea_actual, enc1.json_encuesta);
|
|
1566
|
-
//hacer intercambio del estado de la encuesta
|
|
1567
|
-
await context.client.query(`update tareas_tem
|
|
1568
|
-
set estado=$4,asignado=$5
|
|
1569
|
-
where operativo=$1 and enc=$2 and tarea=$3 `, [OPERATIVO, enc1.enc, enc2.tarea_actual, enc2.estado, enc2.asignado]).execute();
|
|
1570
|
-
await context.client.query(`update tareas_tem
|
|
1571
|
-
set estado=$4,asignado=$5
|
|
1572
|
-
where operativo=$1 and enc=$2 and tarea=$3 `, [OPERATIVO, enc2.enc, enc1.tarea_actual, enc1.estado, enc1.asignado]).execute();
|
|
1573
|
-
//hacer backup
|
|
1574
|
-
}
|
|
1575
|
-
else {
|
|
1576
|
-
throw new Error('Error, Falta realizar paso 1!');
|
|
1577
|
-
}
|
|
1578
|
-
}
|
|
1579
|
-
else {
|
|
1580
|
-
throw new Error('Error, paso no considerado!');
|
|
1581
|
-
}
|
|
1582
|
-
}
|
|
1583
|
-
return (`Listo paso ${params.paso}. Intercambio realizado entre las encuestas ${params.enc1} y ${params.enc2}. Por favor consista la encuesta`);
|
|
1584
|
-
}
|
|
1585
|
-
},
|
|
1586
|
-
{
|
|
1587
|
-
action: 'encuestador_dms_mostrar',
|
|
1588
|
-
parameters: [
|
|
1589
|
-
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
1590
|
-
{ name: 'encuestador', typeName: 'text' },
|
|
1591
|
-
],
|
|
1592
|
-
roles: ['coor_proc', 'admin'],
|
|
1593
|
-
resultOk: 'mostrar_encuestas_a_blanquear',
|
|
1594
|
-
coreFunction: async function (context, params) {
|
|
1595
|
-
var result = await context.client.query(`
|
|
1596
|
-
select *
|
|
1597
|
-
from tareas_tem
|
|
1598
|
-
where operativo=$1 and asignado = $2 and cargado_dm is not null
|
|
1599
|
-
order by cargado_dm
|
|
1600
|
-
`, [params.operativo, params.encuestador])
|
|
1601
|
-
.fetchAll();
|
|
1602
|
-
if (result.rowCount == 0) {
|
|
1603
|
-
throw Error(`No se encontraron encuestas cargadas en un DM para el operativo ${params.operativo}, encuestador ${params.encuestador}`);
|
|
1604
|
-
}
|
|
1605
|
-
return { rows: result.rows, operativo: params.operativo };
|
|
1606
|
-
}
|
|
1607
|
-
},
|
|
1608
|
-
{
|
|
1609
|
-
action: 'dm_blanquear',
|
|
1610
|
-
parameters: [
|
|
1611
|
-
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
1612
|
-
{ name: 'token', typeName: 'text' },
|
|
1613
|
-
],
|
|
1614
|
-
roles: ['coor_proc', 'admin'],
|
|
1615
|
-
coreFunction: async function (context, params) {
|
|
1616
|
-
var be = context.be;
|
|
1617
|
-
const UA_PRINCIPAL = await getUAPrincipal(context.client, params.operativo);
|
|
1618
|
-
let tareasTemResult = await context.client.query(`
|
|
1619
|
-
UPDATE tareas_tem
|
|
1620
|
-
set cargado_dm = null, operacion = 'descargar', estado = $3
|
|
1621
|
-
where operativo=$1 and cargado_dm = $2
|
|
1622
|
-
returning *`, [params.operativo, params.token, ESTADO_POSTERIOR_DESCARGA])
|
|
1623
|
-
.fetchAll();
|
|
1624
|
-
if (tareasTemResult.rowCount == 0) {
|
|
1625
|
-
throw (0, console_1.error)('No se blanqueó ninguna encuesta');
|
|
1626
|
-
}
|
|
1627
|
-
for (let tt of tareasTemResult.rows) {
|
|
1628
|
-
tt.result_blanqueo = `enc ${tt.enc} se blanqueó correctamente.`;
|
|
1629
|
-
let resultBackup = await context.client.query(`
|
|
1630
|
-
UPDATE tem
|
|
1631
|
-
set json_encuesta = json_backup, fecha_modif_encuesta = fecha_backup
|
|
1632
|
-
where operativo=$1 and enc=$2 and fecha_backup > coalesce(fecha_modif_encuesta, '1900-01-01') and json_backup is not null
|
|
1633
|
-
returning *`, [tt.operativo, tt.enc])
|
|
1634
|
-
.fetchOneRowIfExists();
|
|
1635
|
-
if (resultBackup.rowCount) {
|
|
1636
|
-
tt.result_blanqueo += ` Se restableció el backup con fecha ${resultBackup.row.fecha_backup.toYmdHms()}.`;
|
|
1637
|
-
var { params: queryParams, setters } = getSettersAndParametersForReaNoReaResumenEstado({
|
|
1638
|
-
tarea: tt.tarea,
|
|
1639
|
-
respuestasUAPrincipal: resultBackup.row.json_encuesta,
|
|
1640
|
-
setters: [],
|
|
1641
|
-
params: [tt.operativo, tt.enc, tt.tarea]
|
|
1642
|
-
});
|
|
1643
|
-
await context.client.query(`update tareas_tem
|
|
1644
|
-
set ${setters.join(',')}
|
|
1645
|
-
where operativo= $1 and enc = $2 and tarea = $3
|
|
1646
|
-
returning 'ok'`, queryParams).fetchUniqueRow();
|
|
1647
|
-
await simularGuardadoDeEncuestaDesdeAppEscritorio(context, resultBackup.row.operativo, resultBackup.row.enc, tt.tarea, resultBackup.row.json_encuesta);
|
|
1648
|
-
}
|
|
1649
|
-
}
|
|
1650
|
-
return tareasTemResult.rows;
|
|
1651
|
-
}
|
|
1652
|
-
},
|
|
1653
|
-
];
|
|
1654
|
-
});
|
|
1655
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29waWFyICgyKSBwcm9jZWR1cmVzLWRtZW5jdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvQ29waWFyICgyKSBwcm9jZWR1cmVzLWRtZW5jdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBSWIsa0NBQWtDO0lBQ2xDLGlEQUErQjtJQUcvQixpREFBa0Q7SUFFbEQseURBQThDO0lBRTlDLCtDQUE2QztJQUM3QywyQkFBbUM7SUFFbkMsZ0RBQWdEO0lBR2hELHlEQUF3RDtJQUN4RCxxQ0FBZ0M7SUFHaEMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVwQyxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFM0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDO0lBRTdCLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0lBQ25DLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0lBSXRDLElBQUksZUFBZ0MsQ0FBQztJQUVyQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUE7SUFFYixNQUFNLGtCQUFrQixHQUFHLENBQUMsR0FBbUIsRUFBQyxFQUFFLENBQ3JELGVBQWUsR0FBRyxHQUFHLENBQUM7SUFEYixRQUFBLGtCQUFrQixzQkFDTDtJQUVuQixNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQVUsRUFBQyxFQUFFLENBQ3hDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFEVCxRQUFBLGNBQWMsa0JBQ0w7SUFFdEIsSUFBQSwwQkFBa0IsRUFBQyxDQUFDLElBQVcsRUFBQyxLQUFZLEVBQUMsRUFBRSxDQUFBLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFR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LDJDQUEyQyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7b0JBQ3pKLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDaEMsQ0FBQztTQUNKO0tBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgUHJvY2VkdXJlRGVmLCBUYWJsZURlZmluaXRpb24sIENsaWVudCwgVGFibGVEZWZpbml0aW9ucyB9IGZyb20gXCIuL3R5cGVzLWRtZW5jdVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmVDb250ZXh0LCBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzLCBGb3JlaWduS2V5IH0gZnJvbSBcIm1ldGEtZW5jXCI7XHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy1kbWVuY3VcIjtcclxuaW1wb3J0IHsgSWRVbmlkYWRBbmFsaXNpcywgVW5pZGFkQW5hbGlzaXMsIEVzdGFkb0FjY2lvbiwgSWRFbmMsIElkVGFyZWEsIFJlc3B1ZXN0YXNSYWl6LCBJZE9wZXJhdGl2byB9IGZyb20gXCIuLi91bmxvZ2dlZC90aXBvc1wiO1xyXG5cclxuaW1wb3J0IHtPcGVyYXRpdm9HZW5lcmF0b3IgfSBmcm9tIFwicHJvY2VzYW1pZW50b1wiO1xyXG5cclxuaW1wb3J0IHtqc29uLCBqc29ub30gZnJvbSBcInBnLXByb21pc2Utc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQge2NoYW5naW5nLCBkYXRlIH0gZnJvbSAnYmVzdC1nbG9iYWxzJztcclxuaW1wb3J0IHtwcm9taXNlcyBhcyAgZnN9IGZyb20gXCJmc1wiO1xyXG5cclxuaW1wb3J0ICogYXMgRXhwcmVzaW9uUGFyc2VyIGZyb20gJ2V4cHJlLXBhcnNlcic7XHJcbmltcG9ydCB7IHRhcmVhcyB9IGZyb20gXCIuL3RhYmxlLXRhcmVhc1wiO1xyXG5pbXBvcnQgeyBwcmVwZW5kTGlzdGVuZXIgfSBmcm9tIFwicHJvY2Vzc1wiO1xyXG5pbXBvcnQgeyBnZXREaWFzQVBhc2FyUXVlcnkgfSBmcm9tIFwiLi90YWJsZS10YXJlYXNfdGVtXCI7XHJcbmltcG9ydCB7IGVycm9yIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJ2bVwiO1xyXG5cclxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbnZhciBzcWxUb29scyA9IHJlcXVpcmUoJ3NxbC10b29scycpO1xyXG5cclxudmFyIGRpc2NyZXBhbmNlcyA9IHJlcXVpcmUoJ2Rpc2NyZXBhbmNlcycpO1xyXG5cclxuY29uc3QgZm9ybVByaW5jaXBhbCA9ICdGOkYxJztcclxuXHJcbmNvbnN0IEVTVEFET19QT1NURVJJT1JfQ0FSR0EgPSAnQyc7XHJcbmNvbnN0IEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0EgPSAnRCc7XHJcblxyXG5leHBvcnQgdHlwZSBnZW5lcmFySWRFbmNGdW4gPSAoYXJlYTpudW1iZXIsaW5kZXg6bnVtYmVyKT0+c3RyaW5nXHJcblxyXG52YXIgZ2VuZXJhcklkRW5jRnVuOiBnZW5lcmFySWRFbmNGdW47ICBcclxuXHJcbnZhciBtYXhBR2VuZXJhciA9IDUwXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0R2VuZXJhcklkRW5jRnVuID0gKGZ1bjpnZW5lcmFySWRFbmNGdW4pPT5cclxuICAgIGdlbmVyYXJJZEVuY0Z1biA9IGZ1bjtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNYXhBZ2VuZXJhciA9IChtYXg6bnVtYmVyKT0+XHJcbiAgICBtYXhBR2VuZXJhciA9IG1heDtcclxuXHJcbnNldEdlbmVyYXJJZEVuY0Z1bigoYXJlYTpudW1iZXIsaW5kZXg6bnVtYmVyKT0+YXJlYS50b1N0cmluZygpICsgKGluZGV4KzEwKS50b1N0cmluZygpKTtcclxuXHJcbnNldE1heEFnZW5lcmFyKDEwMCk7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0T3BlcmF0aXZvQWN0dWFsID0gYXN5bmMgKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCk9PntcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgcmVzdWx0ID0gYXdhaXQgYmUucHJvY2VkdXJlLnRhYmxlX2RhdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQse3RhYmxlOiBgcGFyYW1ldHJvc2AsIGZpeGVkRmllbGRzOltdfSk7XHJcbiAgICBpZihyZXN1bHRbMF0/Lm9wZXJhdGl2byl7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFswXS5vcGVyYXRpdm9cclxuICAgIH1lbHNle1xyXG4gICAgICAgIHRocm93IEVycm9yICgnbm8gc2UgY29uZmlndXLDsyB1biBvcGVyYXRpdm8gZW4gbGEgdGFibGEgcGFyw6FtZXRyb3MnKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qZGVmaW5pY2nDs24gZGUgZXN0cnVjdHVyYSBjb21wbGV0YSwgY3VhbmRvIGV4aXN0YSBpbmctZW5jIGhheSBxdWUgcG9uZXJsbyBhaMOtKi8gXHJcbnR5cGUgRXN0cnVjdHVyYVRhYmxhPXt0YWJsZU5hbWU6c3RyaW5nLCBwa0ZpZWxkczp7ZmllbGROYW1lOnN0cmluZ31bXSwgY2hpbGRUYWJsZXM6RXN0cnVjdHVyYVRhYmxhW119O1xyXG5mdW5jdGlvbiBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCB0YWJsZU5hbWU6c3RyaW5nKXtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgbWFpblRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbiA9IGJlLnRhYmxlU3RydWN0dXJlc1t0YWJsZU5hbWVdKGNvbnRleHQpO1xyXG4gICAgdmFyIGdldFBrRnJvbVRhYmxlRGVmID0gZnVuY3Rpb24gZ2V0UGtGcm9tVGFibGVEZWYodGFibGVEZWY6VGFibGVEZWZpbml0aW9uKXtcclxuICAgICAgICByZXR1cm4gdGFibGVEZWYucHJpbWFyeUtleS5tYXAoZnVuY3Rpb24ocGspe1xyXG4gICAgICAgICAgICByZXR1cm4ge2ZpZWxkTmFtZTpwa307XHJcbiAgICAgICAgfSlcclxuICAgIH07XHJcbiAgICB2YXIgZ2V0RmtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRGa0Zyb21UYWJsZURlZih0YWJsZURlZjpUYWJsZURlZmluaXRpb24sIHBhcmVudFRhYmxlTmFtZTogc3RyaW5nKXtcclxuICAgICAgICAvLyByZXR1cm4gdGFibGVEZWYuZm9yZWlnbktleXM/IHRhYmxlRGVmLmZvcmVpZ25LZXlzLm1hcChmaz0+ZmsuZmllbGRzKTogW107XHJcbiAgICAgICAgbGV0IHBhcmVudEZrID0gKDxGb3JlaWduS2V5W10+IHRhYmxlRGVmLmZvcmVpZ25LZXlzKS5maW5kKGZrPT5may5yZWZlcmVuY2VzID09IHBhcmVudFRhYmxlTmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudEZrPyBwYXJlbnRGay5maWVsZHM6IFtdO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0cnVjdDpFc3RydWN0dXJhVGFibGE9e1xyXG4gICAgICAgIHRhYmxlTmFtZTptYWluVGFibGVEZWYubmFtZSxcclxuICAgICAgICBwa0ZpZWxkczpnZXRQa0Zyb21UYWJsZURlZihtYWluVGFibGVEZWYpLFxyXG4gICAgICAgIGNoaWxkVGFibGVzOltdXHJcbiAgICB9O1xyXG4gICAgaWYobWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcyAmJiBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmxlbmd0aCl7XHJcbiAgICAgICAgbWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGRldGFpbFRhYmxlKXtcclxuICAgICAgICAgICAgc3RydWN0LmNoaWxkVGFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICBjaGFuZ2luZyhcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgZGV0YWlsVGFibGUudGFibGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHtma0ZpZWxkczogZ2V0RmtGcm9tVGFibGVEZWYoYmUudGFibGVTdHJ1Y3R1cmVzW2RldGFpbFRhYmxlLnRhYmxlXShjb250ZXh0KSwgdGFibGVOYW1lKX1cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cnVjdDtcclxufVxyXG4vKiBmaW4gZGVmaW5pY2lvbiBlc3RydWN0dXJhIGNvbXBsZXRhICovXHJcblxyXG50eXBlIEFueU9iamVjdCA9IHtbazpzdHJpbmddOmFueX1cclxuXHJcbnZhciBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyA9IChmdW5QYXJhbXM6e3RhcmVhOklkVGFyZWEsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDpSZXNwdWVzdGFzUmFpeiwgc2V0dGVyczpzdHJpbmdbXSwgcGFyYW1zOmFueVtdfSk9PntcclxuICAgIGxldCB7dGFyZWEscmVzcHVlc3Rhc1VBUHJpbmNpcGFsLHNldHRlcnMscGFyYW1zfSA9IGZ1blBhcmFtcztcclxuICAgIGxldCB7cmVzdW1lbkVzdGFkb1N1cCwgY29kTm9SZWFTdXAsIGNvZFJlYVN1cCwgcmVzdW1lbkVzdGFkbywgY29kTm9SZWEsIGNvZFJlYX0gPSByZXNwdWVzdGFzVUFQcmluY2lwYWw7XHJcbiAgICBzZXR0ZXJzID0gc2V0dGVycy5jb25jYXQoW1xyXG4gICAgICAgIGByZXN1bWVuX2VzdGFkbyR7dGFyZWE9PSdzdXBlJz8nX3N1cCc6Jyd9PSQke3BhcmFtcy5sZW5ndGgrMX1gLFxyXG4gICAgICAgIGBub3JlYSR7dGFyZWE9PSdzdXBlJz8nX3N1cCc6Jyd9PSQke3BhcmFtcy5sZW5ndGgrMn1gLFxyXG4gICAgICAgIGByZWEke3RhcmVhPT0nc3VwZSc/J19zdXAnOicnfT0kJHtwYXJhbXMubGVuZ3RoKzN9YFxyXG4gICAgXSlcclxuICAgIHBhcmFtcyA9IHBhcmFtcy5jb25jYXQoW1xyXG4gICAgICAgIHRhcmVhPT0nc3VwZSc/cmVzdW1lbkVzdGFkb1N1cDpyZXN1bWVuRXN0YWRvLFxyXG4gICAgICAgIHRhcmVhPT0nc3VwZSc/Y29kTm9SZWFTdXA6Y29kTm9SZWEsXHJcbiAgICAgICAgdGFyZWE9PSdzdXBlJz9jb2RSZWFTdXA6Y29kUmVhXHJcbiAgICBdKTtcclxuICAgIHJldHVybiB7c2V0dGVycyxwYXJhbXN9XHJcbn1cclxuXHJcbnZhciBndWFyZGFyRW5jdWVzdGFFblRlbSA9IGFzeW5jIChjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIG9wZXJhdGl2bzpJZE9wZXJhdGl2bywgaWRFbmM6SWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDpSZXNwdWVzdGFzUmFpeiwgdGFyZWE6SWRUYXJlYSk9PntcclxuICAgIHZhciB7cGFyYW1zLHNldHRlcnN9ID0gZ2V0U2V0dGVyc0FuZFBhcmFtZXRlcnNGb3JSZWFOb1JlYVJlc3VtZW5Fc3RhZG8oe1xyXG4gICAgICAgIHRhcmVhLFxyXG4gICAgICAgIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCxcclxuICAgICAgICBzZXR0ZXJzOiBbYGpzb25fZW5jdWVzdGEgPSAkM2AsIGBmZWNoYV9tb2RpZl9lbmN1ZXN0YSA9IGN1cnJlbnRfdGltZXN0YW1wYF0sXHJcbiAgICAgICAgcGFyYW1zOiBbb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsXVxyXG4gICAgfSlcclxuICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICBzZXQgJHtzZXR0ZXJzLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgXHJcbiAgICAgICAgLFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG59XHJcblxyXG52YXIgc2ltdWxhckd1YXJkYWRvRGVFbmN1ZXN0YURlc2RlQXBwRXNjcml0b3JpbyA9IGFzeW5jIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0ICxvcGVyYXRpdm86IHN0cmluZywgZW5jOiBJZEVuYywgdGFyZWE6IElkVGFyZWEsIGpzb25fZW5jdWVzdGE6YW55ICk9PntcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSBhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgb3BlcmF0aXZvKTtcclxuICAgIHJldHVybiBhd2FpdCBiZS5wcm9jZWR1cmUuZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci5jb3JlRnVuY3Rpb24oXHJcbiAgICAgICAgY29udGV4dCwgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvcGVyYXRpdm86b3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgcGVyc2lzdGVudGVzOntcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXM6e1xyXG4gICAgICAgICAgICAgICAgICAgIFtVQV9QUklOQ0lQQUxdOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmNdOiBqc29uX2VuY3Vlc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGluZm9ybWFjaW9uSGRyOntcclxuICAgICAgICAgICAgICAgICAgICBbZW5jXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIClcclxufVxyXG5cclxudmFyIGdldEhkclF1ZXJ5ID0gIGZ1bmN0aW9uIGdldEhkclF1ZXJ5KHF1b3RlZENvbmRWaXY6c3RyaW5nLCBjb250ZXh0OkNvbnRleHQpe1xyXG4gICAgcmV0dXJuIGBcclxuICAgIHdpdGggJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCl9IGFzIFxyXG4gICAgICAgIChzZWxlY3QgdC5lbmMsIHQuanNvbl9lbmN1ZXN0YSBhcyByZXNwdWVzdGFzLCB0LnJlc3VtZW5fZXN0YWRvIGFzIFwicmVzdW1lbkVzdGFkb1wiLCBcclxuICAgICAgICAgICAganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJ2RvbWluaW8nICAgICAgICwgZG9taW5pbyAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnbm9tY2FsbGUnICAgICAgLCBub21jYWxsZSAgICAgICxcclxuICAgICAgICAgICAgICAgICdzZWN0b3InICAgICAgICAsIHNlY3RvciAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ2VkaWZpY2lvJyAgICAgICwgZWRpZmljaW8gICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZW50cmFkYScgICAgICAgLCBlbnRyYWRhICAgICAgICxcclxuICAgICAgICAgICAgICAgICducm9jYXRhc3RyYWwnICAsIG5yb2NhdGFzdHJhbCAgLFxyXG4gICAgICAgICAgICAgICAgJ3Bpc28nICAgICAgICAgICwgcGlzbyAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZGVwYXJ0YW1lbnRvJyAgLCBkZXBhcnRhbWVudG8gICxcclxuICAgICAgICAgICAgICAgICdoYWJpdGFjaW9uJyAgICAsIGhhYml0YWNpb24gICAgLFxyXG4gICAgICAgICAgICAgICAgJ2Nhc2EnICAgICAgICAgICwgY2FzYSAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAncHJpb3JpZGFkJyAgICAgLCByZXNlcnZhKzEgICAgICxcclxuICAgICAgICAgICAgICAgICdvYnNlcnZhY2lvbmVzJyAsIHR0LmNhcmdhX29ic2VydmFjaW9uZXMgLFxyXG4gICAgICAgICAgICAgICAgJ2NpdGEnICAgICAgICAgICwgY2l0YSAsXHJcbiAgICAgICAgICAgICAgICAnY2FyZ2EnICAgICAgICAgLCB0LmFyZWEgICAgICAgICBcclxuICAgICAgICAgICAgKSBhcyB0ZW0sIHQuYXJlYSxcclxuICAgICAgICAgICAgLS1UT0RPOiBHRU5FUkFMSVpBUlxyXG4gICAgICAgICAgICBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAndGFyZWEnLCB0dC50YXJlYSxcclxuICAgICAgICAgICAgICAgICdmZWNoYV9hc2lnbmFjaW9uJywgZmVjaGFfYXNpZ25hY2lvbixcclxuICAgICAgICAgICAgICAgICdhc2lnbmFkbycsIGFzaWduYWRvLFxyXG4gICAgICAgICAgICAgICAgJ21haW5fZm9ybScsIG1haW5fZm9ybVxyXG4gICAgICAgICAgICApIGFzIHRhcmVhLFxyXG4gICAgICAgICAgICBtaW4oZmVjaGFfYXNpZ25hY2lvbikgYXMgZmVjaGFfYXNpZ25hY2lvblxyXG4gICAgICAgICAgICBmcm9tIHRlbSB0IGxlZnQgam9pbiB0YXJlYXNfdGVtIHR0IG9uICh0Lm9wZXJhdGl2byA9IHR0Lm9wZXJhdGl2byBhbmQgdC5lbmMgPSB0dC5lbmMgYW5kIHQudGFyZWFfYWN0dWFsID0gdHQudGFyZWEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIHRhcmVhcyB0YSBvbiB0LnRhcmVhX2FjdHVhbCA9IHRhLnRhcmVhXHJcbiAgICAgICAgICAgIHdoZXJlIHQuaGFiaWxpdGFkYSBhbmQgJHtxdW90ZWRDb25kVml2fVxyXG4gICAgICAgICAgICBncm91cCBieSB0LmVuYywgdC5qc29uX2VuY3Vlc3RhLCB0LnJlc3VtZW5fZXN0YWRvLCBkb21pbmlvLCBub21jYWxsZSxzZWN0b3IsZWRpZmljaW8sIGVudHJhZGEsIG5yb2NhdGFzdHJhbCwgcGlzbyxkZXBhcnRhbWVudG8saGFiaXRhY2lvbixjYXNhLHJlc2VydmEsdHQuY2FyZ2Ffb2JzZXJ2YWNpb25lcywgY2l0YSwgdC5hcmVhLCB0dC50YXJlYSwgZmVjaGFfYXNpZ25hY2lvbiwgYXNpZ25hZG8sIG1haW5fZm9ybVxyXG4gICAgICAgIClcclxuICAgICAgICBzZWxlY3QganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJ3ZpdmllbmRhcycsICR7anNvbm8oXHJcbiAgICAgICAgICAgICAgICAgICAgYHNlbGVjdCBlbmMsIHJlc3B1ZXN0YXMsIGpzb25iX2J1aWxkX29iamVjdCgncmVzdW1lbkVzdGFkbycsXCJyZXN1bWVuRXN0YWRvXCIpIGFzIG90cmFzIGZyb20gJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCl9YCxcclxuICAgICAgICAgICAgICAgICAgICAnZW5jJyxcclxuICAgICAgICAgICAgICAgICAgICBgb3RyYXMgfHwgY29hbGVzY2UocmVzcHVlc3Rhcywne30nOjpqc29uYilgXHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICApIGFzIHJlc3B1ZXN0YXMsXHJcbiAgICAgICAgICAgICR7anNvbihgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgYXJlYSBhcyBjYXJnYSwgb2JzZXJ2YWNpb25lc19oZHIgYXMgb2JzZXJ2YWNpb25lcywgbWluKGZlY2hhX2FzaWduYWNpb24pIGFzIGZlY2hhXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudChPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKX0gaW5uZXIgam9pbiBhcmVhcyB1c2luZyAoYXJlYSkgXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgYnkgYXJlYSwgb2JzZXJ2YWNpb25lc19oZHJgLCBcclxuICAgICAgICAgICAgICAgICdmZWNoYScpfSBhcyBjYXJnYXMsXHJcbiAgICAgICAgICAgICR7anNvbm8oXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGVuYywganNvbmJfYnVpbGRfb2JqZWN0KCd0ZW0nLCB0ZW0sICd0YXJlYScsIHRhcmVhKSBhcyBvdHJhcyBmcm9tICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVEQpfWAsXHJcbiAgICAgICAgICAgICAgICAgJ2VuYycsXHJcbiAgICAgICAgICAgICAgICAgYG90cmFzIHx8J3t9Jzo6anNvbmJgXHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICBhcyBcImluZm9ybWFjaW9uSGRyXCJcclxuYFxyXG59XHJcblxyXG5leHBvcnQgdmFyIHNldEhkclF1ZXJ5ID0gKG15RnVuOihxdW90ZWRDb25kVml2OnN0cmluZywgY29udGV4dD86Q29udGV4dCk9PnN0cmluZyk9PiBnZXRIZHJRdWVyeT1teUZ1blxyXG5cclxuY29uc3QgZ2V0VUFQcmluY2lwYWwgPSBhc3luYyAoY2xpZW50OkNsaWVudCwgb3BlcmF0aXZvOnN0cmluZyk9PlxyXG4gICAgKGF3YWl0IGNsaWVudC5xdWVyeShcclxuICAgICAgICBgc2VsZWN0IHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgICAgICBmcm9tIHVuaWRhZF9hbmFsaXNpc1xyXG4gICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBwcmluY2lwYWxcclxuICAgICAgICBgXHJcbiAgICAgICAgLFxyXG4gICAgICAgIFtvcGVyYXRpdm9dXHJcbiAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWVcclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6e1trIGluIHN0cmluZ106Ym9vbGVhbn0gPSB7fVxyXG5cclxudmFyIGNvbXBpbGVyID0gbmV3IEV4cHJlc2lvblBhcnNlci5Db21waWxlcih7XHJcbiAgICBsYW5ndWFnZTonanMnLFxyXG4gICAgdmFyV3JhcHBlcjoodmFyX25hbWU6c3RyaW5nKT0+YGhlbHBlcnMubnVsbDJ6ZXJvKHZhbG9yZXMuJHt2YXJfbmFtZX0pYCxcclxuICAgIGZ1bldyYXBwZXI6KGZ1bmN0aW9uTmFtZTpzdHJpbmcpPT57XHJcbiAgICAgICAgaWYoIWZ1bmNpb25lc0Nvbm9jaWRhc1tmdW5jdGlvbk5hbWVdKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZnVuY3Rpb25OYW1lKVxyXG4gICAgICAgICAgICBmdW5jaW9uZXNDb25vY2lkYXNbZnVuY3Rpb25OYW1lXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgaGVscGVycy5mdW5zLiR7ZnVuY3Rpb25OYW1lfWBcclxuICAgIH1cclxufSlcclxuXHJcbnR5cGUgQ2FzaWxsZXJvRGVBY2E9e1xyXG4gICAgY2hpbGRzOiBDYXNpbGxlcm9EZUFjYVtdLFxyXG4gICAgZGF0YTp7XHJcbiAgICAgICAgZXhwcmVzaW9uX2hhYmlsaXRhcjogc3RyaW5nXHJcbiAgICAgICAgZXhwcmVzaW9uX2hhYmlsaXRhcl9qczogc3RyaW5nXHJcbiAgICAgICAgZXNwZWNpYWw6IGFueVxyXG4gICAgICAgIGV4cHJlc2lvbl9hdXRvaW5ncmVzYXJfanM6IHN0cmluZ1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb21waWxhckV4cHJlc2lvbihleHByZXNpb246c3RyaW5nKXtcclxuICAgIHJldHVybiBjb21waWxlci50b0NvZGUoRXhwcmVzaW9uUGFyc2VyLnBhcnNlKFxyXG4gICAgICAgIGV4cHJlc2lvblxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxiaXMgZGlzdGluY3QgZnJvbVxcYi9naSwnIDw+ICcpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8hIS9naSwnICcpXHJcbiAgICApKS5yZXBsYWNlKC9oZWxwZXJzXFwuZnVuc1xcLmJsYW5jb1xcKGhlbHBlcnMubnVsbDJ6ZXJvXFwoL2csJ2hlbHBlcnMuZnVucy5ibGFuY28oKCcpXHJcbiAgICAucmVwbGFjZSgvaGVscGVyc1xcLmZ1bnNcXC5pbmZvcm1hZG9cXChoZWxwZXJzLm51bGwyemVyb1xcKC9nLCdoZWxwZXJzLmZ1bnMuaW5mb3JtYWRvKCgnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29tcGlsYXJFeHByZXNpb25lcyhjYXNpbGxlcm86Q2FzaWxsZXJvRGVBY2Epe1xyXG4gICAgaWYoIWNhc2lsbGVybyl7IHJldHVybiB9XHJcbiAgICBpZihjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyKXtcclxuICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyX2pzID0gY29tcGlsYXJFeHByZXNpb24oY2FzaWxsZXJvLmRhdGEuZXhwcmVzaW9uX2hhYmlsaXRhcik7XHJcbiAgICB9XHJcbiAgICBpZihjYXNpbGxlcm8uZGF0YS5lc3BlY2lhbD8uYXV0b2luZyl7XHJcbiAgICAgICAgdmFyIHBhcnRlcyA9IGNhc2lsbGVyby5kYXRhLmVzcGVjaWFsPy5hdXRvaW5nLnNwbGl0KCc9PicpO1xyXG4gICAgICAgIGlmKHBhcnRlcy5sZW5ndGg+MSl7XHJcbiAgICAgICAgICAgIHZhciBwcmVjb25kaWNpb24gPSBwYXJ0ZXNbMF07XHJcbiAgICAgICAgICAgIHZhciB2YWxvciA9IHBhcnRlcy5zbGljZSgxKS5qb2luKCc9PicpO1xyXG4gICAgICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzID0gYCgke2NvbXBpbGFyRXhwcmVzaW9uKHByZWNvbmRpY2lvbil9KT8oJHtjb21waWxhckV4cHJlc2lvbih2YWxvcil9KTpudWxsYDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2FzaWxsZXJvLmRhdGEuZXhwcmVzaW9uX2F1dG9pbmdyZXNhcl9qcyA9IGNvbXBpbGFyRXhwcmVzaW9uKHBhcnRlc1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yKHZhciBjYXNpbGxlcm9JbnRlcm5vIG9mIGNhc2lsbGVyby5jaGlsZHMpIGNvbXBpbGFyRXhwcmVzaW9uZXMoY2FzaWxsZXJvSW50ZXJubyk7XHJcbn1cclxuXHJcbmNvbnN0IGdlbmVyYXJUYXJlYXNUZW1GYWx0YW50ZXMgPSBhc3luYyAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bykgPT4gXHJcbiAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgaW5zZXJ0IGludG8gdGFyZWFzX3RlbSAob3BlcmF0aXZvLCBlbmMsIHRhcmVhKVxyXG4gICAgICAgICAgICBzZWxlY3QgdGEub3BlcmF0aXZvLCB0YS5lbmMsIHRhLnRhcmVhXHJcbiAgICAgICAgICAgIGZyb20gKHNlbGVjdCB0YS4qLCB0LmVuYyx0LmFyZWEgZnJvbSB0YXJlYXMgdGEsIHRlbSB0IHdoZXJlIHRhLm9wZXJhdGl2bz10Lm9wZXJhdGl2bykgdGEgXHJcbiAgICAgICAgICAgIHdoZXJlIHRhLm9wZXJhdGl2byA9ICQxIFxyXG4gICAgICAgICAgICAgICAgYW5kIG5vdCAodGEub3BlcmF0aXZvLCB0YS5lbmMsIHRhLnRhcmVhKSBpbiAoc2VsZWN0IG9wZXJhdGl2bywgZW5jLCB0YXJlYSBmcm9tIHRhcmVhc190ZW0pXHJcbiAgICAgICAgICAgIG9yZGVyIGJ5IDEsMywyO1xyXG4gICAgYCxbb3BlcmF0aXZvXSkuZXhlY3V0ZSgpO1xyXG5cclxuZXhwb3J0IGNvbnN0IEFDQ0lPTl9QQVNBUl9QUk9JRSA9ICdlbmN1ZXN0YXNfcHJvY2VzYW1pZW50b19wYXNhcic7XHJcbmV4cG9ydCBjb25zdCBQcm9jZWR1cmVzRG1FbmN1IDogUHJvY2VkdXJlRGVmW10gPSBbXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOidvcGVyYXRpdm9fZXN0cnVjdHVyYV9jb21wbGV0YScsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgICAgLHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczonb3BlcmF0aXZvcyd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcmVzdWx0T2s6J2Rlc3BsZWdhckZvcm11bGFyaW8nLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgY2FzaWxsZXJvc19qZXJhcnF1aXphZG9zKCQxKSBhcyBmb3JtdWxhcmlvcywgXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgc2VsZWN0IHVuaWRhZF9hbmFsaXNpcywgcGFkcmUsIHBrX2FncmVnYWRhLCAne30nOjpqc29uYiBhcyBoaWphcyBmcm9tIHVuaWRhZF9hbmFsaXNpcyB3aGVyZSBvcGVyYXRpdm8gPSAkMmAsICd1bmlkYWRfYW5hbGlzaXMnKX0gYXMgdW5pZGFkZXNfYW5hbGlzaXNcclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVycy5vcGVyYXRpdm8sIHBhcmFtZXRlcnMub3BlcmF0aXZvXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGxpa2VBcihyZXN1bHQucm93LmZvcm11bGFyaW9zKS5mb3JFYWNoKGY9PmNvbXBpbGFyRXhwcmVzaW9uZXMoZikpO1xyXG4gICAgICAgICAgICAvLyBIZXJtYW5vcyBzb24gbG9zIGZvcm11bGFyaW9zIHF1ZSBlc3TDoW4gaW1wbGFudGFkb3MgZW4gb3RybyBmb3JtdWxhcmlvIGRlIGxhIG1pc21hIFVBLiBQb3IgZWplbXBsbyBlbCBBMSBlbiBlbCBTMVxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0SGVybWFub3MgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbnNlbGVjdCBvLmlkX2Nhc2lsbGVybyBhcyBpZF9mb3JtdWxhcmlvLCBvLnVuaWRhZF9hbmFsaXNpcywgJ0JGXyd8fG8uY2FzaWxsZXJvIGJvdG9uLCBiZi5jYXNpbGxlcm8sIGJmLnBhZHJlLCBmcC5jYXNpbGxlcm8sIGZwLnVuaWRhZF9hbmFsaXNpc1xyXG4gIGZyb20gY2FzaWxsZXJvcyBvIGxlZnQgam9pbiBjYXNpbGxlcm9zIGJmXHJcbiAgICBvbiBiZi50aXBvYz0nQkYnXHJcblx0YW5kIGJmLmNhc2lsbGVybyA9ICdCRl8nfHxvLmNhc2lsbGVyb1xyXG5cdGFuZCBiZi5vcGVyYXRpdm8gPSBvLm9wZXJhdGl2b1xyXG5cdGxlZnQgam9pbiBjYXNpbGxlcm9zIGZwXHJcblx0ICBvbiBmcC5pZF9jYXNpbGxlcm8gPSBiZi5wYWRyZVxyXG5cdCAgYW5kIGZwLm9wZXJhdGl2byA9IGJmLm9wZXJhdGl2b1xyXG4gIHdoZXJlIG8udGlwb2MgPSAnRidcclxuICAgIGFuZCBvLnVuaWRhZF9hbmFsaXNpcyA9IGZwLnVuaWRhZF9hbmFsaXNpc1xyXG5cdGFuZCBvLm9wZXJhdGl2byA9ICQxYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2b11cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXN1bHRIZXJtYW5vcy5yb3dzLmZvckVhY2gocm93PT57XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucm93LmZvcm11bGFyaW9zW3Jvdy5pZF9mb3JtdWxhcmlvXS5kYXRhLmhlcm1hbm8gPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjb21wbGV0YXJVQSh1YTpVbmlkYWRBbmFsaXNpcywgaWRVYTpJZFVuaWRhZEFuYWxpc2lzLCB1QXM6e1trIGluIElkVW5pZGFkQW5hbGlzaXNdOiBVbmlkYWRBbmFsaXNpc30pe1xyXG4gICAgICAgICAgICAgICAgaWYodWEucGFkcmUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHVBc1t1YS5wYWRyZV0uaGlqYXNbaWRVYV0gPSB1YTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHVhLnByaW5jaXBhbD10cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpa2VBcihyZXN1bHQucm93LnVuaWRhZGVzX2FuYWxpc2lzKS5mb3JFYWNoKCh1YSwgaWRVYSk9PlxyXG4gICAgICAgICAgICAgICAgY29tcGxldGFyVUEodWEsIGlkVWEgYXMgSWRVbmlkYWRBbmFsaXNpcywgcmVzdWx0LnJvdy51bmlkYWRlc19hbmFsaXNpcylcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB2YXIge1xyXG4gICAgICAgICAgICAgICAgY29uX3JlYV9ob2dhcjogY29uUmVhSG9nYXIsIFxyXG4gICAgICAgICAgICAgICAgY29uZmlnX3NvcnRlbzogY29uZmlnU29ydGVvLCBcclxuICAgICAgICAgICAgICAgIGhhYmlsaXRhY2lvbl9ib3Rvbl9mb3JtdWxhcmlvOmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhOiBwZXJtaXRlR2VuZXJhck11ZXN0cmFcclxuICAgICAgICAgICAgfSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgY29uZmlnX3NvcnRlbywgY29uX3JlYV9ob2dhciwgaGFiaWxpdGFjaW9uX2JvdG9uX2Zvcm11bGFyaW8sIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gb3BlcmF0aXZvcyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMVxyXG4gICAgICAgICAgICBgLFtwYXJhbWV0ZXJzLm9wZXJhdGl2b10pLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuICAgICAgICAgICAgbGV0IGNvbXBpbGFyRXhwcmVzaW9uZXNEb21pbmlvcyA9IChleHByZXNpb25lc0RvbWluaW86YW55KT0+IFxyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGV4cHJlc2lvbmVzRG9taW5pbylcclxuICAgICAgICAgICAgICAgICAgICAubWFwKChleHByLGRvbWluaW8pPT4oe2RvbWluaW8sIGV4cHI6Y29tcGlsYXJFeHByZXNpb24oZXhwci5leHByKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5wbGFpbigpO1xyXG4gICAgICAgICAgICBpZihjb25maWdTb3J0ZW8pe1xyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGNvbmZpZ1NvcnRlbykuZm9yRWFjaCgoY29uZmlnU29ydGVvRm9ybXVsYXJpbyk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmV4cHJfaW5jb21wbGV0aXR1ZF9qcz1jb21waWxhckV4cHJlc2lvbmVzRG9taW5pb3MoY29uZmlnU29ydGVvRm9ybXVsYXJpby5leHByX2luY29tcGxldGl0dWQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5maWx0cm9fanM9Y29tcGlsYXJFeHByZXNpb25lc0RvbWluaW9zKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZmlsdHJvKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8pe1xyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbykuZm9yRWFjaCgoZm9ybSk9PntcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmV4cHJfaGFiaWxpdGFyX2JvdG9uX2pzPWNvbXBpbGFyRXhwcmVzaW9uKGZvcm0uZXhwcl9oYWJpbGl0YXJfYm90b24pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7dGltZXN0YW1wOiBiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSwgLi4ucmVzdWx0LnJvdywgb3BlcmF0aXZvOnBhcmFtZXRlcnMub3BlcmF0aXZvLCBjb25SZWFIb2dhciwgY29uZmlnU29ydGVvLCBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8sIHBlcm1pdGVHZW5lcmFyTXVlc3RyYSwgbm9SZWFzOmJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhLCBub1JlYXNTdXA6YmUuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWFfc3VwfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZ2VuZXJhcl9mb3JtdWxhcmlvcycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidhbm5pbycsIHR5cGVOYW1lOidpbnRlZ2VyJywgcmVmZXJlbmNlczonYW5uaW8nfSxcclxuICAgICAgICAgICAge25hbWU6J21lcycgICwgdHlwZU5hbWU6J2ludGVnZXInLCByZWZlcmVuY2VzOidtZXMnICB9LFxyXG4gICAgICAgICAgICB7bmFtZTonbG90ZScgLCB0eXBlTmFtZTonaW50ZWdlcicsIHJlZmVyZW5jZXM6J2xvdGVzJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0VUEgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgZnJvbSB1bmlkYWRfYW5hbGlzaXNcclxuICAgICAgICAgICAgICAgICAgIHdoZXJlIHByaW5jaXBhbCA9IHRydWUgYW5kIG9wZXJhdGl2byA9ICQxXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWT11cclxuICAgICAgICAgICAgKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRVQS5yb3dDb3VudCA9PT0gMCl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlIGNvbmZpZ3Vyw7MgdW5hIHVuaWRhZCBkZSBhbmFsaXNpcyBjb21vIHByaW5jaXBhbCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByb3cgPSByZXN1bHRVQS5yb3c7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRQcmVndW50YXMgPSBhd2FpdCBiZS5wcm9jZWR1cmUucHJlZ3VudGFzX3VhX3RyYWVyLmNvcmVGdW5jdGlvbihjb250ZXh0LCByb3cpXHJcbiAgICAgICAgICAgIHZhciBjb250ZW5lZG9yVmFjaW86e1trZXk6c3RyaW5nXTphbnl9ID0ge307XHJcbiAgICAgICAgICAgIHJlc3VsdFByZWd1bnRhcy5mb3JFYWNoKGZ1bmN0aW9uKGRlZlByZWd1bnRhKXtcclxuICAgICAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpb1tkZWZQcmVndW50YS52YXJfbmFtZV0gPSBkZWZQcmVndW50YS51bmlkYWRfYW5hbGlzaXM/W106bnVsbDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpby5hbm5pbz0gcGFyYW1ldGVycy5hbm5pbztcclxuICAgICAgICAgICAgY29udGVuZWRvclZhY2lvLm1lcyAgPSBwYXJhbWV0ZXJzLm1lcyAgO1xyXG4gICAgICAgICAgICBjb250ZW5lZG9yVmFjaW8ubG90ZSA9IHBhcmFtZXRlcnMubG90ZSA7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGRlYmVfaGFiZXIuaWRfY2FzbywgcyBhcyBpZFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gKHNlbGVjdCBsb3RlLCBhcm1hcl9pZChhbm5pbywgbWVzLCBsb3RlLCBzKSBhcyBpZF9jYXNvLCBzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKHNlbGVjdCBhbm5pbyxtZXMsbG90ZSwgY2FudF9jdWVzIGZyb20gbG90ZXMgd2hlcmUgKGFubmlvLG1lcyxsb3RlKT0oJDIsJDMsJDQpKSByLCBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLGNhbnRfY3Vlcykgc1xyXG4gICAgICAgICAgICAgICAgICAgICkgZGViZV9oYWJlciBsZWZ0IGpvaW4gZGVmZ2VuIGhheSBvbiBoYXkuaWRfY2FzbyA9IGRlYmVfaGFiZXIuaWRfY2FzbyBhbmQgaGF5Lm9wZXJhdGl2bz0kMVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIGhheS5pZF9jYXNvIGlzIG51bGxgLFxyXG4gICAgICAgICAgICAgICAgWyBPUEVSQVRJVk8sIHBhcmFtZXRlcnMuYW5uaW8sIHBhcmFtZXRlcnMubWVzLCBwYXJhbWV0ZXJzLmxvdGVdXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtvcGVyYXRpdm86IE9QRVJBVElWT307XHJcbiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgcmVzdWx0LnJvd0NvdW50OyBpKyspe1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhci5jb3JlRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdpbmcocGFyYW1zLHtpZF9jYXNvOnJlc3VsdC5yb3dzW2ldLmlkX2Nhc28sIGRhdG9zX2Nhc286Y2hhbmdpbmcoY29udGVuZWRvclZhY2lvLHtpZDpyZXN1bHQucm93c1tpXS5pZH0pfSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ge2FncmVnYWRhczpyZXN1bHQucm93Q291bnR9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J3VwbG9hZF9maWxlJyxcclxuICAgICAgICBwcm9ncmVzczogdHJ1ZSxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6ICdpZF9hZGp1bnRvJywgdHlwZU5hbWU6ICdpbnRlZ2VyJ30sXHJcbiAgICAgICAgICAgIHtuYW1lOiAnbm9tYnJlJywgdHlwZU5hbWU6ICd0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBmaWxlczp7Y291bnQ6MX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzLCBmaWxlcyl7XHJcbiAgICAgICAgICAgIGxldCBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBsZXQgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICBjb250ZXh0LmluZm9ybVByb2dyZXNzKHttZXNzYWdlOmJlLm1lc3NhZ2VzLmZpbGVVcGxvYWRlZH0pO1xyXG4gICAgICAgICAgICBsZXQgZmlsZSA9IGZpbGVzWzBdXHJcbiAgICAgICAgICAgIGxldCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZS5wYXRoKS5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbEZpbGVuYW1lID0gZmlsZS5vcmlnaW5hbEZpbGVuYW1lLnNsaWNlKDAsLShleHQubGVuZ3RoKzEpKTtcclxuICAgICAgICAgICAgbGV0IGZpbGVuYW1lPSBwYXJhbWV0ZXJzLm5vbWJyZSB8fCBvcmlnaW5hbEZpbGVuYW1lO1xyXG4gICAgICAgICAgICBsZXQgbmV3UGF0aCA9ICdsb2NhbC1hdHRhY2htZW50cy9maWxlLSc7XHJcbiAgICAgICAgICAgIHZhciBjcmVhdGVSZXNwb25zZSA9IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlKGFkanVudG9Sb3cpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdGFkbyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTGEgc3ViaWRhIHNlIHJlYWxpesOzIGNvcnJlY3RhbWVudGUgKHVwZGF0ZSknLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vbWJyZTogYWRqdW50b1Jvdy5ub21icmUsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlX29yaWdpbmFsOiBhZGp1bnRvUm93Lm5vbWJyZV9vcmlnaW5hbCxcclxuICAgICAgICAgICAgICAgICAgICBleHQ6IGFkanVudG9Sb3cuZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGZlY2hhOiBhZGp1bnRvUm93LmZlY2hhLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvcmE6IGFkanVudG9Sb3cuaG9yYSxcclxuICAgICAgICAgICAgICAgICAgICBpZF9hZGp1bnRvOiBhZGp1bnRvUm93LmlkX2FkanVudG9cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRhZG9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgbW92ZUZpbGUgPSBmdW5jdGlvbiBtb3ZlRmlsZShmaWxlLCBpZF9hZGp1bnRvLCBleHRlbnNpb24pe1xyXG4gICAgICAgICAgICAgICAgZnMubW92ZShmaWxlLnBhdGgsIG5ld1BhdGggKyBpZF9hZGp1bnRvICsgJy4nICsgZXh0ZW5zaW9uLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYocGFyYW1ldGVycy5pZF9hZGp1bnRvKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jbGllbnQucXVlcnkoYHVwZGF0ZSBhZGp1bnRvcyBzZXQgbm9tYnJlPSAkMSxub21icmVfb3JpZ2luYWwgPSAkMiwgZXh0ID0gJDMsIHJ1dGEgPSBjb25jYXQoJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJywkNDo6dGV4dCwnLicsJDM6OnRleHQpLCBmZWNoYSA9IG5vdygpLCBob3JhID0gZGF0ZV90cnVuYygnc2Vjb25kcycsY3VycmVudF90aW1lc3RhbXAtY3VycmVudF9kYXRlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBpZF9hZGp1bnRvID0gJDQgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsZW5hbWUsIG9yaWdpbmFsRmlsZW5hbWUsIGV4dCwgcGFyYW1ldGVycy5pZF9hZGp1bnRvXVxyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXNwb25zZShyZXN1bHQucm93KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0YWRvKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUZpbGUoZmlsZSxyZXN1bHRhZG8uaWRfYWRqdW50byxyZXN1bHRhZG8uZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBpbnNlcnQgaW50byBhZGp1bnRvcyAobm9tYnJlLCBub21icmVfb3JpZ2luYWwsIGV4dCwgZmVjaGEsIGhvcmEpIHZhbHVlcyAoJDEsJDIsJDMsbm93KCksIGRhdGVfdHJ1bmMoJ3NlY29uZHMnLGN1cnJlbnRfdGltZXN0YW1wLWN1cnJlbnRfZGF0ZSkpIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGVuYW1lLCBvcmlnaW5hbEZpbGVuYW1lLCBleHRdXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGB1cGRhdGUgYWRqdW50b3Mgc2V0IHJ1dGEgPSBjb25jYXQoJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJyxpZF9hZGp1bnRvOjp0ZXh0LCcuJyxleHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBpZF9hZGp1bnRvID0gJDEgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdC5yb3cuaWRfYWRqdW50b11cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXNwb25zZShyZXN1bHQucm93KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdGFkbyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRmlsZShmaWxlLHJlc3VsdGFkby5pZF9hZGp1bnRvLHJlc3VsdGFkby5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKXtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2Nhc29fZ3VhcmRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgLCB0eXBlTmFtZTondGV4dCcsIHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnfSxcclxuICAgICAgICAgICAge25hbWU6J2lkX2Nhc28nICAgICAsIHR5cGVOYW1lOid0ZXh0JyAgICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidkYXRvc19jYXNvJyAgLCB0eXBlTmFtZTonanNvbmInICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgZGVmaW5lZEluOiAnZG1lbmN1JyxcclxuICAgICAgICAvL0B0cy1pZ25vcmUgZXNwZWNpZmljbyBlbCB0aXBvIGRlIGxvcyBwYXLDoW1ldHJvc1xyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6e1xyXG4gICAgICAgICAgICBvcGVyYXRpdm86c3RyaW5nLCBcclxuICAgICAgICAgICAgaWRfY2FzbzpzdHJpbmcsXHJcbiAgICAgICAgICAgIGRhdG9zX2Nhc286QW55T2JqZWN0XHJcbiAgICAgICAgfSxuZXdDbGllbnQ6Q2xpZW50KXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1uZXdDbGllbnQgfHwgY29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBkYXRvc19qc29uPXBhcmFtZXRlcnMuZGF0b3NfY2FzbztcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHRhYmxlU3RydWN0dXJlc19hcHA6VGFibGVEZWZpbml0aW9ucyA9IGJlLnRhYmxlU3RydWN0dXJlcztcclxuICAgICAgICBcclxuICAgICAgICAgICAgdmFyIHN0cnVjdF9kbWVuY3UgPSBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCk7XHJcbiAgICAgICAgICAgIGRhdG9zX2pzb25bJ29wZXJhdGl2byddID0gcGFyYW1ldGVycy5vcGVyYXRpdm87XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBkYXRvc19qc29uW09wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQS10gPSBwYXJhbWV0ZXJzLmlkX2Nhc287XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRhcl91bHRfcGtfZW5fYXJyKCB1bHRfcGssIHVhX2Fycil7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29uX3BrX2NvbXBsZXRhPXVhX2FycjsgXHJcbiAgICAgICAgICAgICAgICBpZiAodWFfYXJyICYmIHVhX2Fyci5sZW5ndGg+PTEpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbl9wa19jb21wbGV0YT0gY29uX3BrX2NvbXBsZXRhLm1hcCgodW5hX3VhLGkpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuYV91YVt1bHRfcGtdPWkrMSAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5hX3VhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbl9wa19jb21wbGV0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlY29ycmVyX2RhdG9zX2FncmVnYW5kb19wa3MoZGF0b3NqKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXlOYW1lIGluIGRhdG9zaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRvSyA9IGRhdG9zaltrZXlOYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0b0sgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRvSy5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGsgPSB0YWJsZVN0cnVjdHVyZXNfYXBwW2tleU5hbWVdKGNvbnRleHQpLnByaW1hcnlLZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bHRfcGsgPSBwa1tway5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b0sgPSBjb21wbGV0YXJfdWx0X3BrX2VuX2Fycih1bHRfcGssIGRhdG9LKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b0suZm9yRWFjaCgoZWxlbUkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1JPXJlY29ycmVyX2RhdG9zX2FncmVnYW5kb19wa3MoZWxlbUkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlOYW1lLnN0YXJ0c1dpdGgoJyQnKXx8a2V5TmFtZS5zdGFydHNXaXRoKCdfJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdG9zaltrZXlOYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b3NqO1xyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGRhdG9zX2pzb24gPSByZWNvcnJlcl9kYXRvc19hZ3JlZ2FuZG9fcGtzKGRhdG9zX2pzb24pO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5jb2RSZWE7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZE5vUmVhO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5yZXN1bWVuRXN0YWRvO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5jb2RSZWFTdXA7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZE5vUmVhU3VwO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5yZXN1bWVuRXN0YWRvU3VwO1xyXG5cclxuICAgICAgICAgICAgaWYoIE9iamVjdC5rZXlzKGRhdG9zX2pzb24pLmxlbmd0aCA+Mil7XHJcbiAgICAgICAgICAgICAgICB2YXIgcXVlcmllcyA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFdyaXRlKGRhdG9zX2pzb24sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJpZXMucmVkdWNlKGZ1bmN0aW9uKHByb21pc2UsIHF1ZXJ5KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LnF1ZXJ5KHF1ZXJ5KS5leGVjdXRlKCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxQcm9taXNlLnJlc29sdmUoKSkudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm9rXCI7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnI6RXJyb3Ipe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Fzb19ndWFyZGFyIEVOVFJBIEVOIEVMIENBVENIOiBcIixlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiAndmFjaW8nO1xyXG4gICAgICAgICAgICB9ICAgIFxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb190cmFlcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICAvL3tuYW1lOidmb3JtdWxhcmlvJyAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgLHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnLCAgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2lkX2Nhc28nICAgICAgICx0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcmVzdWx0T2s6ICdnb1RvRW5jJyxcclxuICAgICAgICBkZWZpbmVkSW46ICdkbWVuY3UnLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgICB2YXIgc3RydWN0X2RtZW5jdSA9IGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKTtcclxuICAgICAgICAgICAgdmFyIHNxbCA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFJlYWQoe29wZXJhdGl2bzogcGFyYW1ldGVycy5vcGVyYXRpdm8sIHZpdmllbmRhOnBhcmFtZXRlcnMuaWRfY2Fzb30sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHNxbCkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgdml2aWVuZGE6IHBhcmFtZXRlcnMuaWRfY2FzbyxcclxuICAgICAgICAgICAgICAgIGRhdG9zX2Nhc286IHJlc3VsdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIC8vZm9ybXVsYXJpbzogZm9ybVByaW5jaXBhbCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb190cmFlcl9vX2NyZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAscmVmZXJlbmNlczonb3BlcmF0aXZvcycsICB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonaWRfY2FzbycgICAgICAgLHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIC8vIGJpdGFjb3JhOnthbHdheXM6dHJ1ZX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb190cmFlciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICB2YXIganNvbiA9IGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19wcmVwYXJhciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb19ndWFyZGFyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIGNoYW5naW5nKHBhcmFtZXRlcnMsIHtkYXRvc19jYXNvOmpzb259KSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgYmUucHJvY2VkdXJlWydjYXNvX3RyYWVyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J3Bhc2FyX2pzb24ydWEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIC8qIEdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgLyogRklOLUdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRNYWluID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFNFTEVDVCAqIEZST00gJHtPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREfSBMSU1JVCAxYCkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgaWYocmVzdWx0TWFpbi5yb3dDb3VudD4wKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdIQVkgREFUT1MnLHJlc3VsdE1haW4ucm93cylcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSEFZIERBVE9TLiBOTyBTRSBQVUVERSBJTklDSUFSIEVMIFBBU0FKRScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRKc29uID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgU0VMRUNUIG9wZXJhdGl2bywgZW5jIGlkX2Nhc28sIGpzb25fZW5jdWVzdGEgZGF0b3NfY2FzbyBmcm9tIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBXSEVSRSBvcGVyYXRpdm89JDEgYW5kIHJlc3VtZW5fZXN0YWRvIGlzIGRpc3RpbmN0IGZyb20gJ3ZhY2lvJyBhbmQganNvbl9lbmN1ZXN0YSBpcyBub3QgbnVsbCBcclxuICAgICAgICAgICAgICAgICAgICBvcmRlciBieSBlbmMgYCxcclxuICAgICAgICAgICAgICAgIFtPUEVSQVRJVk9dXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICBpZihwcm9jZWR1cmVHdWFyZGFyLmRlZmluZWRJbiE9J2RtZW5jdScpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoYXkgcXVlIHNvYnJlZXNjcmliaXIgY2Fzb19ndWFyZGFyJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdEpzb24ucm93cy5tYXAoYXN5bmMgZnVuY3Rpb24ocm93KXtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRhZG8gPSBgaWQgY2FzbyAke3Jvdy5pZF9jYXNvfTogYDtcclxuICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIGFzeW5jIGZ1bmN0aW9uKGNsaWVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbys9IGF3YWl0IHByb2NlZHVyZUd1YXJkYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHJvdywgY2xpZW50KTsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnJNZXNzYWdlID0gcmVzdWx0YWRvICsgXCJqc29uMnVhIGVycm9yLiBcIisgZXJyIDtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBlcnJNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIH0gICAgIFxyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0YWRvLmluY2x1ZGVzKCdvaycpKXsgXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtkYXRvc19jYXNvLCB2aXZpZW5kYSwgb3BlcmF0aXZvfSA9IGF3YWl0IGJlLnByb2NlZHVyZS5jYXNvX3RyYWVyLmNvcmVGdW5jdGlvbihjb250ZXh0LCB7b3BlcmF0aXZvOnJvdy5vcGVyYXRpdm8sIGlkX2Nhc286cm93LmlkX2Nhc299KVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ZXJRdWVHcmFibyA9IHtkYXRvc19jYXNvLCB2aXZpZW5kYSwgb3BlcmF0aXZvfVxyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY3JlcGFuY2VzLnNob3dBbmRUaHJvdyh2ZXJRdWVHcmFibyxyb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZlclF1ZUdyYWJvLHJvdylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgICAgICAgICB9KSkuY2F0Y2goZnVuY3Rpb24oZXJyKXtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fZm9ycGtyYWl6X2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondml2aWVuZGEnICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcInRhcmVhc1wifSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7b3BlcmF0aXZvLHZpdmllbmRhLCB0YXJlYX0gPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgICAgICB2YXIgbWFpbl9mb3JtID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCBtYWluX2Zvcm1cclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIHRhcmVhPSQyYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgdGFyZWFdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgdmFyIGNvbmR2aXY9IGAgdC5vcGVyYXRpdm89ICQxIGFuZCB0LmVuYyA9JDJgO1xyXG4gICAgICAgICAgICB2YXIgc29sb0xlY3R1cmEgPSAhIShhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW0gam9pbiBlc3RhZG9zIHVzaW5nIChvcGVyYXRpdm8sIGVzdGFkbykgLS1wayBlc3RhZG8gdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdhZG9fZG0gaXMgbm90IG51bGwgb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwZXJtaXRlX2VkaXRhcl9lbmN1ZXN0YSBhbmQgYXNpZ25hZG8gPD4gJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChjb250ZXh0LnVzZXIuaWRwZXIpfVxyXG4gICAgICAgICAgICAgICAgICAgIClgLCBbb3BlcmF0aXZvLCB2aXZpZW5kYV0pLmZldGNoT25lUm93SWZFeGlzdHMoKSkucm93Q291bnQ7XHJcbiAgICAgICAgICAgIHZhciB7cm93fSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGdldEhkclF1ZXJ5KGNvbmR2aXYsIGNvbnRleHQpLFtvcGVyYXRpdm8sdml2aWVuZGFdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByb3cuaW5mb3JtYWNpb25IZHJbdml2aWVuZGFdLnRhcmVhPXtcclxuICAgICAgICAgICAgICAgIHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgIH0gO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmEsXHJcbiAgICAgICAgICAgICAgICBpZFBlcjpjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6bGlrZUFyLmNyZWF0ZUluZGV4KHJvdy5jYXJnYXMubWFwKGNhcmdhPT4oey4uLmNhcmdhLCBmZWNoYTpjYXJnYS5mZWNoYT9kYXRlLmlzbyhjYXJnYS5mZWNoYSkudG9EbXkoKTpudWxsfSkpLCAnY2FyZ2EnKSxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcEVzdHJ1Y3R1cmE6YmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmFcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fZm9ycGtyYWl6X2Rlc2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZToncGVyc2lzdGVudGVzJyAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIge29wZXJhdGl2bywgcGVyc2lzdGVudGVzfSA9IHBhcmFtZXRlcnM7XHJcbiAgICAgICAgICAgIGNvbnN0IFVBX1BSSU5DSVBBTCA9IGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBvcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGVyc2lzdGVudGVzLnJlc3B1ZXN0YXNbVUFfUFJJTkNJUEFMXSkubWFwKGFzeW5jIChyZXNwdWVzdGFzVUFQcmluY2lwYWwsaWRFbmMpPT57XHJcbiAgICAgICAgICAgICAgICBpZihyZXNwdWVzdGFzVUFQcmluY2lwYWwuczFhMV9vYnMgPT0gJyFwcnVlYmEgZGUgZXJyb3IgYWwgZ3JhYmFyIScpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRElPIFBSVUVCQSBERSBFUlJPUiBBTCBHUkFCQVInKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIG9wZXJhdGl2bywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgcGVyc2lzdGVudGVzLmluZm9ybWFjaW9uSGRyW2lkRW5jXS50YXJlYS50YXJlYSk7XHJcbiAgICAgICAgICAgICAgICAvL2d1YXJkYXIgcGFyYWxlbGFtZW50ZSBlbiB0YWJsYXMgdWFcclxuICAgICAgICAgICAgICAgIHZhciBwcm9jZWR1cmVHdWFyZGFyID0gYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhcjtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRhZG8gPSBgaWQgZW5jICR7aWRFbmN9OiBgO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtX2d1YXJkYXI9e29wZXJhdGl2bzogb3BlcmF0aXZvLGlkX2Nhc286aWRFbmMsIGRhdG9zX2Nhc286cmVzcHVlc3Rhc1VBUHJpbmNpcGFsfVxyXG4gICAgICAgICAgICAgICAgbGV0IGVyck1lc3NhZ2U6IHN0cmluZ3xudWxsO1xyXG4gICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24oY2xpZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvKz0gYXdhaXQgcHJvY2VkdXJlR3VhcmRhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1fZ3VhcmRhciwgY2xpZW50KTsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGVyck1lc3NhZ2UgPSByZXN1bHRhZG8gKyBcImRtX2ZvcnBrcmFpel9kZXNjYXJnYXIuIFwiKyBlcnIgO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbyA9IGVyck1lc3NhZ2VcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBwYXNlX3RhYmxhPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgW29wZXJhdGl2bywgaWRFbmMsIHJlc3VsdGFkb11cclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTsgICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICB9KS5hcnJheSgpKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvaydcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonZG1fc2luY3Jvbml6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncGVyc2lzdGVudGVzJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIge3BlcnNpc3RlbnRlc30gPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgICAgICB2YXIgbnVtX3NpbmNybzpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIHRva2VuOnN0cmluZ3xudWxsPXBlcnNpc3RlbnRlcz8udG9rZW47XHJcbiAgICAgICAgICAgIGlmKCF0b2tlbil7XHJcbiAgICAgICAgICAgICAgICB0b2tlbiA9IChhd2FpdCBiZS5wcm9jZWR1cmUudG9rZW5fZ2V0LmNvcmVGdW5jdGlvbihjb250ZXh0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcmFnZW50OiBjb250ZXh0LnNlc3Npb24ucmVxLnVzZXJhZ2VudCwgXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IGNvbnRleHQudXNlcm5hbWVcclxuICAgICAgICAgICAgICAgIH0pKS50b2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIge3ZhbHVlfSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHNpbmNyb25pemFjaW9uZXMgKHRva2VuLCB1c3VhcmlvLCBkYXRvcylcclxuICAgICAgICAgICAgICAgICAgICBWQUxVRVMgKCQxLCQyLCQzKSBcclxuICAgICAgICAgICAgICAgICAgICBSRVRVUk5JTkcgc2luY3JvXHJcbiAgICAgICAgICAgICAgICBgLCBbdG9rZW4sIGNvbnRleHQudXNlcm5hbWUsIHBlcnNpc3RlbnRlc11cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVZhbHVlKCk7XHJcbiAgICAgICAgICAgIG51bV9zaW5jcm89dmFsdWU7XHJcbiAgICAgICAgICAgIHZhciBjb25kdml2PSBgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR0Lm9wZXJhdGl2bz0gJDEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhc2lnbmFkbyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0dC5vcGVyYWNpb249J2NhcmdhcicgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAodHQuY2FyZ2Fkb19kbSBpcyBudWxsIG9yIHR0LmNhcmdhZG9fZG0gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKHRva2VuKX0pXHJcbiAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgY29uc3QgVUFfUFJJTkNJUEFMID0gYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTyk7XHJcbiAgICAgICAgICAgIGlmKHBlcnNpc3RlbnRlcyl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGVyc2lzdGVudGVzLnJlc3B1ZXN0YXNbVUFfUFJJTkNJUEFMXSkubWFwKGFzeW5jIChyZXNwdWVzdGFzVUFQcmluY2lwYWwsIGlkRW5jKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJlYSA9IHBlcnNpc3RlbnRlcy5pbmZvcm1hY2lvbkhkcltpZEVuY10udGFyZWEudGFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHB1ZWRvR3VhcmRhckVuVEVNPXRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtwYXJhbXMsc2V0dGVyc30gPSBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzVUFQcmluY2lwYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBlc3RhZG8gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0EpfWAsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNhcmdhZG9fZG09bnVsbGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbT1BFUkFUSVZPLCBpZEVuYywgdGFyZWEsIHRva2VuXVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5VGFyZWFzVGVtID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7c2V0dGVycy5qb2luKCcsJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMiBhbmQgdGFyZWEgPSAkMyBhbmQgY2FyZ2Fkb19kbSA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNcclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgICAgICAgICBwdWVkb0d1YXJkYXJFblRFTT1xdWVyeVRhcmVhc1RlbS5yb3dDb3VudD09MTtcclxuICAgICAgICAgICAgICAgICAgICBpZihwdWVkb0d1YXJkYXJFblRFTSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIE9QRVJBVElWTywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgdGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2d1YXJkYXIgcGFyYWxlbGFtZW50ZSBlbiB0YWJsYXMgdWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0gYGlkIGVuYyAke2lkRW5jfTogYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtX2d1YXJkYXI9e29wZXJhdGl2bzogT1BFUkFUSVZPLGlkX2Nhc286aWRFbmMsIGRhdG9zX2Nhc286cmVzcHVlc3Rhc1VBUHJpbmNpcGFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyTWVzc2FnZTogc3RyaW5nfG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24oY2xpZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8rPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbV9ndWFyZGFyLCBjbGllbnQpOyAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwiZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci4gXCIrIGVyciA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBlcnJNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHBhc2VfdGFibGE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGlkRW5jLCByZXN1bHRhZG9dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSgnbG9jYWwtcmVjaWJpZG8tc2luLXRva2VuLnR4dCcsIEpTT04uc3RyaW5naWZ5KHtub3c6bmV3IERhdGUoKSx1c2VyOmNvbnRleHQudXNlcm5hbWUsaWRDYXNvOiBpZEVuYyx2aXZpZW5kYTogcmVzcHVlc3Rhc1VBUHJpbmNpcGFsfSkrJ1xcblxcbicsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0pLmFycmF5KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB7cm93fSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGdldEhkclF1ZXJ5KGNvbmR2aXYsIGNvbnRleHQpLFtPUEVSQVRJVk8sY29udGV4dC51c2VyLmlkcGVyXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICBzZXQgIGVzdGFkbyA9ICQ0LCBjYXJnYWRvX2RtPSQzOjp0ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgJHtjb25kdml2fSBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgZW5jYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWTywgcGFyYW1ldGVycy5lbmM/cGFyYW1ldGVycy5lbmM6Y29udGV4dC51c2VyLmlkcGVyLCB0b2tlbiwgRVNUQURPX1BPU1RFUklPUl9DQVJHQV1cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBPUEVSQVRJVk8sIFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmE6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0b2tlbixcclxuICAgICAgICAgICAgICAgIG51bV9zaW5jcm8sXHJcbiAgICAgICAgICAgICAgICBpZHBlcjpjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6bGlrZUFyLmNyZWF0ZUluZGV4KHJvdy5jYXJnYXMubWFwKGNhcmdhPT4oey4uLmNhcmdhLCBmZWNoYTpjYXJnYS5mZWNoYT9kYXRlLmlzbyhjYXJnYS5mZWNoYSkudG9EbXkoKTpudWxsLCBlc3RhZG9fY2FyZ2E6J3JlbGV2YW1pZW50byd9KSksICdjYXJnYScpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2RtX2JhY2t1cCcsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOid0b2tlbicgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0ZW0nICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge2JlLCBjbGllbnR9ID1jb250ZXh0O1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHZhciBudW1fc2luY3JvOm51bWJlcj0wO1xyXG4gICAgICAgICAgICB2YXIgdG9rZW46c3RyaW5nfG51bGw9cGFyYW1ldGVycy50b2tlbjtcclxuICAgICAgICAgICAgaWYodG9rZW4gPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge29rOidvazpOL1QnfTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB2YXIge3Jvd0NvdW50fSA9IGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0IDEgZnJvbSB0b2tlbnMgd2hlcmUgdG9rZW4gPSAkMWAsW3Rva2VuXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgaWYoIXJvd0NvdW50KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge29rOidvazpOL1QnfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihwYXJhbWV0ZXJzLnRlbSl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChsaWtlQXIocGFyYW1ldGVycy50ZW0pLm1hcChhc3luYyAoYmFja3VwOmFueSk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBqc29uX2JhY2t1cCA9ICQzLCBmZWNoYV9iYWNrdXAgPSBjdXJyZW50X3RpbWVzdGFtcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIGpzb25fYmFja3VwIGlzIGRpc3RpbmN0IGZyb20gJDRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGJhY2t1cC5mb3JQa1JhaXoudml2aWVuZGEsIGJhY2t1cC5yZXNwdWVzdGFzUmFpeiwgYmFja3VwLnJlc3B1ZXN0YXNSYWl6XVxyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgfSkuYXJyYXkoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG9rOidvaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2NvbnNpc3Rpcl92aXZpZW5kYScsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgLHJlZmVyZW5jZXM6J29wZXJhdGl2b3MnLCAgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3ZpdmllbmRhJyAgICAgICAsdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIHtiZSwgY2xpZW50fSA9Y29udGV4dDtcclxuICAgICAgICAgICAgbGV0IHBhcmFtX3Byb2M9e1xyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBwYXJhbWV0ZXJzLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgIGlkX2Nhc286IHBhcmFtZXRlcnMudml2aWVuZGFcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgbGV0IGVyck1lc3NhZ2U6IHN0cmluZ3xudWxsO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0YWRvOiBzdHJpbmd8bnVsbDtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0YWRvPSBhd2FpdCBiZS5wcm9jZWR1cmUuY29uc2lzdGlyX2VuY3Vlc3RhLmNvcmVGdW5jdGlvbihjb250ZXh0LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fcHJvYywgY2xpZW50XHJcbiAgICAgICAgICAgICAgICApOyAgICBcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBlcnJNZXNzYWdlID0gXCIgY29uc2lzdGlyX3ZpdmllbmRhLiBcIisgZXJyIDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyck1lc3NhZ2UpXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcqKioqKiogY29uc2lzdGlyX3ZpdmllbmRhIHJlc3VsdGFkbzonLHJlc3VsdGFkbykgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG9rOidvaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9yZXNjYXRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidsb2NhbFN0b3JhZ2VJdGVtJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonbG9jYWxTdG9yYWdlSXRlbUtleScgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdW5sb2dnZWQ6dHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciB7bG9jYWxTdG9yYWdlSXRlbUtleSwgbG9jYWxTdG9yYWdlSXRlbX0gPSBwYXJhbXM7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvY2FsU3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSgnbG9jYWwtcmVzY2F0ZS50eHQnLCBKU09OLnN0cmluZ2lmeSh7bm93Om5ldyBEYXRlKCksdXNlcjpjb250ZXh0LnVzZXJuYW1lLCBpdGVtS2V5OiBsb2NhbFN0b3JhZ2VJdGVtS2V5LCBpdGVtRGF0YTogbG9jYWxTdG9yYWdlSXRlbX0pKydcXG5cXG4nLCAndXRmOCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdvcGVyYXRpdm9fZ2V0JyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2dldF9yYW5kb21fZnJlZV9jYXNlJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOlt7bmFtZTonb3BlcmF0aXZvJyAgICAsIHR5cGVOYW1lOid0ZXh0J31dLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgY29uc3QgbWluc1RvRXhwaXJlID0gMzA7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbnNTaW5jZUJsb3F1ZWQgPSBgZGF0ZV9wYXJ0KCdtaW4nLCBhZ2UoY3VycmVudF90aW1lc3RhbXAsIGZlY2hhX2Jsb3F1ZW8pKWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuYyA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBzZWxlY3QgZW5jIGZyb20gdGVtIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgKGxpYnJlIG9yICR7bWluc1NpbmNlQmxvcXVlZH0gPiAke21pbnNUb0V4cGlyZX0pIGxpbWl0IDE7YCxbcGFyYW1zLm9wZXJhdGl2b10pLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFVQREFURSB0ZW0gc2V0IGxpYnJlID0gZmFsc2UsIGZlY2hhX2Jsb3F1ZW89Y3VycmVudF90aW1lc3RhbXAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJgLFtwYXJhbXMub3BlcmF0aXZvLCBlbmMudmFsdWVdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBlbmMudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdtdWVzdHJhX2dlbmVyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgICAgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCJ9LFxyXG4gICAgICAgICAgICB7bmFtZTonYXJlYScgICAgICAgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJywgcmVmZXJlbmNlczogXCJhcmVhc1wifSxcclxuICAgICAgICAgICAge25hbWU6J2RvbWluaW8nICAgICAgICAgICAgLCB0eXBlTmFtZTonaW50ZWdlcicsIGRlZmF1bHRWYWx1ZTogM30sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50X2VuY3Vlc3RhcycgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgY29uc3QgYmUgPSAgY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHtwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYX0gPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0IHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gb3BlcmF0aXZvcyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMVxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvXSkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG4gICAgICAgICAgICBpZihwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSl7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGVtVGFibGVEZWY6VGFibGVEZWZpbml0aW9uID0gYmUudGFibGVTdHJ1Y3R1cmVzWyd0ZW0nXShjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihwYXJhbXMuY2FudF9lbmN1ZXN0YXMsbWF4QUdlbmVyYXIpOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmMgPSBnZW5lcmFySWRFbmNGdW4ocGFyYW1zLmFyZWEsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgSU5TRVJUIGludG8gdGVtIChvcGVyYXRpdm8sIGVuYywgYXJlYSwgZG9taW5pbywgaGFiaWxpdGFkYSkgdmFsdWVzICgkMSwgJDIsICQzLCAkNCwgJDUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uIGNvbmZsaWN0ICgke3NxbFRvb2xzLnF1b3RlSWRlbnRBcnJheSh0ZW1UYWJsZURlZi5wcmltYXJ5S2V5KS5qb2luKCcsJyl9KSBkbyBub3RoaW5nYCxcclxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgZW5jLCBwYXJhbXMuYXJlYSwgcGFyYW1zLmRvbWluaW8sIHRydWVdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZW5lcmFyVGFyZWFzVGVtRmFsdGFudGVzKGNvbnRleHQsIHBhcmFtcy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJlbCBvcGVyYXRpdm8gbm8gcGVybWl0ZSBnZW5lcmFyIG11ZXN0cmFcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgeyAgICAgXHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfYmxhbnF1ZWFyX3ByZXZpc3VhbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcIm9wZXJhdGl2b3NcIn0sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczpbJ2Nvb3JfcHJvYycsJ2FkbWluJ10sXHJcbiAgICAgICAgcmVzdWx0T2s6J21vc3RyYXJfZW5jdWVzdGFfYV9ibGFucXVlYXJfY29udGVuaWRvJyxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIC0tcGsgdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IgKGBObyBzZSBlbmNvbnRyw7MgbGEgZW5jdWVzdGEgJHtwYXJhbXMuZW5jfSBwYXJhIGVsIG9wZXJhdGl2byAke3BhcmFtcy5vcGVyYXRpdm99LiAke2Vyci5tZXNzYWdlfWAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7Y2Fzb1RlbTogcmVzdWx0LnJvd307XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ibGFucXVlYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcIm9wZXJhdGl2b3NcIn0sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOlsnY29vcl9wcm9jJywnYWRtaW4nXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tICR7YmUuZGIucXVvdGVJZGVudChPcGVyYXRpdm9HZW5lcmF0b3IubWFpblREKX0gXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAke2JlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgLy9wYXNvIGEgZW5jdSBwYXJhIGd1YXJkYXIgZW4gaGlzdG9yaWFsXHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhX2FjdHVhbCA9ICdlbmN1J1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiAtLXBrIHZlcmlmaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgZ2VuZXJhclRhcmVhc1RlbUZhbHRhbnRlcyhjb250ZXh0LCBwYXJhbXMub3BlcmF0aXZvKTsgICAgICAgICBcclxuICAgICAgICAgICAgLy9yZXNldGVvIHRlbSAobm8gc2UgZ3VhcmRhIGhpc3RvcmlhbCBwb3JxdWUgdGFyZWFfYWN0dWFsIGVzIG51bGwpXHJcbiAgICAgICAgICAgIC8vZ3VhcmRvIGJhY2t1cCBwb3IgbGFzIGR1ZGFzXHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25fYmFja3VwID0ganNvbl9lbmN1ZXN0YSwganNvbl9lbmN1ZXN0YSA9IG51bGwsIHRhcmVhX2FjdHVhbCA9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX21vZGlmX2VuY3Vlc3RhID0gbnVsbCwgZmVjaGFfYmFja3VwID0gY3VycmVudF90aW1lc3RhbXAsIG1vZGlmaWNhZG8gPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVuX2VzdGFkbyA9IG51bGwsIHJlc3VtZW5fZXN0YWRvX3N1cCA9IG51bGwsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzZV90YWJsYSA9IG51bGwsIHJlYSA9IG51bGwsIG5vcmVhID0gbnVsbCwgcmVhX3N1cCA9IG51bGwsIG5vcmVhX3N1cCA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgLS1wayB2ZXJpZmljYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIGluY29uc2lzdGVuY2lhc1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCAke2JlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSBpbl9jb25fdmFyXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIHBrX2ludGVncmFkYS0+PiR7YmUuZGIucXVvdGVMaXRlcmFsKE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQSyl9ID0gJDJcclxuICAgICAgICAgICAgYCxbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gaW5jb25zaXN0ZW5jaWFzX3VsdGltYXNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgcGtfaW50ZWdyYWRhLT4+JHtiZS5kYi5xdW90ZUxpdGVyYWwoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URFBLKX0gPSAkMlxyXG4gICAgICAgICAgICBgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gYGxhIGVuY3Vlc3RhICR7cGFyYW1zLmVuY30gc2UgYmxhbnF1ZcOzIGNvcnJlY3RhbWVudGVgO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnYWNjaW9uX3RhcmVhc190ZW1fZWplY3V0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonY29uZGljaW9uJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidhY2Npb24nICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9ICBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgYWNjaW9uID0gcGFyYW1zLmFjY2lvbiBhcyBFc3RhZG9BY2Npb247XHJcbiAgICAgICAgICAgIHZhciBjdW1wbGU6Ym9vbGVhbiA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgYWNjaW9uX2N1bXBsZV9jb25kaWNpb24oJDUsICQ2LCAkNywgJDgsIChcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3QgY29uZGljaW9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbSBlc3RhZG9zX2FjY2lvbmVzIFxyXG4gICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVzdGFkbyA9ICQyIGFuZCBlYWNjaW9uID0gJDMgYW5kIGVzdGFkb19kZXN0aW5vID0gJDRcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKWAsIFtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sIFxyXG4gICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkbywgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZWFjY2lvbiwgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG8sIFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmVuYywgXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZWFjY2lvbixcclxuICAgICAgICAgICAgXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgaWYoIWN1bXBsZSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gc2UgcHVkbyBlamVjdXRhciBsYSBhY2Npw7NuLCBubyBzZSBjdW1wbGUgbGEgY29uZGljacOzbiBcIiR7cGFyYW1zLmNvbmRpY2lvbn1cIiBvIGJpZW4gZWwgZXN0YWRvIGVzdMOhIGRlc2FjdHVhbGl6YWRvLCByZWZyZXNxdWUgbGEgZ3JpbGxhLmApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlbmM9JDIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5lbmMsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy50YXJlYSwgXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkb19kZXN0aW5vXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgaWYoYWNjaW9uLm5vbWJyZV9wcm9jZWR1cmUpe1xyXG4gICAgICAgICAgICAgICAgaWYoYmUucHJvY2VkdXJlW2FjY2lvbi5ub21icmVfcHJvY2VkdXJlXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlW2FjY2lvbi5ub21icmVfcHJvY2VkdXJlXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGV4aXN0ZSBlbCBwcm9jZWR1cmUgXCIke2FjY2lvbi5ub21icmVfcHJvY2VkdXJlfVwiIGRlZmluaWRvIGVuIGxhIHRhYmxhIFwiZXN0YWRvc19hY2Npb25lc1wiIHBhcmEgZWxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm86ICR7YWNjaW9uLm9wZXJhdGl2b30sIGVzdGFkbzogJHthY2Npb24uZXN0YWRvfSwgZWFjY2lvbjogJHthY2Npb24uZWFjY2lvbn0uYClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBCVVNDTyBQQVNFIERFIFRBUkVBXHJcbiAgICAgICAgICAgIHZhciB0YXJlYVNpZ3VpZW50ZSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3Byb3hpbWFzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byA9ICQxIGFuZCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWEgPSAkMiBhbmQgZXN0YWRvID0gJDMgYW5kIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYV9jdW1wbGVfY29uZGljaW9uKCQ0LCAkNSwgJDYsICQ3LCBjb25kaWNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgb3JkZW5cclxuICAgICAgICAgICAgICAgICAgICBsaW1pdCAxYFxyXG4gICAgICAgICAgICAsW1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2bywgXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMudGFyZWEsXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLCBcclxuICAgICAgICAgICAgICAgIHBhcmFtcy50YXJlYSxcclxuICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG9fZGVzdGlubyxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5lbmNcclxuICAgICAgICAgICAgXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpKS5yb3c7XHJcbiAgICAgICAgICAgIGlmKHRhcmVhU2lndWllbnRlKXtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgXHJcbiAgICAgICAgICAgICAgICAgICAgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCB0YXJlYVNpZ3VpZW50ZS50YXJlYV9kZXN0aW5vXVxyXG4gICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGF1dG9Bc2lnbmFkbyA9IHRhcmVhU2lndWllbnRlLnJlZ2lzdHJhX3JlY2VwY2lvbmlzdGE/Y29udGV4dC51c2VyLmlkcGVyOm51bGw7XHJcbiAgICAgICAgICAgICAgICBsZXQgcSA9IGNvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0c19lbnRyYWRhID0gY3VycmVudF90aW1lc3RhbXAsIGFkZWxhbnRhciA9IG51bGwsIGVzdGFkbyA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2F1dG9Bc2lnbmFkbz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiwgcmVjZXBjaW9uaXN0YT1cIitxKGF1dG9Bc2lnbmFkbylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpcIlwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgXHJcbiAgICAgICAgICAgICAgICAgICAgLFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCB0YXJlYVNpZ3VpZW50ZS50YXJlYV9kZXN0aW5vLCB0YXJlYVNpZ3VpZW50ZS5lc3RhZG9fZGVzdGlub11cclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIGlmKHRhcmVhU2lndWllbnRlLm5vbWJyZV9wcm9jZWR1cmUpe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVt0YXJlYVNpZ3VpZW50ZS5ub21icmVfcHJvY2VkdXJlXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBGSU4gUEFTRSBERSBUQVJFQVxyXG4gICAgICAgICAgICByZXR1cm4gXCJva1wiO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2FyZ2FfcHJlcGFyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBvcGVyYWNpb24gPSAnY2FyZ2FyJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGlzcG9uaWJpbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBhc2lnbmFkbyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2Rlc2NhcmdhX3ByZXBhcmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gJ2Rlc2NhcmdhcidcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2Rlc2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9ICdjYXJnYXInXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9hbmFsaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhJyAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5jb25zaXN0aXJfZW5jdWVzdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHtvcGVyYXRpdm86cGFyYW1zLm9wZXJhdGl2bywgaWRfY2FzbzpwYXJhbXMuZW5jfSlcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV92ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gJzEnXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub192ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2VycmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidlbmMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdmVyaWZpY2FkbyA9ICcxJywgYXNpZ25hZG8gPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jLCBjb250ZXh0LnVzZXIuaWRwZXJdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19jZXJyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfc3VwZXJ2aXNhcl9wcmVzZW5jaWFsJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkMywgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdzdXBlJywgMV0pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX3N1cGVydmlzYXJfdGVsZWZvbmljYScsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDMsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnc3VwZScsIDJdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19zdXBlcnZpc2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkMywgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ2ZpbmMnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfcGFzYXJfYV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0NDJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYSBpbiAoJDMsJDQpIC0tcXVpZXJvIHBhc2FyIGxhcyAyIHRhcmVhcyBhIENDXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX3Bhc2FyX2FfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdBJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICcwRCdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGV2b2x2ZXJfcHJvY19kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCxwYXJhbXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnQSdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdwcm9jJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfbm9fZGV2b2x2ZXJfcHJvY19kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0NDJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYSBpbiAoJDMsJDQpIC0tcXVpZXJvIHBhc2FyIGxhcyAyIHRhcmVhcyBhIENDXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX25vX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCxwYXJhbXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX3JlY3VwZXJhcl9kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYScgICAgICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHtvcGVyYXRpdm8sIGVuYywgdGFyZWF9ID0gcGFyYW1zO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuZW5jdWVzdGFfdmVyaWZpY2FyLmNvcmVGdW5jdGlvbihjb250ZXh0LHBhcmFtcyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCAncmVjdSddKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19yZWN1cGVyYXJfZGVzZGVfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTondGFyZWEnICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7b3BlcmF0aXZvLCBlbmMsIHRhcmVhfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCAncmVjdScsICdhbmFjJ10pXHJcbiAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuZW5jdWVzdGFfbm9fdmVyaWZpY2FyLmNvcmVGdW5jdGlvbihjb250ZXh0LHBhcmFtcyk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZm9yemFyX3RhcmVhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J29wZXJhdGl2bycgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jJyAgICAgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOid0YXJlYV9hY3R1YWwnICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3RhcmVhX251ZXZhJyAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIge29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWwsIHRhcmVhX251ZXZhfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWwsIHRhcmVhX251ZXZhXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0YXJlYXNfdGVtIFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnVicgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWxdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRhcmVhc190ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICcwRCdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbb3BlcmF0aXZvLCBlbmMsIHRhcmVhX251ZXZhXSlcclxuICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfaGFiaWxpdGFyX2Rlc2hhYmlsaXRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2VuYycgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGhhYmlsaXRhZGEgPSBub3QgaGFiaWxpdGFkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246IEFDQ0lPTl9QQVNBUl9QUk9JRSxcclxuICAgICAgICBwYXJhbWV0ZXJzOltdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIF9wYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbWV0cm9zID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAqIGZyb20gcGFyYW1ldHJvcyB3aGVyZSB1bmljb19yZWdpc3Ryb2AsXHJcbiAgICAgICAgICAgIFtdKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3c7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3QgPSBgc2VsZWN0IHQub3BlcmF0aXZvLCB0LmVuYywgdC50YXJlYV9hY3R1YWwsIHR0LnRzX2VudHJhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSB0dCBqb2luIHRlbSB0IHVzaW5nIChvcGVyYXRpdm8sZW5jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdHQub3BlcmF0aXZvPSQxIGFuZCB0dC50YXJlYT0gJDIgYW5kICgke2dldERpYXNBUGFzYXJRdWVyeSgndHQnKX0gPD0gMCBvciBjb2FsZXNjZSh0dC5hZGVsYW50YXIsZmFsc2UpKSBhbmQgdHQudGFyZWEgPSB0LnRhcmVhX2FjdHVhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdWJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICgke3NlbGVjdH0pIGF1eFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0dC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0dC5lbmMgPSBhdXguZW5jIGFuZCB0dC50YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0cm9zLm9wZXJhdGl2bywgJ2ZpbmMnLCAnZmluYyddKVxyXG4gICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgLy9UT0RPIGFzaWduYXIgZW4gcHJvY2VzYW1pZW50b1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdBJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICgke3NlbGVjdH0pIGF1eFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0dC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0dC5lbmMgPSBhdXguZW5jIGFuZCB0dC50YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0cm9zLm9wZXJhdGl2bywgJ2ZpbmMnLCAncHJvYyddKVxyXG4gICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSB0XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICdwcm9jJ1xyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gKCR7c2VsZWN0fSkgYXV4XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgdC5vcGVyYXRpdm8gPSBhdXgub3BlcmF0aXZvIGFuZCB0LmVuYyA9IGF1eC5lbmNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAgLFxyXG4gICAgICAgICAgICBbcGFyYW1ldHJvcy5vcGVyYXRpdm8sICdmaW5jJ10pLmZldGNoQWxsKCk7XHJcbiAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J2ludGVyY2FtYmlhcl9lbmN1ZXN0YXMnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonZW5jMScgICAgICAgICAgICAgICAgLHJlZmVyZW5jZXM6J3RlbScgLCB0eXBlTmFtZTondGV4dCcgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J3JlYTEnICAgICAgICAgICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50UGVyRW5jMScgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJyAgICB9LFxyXG4gICAgICAgICAgICB7bmFtZTonZW5jMicgICAgICAgICAgICAgICAgLCB0eXBlTmFtZTondGV4dCcgICAgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J3JlYTInICAgICAgICAgICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInICAgIH0sXHJcbiAgICAgICAgICAgIHtuYW1lOidjYW50UGVyRW5jMicgICAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJyAgICB9LFxyXG4gICAgICAgICAgICB7bmFtZToncGFzbycgICAgICAgICAgICAgICAgLCB0eXBlTmFtZTonaW50ZWdlcicgICAgfSxcclxuICAgICAgICAgICAge25hbWU6J2NvbmZpcm1hJyAgICAgICAgICAgICwgdHlwZU5hbWU6J2Jvb2xlYW4nLCBkZWZhdWx0VmFsdWU6ZmFsc2UsIGxhYmVsOidDb25maXJtYSBpbnRlcmNhbWJpbyBkZSBsb3MgZGF0b3MgZW50cmUgbGFzIGVuY3Vlc3Rhcz8gJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6Wydjb29yX3Byb2MnLCdjb29yX2NhbXBvJywnYWRtaW4nXSxcclxuICAgICAgICBwcm9ncmVzczp0cnVlLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBQYXJhIGNvbnRyb2xhcjpcclxuICAgICAgICAgICAgICogLSBxdWUgbGFzIGhvZ2FyZXMsIHBlcnNvbmFzLCBldGMgZXN0w6luIGludGVyY2FtYmlhZGFzIFxyXG4gICAgICAgICAgICAgKiAgKiB0YW50byBlbiBlbCBqc29uXHJcbiAgICAgICAgICAgICAqICAqIGNvbW8gZW4gbGFzIFREc1xyXG4gICAgICAgICAgICAgKiAtIGNvc2FzIHF1ZSBzZSBjYWxjdWxhbiBwb3IgbGEgYXBwPyBjdWFsZXM/IChyZXN1bWVuX2VzdGFkbywgcmVhIHkgbm9yZWEpXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB2YXIgcGFyYW1fY2FudHBlcj1bcGFyYW1zLmNhbnRQZXJFbmMxLHBhcmFtcy5jYW50UGVyRW5jMl07XHJcbiAgICAgICAgICAgIHZhciBwYXJhbV9yZWE9W3BhcmFtcy5yZWExLHBhcmFtcy5yZWEyXTsgICAgXHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5jb25maXJtYSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbmZpcm3DsyBpbnRlcmNhbWJpbycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCAhcGFyYW1zLmVuYzEgfHwgIXBhcmFtcy5lbmMyKSAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgRmFsdGEgaW5ncmVzYXIgdW4gbnVtZXJvIGRlIGVuY3Vlc3RhIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICggcGFyYW1zLmVuYzE9PXBhcmFtcy5lbmMyKSAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgZW5jMSB5IGVuYzIgZGViZW4gc2VyIGRpc3RpbnRvcyEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoWzEsMl0uaW5jbHVkZXMocGFyYW1zLnBhc28pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBwYXNvIGRlYmUgc2VyIDEoZWxpbWluYXIgZGF0b3MgKSApbyAyIChpbnRlcmNhbWJpbyB5IHJlZ2VuZXJhY2lvbiBkYXRvcyknKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLnBhc289PTEpe1xyXG4gICAgICAgICAgICAgICAgcGFyYW1fY2FudHBlci5mb3JFYWNoKChucGVyLGkpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFucGVyKSAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yLCBDYW50aWRhZCBkZSBQZXJzb25hcyBUb3RhbCBkZSBlbmMke2krMX0sIG5vIGVzdGEgaW5ncmVzYWRvIWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0gICBcclxuICAgICAgICAgICAgcGFyYW1fcmVhLmZvckVhY2goKHIsaSk9PntcclxuICAgICAgICAgICAgICAgIGlmICghcikgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yLCByZWEgIGRlIGVuYyR7aSsxfSwgbm8gZXN0YSBpbmdyZXNhZG8hYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pICAgXHJcbiAgICAgICAgICAgIC8vIENPTlRST0xBUiBRVUUgTklOR1VOQSBERSBMQVMgMiBlbmN1ZXN0YXMgRVNURSBDQVJHQURBLCBBQklFUlRBIEZBTFRBXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gICA9IGF3YWl0IGdldE9wZXJhdGl2b0FjdHVhbChjb250ZXh0KTtcclxuICAgICAgICAgICAgY29uc3QgVUFfUFJJTkMgICAgPSBjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoT3BlcmF0aXZvR2VuZXJhdG9yLm1haW5URCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBrX1VBX1BSSU5DID0gY29udGV4dC5iZS5kYi5xdW90ZUlkZW50KE9wZXJhdGl2b0dlbmVyYXRvci5tYWluVERQSykgICAgXHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdG9zX2NvbnRyb2w9KGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAke3BrX1VBX1BSSU5DfSwgcmVhLCBjb3VudCgqKW5wIFxyXG4gICAgICAgICAgICAgICAgICBmcm9tIHRlbSB0IGxlZnQgam9pbiBwZXJzb25hcyBwIG9uIHQub3BlcmF0aXZvPXAub3BlcmF0aXZvIGFuZCB0LmVuYz1wLiR7cGtfVUFfUFJJTkN9XHJcbiAgICAgICAgICAgICAgICAgIHdoZXJlIHAub3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfSBJTiAoJDIsJDMpXHJcbiAgICAgICAgICAgICAgICAgIGdyb3VwIGJ5ICR7cGtfVUFfUFJJTkN9LCByZWFcclxuICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgJHtwa19VQV9QUklOQ31cclxuICAgICAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBkYXRvc19jb250cm9sLmZvckVhY2goKGRjLGkpPT57XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1fY2FudHBlcltpXSAhPT0gZGMubnApIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeG1lbnM9YEVycm9yLCBubyBjb2luY2lkZSBsYSBjYW50aWRhZCBkZSBwZXJzb25hcyBkZSBlbmMke2krMX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih4bWVucyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtX3JlYVtpXSAhPT0gZGMucmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhtZW5zPWBFcnJvciwgbm8gY29pbmNpZGUgbGEgcmVhIGRlIGVuYyR7aSsxfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHhtZW5zKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pOyAgICBcclxuXHJcbiAgICAgICAgICAgIHZhciBkYXRvc190ZW09KGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCB0LmVuYywgdGFyZWFfYWN0dWFsLCBqc29uX2VuY3Vlc3RhLCBlc3RhZG8gXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSB0ZW0gdCBsZWZ0IGpvaW4gdGFyZWFzX3RlbSB0dCBvbiB0Lm9wZXJhdGl2bz10dC5vcGVyYXRpdm8gYW5kIHQuZW5jPXR0LmVuYyBhbmQgdC50YXJlYV9hY3R1YWw9dHQudGFyZWEgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgdC5vcGVyYXRpdm89JDEgYW5kIHQuZW5jIGluICgkMiwkMykgXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgdC5lbmMgXHJcbiAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hBbGwoKSkucm93cztcclxuXHJcbiAgICAgICAgICAgIC8vRkFMVEEgY29udHJvbGFyIGVzdGFkbyB5IHRhcmVhX2FjdHVhbFxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICBkYXRvc190ZW0uZm9yRWFjaCgoZHQsaSk9PntcclxuICAgICAgICAgICAgICAgIGlmICghKFsnUCddLmluY2x1ZGVzKGR0W2ldLmVzdGFkbyl8fCBbJ3Byb2MnLCdmaW5jJywnYW5hYyddLmluY2x1ZGVzKGR0W2ldLnRhcmVhX2FjdHVhbCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhtZW5zPWBFcnJvciwgc29sbyBzZSBwdWVkZSBpbnRlcmNhbWJpYXIgZW5jdWVzdGFzIGVuIHRhcmVhIHByb2MsIGZpbmMsIGFuYWMgb3IgZW4gZXN0YWRvIFAsIGVuYyR7aSsxfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHhtZW5zKTsgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChkYXRvc190ZW0ubGVuZ3RoIT0yKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIE5vIHNlIGVuY29udHJhcm9uIDIgZW5jdWVzdGFzJykgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmICggcGFyYW1zLnBhc28gPT0gMSApe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpbXBpYSBsYXMgVERzIFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZHRlbSBvZiBkYXRvc190ZW0peyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZGVsZXRlIGZyb20gJHtVQV9QUklOQ30gd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfT0kMmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgW09QRVJBVElWTywgZHRlbS5lbmNdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmIChwYXJhbXMucGFzbyA9PSAyKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW50X3Zpdj0oYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgIGNvdW50KCopIG52aXYgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAke3BrX1VBX1BSSU5DfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHAub3BlcmF0aXZvPSQxIGFuZCAke3BrX1VBX1BSSU5DfSBJTiAoJDIsJDMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FudF92aXY9PTApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zaW11bGEgZ3VhcmRhZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuYzEgPSBkYXRvc190ZW1bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmMyID0gZGF0b3NfdGVtWzFdOyAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgT1BFUkFUSVZPLCBlbmMxLmVuYywgZW5jMi50YXJlYV9hY3R1YWwgLCBlbmMyLmpzb25fZW5jdWVzdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgT1BFUkFUSVZPLCBlbmMyLmVuYywgZW5jMS50YXJlYV9hY3R1YWwgLCBlbmMxLmpzb25fZW5jdWVzdGEpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2hhY2VyIGludGVyY2FtYmlvIGRlbCBlc3RhZG8gZGUgbGEgZW5jdWVzdGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvPSQ0LGFzaWduYWRvPSQ1IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0kMyBgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFtPUEVSQVRJVk8sIGVuYzEuZW5jLCBlbmMyLnRhcmVhX2FjdHVhbCwgZW5jMi5lc3RhZG8sIGVuYzIuYXNpZ25hZG9dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG89JDQsYXNpZ25hZG89JDUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDIgYW5kIHRhcmVhPSQzIGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgW09QRVJBVElWTywgZW5jMi5lbmMsIGVuYzEudGFyZWFfYWN0dWFsLCBlbmMxLmVzdGFkbywgZW5jMS5hc2lnbmFkb11cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5leGVjdXRlKCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9oYWNlciBiYWNrdXAgXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIEZhbHRhIHJlYWxpemFyIHBhc28gMSEnKSBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBwYXNvIG5vIGNvbnNpZGVyYWRvIScpICAgIFxyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAoYExpc3RvIHBhc28gJHtwYXJhbXMucGFzb30uIEludGVyY2FtYmlvIHJlYWxpemFkbyBlbnRyZSBsYXMgZW5jdWVzdGFzICAke3BhcmFtcy5lbmMxfSB5ICR7cGFyYW1zLmVuYzJ9LiBQb3IgZmF2b3IgY29uc2lzdGEgbGEgZW5jdWVzdGFgKVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7ICAgICBcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YWRvcl9kbXNfbW9zdHJhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidvcGVyYXRpdm8nICAgICAgICwgdHlwZU5hbWU6J3RleHQnLCByZWZlcmVuY2VzOlwib3BlcmF0aXZvc1wifSxcclxuICAgICAgICAgICAge25hbWU6J2VuY3Vlc3RhZG9yJyAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6Wydjb29yX3Byb2MnLCdhZG1pbiddLFxyXG4gICAgICAgIHJlc3VsdE9rOidtb3N0cmFyX2VuY3Vlc3Rhc19hX2JsYW5xdWVhcicsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGFzaWduYWRvID0gJDIgYW5kIGNhcmdhZG9fZG0gaXMgbm90IG51bGxcclxuICAgICAgICAgICAgICAgICAgICBvcmRlciBieSBjYXJnYWRvX2RtXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmN1ZXN0YWRvcl0pXHJcbiAgICAgICAgICAgIC5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICBpZihyZXN1bHQucm93Q291bnQgPT0gMCl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvciAoYE5vIHNlIGVuY29udHJhcm9uIGVuY3Vlc3RhcyBjYXJnYWRhcyBlbiB1biBETSBwYXJhIGVsIG9wZXJhdGl2byAke3BhcmFtcy5vcGVyYXRpdm99LCBlbmN1ZXN0YWRvciAke3BhcmFtcy5lbmN1ZXN0YWRvcn1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7cm93czogcmVzdWx0LnJvd3MsIG9wZXJhdGl2bzogcGFyYW1zLm9wZXJhdGl2b307XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9ibGFucXVlYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTonb3BlcmF0aXZvJyAgICAgICAsIHR5cGVOYW1lOid0ZXh0JywgcmVmZXJlbmNlczpcIm9wZXJhdGl2b3NcIn0sXHJcbiAgICAgICAgICAgIHtuYW1lOid0b2tlbicgICAgICAgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczpbJ2Nvb3JfcHJvYycsJ2FkbWluJ10sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSBhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgcGFyYW1zLm9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIGxldCB0YXJlYXNUZW1SZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBjYXJnYWRvX2RtID0gbnVsbCwgb3BlcmFjaW9uID0gJ2Rlc2NhcmdhcicsIGVzdGFkbyA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBjYXJnYWRvX2RtID0gJDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRva2VuLCBFU1RBRE9fUE9TVEVSSU9SX0RFU0NBUkdBXSlcclxuICAgICAgICAgICAgLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIGlmKHRhcmVhc1RlbVJlc3VsdC5yb3dDb3VudCA9PSAwKXtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yKCdObyBzZSBibGFucXVlw7MgbmluZ3VuYSBlbmN1ZXN0YScpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yKGxldCB0dCBvZiB0YXJlYXNUZW1SZXN1bHQucm93cyl7XHJcbiAgICAgICAgICAgICAgICB0dC5yZXN1bHRfYmxhbnF1ZW8gPSBgZW5jICR7dHQuZW5jfSBzZSBibGFucXVlw7MgY29ycmVjdGFtZW50ZS5gO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdEJhY2t1cCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBqc29uX2VuY3Vlc3RhID0ganNvbl9iYWNrdXAsIGZlY2hhX21vZGlmX2VuY3Vlc3RhID0gZmVjaGFfYmFja3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCBmZWNoYV9iYWNrdXAgPiBjb2FsZXNjZShmZWNoYV9tb2RpZl9lbmN1ZXN0YSwgJzE5MDAtMDEtMDEnKSBhbmQganNvbl9iYWNrdXAgaXMgbm90IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgIFt0dC5vcGVyYXRpdm8sIHR0LmVuY10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0QmFja3VwLnJvd0NvdW50KXtcclxuICAgICAgICAgICAgICAgICAgICB0dC5yZXN1bHRfYmxhbnF1ZW8rPWAgU2UgcmVzdGFibGVjacOzIGVsIGJhY2t1cCBjb24gZmVjaGEgJHtyZXN1bHRCYWNrdXAucm93LmZlY2hhX2JhY2t1cC50b1ltZEhtcygpfS5gXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtwYXJhbXM6cXVlcnlQYXJhbXMsc2V0dGVyc30gPSBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiB0dC50YXJlYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsOiByZXN1bHRCYWNrdXAucm93Lmpzb25fZW5jdWVzdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFt0dC5vcGVyYXRpdm8sIHR0LmVuYywgdHQudGFyZWFdXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgJHtzZXR0ZXJzLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc1xyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzaW11bGFyR3VhcmRhZG9EZUVuY3Vlc3RhRGVzZGVBcHBFc2NyaXRvcmlvKGNvbnRleHQsIHJlc3VsdEJhY2t1cC5yb3cub3BlcmF0aXZvLCByZXN1bHRCYWNrdXAucm93LmVuYywgdHQudGFyZWEscmVzdWx0QmFja3VwLnJvdy5qc29uX2VuY3Vlc3RhKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJlYXNUZW1SZXN1bHQucm93cztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5dOyJdfQ==
|