@codemind.ec/medusa-plugin-invoice 1.0.1 → 1.0.2
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/.medusa/server/src/admin/index.js +1 -1
- package/.medusa/server/src/admin/index.mjs +1 -1
- package/.medusa/server/src/api/admin/invoice-config/route.js +26 -0
- package/.medusa/server/src/api/admin/invoice-templates/[id]/preview/route.js +119 -0
- package/.medusa/server/src/api/admin/invoice-templates/[id]/restore/route.js +21 -0
- package/.medusa/server/src/api/admin/invoice-templates/[id]/route.js +31 -0
- package/.medusa/server/src/api/admin/invoice-templates/route.js +20 -0
- package/.medusa/server/src/api/admin/invoice-templates/validators.js +18 -0
- package/.medusa/server/src/api/middlewares.js +36 -0
- package/.medusa/server/src/index.js +16 -1
- package/.medusa/server/src/modules/invoice-generator/errors.js +30 -0
- package/.medusa/server/src/modules/invoice-generator/index.js +15 -0
- package/.medusa/server/src/modules/invoice-generator/loaders/create-default-config.js +34 -0
- package/.medusa/server/src/modules/invoice-generator/migrations/Migration20250728094738.js +18 -0
- package/.medusa/server/src/modules/invoice-generator/migrations/Migration20250728124134.js +14 -0
- package/.medusa/server/src/modules/invoice-generator/migrations/Migration20250728151454.js +14 -0
- package/.medusa/server/src/modules/invoice-generator/migrations/Migration20260120005559.js +14 -0
- package/.medusa/server/src/modules/invoice-generator/migrations/Migration20260216191700.js +14 -0
- package/.medusa/server/src/modules/invoice-generator/migrations/Migration20260601120000.js +17 -0
- package/.medusa/server/src/modules/invoice-generator/models/invoice-config.js +16 -0
- package/.medusa/server/src/modules/invoice-generator/models/invoice-template.js +19 -0
- package/.medusa/server/src/modules/invoice-generator/models/invoice.js +17 -0
- package/.medusa/server/src/modules/invoice-generator/service.js +84 -0
- package/.medusa/server/src/modules/invoice-generator/templates/defaults/index.js +380 -0
- package/.medusa/server/src/modules/invoice-generator/templates/order-invoice.js +348 -0
- package/.medusa/server/src/modules/invoice-generator/templates/quote-proforma.js +468 -0
- package/.medusa/server/src/modules/invoice-generator/templates/strategy.js +110 -0
- package/README.md +134 -43
- package/index.d.ts +138 -0
- package/package.json +91 -70
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OrderInvoiceStrategy = void 0;
|
|
4
|
+
const strategy_1 = require("./strategy");
|
|
5
|
+
// ── Type guard ────────────────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* `InvoiceLineItem` may be enriched with extra fields at runtime.
|
|
8
|
+
* We use a type guard instead of casting to safely access optional extended
|
|
9
|
+
* properties like `variant_title` that come from query-graph population.
|
|
10
|
+
*/
|
|
11
|
+
function isEnrichedLineItem(item) {
|
|
12
|
+
return typeof item.variant_title === 'string';
|
|
13
|
+
}
|
|
14
|
+
// ── Shared table layout ───────────────────────────────────────────────────────
|
|
15
|
+
const tableLayout = {
|
|
16
|
+
fillColor: (rowIndex) => (rowIndex === 0 ? "#f8f9fa" : null),
|
|
17
|
+
hLineWidth: (i, node) => i === 0 || i === node.table.body.length ? 0.8 : 0.3,
|
|
18
|
+
vLineWidth: () => 0.3,
|
|
19
|
+
hLineColor: (i, node) => i === 0 || i === node.table.body.length ? "#cbd5e0" : "#e2e8f0",
|
|
20
|
+
vLineColor: () => "#e2e8f0",
|
|
21
|
+
paddingLeft: () => 8,
|
|
22
|
+
paddingRight: () => 8,
|
|
23
|
+
paddingTop: () => 6,
|
|
24
|
+
paddingBottom: () => 6,
|
|
25
|
+
};
|
|
26
|
+
// ── Strategy ──────────────────────────────────────────────────────────────────
|
|
27
|
+
class OrderInvoiceStrategy extends strategy_1.BaseDocumentStrategy {
|
|
28
|
+
async buildDocumentDefinition(input, config, htmlTemplate) {
|
|
29
|
+
const { order, items } = input;
|
|
30
|
+
// ── If HTML template provided, render via Handlebars + html-to-pdfmake ──
|
|
31
|
+
if (htmlTemplate) {
|
|
32
|
+
return this.buildFromHtml(htmlTemplate, input, config);
|
|
33
|
+
}
|
|
34
|
+
// ── Fallback: original pdfmake definition ──────────────────────────────
|
|
35
|
+
const itemRows = items.map((raw) => {
|
|
36
|
+
const variantTitle = isEnrichedLineItem(raw) ? raw.variant_title : (raw.variant?.title ?? '');
|
|
37
|
+
const showVariant = variantTitle.length > 0 && variantTitle !== "Default Variant";
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
stack: [
|
|
41
|
+
{ text: raw.title ?? "Artículo desconocido", style: "tableRow", bold: true },
|
|
42
|
+
...(showVariant
|
|
43
|
+
? [{ text: variantTitle, style: "tableRow", color: "#6b7280", fontSize: 8, margin: [0, 2, 0, 0] }]
|
|
44
|
+
: []),
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{ text: String(raw.quantity), style: "tableRow" },
|
|
48
|
+
{ text: this.formatAmount(raw.unit_price, order.currency_code ?? ''), style: "tableRow" },
|
|
49
|
+
{ text: this.formatAmount(Number(raw.subtotal ?? 0), order.currency_code ?? ''), style: "tableRow" },
|
|
50
|
+
];
|
|
51
|
+
});
|
|
52
|
+
const itemsTable = [
|
|
53
|
+
[
|
|
54
|
+
{ text: "Artículo", style: "tableHeader" },
|
|
55
|
+
{ text: "Cantidad", style: "tableHeader" },
|
|
56
|
+
{ text: "Precio Unitario", style: "tableHeader" },
|
|
57
|
+
{ text: "Total", style: "tableHeader" },
|
|
58
|
+
],
|
|
59
|
+
...itemRows,
|
|
60
|
+
];
|
|
61
|
+
const invoiceId = `INV-${input.invoiceDisplayId.toString().padStart(6, "0")}`;
|
|
62
|
+
const invoiceDate = new Date(input.created_at).toLocaleDateString("es-ES");
|
|
63
|
+
const logoBase64 = config.company_logo
|
|
64
|
+
? await this.imageUrlToBase64(config.company_logo)
|
|
65
|
+
: "";
|
|
66
|
+
const billingText = this.formatAddress(order.billing_address, "Sin dirección de facturación");
|
|
67
|
+
const shippingText = this.formatAddress(order.shipping_address, "Sin dirección de envío");
|
|
68
|
+
const isHomeDelivery = order.shipping_methods?.some(sm => sm.shipping_option_id === (process.env.HOME_DELIVERY_OPTION_ID || "so_01KAT339XAY8G622P8PSGW7BAZ"));
|
|
69
|
+
const extractCedula = (addr, metadata) => {
|
|
70
|
+
const val = addr?.metadata?.cedula ?? metadata?.cedula;
|
|
71
|
+
if (!val)
|
|
72
|
+
return "";
|
|
73
|
+
return `Cédula/RUC: ${val}`;
|
|
74
|
+
};
|
|
75
|
+
const cedulaText = extractCedula(order.billing_address, order.metadata) || extractCedula(order.shipping_address, order.metadata);
|
|
76
|
+
const clientStack = [
|
|
77
|
+
{ text: "CLIENTE", style: "sectionHeader", margin: [0, 0, 0, 8] },
|
|
78
|
+
{ text: billingText, style: "addressText" },
|
|
79
|
+
];
|
|
80
|
+
if (cedulaText) {
|
|
81
|
+
clientStack.push({ text: cedulaText, style: "addressText", margin: [0, 4, 0, 0] });
|
|
82
|
+
}
|
|
83
|
+
const totalsBody = [
|
|
84
|
+
[
|
|
85
|
+
{ text: "Subtotal:", style: "totalLabel" },
|
|
86
|
+
{ text: this.formatAmount(Number(order.subtotal ?? 0), order.currency_code ?? ''), style: "totalValue" },
|
|
87
|
+
],
|
|
88
|
+
[
|
|
89
|
+
{ text: "Impuestos:", style: "totalLabel" },
|
|
90
|
+
{ text: this.formatAmount(Number(order.tax_total ?? 0), order.currency_code ?? ''), style: "totalValue" },
|
|
91
|
+
],
|
|
92
|
+
];
|
|
93
|
+
if (!isHomeDelivery && order.shipping_methods && order.shipping_methods.length > 0) {
|
|
94
|
+
totalsBody.push([
|
|
95
|
+
{ text: "Envío:", style: "totalLabel" },
|
|
96
|
+
{ text: this.formatAmount(Number(order.shipping_methods[0].amount ?? 0), order.currency_code ?? ''), style: "totalValue" },
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
if (order.discount_total) {
|
|
100
|
+
totalsBody.push([
|
|
101
|
+
{ text: "Descuento:", style: "totalLabel" },
|
|
102
|
+
{ text: this.formatAmount(Number(order.discount_total), order.currency_code ?? ''), style: "totalValue" },
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
totalsBody.push([
|
|
106
|
+
{ text: "Total:", style: "totalLabel" },
|
|
107
|
+
{ text: this.formatAmount(Number(order.total ?? 0), order.currency_code ?? ''), style: "totalValue" },
|
|
108
|
+
]);
|
|
109
|
+
const docDef = {
|
|
110
|
+
pageSize: "A4",
|
|
111
|
+
pageMargins: [40, 60, 40, 60],
|
|
112
|
+
header: {
|
|
113
|
+
margin: [40, 20, 40, 0],
|
|
114
|
+
columns: [
|
|
115
|
+
{
|
|
116
|
+
width: "*",
|
|
117
|
+
stack: [
|
|
118
|
+
...(logoBase64
|
|
119
|
+
? [
|
|
120
|
+
{
|
|
121
|
+
image: logoBase64,
|
|
122
|
+
width: 80,
|
|
123
|
+
height: 40,
|
|
124
|
+
fit: [80, 40],
|
|
125
|
+
margin: [0, 0, 0, 10],
|
|
126
|
+
},
|
|
127
|
+
]
|
|
128
|
+
: []),
|
|
129
|
+
{
|
|
130
|
+
text: config.company_name ?? "Nombre de tu empresa",
|
|
131
|
+
style: "companyName",
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
width: "auto",
|
|
137
|
+
stack: [
|
|
138
|
+
{
|
|
139
|
+
text: "COMPROBANTE DE PEDIDO",
|
|
140
|
+
style: "invoiceTitle",
|
|
141
|
+
alignment: "right",
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
content: [
|
|
148
|
+
{
|
|
149
|
+
margin: [0, 20, 0, 0],
|
|
150
|
+
columns: [
|
|
151
|
+
// Company details
|
|
152
|
+
{
|
|
153
|
+
width: "*",
|
|
154
|
+
stack: [
|
|
155
|
+
{ text: "DATOS DE LA EMPRESA", style: "sectionHeader", margin: [0, 0, 0, 8] },
|
|
156
|
+
...(config.company_ruc
|
|
157
|
+
? [{ text: `RUC: ${config.company_ruc}`, style: "companyContact", margin: [0, 0, 0, 4] }]
|
|
158
|
+
: []),
|
|
159
|
+
...(config.company_address
|
|
160
|
+
? [{ text: config.company_address, style: "companyAddress", margin: [0, 0, 0, 4] }]
|
|
161
|
+
: []),
|
|
162
|
+
...(config.company_phone
|
|
163
|
+
? [{ text: config.company_phone, style: "companyContact", margin: [0, 0, 0, 4] }]
|
|
164
|
+
: []),
|
|
165
|
+
...(config.company_email
|
|
166
|
+
? [{ text: config.company_email, style: "companyContact" }]
|
|
167
|
+
: []),
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
// Invoice meta
|
|
171
|
+
{
|
|
172
|
+
width: "auto",
|
|
173
|
+
table: {
|
|
174
|
+
widths: [80, 120],
|
|
175
|
+
body: [
|
|
176
|
+
[
|
|
177
|
+
{ text: "Comprobante N°:", style: "label" },
|
|
178
|
+
{ text: invoiceId, style: "value" },
|
|
179
|
+
],
|
|
180
|
+
[
|
|
181
|
+
{ text: "Fecha:", style: "label" },
|
|
182
|
+
{ text: invoiceDate, style: "value" },
|
|
183
|
+
],
|
|
184
|
+
[
|
|
185
|
+
{ text: "Pedido N°:", style: "label" },
|
|
186
|
+
{ text: String(order.display_id).padStart(6, "0"), style: "value" },
|
|
187
|
+
],
|
|
188
|
+
[
|
|
189
|
+
{ text: "Fecha Pedido:", style: "label" },
|
|
190
|
+
{ text: new Date(order.created_at).toLocaleDateString("es-ES"), style: "value" },
|
|
191
|
+
],
|
|
192
|
+
],
|
|
193
|
+
},
|
|
194
|
+
layout: "noBorders",
|
|
195
|
+
margin: [0, 0, 0, 20],
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
{ text: "\n" },
|
|
200
|
+
// Addresses
|
|
201
|
+
{
|
|
202
|
+
columns: [
|
|
203
|
+
{
|
|
204
|
+
width: "*",
|
|
205
|
+
stack: clientStack,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
width: "*",
|
|
209
|
+
stack: [
|
|
210
|
+
{ text: "ENVÍO A", style: "sectionHeader", margin: [0, 0, 0, 8] },
|
|
211
|
+
{ text: shippingText, style: "addressText" },
|
|
212
|
+
],
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
},
|
|
216
|
+
{ text: "\n\n" },
|
|
217
|
+
// Items table
|
|
218
|
+
{
|
|
219
|
+
table: {
|
|
220
|
+
headerRows: 1,
|
|
221
|
+
widths: ["*", "auto", "auto", "auto"],
|
|
222
|
+
body: itemsTable,
|
|
223
|
+
},
|
|
224
|
+
layout: tableLayout,
|
|
225
|
+
},
|
|
226
|
+
{ text: "\n" },
|
|
227
|
+
// Totals
|
|
228
|
+
{
|
|
229
|
+
columns: [
|
|
230
|
+
{ width: "*", text: "" },
|
|
231
|
+
{
|
|
232
|
+
width: "auto",
|
|
233
|
+
table: {
|
|
234
|
+
widths: ["auto", "auto"],
|
|
235
|
+
body: totalsBody,
|
|
236
|
+
},
|
|
237
|
+
layout: tableLayout,
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
},
|
|
241
|
+
{ text: "\n\n" },
|
|
242
|
+
// Notes
|
|
243
|
+
...(isHomeDelivery
|
|
244
|
+
? [
|
|
245
|
+
{ text: "AVISO SOBRE TRANSPORTE", style: "warningHeader", margin: [0, 20, 0, 4] },
|
|
246
|
+
{ text: "El valor de transporte no está incluido en este comprobante y deberá cotizarse aparte directamente con el vendedor.", style: "warningText", margin: [0, 0, 0, 20] },
|
|
247
|
+
]
|
|
248
|
+
: []),
|
|
249
|
+
...(config.notes
|
|
250
|
+
? [
|
|
251
|
+
{ text: "Notas", style: "sectionHeader", margin: [0, 20, 0, 10] },
|
|
252
|
+
{ text: config.notes, style: "notesText", margin: [0, 0, 0, 20] },
|
|
253
|
+
]
|
|
254
|
+
: []),
|
|
255
|
+
{ text: "¡Gracias por tu compra!", style: "thankYouText", alignment: "center", margin: [0, 30, 0, 0] },
|
|
256
|
+
{ text: "Este documento es un comprobante de pedido, no constituye factura fiscal.", style: "disclaimerText", alignment: "center", margin: [0, 10, 0, 0] },
|
|
257
|
+
],
|
|
258
|
+
styles: {
|
|
259
|
+
companyName: { fontSize: 22, bold: true, color: "#1a365d" },
|
|
260
|
+
companyAddress: { fontSize: 11, color: "#4a5568", lineHeight: 1.3 },
|
|
261
|
+
companyContact: { fontSize: 10, color: "#4a5568" },
|
|
262
|
+
invoiceTitle: { fontSize: 24, bold: true, color: "#2c3e50" },
|
|
263
|
+
label: { fontSize: 10, color: "#6c757d" },
|
|
264
|
+
value: { fontSize: 10, bold: true, color: "#2c3e50" },
|
|
265
|
+
sectionHeader: { fontSize: 12, bold: true, color: "#2c3e50" },
|
|
266
|
+
addressText: { fontSize: 10, color: "#495057", lineHeight: 1.3 },
|
|
267
|
+
tableHeader: { fontSize: 10, bold: true, color: "#ffffff", fillColor: "#495057" },
|
|
268
|
+
tableRow: { fontSize: 9, color: "#495057" },
|
|
269
|
+
totalLabel: { fontSize: 10, bold: true, color: "#495057" },
|
|
270
|
+
totalValue: { fontSize: 10, bold: true, color: "#2c3e50" },
|
|
271
|
+
notesText: { fontSize: 10, color: "#6c757d", italics: true, lineHeight: 1.4 },
|
|
272
|
+
thankYouText: { fontSize: 12, color: "#28a745", italics: true },
|
|
273
|
+
disclaimerText: { fontSize: 8, color: "#6c757d", italics: true },
|
|
274
|
+
warningHeader: { fontSize: 10, bold: true, color: "#d97706" },
|
|
275
|
+
warningText: { fontSize: 10, color: "#d97706", lineHeight: 1.4 },
|
|
276
|
+
},
|
|
277
|
+
defaultStyle: { font: "Helvetica" },
|
|
278
|
+
};
|
|
279
|
+
return docDef;
|
|
280
|
+
}
|
|
281
|
+
// ── Private helpers ─────────────────────────────────────────────────────────
|
|
282
|
+
formatAddress(addr, fallback) {
|
|
283
|
+
if (!addr)
|
|
284
|
+
return fallback;
|
|
285
|
+
const lines = [
|
|
286
|
+
`${addr.first_name ?? ''} ${addr.last_name ?? ''}`.trim(),
|
|
287
|
+
addr.address_1 ?? '',
|
|
288
|
+
addr.address_2 ?? '',
|
|
289
|
+
[addr.city, addr.province, addr.postal_code].filter(Boolean).join(", "),
|
|
290
|
+
addr.country_code?.toUpperCase() ?? '',
|
|
291
|
+
addr.phone ?? '',
|
|
292
|
+
];
|
|
293
|
+
return lines.filter(Boolean).join("\n");
|
|
294
|
+
}
|
|
295
|
+
async buildFromHtml(htmlTemplate, input, config) {
|
|
296
|
+
const { order, items } = input;
|
|
297
|
+
const currency = order.currency_code ?? "USD";
|
|
298
|
+
const invoiceId = `INV-${input.invoiceDisplayId.toString().padStart(6, "0")}`;
|
|
299
|
+
const logoBase64 = config.company_logo
|
|
300
|
+
? await this.imageUrlToBase64(config.company_logo)
|
|
301
|
+
: "";
|
|
302
|
+
const isHomeDelivery = order.shipping_methods?.some(sm => sm.shipping_option_id === (process.env.HOME_DELIVERY_OPTION_ID || "so_01KAT339XAY8G622P8PSGW7BAZ"));
|
|
303
|
+
const extractCedula = (addr, metadata) => {
|
|
304
|
+
const val = addr?.metadata?.cedula ?? metadata?.cedula;
|
|
305
|
+
return val ? String(val) : "";
|
|
306
|
+
};
|
|
307
|
+
const data = {
|
|
308
|
+
company_name: config.company_name ?? "",
|
|
309
|
+
company_ruc: config.company_ruc ?? "",
|
|
310
|
+
company_address: config.company_address ?? "",
|
|
311
|
+
company_phone: config.company_phone ?? "",
|
|
312
|
+
company_email: config.company_email ?? "",
|
|
313
|
+
company_logo_base64: logoBase64,
|
|
314
|
+
invoice_id: invoiceId,
|
|
315
|
+
invoice_date: new Date(input.created_at).toLocaleDateString("es-ES"),
|
|
316
|
+
order_display_id: String(order.display_id).padStart(6, "0"),
|
|
317
|
+
order_date: new Date(order.created_at).toLocaleDateString("es-ES"),
|
|
318
|
+
billing_address: this.formatAddress(order.billing_address, "Sin dirección de facturación"),
|
|
319
|
+
shipping_address: this.formatAddress(order.shipping_address, "Sin dirección de envío"),
|
|
320
|
+
cedula: extractCedula(order.billing_address, order.metadata) || extractCedula(order.shipping_address, order.metadata),
|
|
321
|
+
items: items.map(raw => {
|
|
322
|
+
const variantTitle = isEnrichedLineItem(raw) ? raw.variant_title : (raw.variant?.title ?? "");
|
|
323
|
+
const showVariant = variantTitle.length > 0 && variantTitle !== "Default Variant";
|
|
324
|
+
return {
|
|
325
|
+
title: raw.title ?? "Artículo desconocido",
|
|
326
|
+
variant_title: showVariant ? variantTitle : "",
|
|
327
|
+
quantity: String(raw.quantity),
|
|
328
|
+
unit_price: this.formatAmount(raw.unit_price, currency),
|
|
329
|
+
total: this.formatAmount(Number(raw.subtotal ?? 0), currency),
|
|
330
|
+
};
|
|
331
|
+
}),
|
|
332
|
+
subtotal: this.formatAmount(Number(order.subtotal ?? 0), currency),
|
|
333
|
+
tax_total: this.formatAmount(Number(order.tax_total ?? 0), currency),
|
|
334
|
+
shipping_total: !isHomeDelivery && order.shipping_methods?.[0]
|
|
335
|
+
? this.formatAmount(Number(order.shipping_methods[0].amount ?? 0), currency)
|
|
336
|
+
: "",
|
|
337
|
+
discount_total: order.discount_total
|
|
338
|
+
? this.formatAmount(Number(order.discount_total), currency)
|
|
339
|
+
: "",
|
|
340
|
+
total: this.formatAmount(Number(order.total ?? 0), currency),
|
|
341
|
+
is_home_delivery: isHomeDelivery,
|
|
342
|
+
notes: config.notes ?? "",
|
|
343
|
+
};
|
|
344
|
+
return this.renderHtmlTemplate(htmlTemplate, data);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
exports.OrderInvoiceStrategy = OrderInvoiceStrategy;
|
|
348
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItaW52b2ljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ludm9pY2UtZ2VuZXJhdG9yL3RlbXBsYXRlcy9vcmRlci1pbnZvaWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHlDQUFpRDtBQTREakQsaUZBQWlGO0FBRWpGOzs7O0dBSUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLElBQXFCO0lBQzdDLE9BQU8sT0FBUSxJQUFvQyxDQUFDLGFBQWEsS0FBSyxRQUFRLENBQUE7QUFDbEYsQ0FBQztBQUVELGlGQUFpRjtBQUVqRixNQUFNLFdBQVcsR0FBc0I7SUFDbkMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzVELFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUNwQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRztJQUN2RCxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRztJQUNyQixVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDcEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7SUFDbkUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7SUFDM0IsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDcEIsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDckIs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QUssRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUNyRCxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFDN0QsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUU7Z0JBQ2hFLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7Z0JBQ2pGLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFDM0MsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7Z0JBQzFELFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUMxRCxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUM3RSxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtnQkFDL0QsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7Z0JBQ2hFLGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVB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
|