brainloper-ui 15.0.1 → 17.0.0

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 (94) hide show
  1. package/esm2022/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +314 -0
  2. package/esm2022/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +30 -0
  3. package/esm2022/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +23 -0
  4. package/esm2022/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +83 -0
  5. package/esm2022/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +42 -0
  6. package/esm2022/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +183 -0
  7. package/esm2022/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +746 -0
  8. package/esm2022/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +122 -0
  9. package/esm2022/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +205 -0
  10. package/esm2022/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +227 -0
  11. package/esm2022/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +89 -0
  12. package/esm2022/src/app/modules/brainloper-ui/components/report/template-ot/template-ot.component.mjs +86 -0
  13. package/esm2022/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +117 -0
  14. package/esm2022/src/app/modules/directives/carousel-item.directive.mjs +20 -0
  15. package/esm2022/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +6 -0
  16. package/esm2022/src/app/modules/services/crypto.service.mjs +38 -0
  17. package/esm2022/src/app/modules/services/export-data.service.mjs +169 -0
  18. package/esm2022/src/app/modules/services/file-forms.service.mjs +24 -0
  19. package/esm2022/src/app/modules/services/fuel-order-pdf.service.mjs +346 -0
  20. package/esm2022/src/app/modules/services/functions.service.mjs +75 -0
  21. package/esm2022/src/app/modules/services/generate-pdf.service.mjs +93 -0
  22. package/esm2022/src/app/modules/services/http.service.mjs +142 -0
  23. package/esm2022/src/app/modules/services/loading/loading.component.mjs +30 -0
  24. package/esm2022/src/app/modules/services/local-storage.service.mjs +115 -0
  25. package/esm2022/src/app/modules/services/message.service.mjs +202 -0
  26. package/esm2022/src/app/modules/services/purchase-order-pdf.service.mjs +179 -0
  27. package/esm2022/src/app/modules/services/session.service.mjs +43 -0
  28. package/esm2022/src/app/modules/services/work-order-pdf.service.mjs +363 -0
  29. package/{fesm2020 → fesm2022}/brainloper-ui.mjs +541 -443
  30. package/{fesm2020 → fesm2022}/brainloper-ui.mjs.map +1 -1
  31. package/package.json +17 -23
  32. package/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.d.ts +1 -1
  33. package/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.d.ts +1 -1
  34. package/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.d.ts +1 -1
  35. package/src/app/modules/brainloper-ui/components/carousel/carousel.component.d.ts +1 -1
  36. package/src/app/modules/brainloper-ui/components/combos/combos.component.d.ts +1 -1
  37. package/src/app/modules/brainloper-ui/components/data-table/data-table.component.d.ts +1 -1
  38. package/src/app/modules/brainloper-ui/components/file-input/file-input.component.d.ts +1 -1
  39. package/src/app/modules/brainloper-ui/components/filters/filters.component.d.ts +1 -1
  40. package/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.d.ts +1 -1
  41. package/src/app/modules/directives/carousel-item.directive.d.ts +1 -1
  42. package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +0 -306
  43. package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +0 -29
  44. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +0 -23
  45. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +0 -83
  46. package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +0 -40
  47. package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +0 -176
  48. package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +0 -728
  49. package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +0 -118
  50. package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +0 -187
  51. package/esm2020/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +0 -222
  52. package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +0 -84
  53. package/esm2020/src/app/modules/brainloper-ui/components/report/template-ot/template-ot.component.mjs +0 -81
  54. package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +0 -108
  55. package/esm2020/src/app/modules/directives/carousel-item.directive.mjs +0 -18
  56. package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +0 -8
  57. package/esm2020/src/app/modules/services/crypto.service.mjs +0 -37
  58. package/esm2020/src/app/modules/services/export-data.service.mjs +0 -166
  59. package/esm2020/src/app/modules/services/file-forms.service.mjs +0 -24
  60. package/esm2020/src/app/modules/services/fuel-order-pdf.service.mjs +0 -346
  61. package/esm2020/src/app/modules/services/functions.service.mjs +0 -75
  62. package/esm2020/src/app/modules/services/generate-pdf.service.mjs +0 -89
  63. package/esm2020/src/app/modules/services/http.service.mjs +0 -140
  64. package/esm2020/src/app/modules/services/loading/loading.component.mjs +0 -28
  65. package/esm2020/src/app/modules/services/local-storage.service.mjs +0 -115
  66. package/esm2020/src/app/modules/services/message.service.mjs +0 -200
  67. package/esm2020/src/app/modules/services/purchase-order-pdf.service.mjs +0 -178
  68. package/esm2020/src/app/modules/services/session.service.mjs +0 -42
  69. package/esm2020/src/app/modules/services/work-order-pdf.service.mjs +0 -363
  70. package/fesm2015/brainloper-ui.mjs +0 -3914
  71. package/fesm2015/brainloper-ui.mjs.map +0 -1
  72. /package/{esm2020 → esm2022}/brainloper-ui.mjs +0 -0
  73. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
  74. /package/{esm2020 → esm2022}/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.mjs +0 -0
  75. /package/{esm2020 → esm2022}/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.mjs +0 -0
  76. /package/{esm2020 → esm2022}/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.mjs +0 -0
  77. /package/{esm2020 → esm2022}/src/app/modules/interfaces/buttons/button-icon.mjs +0 -0
  78. /package/{esm2020 → esm2022}/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +0 -0
  79. /package/{esm2020 → esm2022}/src/app/modules/interfaces/combos/combos-configuration.mjs +0 -0
  80. /package/{esm2020 → esm2022}/src/app/modules/interfaces/data-table/params.mjs +0 -0
  81. /package/{esm2020 → esm2022}/src/app/modules/interfaces/data-table/rules.mjs +0 -0
  82. /package/{esm2020 → esm2022}/src/app/modules/interfaces/data-table/table-columns.mjs +0 -0
  83. /package/{esm2020 → esm2022}/src/app/modules/interfaces/data-table/table-configuration.mjs +0 -0
  84. /package/{esm2020 → esm2022}/src/app/modules/interfaces/enum/enumActions.mjs +0 -0
  85. /package/{esm2020 → esm2022}/src/app/modules/interfaces/enum/enumRules.mjs +0 -0
  86. /package/{esm2020 → esm2022}/src/app/modules/interfaces/enum/httpResponseType.mjs +0 -0
  87. /package/{esm2020 → esm2022}/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +0 -0
  88. /package/{esm2020 → esm2022}/src/app/modules/interfaces/file-forms-service/file-input-params.mjs +0 -0
  89. /package/{esm2020 → esm2022}/src/app/modules/interfaces/filters/header-filters.mjs +0 -0
  90. /package/{esm2020 → esm2022}/src/app/modules/interfaces/report/template-pdf-base.mjs +0 -0
  91. /package/{esm2020 → esm2022}/src/app/modules/interfaces/report/template-pdf-ot.mjs +0 -0
  92. /package/{esm2020 → esm2022}/src/app/modules/interfaces/report/template-pdf-purchase-order.mjs +0 -0
  93. /package/{esm2020 → esm2022}/src/app/modules/interfaces/report/template-pfd-fo.mjs +0 -0
  94. /package/{esm2020 → esm2022}/src/app/modules/services/screen-size-util.mjs +0 -0
