contable 0.0.6 → 0.0.7
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 +240 -0
- package/dist/client/{menu.js → client/menu.js} +1 -1
- package/dist/client/client/redux-formulario.js +379 -0
- package/dist/client/client/render-components.js +750 -0
- package/dist/client/client/render-formulario.js +56 -0
- package/dist/client/client/render-general.js +197 -0
- package/dist/client/client/render-handlers.js +69 -0
- package/dist/client/client/tipos.js +13 -0
- package/dist/client/{tsconfig.json → client/tsconfig.json} +3 -4
- package/dist/{unlogged → client/unlogged}/tsconfig.json +1 -3
- package/dist/server/client/tipos.d.ts +119 -0
- package/dist/server/client/tipos.js +13 -0
- package/dist/server/{app-contable.d.ts → server/app-contable.d.ts} +63 -3
- package/dist/server/server/app-contable.js +192 -0
- package/dist/server/server/def-config.d.ts +1 -0
- package/dist/server/server/def-config.js +101 -0
- package/dist/server/server/procedures-contable.js +508 -0
- package/dist/server/{server-contable.js → server/server-contable.js} +1 -1
- package/dist/server/server/table-categorias_producto.js +29 -0
- package/dist/server/server/table-clientes.js +56 -0
- package/dist/server/server/table-condicion_iva.js +29 -0
- package/dist/server/server/table-estados_pedido.js +33 -0
- package/dist/server/server/table-estados_presupuesto.js +34 -0
- package/dist/server/server/table-insumos.js +44 -0
- package/dist/server/server/table-items_pedido.js +48 -0
- package/dist/server/server/table-items_presupuesto.js +48 -0
- package/dist/server/server/table-iva_productos.js +29 -0
- package/dist/server/server/table-parametros.js +38 -0
- package/dist/server/server/table-pedidos.js +48 -0
- package/dist/server/server/table-pedidos_pendientes.js +28 -0
- package/dist/server/server/table-pedidos_vencidos.js +28 -0
- package/dist/server/server/table-presupuestos.js +56 -0
- package/dist/server/server/table-productos.js +70 -0
- package/dist/server/server/table-productos_clientes.js +22 -0
- package/dist/server/server/table-productos_generales.js +22 -0
- package/dist/server/server/table-productos_insumos.js +47 -0
- package/dist/server/server/table-usuarios.js +44 -0
- package/dist/server/{types-contable.d.ts → server/types-contable.d.ts} +14 -3
- package/dist/server/server/types-contable.js +28 -0
- package/dist/unlogged/unlogged/adapt.js +8 -0
- package/dist/unlogged/unlogged/css/styles.styl +88 -0
- package/dist/unlogged/unlogged/img/login-logo-icon.png +0 -0
- package/dist/unlogged/unlogged/img/logo.png +0 -0
- package/dist/unlogged/unlogged/tsconfig.json +13 -0
- package/dist/unlogged/unlogged/unlogged.js +13 -0
- package/package.json +22 -5
- package/dist/client/client.js +0 -182
- package/dist/client/redux-formulario.js +0 -326
- package/dist/client/render-components.js +0 -617
- package/dist/client/render-formulario.js +0 -56
- package/dist/client/render-general.js +0 -172
- package/dist/client/render-handlers.js +0 -29
- package/dist/client/tipos.js +0 -13
- package/dist/server/app-contable.js +0 -192
- package/dist/server/def-config.d.ts +0 -1
- package/dist/server/def-config.js +0 -100
- package/dist/server/procedures-contable.js +0 -508
- package/dist/server/table-categorias_producto.js +0 -29
- package/dist/server/table-clientes.js +0 -56
- package/dist/server/table-condicion_iva.js +0 -29
- package/dist/server/table-estados_pedido.js +0 -33
- package/dist/server/table-estados_presupuesto.js +0 -34
- package/dist/server/table-insumos.js +0 -44
- package/dist/server/table-items_pedido.js +0 -48
- package/dist/server/table-items_presupuesto.js +0 -48
- package/dist/server/table-iva_productos.js +0 -29
- package/dist/server/table-parametros.js +0 -38
- package/dist/server/table-pedidos.js +0 -48
- package/dist/server/table-pedidos_pendientes.js +0 -28
- package/dist/server/table-pedidos_vencidos.js +0 -28
- package/dist/server/table-presupuestos.js +0 -56
- package/dist/server/table-productos.js +0 -70
- package/dist/server/table-productos_clientes.js +0 -22
- package/dist/server/table-productos_generales.js +0 -22
- package/dist/server/table-productos_insumos.js +0 -47
- package/dist/server/table-usuarios.js +0 -44
- package/dist/server/tsconfig.json +0 -10
- package/dist/server/types-contable.js +0 -28
- package/dist/unlogged/adapt.js +0 -8
- package/dist/unlogged/unlogged.js +0 -118
- /package/dist/client/{client.d.ts → client/client.d.ts} +0 -0
- /package/dist/client/{img → client/img}/bannersuperior.png +0 -0
- /package/dist/client/{menu.d.ts → client/menu.d.ts} +0 -0
- /package/dist/client/{redux-formulario.d.ts → client/redux-formulario.d.ts} +0 -0
- /package/dist/client/{render-components.d.ts → client/render-components.d.ts} +0 -0
- /package/dist/client/{render-components.tsx → client/render-components.tsx} +0 -0
- /package/dist/client/{render-formulario.d.ts → client/render-formulario.d.ts} +0 -0
- /package/dist/client/{render-formulario.tsx → client/render-formulario.tsx} +0 -0
- /package/dist/client/{render-general.d.ts → client/render-general.d.ts} +0 -0
- /package/dist/client/{render-general.tsx → client/render-general.tsx} +0 -0
- /package/dist/client/{render-handlers.d.ts → client/render-handlers.d.ts} +0 -0
- /package/dist/client/{tipos.d.ts → client/tipos.d.ts} +0 -0
- /package/dist/{unlogged → client/unlogged}/css/styles.styl +0 -0
- /package/dist/{unlogged/img/login-logo-icon.png.png → client/unlogged/img/login-logo-icon.png} +0 -0
- /package/dist/{unlogged → client/unlogged}/img/logo.png +0 -0
- /package/dist/server/{procedures-contable.d.ts → server/procedures-contable.d.ts} +0 -0
- /package/dist/server/{server-contable.d.ts → server/server-contable.d.ts} +0 -0
- /package/dist/server/{table-categorias_producto.d.ts → server/table-categorias_producto.d.ts} +0 -0
- /package/dist/server/{table-clientes.d.ts → server/table-clientes.d.ts} +0 -0
- /package/dist/server/{table-condicion_iva.d.ts → server/table-condicion_iva.d.ts} +0 -0
- /package/dist/server/{table-estados_pedido.d.ts → server/table-estados_pedido.d.ts} +0 -0
- /package/dist/server/{table-estados_presupuesto.d.ts → server/table-estados_presupuesto.d.ts} +0 -0
- /package/dist/server/{table-insumos.d.ts → server/table-insumos.d.ts} +0 -0
- /package/dist/server/{table-items_pedido.d.ts → server/table-items_pedido.d.ts} +0 -0
- /package/dist/server/{table-items_presupuesto.d.ts → server/table-items_presupuesto.d.ts} +0 -0
- /package/dist/server/{table-iva_productos.d.ts → server/table-iva_productos.d.ts} +0 -0
- /package/dist/server/{table-parametros.d.ts → server/table-parametros.d.ts} +0 -0
- /package/dist/server/{table-pedidos.d.ts → server/table-pedidos.d.ts} +0 -0
- /package/dist/server/{table-pedidos_pendientes.d.ts → server/table-pedidos_pendientes.d.ts} +0 -0
- /package/dist/server/{table-pedidos_vencidos.d.ts → server/table-pedidos_vencidos.d.ts} +0 -0
- /package/dist/server/{table-presupuestos.d.ts → server/table-presupuestos.d.ts} +0 -0
- /package/dist/server/{table-productos.d.ts → server/table-productos.d.ts} +0 -0
- /package/dist/server/{table-productos_clientes.d.ts → server/table-productos_clientes.d.ts} +0 -0
- /package/dist/server/{table-productos_generales.d.ts → server/table-productos_generales.d.ts} +0 -0
- /package/dist/server/{table-productos_insumos.d.ts → server/table-productos_insumos.d.ts} +0 -0
- /package/dist/server/{table-usuarios.d.ts → server/table-usuarios.d.ts} +0 -0
- /package/dist/unlogged/{adapt.d.ts → unlogged/adapt.d.ts} +0 -0
- /package/dist/unlogged/{unlogged.d.ts → unlogged/unlogged.d.ts} +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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1jb250YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvcHJvY2VkdXJlcy1jb250YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBT2IsbURBQWlDO0lBRWpDLCtDQUF1RDtJQUl2RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBR3BDLE1BQU0sMkJBQTJCLEdBQUksVUFBVSxDQUFDO0lBQ2hELE1BQU0sMEJBQTBCLEdBQUssU0FBUyxDQUFDO0lBQy9DLE1BQU0sNEJBQTRCLEdBQUcsV0FBVyxDQUFDO0lBRWpELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPO1FBQ3RCLE9BQU8scURBQXFELE9BQU8sV0FBVyxHQUFHLHNCQUFzQixDQUFBO0lBQzNHLENBQUM7SUFFRCxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUztRQUN6QixPQUFPLHFDQUFxQyxTQUFTLHlCQUF5QixHQUFHLHNCQUFzQixDQUFBO0lBQzNHLENBQUM7SUFFRCxJQUFJLGVBQWUsR0FBRyxTQUFTLGVBQWUsQ0FBQyxPQUFlLEVBQUUsU0FBZ0I7UUFDNUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFJLFlBQVksR0FBbUIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRSxJQUFJLGlCQUFpQixHQUFHLFNBQVMsaUJBQWlCLENBQUMsUUFBd0I7WUFDdkUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFTLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFD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O2dCQUNuRixJQUFJLEVBQUUsR0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLE1BQU0sR0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUMxQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUNwQyxPQUFPLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFTLE9BQW9CLEVBQUUsS0FBWTtvQkFDbkUsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNoQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUN0QyxPQUFPLElBQUksQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO29CQUMzQiw2QkFBNkI7b0JBQzdCLHVHQUF1RztvQkFDdkcsT0FBTyxJQUFJLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFTLEdBQVM7b0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ3RDLE1BQU0sR0FBRyxDQUFBO2dCQUNiLENBQUMsQ0FBQyxDQUFBO1lBQ04sQ0FBQztTQUNKO0tBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgUHJvY2VkdXJlRGVmLCBUYWJsZURlZmluaXRpb24sIENsaWVudCB9IGZyb20gXCIuL3R5cGVzLWNvbnRhYmxlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyZUNvbnRleHQsIENvcmVGdW5jdGlvblBhcmFtZXRlcnMsIENvbnRleHQsIEZvcmVpZ25LZXksIGNvcmVGdW5jdGlvblBhcmFtZXRlcnMgfSBmcm9tIFwiYmFja2VuZC1wbHVzXCI7XHJcbmltcG9ydCB7IENsaWVudGUgfSBmcm9tIFwiLi4vY2xpZW50L3RpcG9zXCI7XHJcblxyXG5pbXBvcnQgKiBhcyBsaWtlQXIgZnJvbSBcImxpa2UtYXJcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMtY29udGFibGVcIjtcclxuaW1wb3J0IHtqc29uLCBqc29ub30gZnJvbSBcInBnLXByb21pc2Utc3RyaWN0XCI7XHJcbmltcG9ydCB7Y2hhbmdpbmcsIGRhdGV0aW1lLCBkYXRlIH0gZnJvbSAnYmVzdC1nbG9iYWxzJztcclxuXHJcbmltcG9ydCB7cHJvbWlzZXMgYXMgIGZzfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSBcImRvbWFpblwiO1xyXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxudmFyIHNxbFRvb2xzID0gcmVxdWlyZSgnc3FsLXRvb2xzJyk7XHJcbnR5cGUgQW55T2JqZWN0ID0ge1trOnN0cmluZ106YW55fVxyXG5cclxuY29uc3QgRVNUQURPX0FDRVBUQURPX1BSRVNVUFVFU1RPICA9ICdhY2VwdGFkbyc7XHJcbmNvbnN0IEVTVEFET19BTlVMQURPX1BSRVNVUFVFU1RPICAgPSAnYW51bGFkbyc7XHJcbmNvbnN0IEVTVEFET19SRUNIQVpBRE9fUFJFU1VQVUVTVE8gPSAncmVjaGF6YWRvJztcclxuXHJcbmZ1bmN0aW9uIGpzb24oc3FsLCBvcmRlcmJ5KXtcclxuICAgIHJldHVybiBgQ09BTEVTQ0UoKFNFTEVDVCBqc29uYl9hZ2codG9fanNvbmIoai4qKSBPUkRFUiBCWSAke29yZGVyYnl9KSBmcm9tICgke3NxbH0pIGFzIGopLCdbXSc6Ompzb25iKWBcclxufVxyXG5cclxuZnVuY3Rpb24ganNvbm8oc3FsLCBpbmRleGVkYnkpe1xyXG4gICAgcmV0dXJuIGBDT0FMRVNDRSgoU0VMRUNUIGpzb25iX29iamVjdF9hZ2coJHtpbmRleGVkYnl9LHRvX2pzb25iKGouKikpIGZyb20gKCR7c3FsfSkgYXMgaiksJ3t9Jzo6anNvbmIpYFxyXG59XHJcblxyXG52YXIgY3JlYXRlU3RydWN0dXJlID0gZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJlKGNvbnRleHQ6Q29udGV4dCwgdGFibGVOYW1lOnN0cmluZyl7XHJcbiAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgdmFyIG1haW5UYWJsZURlZjpUYWJsZURlZmluaXRpb24gPSBiZS50YWJsZVN0cnVjdHVyZXNbdGFibGVOYW1lXShjb250ZXh0KTtcclxuICAgIHZhciBnZXRQa0Zyb21UYWJsZURlZiA9IGZ1bmN0aW9uIGdldFBrRnJvbVRhYmxlRGVmKHRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbil7XHJcbiAgICAgICAgcmV0dXJuIHRhYmxlRGVmLnByaW1hcnlLZXkubWFwKGZ1bmN0aW9uKHBrKXtcclxuICAgICAgICAgICAgcmV0dXJuIHtmaWVsZE5hbWU6cGt9O1xyXG4gICAgICAgIH0pXHJcbiAgICB9O1xyXG4gICAgdmFyIGdldEZrRnJvbVRhYmxlRGVmID0gZnVuY3Rpb24gZ2V0RmtGcm9tVGFibGVEZWYodGFibGVEZWY6VGFibGVEZWZpbml0aW9uKXtcclxuICAgICAgICByZXR1cm4gdGFibGVEZWYuZm9yZWlnbktleXMubWFwKGZ1bmN0aW9uKGZrKXtcclxuICAgICAgICAgICAgcmV0dXJuIGZrLmZpZWxkc1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0cnVjdD17XHJcbiAgICAgICAgdGFibGVOYW1lOm1haW5UYWJsZURlZi5uYW1lLFxyXG4gICAgICAgIHBrRmllbGRzOmdldFBrRnJvbVRhYmxlRGVmKG1haW5UYWJsZURlZiksXHJcbiAgICB9O1xyXG4gICAgc3RydWN0LmNoaWxkVGFibGVzPVtdO1xyXG4gICAgaWYobWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcyAmJiBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmxlbmd0aCl7XHJcbiAgICAgICAgbWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGRldGFpbFRhYmxlKXtcclxuICAgICAgICAgICAgc3RydWN0LmNoaWxkVGFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICBjaGFuZ2luZyhcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgZGV0YWlsVGFibGUudGFibGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGdldEZrRnJvbVRhYmxlRGVmKGJlLnRhYmxlU3RydWN0dXJlc1tkZXRhaWxUYWJsZS50YWJsZV0oY29udGV4dCkpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBzdHJ1Y3Q7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHBlcm1pdGVFZGl0YXJQcmVzdXB1ZXN0byhucm9QcmVzdXA6bnVtYmVyLCBjbGllbnQ6Q2xpZW50KXtcclxuICAgIGlmKCEoYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICBzZWxlY3QgKiBcclxuICAgICAgICAgICAgZnJvbSBwcmVzdXB1ZXN0b3MgaW5uZXIgam9pbiBlc3RhZG9zX3ByZXN1cHVlc3RvIHVzaW5nIChlc3RhZG8pXHJcbiAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDFcclxuICAgIGAsW25yb1ByZXN1cF0pLmZldGNoT25lUm93SWZFeGlzdHMoKSkucm93LnBlcm1pdGVfZWRpdGFyKXtcclxuICAgICAgICAvL3NpIGVsIGVzdGFkbyBubyBwZXJtaXRlIGVkaXRhciB0aXJhIGVycm9yXHJcbiAgICAgICAgdGhyb3cgRXJyb3IgKCdObyBzZSBwdWVkZSBlZGl0YXIgeWEgcXVlIHN1IGVzdGFkbyBubyBsbyBwZXJtaXRlLicpIFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUHJvY2VkdXJlc0NvbnRhYmxlIDogUHJvY2VkdXJlRGVmW10gPSBbXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZXN0cnVjdHVyYV9jcmVhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW10sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIF9wYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID1gXHJcbiAgICAgICAgICAgICAgICBTRUxFQ1QgXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGNsaWVudGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjbGllbnRlJ1xyXG4gICAgICAgICAgICAgICAgICAgICl9IGFzIGNsaWVudGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICR7anNvbm8oYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgcC4qLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oaS5jb3N0b191bml0YXJpbyppLnV0aWxpZGFkKnBpLmNhbnRpZGFkX2luc3VtbykgYXMgdG90YWxfaW5zdW1vcywgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX3Npbl9pbnN1bW9zICsgY29hbGVzY2Uoc3VtKGkuY29zdG9fdW5pdGFyaW8qaS51dGlsaWRhZCpwaS5jYW50aWRhZF9pbnN1bW8pLDApIGFzIHByZWNpb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwcm9kdWN0b3MgcCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gcHJvZHVjdG9zX2luc3Vtb3MgcGkgdXNpbmcgKHByb2R1Y3RvKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gaW5zdW1vcyBpIHVzaW5nIChpbnN1bW8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwLnByb2R1Y3RvID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgYnkgcC5wcm9kdWN0byxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jYXRlZ29yaWEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubm9tYnJlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmRlc2NyaXBjaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmhhYmlsaXRhZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucHJlY2lvX3Npbl9pbnN1bW9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnN0b2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnN0b2NrX21pbmltbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zdG9ja19tYXhpbW8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaXZhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9kdWN0bydcclxuICAgICAgICAgICAgICAgICAgICApfSBhcyBwcm9kdWN0b3MsXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGNvbmRpY2lvbl9pdmFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpY2lvbidcclxuICAgICAgICAgICAgICAgICAgICApfSBhcyBcImNvbmRpY2lvbmVzSXZhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29uKGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gZXN0YWRvc19wcmVzdXB1ZXN0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnb3JkZW4nXHJcbiAgICAgICAgICAgICAgICAgICAgKX0gYXMgXCJlc3RhZG9zUHJlc3VwdWVzdG9cIixcclxuICAgICAgICAgICAgICAgICAgICAke2pzb24oYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBlc3RhZG9zX3BlZGlkb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnb3JkZW4nXHJcbiAgICAgICAgICAgICAgICAgICAgKX0gYXMgXCJlc3RhZG9zUGVkaWRvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgKFNFTEVDVCB0b19qc29uYihqLiopIFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbSAoc2VsZWN0IGxlZ2FsZXNfcGVkaWRvLCBsZWdhbGVzX3ByZXN1cHVlc3RvIGZyb20gcGFyYW1ldHJvcykgYXMgaikgYXMgcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5KS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3c7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdwcmVzdXB1ZXN0b19jYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAge25hbWU6J3ByZXN1cHVlc3RvJyAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBxdWVyeSA9YFxyXG4gICAgICAgICAgICAgICAgU0VMRUNUIFxyXG4gICAgICAgICAgICAgICAgICAgIENPQUxFU0NFKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoU0VMRUNUIHRvX2pzb25iKGouKikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwcmVzdXB1ZXN0b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgalxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICwne30nOjpqc29uYlxyXG4gICAgICAgICAgICAgICAgICAgICkgYXMgcHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdG9fanNvbmIoai4qKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gY2xpZW50ZXMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGNsaWVudGUgPSAoc2VsZWN0IGNsaWVudGUgZnJvbSBwcmVzdXB1ZXN0b3Mgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgalxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLCd7fSc6Ompzb25iXHJcbiAgICAgICAgICAgICAgICAgICAgKSBhcyBjbGllbnRlLFxyXG4gICAgICAgICAgICAgICAgJHtqc29uKGBcclxuICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGl0ZW1zX3ByZXN1cHVlc3RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICdudW1lcm9fbGluZWEnXHJcbiAgICAgICAgICAgICAgICApfSBhcyBcIml0ZW1zXCJcclxuICAgICAgICAgICAgYDtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeSxbcGFyYW1ldGVycy5wcmVzdXB1ZXN0b10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvdztcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByZXN1cHVlc3RvX2d1YXJkYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncHJlc3VwdWVzdG8nICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgICAgIHtuYW1lOidpdGVtcycgICAgICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICAgICAge25hbWU6J2NsaWVudGUnICAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IGNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgcHJlc3VwID0gcGFyYW1ldGVycy5wcmVzdXB1ZXN0bztcclxuICAgICAgICAgICAgdmFyIGNsaWVudGUgPSBwYXJhbWV0ZXJzLmNsaWVudGU7XHJcbiAgICAgICAgICAgIHZhciBudW1lcm9QcmVzdXB1ZXN0bztcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZXN1cHVlc3RvRmllbGRzU3FsID0gYChmZWNoYSwgY2xpZW50ZSwgZXN0YWRvLCB2YWxpZG9faGFzdGEsIHN1YnRvdGFsLCBkZXNjdWVudG8sIHRvdGFsLCBjb25fb3BjaW9uZXMsIGNvbl9kZXNjdWVudG9fZW5faXRlbXMpIGA7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJlc3VwdWVzdG9WYWx1ZXNTcWwgPSBgKCQxLCQyLCQzLCQ0LCQ1LCQ2LCQ3LCQ4LCQ5KSBgO1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZXN1cHVlc3RvVmFsdWVzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5mZWNoYSxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRlLmNsaWVudGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLmVzdGFkbyxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXAudmFsaWRvX2hhc3RhLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5zdWJ0b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXAuZGVzY3VlbnRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC50b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXAuY29uX29wY2lvbmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5jb25fZGVzY3VlbnRvX2VuX2l0ZW1zXHJcbiAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgaWYocHJlc3VwLnByZXN1cHVlc3RvKXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwZXJtaXRlRWRpdGFyUHJlc3VwdWVzdG8ocHJlc3VwLnByZXN1cHVlc3RvLCBjbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyb1ByZXN1cHVlc3RvPXByZXN1cC5wcmVzdXB1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYGRlbGV0ZSBmcm9tIGl0ZW1zX3ByZXN1cHVlc3RvIHdoZXJlIHByZXN1cHVlc3RvID0gJDFgLFtudW1lcm9QcmVzdXB1ZXN0b10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcHJlc3VwdWVzdG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7cHJlc3VwdWVzdG9GaWVsZHNTcWx9ID0gJHtwcmVzdXB1ZXN0b1ZhbHVlc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAscHJlc3VwdWVzdG9WYWx1ZXMuY29uY2F0KHByZXN1cC5wcmVzdXB1ZXN0bykpLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBudW1lcm9QcmVzdXB1ZXN0byA9IChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgaW50byBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXN1cHVlc3RvcyAke3ByZXN1cHVlc3RvRmllbGRzU3FsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICR7cHJlc3VwdWVzdG9WYWx1ZXNTcWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAscHJlc3VwdWVzdG9WYWx1ZXMpLmZldGNoVW5pcXVlUm93KCkpLnJvdy5wcmVzdXB1ZXN0b1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpdGVtIG9mIHBhcmFtZXRlcnMuaXRlbXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gaXRlbXNfcHJlc3VwdWVzdG8gKHByZXN1cHVlc3RvLCBjYW50aWRhZCwgcHJvZHVjdG8sIG5vbWJyZSwgZGVzY3JpcGNpb24sIHByZWNpb191bml0YXJpbywgcG9yY2VudGFqZV9kZXNjdWVudG8sIGRlc2N1ZW50bywgdG90YWwpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICgkMSwkMiwkMywkNCwkNSwkNiwkNywkOCwkOSlcclxuICAgICAgICAgICAgICAgICAgICBgLFtudW1lcm9QcmVzdXB1ZXN0bywgaXRlbS5jYW50aWRhZCwgaXRlbS5wcm9kdWN0bywgaXRlbS5ub21icmUsIGl0ZW0uZGVzY3JpcGNpb24sIGl0ZW0ucHJlY2lvX3VuaXRhcmlvLCBpdGVtLnBvcmNlbnRhamVfZGVzY3VlbnRvLCBpdGVtLmRlc2N1ZW50bywgaXRlbS50b3RhbF0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB7ZXN0YWRvOidvaycsIHByZXN1cHVlc3RvOiBudW1lcm9QcmVzdXB1ZXN0b307XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdwcmVzdXB1ZXN0b19hbnVsYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncHJlc3VwdWVzdG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGRiID0gIGNvbnRleHQuYmUuZGI7XHJcbiAgICAgICAgICAgIHZhciBucm9QcmVzdXAgPSBwYXJhbWV0ZXJzLnByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwZXJtaXRlRWRpdGFyUHJlc3VwdWVzdG8obnJvUHJlc3VwLCBjbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcHJlc3VwdWVzdG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgYCxbbnJvUHJlc3VwLCBFU1RBRE9fQU5VTEFET19QUkVTVVBVRVNUT10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge2VzdGFkbzonb2snfTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByZXN1cHVlc3RvX3JlY2hhemFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3ByZXN1cHVlc3RvJyAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBkYiA9ICBjb250ZXh0LmJlLmRiO1xyXG4gICAgICAgICAgICB2YXIgbnJvUHJlc3VwID0gcGFyYW1ldGVycy5wcmVzdXB1ZXN0bztcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgcGVybWl0ZUVkaXRhclByZXN1cHVlc3RvKG5yb1ByZXN1cCwgY2xpZW50KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlIHByZXN1cHVlc3RvcyBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgYCxbbnJvUHJlc3VwLCBFU1RBRE9fUkVDSEFaQURPX1BSRVNVUFVFU1RPXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7ZXN0YWRvOidvayd9O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncGVkaWRvX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZToncGVkaWRvJyAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBxdWVyeSA9YFxyXG4gICAgICAgICAgICAgICAgU0VMRUNUIFxyXG4gICAgICAgICAgICAgICAgICAgIENPQUxFU0NFKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoU0VMRUNUIHRvX2pzb25iKGouKikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwZWRpZG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwZWRpZG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLCd7fSc6Ompzb25iXHJcbiAgICAgICAgICAgICAgICAgICAgKSBhcyBwZWRpZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdG9fanNvbmIoai4qKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gY2xpZW50ZXMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGNsaWVudGUgPSAoc2VsZWN0IGNsaWVudGUgZnJvbSBwZWRpZG9zIHdoZXJlIHBlZGlkbyA9ICQxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksJ3t9Jzo6anNvbmJcclxuICAgICAgICAgICAgICAgICAgICApIGFzIGNsaWVudGUsXHJcbiAgICAgICAgICAgICAgICAke2pzb24oYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gaXRlbXNfcGVkaWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHBlZGlkbyA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgICAgICAnbnVtZXJvX2xpbmVhJ1xyXG4gICAgICAgICAgICAgICAgKX0gYXMgXCJpdGVtc1wiXHJcbiAgICAgICAgICAgIGA7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnksW3BhcmFtZXRlcnMucGVkaWRvXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgLy8gVE9ETyAtPiBzdG9jayAocHVlZGUgaXIgZW4gdHJpZ2dlcilcclxuICAgICAgICBhY3Rpb246ICdwZWRpZG9fZ3VhcmRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidwZWRpZG8nICAgICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICAgICAge25hbWU6J2l0ZW1zJyAgICAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonY2xpZW50ZScgICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBwZWRpZG8gPSBwYXJhbWV0ZXJzLnBlZGlkbztcclxuICAgICAgICAgICAgdmFyIGNsaWVudGUgPSBwYXJhbWV0ZXJzLmNsaWVudGU7XHJcbiAgICAgICAgICAgIHZhciBudW1lcm9QZWRpZG87XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciBwZWRpZG9GaWVsZHNTcWwgPSBgKHByZXN1cHVlc3RvLCBmZWNoYSwgY2xpZW50ZSwgZXN0YWRvLCBmZWNoYV9lbnRyZWdhLCBzdWJ0b3RhbCwgZGVzY3VlbnRvLCB0b3RhbCwgb2JzZXJ2YWNpb25lcykgYDtcclxuICAgICAgICAgICAgICAgIHZhciBwZWRpZG9WYWx1ZXNTcWwgPSBgKCQxLCQyLCQzLCQ0LCQ1LCQ2LCQ3LCQ4LCAkOSkgYDtcclxuICAgICAgICAgICAgICAgIHZhciBwZWRpZG9WYWx1ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLnByZXN1cHVlc3RvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby5mZWNoYSxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRlLmNsaWVudGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLmVzdGFkbyxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8uZmVjaGFfZW50cmVnYSxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8uc3VidG90YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLmRlc2N1ZW50byxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8udG90YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLm9ic2VydmFjaW9uZXNcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBpZihwZWRpZG8ucGVkaWRvKXtcclxuICAgICAgICAgICAgICAgICAgICBudW1lcm9QZWRpZG89cGVkaWRvLnBlZGlkbztcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYGRlbGV0ZSBmcm9tIGl0ZW1zX3BlZGlkbyB3aGVyZSBwZWRpZG8gPSAkMWAsW251bWVyb1BlZGlkb10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcGVkaWRvcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCAke3BlZGlkb0ZpZWxkc1NxbH0gPSAke3BlZGlkb1ZhbHVlc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHBlZGlkbyA9ICQxMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICAgICAgICAgICAgICBgLHBlZGlkb1ZhbHVlcy5jb25jYXQocGVkaWRvLnBlZGlkbykpLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8ucHJlc3VwdWVzdG8/YXdhaXQgcGVybWl0ZUVkaXRhclByZXN1cHVlc3RvKHBlZGlkby5wcmVzdXB1ZXN0bywgY2xpZW50KTpudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyb1BlZGlkbyA9IChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgaW50byBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZGlkb3MgJHtwZWRpZG9GaWVsZHNTcWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgJHtwZWRpZG9WYWx1ZXNTcWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAscGVkaWRvVmFsdWVzKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3cucGVkaWRvXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGl0ZW0gb2YgcGFyYW1ldGVycy5pdGVtcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBpdGVtc19wZWRpZG8gKHBlZGlkbywgY2FudGlkYWQsIHByb2R1Y3RvLCBub21icmUsIGRlc2NyaXBjaW9uLCBwcmVjaW9fdW5pdGFyaW8sIHBvcmNlbnRhamVfZGVzY3VlbnRvLCBkZXNjdWVudG8sIHRvdGFsKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyAoJDEsJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDkpXHJcbiAgICAgICAgICAgICAgICAgICAgYCxbbnVtZXJvUGVkaWRvLCBpdGVtLmNhbnRpZGFkLCBpdGVtLnByb2R1Y3RvLCBpdGVtLm5vbWJyZSwgaXRlbS5kZXNjcmlwY2lvbiwgaXRlbS5wcmVjaW9fdW5pdGFyaW8sIGl0ZW0ucG9yY2VudGFqZV9kZXNjdWVudG8sIGl0ZW0uZGVzY3VlbnRvLCBpdGVtLnRvdGFsXSlcclxuICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYocGVkaWRvLnByZXN1cHVlc3RvKXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcHJlc3VwdWVzdG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwcmVzdXB1ZXN0byA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAsW0VTVEFET19BQ0VQVEFET19QUkVTVVBVRVNUTywgcGVkaWRvLnByZXN1cHVlc3RvXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgcHJlc3VwdWVzdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBlZGlkb3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwcmVzdXB1ZXN0byA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsW3BlZGlkby5wcmVzdXB1ZXN0b10pLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEVsIHByZXN1cHVlc3RvICR7cGVkaWRvLnByZXN1cHVlc3RvfSB5YSB0aWVuZSB1biBwZWRpZG8gY3JlYWRvLiBgICsgZXJyLm1lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtlc3RhZG86J29rJywgcGVkaWRvOiBudW1lcm9QZWRpZG99O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncHJvZHVjdG9fY2xvbmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3Byb2R1Y3RvJyAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0byA9IHBhcmFtZXRlcnMucHJvZHVjdG87XHJcblxyXG4gICAgICAgICAgICAvL2Nsb25hY2lvbiBwcm9kdWN0b1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG9BQ2xvbmFyID0gKGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSBwcm9kdWN0b3Mgd2hlcmUgcHJvZHVjdG8gPSAkMWAsW3Byb2R1Y3RvXSkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG4gICAgICAgICAgICBkZWxldGUocHJvZHVjdG9BQ2xvbmFyLnByb2R1Y3RvKTtcclxuICAgICAgICAgICAgZGVsZXRlKHByb2R1Y3RvQUNsb25hci5zdG9jayk7XHJcbiAgICAgICAgICAgIGRlbGV0ZShwcm9kdWN0b0FDbG9uYXIuc3RvY2tfbWluaW1vKTtcclxuICAgICAgICAgICAgZGVsZXRlKHByb2R1Y3RvQUNsb25hci5zdG9ja19tYXhpbW8pO1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG9LZXlzPVtdO1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG9WYWx1ZXM9W107XHJcbiAgICAgICAgICAgIGZvcihsZXQga2V5IGluIHByb2R1Y3RvQUNsb25hcil7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b0tleXMucHVzaChiZS5kYi5xdW90ZUlkZW50KGtleSkpO1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9WYWx1ZXMucHVzaChiZS5kYi5xdW90ZU51bGxhYmxlKHByb2R1Y3RvQUNsb25hcltrZXldKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHByb2R1Y3RvTnVldm8gPSAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBpbnNlcnQgaW50byBwcm9kdWN0b3MgKCR7cHJvZHVjdG9LZXlzLmpvaW4oJywnKX0pIHZhbHVlcyAoJHtwcm9kdWN0b1ZhbHVlcy5qb2luKCcsJyl9KSByZXR1cm5pbmcgKmAsW10pLmZldGNoVW5pcXVlUm93KCkpLnJvd1xyXG4gICAgICAgICAgICAvL2Nsb25hY2lvbiBpbnN1bW9zXHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0b3NJbnN1bW9zQUNsb25hciA9IChhd2FpdCBjbGllbnQucXVlcnkoYHNlbGVjdCAqIGZyb20gcHJvZHVjdG9zX2luc3Vtb3Mgd2hlcmUgcHJvZHVjdG8gPSAkMWAsW3Byb2R1Y3RvXSkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgdmFyIHByb2RJbnN1bW9zTnVldm9zPVtdO1xyXG4gICAgICAgICAgICBmb3IodmFyIHByb2RJbnN1bW8gb2YgcHJvZHVjdG9zSW5zdW1vc0FDbG9uYXIpe1xyXG4gICAgICAgICAgICAgICAgcHJvZEluc3Vtby5wcm9kdWN0bz1wcm9kdWN0b051ZXZvLnByb2R1Y3RvO1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb2RJbnN1bW9LZXlzPVtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb2RJbnN1bW9WYWx1ZXM9W107XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGtleSBpbiBwcm9kSW5zdW1vKXtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kSW5zdW1vS2V5cy5wdXNoKGJlLmRiLnF1b3RlSWRlbnQoa2V5KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZEluc3Vtb1ZhbHVlcy5wdXNoKGJlLmRiLnF1b3RlTnVsbGFibGUocHJvZEluc3Vtb1trZXldKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwcm9kSW5zdW1vc051ZXZvcy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgaW50byBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc19pbnN1bW9zICgke3Byb2RJbnN1bW9LZXlzLmpvaW4oJywnKX0pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICgke3Byb2RJbnN1bW9WYWx1ZXMuam9pbignLCcpfSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsW10pLmZldGNoVW5pcXVlUm93KClcclxuICAgICAgICAgICAgICAgICAgICApLnJvd1xyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7ZXN0YWRvOidvaycsIHByb2R1Y3RvTnVldm8sIHByb2RJbnN1bW9zTnVldm9zfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ29iamVjdF9nZXQnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAge25hbWU6J3RhYmxlbmFtZScgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3BrX3ZhbHVlcycgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gc3FsVG9vbHMuc3RydWN0dXJlZERhdGEuc3FsUmVhZChwYXJhbWV0ZXJzLnBrX3ZhbHVlcywgY3JlYXRlU3RydWN0dXJlKGNvbnRleHQsIHBhcmFtZXRlcnMudGFibGVuYW1lKSk7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnkpLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J29iamVjdF9zYXZlJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3RhYmxlbmFtZScgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidkYXRvcycgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgcXVlcmllcyA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFdyaXRlKHBhcmFtZXRlcnMuZGF0b3MsIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBwYXJhbWV0ZXJzLnRhYmxlbmFtZSkpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiMjIyMjIyMjIyMjIyNcIixxdWVyaWVzKVxyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcXVlcmllcy5yZWR1Y2UoZnVuY3Rpb24ocHJvbWlzZTpQcm9taXNlPGFueT4sIHF1ZXJ5OnN0cmluZyl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQucXVlcnkocXVlcnkpLmV4ZWN1dGUoKS50aGVuKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oYXN5bmMgZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIC8vVE9ETzogdHJhZXIganNvbiByZWZyZXNjYWRvXHJcbiAgICAgICAgICAgICAgICAvL3ZhciByZXN1bHQgPSBhd2FpdCBiZS5wcm9jZWR1cmUub2JqZWN0X2dldC5jb3JlRnVuY3Rpb24oY29udGV4dCwge3RhYmxlbmFtZTpwYXJhbWV0ZXJzLnRhYmxlbmFtZSwgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyOkVycm9yKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRU5UUkEgRU4gRUwgQ0FUQ0g6IFwiLGVycilcclxuICAgICAgICAgICAgICAgIHRocm93IGVyclxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbl07Il19
|
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
const app_contable_1 = require("./app-contable");
|
|
13
13
|
new app_contable_1.AppContable().start();
|
|
14
14
|
});
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNvbnRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci9zZXJ2ZXItY29udGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOztJQUViLGlEQUE0QztJQUU1QyxJQUFJLDBCQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgQXBwQ29udGFibGV9IGZyb20gXCIuL2FwcC1jb250YWJsZVwiO1xyXG5cclxubmV3IEFwcENvbnRhYmxlKCkuc3RhcnQoKTtcclxuXHJcbiJdfQ==
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY2F0ZWdvcmlhc19wcm9kdWN0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvdGFibGUtY2F0ZWdvcmlhc19wcm9kdWN0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7SUFBQSxZQUFZLENBQUM7O0lBSWIsa0RBY0M7SUFkRCxTQUFnQixtQkFBbUIsQ0FBQyxPQUFvQjtRQUNwRCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBRyxPQUFPLENBQUM7UUFDdkMsT0FBTztZQUNILElBQUksRUFBQyxxQkFBcUI7WUFDMUIsS0FBSyxFQUFDO2dCQUNGLGVBQWUsRUFBQyxLQUFLO2FBQ3hCO1lBQ0QsUUFBUSxFQUFDLEtBQUs7WUFDZCxNQUFNLEVBQUM7Z0JBQ0gsRUFBQyxJQUFJLEVBQUMsV0FBVyxFQUFLLFFBQVEsRUFBQyxNQUFNLEVBQUcsUUFBUSxFQUFDLEtBQUssRUFBQztnQkFDdkQsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFRLFFBQVEsRUFBQyxNQUFNLEVBQUcsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsS0FBSyxFQUFDO2FBQ3ZFO1lBQ0QsVUFBVSxFQUFDLENBQUMsV0FBVyxDQUFDO1NBQzNCLENBQUM7SUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7VGFibGVEZWZpbml0aW9uLCBUYWJsZUNvbnRleHR9IGZyb20gXCIuL3R5cGVzLWNvbnRhYmxlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpYXNfcHJvZHVjdG8oY29udGV4dDpUYWJsZUNvbnRleHQpOlRhYmxlRGVmaW5pdGlvbntcbiAgICB2YXIgYWRtaW4gPSBjb250ZXh0LnVzZXIucm9sPT09J2FkbWluJztcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOidjYXRlZ29yaWFzX3Byb2R1Y3RvJyxcbiAgICAgICAgYWxsb3c6e1xuICAgICAgICAgICAgXCJ2ZXJ0aWNhbC1lZGl0XCI6ZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGVkaXRhYmxlOmFkbWluLFxuICAgICAgICBmaWVsZHM6W1xuICAgICAgICAgICAge25hbWU6J2NhdGVnb3JpYScgICAsIHR5cGVOYW1lOid0ZXh0JyAsIG51bGxhYmxlOmZhbHNlfSxcbiAgICAgICAgICAgIHtuYW1lOidub21icmUnICAgICAgLCB0eXBlTmFtZTondGV4dCcgLCBpc05hbWU6dHJ1ZSwgbnVsbGFibGU6ZmFsc2V9LFxuICAgICAgICBdLFxuICAgICAgICBwcmltYXJ5S2V5OlsnY2F0ZWdvcmlhJ11cbiAgICB9O1xufVxuIl19
|