brainloper-ui 14.1.7 → 14.1.8
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/esm2020/brainloper-ui.mjs +4 -4
- package/esm2020/public_api.mjs +56 -56
- package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +310 -310
- package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +29 -29
- package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +23 -23
- package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +83 -83
- package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +40 -40
- package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +176 -176
- package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +728 -728
- package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +118 -118
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +186 -186
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.mjs +1 -1
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.mjs +1 -1
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.mjs +1 -1
- package/esm2020/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +222 -222
- package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +115 -115
- package/esm2020/src/app/modules/brainloper-ui/components/report/template-ot/template-ot.component.mjs +145 -145
- package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +108 -108
- package/esm2020/src/app/modules/directives/carousel-item.directive.mjs +18 -18
- package/esm2020/src/app/modules/interfaces/buttons/button-icon.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/combos/combos-configuration.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/data-table/params.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/data-table/rules.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/data-table/table-columns.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/data-table/table-configuration.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/enum/enumActions.mjs +8 -8
- package/esm2020/src/app/modules/interfaces/enum/enumRules.mjs +8 -8
- package/esm2020/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/file-forms-service/file-input-params.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/filters/header-filters.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +8 -8
- package/esm2020/src/app/modules/interfaces/report/template-pdf-base.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/report/template-pdf-ot.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/report/template-pfd-fo.mjs +2 -2
- package/esm2020/src/app/modules/services/crypto.service.mjs +37 -37
- package/esm2020/src/app/modules/services/export-data.service.mjs +166 -166
- package/esm2020/src/app/modules/services/file-forms.service.mjs +24 -24
- package/esm2020/src/app/modules/services/fuel-order-pdf.service.mjs +528 -528
- package/esm2020/src/app/modules/services/functions.service.mjs +54 -54
- package/esm2020/src/app/modules/services/generate-pdf.service.mjs +109 -109
- package/esm2020/src/app/modules/services/http.service.mjs +97 -97
- package/esm2020/src/app/modules/services/loading/loading.component.mjs +28 -28
- package/esm2020/src/app/modules/services/local-storage.service.mjs +115 -115
- package/esm2020/src/app/modules/services/message.service.mjs +200 -200
- package/esm2020/src/app/modules/services/screen-size-util.mjs +6 -6
- package/esm2020/src/app/modules/services/session.service.mjs +42 -42
- package/esm2020/src/app/modules/services/work-order-pdf.service.mjs +384 -384
- package/fesm2015/brainloper-ui.mjs +3848 -3848
- package/fesm2015/brainloper-ui.mjs.map +1 -1
- package/fesm2020/brainloper-ui.mjs +3818 -3818
- package/fesm2020/brainloper-ui.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/package.json +1 -1
- package/public_api.d.ts +55 -55
- package/src/app/modules/brainloper-ui/brainloper-ui.module.d.ts +62 -62
- package/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.d.ts +13 -13
- package/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.d.ts +10 -10
- package/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.d.ts +24 -24
- package/src/app/modules/brainloper-ui/components/carousel/carousel.component.d.ts +16 -16
- package/src/app/modules/brainloper-ui/components/combos/combos.component.d.ts +46 -46
- package/src/app/modules/brainloper-ui/components/data-table/data-table.component.d.ts +125 -125
- package/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.d.ts +21 -21
- package/src/app/modules/brainloper-ui/components/file-input/file-input.component.d.ts +42 -42
- package/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.d.ts +2 -2
- package/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.d.ts +2 -2
- package/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.d.ts +2 -2
- package/src/app/modules/brainloper-ui/components/filters/filters.component.d.ts +30 -30
- package/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.d.ts +41 -41
- package/src/app/modules/brainloper-ui/components/report/template-ot/template-ot.component.d.ts +40 -40
- package/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.d.ts +26 -26
- package/src/app/modules/directives/carousel-item.directive.d.ts +9 -9
- package/src/app/modules/interfaces/buttons/button-icon.d.ts +9 -9
- package/src/app/modules/interfaces/buttons/button-lavel-edit.d.ts +6 -6
- package/src/app/modules/interfaces/combos/combos-configuration.d.ts +13 -13
- package/src/app/modules/interfaces/data-table/params.d.ts +7 -7
- package/src/app/modules/interfaces/data-table/rules.d.ts +8 -8
- package/src/app/modules/interfaces/data-table/table-columns.d.ts +25 -25
- package/src/app/modules/interfaces/data-table/table-configuration.d.ts +26 -26
- package/src/app/modules/interfaces/enum/enumActions.d.ts +6 -6
- package/src/app/modules/interfaces/enum/enumRules.d.ts +6 -6
- package/src/app/modules/interfaces/file-forms-service/file-forms-params.d.ts +4 -4
- package/src/app/modules/interfaces/file-forms-service/file-input-params.d.ts +13 -13
- package/src/app/modules/interfaces/filters/header-filters.d.ts +13 -13
- package/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.d.ts +10 -10
- package/src/app/modules/interfaces/report/template-pdf-base.d.ts +17 -17
- package/src/app/modules/interfaces/report/template-pdf-ot.d.ts +6 -6
- package/src/app/modules/interfaces/report/template-pfd-fo.d.ts +7 -7
- package/src/app/modules/services/crypto.service.d.ts +10 -10
- package/src/app/modules/services/export-data.service.d.ts +18 -18
- package/src/app/modules/services/file-forms.service.d.ts +7 -7
- package/src/app/modules/services/fuel-order-pdf.service.d.ts +59 -59
- package/src/app/modules/services/functions.service.d.ts +13 -13
- package/src/app/modules/services/generate-pdf.service.d.ts +21 -21
- package/src/app/modules/services/http.service.d.ts +22 -22
- package/src/app/modules/services/loading/loading.component.d.ts +15 -15
- package/src/app/modules/services/local-storage.service.d.ts +49 -49
- package/src/app/modules/services/message.service.d.ts +23 -23
- package/src/app/modules/services/screen-size-util.d.ts +3 -3
- package/src/app/modules/services/session.service.d.ts +14 -14
- package/src/app/modules/services/work-order-pdf.service.d.ts +60 -60
|
@@ -1,528 +1,528 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { jsPDF } from 'jspdf';
|
|
3
|
-
import 'jspdf-autotable';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class FuelOrderPdfService {
|
|
6
|
-
constructor() { }
|
|
7
|
-
generateFuelOrderPDF(data) {
|
|
8
|
-
//return this.FuelOrderPdfService.generateFuelOrderPDF(data);
|
|
9
|
-
return new Promise((resolve, reject) => {
|
|
10
|
-
try {
|
|
11
|
-
const doc = new jsPDF('p', 'pt', 'letter'); // Tamaño carta fijo
|
|
12
|
-
const pageWidth = doc.internal.pageSize.getWidth();
|
|
13
|
-
const pageHeight = doc.internal.pageSize.getHeight();
|
|
14
|
-
const margin = 40;
|
|
15
|
-
let currentY = margin;
|
|
16
|
-
// Configurar fuentes
|
|
17
|
-
doc.setFont('helvetica', 'bold');
|
|
18
|
-
doc.setFontSize(16);
|
|
19
|
-
// Función auxiliar para añadir texto centrado
|
|
20
|
-
const addCenteredText = (text, y, fontSize = 12, style = 'normal') => {
|
|
21
|
-
doc.setFont('helvetica', style);
|
|
22
|
-
doc.setFontSize(fontSize);
|
|
23
|
-
const textWidth = doc.getTextWidth(text);
|
|
24
|
-
doc.text(text, (pageWidth - textWidth) / 2, y);
|
|
25
|
-
return y + fontSize + 5;
|
|
26
|
-
};
|
|
27
|
-
// Función auxiliar para añadir texto con ajuste de línea
|
|
28
|
-
const addWrappedText = (text, x, y, maxWidth, fontSize = 10, style = 'normal') => {
|
|
29
|
-
doc.setFont('helvetica', style);
|
|
30
|
-
doc.setFontSize(fontSize);
|
|
31
|
-
const lines = doc.splitTextToSize(text, maxWidth);
|
|
32
|
-
doc.text(lines, x, y);
|
|
33
|
-
return y + (lines.length * fontSize) + 5;
|
|
34
|
-
};
|
|
35
|
-
// Función para dibujar rectángulo con borde
|
|
36
|
-
const drawRect = (x, y, width, height) => {
|
|
37
|
-
doc.rect(x, y, width, height);
|
|
38
|
-
};
|
|
39
|
-
// ENCABEZADO
|
|
40
|
-
currentY = addCenteredText(data.name.toUpperCase(), currentY, 16, 'bold');
|
|
41
|
-
currentY = addCenteredText(`NIT: ${data.nit}`, currentY, 12, 'bold');
|
|
42
|
-
currentY = addCenteredText(data.address, currentY, 10);
|
|
43
|
-
currentY = addCenteredText(`TEL: ${data.telephone}`, currentY, 10);
|
|
44
|
-
currentY += 20;
|
|
45
|
-
// Título del documento
|
|
46
|
-
currentY = addCenteredText('ORDEN DE COMBUSTIBLE', currentY, 18, 'bold');
|
|
47
|
-
currentY = addCenteredText(`N°: ${data.consecutive}`, currentY, 14, 'bold');
|
|
48
|
-
currentY += 20;
|
|
49
|
-
// Información principal en tabla
|
|
50
|
-
const tableData = [
|
|
51
|
-
['Área:', data.area, 'Código:', data.code, 'Fecha:', data.date],
|
|
52
|
-
['Operario:', data.responsible, 'Odómetro:', data.odometer, '', '']
|
|
53
|
-
];
|
|
54
|
-
doc.autoTable({
|
|
55
|
-
startY: currentY,
|
|
56
|
-
head: [],
|
|
57
|
-
body: tableData,
|
|
58
|
-
theme: 'grid',
|
|
59
|
-
styles: {
|
|
60
|
-
fontSize: 10,
|
|
61
|
-
cellPadding: 8,
|
|
62
|
-
lineColor: [0, 0, 0],
|
|
63
|
-
lineWidth: 0.5
|
|
64
|
-
},
|
|
65
|
-
columnStyles: {
|
|
66
|
-
0: { fontStyle: 'bold', cellWidth: 60 },
|
|
67
|
-
1: { cellWidth: 120 },
|
|
68
|
-
2: { fontStyle: 'bold', cellWidth: 60 },
|
|
69
|
-
3: { cellWidth: 80 },
|
|
70
|
-
4: { fontStyle: 'bold', cellWidth: 60 },
|
|
71
|
-
5: { cellWidth: 80 }
|
|
72
|
-
},
|
|
73
|
-
margin: { left: margin, right: margin }
|
|
74
|
-
});
|
|
75
|
-
currentY = doc.lastAutoTable.finalY + 20;
|
|
76
|
-
// Datos del proveedor
|
|
77
|
-
currentY = addCenteredText('DATOS DEL PROVEEDOR', currentY, 14, 'bold');
|
|
78
|
-
currentY += 10;
|
|
79
|
-
const providerData = [
|
|
80
|
-
['Lugar:', data.namePlace, 'Dirección:', data.addressPlace]
|
|
81
|
-
];
|
|
82
|
-
doc.autoTable({
|
|
83
|
-
startY: currentY,
|
|
84
|
-
head: [],
|
|
85
|
-
body: providerData,
|
|
86
|
-
theme: 'grid',
|
|
87
|
-
styles: {
|
|
88
|
-
fontSize: 10,
|
|
89
|
-
cellPadding: 8,
|
|
90
|
-
lineColor: [0, 0, 0],
|
|
91
|
-
lineWidth: 0.5
|
|
92
|
-
},
|
|
93
|
-
columnStyles: {
|
|
94
|
-
0: { fontStyle: 'bold', cellWidth: 80 },
|
|
95
|
-
1: { cellWidth: 150 },
|
|
96
|
-
2: { fontStyle: 'bold', cellWidth: 80 },
|
|
97
|
-
3: { cellWidth: 150 }
|
|
98
|
-
},
|
|
99
|
-
margin: { left: margin, right: margin }
|
|
100
|
-
});
|
|
101
|
-
currentY = doc.lastAutoTable.finalY + 20;
|
|
102
|
-
// Detalles del servicio
|
|
103
|
-
currentY = addCenteredText('DETALLES DEL SERVICIO', currentY, 14, 'bold');
|
|
104
|
-
currentY += 15;
|
|
105
|
-
// Contenedor para detalles
|
|
106
|
-
const detailsY = currentY;
|
|
107
|
-
const detailsHeight = 80;
|
|
108
|
-
drawRect(margin, detailsY, pageWidth - (margin * 2), detailsHeight);
|
|
109
|
-
currentY += 15;
|
|
110
|
-
currentY = addWrappedText(data.detalle, margin + 10, currentY, pageWidth - (margin * 2) - 20, 10);
|
|
111
|
-
currentY = addWrappedText(`Descripción: ${data.description}`, margin + 10, currentY, pageWidth - (margin * 2) - 20, 10);
|
|
112
|
-
currentY = detailsY + detailsHeight + 20;
|
|
113
|
-
// Autorización
|
|
114
|
-
const authData = [
|
|
115
|
-
['AUTORIZADA POR:', data.approved_by]
|
|
116
|
-
];
|
|
117
|
-
doc.autoTable({
|
|
118
|
-
startY: currentY,
|
|
119
|
-
head: [],
|
|
120
|
-
body: authData,
|
|
121
|
-
theme: 'grid',
|
|
122
|
-
styles: {
|
|
123
|
-
fontSize: 12,
|
|
124
|
-
cellPadding: 10,
|
|
125
|
-
lineColor: [0, 0, 0],
|
|
126
|
-
lineWidth: 0.5
|
|
127
|
-
},
|
|
128
|
-
columnStyles: {
|
|
129
|
-
0: { fontStyle: 'bold', cellWidth: 150 },
|
|
130
|
-
1: { cellWidth: 310 }
|
|
131
|
-
},
|
|
132
|
-
margin: { left: margin, right: margin }
|
|
133
|
-
});
|
|
134
|
-
currentY = doc.lastAutoTable.finalY + 30;
|
|
135
|
-
// Pie de página
|
|
136
|
-
currentY = addCenteredText('Favor adjuntar la orden de venta o factura', currentY, 12, 'bold');
|
|
137
|
-
currentY = addCenteredText(data.mail, currentY, 10);
|
|
138
|
-
// Generar el PDF
|
|
139
|
-
doc.output('dataurlnewwindow', { filename: 'orden_combustible.pdf' });
|
|
140
|
-
resolve();
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
reject(error);
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
generateFuelOrderProfesionalPDF(data, options) {
|
|
148
|
-
return new Promise((resolve, reject) => {
|
|
149
|
-
try {
|
|
150
|
-
const opts = {
|
|
151
|
-
format: 'letter',
|
|
152
|
-
download: true,
|
|
153
|
-
filename: 'orden_combustible.pdf',
|
|
154
|
-
...options
|
|
155
|
-
};
|
|
156
|
-
const doc = new jsPDF('p', 'pt', opts.format);
|
|
157
|
-
const pageWidth = doc.internal.pageSize.getWidth();
|
|
158
|
-
const pageHeight = doc.internal.pageSize.getHeight();
|
|
159
|
-
const margin = 40;
|
|
160
|
-
let currentY = margin;
|
|
161
|
-
// Colores corporativos
|
|
162
|
-
const primaryColor = [41, 128, 185]; // Azul
|
|
163
|
-
const secondaryColor = [52, 73, 94]; // Gris oscuro
|
|
164
|
-
const accentColor = [230, 126, 34]; // Naranja
|
|
165
|
-
// === ENCABEZADO PRINCIPAL ===
|
|
166
|
-
this.addHeader(doc, data, margin, currentY, pageWidth, primaryColor);
|
|
167
|
-
currentY = 140;
|
|
168
|
-
// === TÍTULO DEL DOCUMENTO ===
|
|
169
|
-
currentY = this.addDocumentTitle(doc, data, currentY, pageWidth, accentColor);
|
|
170
|
-
currentY += 25;
|
|
171
|
-
// === INFORMACIÓN PRINCIPAL ===
|
|
172
|
-
currentY = this.addMainInfo(doc, data, currentY, margin, pageWidth);
|
|
173
|
-
currentY += 20;
|
|
174
|
-
// === DATOS DEL PROVEEDOR ===
|
|
175
|
-
currentY = this.addProviderInfo(doc, data, currentY, margin, pageWidth, secondaryColor);
|
|
176
|
-
currentY += 20;
|
|
177
|
-
// === DETALLES DEL SERVICIO ===
|
|
178
|
-
currentY = this.addServiceDetails(doc, data, currentY, margin, pageWidth, secondaryColor);
|
|
179
|
-
currentY += 20;
|
|
180
|
-
// === AUTORIZACIÓN ===
|
|
181
|
-
currentY = this.addAuthorization(doc, data, currentY, margin, pageWidth);
|
|
182
|
-
currentY += 30;
|
|
183
|
-
// === PIE DE PÁGINA ===
|
|
184
|
-
this.addFooter(doc, data, pageHeight - 80, pageWidth, primaryColor);
|
|
185
|
-
// === GENERAR/DESCARGAR ===
|
|
186
|
-
if (opts.download) {
|
|
187
|
-
doc.output('dataurlnewwindow', { filename: opts.filename });
|
|
188
|
-
}
|
|
189
|
-
resolve(doc);
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
192
|
-
reject(error);
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
addHeader(doc, data, margin, y, pageWidth, color) {
|
|
197
|
-
// Fondo del encabezado
|
|
198
|
-
doc.setFillColor(color[0], color[1], color[2]);
|
|
199
|
-
doc.rect(margin, y, pageWidth - (margin * 2), 80, 'F');
|
|
200
|
-
// Texto del encabezado en blanco
|
|
201
|
-
doc.setTextColor(255, 255, 255);
|
|
202
|
-
doc.setFont('helvetica', 'bold');
|
|
203
|
-
doc.setFontSize(18);
|
|
204
|
-
const companyName = data.name.toUpperCase();
|
|
205
|
-
const nameWidth = doc.getTextWidth(companyName);
|
|
206
|
-
doc.text(companyName, (pageWidth - nameWidth) / 2, y + 25);
|
|
207
|
-
doc.setFontSize(12);
|
|
208
|
-
const nitText = `NIT: ${data.nit}`;
|
|
209
|
-
const nitWidth = doc.getTextWidth(nitText);
|
|
210
|
-
doc.text(nitText, (pageWidth - nitWidth) / 2, y + 45);
|
|
211
|
-
doc.setFontSize(10);
|
|
212
|
-
const addressText = `${data.address} - TEL: ${data.telephone}`;
|
|
213
|
-
const addressWidth = doc.getTextWidth(addressText);
|
|
214
|
-
doc.text(addressText, (pageWidth - addressWidth) / 2, y + 65);
|
|
215
|
-
// Resetear color de texto
|
|
216
|
-
doc.setTextColor(0, 0, 0);
|
|
217
|
-
}
|
|
218
|
-
addDocumentTitle(doc, data, y, pageWidth, color) {
|
|
219
|
-
doc.setTextColor(color[0], color[1], color[2]);
|
|
220
|
-
doc.setFont('helvetica', 'bold');
|
|
221
|
-
doc.setFontSize(20);
|
|
222
|
-
const title = 'ORDEN DE COMBUSTIBLE';
|
|
223
|
-
const titleWidth = doc.getTextWidth(title);
|
|
224
|
-
doc.text(title, (pageWidth - titleWidth) / 2, y);
|
|
225
|
-
doc.setFontSize(16);
|
|
226
|
-
const numberText = `N° ${data.consecutive}`;
|
|
227
|
-
const numberWidth = doc.getTextWidth(numberText);
|
|
228
|
-
doc.text(numberText, (pageWidth - numberWidth) / 2, y + 25);
|
|
229
|
-
doc.setTextColor(0, 0, 0);
|
|
230
|
-
return y + 40;
|
|
231
|
-
}
|
|
232
|
-
addMainInfo(doc, data, y, margin, pageWidth) {
|
|
233
|
-
const tableData = [
|
|
234
|
-
[
|
|
235
|
-
{ content: 'Área:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
236
|
-
{ content: data.area, styles: {} },
|
|
237
|
-
{ content: 'Código:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
238
|
-
{ content: data.code, styles: {} },
|
|
239
|
-
{ content: 'Fecha:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
240
|
-
{ content: data.date, styles: {} }
|
|
241
|
-
],
|
|
242
|
-
[
|
|
243
|
-
{ content: 'Operario:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
244
|
-
{ content: data.responsible, styles: { colSpan: 3 } },
|
|
245
|
-
{ content: 'Odómetro:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
246
|
-
{ content: data.odometer, styles: {} }
|
|
247
|
-
]
|
|
248
|
-
];
|
|
249
|
-
doc.autoTable({
|
|
250
|
-
startY: y,
|
|
251
|
-
body: tableData,
|
|
252
|
-
theme: 'grid',
|
|
253
|
-
styles: {
|
|
254
|
-
fontSize: 11,
|
|
255
|
-
cellPadding: 8,
|
|
256
|
-
lineColor: [200, 200, 200],
|
|
257
|
-
lineWidth: 0.5
|
|
258
|
-
},
|
|
259
|
-
columnStyles: {
|
|
260
|
-
0: { cellWidth: 70 },
|
|
261
|
-
1: { cellWidth: 100 },
|
|
262
|
-
2: { cellWidth: 70 },
|
|
263
|
-
3: { cellWidth: 80 },
|
|
264
|
-
4: { cellWidth: 70 },
|
|
265
|
-
5: { cellWidth: 80 }
|
|
266
|
-
},
|
|
267
|
-
margin: { left: margin, right: margin }
|
|
268
|
-
});
|
|
269
|
-
return doc.lastAutoTable.finalY;
|
|
270
|
-
}
|
|
271
|
-
addProviderInfo(doc, data, y, margin, pageWidth, color) {
|
|
272
|
-
// Título de sección
|
|
273
|
-
doc.setTextColor(color[0], color[1], color[2]);
|
|
274
|
-
doc.setFont('helvetica', 'bold');
|
|
275
|
-
doc.setFontSize(14);
|
|
276
|
-
const title = 'DATOS DEL PROVEEDOR';
|
|
277
|
-
const titleWidth = doc.getTextWidth(title);
|
|
278
|
-
doc.text(title, (pageWidth - titleWidth) / 2, y);
|
|
279
|
-
doc.setTextColor(0, 0, 0);
|
|
280
|
-
const tableData = [
|
|
281
|
-
[
|
|
282
|
-
{ content: 'Lugar:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
283
|
-
{ content: data.namePlace, styles: {} },
|
|
284
|
-
{ content: 'Dirección:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
285
|
-
{ content: data.addressPlace, styles: {} }
|
|
286
|
-
]
|
|
287
|
-
];
|
|
288
|
-
doc.autoTable({
|
|
289
|
-
startY: y + 20,
|
|
290
|
-
body: tableData,
|
|
291
|
-
theme: 'grid',
|
|
292
|
-
styles: {
|
|
293
|
-
fontSize: 11,
|
|
294
|
-
cellPadding: 8,
|
|
295
|
-
lineColor: [200, 200, 200],
|
|
296
|
-
lineWidth: 0.5
|
|
297
|
-
},
|
|
298
|
-
columnStyles: {
|
|
299
|
-
0: { cellWidth: 80 },
|
|
300
|
-
1: { cellWidth: 160 },
|
|
301
|
-
2: { cellWidth: 80 },
|
|
302
|
-
3: { cellWidth: 150 }
|
|
303
|
-
},
|
|
304
|
-
margin: { left: margin, right: margin }
|
|
305
|
-
});
|
|
306
|
-
return doc.lastAutoTable.finalY;
|
|
307
|
-
}
|
|
308
|
-
addServiceDetails(doc, data, y, margin, pageWidth, color) {
|
|
309
|
-
// Título de sección
|
|
310
|
-
doc.setTextColor(color[0], color[1], color[2]);
|
|
311
|
-
doc.setFont('helvetica', 'bold');
|
|
312
|
-
doc.setFontSize(14);
|
|
313
|
-
const title = 'DETALLES DEL SERVICIO';
|
|
314
|
-
const titleWidth = doc.getTextWidth(title);
|
|
315
|
-
doc.text(title, (pageWidth - titleWidth) / 2, y);
|
|
316
|
-
doc.setTextColor(0, 0, 0);
|
|
317
|
-
// Preparar texto para calcular altura necesaria
|
|
318
|
-
const boxY = y + 20;
|
|
319
|
-
const boxWidth = pageWidth - (margin * 2);
|
|
320
|
-
const textMargin = margin + 15;
|
|
321
|
-
const maxWidth = boxWidth - 30;
|
|
322
|
-
const lineHeight = 15;
|
|
323
|
-
const minBoxHeight = 60; // Altura mínima del contenedor
|
|
324
|
-
const padding = 40; // Padding superior e inferior
|
|
325
|
-
// Calcular líneas de texto necesarias
|
|
326
|
-
doc.setFont('helvetica', 'normal');
|
|
327
|
-
doc.setFontSize(11);
|
|
328
|
-
let totalLines = 0;
|
|
329
|
-
// Contar líneas del detalle
|
|
330
|
-
if (data.detalle && data.detalle.trim()) {
|
|
331
|
-
const detalleLines = doc.splitTextToSize(data.detalle.trim(), maxWidth);
|
|
332
|
-
totalLines += detalleLines.length;
|
|
333
|
-
}
|
|
334
|
-
// Contar líneas de la descripción (incluye etiqueta "Descripción:")
|
|
335
|
-
if (data.description && data.description.trim()) {
|
|
336
|
-
totalLines += 2; // Una línea para "Descripción:" + espacio
|
|
337
|
-
const descLines = doc.splitTextToSize(data.description.trim(), maxWidth);
|
|
338
|
-
totalLines += descLines.length;
|
|
339
|
-
}
|
|
340
|
-
// Calcular altura necesaria basada en el contenido
|
|
341
|
-
const contentHeight = Math.max(totalLines * lineHeight, 30); // Mínimo 30pt para contenido
|
|
342
|
-
const boxHeight = Math.max(minBoxHeight, contentHeight + padding);
|
|
343
|
-
// Verificar si necesitamos una nueva página
|
|
344
|
-
const pageHeight = doc.internal.pageSize.getHeight();
|
|
345
|
-
const remainingSpace = pageHeight - boxY - 100; // Dejar espacio para footer
|
|
346
|
-
let finalBoxY = boxY;
|
|
347
|
-
if (boxHeight > remainingSpace) {
|
|
348
|
-
// Añadir nueva página
|
|
349
|
-
doc.addPage();
|
|
350
|
-
finalBoxY = margin + 40; // Posición en nueva página
|
|
351
|
-
}
|
|
352
|
-
// Dibujar contenedor con altura dinámica
|
|
353
|
-
// Fondo gris claro
|
|
354
|
-
doc.setFillColor(250, 250, 250);
|
|
355
|
-
doc.rect(margin, finalBoxY, boxWidth, boxHeight, 'F');
|
|
356
|
-
// Borde
|
|
357
|
-
doc.setDrawColor(200, 200, 200);
|
|
358
|
-
doc.rect(margin, finalBoxY, boxWidth, boxHeight, 'S');
|
|
359
|
-
// Añadir contenido de texto
|
|
360
|
-
let textY = finalBoxY + 20;
|
|
361
|
-
// Añadir detalle si existe
|
|
362
|
-
if (data.detalle && data.detalle.trim()) {
|
|
363
|
-
const detalleLines = doc.splitTextToSize(data.detalle.trim(), maxWidth);
|
|
364
|
-
doc.text(detalleLines, textMargin, textY);
|
|
365
|
-
textY += detalleLines.length * lineHeight + 10; // Espacio extra después del detalle
|
|
366
|
-
}
|
|
367
|
-
// Añadir descripción si existe
|
|
368
|
-
if (data.description && data.description.trim()) {
|
|
369
|
-
doc.setFont('helvetica', 'bold');
|
|
370
|
-
doc.text('Descripción:', textMargin, textY);
|
|
371
|
-
doc.setFont('helvetica', 'normal');
|
|
372
|
-
textY += lineHeight;
|
|
373
|
-
const descLines = doc.splitTextToSize(data.description.trim(), maxWidth);
|
|
374
|
-
// Verificar si necesitamos manejar contenido muy largo
|
|
375
|
-
const remainingHeight = finalBoxY + boxHeight - textY - 20;
|
|
376
|
-
const maxLinesInSpace = Math.floor(remainingHeight / lineHeight);
|
|
377
|
-
if (descLines.length > maxLinesInSpace && maxLinesInSpace > 0) {
|
|
378
|
-
// Mostrar líneas que caben en el espacio actual
|
|
379
|
-
const currentLines = descLines.slice(0, maxLinesInSpace);
|
|
380
|
-
doc.text(currentLines, textMargin, textY);
|
|
381
|
-
// Continuar en nueva página si hay más contenido
|
|
382
|
-
if (descLines.length > maxLinesInSpace) {
|
|
383
|
-
doc.addPage();
|
|
384
|
-
textY = margin + 20;
|
|
385
|
-
const remainingLines = descLines.slice(maxLinesInSpace);
|
|
386
|
-
doc.text(remainingLines, textMargin, textY);
|
|
387
|
-
return textY + (remainingLines.length * lineHeight) + 20;
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
else {
|
|
391
|
-
doc.text(descLines, textMargin, textY);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
// Si no hay contenido, mostrar un mensaje
|
|
395
|
-
if ((!data.detalle || !data.detalle.trim()) && (!data.description || !data.description.trim())) {
|
|
396
|
-
doc.setFont('helvetica', 'italic');
|
|
397
|
-
doc.setFontSize(10);
|
|
398
|
-
doc.setTextColor(150, 150, 150);
|
|
399
|
-
doc.text('No se han especificado detalles del servicio.', textMargin, textY);
|
|
400
|
-
doc.setTextColor(0, 0, 0);
|
|
401
|
-
doc.setFont('helvetica', 'normal');
|
|
402
|
-
doc.setFontSize(11);
|
|
403
|
-
}
|
|
404
|
-
return finalBoxY + boxHeight;
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Método auxiliar para manejar texto largo que puede necesitar múltiples páginas
|
|
408
|
-
*/
|
|
409
|
-
addLongText(doc, text, x, y, maxWidth, fontSize = 11) {
|
|
410
|
-
if (!text || !text.trim())
|
|
411
|
-
return y;
|
|
412
|
-
doc.setFontSize(fontSize);
|
|
413
|
-
const lines = doc.splitTextToSize(text.trim(), maxWidth);
|
|
414
|
-
const lineHeight = fontSize + 3;
|
|
415
|
-
const pageHeight = doc.internal.pageSize.getHeight();
|
|
416
|
-
const margin = 40;
|
|
417
|
-
let currentY = y;
|
|
418
|
-
let lineIndex = 0;
|
|
419
|
-
while (lineIndex < lines.length) {
|
|
420
|
-
// Verificar si necesitamos una nueva página
|
|
421
|
-
if (currentY + lineHeight > pageHeight - margin) {
|
|
422
|
-
doc.addPage();
|
|
423
|
-
currentY = margin;
|
|
424
|
-
}
|
|
425
|
-
// Calcular cuántas líneas caben en la página actual
|
|
426
|
-
const remainingSpace = pageHeight - currentY - margin;
|
|
427
|
-
const maxLinesInPage = Math.floor(remainingSpace / lineHeight);
|
|
428
|
-
if (maxLinesInPage > 0) {
|
|
429
|
-
const linesToShow = Math.min(maxLinesInPage, lines.length - lineIndex);
|
|
430
|
-
const pageLines = lines.slice(lineIndex, lineIndex + linesToShow);
|
|
431
|
-
doc.text(pageLines, x, currentY);
|
|
432
|
-
currentY += pageLines.length * lineHeight;
|
|
433
|
-
lineIndex += linesToShow;
|
|
434
|
-
}
|
|
435
|
-
else {
|
|
436
|
-
// Si no cabe ni una línea, ir a nueva página
|
|
437
|
-
doc.addPage();
|
|
438
|
-
currentY = margin;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
return currentY;
|
|
442
|
-
}
|
|
443
|
-
addAuthorization(doc, data, y, margin, pageWidth) {
|
|
444
|
-
const tableData = [
|
|
445
|
-
[
|
|
446
|
-
{ content: 'AUTORIZADA POR:', styles: { fontStyle: 'bold', fontSize: 12, fillColor: [240, 240, 240] } },
|
|
447
|
-
{ content: data.approved_by, styles: { fontSize: 12 } }
|
|
448
|
-
]
|
|
449
|
-
];
|
|
450
|
-
doc.autoTable({
|
|
451
|
-
startY: y,
|
|
452
|
-
body: tableData,
|
|
453
|
-
theme: 'grid',
|
|
454
|
-
styles: {
|
|
455
|
-
cellPadding: 12,
|
|
456
|
-
lineColor: [200, 200, 200],
|
|
457
|
-
lineWidth: 0.5
|
|
458
|
-
},
|
|
459
|
-
columnStyles: {
|
|
460
|
-
0: { cellWidth: 150 },
|
|
461
|
-
1: { cellWidth: 320 }
|
|
462
|
-
},
|
|
463
|
-
margin: { left: margin, right: margin }
|
|
464
|
-
});
|
|
465
|
-
return doc.lastAutoTable.finalY;
|
|
466
|
-
}
|
|
467
|
-
addFooter(doc, data, y, pageWidth, color) {
|
|
468
|
-
// Fondo del pie de página
|
|
469
|
-
doc.setFillColor(color[0], color[1], color[2]);
|
|
470
|
-
doc.rect(40, y, pageWidth - 80, 60, 'F');
|
|
471
|
-
// Texto en blanco
|
|
472
|
-
doc.setTextColor(255, 255, 255);
|
|
473
|
-
doc.setFont('helvetica', 'bold');
|
|
474
|
-
doc.setFontSize(12);
|
|
475
|
-
const instruction = 'Favor adjuntar la orden de venta o factura';
|
|
476
|
-
const instWidth = doc.getTextWidth(instruction);
|
|
477
|
-
doc.text(instruction, (pageWidth - instWidth) / 2, y + 25);
|
|
478
|
-
doc.setFontSize(10);
|
|
479
|
-
const emailWidth = doc.getTextWidth(data.mail);
|
|
480
|
-
doc.text(data.mail, (pageWidth - emailWidth) / 2, y + 45);
|
|
481
|
-
// Resetear color
|
|
482
|
-
doc.setTextColor(0, 0, 0);
|
|
483
|
-
}
|
|
484
|
-
/**
|
|
485
|
-
* Genera PDF optimizado para impresión
|
|
486
|
-
*/
|
|
487
|
-
generateForPrint(data) {
|
|
488
|
-
return this.generateFuelOrderProfesionalPDF(data, {
|
|
489
|
-
format: 'letter',
|
|
490
|
-
download: false
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* Genera PDF y lo devuelve como Blob para envío por email
|
|
495
|
-
*/
|
|
496
|
-
generateAsBlob(data) {
|
|
497
|
-
return new Promise((resolve, reject) => {
|
|
498
|
-
this.generateFuelOrderProfesionalPDF(data, { download: false })
|
|
499
|
-
.then(doc => {
|
|
500
|
-
const pdfBlob = doc.output('blob');
|
|
501
|
-
resolve(pdfBlob);
|
|
502
|
-
})
|
|
503
|
-
.catch(reject);
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
/**
|
|
507
|
-
* Genera PDF y lo devuelve como base64
|
|
508
|
-
*/
|
|
509
|
-
generateAsBase64(data) {
|
|
510
|
-
return new Promise((resolve, reject) => {
|
|
511
|
-
this.generateFuelOrderProfesionalPDF(data, { download: false })
|
|
512
|
-
.then(doc => {
|
|
513
|
-
const base64 = doc.output('datauristring');
|
|
514
|
-
resolve(base64);
|
|
515
|
-
})
|
|
516
|
-
.catch(reject);
|
|
517
|
-
});
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
FuelOrderPdfService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FuelOrderPdfService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
521
|
-
FuelOrderPdfService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FuelOrderPdfService, providedIn: 'root' });
|
|
522
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FuelOrderPdfService, decorators: [{
|
|
523
|
-
type: Injectable,
|
|
524
|
-
args: [{
|
|
525
|
-
providedIn: 'root'
|
|
526
|
-
}]
|
|
527
|
-
}], ctorParameters: function () { return []; } });
|
|
528
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVlbC1vcmRlci1wZGYuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zZXJ2aWNlcy9mdWVsLW9yZGVyLXBkZi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLGlCQUFpQixDQUFDOztBQTRCekIsTUFBTSxPQUFPLG1CQUFtQjtJQUU5QixnQkFBZ0IsQ0FBQztJQUVmLG9CQUFvQixDQUFDLElBQW1CO1FBQ3RDLDZEQUE2RDtRQUM3RCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtnQkFDaEUsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQztnQkFFdEIscUJBQXFCO2dCQUNyQixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDakMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFcEIsOENBQThDO2dCQUM5QyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQVksRUFBRSxDQUFTLEVBQUUsV0FBbUIsRUFBRSxFQUFFLFFBQTJCLFFBQVEsRUFB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QUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7aUJBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDVixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMzQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2dIQTdsQlUsbUJBQW1CO29IQUFuQixtQkFBbUIsY0FGbEIsTUFBTTsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsganNQREYgfSBmcm9tICdqc3BkZic7XG5pbXBvcnQgJ2pzcGRmLWF1dG90YWJsZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBkZkZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQvdGVtcGxhdGUtcGZkLWZvJztcblxuZXhwb3J0IGludGVyZmFjZSBGdWVsT3JkZXJEYXRhIHtcbiAgbmFtZTogc3RyaW5nO1xuICBuaXQ6IHN0cmluZztcbiAgYWRkcmVzczogc3RyaW5nO1xuICB0ZWxlcGhvbmU6IHN0cmluZztcbiAgbWFpbDogc3RyaW5nO1xuICBpbWFnZT86IHN0cmluZztcbiAgY29kZTogc3RyaW5nO1xuICBkYXRlOiBzdHJpbmc7XG4gIHJlc3BvbnNpYmxlOiBzdHJpbmc7XG4gIGlkX3BsYWNlOiBzdHJpbmc7XG4gIGFwcHJvdmVkX2J5OiBzdHJpbmc7XG4gIGRldGFsbGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgY29uc2VjdXRpdmU6IHN0cmluZztcbiAgbmFtZVBsYWNlOiBzdHJpbmc7XG4gIGFkZHJlc3NQbGFjZTogc3RyaW5nO1xuICBhcmVhOiBzdHJpbmc7XG4gIG9kb21ldGVyOiBzdHJpbmc7XG4gIGludm9pY2VSZWZlcmVuY2U/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEZ1ZWxPcmRlclBkZlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICBnZW5lcmF0ZUZ1ZWxPcmRlclBERihkYXRhOiBUZW1wbGF0ZVBkZkZvKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAvL3JldHVybiB0aGlzLkZ1ZWxPcmRlclBkZlNlcnZpY2UuZ2VuZXJhdGVGdWVsT3JkZXJQREYoZGF0YSk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRvYyA9IG5ldyBqc1BERigncCcsICdwdCcsICdsZXR0ZXInKTsgLy8gVGFtYcOxbyBjYXJ0YSBmaWpvXG4gICAgICAgICAgY29uc3QgcGFnZVdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCk7XG4gICAgICAgICAgY29uc3QgcGFnZUhlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcbiAgICAgICAgICBjb25zdCBtYXJnaW4gPSA0MDtcbiAgICAgICAgICBsZXQgY3VycmVudFkgPSBtYXJnaW47XG4gIFxuICAgICAgICAgIC8vIENvbmZpZ3VyYXIgZnVlbnRlc1xuICAgICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxNik7XG4gIFxuICAgICAgICAgIC8vIEZ1bmNpw7NuIGF1eGlsaWFyIHBhcmEgYcOxYWRpciB0ZXh0byBjZW50cmFkb1xuICAgICAgICAgIGNvbnN0IGFkZENlbnRlcmVkVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHk6IG51bWJlciwgZm9udFNpemU6IG51bWJlciA9IDEyLCBzdHlsZTogJ25vcm1hbCcgfCAnYm9sZCcgPSAnbm9ybWFsJykgPT4ge1xuICAgICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsIHN0eWxlKTtcbiAgICAgICAgICAgIGRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0V2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKHRleHQpO1xuICAgICAgICAgICAgZG9jLnRleHQodGV4dCwgKHBhZ2VXaWR0aCAtIHRleHRXaWR0aCkgLyAyLCB5KTtcbiAgICAgICAgICAgIHJldHVybiB5ICsgZm9udFNpemUgKyA1O1xuICAgICAgICAgIH07XG4gIFxuICAgICAgICAgIC8vIEZ1bmNpw7NuIGF1eGlsaWFyIHBhcmEgYcOxYWRpciB0ZXh0byBjb24gYWp1c3RlIGRlIGzDrW5lYVxuICAgICAgICAgIGNvbnN0IGFkZFdyYXBwZWRUZXh0ID0gKHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIG1heFdpZHRoOiBudW1iZXIsIGZvbnRTaXplOiBudW1iZXIgPSAxMCwgc3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnID0gJ25vcm1hbCcpID0+IHtcbiAgICAgICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCBzdHlsZSk7XG4gICAgICAgICAgICBkb2Muc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICAgICAgY29uc3QgbGluZXMgPSBkb2Muc3BsaXRUZXh0VG9TaXplKHRleHQsIG1heFdpZHRoKTtcbiAgICAgICAgICAgIGRvYy50ZXh0KGxpbmVzLCB4LCB5KTtcbiAgICAgICAgICAgIHJldHVybiB5ICsgKGxpbmVzLmxlbmd0aCAqIGZvbnRTaXplKSArIDU7XG4gICAgICAgICAgfTtcbiAgXG4gICAgICAgICAgLy8gRnVuY2nDs24gcGFyYSBkaWJ1amFyIHJlY3TDoW5ndWxvIGNvbiBib3JkZVxuICAgICAgICAgIGNvbnN0IGRyYXdSZWN0ID0gKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgZG9jLnJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgfTtcbiAgXG4gICAgICAgICAgLy8gRU5DQUJFWkFET1xuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KGRhdGEubmFtZS50b1VwcGVyQ2FzZSgpLCBjdXJyZW50WSwgMTYsICdib2xkJyk7XG4gICAgICAgICAgY3VycmVudFkgPSBhZGRDZW50ZXJlZFRleHQoYE5JVDogJHtkYXRhLm5pdH1gLCBjdXJyZW50WSwgMTIsICdib2xkJyk7XG4gICAgICAgICAgY3VycmVudFkgPSBhZGRDZW50ZXJlZFRleHQoZGF0YS5hZGRyZXNzLCBjdXJyZW50WSwgMTApO1xuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KGBURUw6ICR7ZGF0YS50ZWxlcGhvbmV9YCwgY3VycmVudFksIDEwKTtcbiAgICAgICAgICBjdXJyZW50WSArPSAyMDtcbiAgXG4gICAgICAgICAgLy8gVMOtdHVsbyBkZWwgZG9jdW1lbnRvXG4gICAgICAgICAgY3VycmVudFkgPSBhZGRDZW50ZXJlZFRleHQoJ09SREVOIERFIENPTUJVU1RJQkxFJywgY3VycmVudFksIDE4LCAnYm9sZCcpO1xuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KGBOwrA6ICR7ZGF0YS5jb25zZWN1dGl2ZX1gLCBjdXJyZW50WSwgMTQsICdib2xkJyk7XG4gICAgICAgICAgY3VycmVudFkgKz0gMjA7XG4gIFxuICAgICAgICAgIC8vIEluZm9ybWFjacOzbiBwcmluY2lwYWwgZW4gdGFibGFcbiAgICAgICAgICBjb25zdCB0YWJsZURhdGEgPSBbXG4gICAgICAgICAgICBbJ8OBcmVhOicsIGRhdGEuYXJlYSwgJ0PDs2RpZ286JywgZGF0YS5jb2RlLCAnRmVjaGE6JywgZGF0YS5kYXRlXSxcbiAgICAgICAgICAgIFsnT3BlcmFyaW86JywgZGF0YS5yZXNwb25zaWJsZSwgJ09kw7NtZXRybzonLCBkYXRhLm9kb21ldGVyLCAnJywgJyddXG4gICAgICAgICAgXTtcbiAgXG4gICAgICAgICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XG4gICAgICAgICAgICBzdGFydFk6IGN1cnJlbnRZLFxuICAgICAgICAgICAgaGVhZDogW10sXG4gICAgICAgICAgICBib2R5OiB0YWJsZURhdGEsXG4gICAgICAgICAgICB0aGVtZTogJ2dyaWQnLFxuICAgICAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiAxMCxcbiAgICAgICAgICAgICAgY2VsbFBhZGRpbmc6IDgsXG4gICAgICAgICAgICAgIGxpbmVDb2xvcjogWzAsIDAsIDBdLFxuICAgICAgICAgICAgICBsaW5lV2lkdGg6IDAuNVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbHVtblN0eWxlczoge1xuICAgICAgICAgICAgICAwOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBjZWxsV2lkdGg6IDYwIH0sXG4gICAgICAgICAgICAgIDE6IHsgY2VsbFdpZHRoOiAxMjAgfSxcbiAgICAgICAgICAgICAgMjogeyBmb250U3R5bGU6ICdib2xkJywgY2VsbFdpZHRoOiA2MCB9LFxuICAgICAgICAgICAgICAzOiB7IGNlbGxXaWR0aDogODAgfSxcbiAgICAgICAgICAgICAgNDogeyBmb250U3R5bGU6ICdib2xkJywgY2VsbFdpZHRoOiA2MCB9LFxuICAgICAgICAgICAgICA1OiB7IGNlbGxXaWR0aDogODAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1hcmdpbjogeyBsZWZ0OiBtYXJnaW4sIHJpZ2h0OiBtYXJnaW4gfVxuICAgICAgICAgIH0pO1xuICBcbiAgICAgICAgICBjdXJyZW50WSA9IChkb2MgYXMgYW55KS5sYXN0QXV0b1RhYmxlLmZpbmFsWSArIDIwO1xuICBcbiAgICAgICAgICAvLyBEYXRvcyBkZWwgcHJvdmVlZG9yXG4gICAgICAgICAgY3VycmVudFkgPSBhZGRDZW50ZXJlZFRleHQoJ0RBVE9TIERFTCBQUk9WRUVET1InLCBjdXJyZW50WSwgMTQsICdib2xkJyk7XG4gICAgICAgICAgY3VycmVudFkgKz0gMTA7XG4gIFxuICAgICAgICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IFtcbiAgICAgICAgICAgIFsnTHVnYXI6JywgZGF0YS5uYW1lUGxhY2UsICdEaXJlY2Npw7NuOicsIGRhdGEuYWRkcmVzc1BsYWNlXVxuICAgICAgICAgIF07XG4gIFxuICAgICAgICAgIChkb2MgYXMgYW55KS5hdXRvVGFibGUoe1xuICAgICAgICAgICAgc3RhcnRZOiBjdXJyZW50WSxcbiAgICAgICAgICAgIGhlYWQ6IFtdLFxuICAgICAgICAgICAgYm9keTogcHJvdmlkZXJEYXRhLFxuICAgICAgICAgICAgdGhlbWU6ICdncmlkJyxcbiAgICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgICBmb250U2l6ZTogMTAsXG4gICAgICAgICAgICAgIGNlbGxQYWRkaW5nOiA4LFxuICAgICAgICAgICAgICBsaW5lQ29sb3I6IFswLCAwLCAwXSxcbiAgICAgICAgICAgICAgbGluZVdpZHRoOiAwLjVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2x1bW5TdHlsZXM6IHtcbiAgICAgICAgICAgICAgMDogeyBmb250U3R5bGU6ICdib2xkJywgY2VsbFdpZHRoOiA4MCB9LFxuICAgICAgICAgICAgICAxOiB7IGNlbGxXaWR0aDogMTUwIH0sXG4gICAgICAgICAgICAgIDI6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGNlbGxXaWR0aDogODAgfSxcbiAgICAgICAgICAgICAgMzogeyBjZWxsV2lkdGg6IDE1MCB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWFyZ2luOiB7IGxlZnQ6IG1hcmdpbiwgcmlnaHQ6IG1hcmdpbiB9XG4gICAgICAgICAgfSk7XG4gIFxuICAgICAgICAgIGN1cnJlbnRZID0gKGRvYyBhcyBhbnkpLmxhc3RBdXRvVGFibGUuZmluYWxZICsgMjA7XG4gIFxuICAgICAgICAgIC8vIERldGFsbGVzIGRlbCBzZXJ2aWNpb1xuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KCdERVRBTExFUyBERUwgU0VSVklDSU8nLCBjdXJyZW50WSwgMTQsICdib2xkJyk7XG4gICAgICAgICAgY3VycmVudFkgKz0gMTU7XG4gIFxuICAgICAgICAgIC8vIENvbnRlbmVkb3IgcGFyYSBkZXRhbGxlc1xuICAgICAgICAgIGNvbnN0IGRldGFpbHNZID0gY3VycmVudFk7XG4gICAgICAgICAgY29uc3QgZGV0YWlsc0hlaWdodCA9IDgwO1xuICAgICAgICAgIGRyYXdSZWN0KG1hcmdpbiwgZGV0YWlsc1ksIHBhZ2VXaWR0aCAtIChtYXJnaW4gKiAyKSwgZGV0YWlsc0hlaWdodCk7XG4gIFxuICAgICAgICAgIGN1cnJlbnRZICs9IDE1O1xuICAgICAgICAgIGN1cnJlbnRZID0gYWRkV3JhcHBlZFRleHQoZGF0YS5kZXRhbGxlLCBtYXJnaW4gKyAxMCwgY3VycmVudFksIHBhZ2VXaWR0aCAtIChtYXJnaW4gKiAyKSAtIDIwLCAxMCk7XG4gICAgICAgICAgY3VycmVudFkgPSBhZGRXcmFwcGVkVGV4dChgRGVzY3JpcGNpw7NuOiAke2RhdGEuZGVzY3JpcHRpb259YCwgbWFyZ2luICsgMTAsIGN1cnJlbnRZLCBwYWdlV2lkdGggLSAobWFyZ2luICogMikgLSAyMCwgMTApO1xuICBcbiAgICAgICAgICBjdXJyZW50WSA9IGRldGFpbHNZICsgZGV0YWlsc0hlaWdodCArIDIwO1xuICBcbiAgICAgICAgICAvLyBBdXRvcml6YWNpw7NuXG4gICAgICAgICAgY29uc3QgYXV0aERhdGEgPSBbXG4gICAgICAgICAgICBbJ0FVVE9SSVpBREEgUE9SOicsIGRhdGEuYXBwcm92ZWRfYnldXG4gICAgICAgICAgXTtcbiAgXG4gICAgICAgICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XG4gICAgICAgICAgICBzdGFydFk6IGN1cnJlbnRZLFxuICAgICAgICAgICAgaGVhZDogW10sXG4gICAgICAgICAgICBib2R5OiBhdXRoRGF0YSxcbiAgICAgICAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgICBjZWxsUGFkZGluZzogMTAsXG4gICAgICAgICAgICAgIGxpbmVDb2xvcjogWzAsIDAsIDBdLFxuICAgICAgICAgICAgICBsaW5lV2lkdGg6IDAuNVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbHVtblN0eWxlczoge1xuICAgICAgICAgICAgICAwOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBjZWxsV2lkdGg6IDE1MCB9LFxuICAgICAgICAgICAgICAxOiB7IGNlbGxXaWR0aDogMzEwIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXJnaW46IHsgbGVmdDogbWFyZ2luLCByaWdodDogbWFyZ2luIH1cbiAgICAgICAgICB9KTtcbiAgXG4gICAgICAgICAgY3VycmVudFkgPSAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFkgKyAzMDtcbiAgXG4gICAgICAgICAgLy8gUGllIGRlIHDDoWdpbmFcbiAgICAgICAgICBjdXJyZW50WSA9IGFkZENlbnRlcmVkVGV4dCgnRmF2b3IgYWRqdW50YXIgbGEgb3JkZW4gZGUgdmVudGEgbyBmYWN0dXJhJywgY3VycmVudFksIDEyLCAnYm9sZCcpO1xuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KGRhdGEubWFpbCwgY3VycmVudFksIDEwKTtcbiAgXG4gICAgICAgICAgLy8gR2VuZXJhciBlbCBQREZcbiAgICAgICAgICBkb2Mub3V0cHV0KCdkYXRhdXJsbmV3d2luZG93JywgeyBmaWxlbmFtZTogJ29yZGVuX2NvbWJ1c3RpYmxlLnBkZicgfSk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgXG5cbiAgZ2VuZXJhdGVGdWVsT3JkZXJQcm9mZXNpb25hbFBERihkYXRhOiBGdWVsT3JkZXJEYXRhLCBvcHRpb25zPzoge1xuICAgIGZvcm1hdD86ICdsZXR0ZXInIHwgJ2E0JztcbiAgICBkb3dubG9hZD86IGJvb2xlYW47XG4gICAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPGpzUERGPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgICAgZm9ybWF0OiAnbGV0dGVyJyxcbiAgICAgICAgICBkb3dubG9hZDogdHJ1ZSxcbiAgICAgICAgICBmaWxlbmFtZTogJ29yZGVuX2NvbWJ1c3RpYmxlLnBkZicsXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRvYyA9IG5ldyBqc1BERigncCcsICdwdCcsIG9wdHMuZm9ybWF0KTtcbiAgICAgICAgY29uc3QgcGFnZVdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCk7XG4gICAgICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IG1hcmdpbiA9IDQwO1xuICAgICAgICBsZXQgY3VycmVudFkgPSBtYXJnaW47XG5cbiAgICAgICAgLy8gQ29sb3JlcyBjb3Jwb3JhdGl2b3NcbiAgICAgICAgY29uc3QgcHJpbWFyeUNvbG9yID0gWzQxLCAxMjgsIDE4NV07IC8vIEF6dWxcbiAgICAgICAgY29uc3Qgc2Vjb25kYXJ5Q29sb3IgPSBbNTIsIDczLCA5NF07IC8vIEdyaXMgb3NjdXJvXG4gICAgICAgIGNvbnN0IGFjY2VudENvbG9yID0gWzIzMCwgMTI2LCAzNF07IC8vIE5hcmFuamFcblxuICAgICAgICAvLyA9PT0gRU5DQUJFWkFETyBQUklOQ0lQQUwgPT09XG4gICAgICAgIHRoaXMuYWRkSGVhZGVyKGRvYywgZGF0YSwgbWFyZ2luLCBjdXJyZW50WSwgcGFnZVdpZHRoLCBwcmltYXJ5Q29sb3IpO1xuICAgICAgICBjdXJyZW50WSA9IDE0MDtcblxuICAgICAgICAvLyA9PT0gVMONVFVMTyBERUwgRE9DVU1FTlRPID09PVxuICAgICAgICBjdXJyZW50WSA9IHRoaXMuYWRkRG9jdW1lbnRUaXRsZShkb2MsIGRhdGEsIGN1cnJlbnRZLCBwYWdlV2lkdGgsIGFjY2VudENvbG9yKTtcbiAgICAgICAgY3VycmVudFkgKz0gMjU7XG5cbiAgICAgICAgLy8gPT09IElORk9STUFDScOTTiBQUklOQ0lQQUwgPT09XG4gICAgICAgIGN1cnJlbnRZID0gdGhpcy5hZGRNYWluSW5mbyhkb2MsIGRhdGEsIGN1cnJlbnRZLCBtYXJnaW4sIHBhZ2VXaWR0aCk7XG4gICAgICAgIGN1cnJlbnRZICs9IDIwO1xuXG4gICAgICAgIC8vID09PSBEQVRPUyBERUwgUFJPVkVFRE9SID09PVxuICAgICAgICBjdXJyZW50WSA9IHRoaXMuYWRkUHJvdmlkZXJJbmZvKGRvYywgZGF0YSwgY3VycmVudFksIG1hcmdpbiwgcGFnZVdpZHRoLCBzZWNvbmRhcnlDb2xvcik7XG4gICAgICAgIGN1cnJlbnRZICs9IDIwO1xuXG4gICAgICAgIC8vID09PSBERVRBTExFUyBERUwgU0VSVklDSU8gPT09XG4gICAgICAgIGN1cnJlbnRZID0gdGhpcy5hZGRTZXJ2aWNlRGV0YWlscyhkb2MsIGRhdGEsIGN1cnJlbnRZLCBtYXJnaW4sIHBhZ2VXaWR0aCwgc2Vjb25kYXJ5Q29sb3IpO1xuICAgICAgICBjdXJyZW50WSArPSAyMDtcblxuICAgICAgICAvLyA9PT0gQVVUT1JJWkFDScOTTiA9PT1cbiAgICAgICAgY3VycmVudFkgPSB0aGlzLmFkZEF1dGhvcml6YXRpb24oZG9jLCBkYXRhLCBjdXJyZW50WSwgbWFyZ2luLCBwYWdlV2lkdGgpO1xuICAgICAgICBjdXJyZW50WSArPSAzMDtcblxuICAgICAgICAvLyA9PT0gUElFIERFIFDDgUdJTkEgPT09XG4gICAgICAgIHRoaXMuYWRkRm9vdGVyKGRvYywgZGF0YSwgcGFnZUhlaWdodCAtIDgwLCBwYWdlV2lkdGgsIHByaW1hcnlDb2xvcik7XG5cbiAgICAgICAgLy8gPT09IEdFTkVSQVIvREVTQ0FSR0FSID09PVxuICAgICAgICBpZiAob3B0cy5kb3dubG9hZCkge1xuICAgICAgICAgIGRvYy5vdXRwdXQoJ2RhdGF1cmxuZXd3aW5kb3cnLCB7IGZpbGVuYW1lOiBvcHRzLmZpbGVuYW1lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShkb2MpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSGVhZGVyKGRvYzoganNQREYsIGRhdGE6IEZ1ZWxPcmRlckRhdGEsIG1hcmdpbjogbnVtYmVyLCB5OiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiB2b2lkIHtcbiAgICAvLyBGb25kbyBkZWwgZW5jYWJlemFkb1xuICAgIGRvYy5zZXRGaWxsQ29sb3IoY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7XG4gICAgZG9jLnJlY3QobWFyZ2luLCB5LCBwYWdlV2lkdGggLSAobWFyZ2luICogMiksIDgwLCAnRicpO1xuXG4gICAgLy8gVGV4dG8gZGVsIGVuY2FiZXphZG8gZW4gYmxhbmNvXG4gICAgZG9jLnNldFRleHRDb2xvcigyNTUsIDI1NSwgMjU1KTtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMTgpO1xuICAgIFxuICAgIGNvbnN0IGNvbXBhbnlOYW1lID0gZGF0YS5uYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgbmFtZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChjb21wYW55TmFtZSk7XG4gICAgZG9jLnRleHQoY29tcGFueU5hbWUsIChwYWdlV2lkdGggLSBuYW1lV2lkdGgpIC8gMiwgeSArIDI1KTtcblxuICAgIGRvYy5zZXRGb250U2l6ZSgxMik7XG4gICAgY29uc3Qgbml0VGV4dCA9IGBOSVQ6ICR7ZGF0YS5uaXR9YDtcbiAgICBjb25zdCBuaXRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgobml0VGV4dCk7XG4gICAgZG9jLnRleHQobml0VGV4dCwgKHBhZ2VXaWR0aCAtIG5pdFdpZHRoKSAvIDIsIHkgKyA0NSk7XG5cbiAgICBkb2Muc2V0Rm9udFNpemUoMTApO1xuICAgIGNvbnN0IGFkZHJlc3NUZXh0ID0gYCR7ZGF0YS5hZGRyZXNzfSAtIFRFTDogJHtkYXRhLnRlbGVwaG9uZX1gO1xuICAgIGNvbnN0IGFkZHJlc3NXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoYWRkcmVzc1RleHQpO1xuICAgIGRvYy50ZXh0KGFkZHJlc3NUZXh0LCAocGFnZVdpZHRoIC0gYWRkcmVzc1dpZHRoKSAvIDIsIHkgKyA2NSk7XG5cbiAgICAvLyBSZXNldGVhciBjb2xvciBkZSB0ZXh0b1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XG4gIH1cblxuICBwcml2YXRlIGFkZERvY3VtZW50VGl0bGUoZG9jOiBqc1BERiwgZGF0YTogRnVlbE9yZGVyRGF0YSwgeTogbnVtYmVyLCBwYWdlV2lkdGg6IG51bWJlciwgY29sb3I6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyMCk7XG4gICAgXG4gICAgY29uc3QgdGl0bGUgPSAnT1JERU4gREUgQ09NQlVTVElCTEUnO1xuICAgIGNvbnN0IHRpdGxlV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKHRpdGxlKTtcbiAgICBkb2MudGV4dCh0aXRsZSwgKHBhZ2VXaWR0aCAtIHRpdGxlV2lkdGgpIC8gMiwgeSk7XG5cbiAgICBkb2Muc2V0Rm9udFNpemUoMTYpO1xuICAgIGNvbnN0IG51bWJlclRleHQgPSBgTsKwICR7ZGF0YS5jb25zZWN1dGl2ZX1gO1xuICAgIGNvbnN0IG51bWJlcldpZHRoID0gZG9jLmdldFRleHRXaWR0aChudW1iZXJUZXh0KTtcbiAgICBkb2MudGV4dChudW1iZXJUZXh0LCAocGFnZVdpZHRoIC0gbnVtYmVyV2lkdGgpIC8gMiwgeSArIDI1KTtcblxuICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XG4gICAgcmV0dXJuIHkgKyA0MDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTWFpbkluZm8oZG9jOiBqc1BERiwgZGF0YTogRnVlbE9yZGVyRGF0YSwgeTogbnVtYmVyLCBtYXJnaW46IG51bWJlciwgcGFnZVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRhYmxlRGF0YSA9IFtcbiAgICAgIFtcbiAgICAgICAgeyBjb250ZW50OiAnw4FyZWE6Jywgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBmaWxsQ29sb3I6IFsyNDAsIDI0MCwgMjQwXSB9IH0sXG4gICAgICAgIHsgY29udGVudDogZGF0YS5hcmVhLCBzdHlsZXM6IHt9IH0sXG4gICAgICAgIHsgY29udGVudDogJ0PDs2RpZ286Jywgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBmaWxsQ29sb3I6IFsyNDAsIDI0MCwgMjQwXSB9IH0sXG4gICAgICAgIHsgY29udGVudDogZGF0YS5jb2RlLCBzdHlsZXM6IHt9IH0sXG4gICAgICAgIHsgY29udGVudDogJ0ZlY2hhOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZmlsbENvbG9yOiBbMjQwLCAyNDAsIDI0MF0gfSB9LFxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEuZGF0ZSwgc3R5bGVzOiB7fSB9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICB7IGNvbnRlbnQ6ICdPcGVyYXJpbzonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLnJlc3BvbnNpYmxlLCBzdHlsZXM6IHsgY29sU3BhbjogMyB9IH0sXG4gICAgICAgIHsgY29udGVudDogJ09kw7NtZXRybzonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLm9kb21ldGVyLCBzdHlsZXM6IHt9IH1cbiAgICAgIF1cbiAgICBdO1xuXG4gICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XG4gICAgICBzdGFydFk6IHksXG4gICAgICBib2R5OiB0YWJsZURhdGEsXG4gICAgICB0aGVtZTogJ2dyaWQnLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIGZvbnRTaXplOiAxMSxcbiAgICAgICAgY2VsbFBhZGRpbmc6IDgsXG4gICAgICAgIGxpbmVDb2xvcjogWzIwMCwgMjAwLCAyMDBdLFxuICAgICAgICBsaW5lV2lkdGg6IDAuNVxuICAgICAgfSxcbiAgICAgIGNvbHVtblN0eWxlczoge1xuICAgICAgICAwOiB7IGNlbGxXaWR0aDogNzAgfSxcbiAgICAgICAgMTogeyBjZWxsV2lkdGg6IDEwMCB9LFxuICAgICAgICAyOiB7IGNlbGxXaWR0aDogNzAgfSxcbiAgICAgICAgMzogeyBjZWxsV2lkdGg6IDgwIH0sXG4gICAgICAgIDQ6IHsgY2VsbFdpZHRoOiA3MCB9LFxuICAgICAgICA1OiB7IGNlbGxXaWR0aDogODAgfVxuICAgICAgfSxcbiAgICAgIG1hcmdpbjogeyBsZWZ0OiBtYXJnaW4sIHJpZ2h0OiBtYXJnaW4gfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIChkb2MgYXMgYW55KS5sYXN0QXV0b1RhYmxlLmZpbmFsWTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHJvdmlkZXJJbmZvKGRvYzoganNQREYsIGRhdGE6IEZ1ZWxPcmRlckRhdGEsIHk6IG51bWJlciwgbWFyZ2luOiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIC8vIFTDrXR1bG8gZGUgc2VjY2nDs25cbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxNCk7XG4gICAgY29uc3QgdGl0bGUgPSAnREFUT1MgREVMIFBST1ZFRURPUic7XG4gICAgY29uc3QgdGl0bGVXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGl0bGUpO1xuICAgIGRvYy50ZXh0KHRpdGxlLCAocGFnZVdpZHRoIC0gdGl0bGVXaWR0aCkgLyAyLCB5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKDAsIDAsIDApO1xuXG4gICAgY29uc3QgdGFibGVEYXRhID0gW1xuICAgICAgW1xuICAgICAgICB7IGNvbnRlbnQ6ICdMdWdhcjonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLm5hbWVQbGFjZSwgc3R5bGVzOiB7fSB9LFxuICAgICAgICB7IGNvbnRlbnQ6ICdEaXJlY2Npw7NuOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZmlsbENvbG9yOiBbMjQwLCAyNDAsIDI0MF0gfSB9LFxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEuYWRkcmVzc1BsYWNlLCBzdHlsZXM6IHt9IH1cbiAgICAgIF1cbiAgICBdO1xuXG4gICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XG4gICAgICBzdGFydFk6IHkgKyAyMCxcbiAgICAgIGJvZHk6IHRhYmxlRGF0YSxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFNpemU6IDExLFxuICAgICAgICBjZWxsUGFkZGluZzogOCxcbiAgICAgICAgbGluZUNvbG9yOiBbMjAwLCAyMDAsIDIwMF0sXG4gICAgICAgIGxpbmVXaWR0aDogMC41XG4gICAgICB9LFxuICAgICAgY29sdW1uU3R5bGVzOiB7XG4gICAgICAgIDA6IHsgY2VsbFdpZHRoOiA4MCB9LFxuICAgICAgICAxOiB7IGNlbGxXaWR0aDogMTYwIH0sXG4gICAgICAgIDI6IHsgY2VsbFdpZHRoOiA4MCB9LFxuICAgICAgICAzOiB7IGNlbGxXaWR0aDogMTUwIH1cbiAgICAgIH0sXG4gICAgICBtYXJnaW46IHsgbGVmdDogbWFyZ2luLCByaWdodDogbWFyZ2luIH1cbiAgICB9KTtcblxuICAgIHJldHVybiAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFk7XG4gIH1cblxuICBwcml2YXRlIGFkZFNlcnZpY2VEZXRhaWxzKGRvYzoganNQREYsIGRhdGE6IEZ1ZWxPcmRlckRhdGEsIHk6IG51bWJlciwgbWFyZ2luOiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIC8vIFTDrXR1bG8gZGUgc2VjY2nDs25cbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxNCk7XG4gICAgY29uc3QgdGl0bGUgPSAnREVUQUxMRVMgREVMIFNFUlZJQ0lPJztcbiAgICBjb25zdCB0aXRsZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0aXRsZSk7XG4gICAgZG9jLnRleHQodGl0bGUsIChwYWdlV2lkdGggLSB0aXRsZVdpZHRoKSAvIDIsIHkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XG5cbiAgICAvLyBQcmVwYXJhciB0ZXh0byBwYXJhIGNhbGN1bGFyIGFsdHVyYSBuZWNlc2FyaWFcbiAgICBjb25zdCBib3hZID0geSArIDIwO1xuICAgIGNvbnN0IGJveFdpZHRoID0gcGFnZVdpZHRoIC0gKG1hcmdpbiAqIDIpO1xuICAgIGNvbnN0IHRleHRNYXJnaW4gPSBtYXJnaW4gKyAxNTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IGJveFdpZHRoIC0gMzA7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IDE1O1xuICAgIGNvbnN0IG1pbkJveEhlaWdodCA9IDYwOyAvLyBBbHR1cmEgbcOtbmltYSBkZWwgY29udGVuZWRvclxuICAgIGNvbnN0IHBhZGRpbmcgPSA0MDsgLy8gUGFkZGluZyBzdXBlcmlvciBlIGluZmVyaW9yXG5cbiAgICAvLyBDYWxjdWxhciBsw61uZWFzIGRlIHRleHRvIG5lY2VzYXJpYXNcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XG4gICAgXG4gICAgbGV0IHRvdGFsTGluZXMgPSAwO1xuXG4gICAgLy8gQ29udGFyIGzDrW5lYXMgZGVsIGRldGFsbGVcbiAgICBpZiAoZGF0YS5kZXRhbGxlICYmIGRhdGEuZGV0YWxsZS50cmltKCkpIHtcbiAgICAgIGNvbnN0IGRldGFsbGVMaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUoZGF0YS5kZXRhbGxlLnRyaW0oKSwgbWF4V2lkdGgpO1xuICAgICAgdG90YWxMaW5lcyArPSBkZXRhbGxlTGluZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIENvbnRhciBsw61uZWFzIGRlIGxhIGRlc2NyaXBjacOzbiAoaW5jbHV5ZSBldGlxdWV0YSBcIkRlc2NyaXBjacOzbjpcIilcbiAgICBpZiAoZGF0YS5kZXNjcmlwdGlvbiAmJiBkYXRhLmRlc2NyaXB0aW9uLnRyaW0oKSkge1xuICAgICAgdG90YWxMaW5lcyArPSAyOyAvLyBVbmEgbMOtbmVhIHBhcmEgXCJEZXNjcmlwY2nDs246XCIgKyBlc3BhY2lvXG4gICAgICBjb25zdCBkZXNjTGluZXMgPSBkb2Muc3BsaXRUZXh0VG9TaXplKGRhdGEuZGVzY3JpcHRpb24udHJpbSgpLCBtYXhXaWR0aCk7XG4gICAgICB0b3RhbExpbmVzICs9IGRlc2NMaW5lcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXIgYWx0dXJhIG5lY2VzYXJpYSBiYXNhZGEgZW4gZWwgY29udGVuaWRvXG4gICAgY29uc3QgY29udGVudEhlaWdodCA9IE1hdGgubWF4KHRvdGFsTGluZXMgKiBsaW5lSGVpZ2h0LCAzMCk7IC8vIE3DrW5pbW8gMzBwdCBwYXJhIGNvbnRlbmlkb1xuICAgIGNvbnN0IGJveEhlaWdodCA9IE1hdGgubWF4KG1pbkJveEhlaWdodCwgY29udGVudEhlaWdodCArIHBhZGRpbmcpO1xuXG4gICAgLy8gVmVyaWZpY2FyIHNpIG5lY2VzaXRhbW9zIHVuYSBudWV2YSBww6FnaW5hXG4gICAgY29uc3QgcGFnZUhlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcbiAgICBjb25zdCByZW1haW5pbmdTcGFjZSA9IHBhZ2VIZWlnaHQgLSBib3hZIC0gMTAwOyAvLyBEZWphciBlc3BhY2lvIHBhcmEgZm9vdGVyXG4gICAgXG4gICAgbGV0IGZpbmFsQm94WSA9IGJveFk7XG4gICAgaWYgKGJveEhlaWdodCA+IHJlbWFpbmluZ1NwYWNlKSB7XG4gICAgICAvLyBBw7FhZGlyIG51ZXZhIHDDoWdpbmFcbiAgICAgIGRvYy5hZGRQYWdlKCk7XG4gICAgICBmaW5hbEJveFkgPSBtYXJnaW4gKyA0MDsgLy8gUG9zaWNpw7NuIGVuIG51ZXZhIHDDoWdpbmFcbiAgICB9XG5cbiAgICAvLyBEaWJ1amFyIGNvbnRlbmVkb3IgY29uIGFsdHVyYSBkaW7DoW1pY2FcbiAgICAvLyBGb25kbyBncmlzIGNsYXJvXG4gICAgZG9jLnNldEZpbGxDb2xvcigyNTAsIDI1MCwgMjUwKTtcbiAgICBkb2MucmVjdChtYXJnaW4sIGZpbmFsQm94WSwgYm94V2lkdGgsIGJveEhlaWdodCwgJ0YnKTtcbiAgICBcbiAgICAvLyBCb3JkZVxuICAgIGRvYy5zZXREcmF3Q29sb3IoMjAwLCAyMDAsIDIwMCk7XG4gICAgZG9jLnJlY3QobWFyZ2luLCBmaW5hbEJveFksIGJveFdpZHRoLCBib3hIZWlnaHQsICdTJyk7XG5cbiAgICAvLyBBw7FhZGlyIGNvbnRlbmlkbyBkZSB0ZXh0b1xuICAgIGxldCB0ZXh0WSA9IGZpbmFsQm94WSArIDIwO1xuXG4gICAgLy8gQcOxYWRpciBkZXRhbGxlIHNpIGV4aXN0ZVxuICAgIGlmIChkYXRhLmRldGFsbGUgJiYgZGF0YS5kZXRhbGxlLnRyaW0oKSkge1xuICAgICAgY29uc3QgZGV0YWxsZUxpbmVzID0gZG9jLnNwbGl0VGV4dFRvU2l6ZShkYXRhLmRldGFsbGUudHJpbSgpLCBtYXhXaWR0aCk7XG4gICAgICBkb2MudGV4dChkZXRhbGxlTGluZXMsIHRleHRNYXJnaW4sIHRleHRZKTtcbiAgICAgIHRleHRZICs9IGRldGFsbGVMaW5lcy5sZW5ndGggKiBsaW5lSGVpZ2h0ICsgMTA7IC8vIEVzcGFjaW8gZXh0cmEgZGVzcHXDqXMgZGVsIGRldGFsbGVcbiAgICB9XG5cbiAgICAvLyBBw7FhZGlyIGRlc2NyaXBjacOzbiBzaSBleGlzdGVcbiAgICBpZiAoZGF0YS5kZXNjcmlwdGlvbiAmJiBkYXRhLmRlc2NyaXB0aW9uLnRyaW0oKSkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgICBkb2MudGV4dCgnRGVzY3JpcGNpw7NuOicsIHRleHRNYXJnaW4sIHRleHRZKTtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICB0ZXh0WSArPSBsaW5lSGVpZ2h0O1xuICAgICAgXG4gICAgICBjb25zdCBkZXNjTGluZXMgPSBkb2Muc3BsaXRUZXh0VG9TaXplKGRhdGEuZGVzY3JpcHRpb24udHJpbSgpLCBtYXhXaWR0aCk7XG4gICAgICBcbiAgICAgIC8vIFZlcmlmaWNhciBzaSBuZWNlc2l0YW1vcyBtYW5lamFyIGNvbnRlbmlkbyBtdXkgbGFyZ29cbiAgICAgIGNvbnN0IHJlbWFpbmluZ0hlaWdodCA9IGZpbmFsQm94WSArIGJveEhlaWdodCAtIHRleHRZIC0gMjA7XG4gICAgICBjb25zdCBtYXhMaW5lc0luU3BhY2UgPSBNYXRoLmZsb29yKHJlbWFpbmluZ0hlaWdodCAvIGxpbmVIZWlnaHQpO1xuICAgICAgXG4gICAgICBpZiAoZGVzY0xpbmVzLmxlbmd0aCA+IG1heExpbmVzSW5TcGFjZSAmJiBtYXhMaW5lc0luU3BhY2UgPiAwKSB7XG4gICAgICAgIC8vIE1vc3RyYXIgbMOtbmVhcyBxdWUgY2FiZW4gZW4gZWwgZXNwYWNpbyBhY3R1YWxcbiAgICAgICAgY29uc3QgY3VycmVudExpbmVzID0gZGVzY0xpbmVzLnNsaWNlKDAsIG1heExpbmVzSW5TcGFjZSk7XG4gICAgICAgIGRvYy50ZXh0KGN1cnJlbnRMaW5lcywgdGV4dE1hcmdpbiwgdGV4dFkpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29udGludWFyIGVuIG51ZXZhIHDDoWdpbmEgc2kgaGF5IG3DoXMgY29udGVuaWRvXG4gICAgICAgIGlmIChkZXNjTGluZXMubGVuZ3RoID4gbWF4TGluZXNJblNwYWNlKSB7XG4gICAgICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgICAgICB0ZXh0WSA9IG1hcmdpbiArIDIwO1xuICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ0xpbmVzID0gZGVzY0xpbmVzLnNsaWNlKG1heExpbmVzSW5TcGFjZSk7XG4gICAgICAgICAgZG9jLnRleHQocmVtYWluaW5nTGluZXMsIHRleHRNYXJnaW4sIHRleHRZKTtcbiAgICAgICAgICByZXR1cm4gdGV4dFkgKyAocmVtYWluaW5nTGluZXMubGVuZ3RoICogbGluZUhlaWdodCkgKyAyMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLnRleHQoZGVzY0xpbmVzLCB0ZXh0TWFyZ2luLCB0ZXh0WSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2kgbm8gaGF5IGNvbnRlbmlkbywgbW9zdHJhciB1biBtZW5zYWplXG4gICAgaWYgKCghZGF0YS5kZXRhbGxlIHx8ICFkYXRhLmRldGFsbGUudHJpbSgpKSAmJiAoIWRhdGEuZGVzY3JpcHRpb24gfHwgIWRhdGEuZGVzY3JpcHRpb24udHJpbSgpKSkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKDE1MCwgMTUwLCAxNTApO1xuICAgICAgZG9jLnRleHQoJ05vIHNlIGhhbiBlc3BlY2lmaWNhZG8gZGV0YWxsZXMgZGVsIHNlcnZpY2lvLicsIHRleHRNYXJnaW4sIHRleHRZKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldEZvbnRTaXplKDExKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmluYWxCb3hZICsgYm94SGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gYXV4aWxpYXIgcGFyYSBtYW5lamFyIHRleHRvIGxhcmdvIHF1ZSBwdWVkZSBuZWNlc2l0YXIgbcO6bHRpcGxlcyBww6FnaW5hc1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRMb25nVGV4dChkb2M6IGpzUERGLCB0ZXh0OiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBtYXhXaWR0aDogbnVtYmVyLCBmb250U2l6ZTogbnVtYmVyID0gMTEpOiBudW1iZXIge1xuICAgIGlmICghdGV4dCB8fCAhdGV4dC50cmltKCkpIHJldHVybiB5O1xuXG4gICAgZG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICBjb25zdCBsaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUodGV4dC50cmltKCksIG1heFdpZHRoKTtcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZm9udFNpemUgKyAzO1xuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCk7XG4gICAgY29uc3QgbWFyZ2luID0gNDA7XG5cbiAgICBsZXQgY3VycmVudFkgPSB5O1xuICAgIGxldCBsaW5lSW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKGxpbmVJbmRleCA8IGxpbmVzLmxlbmd0aCkge1xuICAgICAgLy8gVmVyaWZpY2FyIHNpIG5lY2VzaXRhbW9zIHVuYSBudWV2YSBww6FnaW5hXG4gICAgICBpZiAoY3VycmVudFkgKyBsaW5lSGVpZ2h0ID4gcGFnZUhlaWdodCAtIG1hcmdpbikge1xuICAgICAgICBkb2MuYWRkUGFnZSgpO1xuICAgICAgICBjdXJyZW50WSA9IG1hcmdpbjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXIgY3XDoW50YXMgbMOtbmVhcyBjYWJlbiBlbiBsYSBww6FnaW5hIGFjdHVhbFxuICAgICAgY29uc3QgcmVtYWluaW5nU3BhY2UgPSBwYWdlSGVpZ2h0IC0gY3VycmVudFkgLSBtYXJnaW47XG4gICAgICBjb25zdCBtYXhMaW5lc0luUGFnZSA9IE1hdGguZmxvb3IocmVtYWluaW5nU3BhY2UgLyBsaW5lSGVpZ2h0KTtcbiAgICAgIFxuICAgICAgaWYgKG1heExpbmVzSW5QYWdlID4gMCkge1xuICAgICAgICBjb25zdCBsaW5lc1RvU2hvdyA9IE1hdGgubWluKG1heExpbmVzSW5QYWdlLCBsaW5lcy5sZW5ndGggLSBsaW5lSW5kZXgpO1xuICAgICAgICBjb25zdCBwYWdlTGluZXMgPSBsaW5lcy5zbGljZShsaW5lSW5kZXgsIGxpbmVJbmRleCArIGxpbmVzVG9TaG93KTtcbiAgICAgICAgXG4gICAgICAgIGRvYy50ZXh0KHBhZ2VMaW5lcywgeCwgY3VycmVudFkpO1xuICAgICAgICBjdXJyZW50WSArPSBwYWdlTGluZXMubGVuZ3RoICogbGluZUhlaWdodDtcbiAgICAgICAgbGluZUluZGV4ICs9IGxpbmVzVG9TaG93O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2kgbm8gY2FiZSBuaSB1bmEgbMOtbmVhLCBpciBhIG51ZXZhIHDDoWdpbmFcbiAgICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgICAgY3VycmVudFkgPSBtYXJnaW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRZO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBdXRob3JpemF0aW9uKGRvYzoganNQREYsIGRhdGE6IEZ1ZWxPcmRlckRhdGEsIHk6IG51bWJlciwgbWFyZ2luOiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSBbXG4gICAgICBbXG4gICAgICAgIHsgY29udGVudDogJ0FVVE9SSVpBREEgUE9SOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZm9udFNpemU6IDEyLCBmaWxsQ29sb3I6IFsyNDAsIDI0MCwgMjQwXSB9IH0sXG4gICAgICAgIHsgY29udGVudDogZGF0YS5hcHByb3ZlZF9ieSwgc3R5bGVzOiB7IGZvbnRTaXplOiAxMiB9IH1cbiAgICAgIF1cbiAgICBdO1xuXG4gICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XG4gICAgICBzdGFydFk6IHksXG4gICAgICBib2R5OiB0YWJsZURhdGEsXG4gICAgICB0aGVtZTogJ2dyaWQnLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIGNlbGxQYWRkaW5nOiAxMixcbiAgICAgICAgbGluZUNvbG9yOiBbMjAwLCAyMDAsIDIwMF0sXG4gICAgICAgIGxpbmVXaWR0aDogMC41XG4gICAgICB9LFxuICAgICAgY29sdW1uU3R5bGVzOiB7XG4gICAgICAgIDA6IHsgY2VsbFdpZHRoOiAxNTAgfSxcbiAgICAgICAgMTogeyBjZWxsV2lkdGg6IDMyMCB9XG4gICAgICB9LFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IG1hcmdpbiwgcmlnaHQ6IG1hcmdpbiB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKGRvYyBhcyBhbnkpLmxhc3RBdXRvVGFibGUuZmluYWxZO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRGb290ZXIoZG9jOiBqc1BERiwgZGF0YTogRnVlbE9yZGVyRGF0YSwgeTogbnVtYmVyLCBwYWdlV2lkdGg6IG51bWJlciwgY29sb3I6IG51bWJlcltdKTogdm9pZCB7XG4gICAgLy8gRm9uZG8gZGVsIHBpZSBkZSBww6FnaW5hXG4gICAgZG9jLnNldEZpbGxDb2xvcihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcbiAgICBkb2MucmVjdCg0MCwgeSwgcGFnZVdpZHRoIC0gODAsIDYwLCAnRicpO1xuXG4gICAgLy8gVGV4dG8gZW4gYmxhbmNvXG4gICAgZG9jLnNldFRleHRDb2xvcigyNTUsIDI1NSwgMjU1KTtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMTIpO1xuICAgIFxuICAgIGNvbnN0IGluc3RydWN0aW9uID0gJ0Zhdm9yIGFkanVudGFyIGxhIG9yZGVuIGRlIHZlbnRhIG8gZmFjdHVyYSc7XG4gICAgY29uc3QgaW5zdFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChpbnN0cnVjdGlvbik7XG4gICAgZG9jLnRleHQoaW5zdHJ1Y3Rpb24sIChwYWdlV2lkdGggLSBpbnN0V2lkdGgpIC8gMiwgeSArIDI1KTtcblxuICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7XG4gICAgY29uc3QgZW1haWxXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoZGF0YS5tYWlsKTtcbiAgICBkb2MudGV4dChkYXRhLm1haWwsIChwYWdlV2lkdGggLSBlbWFpbFdpZHRoKSAvIDIsIHkgKyA0NSk7XG5cbiAgICAvLyBSZXNldGVhciBjb2xvclxuICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhIFBERiBvcHRpbWl6YWRvIHBhcmEgaW1wcmVzacOzblxuICAgKi9cbiAgZ2VuZXJhdGVGb3JQcmludChkYXRhOiBGdWVsT3JkZXJEYXRhKTogUHJvbWlzZTxqc1BERj4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRnVlbE9yZGVyUHJvZmVzaW9uYWxQREYoZGF0YSwge1xuICAgICAgZm9ybWF0OiAnbGV0dGVyJyxcbiAgICAgIGRvd25sb2FkOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYSBQREYgeSBsbyBkZXZ1ZWx2ZSBjb21vIEJsb2IgcGFyYSBlbnbDrW8gcG9yIGVtYWlsXG4gICAqL1xuICBnZW5lcmF0ZUFzQmxvYihkYXRhOiBGdWVsT3JkZXJEYXRhKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVGdWVsT3JkZXJQcm9mZXNpb25hbFBERihkYXRhLCB7IGRvd25sb2FkOiBmYWxzZSB9KVxuICAgICAgICAudGhlbihkb2MgPT4ge1xuICAgICAgICAgIGNvbnN0IHBkZkJsb2IgPSBkb2Mub3V0cHV0KCdibG9iJyk7XG4gICAgICAgICAgcmVzb2x2ZShwZGZCbG9iKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhIFBERiB5IGxvIGRldnVlbHZlIGNvbW8gYmFzZTY0XG4gICAqL1xuICBnZW5lcmF0ZUFzQmFzZTY0KGRhdGE6IEZ1ZWxPcmRlckRhdGEpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdlbmVyYXRlRnVlbE9yZGVyUHJvZmVzaW9uYWxQREYoZGF0YSwgeyBkb3dubG9hZDogZmFsc2UgfSlcbiAgICAgICAgLnRoZW4oZG9jID0+IHtcbiAgICAgICAgICBjb25zdCBiYXNlNjQgPSBkb2Mub3V0cHV0KCdkYXRhdXJpc3RyaW5nJyk7XG4gICAgICAgICAgcmVzb2x2ZShiYXNlNjQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gocmVqZWN0KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { jsPDF } from 'jspdf';
|
|
3
|
+
import 'jspdf-autotable';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class FuelOrderPdfService {
|
|
6
|
+
constructor() { }
|
|
7
|
+
generateFuelOrderPDF(data) {
|
|
8
|
+
//return this.FuelOrderPdfService.generateFuelOrderPDF(data);
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
try {
|
|
11
|
+
const doc = new jsPDF('p', 'pt', 'letter'); // Tamaño carta fijo
|
|
12
|
+
const pageWidth = doc.internal.pageSize.getWidth();
|
|
13
|
+
const pageHeight = doc.internal.pageSize.getHeight();
|
|
14
|
+
const margin = 40;
|
|
15
|
+
let currentY = margin;
|
|
16
|
+
// Configurar fuentes
|
|
17
|
+
doc.setFont('helvetica', 'bold');
|
|
18
|
+
doc.setFontSize(16);
|
|
19
|
+
// Función auxiliar para añadir texto centrado
|
|
20
|
+
const addCenteredText = (text, y, fontSize = 12, style = 'normal') => {
|
|
21
|
+
doc.setFont('helvetica', style);
|
|
22
|
+
doc.setFontSize(fontSize);
|
|
23
|
+
const textWidth = doc.getTextWidth(text);
|
|
24
|
+
doc.text(text, (pageWidth - textWidth) / 2, y);
|
|
25
|
+
return y + fontSize + 5;
|
|
26
|
+
};
|
|
27
|
+
// Función auxiliar para añadir texto con ajuste de línea
|
|
28
|
+
const addWrappedText = (text, x, y, maxWidth, fontSize = 10, style = 'normal') => {
|
|
29
|
+
doc.setFont('helvetica', style);
|
|
30
|
+
doc.setFontSize(fontSize);
|
|
31
|
+
const lines = doc.splitTextToSize(text, maxWidth);
|
|
32
|
+
doc.text(lines, x, y);
|
|
33
|
+
return y + (lines.length * fontSize) + 5;
|
|
34
|
+
};
|
|
35
|
+
// Función para dibujar rectángulo con borde
|
|
36
|
+
const drawRect = (x, y, width, height) => {
|
|
37
|
+
doc.rect(x, y, width, height);
|
|
38
|
+
};
|
|
39
|
+
// ENCABEZADO
|
|
40
|
+
currentY = addCenteredText(data.name.toUpperCase(), currentY, 16, 'bold');
|
|
41
|
+
currentY = addCenteredText(`NIT: ${data.nit}`, currentY, 12, 'bold');
|
|
42
|
+
currentY = addCenteredText(data.address, currentY, 10);
|
|
43
|
+
currentY = addCenteredText(`TEL: ${data.telephone}`, currentY, 10);
|
|
44
|
+
currentY += 20;
|
|
45
|
+
// Título del documento
|
|
46
|
+
currentY = addCenteredText('ORDEN DE COMBUSTIBLE', currentY, 18, 'bold');
|
|
47
|
+
currentY = addCenteredText(`N°: ${data.consecutive}`, currentY, 14, 'bold');
|
|
48
|
+
currentY += 20;
|
|
49
|
+
// Información principal en tabla
|
|
50
|
+
const tableData = [
|
|
51
|
+
['Área:', data.area, 'Código:', data.code, 'Fecha:', data.date],
|
|
52
|
+
['Operario:', data.responsible, 'Odómetro:', data.odometer, '', '']
|
|
53
|
+
];
|
|
54
|
+
doc.autoTable({
|
|
55
|
+
startY: currentY,
|
|
56
|
+
head: [],
|
|
57
|
+
body: tableData,
|
|
58
|
+
theme: 'grid',
|
|
59
|
+
styles: {
|
|
60
|
+
fontSize: 10,
|
|
61
|
+
cellPadding: 8,
|
|
62
|
+
lineColor: [0, 0, 0],
|
|
63
|
+
lineWidth: 0.5
|
|
64
|
+
},
|
|
65
|
+
columnStyles: {
|
|
66
|
+
0: { fontStyle: 'bold', cellWidth: 60 },
|
|
67
|
+
1: { cellWidth: 120 },
|
|
68
|
+
2: { fontStyle: 'bold', cellWidth: 60 },
|
|
69
|
+
3: { cellWidth: 80 },
|
|
70
|
+
4: { fontStyle: 'bold', cellWidth: 60 },
|
|
71
|
+
5: { cellWidth: 80 }
|
|
72
|
+
},
|
|
73
|
+
margin: { left: margin, right: margin }
|
|
74
|
+
});
|
|
75
|
+
currentY = doc.lastAutoTable.finalY + 20;
|
|
76
|
+
// Datos del proveedor
|
|
77
|
+
currentY = addCenteredText('DATOS DEL PROVEEDOR', currentY, 14, 'bold');
|
|
78
|
+
currentY += 10;
|
|
79
|
+
const providerData = [
|
|
80
|
+
['Lugar:', data.namePlace, 'Dirección:', data.addressPlace]
|
|
81
|
+
];
|
|
82
|
+
doc.autoTable({
|
|
83
|
+
startY: currentY,
|
|
84
|
+
head: [],
|
|
85
|
+
body: providerData,
|
|
86
|
+
theme: 'grid',
|
|
87
|
+
styles: {
|
|
88
|
+
fontSize: 10,
|
|
89
|
+
cellPadding: 8,
|
|
90
|
+
lineColor: [0, 0, 0],
|
|
91
|
+
lineWidth: 0.5
|
|
92
|
+
},
|
|
93
|
+
columnStyles: {
|
|
94
|
+
0: { fontStyle: 'bold', cellWidth: 80 },
|
|
95
|
+
1: { cellWidth: 150 },
|
|
96
|
+
2: { fontStyle: 'bold', cellWidth: 80 },
|
|
97
|
+
3: { cellWidth: 150 }
|
|
98
|
+
},
|
|
99
|
+
margin: { left: margin, right: margin }
|
|
100
|
+
});
|
|
101
|
+
currentY = doc.lastAutoTable.finalY + 20;
|
|
102
|
+
// Detalles del servicio
|
|
103
|
+
currentY = addCenteredText('DETALLES DEL SERVICIO', currentY, 14, 'bold');
|
|
104
|
+
currentY += 15;
|
|
105
|
+
// Contenedor para detalles
|
|
106
|
+
const detailsY = currentY;
|
|
107
|
+
const detailsHeight = 80;
|
|
108
|
+
drawRect(margin, detailsY, pageWidth - (margin * 2), detailsHeight);
|
|
109
|
+
currentY += 15;
|
|
110
|
+
currentY = addWrappedText(data.detalle, margin + 10, currentY, pageWidth - (margin * 2) - 20, 10);
|
|
111
|
+
currentY = addWrappedText(`Descripción: ${data.description}`, margin + 10, currentY, pageWidth - (margin * 2) - 20, 10);
|
|
112
|
+
currentY = detailsY + detailsHeight + 20;
|
|
113
|
+
// Autorización
|
|
114
|
+
const authData = [
|
|
115
|
+
['AUTORIZADA POR:', data.approved_by]
|
|
116
|
+
];
|
|
117
|
+
doc.autoTable({
|
|
118
|
+
startY: currentY,
|
|
119
|
+
head: [],
|
|
120
|
+
body: authData,
|
|
121
|
+
theme: 'grid',
|
|
122
|
+
styles: {
|
|
123
|
+
fontSize: 12,
|
|
124
|
+
cellPadding: 10,
|
|
125
|
+
lineColor: [0, 0, 0],
|
|
126
|
+
lineWidth: 0.5
|
|
127
|
+
},
|
|
128
|
+
columnStyles: {
|
|
129
|
+
0: { fontStyle: 'bold', cellWidth: 150 },
|
|
130
|
+
1: { cellWidth: 310 }
|
|
131
|
+
},
|
|
132
|
+
margin: { left: margin, right: margin }
|
|
133
|
+
});
|
|
134
|
+
currentY = doc.lastAutoTable.finalY + 30;
|
|
135
|
+
// Pie de página
|
|
136
|
+
currentY = addCenteredText('Favor adjuntar la orden de venta o factura', currentY, 12, 'bold');
|
|
137
|
+
currentY = addCenteredText(data.mail, currentY, 10);
|
|
138
|
+
// Generar el PDF
|
|
139
|
+
doc.output('dataurlnewwindow', { filename: 'orden_combustible.pdf' });
|
|
140
|
+
resolve();
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
reject(error);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
generateFuelOrderProfesionalPDF(data, options) {
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
try {
|
|
150
|
+
const opts = {
|
|
151
|
+
format: 'letter',
|
|
152
|
+
download: true,
|
|
153
|
+
filename: 'orden_combustible.pdf',
|
|
154
|
+
...options
|
|
155
|
+
};
|
|
156
|
+
const doc = new jsPDF('p', 'pt', opts.format);
|
|
157
|
+
const pageWidth = doc.internal.pageSize.getWidth();
|
|
158
|
+
const pageHeight = doc.internal.pageSize.getHeight();
|
|
159
|
+
const margin = 40;
|
|
160
|
+
let currentY = margin;
|
|
161
|
+
// Colores corporativos
|
|
162
|
+
const primaryColor = [41, 128, 185]; // Azul
|
|
163
|
+
const secondaryColor = [52, 73, 94]; // Gris oscuro
|
|
164
|
+
const accentColor = [230, 126, 34]; // Naranja
|
|
165
|
+
// === ENCABEZADO PRINCIPAL ===
|
|
166
|
+
this.addHeader(doc, data, margin, currentY, pageWidth, primaryColor);
|
|
167
|
+
currentY = 140;
|
|
168
|
+
// === TÍTULO DEL DOCUMENTO ===
|
|
169
|
+
currentY = this.addDocumentTitle(doc, data, currentY, pageWidth, accentColor);
|
|
170
|
+
currentY += 25;
|
|
171
|
+
// === INFORMACIÓN PRINCIPAL ===
|
|
172
|
+
currentY = this.addMainInfo(doc, data, currentY, margin, pageWidth);
|
|
173
|
+
currentY += 20;
|
|
174
|
+
// === DATOS DEL PROVEEDOR ===
|
|
175
|
+
currentY = this.addProviderInfo(doc, data, currentY, margin, pageWidth, secondaryColor);
|
|
176
|
+
currentY += 20;
|
|
177
|
+
// === DETALLES DEL SERVICIO ===
|
|
178
|
+
currentY = this.addServiceDetails(doc, data, currentY, margin, pageWidth, secondaryColor);
|
|
179
|
+
currentY += 20;
|
|
180
|
+
// === AUTORIZACIÓN ===
|
|
181
|
+
currentY = this.addAuthorization(doc, data, currentY, margin, pageWidth);
|
|
182
|
+
currentY += 30;
|
|
183
|
+
// === PIE DE PÁGINA ===
|
|
184
|
+
this.addFooter(doc, data, pageHeight - 80, pageWidth, primaryColor);
|
|
185
|
+
// === GENERAR/DESCARGAR ===
|
|
186
|
+
if (opts.download) {
|
|
187
|
+
doc.output('dataurlnewwindow', { filename: opts.filename });
|
|
188
|
+
}
|
|
189
|
+
resolve(doc);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
reject(error);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
addHeader(doc, data, margin, y, pageWidth, color) {
|
|
197
|
+
// Fondo del encabezado
|
|
198
|
+
doc.setFillColor(color[0], color[1], color[2]);
|
|
199
|
+
doc.rect(margin, y, pageWidth - (margin * 2), 80, 'F');
|
|
200
|
+
// Texto del encabezado en blanco
|
|
201
|
+
doc.setTextColor(255, 255, 255);
|
|
202
|
+
doc.setFont('helvetica', 'bold');
|
|
203
|
+
doc.setFontSize(18);
|
|
204
|
+
const companyName = data.name.toUpperCase();
|
|
205
|
+
const nameWidth = doc.getTextWidth(companyName);
|
|
206
|
+
doc.text(companyName, (pageWidth - nameWidth) / 2, y + 25);
|
|
207
|
+
doc.setFontSize(12);
|
|
208
|
+
const nitText = `NIT: ${data.nit}`;
|
|
209
|
+
const nitWidth = doc.getTextWidth(nitText);
|
|
210
|
+
doc.text(nitText, (pageWidth - nitWidth) / 2, y + 45);
|
|
211
|
+
doc.setFontSize(10);
|
|
212
|
+
const addressText = `${data.address} - TEL: ${data.telephone}`;
|
|
213
|
+
const addressWidth = doc.getTextWidth(addressText);
|
|
214
|
+
doc.text(addressText, (pageWidth - addressWidth) / 2, y + 65);
|
|
215
|
+
// Resetear color de texto
|
|
216
|
+
doc.setTextColor(0, 0, 0);
|
|
217
|
+
}
|
|
218
|
+
addDocumentTitle(doc, data, y, pageWidth, color) {
|
|
219
|
+
doc.setTextColor(color[0], color[1], color[2]);
|
|
220
|
+
doc.setFont('helvetica', 'bold');
|
|
221
|
+
doc.setFontSize(20);
|
|
222
|
+
const title = 'ORDEN DE COMBUSTIBLE';
|
|
223
|
+
const titleWidth = doc.getTextWidth(title);
|
|
224
|
+
doc.text(title, (pageWidth - titleWidth) / 2, y);
|
|
225
|
+
doc.setFontSize(16);
|
|
226
|
+
const numberText = `N° ${data.consecutive}`;
|
|
227
|
+
const numberWidth = doc.getTextWidth(numberText);
|
|
228
|
+
doc.text(numberText, (pageWidth - numberWidth) / 2, y + 25);
|
|
229
|
+
doc.setTextColor(0, 0, 0);
|
|
230
|
+
return y + 40;
|
|
231
|
+
}
|
|
232
|
+
addMainInfo(doc, data, y, margin, pageWidth) {
|
|
233
|
+
const tableData = [
|
|
234
|
+
[
|
|
235
|
+
{ content: 'Área:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
236
|
+
{ content: data.area, styles: {} },
|
|
237
|
+
{ content: 'Código:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
238
|
+
{ content: data.code, styles: {} },
|
|
239
|
+
{ content: 'Fecha:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
240
|
+
{ content: data.date, styles: {} }
|
|
241
|
+
],
|
|
242
|
+
[
|
|
243
|
+
{ content: 'Operario:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
244
|
+
{ content: data.responsible, styles: { colSpan: 3 } },
|
|
245
|
+
{ content: 'Odómetro:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
246
|
+
{ content: data.odometer, styles: {} }
|
|
247
|
+
]
|
|
248
|
+
];
|
|
249
|
+
doc.autoTable({
|
|
250
|
+
startY: y,
|
|
251
|
+
body: tableData,
|
|
252
|
+
theme: 'grid',
|
|
253
|
+
styles: {
|
|
254
|
+
fontSize: 11,
|
|
255
|
+
cellPadding: 8,
|
|
256
|
+
lineColor: [200, 200, 200],
|
|
257
|
+
lineWidth: 0.5
|
|
258
|
+
},
|
|
259
|
+
columnStyles: {
|
|
260
|
+
0: { cellWidth: 70 },
|
|
261
|
+
1: { cellWidth: 100 },
|
|
262
|
+
2: { cellWidth: 70 },
|
|
263
|
+
3: { cellWidth: 80 },
|
|
264
|
+
4: { cellWidth: 70 },
|
|
265
|
+
5: { cellWidth: 80 }
|
|
266
|
+
},
|
|
267
|
+
margin: { left: margin, right: margin }
|
|
268
|
+
});
|
|
269
|
+
return doc.lastAutoTable.finalY;
|
|
270
|
+
}
|
|
271
|
+
addProviderInfo(doc, data, y, margin, pageWidth, color) {
|
|
272
|
+
// Título de sección
|
|
273
|
+
doc.setTextColor(color[0], color[1], color[2]);
|
|
274
|
+
doc.setFont('helvetica', 'bold');
|
|
275
|
+
doc.setFontSize(14);
|
|
276
|
+
const title = 'DATOS DEL PROVEEDOR';
|
|
277
|
+
const titleWidth = doc.getTextWidth(title);
|
|
278
|
+
doc.text(title, (pageWidth - titleWidth) / 2, y);
|
|
279
|
+
doc.setTextColor(0, 0, 0);
|
|
280
|
+
const tableData = [
|
|
281
|
+
[
|
|
282
|
+
{ content: 'Lugar:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
283
|
+
{ content: data.namePlace, styles: {} },
|
|
284
|
+
{ content: 'Dirección:', styles: { fontStyle: 'bold', fillColor: [240, 240, 240] } },
|
|
285
|
+
{ content: data.addressPlace, styles: {} }
|
|
286
|
+
]
|
|
287
|
+
];
|
|
288
|
+
doc.autoTable({
|
|
289
|
+
startY: y + 20,
|
|
290
|
+
body: tableData,
|
|
291
|
+
theme: 'grid',
|
|
292
|
+
styles: {
|
|
293
|
+
fontSize: 11,
|
|
294
|
+
cellPadding: 8,
|
|
295
|
+
lineColor: [200, 200, 200],
|
|
296
|
+
lineWidth: 0.5
|
|
297
|
+
},
|
|
298
|
+
columnStyles: {
|
|
299
|
+
0: { cellWidth: 80 },
|
|
300
|
+
1: { cellWidth: 160 },
|
|
301
|
+
2: { cellWidth: 80 },
|
|
302
|
+
3: { cellWidth: 150 }
|
|
303
|
+
},
|
|
304
|
+
margin: { left: margin, right: margin }
|
|
305
|
+
});
|
|
306
|
+
return doc.lastAutoTable.finalY;
|
|
307
|
+
}
|
|
308
|
+
addServiceDetails(doc, data, y, margin, pageWidth, color) {
|
|
309
|
+
// Título de sección
|
|
310
|
+
doc.setTextColor(color[0], color[1], color[2]);
|
|
311
|
+
doc.setFont('helvetica', 'bold');
|
|
312
|
+
doc.setFontSize(14);
|
|
313
|
+
const title = 'DETALLES DEL SERVICIO';
|
|
314
|
+
const titleWidth = doc.getTextWidth(title);
|
|
315
|
+
doc.text(title, (pageWidth - titleWidth) / 2, y);
|
|
316
|
+
doc.setTextColor(0, 0, 0);
|
|
317
|
+
// Preparar texto para calcular altura necesaria
|
|
318
|
+
const boxY = y + 20;
|
|
319
|
+
const boxWidth = pageWidth - (margin * 2);
|
|
320
|
+
const textMargin = margin + 15;
|
|
321
|
+
const maxWidth = boxWidth - 30;
|
|
322
|
+
const lineHeight = 15;
|
|
323
|
+
const minBoxHeight = 60; // Altura mínima del contenedor
|
|
324
|
+
const padding = 40; // Padding superior e inferior
|
|
325
|
+
// Calcular líneas de texto necesarias
|
|
326
|
+
doc.setFont('helvetica', 'normal');
|
|
327
|
+
doc.setFontSize(11);
|
|
328
|
+
let totalLines = 0;
|
|
329
|
+
// Contar líneas del detalle
|
|
330
|
+
if (data.detalle && data.detalle.trim()) {
|
|
331
|
+
const detalleLines = doc.splitTextToSize(data.detalle.trim(), maxWidth);
|
|
332
|
+
totalLines += detalleLines.length;
|
|
333
|
+
}
|
|
334
|
+
// Contar líneas de la descripción (incluye etiqueta "Descripción:")
|
|
335
|
+
if (data.description && data.description.trim()) {
|
|
336
|
+
totalLines += 2; // Una línea para "Descripción:" + espacio
|
|
337
|
+
const descLines = doc.splitTextToSize(data.description.trim(), maxWidth);
|
|
338
|
+
totalLines += descLines.length;
|
|
339
|
+
}
|
|
340
|
+
// Calcular altura necesaria basada en el contenido
|
|
341
|
+
const contentHeight = Math.max(totalLines * lineHeight, 30); // Mínimo 30pt para contenido
|
|
342
|
+
const boxHeight = Math.max(minBoxHeight, contentHeight + padding);
|
|
343
|
+
// Verificar si necesitamos una nueva página
|
|
344
|
+
const pageHeight = doc.internal.pageSize.getHeight();
|
|
345
|
+
const remainingSpace = pageHeight - boxY - 100; // Dejar espacio para footer
|
|
346
|
+
let finalBoxY = boxY;
|
|
347
|
+
if (boxHeight > remainingSpace) {
|
|
348
|
+
// Añadir nueva página
|
|
349
|
+
doc.addPage();
|
|
350
|
+
finalBoxY = margin + 40; // Posición en nueva página
|
|
351
|
+
}
|
|
352
|
+
// Dibujar contenedor con altura dinámica
|
|
353
|
+
// Fondo gris claro
|
|
354
|
+
doc.setFillColor(250, 250, 250);
|
|
355
|
+
doc.rect(margin, finalBoxY, boxWidth, boxHeight, 'F');
|
|
356
|
+
// Borde
|
|
357
|
+
doc.setDrawColor(200, 200, 200);
|
|
358
|
+
doc.rect(margin, finalBoxY, boxWidth, boxHeight, 'S');
|
|
359
|
+
// Añadir contenido de texto
|
|
360
|
+
let textY = finalBoxY + 20;
|
|
361
|
+
// Añadir detalle si existe
|
|
362
|
+
if (data.detalle && data.detalle.trim()) {
|
|
363
|
+
const detalleLines = doc.splitTextToSize(data.detalle.trim(), maxWidth);
|
|
364
|
+
doc.text(detalleLines, textMargin, textY);
|
|
365
|
+
textY += detalleLines.length * lineHeight + 10; // Espacio extra después del detalle
|
|
366
|
+
}
|
|
367
|
+
// Añadir descripción si existe
|
|
368
|
+
if (data.description && data.description.trim()) {
|
|
369
|
+
doc.setFont('helvetica', 'bold');
|
|
370
|
+
doc.text('Descripción:', textMargin, textY);
|
|
371
|
+
doc.setFont('helvetica', 'normal');
|
|
372
|
+
textY += lineHeight;
|
|
373
|
+
const descLines = doc.splitTextToSize(data.description.trim(), maxWidth);
|
|
374
|
+
// Verificar si necesitamos manejar contenido muy largo
|
|
375
|
+
const remainingHeight = finalBoxY + boxHeight - textY - 20;
|
|
376
|
+
const maxLinesInSpace = Math.floor(remainingHeight / lineHeight);
|
|
377
|
+
if (descLines.length > maxLinesInSpace && maxLinesInSpace > 0) {
|
|
378
|
+
// Mostrar líneas que caben en el espacio actual
|
|
379
|
+
const currentLines = descLines.slice(0, maxLinesInSpace);
|
|
380
|
+
doc.text(currentLines, textMargin, textY);
|
|
381
|
+
// Continuar en nueva página si hay más contenido
|
|
382
|
+
if (descLines.length > maxLinesInSpace) {
|
|
383
|
+
doc.addPage();
|
|
384
|
+
textY = margin + 20;
|
|
385
|
+
const remainingLines = descLines.slice(maxLinesInSpace);
|
|
386
|
+
doc.text(remainingLines, textMargin, textY);
|
|
387
|
+
return textY + (remainingLines.length * lineHeight) + 20;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
doc.text(descLines, textMargin, textY);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Si no hay contenido, mostrar un mensaje
|
|
395
|
+
if ((!data.detalle || !data.detalle.trim()) && (!data.description || !data.description.trim())) {
|
|
396
|
+
doc.setFont('helvetica', 'italic');
|
|
397
|
+
doc.setFontSize(10);
|
|
398
|
+
doc.setTextColor(150, 150, 150);
|
|
399
|
+
doc.text('No se han especificado detalles del servicio.', textMargin, textY);
|
|
400
|
+
doc.setTextColor(0, 0, 0);
|
|
401
|
+
doc.setFont('helvetica', 'normal');
|
|
402
|
+
doc.setFontSize(11);
|
|
403
|
+
}
|
|
404
|
+
return finalBoxY + boxHeight;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Método auxiliar para manejar texto largo que puede necesitar múltiples páginas
|
|
408
|
+
*/
|
|
409
|
+
addLongText(doc, text, x, y, maxWidth, fontSize = 11) {
|
|
410
|
+
if (!text || !text.trim())
|
|
411
|
+
return y;
|
|
412
|
+
doc.setFontSize(fontSize);
|
|
413
|
+
const lines = doc.splitTextToSize(text.trim(), maxWidth);
|
|
414
|
+
const lineHeight = fontSize + 3;
|
|
415
|
+
const pageHeight = doc.internal.pageSize.getHeight();
|
|
416
|
+
const margin = 40;
|
|
417
|
+
let currentY = y;
|
|
418
|
+
let lineIndex = 0;
|
|
419
|
+
while (lineIndex < lines.length) {
|
|
420
|
+
// Verificar si necesitamos una nueva página
|
|
421
|
+
if (currentY + lineHeight > pageHeight - margin) {
|
|
422
|
+
doc.addPage();
|
|
423
|
+
currentY = margin;
|
|
424
|
+
}
|
|
425
|
+
// Calcular cuántas líneas caben en la página actual
|
|
426
|
+
const remainingSpace = pageHeight - currentY - margin;
|
|
427
|
+
const maxLinesInPage = Math.floor(remainingSpace / lineHeight);
|
|
428
|
+
if (maxLinesInPage > 0) {
|
|
429
|
+
const linesToShow = Math.min(maxLinesInPage, lines.length - lineIndex);
|
|
430
|
+
const pageLines = lines.slice(lineIndex, lineIndex + linesToShow);
|
|
431
|
+
doc.text(pageLines, x, currentY);
|
|
432
|
+
currentY += pageLines.length * lineHeight;
|
|
433
|
+
lineIndex += linesToShow;
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
// Si no cabe ni una línea, ir a nueva página
|
|
437
|
+
doc.addPage();
|
|
438
|
+
currentY = margin;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return currentY;
|
|
442
|
+
}
|
|
443
|
+
addAuthorization(doc, data, y, margin, pageWidth) {
|
|
444
|
+
const tableData = [
|
|
445
|
+
[
|
|
446
|
+
{ content: 'AUTORIZADA POR:', styles: { fontStyle: 'bold', fontSize: 12, fillColor: [240, 240, 240] } },
|
|
447
|
+
{ content: data.approved_by, styles: { fontSize: 12 } }
|
|
448
|
+
]
|
|
449
|
+
];
|
|
450
|
+
doc.autoTable({
|
|
451
|
+
startY: y,
|
|
452
|
+
body: tableData,
|
|
453
|
+
theme: 'grid',
|
|
454
|
+
styles: {
|
|
455
|
+
cellPadding: 12,
|
|
456
|
+
lineColor: [200, 200, 200],
|
|
457
|
+
lineWidth: 0.5
|
|
458
|
+
},
|
|
459
|
+
columnStyles: {
|
|
460
|
+
0: { cellWidth: 150 },
|
|
461
|
+
1: { cellWidth: 320 }
|
|
462
|
+
},
|
|
463
|
+
margin: { left: margin, right: margin }
|
|
464
|
+
});
|
|
465
|
+
return doc.lastAutoTable.finalY;
|
|
466
|
+
}
|
|
467
|
+
addFooter(doc, data, y, pageWidth, color) {
|
|
468
|
+
// Fondo del pie de página
|
|
469
|
+
doc.setFillColor(color[0], color[1], color[2]);
|
|
470
|
+
doc.rect(40, y, pageWidth - 80, 60, 'F');
|
|
471
|
+
// Texto en blanco
|
|
472
|
+
doc.setTextColor(255, 255, 255);
|
|
473
|
+
doc.setFont('helvetica', 'bold');
|
|
474
|
+
doc.setFontSize(12);
|
|
475
|
+
const instruction = 'Favor adjuntar la orden de venta o factura';
|
|
476
|
+
const instWidth = doc.getTextWidth(instruction);
|
|
477
|
+
doc.text(instruction, (pageWidth - instWidth) / 2, y + 25);
|
|
478
|
+
doc.setFontSize(10);
|
|
479
|
+
const emailWidth = doc.getTextWidth(data.mail);
|
|
480
|
+
doc.text(data.mail, (pageWidth - emailWidth) / 2, y + 45);
|
|
481
|
+
// Resetear color
|
|
482
|
+
doc.setTextColor(0, 0, 0);
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Genera PDF optimizado para impresión
|
|
486
|
+
*/
|
|
487
|
+
generateForPrint(data) {
|
|
488
|
+
return this.generateFuelOrderProfesionalPDF(data, {
|
|
489
|
+
format: 'letter',
|
|
490
|
+
download: false
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Genera PDF y lo devuelve como Blob para envío por email
|
|
495
|
+
*/
|
|
496
|
+
generateAsBlob(data) {
|
|
497
|
+
return new Promise((resolve, reject) => {
|
|
498
|
+
this.generateFuelOrderProfesionalPDF(data, { download: false })
|
|
499
|
+
.then(doc => {
|
|
500
|
+
const pdfBlob = doc.output('blob');
|
|
501
|
+
resolve(pdfBlob);
|
|
502
|
+
})
|
|
503
|
+
.catch(reject);
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Genera PDF y lo devuelve como base64
|
|
508
|
+
*/
|
|
509
|
+
generateAsBase64(data) {
|
|
510
|
+
return new Promise((resolve, reject) => {
|
|
511
|
+
this.generateFuelOrderProfesionalPDF(data, { download: false })
|
|
512
|
+
.then(doc => {
|
|
513
|
+
const base64 = doc.output('datauristring');
|
|
514
|
+
resolve(base64);
|
|
515
|
+
})
|
|
516
|
+
.catch(reject);
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
FuelOrderPdfService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FuelOrderPdfService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
521
|
+
FuelOrderPdfService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FuelOrderPdfService, providedIn: 'root' });
|
|
522
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FuelOrderPdfService, decorators: [{
|
|
523
|
+
type: Injectable,
|
|
524
|
+
args: [{
|
|
525
|
+
providedIn: 'root'
|
|
526
|
+
}]
|
|
527
|
+
}], ctorParameters: function () { return []; } });
|
|
528
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVlbC1vcmRlci1wZGYuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zZXJ2aWNlcy9mdWVsLW9yZGVyLXBkZi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLGlCQUFpQixDQUFDOztBQTRCekIsTUFBTSxPQUFPLG1CQUFtQjtJQUU5QixnQkFBZ0IsQ0FBQztJQUVmLG9CQUFvQixDQUFDLElBQW1CO1FBQ3RDLDZEQUE2RDtRQUM3RCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtnQkFDaEUsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQztnQkFFdEIscUJBQXFCO2dCQUNyQixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDakMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFcEIsOENBQThDO2dCQUM5QyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQVksRUFBRSxDQUFTLEVBQUUsV0FBbUIsRUFBRSxFQUFFLFFBQTJCLFFBQVEsRUFB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QUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7aUJBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDVixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMzQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2dIQTdsQlUsbUJBQW1CO29IQUFuQixtQkFBbUIsY0FGbEIsTUFBTTsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBqc1BERiB9IGZyb20gJ2pzcGRmJztcclxuaW1wb3J0ICdqc3BkZi1hdXRvdGFibGUnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVBkZkZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQvdGVtcGxhdGUtcGZkLWZvJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRnVlbE9yZGVyRGF0YSB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIG5pdDogc3RyaW5nO1xyXG4gIGFkZHJlc3M6IHN0cmluZztcclxuICB0ZWxlcGhvbmU6IHN0cmluZztcclxuICBtYWlsOiBzdHJpbmc7XHJcbiAgaW1hZ2U/OiBzdHJpbmc7XHJcbiAgY29kZTogc3RyaW5nO1xyXG4gIGRhdGU6IHN0cmluZztcclxuICByZXNwb25zaWJsZTogc3RyaW5nO1xyXG4gIGlkX3BsYWNlOiBzdHJpbmc7XHJcbiAgYXBwcm92ZWRfYnk6IHN0cmluZztcclxuICBkZXRhbGxlOiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZztcclxuICBjb25zZWN1dGl2ZTogc3RyaW5nO1xyXG4gIG5hbWVQbGFjZTogc3RyaW5nO1xyXG4gIGFkZHJlc3NQbGFjZTogc3RyaW5nO1xyXG4gIGFyZWE6IHN0cmluZztcclxuICBvZG9tZXRlcjogc3RyaW5nO1xyXG4gIGludm9pY2VSZWZlcmVuY2U/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZ1ZWxPcmRlclBkZlNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAgIGdlbmVyYXRlRnVlbE9yZGVyUERGKGRhdGE6IFRlbXBsYXRlUGRmRm8pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgLy9yZXR1cm4gdGhpcy5GdWVsT3JkZXJQZGZTZXJ2aWNlLmdlbmVyYXRlRnVlbE9yZGVyUERGKGRhdGEpO1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBkb2MgPSBuZXcganNQREYoJ3AnLCAncHQnLCAnbGV0dGVyJyk7IC8vIFRhbWHDsW8gY2FydGEgZmlqb1xyXG4gICAgICAgICAgY29uc3QgcGFnZVdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCk7XHJcbiAgICAgICAgICBjb25zdCBwYWdlSGVpZ2h0ID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpO1xyXG4gICAgICAgICAgY29uc3QgbWFyZ2luID0gNDA7XHJcbiAgICAgICAgICBsZXQgY3VycmVudFkgPSBtYXJnaW47XHJcbiAgXHJcbiAgICAgICAgICAvLyBDb25maWd1cmFyIGZ1ZW50ZXNcclxuICAgICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICAgICAgZG9jLnNldEZvbnRTaXplKDE2KTtcclxuICBcclxuICAgICAgICAgIC8vIEZ1bmNpw7NuIGF1eGlsaWFyIHBhcmEgYcOxYWRpciB0ZXh0byBjZW50cmFkb1xyXG4gICAgICAgICAgY29uc3QgYWRkQ2VudGVyZWRUZXh0ID0gKHRleHQ6IHN0cmluZywgeTogbnVtYmVyLCBmb250U2l6ZTogbnVtYmVyID0gMTIsIHN0eWxlOiAnbm9ybWFsJyB8ICdib2xkJyA9ICdub3JtYWwnKSA9PiB7XHJcbiAgICAgICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCBzdHlsZSk7XHJcbiAgICAgICAgICAgIGRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGV4dCk7XHJcbiAgICAgICAgICAgIGRvYy50ZXh0KHRleHQsIChwYWdlV2lkdGggLSB0ZXh0V2lkdGgpIC8gMiwgeSk7XHJcbiAgICAgICAgICAgIHJldHVybiB5ICsgZm9udFNpemUgKyA1O1xyXG4gICAgICAgICAgfTtcclxuICBcclxuICAgICAgICAgIC8vIEZ1bmNpw7NuIGF1eGlsaWFyIHBhcmEgYcOxYWRpciB0ZXh0byBjb24gYWp1c3RlIGRlIGzDrW5lYVxyXG4gICAgICAgICAgY29uc3QgYWRkV3JhcHBlZFRleHQgPSAodGV4dDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgbWF4V2lkdGg6IG51bWJlciwgZm9udFNpemU6IG51bWJlciA9IDEwLCBzdHlsZTogJ25vcm1hbCcgfCAnYm9sZCcgPSAnbm9ybWFsJykgPT4ge1xyXG4gICAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgc3R5bGUpO1xyXG4gICAgICAgICAgICBkb2Muc2V0Rm9udFNpemUoZm9udFNpemUpO1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUodGV4dCwgbWF4V2lkdGgpO1xyXG4gICAgICAgICAgICBkb2MudGV4dChsaW5lcywgeCwgeSk7XHJcbiAgICAgICAgICAgIHJldHVybiB5ICsgKGxpbmVzLmxlbmd0aCAqIGZvbnRTaXplKSArIDU7XHJcbiAgICAgICAgICB9O1xyXG4gIFxyXG4gICAgICAgICAgLy8gRnVuY2nDs24gcGFyYSBkaWJ1amFyIHJlY3TDoW5ndWxvIGNvbiBib3JkZVxyXG4gICAgICAgICAgY29uc3QgZHJhd1JlY3QgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGRvYy5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgfTtcclxuICBcclxuICAgICAgICAgIC8vIEVOQ0FCRVpBRE9cclxuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KGRhdGEubmFtZS50b1VwcGVyQ2FzZSgpLCBjdXJyZW50WSwgMTYsICdib2xkJyk7XHJcbiAgICAgICAgICBjdXJyZW50WSA9IGFkZENlbnRlcmVkVGV4dChgTklUOiAke2RhdGEubml0fWAsIGN1cnJlbnRZLCAxMiwgJ2JvbGQnKTtcclxuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KGRhdGEuYWRkcmVzcywgY3VycmVudFksIDEwKTtcclxuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KGBURUw6ICR7ZGF0YS50ZWxlcGhvbmV9YCwgY3VycmVudFksIDEwKTtcclxuICAgICAgICAgIGN1cnJlbnRZICs9IDIwO1xyXG4gIFxyXG4gICAgICAgICAgLy8gVMOtdHVsbyBkZWwgZG9jdW1lbnRvXHJcbiAgICAgICAgICBjdXJyZW50WSA9IGFkZENlbnRlcmVkVGV4dCgnT1JERU4gREUgQ09NQlVTVElCTEUnLCBjdXJyZW50WSwgMTgsICdib2xkJyk7XHJcbiAgICAgICAgICBjdXJyZW50WSA9IGFkZENlbnRlcmVkVGV4dChgTsKwOiAke2RhdGEuY29uc2VjdXRpdmV9YCwgY3VycmVudFksIDE0LCAnYm9sZCcpO1xyXG4gICAgICAgICAgY3VycmVudFkgKz0gMjA7XHJcbiAgXHJcbiAgICAgICAgICAvLyBJbmZvcm1hY2nDs24gcHJpbmNpcGFsIGVuIHRhYmxhXHJcbiAgICAgICAgICBjb25zdCB0YWJsZURhdGEgPSBbXHJcbiAgICAgICAgICAgIFsnw4FyZWE6JywgZGF0YS5hcmVhLCAnQ8OzZGlnbzonLCBkYXRhLmNvZGUsICdGZWNoYTonLCBkYXRhLmRhdGVdLFxyXG4gICAgICAgICAgICBbJ09wZXJhcmlvOicsIGRhdGEucmVzcG9uc2libGUsICdPZMOzbWV0cm86JywgZGF0YS5vZG9tZXRlciwgJycsICcnXVxyXG4gICAgICAgICAgXTtcclxuICBcclxuICAgICAgICAgIChkb2MgYXMgYW55KS5hdXRvVGFibGUoe1xyXG4gICAgICAgICAgICBzdGFydFk6IGN1cnJlbnRZLFxyXG4gICAgICAgICAgICBoZWFkOiBbXSxcclxuICAgICAgICAgICAgYm9keTogdGFibGVEYXRhLFxyXG4gICAgICAgICAgICB0aGVtZTogJ2dyaWQnLFxyXG4gICAgICAgICAgICBzdHlsZXM6IHtcclxuICAgICAgICAgICAgICBmb250U2l6ZTogMTAsXHJcbiAgICAgICAgICAgICAgY2VsbFBhZGRpbmc6IDgsXHJcbiAgICAgICAgICAgICAgbGluZUNvbG9yOiBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgICAgbGluZVdpZHRoOiAwLjVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29sdW1uU3R5bGVzOiB7XHJcbiAgICAgICAgICAgICAgMDogeyBmb250U3R5bGU6ICdib2xkJywgY2VsbFdpZHRoOiA2MCB9LFxyXG4gICAgICAgICAgICAgIDE6IHsgY2VsbFdpZHRoOiAxMjAgfSxcclxuICAgICAgICAgICAgICAyOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBjZWxsV2lkdGg6IDYwIH0sXHJcbiAgICAgICAgICAgICAgMzogeyBjZWxsV2lkdGg6IDgwIH0sXHJcbiAgICAgICAgICAgICAgNDogeyBmb250U3R5bGU6ICdib2xkJywgY2VsbFdpZHRoOiA2MCB9LFxyXG4gICAgICAgICAgICAgIDU6IHsgY2VsbFdpZHRoOiA4MCB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1hcmdpbjogeyBsZWZ0OiBtYXJnaW4sIHJpZ2h0OiBtYXJnaW4gfVxyXG4gICAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgICBjdXJyZW50WSA9IChkb2MgYXMgYW55KS5sYXN0QXV0b1RhYmxlLmZpbmFsWSArIDIwO1xyXG4gIFxyXG4gICAgICAgICAgLy8gRGF0b3MgZGVsIHByb3ZlZWRvclxyXG4gICAgICAgICAgY3VycmVudFkgPSBhZGRDZW50ZXJlZFRleHQoJ0RBVE9TIERFTCBQUk9WRUVET1InLCBjdXJyZW50WSwgMTQsICdib2xkJyk7XHJcbiAgICAgICAgICBjdXJyZW50WSArPSAxMDtcclxuICBcclxuICAgICAgICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IFtcclxuICAgICAgICAgICAgWydMdWdhcjonLCBkYXRhLm5hbWVQbGFjZSwgJ0RpcmVjY2nDs246JywgZGF0YS5hZGRyZXNzUGxhY2VdXHJcbiAgICAgICAgICBdO1xyXG4gIFxyXG4gICAgICAgICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XHJcbiAgICAgICAgICAgIHN0YXJ0WTogY3VycmVudFksXHJcbiAgICAgICAgICAgIGhlYWQ6IFtdLFxyXG4gICAgICAgICAgICBib2R5OiBwcm92aWRlckRhdGEsXHJcbiAgICAgICAgICAgIHRoZW1lOiAnZ3JpZCcsXHJcbiAgICAgICAgICAgIHN0eWxlczoge1xyXG4gICAgICAgICAgICAgIGZvbnRTaXplOiAxMCxcclxuICAgICAgICAgICAgICBjZWxsUGFkZGluZzogOCxcclxuICAgICAgICAgICAgICBsaW5lQ29sb3I6IFswLCAwLCAwXSxcclxuICAgICAgICAgICAgICBsaW5lV2lkdGg6IDAuNVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb2x1bW5TdHlsZXM6IHtcclxuICAgICAgICAgICAgICAwOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBjZWxsV2lkdGg6IDgwIH0sXHJcbiAgICAgICAgICAgICAgMTogeyBjZWxsV2lkdGg6IDE1MCB9LFxyXG4gICAgICAgICAgICAgIDI6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGNlbGxXaWR0aDogODAgfSxcclxuICAgICAgICAgICAgICAzOiB7IGNlbGxXaWR0aDogMTUwIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWFyZ2luOiB7IGxlZnQ6IG1hcmdpbiwgcmlnaHQ6IG1hcmdpbiB9XHJcbiAgICAgICAgICB9KTtcclxuICBcclxuICAgICAgICAgIGN1cnJlbnRZID0gKGRvYyBhcyBhbnkpLmxhc3RBdXRvVGFibGUuZmluYWxZICsgMjA7XHJcbiAgXHJcbiAgICAgICAgICAvLyBEZXRhbGxlcyBkZWwgc2VydmljaW9cclxuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KCdERVRBTExFUyBERUwgU0VSVklDSU8nLCBjdXJyZW50WSwgMTQsICdib2xkJyk7XHJcbiAgICAgICAgICBjdXJyZW50WSArPSAxNTtcclxuICBcclxuICAgICAgICAgIC8vIENvbnRlbmVkb3IgcGFyYSBkZXRhbGxlc1xyXG4gICAgICAgICAgY29uc3QgZGV0YWlsc1kgPSBjdXJyZW50WTtcclxuICAgICAgICAgIGNvbnN0IGRldGFpbHNIZWlnaHQgPSA4MDtcclxuICAgICAgICAgIGRyYXdSZWN0KG1hcmdpbiwgZGV0YWlsc1ksIHBhZ2VXaWR0aCAtIChtYXJnaW4gKiAyKSwgZGV0YWlsc0hlaWdodCk7XHJcbiAgXHJcbiAgICAgICAgICBjdXJyZW50WSArPSAxNTtcclxuICAgICAgICAgIGN1cnJlbnRZID0gYWRkV3JhcHBlZFRleHQoZGF0YS5kZXRhbGxlLCBtYXJnaW4gKyAxMCwgY3VycmVudFksIHBhZ2VXaWR0aCAtIChtYXJnaW4gKiAyKSAtIDIwLCAxMCk7XHJcbiAgICAgICAgICBjdXJyZW50WSA9IGFkZFdyYXBwZWRUZXh0KGBEZXNjcmlwY2nDs246ICR7ZGF0YS5kZXNjcmlwdGlvbn1gLCBtYXJnaW4gKyAxMCwgY3VycmVudFksIHBhZ2VXaWR0aCAtIChtYXJnaW4gKiAyKSAtIDIwLCAxMCk7XHJcbiAgXHJcbiAgICAgICAgICBjdXJyZW50WSA9IGRldGFpbHNZICsgZGV0YWlsc0hlaWdodCArIDIwO1xyXG4gIFxyXG4gICAgICAgICAgLy8gQXV0b3JpemFjacOzblxyXG4gICAgICAgICAgY29uc3QgYXV0aERhdGEgPSBbXHJcbiAgICAgICAgICAgIFsnQVVUT1JJWkFEQSBQT1I6JywgZGF0YS5hcHByb3ZlZF9ieV1cclxuICAgICAgICAgIF07XHJcbiAgXHJcbiAgICAgICAgICAoZG9jIGFzIGFueSkuYXV0b1RhYmxlKHtcclxuICAgICAgICAgICAgc3RhcnRZOiBjdXJyZW50WSxcclxuICAgICAgICAgICAgaGVhZDogW10sXHJcbiAgICAgICAgICAgIGJvZHk6IGF1dGhEYXRhLFxyXG4gICAgICAgICAgICB0aGVtZTogJ2dyaWQnLFxyXG4gICAgICAgICAgICBzdHlsZXM6IHtcclxuICAgICAgICAgICAgICBmb250U2l6ZTogMTIsXHJcbiAgICAgICAgICAgICAgY2VsbFBhZGRpbmc6IDEwLFxyXG4gICAgICAgICAgICAgIGxpbmVDb2xvcjogWzAsIDAsIDBdLFxyXG4gICAgICAgICAgICAgIGxpbmVXaWR0aDogMC41XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbHVtblN0eWxlczoge1xyXG4gICAgICAgICAgICAgIDA6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGNlbGxXaWR0aDogMTUwIH0sXHJcbiAgICAgICAgICAgICAgMTogeyBjZWxsV2lkdGg6IDMxMCB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1hcmdpbjogeyBsZWZ0OiBtYXJnaW4sIHJpZ2h0OiBtYXJnaW4gfVxyXG4gICAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgICBjdXJyZW50WSA9IChkb2MgYXMgYW55KS5sYXN0QXV0b1RhYmxlLmZpbmFsWSArIDMwO1xyXG4gIFxyXG4gICAgICAgICAgLy8gUGllIGRlIHDDoWdpbmFcclxuICAgICAgICAgIGN1cnJlbnRZID0gYWRkQ2VudGVyZWRUZXh0KCdGYXZvciBhZGp1bnRhciBsYSBvcmRlbiBkZSB2ZW50YSBvIGZhY3R1cmEnLCBjdXJyZW50WSwgMTIsICdib2xkJyk7XHJcbiAgICAgICAgICBjdXJyZW50WSA9IGFkZENlbnRlcmVkVGV4dChkYXRhLm1haWwsIGN1cnJlbnRZLCAxMCk7XHJcbiAgXHJcbiAgICAgICAgICAvLyBHZW5lcmFyIGVsIFBERlxyXG4gICAgICAgICAgZG9jLm91dHB1dCgnZGF0YXVybG5ld3dpbmRvdycsIHsgZmlsZW5hbWU6ICdvcmRlbl9jb21idXN0aWJsZS5wZGYnIH0pO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcblxyXG4gIGdlbmVyYXRlRnVlbE9yZGVyUHJvZmVzaW9uYWxQREYoZGF0YTogRnVlbE9yZGVyRGF0YSwgb3B0aW9ucz86IHtcclxuICAgIGZvcm1hdD86ICdsZXR0ZXInIHwgJ2E0JztcclxuICAgIGRvd25sb2FkPzogYm9vbGVhbjtcclxuICAgIGZpbGVuYW1lPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPGpzUERGPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IG9wdHMgPSB7XHJcbiAgICAgICAgICBmb3JtYXQ6ICdsZXR0ZXInLFxyXG4gICAgICAgICAgZG93bmxvYWQ6IHRydWUsXHJcbiAgICAgICAgICBmaWxlbmFtZTogJ29yZGVuX2NvbWJ1c3RpYmxlLnBkZicsXHJcbiAgICAgICAgICAuLi5vcHRpb25zXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgZG9jID0gbmV3IGpzUERGKCdwJywgJ3B0Jywgb3B0cy5mb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpO1xyXG4gICAgICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCk7XHJcbiAgICAgICAgY29uc3QgbWFyZ2luID0gNDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRZID0gbWFyZ2luO1xyXG5cclxuICAgICAgICAvLyBDb2xvcmVzIGNvcnBvcmF0aXZvc1xyXG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2xvciA9IFs0MSwgMTI4LCAxODVdOyAvLyBBenVsXHJcbiAgICAgICAgY29uc3Qgc2Vjb25kYXJ5Q29sb3IgPSBbNTIsIDczLCA5NF07IC8vIEdyaXMgb3NjdXJvXHJcbiAgICAgICAgY29uc3QgYWNjZW50Q29sb3IgPSBbMjMwLCAxMjYsIDM0XTsgLy8gTmFyYW5qYVxyXG5cclxuICAgICAgICAvLyA9PT0gRU5DQUJFWkFETyBQUklOQ0lQQUwgPT09XHJcbiAgICAgICAgdGhpcy5hZGRIZWFkZXIoZG9jLCBkYXRhLCBtYXJnaW4sIGN1cnJlbnRZLCBwYWdlV2lkdGgsIHByaW1hcnlDb2xvcik7XHJcbiAgICAgICAgY3VycmVudFkgPSAxNDA7XHJcblxyXG4gICAgICAgIC8vID09PSBUw41UVUxPIERFTCBET0NVTUVOVE8gPT09XHJcbiAgICAgICAgY3VycmVudFkgPSB0aGlzLmFkZERvY3VtZW50VGl0bGUoZG9jLCBkYXRhLCBjdXJyZW50WSwgcGFnZVdpZHRoLCBhY2NlbnRDb2xvcik7XHJcbiAgICAgICAgY3VycmVudFkgKz0gMjU7XHJcblxyXG4gICAgICAgIC8vID09PSBJTkZPUk1BQ0nDk04gUFJJTkNJUEFMID09PVxyXG4gICAgICAgIGN1cnJlbnRZID0gdGhpcy5hZGRNYWluSW5mbyhkb2MsIGRhdGEsIGN1cnJlbnRZLCBtYXJnaW4sIHBhZ2VXaWR0aCk7XHJcbiAgICAgICAgY3VycmVudFkgKz0gMjA7XHJcblxyXG4gICAgICAgIC8vID09PSBEQVRPUyBERUwgUFJPVkVFRE9SID09PVxyXG4gICAgICAgIGN1cnJlbnRZID0gdGhpcy5hZGRQcm92aWRlckluZm8oZG9jLCBkYXRhLCBjdXJyZW50WSwgbWFyZ2luLCBwYWdlV2lkdGgsIHNlY29uZGFyeUNvbG9yKTtcclxuICAgICAgICBjdXJyZW50WSArPSAyMDtcclxuXHJcbiAgICAgICAgLy8gPT09IERFVEFMTEVTIERFTCBTRVJWSUNJTyA9PT1cclxuICAgICAgICBjdXJyZW50WSA9IHRoaXMuYWRkU2VydmljZURldGFpbHMoZG9jLCBkYXRhLCBjdXJyZW50WSwgbWFyZ2luLCBwYWdlV2lkdGgsIHNlY29uZGFyeUNvbG9yKTtcclxuICAgICAgICBjdXJyZW50WSArPSAyMDtcclxuXHJcbiAgICAgICAgLy8gPT09IEFVVE9SSVpBQ0nDk04gPT09XHJcbiAgICAgICAgY3VycmVudFkgPSB0aGlzLmFkZEF1dGhvcml6YXRpb24oZG9jLCBkYXRhLCBjdXJyZW50WSwgbWFyZ2luLCBwYWdlV2lkdGgpO1xyXG4gICAgICAgIGN1cnJlbnRZICs9IDMwO1xyXG5cclxuICAgICAgICAvLyA9PT0gUElFIERFIFDDgUdJTkEgPT09XHJcbiAgICAgICAgdGhpcy5hZGRGb290ZXIoZG9jLCBkYXRhLCBwYWdlSGVpZ2h0IC0gODAsIHBhZ2VXaWR0aCwgcHJpbWFyeUNvbG9yKTtcclxuXHJcbiAgICAgICAgLy8gPT09IEdFTkVSQVIvREVTQ0FSR0FSID09PVxyXG4gICAgICAgIGlmIChvcHRzLmRvd25sb2FkKSB7XHJcbiAgICAgICAgICBkb2Mub3V0cHV0KCdkYXRhdXJsbmV3d2luZG93JywgeyBmaWxlbmFtZTogb3B0cy5maWxlbmFtZSB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc29sdmUoZG9jKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkSGVhZGVyKGRvYzoganNQREYsIGRhdGE6IEZ1ZWxPcmRlckRhdGEsIG1hcmdpbjogbnVtYmVyLCB5OiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiB2b2lkIHtcclxuICAgIC8vIEZvbmRvIGRlbCBlbmNhYmV6YWRvXHJcbiAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xyXG4gICAgZG9jLnJlY3QobWFyZ2luLCB5LCBwYWdlV2lkdGggLSAobWFyZ2luICogMiksIDgwLCAnRicpO1xyXG5cclxuICAgIC8vIFRleHRvIGRlbCBlbmNhYmV6YWRvIGVuIGJsYW5jb1xyXG4gICAgZG9jLnNldFRleHRDb2xvcigyNTUsIDI1NSwgMjU1KTtcclxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgZG9jLnNldEZvbnRTaXplKDE4KTtcclxuICAgIFxyXG4gICAgY29uc3QgY29tcGFueU5hbWUgPSBkYXRhLm5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgIGNvbnN0IG5hbWVXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoY29tcGFueU5hbWUpO1xyXG4gICAgZG9jLnRleHQoY29tcGFueU5hbWUsIChwYWdlV2lkdGggLSBuYW1lV2lkdGgpIC8gMiwgeSArIDI1KTtcclxuXHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTIpO1xyXG4gICAgY29uc3Qgbml0VGV4dCA9IGBOSVQ6ICR7ZGF0YS5uaXR9YDtcclxuICAgIGNvbnN0IG5pdFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChuaXRUZXh0KTtcclxuICAgIGRvYy50ZXh0KG5pdFRleHQsIChwYWdlV2lkdGggLSBuaXRXaWR0aCkgLyAyLCB5ICsgNDUpO1xyXG5cclxuICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7XHJcbiAgICBjb25zdCBhZGRyZXNzVGV4dCA9IGAke2RhdGEuYWRkcmVzc30gLSBURUw6ICR7ZGF0YS50ZWxlcGhvbmV9YDtcclxuICAgIGNvbnN0IGFkZHJlc3NXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoYWRkcmVzc1RleHQpO1xyXG4gICAgZG9jLnRleHQoYWRkcmVzc1RleHQsIChwYWdlV2lkdGggLSBhZGRyZXNzV2lkdGgpIC8gMiwgeSArIDY1KTtcclxuXHJcbiAgICAvLyBSZXNldGVhciBjb2xvciBkZSB0ZXh0b1xyXG4gICAgZG9jLnNldFRleHRDb2xvcigwLCAwLCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkRG9jdW1lbnRUaXRsZShkb2M6IGpzUERGLCBkYXRhOiBGdWVsT3JkZXJEYXRhLCB5OiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiBudW1iZXIge1xyXG4gICAgZG9jLnNldFRleHRDb2xvcihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcclxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgZG9jLnNldEZvbnRTaXplKDIwKTtcclxuICAgIFxyXG4gICAgY29uc3QgdGl0bGUgPSAnT1JERU4gREUgQ09NQlVTVElCTEUnO1xyXG4gICAgY29uc3QgdGl0bGVXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGl0bGUpO1xyXG4gICAgZG9jLnRleHQodGl0bGUsIChwYWdlV2lkdGggLSB0aXRsZVdpZHRoKSAvIDIsIHkpO1xyXG5cclxuICAgIGRvYy5zZXRGb250U2l6ZSgxNik7XHJcbiAgICBjb25zdCBudW1iZXJUZXh0ID0gYE7CsCAke2RhdGEuY29uc2VjdXRpdmV9YDtcclxuICAgIGNvbnN0IG51bWJlcldpZHRoID0gZG9jLmdldFRleHRXaWR0aChudW1iZXJUZXh0KTtcclxuICAgIGRvYy50ZXh0KG51bWJlclRleHQsIChwYWdlV2lkdGggLSBudW1iZXJXaWR0aCkgLyAyLCB5ICsgMjUpO1xyXG5cclxuICAgIGRvYy5zZXRUZXh0Q29sb3IoMCwgMCwgMCk7XHJcbiAgICByZXR1cm4geSArIDQwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRNYWluSW5mbyhkb2M6IGpzUERGLCBkYXRhOiBGdWVsT3JkZXJEYXRhLCB5OiBudW1iZXIsIG1hcmdpbjogbnVtYmVyLCBwYWdlV2lkdGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCB0YWJsZURhdGEgPSBbXHJcbiAgICAgIFtcclxuICAgICAgICB7IGNvbnRlbnQ6ICfDgXJlYTonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcclxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEuYXJlYSwgc3R5bGVzOiB7fSB9LFxyXG4gICAgICAgIHsgY29udGVudDogJ0PDs2RpZ286Jywgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBmaWxsQ29sb3I6IFsyNDAsIDI0MCwgMjQwXSB9IH0sXHJcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLmNvZGUsIHN0eWxlczoge30gfSxcclxuICAgICAgICB7IGNvbnRlbnQ6ICdGZWNoYTonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcclxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEuZGF0ZSwgc3R5bGVzOiB7fSB9XHJcbiAgICAgIF0sXHJcbiAgICAgIFtcclxuICAgICAgICB7IGNvbnRlbnQ6ICdPcGVyYXJpbzonLCBzdHlsZXM6IHsgZm9udFN0eWxlOiAnYm9sZCcsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcclxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEucmVzcG9uc2libGUsIHN0eWxlczogeyBjb2xTcGFuOiAzIH0gfSxcclxuICAgICAgICB7IGNvbnRlbnQ6ICdPZMOzbWV0cm86Jywgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBmaWxsQ29sb3I6IFsyNDAsIDI0MCwgMjQwXSB9IH0sXHJcbiAgICAgICAgeyBjb250ZW50OiBkYXRhLm9kb21ldGVyLCBzdHlsZXM6IHt9IH1cclxuICAgICAgXVxyXG4gICAgXTtcclxuXHJcbiAgICAoZG9jIGFzIGFueSkuYXV0b1RhYmxlKHtcclxuICAgICAgc3RhcnRZOiB5LFxyXG4gICAgICBib2R5OiB0YWJsZURhdGEsXHJcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXHJcbiAgICAgIHN0eWxlczoge1xyXG4gICAgICAgIGZvbnRTaXplOiAxMSxcclxuICAgICAgICBjZWxsUGFkZGluZzogOCxcclxuICAgICAgICBsaW5lQ29sb3I6IFsyMDAsIDIwMCwgMjAwXSxcclxuICAgICAgICBsaW5lV2lkdGg6IDAuNVxyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5TdHlsZXM6IHtcclxuICAgICAgICAwOiB7IGNlbGxXaWR0aDogNzAgfSxcclxuICAgICAgICAxOiB7IGNlbGxXaWR0aDogMTAwIH0sXHJcbiAgICAgICAgMjogeyBjZWxsV2lkdGg6IDcwIH0sXHJcbiAgICAgICAgMzogeyBjZWxsV2lkdGg6IDgwIH0sXHJcbiAgICAgICAgNDogeyBjZWxsV2lkdGg6IDcwIH0sXHJcbiAgICAgICAgNTogeyBjZWxsV2lkdGg6IDgwIH1cclxuICAgICAgfSxcclxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IG1hcmdpbiwgcmlnaHQ6IG1hcmdpbiB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gKGRvYyBhcyBhbnkpLmxhc3RBdXRvVGFibGUuZmluYWxZO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRQcm92aWRlckluZm8oZG9jOiBqc1BERiwgZGF0YTogRnVlbE9yZGVyRGF0YSwgeTogbnVtYmVyLCBtYXJnaW46IG51bWJlciwgcGFnZVdpZHRoOiBudW1iZXIsIGNvbG9yOiBudW1iZXJbXSk6IG51bWJlciB7XHJcbiAgICAvLyBUw610dWxvIGRlIHNlY2Npw7NuXHJcbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTQpO1xyXG4gICAgY29uc3QgdGl0bGUgPSAnREFUT1MgREVMIFBST1ZFRURPUic7XHJcbiAgICBjb25zdCB0aXRsZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0aXRsZSk7XHJcbiAgICBkb2MudGV4dCh0aXRsZSwgKHBhZ2VXaWR0aCAtIHRpdGxlV2lkdGgpIC8gMiwgeSk7XHJcbiAgICBkb2Muc2V0VGV4dENvbG9yKDAsIDAsIDApO1xyXG5cclxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IFtcclxuICAgICAgW1xyXG4gICAgICAgIHsgY29udGVudDogJ0x1Z2FyOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZmlsbENvbG9yOiBbMjQwLCAyNDAsIDI0MF0gfSB9LFxyXG4gICAgICAgIHsgY29udGVudDogZGF0YS5uYW1lUGxhY2UsIHN0eWxlczoge30gfSxcclxuICAgICAgICB7IGNvbnRlbnQ6ICdEaXJlY2Npw7NuOicsIHN0eWxlczogeyBmb250U3R5bGU6ICdib2xkJywgZmlsbENvbG9yOiBbMjQwLCAyNDAsIDI0MF0gfSB9LFxyXG4gICAgICAgIHsgY29udGVudDogZGF0YS5hZGRyZXNzUGxhY2UsIHN0eWxlczoge30gfVxyXG4gICAgICBdXHJcbiAgICBdO1xyXG5cclxuICAgIChkb2MgYXMgYW55KS5hdXRvVGFibGUoe1xyXG4gICAgICBzdGFydFk6IHkgKyAyMCxcclxuICAgICAgYm9keTogdGFibGVEYXRhLFxyXG4gICAgICB0aGVtZTogJ2dyaWQnLFxyXG4gICAgICBzdHlsZXM6IHtcclxuICAgICAgICBmb250U2l6ZTogMTEsXHJcbiAgICAgICAgY2VsbFBhZGRpbmc6IDgsXHJcbiAgICAgICAgbGluZUNvbG9yOiBbMjAwLCAyMDAsIDIwMF0sXHJcbiAgICAgICAgbGluZVdpZHRoOiAwLjVcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uU3R5bGVzOiB7XHJcbiAgICAgICAgMDogeyBjZWxsV2lkdGg6IDgwIH0sXHJcbiAgICAgICAgMTogeyBjZWxsV2lkdGg6IDE2MCB9LFxyXG4gICAgICAgIDI6IHsgY2VsbFdpZHRoOiA4MCB9LFxyXG4gICAgICAgIDM6IHsgY2VsbFdpZHRoOiAxNTAgfVxyXG4gICAgICB9LFxyXG4gICAgICBtYXJnaW46IHsgbGVmdDogbWFyZ2luLCByaWdodDogbWFyZ2luIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFNlcnZpY2VEZXRhaWxzKGRvYzoganNQREYsIGRhdGE6IEZ1ZWxPcmRlckRhdGEsIHk6IG51bWJlciwgbWFyZ2luOiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiBudW1iZXIge1xyXG4gICAgLy8gVMOtdHVsbyBkZSBzZWNjacOzblxyXG4gICAgZG9jLnNldFRleHRDb2xvcihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcclxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgZG9jLnNldEZvbnRTaXplKDE0KTtcclxuICAgIGNvbnN0IHRpdGxlID0gJ0RFVEFMTEVTIERFTCBTRVJWSUNJTyc7XHJcbiAgICBjb25zdCB0aXRsZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0aXRsZSk7XHJcbiAgICBkb2MudGV4dCh0aXRsZSwgKHBhZ2VXaWR0aCAtIHRpdGxlV2lkdGgpIC8gMiwgeSk7XHJcbiAgICBkb2Muc2V0VGV4dENvbG9yKDAsIDAsIDApO1xyXG5cclxuICAgIC8vIFByZXBhcmFyIHRleHRvIHBhcmEgY2FsY3VsYXIgYWx0dXJhIG5lY2VzYXJpYVxyXG4gICAgY29uc3QgYm94WSA9IHkgKyAyMDtcclxuICAgIGNvbnN0IGJveFdpZHRoID0gcGFnZVdpZHRoIC0gKG1hcmdpbiAqIDIpO1xyXG4gICAgY29uc3QgdGV4dE1hcmdpbiA9IG1hcmdpbiArIDE1O1xyXG4gICAgY29uc3QgbWF4V2lkdGggPSBib3hXaWR0aCAtIDMwO1xyXG4gICAgY29uc3QgbGluZUhlaWdodCA9IDE1O1xyXG4gICAgY29uc3QgbWluQm94SGVpZ2h0ID0gNjA7IC8vIEFsdHVyYSBtw61uaW1hIGRlbCBjb250ZW5lZG9yXHJcbiAgICBjb25zdCBwYWRkaW5nID0gNDA7IC8vIFBhZGRpbmcgc3VwZXJpb3IgZSBpbmZlcmlvclxyXG5cclxuICAgIC8vIENhbGN1bGFyIGzDrW5lYXMgZGUgdGV4dG8gbmVjZXNhcmlhc1xyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XHJcbiAgICBcclxuICAgIGxldCB0b3RhbExpbmVzID0gMDtcclxuXHJcbiAgICAvLyBDb250YXIgbMOtbmVhcyBkZWwgZGV0YWxsZVxyXG4gICAgaWYgKGRhdGEuZGV0YWxsZSAmJiBkYXRhLmRldGFsbGUudHJpbSgpKSB7XHJcbiAgICAgIGNvbnN0IGRldGFsbGVMaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUoZGF0YS5kZXRhbGxlLnRyaW0oKSwgbWF4V2lkdGgpO1xyXG4gICAgICB0b3RhbExpbmVzICs9IGRldGFsbGVMaW5lcy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udGFyIGzDrW5lYXMgZGUgbGEgZGVzY3JpcGNpw7NuIChpbmNsdXllIGV0aXF1ZXRhIFwiRGVzY3JpcGNpw7NuOlwiKVxyXG4gICAgaWYgKGRhdGEuZGVzY3JpcHRpb24gJiYgZGF0YS5kZXNjcmlwdGlvbi50cmltKCkpIHtcclxuICAgICAgdG90YWxMaW5lcyArPSAyOyAvLyBVbmEgbMOtbmVhIHBhcmEgXCJEZXNjcmlwY2nDs246XCIgKyBlc3BhY2lvXHJcbiAgICAgIGNvbnN0IGRlc2NMaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUoZGF0YS5kZXNjcmlwdGlvbi50cmltKCksIG1heFdpZHRoKTtcclxuICAgICAgdG90YWxMaW5lcyArPSBkZXNjTGluZXMubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbGN1bGFyIGFsdHVyYSBuZWNlc2FyaWEgYmFzYWRhIGVuIGVsIGNvbnRlbmlkb1xyXG4gICAgY29uc3QgY29udGVudEhlaWdodCA9IE1hdGgubWF4KHRvdGFsTGluZXMgKiBsaW5lSGVpZ2h0LCAzMCk7IC8vIE3DrW5pbW8gMzBwdCBwYXJhIGNvbnRlbmlkb1xyXG4gICAgY29uc3QgYm94SGVpZ2h0ID0gTWF0aC5tYXgobWluQm94SGVpZ2h0LCBjb250ZW50SGVpZ2h0ICsgcGFkZGluZyk7XHJcblxyXG4gICAgLy8gVmVyaWZpY2FyIHNpIG5lY2VzaXRhbW9zIHVuYSBudWV2YSBww6FnaW5hXHJcbiAgICBjb25zdCBwYWdlSGVpZ2h0ID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpO1xyXG4gICAgY29uc3QgcmVtYWluaW5nU3BhY2UgPSBwYWdlSGVpZ2h0IC0gYm94WSAtIDEwMDsgLy8gRGVqYXIgZXNwYWNpbyBwYXJhIGZvb3RlclxyXG4gICAgXHJcbiAgICBsZXQgZmluYWxCb3hZID0gYm94WTtcclxuICAgIGlmIChib3hIZWlnaHQgPiByZW1haW5pbmdTcGFjZSkge1xyXG4gICAgICAvLyBBw7FhZGlyIG51ZXZhIHDDoWdpbmFcclxuICAgICAgZG9jLmFkZFBhZ2UoKTtcclxuICAgICAgZmluYWxCb3hZID0gbWFyZ2luICsgNDA7IC8vIFBvc2ljacOzbiBlbiBudWV2YSBww6FnaW5hXHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGlidWphciBjb250ZW5lZG9yIGNvbiBhbHR1cmEgZGluw6FtaWNhXHJcbiAgICAvLyBGb25kbyBncmlzIGNsYXJvXHJcbiAgICBkb2Muc2V0RmlsbENvbG9yKDI1MCwgMjUwLCAyNTApO1xyXG4gICAgZG9jLnJlY3QobWFyZ2luLCBmaW5hbEJveFksIGJveFdpZHRoLCBib3hIZWlnaHQsICdGJyk7XHJcbiAgICBcclxuICAgIC8vIEJvcmRlXHJcbiAgICBkb2Muc2V0RHJhd0NvbG9yKDIwMCwgMjAwLCAyMDApO1xyXG4gICAgZG9jLnJlY3QobWFyZ2luLCBmaW5hbEJveFksIGJveFdpZHRoLCBib3hIZWlnaHQsICdTJyk7XHJcblxyXG4gICAgLy8gQcOxYWRpciBjb250ZW5pZG8gZGUgdGV4dG9cclxuICAgIGxldCB0ZXh0WSA9IGZpbmFsQm94WSArIDIwO1xyXG5cclxuICAgIC8vIEHDsWFkaXIgZGV0YWxsZSBzaSBleGlzdGVcclxuICAgIGlmIChkYXRhLmRldGFsbGUgJiYgZGF0YS5kZXRhbGxlLnRyaW0oKSkge1xyXG4gICAgICBjb25zdCBkZXRhbGxlTGluZXMgPSBkb2Muc3BsaXRUZXh0VG9TaXplKGRhdGEuZGV0YWxsZS50cmltKCksIG1heFdpZHRoKTtcclxuICAgICAgZG9jLnRleHQoZGV0YWxsZUxpbmVzLCB0ZXh0TWFyZ2luLCB0ZXh0WSk7XHJcbiAgICAgIHRleHRZICs9IGRldGFsbGVMaW5lcy5sZW5ndGggKiBsaW5lSGVpZ2h0ICsgMTA7IC8vIEVzcGFjaW8gZXh0cmEgZGVzcHXDqXMgZGVsIGRldGFsbGVcclxuICAgIH1cclxuXHJcbiAgICAvLyBBw7FhZGlyIGRlc2NyaXBjacOzbiBzaSBleGlzdGVcclxuICAgIGlmIChkYXRhLmRlc2NyaXB0aW9uICYmIGRhdGEuZGVzY3JpcHRpb24udHJpbSgpKSB7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBkb2MudGV4dCgnRGVzY3JpcGNpw7NuOicsIHRleHRNYXJnaW4sIHRleHRZKTtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgdGV4dFkgKz0gbGluZUhlaWdodDtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IGRlc2NMaW5lcyA9IGRvYy5zcGxpdFRleHRUb1NpemUoZGF0YS5kZXNjcmlwdGlvbi50cmltKCksIG1heFdpZHRoKTtcclxuICAgICAgXHJcbiAgICAgIC8vIFZlcmlmaWNhciBzaSBuZWNlc2l0YW1vcyBtYW5lamFyIGNvbnRlbmlkbyBtdXkgbGFyZ29cclxuICAgICAgY29uc3QgcmVtYWluaW5nSGVpZ2h0ID0gZmluYWxCb3hZICsgYm94SGVpZ2h0IC0gdGV4dFkgLSAyMDtcclxuICAgICAgY29uc3QgbWF4TGluZXNJblNwYWNlID0gTWF0aC5mbG9vcihyZW1haW5pbmdIZWlnaHQgLyBsaW5lSGVpZ2h0KTtcclxuICAgICAgXHJcbiAgICAgIGlmIChkZXNjTGluZXMubGVuZ3RoID4gbWF4TGluZXNJblNwYWNlICYmIG1heExpbmVzSW5TcGFjZSA+IDApIHtcclxuICAgICAgICAvLyBNb3N0cmFyIGzDrW5lYXMgcXVlIGNhYmVuIGVuIGVsIGVzcGFjaW8gYWN0dWFsXHJcbiAgICAgICAgY29uc3QgY3VycmVudExpbmVzID0gZGVzY0xpbmVzLnNsaWNlKDAsIG1heExpbmVzSW5TcGFjZSk7XHJcbiAgICAgICAgZG9jLnRleHQoY3VycmVudExpbmVzLCB0ZXh0TWFyZ2luLCB0ZXh0WSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ29udGludWFyIGVuIG51ZXZhIHDDoWdpbmEgc2kgaGF5IG3DoXMgY29udGVuaWRvXHJcbiAgICAgICAgaWYgKGRlc2NMaW5lcy5sZW5ndGggPiBtYXhMaW5lc0luU3BhY2UpIHtcclxuICAgICAgICAgIGRvYy5hZGRQYWdlKCk7XHJcbiAgICAgICAgICB0ZXh0WSA9IG1hcmdpbiArIDIwO1xyXG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nTGluZXMgPSBkZXNjTGluZXMuc2xpY2UobWF4TGluZXNJblNwYWNlKTtcclxuICAgICAgICAgIGRvYy50ZXh0KHJlbWFpbmluZ0xpbmVzLCB0ZXh0TWFyZ2luLCB0ZXh0WSk7XHJcbiAgICAgICAgICByZXR1cm4gdGV4dFkgKyAocmVtYWluaW5nTGluZXMubGVuZ3RoICogbGluZUhlaWdodCkgKyAyMDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZG9jLnRleHQoZGVzY0xpbmVzLCB0ZXh0TWFyZ2luLCB0ZXh0WSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBTaSBubyBoYXkgY29udGVuaWRvLCBtb3N0cmFyIHVuIG1lbnNhamVcclxuICAgIGlmICgoIWRhdGEuZGV0YWxsZSB8fCAhZGF0YS5kZXRhbGxlLnRyaW0oKSkgJiYgKCFkYXRhLmRlc2NyaXB0aW9uIHx8ICFkYXRhLmRlc2NyaXB0aW9uLnRyaW0oKSkpIHtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcclxuICAgICAgZG9jLnNldEZvbnRTaXplKDEwKTtcclxuICAgICAgZG9jLnNldFRleHRDb2xvcigxNTAsIDE1MCwgMTUwKTtcclxuICAgICAgZG9jLnRleHQoJ05vIHNlIGhhbiBlc3BlY2lmaWNhZG8gZGV0YWxsZXMgZGVsIHNlcnZpY2lvLicsIHRleHRNYXJnaW4sIHRleHRZKTtcclxuICAgICAgZG9jLnNldFRleHRDb2xvcigwLCAwLCAwKTtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgZG9jLnNldEZvbnRTaXplKDExKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmluYWxCb3hZICsgYm94SGVpZ2h0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBhdXhpbGlhciBwYXJhIG1hbmVqYXIgdGV4dG8gbGFyZ28gcXVlIHB1ZWRlIG5lY2VzaXRhciBtw7psdGlwbGVzIHDDoWdpbmFzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGRMb25nVGV4dChkb2M6IGpzUERGLCB0ZXh0OiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBtYXhXaWR0aDogbnVtYmVyLCBmb250U2l6ZTogbnVtYmVyID0gMTEpOiBudW1iZXIge1xyXG4gICAgaWYgKCF0ZXh0IHx8ICF0ZXh0LnRyaW0oKSkgcmV0dXJuIHk7XHJcblxyXG4gICAgZG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcclxuICAgIGNvbnN0IGxpbmVzID0gZG9jLnNwbGl0VGV4dFRvU2l6ZSh0ZXh0LnRyaW0oKSwgbWF4V2lkdGgpO1xyXG4gICAgY29uc3QgbGluZUhlaWdodCA9IGZvbnRTaXplICsgMztcclxuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCk7XHJcbiAgICBjb25zdCBtYXJnaW4gPSA0MDtcclxuXHJcbiAgICBsZXQgY3VycmVudFkgPSB5O1xyXG4gICAgbGV0IGxpbmVJbmRleCA9IDA7XHJcblxyXG4gICAgd2hpbGUgKGxpbmVJbmRleCA8IGxpbmVzLmxlbmd0aCkge1xyXG4gICAgICAvLyBWZXJpZmljYXIgc2kgbmVjZXNpdGFtb3MgdW5hIG51ZXZhIHDDoWdpbmFcclxuICAgICAgaWYgKGN1cnJlbnRZICsgbGluZUhlaWdodCA+IHBhZ2VIZWlnaHQgLSBtYXJnaW4pIHtcclxuICAgICAgICBkb2MuYWRkUGFnZSgpO1xyXG4gICAgICAgIGN1cnJlbnRZID0gbWFyZ2luO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDYWxjdWxhciBjdcOhbnRhcyBsw61uZWFzIGNhYmVuIGVuIGxhIHDDoWdpbmEgYWN0dWFsXHJcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1NwYWNlID0gcGFnZUhlaWdodCAtIGN1cnJlbnRZIC0gbWFyZ2luO1xyXG4gICAgICBjb25zdCBtYXhMaW5lc0luUGFnZSA9IE1hdGguZmxvb3IocmVtYWluaW5nU3BhY2UgLyBsaW5lSGVpZ2h0KTtcclxuICAgICAgXHJcbiAgICAgIGlmIChtYXhMaW5lc0luUGFnZSA+IDApIHtcclxuICAgICAgICBjb25zdCBsaW5lc1RvU2hvdyA9IE1hdGgubWluKG1heExpbmVzSW5QYWdlLCBsaW5lcy5sZW5ndGggLSBsaW5lSW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IHBhZ2VMaW5lcyA9IGxpbmVzLnNsaWNlKGxpbmVJbmRleCwgbGluZUluZGV4ICsgbGluZXNUb1Nob3cpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGRvYy50ZXh0KHBhZ2VMaW5lcywgeCwgY3VycmVudFkpO1xyXG4gICAgICAgIGN1cnJlbnRZICs9IHBhZ2VMaW5lcy5sZW5ndGggKiBsaW5lSGVpZ2h0O1xyXG4gICAgICAgIGxpbmVJbmRleCArPSBsaW5lc1RvU2hvdztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBTaSBubyBjYWJlIG5pIHVuYSBsw61uZWEsIGlyIGEgbnVldmEgcMOhZ2luYVxyXG4gICAgICAgIGRvYy5hZGRQYWdlKCk7XHJcbiAgICAgICAgY3VycmVudFkgPSBtYXJnaW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudFk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZEF1dGhvcml6YXRpb24oZG9jOiBqc1BERiwgZGF0YTogRnVlbE9yZGVyRGF0YSwgeTogbnVtYmVyLCBtYXJnaW46IG51bWJlciwgcGFnZVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgdGFibGVEYXRhID0gW1xyXG4gICAgICBbXHJcbiAgICAgICAgeyBjb250ZW50OiAnQVVUT1JJWkFEQSBQT1I6Jywgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2JvbGQnLCBmb250U2l6ZTogMTIsIGZpbGxDb2xvcjogWzI0MCwgMjQwLCAyNDBdIH0gfSxcclxuICAgICAgICB7IGNvbnRlbnQ6IGRhdGEuYXBwcm92ZWRfYnksIHN0eWxlczogeyBmb250U2l6ZTogMTIgfSB9XHJcbiAgICAgIF1cclxuICAgIF07XHJcblxyXG4gICAgKGRvYyBhcyBhbnkpLmF1dG9UYWJsZSh7XHJcbiAgICAgIHN0YXJ0WTogeSxcclxuICAgICAgYm9keTogdGFibGVEYXRhLFxyXG4gICAgICB0aGVtZTogJ2dyaWQnLFxyXG4gICAgICBzdHlsZXM6IHtcclxuICAgICAgICBjZWxsUGFkZGluZzogMTIsXHJcbiAgICAgICAgbGluZUNvbG9yOiBbMjAwLCAyMDAsIDIwMF0sXHJcbiAgICAgICAgbGluZVdpZHRoOiAwLjVcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uU3R5bGVzOiB7XHJcbiAgICAgICAgMDogeyBjZWxsV2lkdGg6IDE1MCB9LFxyXG4gICAgICAgIDE6IHsgY2VsbFdpZHRoOiAzMjAgfVxyXG4gICAgICB9LFxyXG4gICAgICBtYXJnaW46IHsgbGVmdDogbWFyZ2luLCByaWdodDogbWFyZ2luIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiAoZG9jIGFzIGFueSkubGFzdEF1dG9UYWJsZS5maW5hbFk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZEZvb3Rlcihkb2M6IGpzUERGLCBkYXRhOiBGdWVsT3JkZXJEYXRhLCB5OiBudW1iZXIsIHBhZ2VXaWR0aDogbnVtYmVyLCBjb2xvcjogbnVtYmVyW10pOiB2b2lkIHtcclxuICAgIC8vIEZvbmRvIGRlbCBwaWUgZGUgcMOhZ2luYVxyXG4gICAgZG9jLnNldEZpbGxDb2xvcihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcclxuICAgIGRvYy5yZWN0KDQwLCB5LCBwYWdlV2lkdGggLSA4MCwgNjAsICdGJyk7XHJcblxyXG4gICAgLy8gVGV4dG8gZW4gYmxhbmNvXHJcbiAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwgMjU1LCAyNTUpO1xyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTIpO1xyXG4gICAgXHJcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9ICdGYXZvciBhZGp1bnRhciBsYSBvcmRlbiBkZSB2ZW50YSBvIGZhY3R1cmEnO1xyXG4gICAgY29uc3QgaW5zdFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChpbnN0cnVjdGlvbik7XHJcbiAgICBkb2MudGV4dChpbnN0cnVjdGlvbiwgKHBhZ2VXaWR0aCAtIGluc3RXaWR0aCkgLyAyLCB5ICsgMjUpO1xyXG5cclxuICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7XHJcbiAgICBjb25zdCBlbWFpbFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChkYXRhLm1haWwpO1xyXG4gICAgZG9jLnRleHQoZGF0YS5tYWlsLCAocGFnZVdpZHRoIC0gZW1haWxXaWR0aCkgLyAyLCB5ICsgNDUpO1xyXG5cclxuICAgIC8vIFJlc2V0ZWFyIGNvbG9yXHJcbiAgICBkb2Muc2V0VGV4dENvbG9yKDAsIDAsIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhIFBERiBvcHRpbWl6YWRvIHBhcmEgaW1wcmVzacOzblxyXG4gICAqL1xyXG4gIGdlbmVyYXRlRm9yUHJpbnQoZGF0YTogRnVlbE9yZGVyRGF0YSk6IFByb21pc2U8anNQREY+IHtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRnVlbE9yZGVyUHJvZmVzaW9uYWxQREYoZGF0YSwge1xyXG4gICAgICBmb3JtYXQ6ICdsZXR0ZXInLFxyXG4gICAgICBkb3dubG9hZDogZmFsc2VcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhIFBERiB5IGxvIGRldnVlbHZlIGNvbW8gQmxvYiBwYXJhIGVudsOtbyBwb3IgZW1haWxcclxuICAgKi9cclxuICBnZW5lcmF0ZUFzQmxvYihkYXRhOiBGdWVsT3JkZXJEYXRhKTogUHJvbWlzZTxCbG9iPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlRnVlbE9yZGVyUHJvZmVzaW9uYWxQREYoZGF0YSwgeyBkb3dubG9hZDogZmFsc2UgfSlcclxuICAgICAgICAudGhlbihkb2MgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcGRmQmxvYiA9IGRvYy5vdXRwdXQoJ2Jsb2InKTtcclxuICAgICAgICAgIHJlc29sdmUocGRmQmxvYik7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2gocmVqZWN0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhIFBERiB5IGxvIGRldnVlbHZlIGNvbW8gYmFzZTY0XHJcbiAgICovXHJcbiAgZ2VuZXJhdGVBc0Jhc2U2NChkYXRhOiBGdWVsT3JkZXJEYXRhKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVGdWVsT3JkZXJQcm9mZXNpb25hbFBERihkYXRhLCB7IGRvd25sb2FkOiBmYWxzZSB9KVxyXG4gICAgICAgIC50aGVuKGRvYyA9PiB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlNjQgPSBkb2Mub3V0cHV0KCdkYXRhdXJpc3RyaW5nJyk7XHJcbiAgICAgICAgICByZXNvbHZlKGJhc2U2NCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2gocmVqZWN0KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
|