@@ -0,0 +1,363 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { jsPDF } from 'jspdf';
3
+ import 'jspdf-autotable';
4
+ import * as i0 from "@angular/core";
5
+ // export interface TemplatePdfOt {
6
+ // name?: string;
7
+ // nit?: string;
8
+ // address?: string;
9
+ // telephone?: string;
10
+ // mail?: string;
11
+ // image?: string;
12
+ // code?: string;
13
+ // date?: string;
14
+ // responsible?: string;
15
+ // third?: string;
16
+ // approved_by?: string;
17
+ // description?: string;
18
+ // consecutive?: string;
19
+ // nameProvider?: string;
20
+ // addressProvider?: string;
21
+ // area?: string;
22
+ // odometer?: string;
23
+ // invoiceReference?: string;
24
+ // }
25
+ export class WorkOrderPdfService {
26
+ constructor() { }
27
+ generateWorkOrderPDF(data, options) {
28
+ return new Promise((resolve, reject) => {
29
+ try {
30
+ const opts = {
31
+ format: 'letter',
32
+ download: true,
33
+ filename: 'orden_trabajo.pdf',
34
+ ...options
35
+ };
36
+ const doc = new jsPDF('p', 'pt', opts.format);
37
+ const pageWidth = doc.internal.pageSize.getWidth();
38
+ const pageHeight = doc.internal.pageSize.getHeight();
39
+ const margin = 40;
40
+ let currentY = margin;
41
+ // Colores corporativos
42
+ const primaryColor = [52, 152, 219]; // Azul para órdenes de trabajo
43
+ const secondaryColor = [44, 62, 80]; // Gris oscuro
44
+ const accentColor = [155, 89, 182]; // Morado
45
+ // === ENCABEZADO PRINCIPAL ===
46
+ this.addHeader(doc, data, margin, currentY, pageWidth, primaryColor);
47
+ currentY = 140;
48
+ // === TÍTULO DEL DOCUMENTO ===
49
+ currentY = this.addDocumentTitle(doc, data, currentY, pageWidth, accentColor);
50
+ currentY += 25;
51
+ // === INFORMACIÓN PRINCIPAL ===
52
+ currentY = this.addMainInfo(doc, data, currentY, margin, pageWidth);
53
+ currentY += 20;
54
+ // === DATOS DEL PROVEEDOR ===
55
+ currentY = this.addProviderInfo(doc, data, currentY, margin, pageWidth, secondaryColor);
56
+ currentY += 20;
57
+ // === DETALLES DEL SERVICIO ===
58
+ currentY = this.addServiceDetails(doc, data, currentY, margin, pageWidth, secondaryColor);
59
+ currentY += 20;
60
+ // === AUTORIZACIÓN ===
61
+ currentY = this.addAuthorization(doc, data, currentY, margin, pageWidth);
62
+ currentY += 30;
63
+ // === PIE DE PÁGINA ===
64
+ this.addFooter(doc, data, pageHeight - 80, pageWidth, primaryColor);
65
+ // === GENERAR/DESCARGAR ===
66
+ if (opts.download) {
67
+ doc.output('dataurlnewwindow', { filename: opts.filename });
68
+ }
69
+ resolve(doc);
70
+ }
71
+ catch (error) {
72
+ reject(error);
73
+ }
74
+ });
75
+ }
76
+ /**
77
+ * Genera PDF optimizado para impresión
78
+ */
79
+ generateForPrint(data) {
80
+ return this.generateWorkOrderPDF(data, {
81
+ format: 'letter',
82
+ download: false
83
+ });
84
+ }
85
+ /**
86
+ * Genera PDF y lo devuelve como Blob para envío por email
87
+ */
88
+ generateAsBlob(data) {
89
+ return new Promise((resolve, reject) => {
90
+ this.generateWorkOrderPDF(data, { download: false })
91
+ .then(doc => {
92
+ const pdfBlob = doc.output('blob');
93
+ resolve(pdfBlob);
94
+ })
95
+ .catch(reject);
96
+ });
97
+ }
98
+ /**
99
+ * Genera PDF y lo devuelve como base64
100
+ */
101
+ generateAsBase64(data) {
102
+ return new Promise((resolve, reject) => {
103
+ this.generateWorkOrderPDF(data, { download: false })
104
+ .then(doc => {
105
+ const base64 = doc.output('datauristring');
106
+ resolve(base64);
107
+ })
108
+ .catch(reject);
109
+ });
110
+ }
111
+ addHeader(doc, data, margin, y, pageWidth, color) {
112
+ // Fondo del encabezado
113
+ doc.setFillColor(color[0], color[1], color[2]);
114
+ doc.rect(margin, y, pageWidth - (margin * 2), 80, 'F');
115
+ // Texto del encabezado en blanco
116
+ doc.setTextColor(255, 255, 255);
117
+ doc.setFont('helvetica', 'bold');
118
+ doc.setFontSize(18);
119
+ const companyName = (data.name || '').toUpperCase();
120
+ const nameWidth = doc.getTextWidth(companyName);
121
+ doc.text(companyName, (pageWidth - nameWidth) / 2, y + 25);
122
+ doc.setFontSize(12);
123
+ const nitText = `NIT: ${data.nit || ''}`;
124
+ const nitWidth = doc.getTextWidth(nitText);
125
+ doc.text(nitText, (pageWidth - nitWidth) / 2, y + 45);
126
+ doc.setFontSize(10);
127
+ const addressText = `${data.address || ''} - TEL: ${data.telephone || ''}`;
128
+ const addressWidth = doc.getTextWidth(addressText);
129
+ doc.text(addressText, (pageWidth - addressWidth) / 2, y + 65);
130
+ // Resetear color de texto
131
+ doc.setTextColor(0, 0, 0);
132
+ }
133
+ addDocumentTitle(doc, data, y, pageWidth, color) {
134
+ doc.setTextColor(color[0], color[1], color[2]);
135
+ doc.setFont('helvetica', 'bold');
136
+ doc.setFontSize(20);
137
+ const title = 'ORDEN DE TRABAJO';
138
+ const titleWidth = doc.getTextWidth(title);
139
+ doc.text(title, (pageWidth - titleWidth) / 2, y);
140
+ doc.setFontSize(16);
141
+ const numberText = `N° ${data.consecutive || ''}`;
142
+ const numberWidth = doc.getTextWidth(numberText);
143
+ doc.text(numberText, (pageWidth - numberWidth) / 2, y + 25);
144
+ doc.setTextColor(0, 0, 0);
145
+ return y + 40;
146
+ }
147
+ addMainInfo(doc, data, y, margin, pageWidth) {
148
+ const tableData = [
149
+ [
150
+ { content: 'Área:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
151
+ { content: data.area || '', styles: {} },
152
+ { content: 'Código:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
153
+ { content: data.code || '', styles: {} },
154
+ { content: 'Fecha:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
155
+ { content: data.date || '', styles: {} }
156
+ ],
157
+ [
158
+ { content: 'Operario:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
159
+ { content: data.responsible || '', styles: {} },
160
+ { content: 'Odómetro:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
161
+ { content: data.odometer || '', styles: {} },
162
+ { content: 'Ref. Factura:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
163
+ { content: data.invoiceReference || '-', styles: {} }
164
+ ]
165
+ ];
166
+ doc.autoTable({
167
+ startY: y,
168
+ body: tableData,
169
+ theme: 'grid',
170
+ styles: {
171
+ fontSize: 11,
172
+ cellPadding: 8,
173
+ lineColor: [200, 200, 200],
174
+ lineWidth: 0.5
175
+ },
176
+ columnStyles: {
177
+ 0: { cellWidth: 70 },
178
+ 1: { cellWidth: 100 },
179
+ 2: { cellWidth: 70 },
180
+ 3: { cellWidth: 80 },
181
+ 4: { cellWidth: 70 },
182
+ 5: { cellWidth: 80 }
183
+ },
184
+ margin: { left: margin, right: margin }
185
+ });
186
+ return doc.lastAutoTable.finalY;
187
+ }
188
+ addProviderInfo(doc, data, y, margin, pageWidth, color) {
189
+ // Título de sección
190
+ doc.setTextColor(color[0], color[1], color[2]);
191
+ doc.setFont('helvetica', 'bold');
192
+ doc.setFontSize(14);
193
+ const title = 'DATOS DEL PROVEEDOR';
194
+ const titleWidth = doc.getTextWidth(title);
195
+ doc.text(title, (pageWidth - titleWidth) / 2, y);
196
+ doc.setTextColor(0, 0, 0);
197
+ const tableData = [
198
+ [
199
+ { content: 'Nombre:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
200
+ { content: data.nameProvider || '', styles: {} },
201
+ { content: 'Dirección:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
202
+ { content: data.addressProvider || '', styles: {} }
203
+ ]
204
+ ];
205
+ doc.autoTable({
206
+ startY: y + 20,
207
+ body: tableData,
208
+ theme: 'grid',
209
+ styles: {
210
+ fontSize: 11,
211
+ cellPadding: 8,
212
+ lineColor: [200, 200, 200],
213
+ lineWidth: 0.5
214
+ },
215
+ columnStyles: {
216
+ 0: { cellWidth: 80 },
217
+ 1: { cellWidth: 160 },
218
+ 2: { cellWidth: 80 },
219
+ 3: { cellWidth: 150 }
220
+ },
221
+ margin: { left: margin, right: margin }
222
+ });
223
+ return doc.lastAutoTable.finalY;
224
+ }
225
+ addServiceDetails(doc, data, y, margin, pageWidth, color) {
226
+ // Título de sección
227
+ doc.setTextColor(color[0], color[1], color[2]);
228
+ doc.setFont('helvetica', 'bold');
229
+ doc.setFontSize(14);
230
+ const title = 'DETALLES DEL SERVICIO';
231
+ const titleWidth = doc.getTextWidth(title);
232
+ doc.text(title, (pageWidth - titleWidth) / 2, y);
233
+ doc.setTextColor(0, 0, 0);
234
+ // Preparar texto para calcular altura necesaria
235
+ const boxY = y + 20;
236
+ const boxWidth = pageWidth - (margin * 2);
237
+ const textMargin = margin + 15;
238
+ const maxWidth = boxWidth - 30;
239
+ const lineHeight = 15;
240
+ const minBoxHeight = 60; // Altura mínima del contenedor
241
+ const padding = 40; // Padding superior e inferior (20 arriba + 20 abajo)
242
+ // Calcular líneas de texto necesarias
243
+ doc.setFont('helvetica', 'normal');
244
+ doc.setFontSize(11);
245
+ let totalLines = 0;
246
+ let currentTextY = 20; // Posición relativa dentro del box
247
+ if (data.description && data.description.trim()) {
248
+ const descLines = doc.splitTextToSize(data.description.trim(), maxWidth);
249
+ totalLines += descLines.length;
250
+ }
251
+ // Calcular altura necesaria basada en el contenido
252
+ const contentHeight = Math.max(totalLines * lineHeight, 30); // Mínimo 30pt para contenido
253
+ const boxHeight = Math.max(minBoxHeight, contentHeight + padding);
254
+ // Verificar si necesitamos una nueva página
255
+ const pageHeight = doc.internal.pageSize.getHeight();
256
+ const remainingSpace = pageHeight - boxY - 100; // Dejar espacio para footer
257
+ let finalBoxY = boxY;
258
+ if (boxHeight > remainingSpace) {
259
+ // Añadir nueva página
260
+ doc.addPage();
261
+ finalBoxY = margin + 40; // Posición en nueva página
262
+ }
263
+ // Dibujar contenedor con altura dinámica
264
+ // Fondo gris claro
265
+ doc.setFillColor(250, 250, 250);
266
+ doc.rect(margin, finalBoxY, boxWidth, boxHeight, 'F');
267
+ // Borde
268
+ doc.setDrawColor(200, 200, 200);
269
+ doc.rect(margin, finalBoxY, boxWidth, boxHeight, 'S');
270
+ // Añadir contenido de texto
271
+ let textY = finalBoxY + 20;
272
+ if (data.description && data.description.trim()) {
273
+ const descLines = doc.splitTextToSize(data.description.trim(), maxWidth);
274
+ // Si hay muchas líneas, verificar que quepan en la página actual
275
+ const requiredHeight = descLines.length * lineHeight + 40;
276
+ if (textY + requiredHeight > pageHeight - 60) {
277
+ // El contenido es muy largo, dividir si es necesario
278
+ const maxLinesPerPage = Math.floor((pageHeight - textY - 60) / lineHeight);
279
+ if (descLines.length > maxLinesPerPage && maxLinesPerPage > 0) {
280
+ // Mostrar líneas que caben en la página actual
281
+ const currentPageLines = descLines.slice(0, maxLinesPerPage);
282
+ doc.text(currentPageLines, textMargin, textY);
283
+ // Continuar en nueva página si hay más contenido
284
+ if (descLines.length > maxLinesPerPage) {
285
+ doc.addPage();
286
+ textY = margin + 20;
287
+ const remainingLines = descLines.slice(maxLinesPerPage);
288
+ doc.text(remainingLines, textMargin, textY);
289
+ return textY + (remainingLines.length * lineHeight) + 20;
290
+ }
291
+ }
292
+ else {
293
+ doc.text(descLines, textMargin, textY);
294
+ }
295
+ }
296
+ else {
297
+ doc.text(descLines, textMargin, textY);
298
+ }
299
+ textY += descLines.length * lineHeight;
300
+ }
301
+ // Si no hay descripción, mostrar un mensaje
302
+ if (!data.description || !data.description.trim()) {
303
+ doc.setFont('helvetica', 'italic');
304
+ doc.setFontSize(10);
305
+ doc.setTextColor(150, 150, 150);
306
+ doc.text('No se han especificado detalles del servicio.', textMargin, textY);
307
+ doc.setTextColor(0, 0, 0);
308
+ doc.setFont('helvetica', 'normal');
309
+ doc.setFontSize(11);
310
+ }
311
+ return finalBoxY + boxHeight;
312
+ }
313
+ addAuthorization(doc, data, y, margin, pageWidth) {
314
+ const tableData = [
315
+ [
316
+ { content: 'AUTORIZADA POR:', styles: { fontStyle: 'bold', fontSize: 12, fillColor: [240, 240, 240] } },
317
+ { content: data.approved_by || '', styles: { fontSize: 12 } }
318
+ ]
319
+ ];
320
+ doc.autoTable({
321
+ startY: y,
322
+ body: tableData,
323
+ theme: 'grid',
324
+ styles: {
325
+ cellPadding: 12,
326
+ lineColor: [200, 200, 200],
327
+ lineWidth: 0.5
328
+ },
329
+ columnStyles: {
330
+ 0: { cellWidth: 150 },
331
+ 1: { cellWidth: 320 }
332
+ },
333
+ margin: { left: margin, right: margin }
334
+ });
335
+ return doc.lastAutoTable.finalY;
336
+ }
337
+ addFooter(doc, data, y, pageWidth, color) {
338
+ // Fondo del pie de página
339
+ doc.setFillColor(color[0], color[1], color[2]);
340
+ doc.rect(40, y, pageWidth - 80, 60, 'F');
341
+ // Texto en blanco
342
+ doc.setTextColor(255, 255, 255);
343
+ doc.setFont('helvetica', 'bold');
344
+ doc.setFontSize(12);
345
+ const instruction = 'Favor adjuntar la orden a la factura o cuenta de cobro';
346
+ const instWidth = doc.getTextWidth(instruction);
347
+ doc.text(instruction, (pageWidth - instWidth) / 2, y + 25);
348
+ doc.setFontSize(10);
349
+ const emailWidth = doc.getTextWidth(data.mail || '');
350
+ doc.text(data.mail || '', (pageWidth - emailWidth) / 2, y + 45);
351
+ // Resetear color
352
+ doc.setTextColor(0, 0, 0);
353
+ }
354
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkOrderPdfService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
355
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkOrderPdfService, providedIn: 'root' });
356
+ }
357
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkOrderPdfService, decorators: [{
358
+ type: Injectable,
359
+ args: [{
360
+ providedIn: 'root'
361
+ }]
362
+ }], ctorParameters: () => [] });
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1vcmRlci1wZGYuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zZXJ2aWNlcy93b3JrLW9yZGVyLXBkZi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLGlCQUFpQixDQUFDOztBQUd6QixtQ0FBbUM7QUFDbkMsbUJBQW1CO0FBQ25CLGtCQUFrQjtBQUNsQixzQkFBc0I7QUFDdEIsd0JBQXdCO0FBQ3hCLG1CQUFtQjtBQUNuQixvQkFBb0I7QUFDcEIsbUJBQW1CO0FBQ25CLG1CQUFtQjtBQUNuQiwwQkFBMEI7QUFDMUIsb0JBQW9CO0FBQ3BCLDBCQUEwQjtBQUMxQiwwQkFBMEI7QUFDMUIsMEJBQTBCO0FBQzFCLDJCQUEyQjtBQUMzQiw4QkFBOEI7QUFDOUIsbUJBQW1CO0FBQ25CLHVCQUF1QjtBQUN2QiwrQkFBK0I7QUFDL0IsSUFBSTtBQUtKLE1BQU0sT0FBTyxtQkFBbUI7SUFFOUIsZ0JBQWdCLENBQUM7SUFFakIsb0JBQW9CLENBQUMsSUFBbUIsRUFBRSxPQUl6QztRQUNDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxHQUFHO29CQUNYLE1BQU0sRUFBRSxRQUFRO29CQUNoQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixHQUFHLE9BQU87aUJBQ1gsQ0FBQztnQkFFRixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxTQUFTLEdBQUcsR0FB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Q0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQzt3R0FwWVUsbUJBQW1COzRHQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs7NEZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGpzUERGIH0gZnJvbSAnanNwZGYnO1xuaW1wb3J0ICdqc3BkZi1hdXRvdGFibGUnO1xuaW1wb3J0IHsgVGVtcGxhdGVQZGZPdCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0L3RlbXBsYXRlLXBkZi1vdCc7XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVQZGZPdCB7XG4vLyAgIG5hbWU/OiBzdHJpbmc7XG4vLyAgIG5pdD86IHN0cmluZztcbi8vICAgYWRkcmVzcz86IHN0cmluZztcbi8vICAgdGVsZXBob25lPzogc3RyaW5nO1xuLy8gICBtYWlsPzogc3RyaW5nO1xuLy8gICBpbWFnZT86IHN0cmluZztcbi8vICAgY29kZT86IHN0cmluZztcbi8vICAgZGF0ZT86IHN0cmluZztcbi8vICAgcmVzcG9uc2libGU/OiBzdHJpbmc7XG4vLyAgIHRoaXJkPzogc3RyaW5nO1xuLy8gICBhcHByb3ZlZF9ieT86IHN0cmluZztcbi8vICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4vLyAgIGNvbnNlY3V0aXZlPzogc3RyaW5nO1xuLy8gICBuYW1lUHJvdmlkZXI/OiBzdHJpbmc7XG4vLyAgIGFkZHJlc3NQcm92aWRlcj86IHN0cmluZztcbi8vICAgYXJlYT86IHN0cmluZztcbi8vICAgb2RvbWV0ZXI/OiBzdHJpbmc7XG4vLyAgIGludm9pY2VSZWZlcmVuY2U/OiBzdHJpbmc7XG4vLyB9XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFdvcmtPcmRlclBkZlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgZ2VuZXJhdGVXb3JrT3JkZXJQREYoZGF0YTogVGVtcGxhdGVQZGZPdCwgb3B0aW9ucz86IHtcbiAgICBmb3JtYXQ/OiAnbGV0dGVyJyB8ICdhNCc7XG4gICAgZG93bmxvYWQ/OiBib29sZWFuO1xuICAgIGZpbGVuYW1lPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxqc1BERj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICAgIGZvcm1hdDogJ2xldHRlcicsXG4gICAgICAgICAgZG93bmxvYWQ6IHRydWUsXG4gICAgICAgICAgZmlsZW5hbWU6ICdvcmRlbl90cmFiYWpvLnBkZicsXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRvYyA9IG5ldyBqc1BERigncCcsICdwdCcsIG9wdHMuZm9ybWF0KTtcbiAgICAgICAgY29uc3QgcGFnZVdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IG1hcmdpbiA9IDQwO1xuICAgICAgICBsZXQgY3VycmVudFkgPSBtYXJnaW47XG5cbiAgICAgICAgLy8gQ29sb3JlcyBjb3Jwb3JhdGl2b3NcbiAgICAgICAgY29uc3QgcHJpbWFyeUNvbG9yID0gWzUyLCAxNTIsIDIxOV07IC8vIEF6dWwgcGFyYSDDs3JkZW5lcyBkZSB0cmFiYWpvXG4gICAgICAgIGNvbnN0IHNlY29uZGFyeUNvbG9yID0gWzQ0LCA2MiwgODBdOyAvLyBHcmlzIG9zY3Vyb1xuICAgICAgICBjb25zdCBhY2NlbnRDb2xvciA9IFsxNTUsIDg5LCAxODJdOyAvLyBNb3JhZG9cblxuICAgICAgICAvLyA9PT0gRU5DQUJFWkFETyBQUklOQ0lQQUwgPT09XG4gICAgICAgIHRoaXMuYWRkSGVhZGVyKGRvYywgZGF0YSwgbWFyZ2luLCBjdXJyZW50WSwgcGFnZVdpZHRoLCBwcmltYXJ5Q29sb3IpO1xuICAgICAgICBjdXJyZW50WSA9IDE0MDtcblxuICAgICAgICAvLyA9PT0gVMONVFVMTyBERUwgRE9DVU1FTlRPID09PVxuICAgICAgICBjdXJyZW50WSA9IHRoaXMuYWRkRG9jdW1lbnRUaXRsZShkb2MsIGRhdGEsIGN1cnJlbnRZLCBwYWdlV2lkdGgsIGFjY2VudENvbG9yKTtcbiAgICAgICAgY3VycmVudFkgKz0gMjU7XG5cbiAgICAgICAgLy8gPT09IElORk9STUFDScOTTiBQUklOQ0lQQUwgPT09XG4gICAgICAgIGN1cnJlbnRZID0gdGhpcy5hZGRNYWluSW5mbyhkb2MsIGRhdGEsIGN1cnJlbnRZLCBtYXJnaW4sIHBhZ2VXaWR0aCk7XG4gICAgICAgIGN1cnJlbnRZICs9IDIwO1xuXG4gICAgICAgIC8vID09PSBEQVRPUyBERUwgUFJPVkVFRE9SID09PVxuICAgICAgICBjdXJyZW50WSA9IHRoaXMuYWRkUHJvdmlkZXJJbmZvKGRvYywgZGF0YSwgY3VycmVudFksIG1hcmdpbiwgcGFnZVdpZHRoLCBzZWNvbmRhcnlDb2xvcik7XG4gICAgICAgIGN1cnJlbnRZICs9IDIwO1xuXG4gICAgICAgIC8vID09PSBERVRBTExFUyBERUwgU0VSVklDSU8gPT09XG4gICAgICAgIGN1cnJlbnRZID0gdGhpcy5hZGRTZXJ2aWNlRGV0YWlscyhkb2MsIGRhdGEsIGN1cnJlbnRZLCBtYXJnaW4sIHBhZ2VXaWR0aCwgc2Vjb25kYXJ5Q29sb3IpO1xuICAgICAgICBjdXJyZW50WSArPSAyMDtcblxuICAgICAgICAvLyA9PT0gQVVUT1JJWkFDScOTTiA9PT1cbiAgICAgICAgY3VycmVudFkgPSB0aGlzLmFkZEF1dGhvcml6YXRpb24oZG9jLCBkYXRhLCBjdXJyZW50WSwgbWFyZ2luLCBwYWdlV2lkdGgpO1xuICAgICAgICBjdXJyZW50WSArPSAzMDtcblxuICAgICAgICAvLyA9PT0gUElFIERFIFDDgUdJTkEgPT09XG4gICAgICAgIHRoaXMuYWRkRm9vdGVyKGRvYywgZGF0YSwgcGFnZUhlaWdodCAtIDgwLCBwYWdlV2lkdGgsIHByaW1hcnlDb2xvcik7XG5cbiAgICAgICAgLy8gPT09IEdFTkVSQVIvREVTQ0FSR0FSID09PVxuICAgICAgICBpZiAob3B0cy5kb3dubG9hZCkge1xuICAgICAgICAgIGRvYy5vdXRwdXQoJ2RhdGF1cmxuZXd3aW5kb3cnLCB7IGZpbGVuYW1lOiBvcHRzLmZpbGVuYW1lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShkb2MpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICAgLyoqXG4gICAqIEdlbmVyYSBQREYgb3B0aW1pemFkbyBwYXJhIGltcHJlc2nDs25cbiAgICovXG4gIGdlbmVyYXRlRm9yUHJpbnQoZGF0YTogVGVtcGxhdGVQZGZPdCk6IFByb21pc2U8anNQREY+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVdvcmtPcmRlclBERihkYXRhLCB7XG4gICAgICBmb3JtYXQ6ICdsZXR0ZXInLFxuICAgICAgZG93bmxvYWQ6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhIFBERiB5IGxvIGRldnVlbHZlIGNvbW8gQmxvYiBwYXJhIGVudsOtbyBwb3IgZW1haWxcbiAgICovXG4gIGdlbmVyYXRlQXNCbG9iKGRhdGE6IFRlbXBsYXRlUGRmT3QpOiBQcm9taXNlPEJsb2I+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5nZW5lcmF0ZVdvcmtPcmRlclBERihkYXRhLCB7IGRvd25sb2FkOiBmYWxzZSB9KVxuICAgICAgICAudGhlbihkb2MgPT4ge1xuICAgICAgICAgIGNvbnN0IHBkZkJsb2IgPSBkb2Mub3V0cHV0KCdibG9iJyk7XG4gICAgICAgICAgcmVzb2x2ZShwZGZCbG9iKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhIFBERiB5IGxvIGRldnVlbHZlIGNvbW8gYmFzZTY0XG4gICAqL1xuICBnZW5lcmF0ZUFzQmFzZTY0KGRhdGE6IFRlbXBsYXRlUGRmT3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdlbmVyYXRlV29ya09yZGVyUERGKGRhdGEsIHsgZG93bmxvYWQ6IGZhbHNlIH0pXG4gICAgICAgIC50aGVuKGRvYyA9PiB7XG4gICAgICAgICAgY29uc3QgYmFzZTY0ID0gZG9jLm91dHB1dCgnZGF0YXVyaXN0cmluZycpO1xuICAgICAgICAgIHJlc29sdmUoYmFzZTY0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEhlYWRlcihkb2M6IGpzUERGLCBkYXRhOiBUZW1wbGF0ZVBkZk90LCBtYXJnaW46IG51bWJlciwgeTogbnVtYmVyLCBwYWdlV2lkdGg6IG51bWJlciwgY29sb3I6IG51bWJlcltdKTogdm9pZCB7XG4gICAgLy8gRm9uZG8gZGVsIGVuY2FiZXphZG9cbiAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgIGRvYy5yZWN0KG1hcmdpbiwgeSwgcGFnZVdpZHRoIC0gKG1hcmdpbiAqIDIpLCA4MCwgJ0YnKTtcblxuICAgIC8vIFRleHRvIGRlbCBlbmNhYmV6YWRvIGVuIGJsYW5jb1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoMjU1LCAyNTUsIDI1NSk7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDE4KTtcbiAgICBcbiAgICBjb25zdCBjb21wYW55TmFtZSA9IChkYXRhLm5hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgbmFtZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChjb21wYW55TmFtZSk7XG4gICAgZG9jLnRleHQoY29tcGFueU5hbWUsIChwYWdlV2lkdGggLSBuYW1lV2lkdGgpIC8gMiwgeSArIDI1KTtcblxuICAgIGRvYy5zZXRGb250U2l6ZSgxMik7XG4gICAgY29uc3Qgbml0VGV4dCA9IGBOSVQ6ICR7ZGF0YS5uaXQgfHwgJyd9YDtcbiAgICBjb25zdCBuaXRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgobml0VGV4dCk7XG4gICAgZG9jLnRleHQobml0VGV4dCwgKHBhZ2VXaWR0aCAtIG5pdFdpZHRoKSAvIDIsIHkgKyA0NSk7XG5cbiAgICBkb2Muc2V0Rm9udFNpemUoMTApO1xuICAgIGNvbnN0IGFkZHJlc3NUZXh0ID0gYCR7ZGF0YS5hZGRyZXNzIHx8ICcnfSAtIFRFTDogJHtkYXRhLnRlbGVwaG9uZSB8fCAnJ31gO1xuICAgIGNvbnN0IGFkZHJlc3NXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoYWRkcmVzc1RleHQpO1xuICAgIGRvYy50ZXh0KGFkZHJlc3NUZXh0LCAocGFnZVdpZHRoIC0gYWRkcmVzc1dpZHRoKSAvIDIsIHkgKyA2NSk7XG5cbiAgICAvLyBSZXNldGVhciBjb2xvciBkZSB0ZXh0b1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XG4gIH1cblxuICBwcml2YXRlIGFkZERvY3VtZW50VGl0bGUoZG9jOiBqc1BERiwgZGF0YTogVGVtcGxhdGVQZGZPdCwgeTogbnVtYmVyLCBwYWdlV2lkdGg6IG51bWJlciwgY29sb3I6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyMCk7XG4gICAgXG4gICAgY29uc3QgdGl0bGUgPSAnT1JERU4gREUgVFJBQkFKTyc7XG4gICAgY29uc3QgdGl0bGVXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGl0bGUpO1xuICAgIGRvYy50ZXh0KHRpdGxlLCAocGFnZVdpZHRoIC0gdGl0bGVXaWR0aCkgLyAyLCB5KTtcblxuICAgIGRvYy5zZXRGb250U2l6ZSgxNik7XG4gICAgY29uc3QgbnVtYmVyVGV4dCA9IGBOwrAgJHtkYXRhLmNvbnNlY3V0aXZlIHx8ICcnfWA7XG4gICAgY29uc3QgbnVtYmVyV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKG51bWJlclRleHQpO1xuICAgIGRvYy50ZXh0KG51bWJlclRleHQsIChwYWdlV2lkdGggLSBudW1iZXJXaWR0aCkgLyAyLCB5ICsgMjUpO1xuXG4gICAgZG9jLnNldFRleHRDb2xvcigwLCAwLCAwKTtcbiAgICByZXR1cm4geSArIDQwO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNYWluSW5mbyhkb2M6IGpzUERGLCBkYXRhOiBUZW1wbGF0ZVBkZk90LCB5OiBudW1iZXIsIG1hcmdpbjogbnVtYmVyLCBwYWdlV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gW1xuICAgICAgW1xuICAgICAgICB7IGNvbnRlbnQ6ICfDgXJlYTonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLmFyZWEgfHwgJycsIHN0eWxlczoge30gfSxcbiAgICAgICAgeyBjb250ZW50OiAnQ8OzZGlnbzonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLmNvZGUgfHwgJycsIHN0eWxlczoge30gfSxcbiAgICAgICAgeyBjb250ZW50OiAnRmVjaGE6Jywgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBmaWxsQ29sb3I6IFsyNDAsIDI0MCwgMjQwXSB9IH0sXG4gICAgICAgIHsgY29udGVudDogZGF0YS5kYXRlIHx8ICcnLCBzdHlsZXM6IHt9IH1cbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIHsgY29udGVudDogJ09wZXJhcmlvOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZmlsbENvbG9yOiBbMjQwLCAyNDAsIDI0MF0gfSB9LFxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEucmVzcG9uc2libGUgfHwgJycsIHN0eWxlczoge30gfSxcbiAgICAgICAgeyBjb250ZW50OiAnT2TDs21ldHJvOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZmlsbENvbG9yOiBbMjQwLCAyNDAsIDI0MF0gfSB9LFxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEub2RvbWV0ZXIgfHwgJycsIHN0eWxlczoge30gfSxcbiAgICAgICAgeyBjb250ZW50OiAnUmVmLiBGYWN0dXJhOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZmlsbENvbG9yOiBbMjQwLCAyNDAsIDI0MF0gfSB9LFxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEuaW52b2ljZVJlZmVyZW5jZSB8fCAnLScsIHN0eWxlczoge30gfVxuICAgICAgXVxuICAgIF07XG5cbiAgICAoZG9jIGFzIGFueSkuYXV0b1RhYmxlKHtcbiAgICAgIHN0YXJ0WTogeSxcbiAgICAgIGJvZHk6IHRhYmxlRGF0YSxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFNpemU6IDExLFxuICAgICAgICBjZWxsUGFkZGluZzogOCxcbiAgICAgICAgbGluZUNvbG9yOiBbMjAwLCAyMDAsIDIwMF0sXG4gICAgICAgIGxpbmVXaWR0aDogMC41XG4gICAgICB9LFxuICAgICAgY29sdW1uU3R5bGVzOiB7XG4gICAgICAgIDA6IHsgY2VsbFdpZHRoOiA3MCB9LFxuICAgICAgICAxOiB7IGNlbGxXaWR0aDogMTAwIH0sXG4gICAgICAgIDI6IHsgY2VsbFdpZHRoOiA3MCB9LFxuICAgICAgICAzOiB7IGNlbGxXaWR0aDogODAgfSxcbiAgICAgICAgNDogeyBjZWxsV2lkdGg6IDcwIH0sXG4gICAgICAgIDU6IHsgY2VsbFdpZHRoOiA4MCB9XG4gICAgICB9LFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IG1hcmdpbiwgcmlnaHQ6IG1hcmdpbiB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKGRvYyBhcyBhbnkpLmxhc3RBdXRvVGFibGUuZmluYWxZO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQcm92aWRlckluZm8oZG9jOiBqc1BERiwgZGF0YTogVGVtcGxhdGVQZGZPdCwgeTogbnVtYmVyLCBtYXJnaW46IG51bWJlciwgcGFnZVdpZHRoOiBudW1iZXIsIGNvbG9yOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgLy8gVMOtdHVsbyBkZSBzZWNjacOzblxuICAgIGRvYy5zZXRUZXh0Q29sb3IoY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDE0KTtcbiAgICBjb25zdCB0aXRsZSA9ICdEQVRPUyBERUwgUFJPVkVFRE9SJztcbiAgICBjb25zdCB0aXRsZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0aXRsZSk7XG4gICAgZG9jLnRleHQodGl0bGUsIChwYWdlV2lkdGggLSB0aXRsZVdpZHRoKSAvIDIsIHkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XG5cbiAgICBjb25zdCB0YWJsZURhdGEgPSBbXG4gICAgICBbXG4gICAgICAgIHsgY29udGVudDogJ05vbWJyZTonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLm5hbWVQcm92aWRlciB8fCAnJywgc3R5bGVzOiB7fSB9LFxuICAgICAgICB7IGNvbnRlbnQ6ICdEaXJlY2Npw7NuOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZmlsbENvbG9yOiBbMjQwLCAyNDAsIDI0MF0gfSB9LFxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEuYWRkcmVzc1Byb3ZpZGVyIHx8ICcnLCBzdHlsZXM6IHt9IH1cbiAgICAgIF1cbiAgICBdO1xuXG4gICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XG4gICAgICBzdGFydFk6IHkgKyAyMCxcbiAgICAgIGJvZHk6IHRhYmxlRGF0YSxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFNpemU6IDExLFxuICAgICAgICBjZWxsUGFkZGluZzogOCxcbiAgICAgICAgbGluZUNvbG9yOiBbMjAwLCAyMDAsIDIwMF0sXG4gICAgICAgIGxpbmVXaWR0aDogMC41XG4gICAgICB9LFxuICAgICAgY29sdW1uU3R5bGVzOiB7XG4gICAgICAgIDA6IHsgY2VsbFdpZHRoOiA4MCB9LFxuICAgICAgICAxOiB7IGNlbGxXaWR0aDogMTYwIH0sXG4gICAgICAgIDI6IHsgY2VsbFdpZHRoOiA4MCB9LFxuICAgICAgICAzOiB7IGNlbGxXaWR0aDogMTUwIH1cbiAgICAgIH0sXG4gICAgICBtYXJnaW46IHsgbGVmdDogbWFyZ2luLCByaWdodDogbWFyZ2luIH1cbiAgICB9KTtcblxuICAgIHJldHVybiAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFk7XG4gIH1cblxuICBwcml2YXRlIGFkZFNlcnZpY2VEZXRhaWxzKGRvYzoganNQREYsIGRhdGE6IFRlbXBsYXRlUGRmT3QsIHk6IG51bWJlciwgbWFyZ2luOiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIC8vIFTDrXR1bG8gZGUgc2VjY2nDs25cbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxNCk7XG4gICAgY29uc3QgdGl0bGUgPSAnREVUQUxMRVMgREVMIFNFUlZJQ0lPJztcbiAgICBjb25zdCB0aXRsZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0aXRsZSk7XG4gICAgZG9jLnRleHQodGl0bGUsIChwYWdlV2lkdGggLSB0aXRsZVdpZHRoKSAvIDIsIHkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XG5cbiAgICAvLyBQcmVwYXJhciB0ZXh0byBwYXJhIGNhbGN1bGFyIGFsdHVyYSBuZWNlc2FyaWFcbiAgICBjb25zdCBib3hZID0geSArIDIwO1xuICAgIGNvbnN0IGJveFdpZHRoID0gcGFnZVdpZHRoIC0gKG1hcmdpbiAqIDIpO1xuICAgIGNvbnN0IHRleHRNYXJnaW4gPSBtYXJnaW4gKyAxNTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IGJveFdpZHRoIC0gMzA7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IDE1O1xuICAgIGNvbnN0IG1pbkJveEhlaWdodCA9IDYwOyAvLyBBbHR1cmEgbcOtbmltYSBkZWwgY29udGVuZWRvclxuICAgIGNvbnN0IHBhZGRpbmcgPSA0MDsgLy8gUGFkZGluZyBzdXBlcmlvciBlIGluZmVyaW9yICgyMCBhcnJpYmEgKyAyMCBhYmFqbylcblxuICAgIC8vIENhbGN1bGFyIGzDrW5lYXMgZGUgdGV4dG8gbmVjZXNhcmlhc1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDExKTtcbiAgICBcbiAgICBsZXQgdG90YWxMaW5lcyA9IDA7XG4gICAgbGV0IGN1cnJlbnRUZXh0WSA9IDIwOyAvLyBQb3NpY2nDs24gcmVsYXRpdmEgZGVudHJvIGRlbCBib3hcblxuICAgIGlmIChkYXRhLmRlc2NyaXB0aW9uICYmIGRhdGEuZGVzY3JpcHRpb24udHJpbSgpKSB7XG4gICAgICBjb25zdCBkZXNjTGluZXMgPSBkb2Muc3BsaXRUZXh0VG9TaXplKGRhdGEuZGVzY3JpcHRpb24udHJpbSgpLCBtYXhXaWR0aCk7XG4gICAgICB0b3RhbExpbmVzICs9IGRlc2NMaW5lcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXIgYWx0dXJhIG5lY2VzYXJpYSBiYXNhZGEgZW4gZWwgY29udGVuaWRvXG4gICAgY29uc3QgY29udGVudEhlaWdodCA9IE1hdGgubWF4KHRvdGFsTGluZXMgKiBsaW5lSGVpZ2h0LCAzMCk7IC8vIE3DrW5pbW8gMzBwdCBwYXJhIGNvbnRlbmlkb1xuICAgIGNvbnN0IGJveEhlaWdodCA9IE1hdGgubWF4KG1pbkJveEhlaWdodCwgY29udGVudEhlaWdodCArIHBhZGRpbmcpO1xuXG4gICAgLy8gVmVyaWZpY2FyIHNpIG5lY2VzaXRhbW9zIHVuYSBudWV2YSBww6FnaW5hXG4gICAgY29uc3QgcGFnZUhlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcbiAgICBjb25zdCByZW1haW5pbmdTcGFjZSA9IHBhZ2VIZWlnaHQgLSBib3hZIC0gMTAwOyAvLyBEZWphciBlc3BhY2lvIHBhcmEgZm9vdGVyXG4gICAgXG4gICAgbGV0IGZpbmFsQm94WSA9IGJveFk7XG4gICAgaWYgKGJveEhlaWdodCA+IHJlbWFpbmluZ1NwYWNlKSB7XG4gICAgICAvLyBBw7FhZGlyIG51ZXZhIHDDoWdpbmFcbiAgICAgIGRvYy5hZGRQYWdlKCk7XG4gICAgICBmaW5hbEJveFkgPSBtYXJnaW4gKyA0MDsgLy8gUG9zaWNpw7NuIGVuIG51ZXZhIHDDoWdpbmFcbiAgICB9XG5cbiAgICAvLyBEaWJ1amFyIGNvbnRlbmVkb3IgY29uIGFsdHVyYSBkaW7DoW1pY2FcbiAgICAvLyBGb25kbyBncmlzIGNsYXJvXG4gICAgZG9jLnNldEZpbGxDb2xvcigyNTAsIDI1MCwgMjUwKTtcbiAgICBkb2MucmVjdChtYXJnaW4sIGZpbmFsQm94WSwgYm94V2lkdGgsIGJveEhlaWdodCwgJ0YnKTtcbiAgICBcbiAgICAvLyBCb3JkZVxuICAgIGRvYy5zZXREcmF3Q29sb3IoMjAwLCAyMDAsIDIwMCk7XG4gICAgZG9jLnJlY3QobWFyZ2luLCBmaW5hbEJveFksIGJveFdpZHRoLCBib3hIZWlnaHQsICdTJyk7XG5cbiAgICAvLyBBw7FhZGlyIGNvbnRlbmlkbyBkZSB0ZXh0b1xuICAgIGxldCB0ZXh0WSA9IGZpbmFsQm94WSArIDIwO1xuXG4gICAgaWYgKGRhdGEuZGVzY3JpcHRpb24gJiYgZGF0YS5kZXNjcmlwdGlvbi50cmltKCkpIHtcbiAgICAgIGNvbnN0IGRlc2NMaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUoZGF0YS5kZXNjcmlwdGlvbi50cmltKCksIG1heFdpZHRoKTtcbiAgICAgIFxuICAgICAgLy8gU2kgaGF5IG11Y2hhcyBsw61uZWFzLCB2ZXJpZmljYXIgcXVlIHF1ZXBhbiBlbiBsYSBww6FnaW5hIGFjdHVhbFxuICAgICAgY29uc3QgcmVxdWlyZWRIZWlnaHQgPSBkZXNjTGluZXMubGVuZ3RoICogbGluZUhlaWdodCArIDQwO1xuICAgICAgaWYgKHRleHRZICsgcmVxdWlyZWRIZWlnaHQgPiBwYWdlSGVpZ2h0IC0gNjApIHtcbiAgICAgICAgLy8gRWwgY29udGVuaWRvIGVzIG11eSBsYXJnbywgZGl2aWRpciBzaSBlcyBuZWNlc2FyaW9cbiAgICAgICAgY29uc3QgbWF4TGluZXNQZXJQYWdlID0gTWF0aC5mbG9vcigocGFnZUhlaWdodCAtIHRleHRZIC0gNjApIC8gbGluZUhlaWdodCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZGVzY0xpbmVzLmxlbmd0aCA+IG1heExpbmVzUGVyUGFnZSAmJiBtYXhMaW5lc1BlclBhZ2UgPiAwKSB7XG4gICAgICAgICAgLy8gTW9zdHJhciBsw61uZWFzIHF1ZSBjYWJlbiBlbiBsYSBww6FnaW5hIGFjdHVhbFxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTGluZXMgPSBkZXNjTGluZXMuc2xpY2UoMCwgbWF4TGluZXNQZXJQYWdlKTtcbiAgICAgICAgICBkb2MudGV4dChjdXJyZW50UGFnZUxpbmVzLCB0ZXh0TWFyZ2luLCB0ZXh0WSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ29udGludWFyIGVuIG51ZXZhIHDDoWdpbmEgc2kgaGF5IG3DoXMgY29udGVuaWRvXG4gICAgICAgICAgaWYgKGRlc2NMaW5lcy5sZW5ndGggPiBtYXhMaW5lc1BlclBhZ2UpIHtcbiAgICAgICAgICAgIGRvYy5hZGRQYWdlKCk7XG4gICAgICAgICAgICB0ZXh0WSA9IG1hcmdpbiArIDIwO1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTGluZXMgPSBkZXNjTGluZXMuc2xpY2UobWF4TGluZXNQZXJQYWdlKTtcbiAgICAgICAgICAgIGRvYy50ZXh0KHJlbWFpbmluZ0xpbmVzLCB0ZXh0TWFyZ2luLCB0ZXh0WSk7XG4gICAgICAgICAgICByZXR1cm4gdGV4dFkgKyAocmVtYWluaW5nTGluZXMubGVuZ3RoICogbGluZUhlaWdodCkgKyAyMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jLnRleHQoZGVzY0xpbmVzLCB0ZXh0TWFyZ2luLCB0ZXh0WSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvYy50ZXh0KGRlc2NMaW5lcywgdGV4dE1hcmdpbiwgdGV4dFkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0ZXh0WSArPSBkZXNjTGluZXMubGVuZ3RoICogbGluZUhlaWdodDtcbiAgICB9XG5cbiAgICAvLyBTaSBubyBoYXkgZGVzY3JpcGNpw7NuLCBtb3N0cmFyIHVuIG1lbnNhamVcbiAgICBpZiAoIWRhdGEuZGVzY3JpcHRpb24gfHwgIWRhdGEuZGVzY3JpcHRpb24udHJpbSgpKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2l0YWxpYycpO1xuICAgICAgZG9jLnNldEZvbnRTaXplKDEwKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTUwLCAxNTAsIDE1MCk7XG4gICAgICBkb2MudGV4dCgnTm8gc2UgaGFuIGVzcGVjaWZpY2FkbyBkZXRhbGxlcyBkZWwgc2VydmljaW8uJywgdGV4dE1hcmdpbiwgdGV4dFkpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcigwLCAwLCAwKTtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xuICAgIH1cblxuICAgIHJldHVybiBmaW5hbEJveFkgKyBib3hIZWlnaHQ7XG4gIH1cblxuICBwcml2YXRlIGFkZEF1dGhvcml6YXRpb24oZG9jOiBqc1BERiwgZGF0YTogVGVtcGxhdGVQZGZPdCwgeTogbnVtYmVyLCBtYXJnaW46IG51bWJlciwgcGFnZVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRhYmxlRGF0YSA9IFtcbiAgICAgIFtcbiAgICAgICAgeyBjb250ZW50OiAnQVVUT1JJWkFEQSBQT1I6Jywgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBmb250U2l6ZTogMTIsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLmFwcHJvdmVkX2J5IHx8ICcnLCBzdHlsZXM6IHsgZm9udFNpemU6IDEyIH0gfVxuICAgICAgXVxuICAgIF07XG5cbiAgICAoZG9jIGFzIGFueSkuYXV0b1RhYmxlKHtcbiAgICAgIHN0YXJ0WTogeSxcbiAgICAgIGJvZHk6IHRhYmxlRGF0YSxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgY2VsbFBhZGRpbmc6IDEyLFxuICAgICAgICBsaW5lQ29sb3I6IFsyMDAsIDIwMCwgMjAwXSxcbiAgICAgICAgbGluZVdpZHRoOiAwLjVcbiAgICAgIH0sXG4gICAgICBjb2x1bW5TdHlsZXM6IHtcbiAgICAgICAgMDogeyBjZWxsV2lkdGg6IDE1MCB9LFxuICAgICAgICAxOiB7IGNlbGxXaWR0aDogMzIwIH1cbiAgICAgIH0sXG4gICAgICBtYXJnaW46IHsgbGVmdDogbWFyZ2luLCByaWdodDogbWFyZ2luIH1cbiAgICB9KTtcblxuICAgIHJldHVybiAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFk7XG4gIH1cblxuICBwcml2YXRlIGFkZEZvb3Rlcihkb2M6IGpzUERGLCBkYXRhOiBUZW1wbGF0ZVBkZk90LCB5OiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiB2b2lkIHtcbiAgICAvLyBGb25kbyBkZWwgcGllIGRlIHDDoWdpbmFcbiAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgIGRvYy5yZWN0KDQwLCB5LCBwYWdlV2lkdGggLSA4MCwgNjAsICdGJyk7XG5cbiAgICAvLyBUZXh0byBlbiBibGFuY29cbiAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwgMjU1LCAyNTUpO1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMik7XG4gICAgXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSAnRmF2b3IgYWRqdW50YXIgbGEgb3JkZW4gYSBsYSBmYWN0dXJhIG8gY3VlbnRhIGRlIGNvYnJvJztcbiAgICBjb25zdCBpbnN0V2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGluc3RydWN0aW9uKTtcbiAgICBkb2MudGV4dChpbnN0cnVjdGlvbiwgKHBhZ2VXaWR0aCAtIGluc3RXaWR0aCkgLyAyLCB5ICsgMjUpO1xuXG4gICAgZG9jLnNldEZvbnRTaXplKDEwKTtcbiAgICBjb25zdCBlbWFpbFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChkYXRhLm1haWwgfHwgJycpO1xuICAgIGRvYy50ZXh0KGRhdGEubWFpbCB8fCAnJywgKHBhZ2VXaWR0aCAtIGVtYWlsV2lkdGgpIC8gMiwgeSArIDQ1KTtcblxuICAgIC8vIFJlc2V0ZWFyIGNvbG9yXG4gICAgZG9jLnNldFRleHRDb2xvcigwLCAwLCAwKTtcbiAgfVxuXG5cbn1cbiJdfQ==