@codemind.ec/medusa-plugin-invoice 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/.medusa/server/src/admin/index.js +1 -1
  2. package/.medusa/server/src/admin/index.mjs +1 -1
  3. package/.medusa/server/src/api/admin/invoice-config/route.js +26 -0
  4. package/.medusa/server/src/api/admin/invoice-templates/[id]/preview/route.js +119 -0
  5. package/.medusa/server/src/api/admin/invoice-templates/[id]/restore/route.js +21 -0
  6. package/.medusa/server/src/api/admin/invoice-templates/[id]/route.js +31 -0
  7. package/.medusa/server/src/api/admin/invoice-templates/route.js +20 -0
  8. package/.medusa/server/src/api/admin/invoice-templates/validators.js +18 -0
  9. package/.medusa/server/src/api/middlewares.js +36 -0
  10. package/.medusa/server/src/index.js +16 -1
  11. package/.medusa/server/src/modules/invoice-generator/errors.js +30 -0
  12. package/.medusa/server/src/modules/invoice-generator/index.js +15 -0
  13. package/.medusa/server/src/modules/invoice-generator/loaders/create-default-config.js +45 -0
  14. package/.medusa/server/src/modules/invoice-generator/migrations/Migration20250728094738.js +18 -0
  15. package/.medusa/server/src/modules/invoice-generator/migrations/Migration20250728124134.js +14 -0
  16. package/.medusa/server/src/modules/invoice-generator/migrations/Migration20250728151454.js +14 -0
  17. package/.medusa/server/src/modules/invoice-generator/migrations/Migration20260120005559.js +14 -0
  18. package/.medusa/server/src/modules/invoice-generator/migrations/Migration20260216191700.js +14 -0
  19. package/.medusa/server/src/modules/invoice-generator/migrations/Migration20260601120000.js +17 -0
  20. package/.medusa/server/src/modules/invoice-generator/models/invoice-config.js +16 -0
  21. package/.medusa/server/src/modules/invoice-generator/models/invoice-template.js +19 -0
  22. package/.medusa/server/src/modules/invoice-generator/models/invoice.js +17 -0
  23. package/.medusa/server/src/modules/invoice-generator/service.js +84 -0
  24. package/.medusa/server/src/modules/invoice-generator/templates/defaults/index.js +380 -0
  25. package/.medusa/server/src/modules/invoice-generator/templates/order-invoice.js +348 -0
  26. package/.medusa/server/src/modules/invoice-generator/templates/quote-proforma.js +468 -0
  27. package/.medusa/server/src/modules/invoice-generator/templates/strategy.js +110 -0
  28. package/README.md +134 -43
  29. package/index.d.ts +138 -0
  30. 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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