contable 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1 -0
- package/dist/client/client.js +259 -0
- package/dist/client/img/bannersuperior.png +0 -0
- package/dist/client/menu.js +3 -0
- package/dist/client/redux-formulario.js +379 -0
- package/dist/client/render-components.js +750 -0
- package/dist/client/render-components.tsx +1117 -0
- package/dist/client/render-formulario.js +56 -0
- package/dist/client/render-formulario.tsx +72 -0
- package/dist/client/render-general.js +197 -0
- package/dist/client/render-general.tsx +212 -0
- package/dist/client/render-handlers.js +69 -0
- package/dist/client/tipos.js +13 -0
- package/dist/client/tsconfig.json +12 -0
- package/dist/server/app-contable.js +174 -0
- package/dist/server/def-config.js +100 -0
- package/dist/server/procedures-contable.js +508 -0
- package/dist/server/server-contable.js +17 -0
- package/dist/server/table-categorias_producto.js +29 -0
- package/dist/server/table-clientes.js +56 -0
- package/dist/server/table-condicion_iva.js +29 -0
- package/dist/server/table-estados_pedido.js +33 -0
- package/dist/server/table-estados_presupuesto.js +34 -0
- package/dist/server/table-insumos.js +44 -0
- package/dist/server/table-items_pedido.js +48 -0
- package/dist/server/table-items_presupuesto.js +48 -0
- package/dist/server/table-iva_productos.js +29 -0
- package/dist/server/table-parametros.js +38 -0
- package/dist/server/table-pedidos.js +48 -0
- package/dist/server/table-pedidos_pendientes.js +28 -0
- package/dist/server/table-pedidos_vencidos.js +28 -0
- package/dist/server/table-presupuestos.js +56 -0
- package/dist/server/table-productos.js +70 -0
- package/dist/server/table-productos_clientes.js +22 -0
- package/dist/server/table-productos_generales.js +22 -0
- package/dist/server/table-productos_insumos.js +47 -0
- package/dist/server/table-usuarios.js +44 -0
- package/dist/server/tsconfig.json +10 -0
- package/dist/server/types-contable.js +28 -0
- package/dist/unlogged/adapt.js +8 -0
- package/dist/unlogged/css/styles.styl +88 -0
- package/dist/unlogged/img/login-logo-icon.png.png +0 -0
- package/dist/unlogged/img/logo.png +0 -0
- package/dist/unlogged/tsconfig.json +15 -0
- package/dist/unlogged/unlogged.js +205 -0
- package/install/categorias_producto.tab +2 -0
- package/install/condicion_iva.tab +3 -0
- package/install/estados_pedido.tab +5 -0
- package/install/estados_presupuesto.tab +5 -0
- package/install/iva_productos.tab +3 -0
- package/install/productos.tab +2 -0
- package/install/usuarios.tab +2 -0
- package/package.json +58 -0
- package/unlogged/img/main-loading.gif +0 -0
- package/unlogged/main-loading.gif +0 -0
- package/unlogged/my-skin.js +0 -0
|
@@ -0,0 +1,508 @@
|
|
|
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", "./types-contable", "best-globals"], factory);
|
|
22
|
+
}
|
|
23
|
+
})(function (require, exports) {
|
|
24
|
+
"use strict";
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ProceduresContable = void 0;
|
|
27
|
+
__exportStar(require("./types-contable"), exports);
|
|
28
|
+
const best_globals_1 = require("best-globals");
|
|
29
|
+
var path = require('path');
|
|
30
|
+
var sqlTools = require('sql-tools');
|
|
31
|
+
const ESTADO_ACEPTADO_PRESUPUESTO = 'aceptado';
|
|
32
|
+
const ESTADO_ANULADO_PRESUPUESTO = 'anulado';
|
|
33
|
+
const ESTADO_RECHAZADO_PRESUPUESTO = 'rechazado';
|
|
34
|
+
function json(sql, orderby) {
|
|
35
|
+
return `COALESCE((SELECT jsonb_agg(to_jsonb(j.*) ORDER BY ${orderby}) from (${sql}) as j),'[]'::jsonb)`;
|
|
36
|
+
}
|
|
37
|
+
function jsono(sql, indexedby) {
|
|
38
|
+
return `COALESCE((SELECT jsonb_object_agg(${indexedby},to_jsonb(j.*)) from (${sql}) as j),'{}'::jsonb)`;
|
|
39
|
+
}
|
|
40
|
+
var createStructure = function createStructure(context, tableName) {
|
|
41
|
+
var be = context.be;
|
|
42
|
+
var mainTableDef = be.tableStructures[tableName](context);
|
|
43
|
+
var getPkFromTableDef = function getPkFromTableDef(tableDef) {
|
|
44
|
+
return tableDef.primaryKey.map(function (pk) {
|
|
45
|
+
return { fieldName: pk };
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
var getFkFromTableDef = function getFkFromTableDef(tableDef) {
|
|
49
|
+
return tableDef.foreignKeys.map(function (fk) {
|
|
50
|
+
return fk.fields;
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
var struct = {
|
|
54
|
+
tableName: mainTableDef.name,
|
|
55
|
+
pkFields: getPkFromTableDef(mainTableDef),
|
|
56
|
+
};
|
|
57
|
+
struct.childTables = [];
|
|
58
|
+
if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
|
|
59
|
+
mainTableDef.detailTables.forEach(function (detailTable) {
|
|
60
|
+
struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), getFkFromTableDef(be.tableStructures[detailTable.table](context))));
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return struct;
|
|
64
|
+
};
|
|
65
|
+
async function permiteEditarPresupuesto(nroPresup, client) {
|
|
66
|
+
if (!(await client.query(`
|
|
67
|
+
select *
|
|
68
|
+
from presupuestos inner join estados_presupuesto using (estado)
|
|
69
|
+
where presupuesto = $1
|
|
70
|
+
`, [nroPresup]).fetchOneRowIfExists()).row.permite_editar) {
|
|
71
|
+
//si el estado no permite editar tira error
|
|
72
|
+
throw Error('No se puede editar ya que su estado no lo permite.');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.ProceduresContable = [
|
|
76
|
+
{
|
|
77
|
+
action: 'estructura_crear',
|
|
78
|
+
parameters: [],
|
|
79
|
+
coreFunction: async function (context, _parameters) {
|
|
80
|
+
var client = context.client;
|
|
81
|
+
var query = `
|
|
82
|
+
SELECT
|
|
83
|
+
${jsono(`
|
|
84
|
+
SELECT *
|
|
85
|
+
FROM clientes
|
|
86
|
+
`, 'cliente')} as clientes,
|
|
87
|
+
${jsono(`
|
|
88
|
+
select p.*,
|
|
89
|
+
sum(i.costo_unitario*i.utilidad*pi.cantidad_insumo) as total_insumos,
|
|
90
|
+
precio_sin_insumos + coalesce(sum(i.costo_unitario*i.utilidad*pi.cantidad_insumo),0) as precio
|
|
91
|
+
from productos p
|
|
92
|
+
left join productos_insumos pi using (producto)
|
|
93
|
+
left join insumos i using (insumo)
|
|
94
|
+
where p.producto > 0
|
|
95
|
+
group by p.producto,
|
|
96
|
+
p.categoria,
|
|
97
|
+
p.nombre,
|
|
98
|
+
p.descripcion,
|
|
99
|
+
p.habilitado,
|
|
100
|
+
p.precio_sin_insumos,
|
|
101
|
+
p.stock,
|
|
102
|
+
p.stock_minimo,
|
|
103
|
+
p.stock_maximo,
|
|
104
|
+
p.iva
|
|
105
|
+
`, 'producto')} as productos,
|
|
106
|
+
${jsono(`
|
|
107
|
+
SELECT *
|
|
108
|
+
FROM condicion_iva
|
|
109
|
+
`, 'condicion')} as "condicionesIva",
|
|
110
|
+
${json(`
|
|
111
|
+
SELECT *
|
|
112
|
+
FROM estados_presupuesto
|
|
113
|
+
`, 'orden')} as "estadosPresupuesto",
|
|
114
|
+
${json(`
|
|
115
|
+
SELECT *
|
|
116
|
+
FROM estados_pedido
|
|
117
|
+
`, 'orden')} as "estadosPedido",
|
|
118
|
+
(SELECT to_jsonb(j.*)
|
|
119
|
+
from (select legales_pedido, legales_presupuesto from parametros) as j) as parametros
|
|
120
|
+
`;
|
|
121
|
+
try {
|
|
122
|
+
var result = await client.query(query).fetchUniqueRow();
|
|
123
|
+
return result.row;
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
console.log('ERROR', err.message);
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
;
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
action: 'presupuesto_cargar',
|
|
134
|
+
parameters: [
|
|
135
|
+
{ name: 'presupuesto', typeName: 'integer' },
|
|
136
|
+
],
|
|
137
|
+
coreFunction: async function (context, parameters) {
|
|
138
|
+
var client = context.client;
|
|
139
|
+
var query = `
|
|
140
|
+
SELECT
|
|
141
|
+
COALESCE(
|
|
142
|
+
(SELECT to_jsonb(j.*)
|
|
143
|
+
from (
|
|
144
|
+
SELECT *
|
|
145
|
+
from presupuestos
|
|
146
|
+
where presupuesto = $1
|
|
147
|
+
) as j
|
|
148
|
+
)
|
|
149
|
+
,'{}'::jsonb
|
|
150
|
+
) as presupuesto,
|
|
151
|
+
COALESCE(
|
|
152
|
+
(SELECT to_jsonb(j.*)
|
|
153
|
+
from (
|
|
154
|
+
SELECT *
|
|
155
|
+
FROM clientes
|
|
156
|
+
where cliente = (select cliente from presupuestos where presupuesto = $1)
|
|
157
|
+
) as j
|
|
158
|
+
),'{}'::jsonb
|
|
159
|
+
) as cliente,
|
|
160
|
+
${json(`
|
|
161
|
+
SELECT *
|
|
162
|
+
FROM items_presupuesto
|
|
163
|
+
where presupuesto = $1
|
|
164
|
+
`, 'numero_linea')} as "items"
|
|
165
|
+
`;
|
|
166
|
+
try {
|
|
167
|
+
var result = await client.query(query, [parameters.presupuesto]).fetchUniqueRow();
|
|
168
|
+
return result.row;
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
console.log('ERROR', err.message);
|
|
172
|
+
throw err;
|
|
173
|
+
}
|
|
174
|
+
;
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
action: 'presupuesto_guardar',
|
|
179
|
+
parameters: [
|
|
180
|
+
{ name: 'presupuesto', typeName: 'jsonb' },
|
|
181
|
+
{ name: 'items', typeName: 'jsonb' },
|
|
182
|
+
{ name: 'cliente', typeName: 'jsonb' },
|
|
183
|
+
],
|
|
184
|
+
coreFunction: async function (context, parameters) {
|
|
185
|
+
var client = context.client;
|
|
186
|
+
var presup = parameters.presupuesto;
|
|
187
|
+
var cliente = parameters.cliente;
|
|
188
|
+
var numeroPresupuesto;
|
|
189
|
+
try {
|
|
190
|
+
var presupuestoFieldsSql = `(fecha, cliente, estado, valido_hasta, subtotal, descuento, total, con_opciones, con_descuento_en_items) `;
|
|
191
|
+
var presupuestoValuesSql = `($1,$2,$3,$4,$5,$6,$7,$8,$9) `;
|
|
192
|
+
var presupuestoValues = [
|
|
193
|
+
presup.fecha,
|
|
194
|
+
cliente.cliente,
|
|
195
|
+
presup.estado,
|
|
196
|
+
presup.valido_hasta,
|
|
197
|
+
presup.subtotal,
|
|
198
|
+
presup.descuento,
|
|
199
|
+
presup.total,
|
|
200
|
+
presup.con_opciones,
|
|
201
|
+
presup.con_descuento_en_items
|
|
202
|
+
];
|
|
203
|
+
if (presup.presupuesto) {
|
|
204
|
+
await permiteEditarPresupuesto(presup.presupuesto, client);
|
|
205
|
+
numeroPresupuesto = presup.presupuesto;
|
|
206
|
+
await client.query(`delete from items_presupuesto where presupuesto = $1`, [numeroPresupuesto]).execute();
|
|
207
|
+
await client.query(`
|
|
208
|
+
update presupuestos
|
|
209
|
+
set ${presupuestoFieldsSql} = ${presupuestoValuesSql}
|
|
210
|
+
where presupuesto = $10
|
|
211
|
+
returning *
|
|
212
|
+
`, presupuestoValues.concat(presup.presupuesto)).fetchUniqueRow();
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
numeroPresupuesto = (await client.query(`
|
|
216
|
+
insert into
|
|
217
|
+
presupuestos ${presupuestoFieldsSql}
|
|
218
|
+
values ${presupuestoValuesSql}
|
|
219
|
+
returning *
|
|
220
|
+
`, presupuestoValues).fetchUniqueRow()).row.presupuesto;
|
|
221
|
+
}
|
|
222
|
+
for (let item of parameters.items) {
|
|
223
|
+
await client.query(`
|
|
224
|
+
insert
|
|
225
|
+
into items_presupuesto (presupuesto, cantidad, producto, nombre, descripcion, precio_unitario, porcentaje_descuento, descuento, total)
|
|
226
|
+
values ($1,$2,$3,$4,$5,$6,$7,$8,$9)
|
|
227
|
+
`, [numeroPresupuesto, item.cantidad, item.producto, item.nombre, item.descripcion, item.precio_unitario, item.porcentaje_descuento, item.descuento, item.total])
|
|
228
|
+
.execute();
|
|
229
|
+
}
|
|
230
|
+
return { estado: 'ok', presupuesto: numeroPresupuesto };
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
console.log('ERROR', err.message);
|
|
234
|
+
throw err;
|
|
235
|
+
}
|
|
236
|
+
;
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
action: 'presupuesto_anular',
|
|
241
|
+
parameters: [
|
|
242
|
+
{ name: 'presupuesto', typeName: 'integer' },
|
|
243
|
+
],
|
|
244
|
+
coreFunction: async function (context, parameters) {
|
|
245
|
+
var client = context.client;
|
|
246
|
+
var db = context.be.db;
|
|
247
|
+
var nroPresup = parameters.presupuesto;
|
|
248
|
+
try {
|
|
249
|
+
await permiteEditarPresupuesto(nroPresup, client);
|
|
250
|
+
await client.query(`
|
|
251
|
+
update presupuestos
|
|
252
|
+
set estado = $2
|
|
253
|
+
where presupuesto = $1
|
|
254
|
+
returning *
|
|
255
|
+
`, [nroPresup, ESTADO_ANULADO_PRESUPUESTO]).fetchUniqueRow();
|
|
256
|
+
return { estado: 'ok' };
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
console.log('ERROR', err.message);
|
|
260
|
+
throw err;
|
|
261
|
+
}
|
|
262
|
+
;
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
action: 'presupuesto_rechazar',
|
|
267
|
+
parameters: [
|
|
268
|
+
{ name: 'presupuesto', typeName: 'integer' },
|
|
269
|
+
],
|
|
270
|
+
coreFunction: async function (context, parameters) {
|
|
271
|
+
var client = context.client;
|
|
272
|
+
var db = context.be.db;
|
|
273
|
+
var nroPresup = parameters.presupuesto;
|
|
274
|
+
try {
|
|
275
|
+
await permiteEditarPresupuesto(nroPresup, client);
|
|
276
|
+
await client.query(`
|
|
277
|
+
update presupuestos
|
|
278
|
+
set estado = $2
|
|
279
|
+
where presupuesto = $1
|
|
280
|
+
returning *
|
|
281
|
+
`, [nroPresup, ESTADO_RECHAZADO_PRESUPUESTO]).fetchUniqueRow();
|
|
282
|
+
return { estado: 'ok' };
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
console.log('ERROR', err.message);
|
|
286
|
+
throw err;
|
|
287
|
+
}
|
|
288
|
+
;
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
action: 'pedido_cargar',
|
|
293
|
+
parameters: [
|
|
294
|
+
{ name: 'pedido', typeName: 'integer' },
|
|
295
|
+
],
|
|
296
|
+
coreFunction: async function (context, parameters) {
|
|
297
|
+
var client = context.client;
|
|
298
|
+
var query = `
|
|
299
|
+
SELECT
|
|
300
|
+
COALESCE(
|
|
301
|
+
(SELECT to_jsonb(j.*)
|
|
302
|
+
from (
|
|
303
|
+
SELECT *
|
|
304
|
+
from pedidos
|
|
305
|
+
where pedido = $1
|
|
306
|
+
) as j
|
|
307
|
+
)
|
|
308
|
+
,'{}'::jsonb
|
|
309
|
+
) as pedido,
|
|
310
|
+
COALESCE(
|
|
311
|
+
(SELECT to_jsonb(j.*)
|
|
312
|
+
from (
|
|
313
|
+
SELECT *
|
|
314
|
+
FROM clientes
|
|
315
|
+
where cliente = (select cliente from pedidos where pedido = $1)
|
|
316
|
+
) as j
|
|
317
|
+
),'{}'::jsonb
|
|
318
|
+
) as cliente,
|
|
319
|
+
${json(`
|
|
320
|
+
SELECT *
|
|
321
|
+
FROM items_pedido
|
|
322
|
+
where pedido = $1
|
|
323
|
+
`, 'numero_linea')} as "items"
|
|
324
|
+
`;
|
|
325
|
+
try {
|
|
326
|
+
var result = await client.query(query, [parameters.pedido]).fetchUniqueRow();
|
|
327
|
+
return result.row;
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
console.log('ERROR', err.message);
|
|
331
|
+
throw err;
|
|
332
|
+
}
|
|
333
|
+
;
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
// TODO -> stock (puede ir en trigger)
|
|
338
|
+
action: 'pedido_guardar',
|
|
339
|
+
parameters: [
|
|
340
|
+
{ name: 'pedido', typeName: 'jsonb' },
|
|
341
|
+
{ name: 'items', typeName: 'jsonb' },
|
|
342
|
+
{ name: 'cliente', typeName: 'jsonb' },
|
|
343
|
+
],
|
|
344
|
+
coreFunction: async function (context, parameters) {
|
|
345
|
+
var client = context.client;
|
|
346
|
+
var pedido = parameters.pedido;
|
|
347
|
+
var cliente = parameters.cliente;
|
|
348
|
+
var numeroPedido;
|
|
349
|
+
try {
|
|
350
|
+
var pedidoFieldsSql = `(presupuesto, fecha, cliente, estado, fecha_entrega, subtotal, descuento, total, observaciones) `;
|
|
351
|
+
var pedidoValuesSql = `($1,$2,$3,$4,$5,$6,$7,$8, $9) `;
|
|
352
|
+
var pedidoValues = [
|
|
353
|
+
pedido.presupuesto,
|
|
354
|
+
pedido.fecha,
|
|
355
|
+
cliente.cliente,
|
|
356
|
+
pedido.estado,
|
|
357
|
+
pedido.fecha_entrega,
|
|
358
|
+
pedido.subtotal,
|
|
359
|
+
pedido.descuento,
|
|
360
|
+
pedido.total,
|
|
361
|
+
pedido.observaciones
|
|
362
|
+
];
|
|
363
|
+
if (pedido.pedido) {
|
|
364
|
+
numeroPedido = pedido.pedido;
|
|
365
|
+
await client.query(`delete from items_pedido where pedido = $1`, [numeroPedido]).execute();
|
|
366
|
+
await client.query(`
|
|
367
|
+
update pedidos
|
|
368
|
+
set ${pedidoFieldsSql} = ${pedidoValuesSql}
|
|
369
|
+
where pedido = $10
|
|
370
|
+
returning *
|
|
371
|
+
`, pedidoValues.concat(pedido.pedido)).fetchUniqueRow();
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
pedido.presupuesto ? await permiteEditarPresupuesto(pedido.presupuesto, client) : null;
|
|
375
|
+
numeroPedido = (await client.query(`
|
|
376
|
+
insert into
|
|
377
|
+
pedidos ${pedidoFieldsSql}
|
|
378
|
+
values ${pedidoValuesSql}
|
|
379
|
+
returning *
|
|
380
|
+
`, pedidoValues).fetchUniqueRow()).row.pedido;
|
|
381
|
+
}
|
|
382
|
+
for (let item of parameters.items) {
|
|
383
|
+
await client.query(`
|
|
384
|
+
insert
|
|
385
|
+
into items_pedido (pedido, cantidad, producto, nombre, descripcion, precio_unitario, porcentaje_descuento, descuento, total)
|
|
386
|
+
values ($1,$2,$3,$4,$5,$6,$7,$8,$9)
|
|
387
|
+
`, [numeroPedido, item.cantidad, item.producto, item.nombre, item.descripcion, item.precio_unitario, item.porcentaje_descuento, item.descuento, item.total])
|
|
388
|
+
.execute();
|
|
389
|
+
}
|
|
390
|
+
if (pedido.presupuesto) {
|
|
391
|
+
await client.query(`
|
|
392
|
+
update presupuestos
|
|
393
|
+
set estado = $1
|
|
394
|
+
where presupuesto = $2
|
|
395
|
+
returning *
|
|
396
|
+
`, [ESTADO_ACEPTADO_PRESUPUESTO, pedido.presupuesto]).fetchUniqueRow();
|
|
397
|
+
try {
|
|
398
|
+
await client.query(`
|
|
399
|
+
select presupuesto
|
|
400
|
+
from pedidos
|
|
401
|
+
where presupuesto = $1
|
|
402
|
+
`, [pedido.presupuesto]).fetchUniqueValue();
|
|
403
|
+
}
|
|
404
|
+
catch (err) {
|
|
405
|
+
throw Error(`El presupuesto ${pedido.presupuesto} ya tiene un pedido creado. ` + err.message);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return { estado: 'ok', pedido: numeroPedido };
|
|
409
|
+
}
|
|
410
|
+
catch (err) {
|
|
411
|
+
console.log('ERROR', err.message);
|
|
412
|
+
throw err;
|
|
413
|
+
}
|
|
414
|
+
;
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
action: 'producto_clonar',
|
|
419
|
+
parameters: [
|
|
420
|
+
{ name: 'producto', typeName: 'integer' },
|
|
421
|
+
],
|
|
422
|
+
coreFunction: async function (context, parameters) {
|
|
423
|
+
var client = context.client;
|
|
424
|
+
var be = context.be;
|
|
425
|
+
var producto = parameters.producto;
|
|
426
|
+
//clonacion producto
|
|
427
|
+
var productoAClonar = (await client.query(`select * from productos where producto = $1`, [producto]).fetchUniqueRow()).row;
|
|
428
|
+
delete (productoAClonar.producto);
|
|
429
|
+
delete (productoAClonar.stock);
|
|
430
|
+
delete (productoAClonar.stock_minimo);
|
|
431
|
+
delete (productoAClonar.stock_maximo);
|
|
432
|
+
var productoKeys = [];
|
|
433
|
+
var productoValues = [];
|
|
434
|
+
for (let key in productoAClonar) {
|
|
435
|
+
productoKeys.push(be.db.quoteIdent(key));
|
|
436
|
+
productoValues.push(be.db.quoteNullable(productoAClonar[key]));
|
|
437
|
+
}
|
|
438
|
+
var productoNuevo = (await client.query(`insert into productos (${productoKeys.join(',')}) values (${productoValues.join(',')}) returning *`, []).fetchUniqueRow()).row;
|
|
439
|
+
//clonacion insumos
|
|
440
|
+
var productosInsumosAClonar = (await client.query(`select * from productos_insumos where producto = $1`, [producto]).fetchAll()).rows;
|
|
441
|
+
var prodInsumosNuevos = [];
|
|
442
|
+
for (var prodInsumo of productosInsumosAClonar) {
|
|
443
|
+
prodInsumo.producto = productoNuevo.producto;
|
|
444
|
+
var prodInsumoKeys = [];
|
|
445
|
+
var prodInsumoValues = [];
|
|
446
|
+
for (let key in prodInsumo) {
|
|
447
|
+
prodInsumoKeys.push(be.db.quoteIdent(key));
|
|
448
|
+
prodInsumoValues.push(be.db.quoteNullable(prodInsumo[key]));
|
|
449
|
+
}
|
|
450
|
+
prodInsumosNuevos.push((await client.query(`
|
|
451
|
+
insert into
|
|
452
|
+
productos_insumos (${prodInsumoKeys.join(',')})
|
|
453
|
+
values (${prodInsumoValues.join(',')})
|
|
454
|
+
returning *`, []).fetchUniqueRow()).row);
|
|
455
|
+
}
|
|
456
|
+
return { estado: 'ok', productoNuevo, prodInsumosNuevos };
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
action: 'object_get',
|
|
461
|
+
parameters: [
|
|
462
|
+
{ name: 'tablename', typeName: 'text' },
|
|
463
|
+
{ name: 'pk_values', typeName: 'jsonb' },
|
|
464
|
+
],
|
|
465
|
+
coreFunction: async function (context, parameters) {
|
|
466
|
+
var client = context.client;
|
|
467
|
+
var query = sqlTools.structuredData.sqlRead(parameters.pk_values, createStructure(context, parameters.tablename));
|
|
468
|
+
try {
|
|
469
|
+
var result = await client.query(query).fetchUniqueValue();
|
|
470
|
+
return result.value;
|
|
471
|
+
}
|
|
472
|
+
catch (err) {
|
|
473
|
+
console.log('ERROR', err.message);
|
|
474
|
+
throw err;
|
|
475
|
+
}
|
|
476
|
+
;
|
|
477
|
+
}
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
action: 'object_save',
|
|
481
|
+
parameters: [
|
|
482
|
+
{ name: 'tablename', typeName: 'text' },
|
|
483
|
+
{ name: 'datos', typeName: 'jsonb' },
|
|
484
|
+
],
|
|
485
|
+
coreFunction: async function (context, parameters) {
|
|
486
|
+
var be = context.be;
|
|
487
|
+
var client = context.client;
|
|
488
|
+
var queries = sqlTools.structuredData.sqlWrite(parameters.datos, createStructure(context, parameters.tablename));
|
|
489
|
+
console.log("#############", queries);
|
|
490
|
+
return await queries.reduce(function (promise, query) {
|
|
491
|
+
return promise.then(function () {
|
|
492
|
+
return client.query(query).execute().then(function () {
|
|
493
|
+
return 'ok';
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
}, Promise.resolve()).then(async function () {
|
|
497
|
+
//TODO: traer json refrescado
|
|
498
|
+
//var result = await be.procedure.object_get.coreFunction(context, {tablename:parameters.tablename, });
|
|
499
|
+
return 'ok';
|
|
500
|
+
}).catch(function (err) {
|
|
501
|
+
console.log("ENTRA EN EL CATCH: ", err);
|
|
502
|
+
throw err;
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
},
|
|
506
|
+
];
|
|
507
|
+
});
|
|
508
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1jb250YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvcHJvY2VkdXJlcy1jb250YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBS2IsbURBQWlDO0lBRWpDLCtDQUF1RDtJQUl2RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBR3BDLE1BQU0sMkJBQTJCLEdBQUksVUFBVSxDQUFDO0lBQ2hELE1BQU0sMEJBQTBCLEdBQUssU0FBUyxDQUFDO0lBQy9DLE1BQU0sNEJBQTRCLEdBQUcsV0FBVyxDQUFDO0lBRWpELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPO1FBQ3RCLE9BQU8scURBQXFELE9BQU8sV0FBVyxHQUFHLHNCQUFzQixDQUFBO0lBQzNHLENBQUM7SUFFRCxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUztRQUN6QixPQUFPLHFDQUFxQyxTQUFTLHlCQUF5QixHQUFHLHNCQUFzQixDQUFBO0lBQzNHLENBQUM7SUFFRCxJQUFJLGVBQWUsR0FBRyxTQUFTLGVBQWUsQ0FBQyxPQUFlLEVBQUUsU0FBZ0I7UUFDNUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFJLFlBQVksR0FBbUIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRSxJQUFJLGlCQUFpQixHQUFHLFNBQVMsaUJBQWlCLENBQUMsUUFBd0I7WUFDdkUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFTLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENB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QUNuRixJQUFJLEVBQUUsR0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLE1BQU0sR0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUMxQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUNwQyxPQUFPLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFTLE9BQW9CLEVBQUUsS0FBWTtvQkFDbkUsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNoQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUN0QyxPQUFPLElBQUksQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO29CQUMzQiw2QkFBNkI7b0JBQzdCLHVHQUF1RztvQkFDdkcsT0FBTyxJQUFJLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFTLEdBQVM7b0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ3RDLE1BQU0sR0FBRyxDQUFBO2dCQUNiLENBQUMsQ0FBQyxDQUFBO1lBQ04sQ0FBQztTQUNKO0tBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgUHJvY2VkdXJlRGVmLCBUYWJsZURlZmluaXRpb24sIENsaWVudCB9IGZyb20gXCIuL3R5cGVzLWNvbnRhYmxlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyZUNvbnRleHQsIENvcmVGdW5jdGlvblBhcmFtZXRlcnMsIENvbnRleHQsIEZvcmVpZ25LZXksIGNvcmVGdW5jdGlvblBhcmFtZXRlcnMgfSBmcm9tIFwiYmFja2VuZC1wbHVzXCI7XHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy1jb250YWJsZVwiO1xyXG5pbXBvcnQge2pzb24sIGpzb25vfSBmcm9tIFwicGctcHJvbWlzZS1zdHJpY3RcIjtcclxuaW1wb3J0IHtjaGFuZ2luZywgZGF0ZXRpbWUsIGRhdGUgfSBmcm9tICdiZXN0LWdsb2JhbHMnO1xyXG5cclxuaW1wb3J0IHtwcm9taXNlcyBhcyAgZnN9IGZyb20gXCJmc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tIFwiZG9tYWluXCI7XHJcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG52YXIgc3FsVG9vbHMgPSByZXF1aXJlKCdzcWwtdG9vbHMnKTtcclxudHlwZSBBbnlPYmplY3QgPSB7W2s6c3RyaW5nXTphbnl9XHJcblxyXG5jb25zdCBFU1RBRE9fQUNFUFRBRE9fUFJFU1VQVUVTVE8gID0gJ2FjZXB0YWRvJztcclxuY29uc3QgRVNUQURPX0FOVUxBRE9fUFJFU1VQVUVTVE8gICA9ICdhbnVsYWRvJztcclxuY29uc3QgRVNUQURPX1JFQ0hBWkFET19QUkVTVVBVRVNUTyA9ICdyZWNoYXphZG8nO1xyXG5cclxuZnVuY3Rpb24ganNvbihzcWwsIG9yZGVyYnkpe1xyXG4gICAgcmV0dXJuIGBDT0FMRVNDRSgoU0VMRUNUIGpzb25iX2FnZyh0b19qc29uYihqLiopIE9SREVSIEJZICR7b3JkZXJieX0pIGZyb20gKCR7c3FsfSkgYXMgaiksJ1tdJzo6anNvbmIpYFxyXG59XHJcblxyXG5mdW5jdGlvbiBqc29ubyhzcWwsIGluZGV4ZWRieSl7XHJcbiAgICByZXR1cm4gYENPQUxFU0NFKChTRUxFQ1QganNvbmJfb2JqZWN0X2FnZygke2luZGV4ZWRieX0sdG9fanNvbmIoai4qKSkgZnJvbSAoJHtzcWx9KSBhcyBqKSwne30nOjpqc29uYilgXHJcbn1cclxuXHJcbnZhciBjcmVhdGVTdHJ1Y3R1cmUgPSBmdW5jdGlvbiBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dDpDb250ZXh0LCB0YWJsZU5hbWU6c3RyaW5nKXtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgbWFpblRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbiA9IGJlLnRhYmxlU3RydWN0dXJlc1t0YWJsZU5hbWVdKGNvbnRleHQpO1xyXG4gICAgdmFyIGdldFBrRnJvbVRhYmxlRGVmID0gZnVuY3Rpb24gZ2V0UGtGcm9tVGFibGVEZWYodGFibGVEZWY6VGFibGVEZWZpbml0aW9uKXtcclxuICAgICAgICByZXR1cm4gdGFibGVEZWYucHJpbWFyeUtleS5tYXAoZnVuY3Rpb24ocGspe1xyXG4gICAgICAgICAgICByZXR1cm4ge2ZpZWxkTmFtZTpwa307XHJcbiAgICAgICAgfSlcclxuICAgIH07XHJcbiAgICB2YXIgZ2V0RmtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRGa0Zyb21UYWJsZURlZih0YWJsZURlZjpUYWJsZURlZmluaXRpb24pe1xyXG4gICAgICAgIHJldHVybiB0YWJsZURlZi5mb3JlaWduS2V5cy5tYXAoZnVuY3Rpb24oZmspe1xyXG4gICAgICAgICAgICByZXR1cm4gZmsuZmllbGRzXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB2YXIgc3RydWN0PXtcclxuICAgICAgICB0YWJsZU5hbWU6bWFpblRhYmxlRGVmLm5hbWUsXHJcbiAgICAgICAgcGtGaWVsZHM6Z2V0UGtGcm9tVGFibGVEZWYobWFpblRhYmxlRGVmKSxcclxuICAgIH07XHJcbiAgICBzdHJ1Y3QuY2hpbGRUYWJsZXM9W107XHJcbiAgICBpZihtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzICYmIG1haW5UYWJsZURlZi5kZXRhaWxUYWJsZXMubGVuZ3RoKXtcclxuICAgICAgICBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmZvckVhY2goZnVuY3Rpb24oZGV0YWlsVGFibGUpe1xyXG4gICAgICAgICAgICBzdHJ1Y3QuY2hpbGRUYWJsZXMucHVzaChcclxuICAgICAgICAgICAgICAgIGNoYW5naW5nKFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBkZXRhaWxUYWJsZS50YWJsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0RmtGcm9tVGFibGVEZWYoYmUudGFibGVTdHJ1Y3R1cmVzW2RldGFpbFRhYmxlLnRhYmxlXShjb250ZXh0KSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cnVjdDtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcGVybWl0ZUVkaXRhclByZXN1cHVlc3RvKG5yb1ByZXN1cDpudW1iZXIsIGNsaWVudDpDbGllbnQpe1xyXG4gICAgaWYoIShhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgIHNlbGVjdCAqIFxyXG4gICAgICAgICAgICBmcm9tIHByZXN1cHVlc3RvcyBpbm5lciBqb2luIGVzdGFkb3NfcHJlc3VwdWVzdG8gdXNpbmcgKGVzdGFkbylcclxuICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgYCxbbnJvUHJlc3VwXSkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpKS5yb3cucGVybWl0ZV9lZGl0YXIpe1xyXG4gICAgICAgIC8vc2kgZWwgZXN0YWRvIG5vIHBlcm1pdGUgZWRpdGFyIHRpcmEgZXJyb3JcclxuICAgICAgICB0aHJvdyBFcnJvciAoJ05vIHNlIHB1ZWRlIGVkaXRhciB5YSBxdWUgc3UgZXN0YWRvIG5vIGxvIHBlcm1pdGUuJykgXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBQcm9jZWR1cmVzQ29udGFibGUgOiBQcm9jZWR1cmVEZWZbXSA9IFtcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlc3RydWN0dXJhX2NyZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6IGNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgcXVlcnkgPWBcclxuICAgICAgICAgICAgICAgIFNFTEVDVCBcclxuICAgICAgICAgICAgICAgICAgICAke2pzb25vKGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gY2xpZW50ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudGUnXHJcbiAgICAgICAgICAgICAgICAgICAgKX0gYXMgY2xpZW50ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBwLiosIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShpLmNvc3RvX3VuaXRhcmlvKmkudXRpbGlkYWQqcGkuY2FudGlkYWRfaW5zdW1vKSBhcyB0b3RhbF9pbnN1bW9zLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9fc2luX2luc3Vtb3MgKyBjb2FsZXNjZShzdW0oaS5jb3N0b191bml0YXJpbyppLnV0aWxpZGFkKnBpLmNhbnRpZGFkX2luc3VtbyksMCkgYXMgcHJlY2lvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHByb2R1Y3RvcyBwIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBwcm9kdWN0b3NfaW5zdW1vcyBwaSB1c2luZyAocHJvZHVjdG8pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBpbnN1bW9zIGkgdXNpbmcgKGluc3VtbylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHAucHJvZHVjdG8gPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCBieSBwLnByb2R1Y3RvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhdGVnb3JpYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5ub21icmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZGVzY3JpcGNpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaGFiaWxpdGFkbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5wcmVjaW9fc2luX2luc3Vtb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc3RvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc3RvY2tfbWluaW1vLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnN0b2NrX21heGltbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pdmFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y3RvJ1xyXG4gICAgICAgICAgICAgICAgICAgICl9IGFzIHByb2R1Y3RvcyxcclxuICAgICAgICAgICAgICAgICAgICAke2pzb25vKGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gY29uZGljaW9uX2l2YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29uZGljaW9uJ1xyXG4gICAgICAgICAgICAgICAgICAgICl9IGFzIFwiY29uZGljaW9uZXNJdmFcIixcclxuICAgICAgICAgICAgICAgICAgICAke2pzb24oYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBlc3RhZG9zX3ByZXN1cHVlc3RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdvcmRlbidcclxuICAgICAgICAgICAgICAgICAgICApfSBhcyBcImVzdGFkb3NQcmVzdXB1ZXN0b1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICR7anNvbihgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGVzdGFkb3NfcGVkaWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdvcmRlbidcclxuICAgICAgICAgICAgICAgICAgICApfSBhcyBcImVzdGFkb3NQZWRpZG9cIixcclxuICAgICAgICAgICAgICAgICAgICAoU0VMRUNUIHRvX2pzb25iKGouKikgXHJcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tIChzZWxlY3QgbGVnYWxlc19wZWRpZG8sIGxlZ2FsZXNfcHJlc3VwdWVzdG8gZnJvbSBwYXJhbWV0cm9zKSBhcyBqKSBhcyBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIGA7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnkpLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvdztcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByZXN1cHVlc3RvX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZToncHJlc3VwdWVzdG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID1gXHJcbiAgICAgICAgICAgICAgICBTRUxFQ1QgXHJcbiAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdG9fanNvbmIoai4qKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHByZXN1cHVlc3RvcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLCd7fSc6Ompzb25iXHJcbiAgICAgICAgICAgICAgICAgICAgKSBhcyBwcmVzdXB1ZXN0byxcclxuICAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShcclxuICAgICAgICAgICAgICAgICAgICAgICAgKFNFTEVDVCB0b19qc29uYihqLiopIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBjbGllbnRlcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgY2xpZW50ZSA9IChzZWxlY3QgY2xpZW50ZSBmcm9tIHByZXN1cHVlc3RvcyB3aGVyZSBwcmVzdXB1ZXN0byA9ICQxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksJ3t9Jzo6anNvbmJcclxuICAgICAgICAgICAgICAgICAgICApIGFzIGNsaWVudGUsXHJcbiAgICAgICAgICAgICAgICAke2pzb24oYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gaXRlbXNfcHJlc3VwdWVzdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ251bWVyb19saW5lYSdcclxuICAgICAgICAgICAgICAgICl9IGFzIFwiaXRlbXNcIlxyXG4gICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5LFtwYXJhbWV0ZXJzLnByZXN1cHVlc3RvXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncHJlc3VwdWVzdG9fZ3VhcmRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidwcmVzdXB1ZXN0bycgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICAgICAge25hbWU6J2l0ZW1zJyAgICAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonY2xpZW50ZScgICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBwcmVzdXAgPSBwYXJhbWV0ZXJzLnByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50ZSA9IHBhcmFtZXRlcnMuY2xpZW50ZTtcclxuICAgICAgICAgICAgdmFyIG51bWVyb1ByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJlc3VwdWVzdG9GaWVsZHNTcWwgPSBgKGZlY2hhLCBjbGllbnRlLCBlc3RhZG8sIHZhbGlkb19oYXN0YSwgc3VidG90YWwsIGRlc2N1ZW50bywgdG90YWwsIGNvbl9vcGNpb25lcywgY29uX2Rlc2N1ZW50b19lbl9pdGVtcykgYDtcclxuICAgICAgICAgICAgICAgIHZhciBwcmVzdXB1ZXN0b1ZhbHVlc1NxbCA9IGAoJDEsJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDkpIGA7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJlc3VwdWVzdG9WYWx1ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLmZlY2hhLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudGUuY2xpZW50ZSxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXAuZXN0YWRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC52YWxpZG9faGFzdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLnN1YnRvdGFsLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5kZXNjdWVudG8sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLnRvdGFsLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5jb25fb3BjaW9uZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLmNvbl9kZXNjdWVudG9fZW5faXRlbXNcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBpZihwcmVzdXAucHJlc3VwdWVzdG8pe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBlcm1pdGVFZGl0YXJQcmVzdXB1ZXN0byhwcmVzdXAucHJlc3VwdWVzdG8sIGNsaWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtZXJvUHJlc3VwdWVzdG89cHJlc3VwLnByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgZGVsZXRlIGZyb20gaXRlbXNfcHJlc3VwdWVzdG8gd2hlcmUgcHJlc3VwdWVzdG8gPSAkMWAsW251bWVyb1ByZXN1cHVlc3RvXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBwcmVzdXB1ZXN0b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgJHtwcmVzdXB1ZXN0b0ZpZWxkc1NxbH0gPSAke3ByZXN1cHVlc3RvVmFsdWVzU3FsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMTBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICAgICAgYCxwcmVzdXB1ZXN0b1ZhbHVlcy5jb25jYXQocHJlc3VwLnByZXN1cHVlc3RvKSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyb1ByZXN1cHVlc3RvID0gKGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBpbnRvIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3VwdWVzdG9zICR7cHJlc3VwdWVzdG9GaWVsZHNTcWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgJHtwcmVzdXB1ZXN0b1ZhbHVlc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICAgICAgYCxwcmVzdXB1ZXN0b1ZhbHVlcykuZmV0Y2hVbmlxdWVSb3coKSkucm93LnByZXN1cHVlc3RvXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGl0ZW0gb2YgcGFyYW1ldGVycy5pdGVtcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBpdGVtc19wcmVzdXB1ZXN0byAocHJlc3VwdWVzdG8sIGNhbnRpZGFkLCBwcm9kdWN0bywgbm9tYnJlLCBkZXNjcmlwY2lvbiwgcHJlY2lvX3VuaXRhcmlvLCBwb3JjZW50YWplX2Rlc2N1ZW50bywgZGVzY3VlbnRvLCB0b3RhbCkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgKCQxLCQyLCQzLCQ0LCQ1LCQ2LCQ3LCQ4LCQ5KVxyXG4gICAgICAgICAgICAgICAgICAgIGAsW251bWVyb1ByZXN1cHVlc3RvLCBpdGVtLmNhbnRpZGFkLCBpdGVtLnByb2R1Y3RvLCBpdGVtLm5vbWJyZSwgaXRlbS5kZXNjcmlwY2lvbiwgaXRlbS5wcmVjaW9fdW5pdGFyaW8sIGl0ZW0ucG9yY2VudGFqZV9kZXNjdWVudG8sIGl0ZW0uZGVzY3VlbnRvLCBpdGVtLnRvdGFsXSlcclxuICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtlc3RhZG86J29rJywgcHJlc3VwdWVzdG86IG51bWVyb1ByZXN1cHVlc3RvfTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByZXN1cHVlc3RvX2FudWxhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidwcmVzdXB1ZXN0bycgICAgICAgLCB0eXBlTmFtZTonaW50ZWdlcid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IGNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgZGIgPSAgY29udGV4dC5iZS5kYjtcclxuICAgICAgICAgICAgdmFyIG5yb1ByZXN1cCA9IHBhcmFtZXRlcnMucHJlc3VwdWVzdG87XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHBlcm1pdGVFZGl0YXJQcmVzdXB1ZXN0byhucm9QcmVzdXAsIGNsaWVudCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBwcmVzdXB1ZXN0b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwcmVzdXB1ZXN0byA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICBgLFtucm9QcmVzdXAsIEVTVEFET19BTlVMQURPX1BSRVNVUFVFU1RPXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7ZXN0YWRvOidvayd9O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncHJlc3VwdWVzdG9fcmVjaGF6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncHJlc3VwdWVzdG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGRiID0gIGNvbnRleHQuYmUuZGI7XHJcbiAgICAgICAgICAgIHZhciBucm9QcmVzdXAgPSBwYXJhbWV0ZXJzLnByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwZXJtaXRlRWRpdGFyUHJlc3VwdWVzdG8obnJvUHJlc3VwLCBjbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcHJlc3VwdWVzdG9zIFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwcmVzdXB1ZXN0byA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICBgLFtucm9QcmVzdXAsIEVTVEFET19SRUNIQVpBRE9fUFJFU1VQVUVTVE9dKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtlc3RhZG86J29rJ307XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdwZWRpZG9fY2FyZ2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHtuYW1lOidwZWRpZG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID1gXHJcbiAgICAgICAgICAgICAgICBTRUxFQ1QgXHJcbiAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdG9fanNvbmIoai4qKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBlZGlkb3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHBlZGlkbyA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIGFzIGpcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAsJ3t9Jzo6anNvbmJcclxuICAgICAgICAgICAgICAgICAgICApIGFzIHBlZGlkbyxcclxuICAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShcclxuICAgICAgICAgICAgICAgICAgICAgICAgKFNFTEVDVCB0b19qc29uYihqLiopIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBjbGllbnRlcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgY2xpZW50ZSA9IChzZWxlY3QgY2xpZW50ZSBmcm9tIHBlZGlkb3Mgd2hlcmUgcGVkaWRvID0gJDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIGFzIGpcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSwne30nOjpqc29uYlxyXG4gICAgICAgICAgICAgICAgICAgICkgYXMgY2xpZW50ZSxcclxuICAgICAgICAgICAgICAgICR7anNvbihgXHJcbiAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBpdGVtc19wZWRpZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcGVkaWRvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICdudW1lcm9fbGluZWEnXHJcbiAgICAgICAgICAgICAgICApfSBhcyBcIml0ZW1zXCJcclxuICAgICAgICAgICAgYDtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeSxbcGFyYW1ldGVycy5wZWRpZG9dKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3c7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICAvLyBUT0RPIC0+IHN0b2NrIChwdWVkZSBpciBlbiB0cmlnZ2VyKVxyXG4gICAgICAgIGFjdGlvbjogJ3BlZGlkb19ndWFyZGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3BlZGlkbycgICAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonaXRlbXMnICAgICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgICAgIHtuYW1lOidjbGllbnRlJyAgICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHBlZGlkbyA9IHBhcmFtZXRlcnMucGVkaWRvO1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50ZSA9IHBhcmFtZXRlcnMuY2xpZW50ZTtcclxuICAgICAgICAgICAgdmFyIG51bWVyb1BlZGlkbztcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHBlZGlkb0ZpZWxkc1NxbCA9IGAocHJlc3VwdWVzdG8sIGZlY2hhLCBjbGllbnRlLCBlc3RhZG8sIGZlY2hhX2VudHJlZ2EsIHN1YnRvdGFsLCBkZXNjdWVudG8sIHRvdGFsLCBvYnNlcnZhY2lvbmVzKSBgO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBlZGlkb1ZhbHVlc1NxbCA9IGAoJDEsJDIsJDMsJDQsJDUsJDYsJDcsJDgsICQ5KSBgO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBlZGlkb1ZhbHVlcyA9IFtcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8ucHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLmZlY2hhLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudGUuY2xpZW50ZSxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8uZXN0YWRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby5mZWNoYV9lbnRyZWdhLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby5zdWJ0b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8uZGVzY3VlbnRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby50b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8ub2JzZXJ2YWNpb25lc1xyXG4gICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgIGlmKHBlZGlkby5wZWRpZG8pe1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyb1BlZGlkbz1wZWRpZG8ucGVkaWRvO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgZGVsZXRlIGZyb20gaXRlbXNfcGVkaWRvIHdoZXJlIHBlZGlkbyA9ICQxYCxbbnVtZXJvUGVkaWRvXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBwZWRpZG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7cGVkaWRvRmllbGRzU3FsfSA9ICR7cGVkaWRvVmFsdWVzU3FsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcGVkaWRvID0gJDEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAscGVkaWRvVmFsdWVzLmNvbmNhdChwZWRpZG8ucGVkaWRvKSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby5wcmVzdXB1ZXN0bz9hd2FpdCBwZXJtaXRlRWRpdGFyUHJlc3VwdWVzdG8ocGVkaWRvLnByZXN1cHVlc3RvLCBjbGllbnQpOm51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtZXJvUGVkaWRvID0gKGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBpbnRvIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVkaWRvcyAke3BlZGlkb0ZpZWxkc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyAke3BlZGlkb1ZhbHVlc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICAgICAgYCxwZWRpZG9WYWx1ZXMpLmZldGNoVW5pcXVlUm93KCkpLnJvdy5wZWRpZG9cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaXRlbSBvZiBwYXJhbWV0ZXJzLml0ZW1zKXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGl0ZW1zX3BlZGlkbyAocGVkaWRvLCBjYW50aWRhZCwgcHJvZHVjdG8sIG5vbWJyZSwgZGVzY3JpcGNpb24sIHByZWNpb191bml0YXJpbywgcG9yY2VudGFqZV9kZXNjdWVudG8sIGRlc2N1ZW50bywgdG90YWwpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICgkMSwkMiwkMywkNCwkNSwkNiwkNywkOCwkOSlcclxuICAgICAgICAgICAgICAgICAgICBgLFtudW1lcm9QZWRpZG8sIGl0ZW0uY2FudGlkYWQsIGl0ZW0ucHJvZHVjdG8sIGl0ZW0ubm9tYnJlLCBpdGVtLmRlc2NyaXBjaW9uLCBpdGVtLnByZWNpb191bml0YXJpbywgaXRlbS5wb3JjZW50YWplX2Rlc2N1ZW50bywgaXRlbS5kZXNjdWVudG8sIGl0ZW0udG90YWxdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZihwZWRpZG8ucHJlc3VwdWVzdG8pe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBwcmVzdXB1ZXN0b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICAgICAgYCxbRVNUQURPX0FDRVBUQURPX1BSRVNVUFVFU1RPLCBwZWRpZG8ucHJlc3VwdWVzdG9dKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBwcmVzdXB1ZXN0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGVkaWRvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCxbcGVkaWRvLnByZXN1cHVlc3RvXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgRWwgcHJlc3VwdWVzdG8gJHtwZWRpZG8ucHJlc3VwdWVzdG99IHlhIHRpZW5lIHVuIHBlZGlkbyBjcmVhZG8uIGAgKyBlcnIubWVzc2FnZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge2VzdGFkbzonb2snLCBwZWRpZG86IG51bWVyb1BlZGlkb307XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdwcm9kdWN0b19jbG9uYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncHJvZHVjdG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHByb2R1Y3RvID0gcGFyYW1ldGVycy5wcm9kdWN0bztcclxuXHJcbiAgICAgICAgICAgIC8vY2xvbmFjaW9uIHByb2R1Y3RvXHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0b0FDbG9uYXIgPSAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBzZWxlY3QgKiBmcm9tIHByb2R1Y3RvcyB3aGVyZSBwcm9kdWN0byA9ICQxYCxbcHJvZHVjdG9dKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3c7XHJcbiAgICAgICAgICAgIGRlbGV0ZShwcm9kdWN0b0FDbG9uYXIucHJvZHVjdG8pO1xyXG4gICAgICAgICAgICBkZWxldGUocHJvZHVjdG9BQ2xvbmFyLnN0b2NrKTtcclxuICAgICAgICAgICAgZGVsZXRlKHByb2R1Y3RvQUNsb25hci5zdG9ja19taW5pbW8pO1xyXG4gICAgICAgICAgICBkZWxldGUocHJvZHVjdG9BQ2xvbmFyLnN0b2NrX21heGltbyk7XHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0b0tleXM9W107XHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0b1ZhbHVlcz1bXTtcclxuICAgICAgICAgICAgZm9yKGxldCBrZXkgaW4gcHJvZHVjdG9BQ2xvbmFyKXtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RvS2V5cy5wdXNoKGJlLmRiLnF1b3RlSWRlbnQoa2V5KSk7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b1ZhbHVlcy5wdXNoKGJlLmRiLnF1b3RlTnVsbGFibGUocHJvZHVjdG9BQ2xvbmFyW2tleV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG9OdWV2byA9IChhd2FpdCBjbGllbnQucXVlcnkoYGluc2VydCBpbnRvIHByb2R1Y3RvcyAoJHtwcm9kdWN0b0tleXMuam9pbignLCcpfSkgdmFsdWVzICgke3Byb2R1Y3RvVmFsdWVzLmpvaW4oJywnKX0pIHJldHVybmluZyAqYCxbXSkuZmV0Y2hVbmlxdWVSb3coKSkucm93XHJcbiAgICAgICAgICAgIC8vY2xvbmFjaW9uIGluc3Vtb3NcclxuICAgICAgICAgICAgdmFyIHByb2R1Y3Rvc0luc3Vtb3NBQ2xvbmFyID0gKGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSBwcm9kdWN0b3NfaW5zdW1vcyB3aGVyZSBwcm9kdWN0byA9ICQxYCxbcHJvZHVjdG9dKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG4gICAgICAgICAgICB2YXIgcHJvZEluc3Vtb3NOdWV2b3M9W107XHJcbiAgICAgICAgICAgIGZvcih2YXIgcHJvZEluc3VtbyBvZiBwcm9kdWN0b3NJbnN1bW9zQUNsb25hcil7XHJcbiAgICAgICAgICAgICAgICBwcm9kSW5zdW1vLnByb2R1Y3RvPXByb2R1Y3RvTnVldm8ucHJvZHVjdG87XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvZEluc3Vtb0tleXM9W107XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvZEluc3Vtb1ZhbHVlcz1bXTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQga2V5IGluIHByb2RJbnN1bW8pe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RJbnN1bW9LZXlzLnB1c2goYmUuZGIucXVvdGVJZGVudChrZXkpKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kSW5zdW1vVmFsdWVzLnB1c2goYmUuZGIucXVvdGVOdWxsYWJsZShwcm9kSW5zdW1vW2tleV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByb2RJbnN1bW9zTnVldm9zLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBpbnRvIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zX2luc3Vtb3MgKCR7cHJvZEluc3Vtb0tleXMuam9pbignLCcpfSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgKCR7cHJvZEluc3Vtb1ZhbHVlcy5qb2luKCcsJyl9KSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxbXSkuZmV0Y2hVbmlxdWVSb3coKVxyXG4gICAgICAgICAgICAgICAgICAgICkucm93XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtlc3RhZG86J29rJywgcHJvZHVjdG9OdWV2bywgcHJvZEluc3Vtb3NOdWV2b3N9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnb2JqZWN0X2dldCcsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZTondGFibGVuYW1lJyAgICAgLCB0eXBlTmFtZTondGV4dCd9LFxyXG4gICAgICAgICAgICB7bmFtZToncGtfdmFsdWVzJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IGNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgcXVlcnkgPSBzcWxUb29scy5zdHJ1Y3R1cmVkRGF0YS5zcWxSZWFkKHBhcmFtZXRlcnMucGtfdmFsdWVzLCBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgcGFyYW1ldGVycy50YWJsZW5hbWUpKTtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeSkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjonb2JqZWN0X3NhdmUnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZTondGFibGVuYW1lJyAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J2RhdG9zJyAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBxdWVyaWVzID0gc3FsVG9vbHMuc3RydWN0dXJlZERhdGEuc3FsV3JpdGUocGFyYW1ldGVycy5kYXRvcywgY3JlYXRlU3RydWN0dXJlKGNvbnRleHQsIHBhcmFtZXRlcnMudGFibGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiIyMjIyMjIyMjIyMjI1wiLHF1ZXJpZXMpXHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBxdWVyaWVzLnJlZHVjZShmdW5jdGlvbihwcm9taXNlOlByb21pc2U8YW55PiwgcXVlcnk6c3RyaW5nKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5xdWVyeShxdWVyeSkuZXhlY3V0ZSgpLnRoZW4oZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSxQcm9taXNlLnJlc29sdmUoKSkudGhlbihhc3luYyBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0cmFlciBqc29uIHJlZnJlc2NhZG9cclxuICAgICAgICAgICAgICAgIC8vdmFyIHJlc3VsdCA9IGF3YWl0IGJlLnByb2NlZHVyZS5vYmplY3RfZ2V0LmNvcmVGdW5jdGlvbihjb250ZXh0LCB7dGFibGVuYW1lOnBhcmFtZXRlcnMudGFibGVuYW1lLCB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnI6RXJyb3Ipe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFTlRSQSBFTiBFTCBDQVRDSDogXCIsZXJyKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXTsiXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports", "backend-plus", "./app-contable"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const backend_plus_1 = require("backend-plus");
|
|
13
|
+
const app_contable_1 = require("./app-contable");
|
|
14
|
+
var AppContable = (0, app_contable_1.emergeAppContable)(backend_plus_1.AppBackend);
|
|
15
|
+
new AppContable().start();
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNvbnRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zZXJ2ZXItY29udGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOztJQUViLCtDQUEwQztJQUMxQyxpREFBbUQ7SUFFbkQsSUFBSSxXQUFXLEdBQUcsSUFBQSxnQ0FBaUIsRUFBQyx5QkFBVSxDQUFDLENBQUM7SUFFaEQsSUFBSSxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgQXBwQmFja2VuZCB9IGZyb20gXCJiYWNrZW5kLXBsdXNcIjtcclxuaW1wb3J0IHsgZW1lcmdlQXBwQ29udGFibGUgfSBmcm9tIFwiLi9hcHAtY29udGFibGVcIjtcclxuXHJcbnZhciBBcHBDb250YWJsZSA9IGVtZXJnZUFwcENvbnRhYmxlKEFwcEJhY2tlbmQpO1xyXG5cclxubmV3IEFwcENvbnRhYmxlKCkuc3RhcnQoKTtcclxuXHJcbiJdfQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.categorias_producto = categorias_producto;
|
|
13
|
+
function categorias_producto(context) {
|
|
14
|
+
var admin = context.user.rol === 'admin';
|
|
15
|
+
return {
|
|
16
|
+
name: 'categorias_producto',
|
|
17
|
+
allow: {
|
|
18
|
+
"vertical-edit": false,
|
|
19
|
+
},
|
|
20
|
+
editable: admin,
|
|
21
|
+
fields: [
|
|
22
|
+
{ name: 'categoria', typeName: 'text', nullable: false },
|
|
23
|
+
{ name: 'nombre', typeName: 'text', isName: true, nullable: false },
|
|
24
|
+
],
|
|
25
|
+
primaryKey: ['categoria']
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY2F0ZWdvcmlhc19wcm9kdWN0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvdGFibGUtY2F0ZWdvcmlhc19wcm9kdWN0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7SUFBQSxZQUFZLENBQUM7O0lBSWIsa0RBY0M7SUFkRCxTQUFnQixtQkFBbUIsQ0FBQyxPQUFvQjtRQUNwRCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBRyxPQUFPLENBQUM7UUFDdkMsT0FBTztZQUNILElBQUksRUFBQyxxQkFBcUI7WUFDMUIsS0FBSyxFQUFDO2dCQUNGLGVBQWUsRUFBQyxLQUFLO2FBQ3hCO1lBQ0QsUUFBUSxFQUFDLEtBQUs7WUFDZCxNQUFNLEVBQUM7Z0JBQ0gsRUFBQyxJQUFJLEVBQUMsV0FBVyxFQUFLLFFBQVEsRUFBQyxNQUFNLEVBQUcsUUFBUSxFQUFDLEtBQUssRUFBQztnQkFDdkQsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFRLFFBQVEsRUFBQyxNQUFNLEVBQUcsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsS0FBSyxFQUFDO2FBQ3ZFO1lBQ0QsVUFBVSxFQUFDLENBQUMsV0FBVyxDQUFDO1NBQzNCLENBQUM7SUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7VGFibGVEZWZpbml0aW9uLCBUYWJsZUNvbnRleHR9IGZyb20gXCIuL3R5cGVzLWNvbnRhYmxlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpYXNfcHJvZHVjdG8oY29udGV4dDpUYWJsZUNvbnRleHQpOlRhYmxlRGVmaW5pdGlvbntcbiAgICB2YXIgYWRtaW4gPSBjb250ZXh0LnVzZXIucm9sPT09J2FkbWluJztcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOidjYXRlZ29yaWFzX3Byb2R1Y3RvJyxcbiAgICAgICAgYWxsb3c6e1xuICAgICAgICAgICAgXCJ2ZXJ0aWNhbC1lZGl0XCI6ZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGVkaXRhYmxlOmFkbWluLFxuICAgICAgICBmaWVsZHM6W1xuICAgICAgICAgICAge25hbWU6J2NhdGVnb3JpYScgICAsIHR5cGVOYW1lOid0ZXh0JyAsIG51bGxhYmxlOmZhbHNlfSxcbiAgICAgICAgICAgIHtuYW1lOidub21icmUnICAgICAgLCB0eXBlTmFtZTondGV4dCcgLCBpc05hbWU6dHJ1ZSwgbnVsbGFibGU6ZmFsc2V9LFxuICAgICAgICBdLFxuICAgICAgICBwcmltYXJ5S2V5OlsnY2F0ZWdvcmlhJ11cbiAgICB9O1xufVxuIl19
|