valtech-components 2.0.850 → 2.0.851
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/esm2022/lib/services/feedback/config.mjs +7 -7
- package/esm2022/lib/services/feedback/feedback.service.mjs +89 -2
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +93 -7
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/services/feedback/feedback.service.d.ts +23 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InjectionToken, makeEnvironmentProviders
|
|
1
|
+
import { InjectionToken, makeEnvironmentProviders } from '@angular/core';
|
|
2
2
|
/**
|
|
3
3
|
* Token de inyección para la configuración de Feedback.
|
|
4
4
|
*/
|
|
@@ -9,8 +9,10 @@ export const VALTECH_FEEDBACK_CONFIG = new InjectionToken('ValtechFeedbackConfig
|
|
|
9
9
|
export const DEFAULT_FEEDBACK_CONFIG = {
|
|
10
10
|
feedbackPrefix: '/v1/feedback',
|
|
11
11
|
maxAttachments: 5,
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
// Estándar acordado para adjuntos de feedback: solo imágenes (JPEG/PNG/WebP)
|
|
13
|
+
// y PDF, máx 5 MB. Reflejado en `storage.rules` (path `users/{uid}/feedback/`).
|
|
14
|
+
maxFileSize: 5 * 1024 * 1024,
|
|
15
|
+
allowedFileTypes: ['image/jpeg', 'image/png', 'image/webp', 'application/pdf'],
|
|
14
16
|
storagePath: 'feedback',
|
|
15
17
|
};
|
|
16
18
|
/**
|
|
@@ -42,8 +44,6 @@ export function provideValtechFeedback(config) {
|
|
|
42
44
|
...DEFAULT_FEEDBACK_CONFIG,
|
|
43
45
|
...config,
|
|
44
46
|
};
|
|
45
|
-
return makeEnvironmentProviders([
|
|
46
|
-
{ provide: VALTECH_FEEDBACK_CONFIG, useValue: mergedConfig },
|
|
47
|
-
]);
|
|
47
|
+
return makeEnvironmentProviders([{ provide: VALTECH_FEEDBACK_CONFIG, useValue: mergedConfig }]);
|
|
48
48
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9mZWVkYmFjay9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0Y7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLGNBQWMsQ0FDdkQsdUJBQXVCLENBQ3hCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFtQztJQUNyRSxjQUFjLEVBQUUsY0FBYztJQUM5QixjQUFjLEVBQUUsQ0FBQztJQUNqQiw2RUFBNkU7SUFDN0UsZ0ZBQWdGO0lBQ2hGLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUk7SUFDNUIsZ0JBQWdCLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztJQUM5RSxXQUFXLEVBQUUsVUFBVTtDQUN4QixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE1BQTZCO0lBQ2xFLE1BQU0sWUFBWSxHQUEwQjtRQUMxQyxHQUFHLHVCQUF1QjtRQUMxQixHQUFHLE1BQU07S0FDVixDQUFDO0lBRUYsT0FBTyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50UHJvdmlkZXJzLCBJbmplY3Rpb25Ub2tlbiwgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWx0ZWNoRmVlZGJhY2tDb25maWcgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUb2tlbiBkZSBpbnllY2Npw7NuIHBhcmEgbGEgY29uZmlndXJhY2nDs24gZGUgRmVlZGJhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxURUNIX0ZFRURCQUNLX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxWYWx0ZWNoRmVlZGJhY2tDb25maWc+KFxuICAnVmFsdGVjaEZlZWRiYWNrQ29uZmlnJ1xuKTtcblxuLyoqXG4gKiBDb25maWd1cmFjacOzbiBwb3IgZGVmZWN0by5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRkVFREJBQ0tfQ09ORklHOiBQYXJ0aWFsPFZhbHRlY2hGZWVkYmFja0NvbmZpZz4gPSB7XG4gIGZlZWRiYWNrUHJlZml4OiAnL3YxL2ZlZWRiYWNrJyxcbiAgbWF4QXR0YWNobWVudHM6IDUsXG4gIC8vIEVzdMOhbmRhciBhY29yZGFkbyBwYXJhIGFkanVudG9zIGRlIGZlZWRiYWNrOiBzb2xvIGltw6FnZW5lcyAoSlBFRy9QTkcvV2ViUClcbiAgLy8geSBQREYsIG3DoXggNSBNQi4gUmVmbGVqYWRvIGVuIGBzdG9yYWdlLnJ1bGVzYCAocGF0aCBgdXNlcnMve3VpZH0vZmVlZGJhY2svYCkuXG4gIG1heEZpbGVTaXplOiA1ICogMTAyNCAqIDEwMjQsXG4gIGFsbG93ZWRGaWxlVHlwZXM6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wbmcnLCAnaW1hZ2Uvd2VicCcsICdhcHBsaWNhdGlvbi9wZGYnXSxcbiAgc3RvcmFnZVBhdGg6ICdmZWVkYmFjaycsXG59O1xuXG4vKipcbiAqIFByb3ZlZSBlbCBzZXJ2aWNpbyBkZSBmZWVkYmFjayBhIGxhIGFwbGljYWNpw7NuIEFuZ3VsYXIuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYWNpw7NuIGRlIGZlZWRiYWNrXG4gKiBAcmV0dXJucyBFbnZpcm9ubWVudFByb3ZpZGVycyBwYXJhIHVzYXIgZW4gYm9vdHN0cmFwQXBwbGljYXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gbWFpbi50c1xuICogaW1wb3J0IHsgYm9vdHN0cmFwQXBwbGljYXRpb24gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbiAqIGltcG9ydCB7IHByb3ZpZGVWYWx0ZWNoRmVlZGJhY2sgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICogaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG4gKlxuICogYm9vdHN0cmFwQXBwbGljYXRpb24oQXBwQ29tcG9uZW50LCB7XG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIHByb3ZpZGVWYWx0ZWNoQXV0aCh7IGFwaVVybDogZW52aXJvbm1lbnQuYXBpVXJsIH0pLFxuICogICAgIHByb3ZpZGVWYWx0ZWNoRmVlZGJhY2soe1xuICogICAgICAgYXBpVXJsOiBlbnZpcm9ubWVudC5hcGlVcmwsXG4gKiAgICAgICBhcHBJZDogJ215LWFwcC1uYW1lJyxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmFsdGVjaEZlZWRiYWNrKGNvbmZpZzogVmFsdGVjaEZlZWRiYWNrQ29uZmlnKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICBjb25zdCBtZXJnZWRDb25maWc6IFZhbHRlY2hGZWVkYmFja0NvbmZpZyA9IHtcbiAgICAuLi5ERUZBVUxUX0ZFRURCQUNLX0NPTkZJRyxcbiAgICAuLi5jb25maWcsXG4gIH07XG5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbeyBwcm92aWRlOiBWQUxURUNIX0ZFRURCQUNLX0NPTkZJRywgdXNlVmFsdWU6IG1lcmdlZENvbmZpZyB9XSk7XG59XG4iXX0=
|
|
@@ -3,6 +3,7 @@ import { HttpClient } from '@angular/common/http';
|
|
|
3
3
|
import { firstValueFrom } from 'rxjs';
|
|
4
4
|
import { VALTECH_FEEDBACK_CONFIG } from './config';
|
|
5
5
|
import { FirestoreService } from '../firebase/firestore.service';
|
|
6
|
+
import { StorageService } from '../firebase/storage.service';
|
|
6
7
|
import { AuthService } from '../auth/auth.service';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
/**
|
|
@@ -30,6 +31,7 @@ export class FeedbackService {
|
|
|
30
31
|
this.config = inject(VALTECH_FEEDBACK_CONFIG);
|
|
31
32
|
this.http = inject(HttpClient);
|
|
32
33
|
this.firestore = inject(FirestoreService, { optional: true });
|
|
34
|
+
this.storage = inject(StorageService, { optional: true });
|
|
33
35
|
this.auth = inject(AuthService, { optional: true });
|
|
34
36
|
}
|
|
35
37
|
/**
|
|
@@ -109,7 +111,7 @@ export class FeedbackService {
|
|
|
109
111
|
}
|
|
110
112
|
// Verificar tipo
|
|
111
113
|
const allowedTypes = this.config.allowedFileTypes || [];
|
|
112
|
-
const isAllowed = allowedTypes.some(
|
|
114
|
+
const isAllowed = allowedTypes.some(pattern => {
|
|
113
115
|
if (pattern.endsWith('/*')) {
|
|
114
116
|
const baseType = pattern.replace('/*', '');
|
|
115
117
|
return file.type.startsWith(baseType);
|
|
@@ -124,6 +126,91 @@ export class FeedbackService {
|
|
|
124
126
|
}
|
|
125
127
|
return { valid: true };
|
|
126
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Valida el CONTENIDO del archivo por magic-bytes (firma binaria) —
|
|
131
|
+
* defensa contra spoofing del content-type declarado. Lee los primeros 12
|
|
132
|
+
* bytes y los compara con las firmas de JPEG/PNG/WebP/PDF (whitelist
|
|
133
|
+
* estricta). Es client-side, ergo bypasseable; la defensa real vive en las
|
|
134
|
+
* Storage rules. Esto corta el 99% de los casos accidentales o no-targeted.
|
|
135
|
+
*/
|
|
136
|
+
async validateFileContent(file) {
|
|
137
|
+
const buf = await file.slice(0, 12).arrayBuffer();
|
|
138
|
+
const b = new Uint8Array(buf);
|
|
139
|
+
// JPEG: FF D8 FF
|
|
140
|
+
if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) {
|
|
141
|
+
return { valid: true };
|
|
142
|
+
}
|
|
143
|
+
// PNG: 89 50 4E 47 0D 0A 1A 0A
|
|
144
|
+
if (b[0] === 0x89 &&
|
|
145
|
+
b[1] === 0x50 &&
|
|
146
|
+
b[2] === 0x4e &&
|
|
147
|
+
b[3] === 0x47 &&
|
|
148
|
+
b[4] === 0x0d &&
|
|
149
|
+
b[5] === 0x0a &&
|
|
150
|
+
b[6] === 0x1a &&
|
|
151
|
+
b[7] === 0x0a) {
|
|
152
|
+
return { valid: true };
|
|
153
|
+
}
|
|
154
|
+
// WebP: "RIFF" (0..3) + "WEBP" (8..11)
|
|
155
|
+
if (b[0] === 0x52 &&
|
|
156
|
+
b[1] === 0x49 &&
|
|
157
|
+
b[2] === 0x46 &&
|
|
158
|
+
b[3] === 0x46 &&
|
|
159
|
+
b[8] === 0x57 &&
|
|
160
|
+
b[9] === 0x45 &&
|
|
161
|
+
b[10] === 0x42 &&
|
|
162
|
+
b[11] === 0x50) {
|
|
163
|
+
return { valid: true };
|
|
164
|
+
}
|
|
165
|
+
// PDF: "%PDF-"
|
|
166
|
+
if (b[0] === 0x25 && b[1] === 0x50 && b[2] === 0x44 && b[3] === 0x46 && b[4] === 0x2d) {
|
|
167
|
+
return { valid: true };
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
valid: false,
|
|
171
|
+
error: 'El contenido del archivo no coincide con un tipo permitido (imagen o PDF).',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Sube un adjunto a Firebase Storage en `users/{uid}/feedback/{uuid}/{name}`
|
|
176
|
+
* y devuelve su download URL. Ejecuta tres validaciones en orden:
|
|
177
|
+
* 1. tamaño + tipo declarado (`validateFile`)
|
|
178
|
+
* 2. contenido por magic-bytes (`validateFileContent`)
|
|
179
|
+
* 3. usuario autenticado (no soportamos adjuntos en feedback anónimo)
|
|
180
|
+
*
|
|
181
|
+
* Si cualquier validación falla → rechaza la promesa con un Error legible;
|
|
182
|
+
* el componente que la consuma debe cancelar la operación de adjuntar.
|
|
183
|
+
*/
|
|
184
|
+
async uploadAttachment(file) {
|
|
185
|
+
const sizeTypeCheck = this.validateFile(file);
|
|
186
|
+
if (!sizeTypeCheck.valid) {
|
|
187
|
+
throw new Error(sizeTypeCheck.error);
|
|
188
|
+
}
|
|
189
|
+
const contentCheck = await this.validateFileContent(file);
|
|
190
|
+
if (!contentCheck.valid) {
|
|
191
|
+
throw new Error(contentCheck.error);
|
|
192
|
+
}
|
|
193
|
+
const userId = this.auth?.user()?.userId;
|
|
194
|
+
if (!userId) {
|
|
195
|
+
throw new Error('Debes iniciar sesión para adjuntar archivos.');
|
|
196
|
+
}
|
|
197
|
+
if (!this.storage) {
|
|
198
|
+
throw new Error('StorageService no está configurado.');
|
|
199
|
+
}
|
|
200
|
+
// Path bajo `users/{uid}/feedback/` — sibling de `files/`, con su propia
|
|
201
|
+
// regla en `storage.rules` (whitelist estricta JPEG/PNG/WebP/PDF + 5MB).
|
|
202
|
+
// skipPrefix=true porque `users/{uid}/` es path GLOBAL cross-app.
|
|
203
|
+
const uuid = typeof crypto !== 'undefined' && 'randomUUID' in crypto
|
|
204
|
+
? crypto.randomUUID()
|
|
205
|
+
: `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
206
|
+
const safeName = file.name.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
207
|
+
const path = `users/${userId}/feedback/${uuid}/${safeName}`;
|
|
208
|
+
const result = await this.storage.uploadAndGetUrl(path, file, {
|
|
209
|
+
contentType: file.type,
|
|
210
|
+
skipPrefix: true,
|
|
211
|
+
});
|
|
212
|
+
return result.downloadUrl;
|
|
213
|
+
}
|
|
127
214
|
/**
|
|
128
215
|
* Obtiene la configuración actual del servicio.
|
|
129
216
|
*/
|
|
@@ -293,4 +380,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
293
380
|
type: Injectable,
|
|
294
381
|
args: [{ providedIn: 'root' }]
|
|
295
382
|
}] });
|
|
296
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZGJhY2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmVlZGJhY2svZmVlZGJhY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFjLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFhbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUVuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBRVUsV0FBTSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pDLFNBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7S0ErU3hEO0lBN1NDOztPQUVHO0lBQ0gsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FB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WSxDQUFDO1FBQ3RELElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUN0RCxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDN0MsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2hELElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0MsQ0FBQztZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDN0MsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0QsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQ3pDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7K0dBbFRVLGVBQWU7bUhBQWYsZUFBZSxjQURGLE1BQU07OzRGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBWQUxURUNIX0ZFRURCQUNLX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7XG4gIENyZWF0ZUZlZWRiYWNrUmVxdWVzdCxcbiAgQ3JlYXRlRmVlZGJhY2tSZXNwb25zZSxcbiAgR2V0RmVlZGJhY2tSZXNwb25zZSxcbiAgQ2hlY2tGZWVkYmFja1Jlc3BvbnNlLFxuICBEZXZpY2VDb250ZXh0LFxuICBGZWVkYmFja1R5cGUsXG4gIENvbnRlbnRSZWYsXG4gIEVudGl0eVJlZixcbiAgUmVhY3Rpb25WYWx1ZSxcbiAgRmVlZGJhY2tGaXJlc3RvcmVEb2MsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgRmlyZXN0b3JlU2VydmljZSB9IGZyb20gJy4uL2ZpcmViYXNlL2ZpcmVzdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vYXV0aC9hdXRoLnNlcnZpY2UnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgZ2VzdGlvbmFyIGZlZWRiYWNrIGRlIHVzdWFyaW9zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBmZWVkYmFja1NlcnZpY2UgPSBpbmplY3QoRmVlZGJhY2tTZXJ2aWNlKTtcbiAqXG4gKiAgIGFzeW5jIHN1Ym1pdEZlZWRiYWNrKCkge1xuICogICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZWVkYmFja1NlcnZpY2UuY3JlYXRlQXN5bmMoXG4gKiAgICAgICAnZmVlZGJhY2snLFxuICogICAgICAgJ01pIGNvbWVudGFyaW8nLFxuICogICAgICAgJ0Rlc2NyaXBjacOzbiBkZXRhbGxhZGEuLi4nXG4gKiAgICAgKTtcbiAqICAgICBjb25zb2xlLmxvZygnRmVlZGJhY2sgZW52aWFkbzonLCByZXNwb25zZS5mZWVkYmFja0lkKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRmVlZGJhY2tTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoVkFMVEVDSF9GRUVEQkFDS19DT05GSUcpO1xuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gIHByaXZhdGUgZmlyZXN0b3JlID0gaW5qZWN0KEZpcmVzdG9yZVNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKipcbiAgICogVVJMIGJhc2UgcGFyYSBlbmRwb2ludHMgZGUgZmVlZGJhY2suXG4gICAqL1xuICBwcml2YXRlIGdldCBiYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnLmFwaVVybH0ke3RoaXMuY29uZmlnLmZlZWRiYWNrUHJlZml4fWA7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyYSBlbCBjb250ZXh0byBkZWwgZGlzcG9zaXRpdm8gYXV0b23DoXRpY2FtZW50ZS5cbiAgICovXG4gIGNhcHR1cmVEZXZpY2VDb250ZXh0KCk6IERldmljZUNvbnRleHQge1xuICAgIGNvbnN0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICByZXR1cm4ge1xuICAgICAgYnJvd3NlcjogdGhpcy5kZXRlY3RCcm93c2VyKHVhKSxcbiAgICAgIG9zOiB0aGlzLmRldGVjdE9TKHVhKSxcbiAgICAgIHZpZXdwb3J0OiBgJHt3aW5kb3cuaW5uZXJXaWR0aH14JHt3aW5kb3cuaW5uZXJIZWlnaHR9YCxcbiAgICAgIGxhbmd1YWdlOiBuYXZpZ2F0b3IubGFuZ3VhZ2UsXG4gICAgICB1c2VyQWdlbnQ6IHVhLFxuICAgICAgcGFnZVVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhIHVuIG51ZXZvIGZlZWRiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSAtIFRpcG8gZGUgZmVlZGJhY2tcbiAgICogQHBhcmFtIHRpdGxlIC0gVMOtdHVsbyBkZWwgZmVlZGJhY2tcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gRGVzY3JpcGNpw7NuIGRldGFsbGFkYVxuICAgKiBAcGFyYW0gYXR0YWNobWVudHMgLSBVUkxzIGRlIGFyY2hpdm9zIGFkanVudG9zIChvcGNpb25hbClcbiAgICogQHBhcmFtIGNvbnRlbnRSZWYgLSBSZWZlcmVuY2lhIGEgY29udGVuaWRvIGVzcGVjw61maWNvIChvcGNpb25hbClcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb24gbGEgcmVzcHVlc3RhXG4gICAqL1xuICBjcmVhdGUoXG4gICAgdHlwZTogRmVlZGJhY2tUeXBlLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBhdHRhY2htZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBjb250ZW50UmVmPzogQ29udGVudFJlZlxuICApOiBPYnNlcnZhYmxlPENyZWF0ZUZlZWRiYWNrUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBDcmVhdGVGZWVkYmFja1JlcXVlc3QgPSB7XG4gICAgICB0eXBlLFxuICAgICAgdGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgY29udGVudFJlZixcbiAgICAgIGRldmljZUNvbnRleHQ6IHRoaXMuY2FwdHVyZURldmljZUNvbnRleHQoKSxcbiAgICAgIGFwcElkOiB0aGlzLmNvbmZpZy5hcHBJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENyZWF0ZUZlZWRiYWNrUmVzcG9uc2U+KHRoaXMuYmFzZVVybCwgcmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYSB1biBudWV2byBmZWVkYmFjayAodmVyc2nDs24gYXN5bmMvYXdhaXQpLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQXN5bmMoXG4gICAgdHlwZTogRmVlZGJhY2tUeXBlLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBhdHRhY2htZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBjb250ZW50UmVmPzogQ29udGVudFJlZlxuICApOiBQcm9taXNlPENyZWF0ZUZlZWRiYWNrUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmNyZWF0ZSh0eXBlLCB0aXRsZSwgZGVzY3JpcHRpb24sIGF0dGFjaG1lbnRzLCBjb250ZW50UmVmKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSB1biBmZWVkYmFjayBwb3IgSUQgKHNvbG8gZWwgcHJvcGlldGFyaW8pLlxuICAgKlxuICAgKiBAcGFyYW0gZmVlZGJhY2tJZCAtIElEIGRlbCBmZWVkYmFja1xuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiBsYSByZXNwdWVzdGFcbiAgICovXG4gIGdldEJ5SWQoZmVlZGJhY2tJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxHZXRGZWVkYmFja1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8R2V0RmVlZGJhY2tSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS8ke2ZlZWRiYWNrSWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSB1biBmZWVkYmFjayBwb3IgSUQgKHZlcnNpw7NuIGFzeW5jL2F3YWl0KS5cbiAgICovXG4gIGFzeW5jIGdldEJ5SWRBc3luYyhmZWVkYmFja0lkOiBzdHJpbmcpOiBQcm9taXNlPEdldEZlZWRiYWNrUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5nZXRCeUlkKGZlZWRiYWNrSWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGEgc2kgdW4gYXJjaGl2byBjdW1wbGUgY29uIGxhcyByZXN0cmljY2lvbmVzLlxuICAgKi9cbiAgdmFsaWRhdGVGaWxlKGZpbGU6IEZpbGUpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgICAvLyBWZXJpZmljYXIgdGFtYcOxb1xuICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLmNvbmZpZy5tYXhGaWxlU2l6ZSEpIHtcbiAgICAgIGNvbnN0IG1heFNpemVNQiA9IE1hdGgucm91bmQodGhpcy5jb25maWcubWF4RmlsZVNpemUhIC8gKDEwMjQgKiAxMDI0KSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBgRWwgYXJjaGl2byBleGNlZGUgZWwgdGFtYcOxbyBtw6F4aW1vIGRlICR7bWF4U2l6ZU1CfU1CYCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmVyaWZpY2FyIHRpcG9cbiAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLmNvbmZpZy5hbGxvd2VkRmlsZVR5cGVzIHx8IFtdO1xuICAgIGNvbnN0IGlzQWxsb3dlZCA9IGFsbG93ZWRUeXBlcy5zb21lKChwYXR0ZXJuKSA9PiB7XG4gICAgICBpZiAocGF0dGVybi5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICBjb25zdCBiYXNlVHlwZSA9IHBhdHRlcm4ucmVwbGFjZSgnLyonLCAnJyk7XG4gICAgICAgIHJldHVybiBmaWxlLnR5cGUuc3RhcnRzV2l0aChiYXNlVHlwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsZS50eXBlID09PSBwYXR0ZXJuO1xuICAgIH0pO1xuXG4gICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdUaXBvIGRlIGFyY2hpdm8gbm8gcGVybWl0aWRvJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGFjdHVhbCBkZWwgc2VydmljaW8uXG4gICAqL1xuICBnZXRDb25maWcoKTogUmVhZG9ubHk8dHlwZW9mIHRoaXMuY29uZmlnPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGlvbiBNZXRob2RzIChDb250ZW50IGZlZWRiYWNrIHdpdGggZW1vamlzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8geWEgZGlvIGZlZWRiYWNrIHBhcmEgdW5hIGVudGlkYWQgZXNwZWPDrWZpY2EuXG4gICAqXG4gICAqIFByaW1lcm8gaW50ZW50YSBsZWVyIGRlIEZpcmViYXNlIChyw6FwaWRvLCBzaW4gbGF0ZW5jaWEgZGUgcmVkIGFsIGJhY2tlbmQpLlxuICAgKiBTaSBGaXJlYmFzZSBubyBlc3TDoSBkaXNwb25pYmxlIG8gZmFsbGEsIGhhY2UgZmFsbGJhY2sgYSBsYSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlUeXBlIC0gVGlwbyBkZSBlbnRpZGFkIChhcnRpY2xlLCBkb2NzLCBmZWF0dXJlLCBldGMuKVxuICAgKiBAcGFyYW0gZW50aXR5SWQgLSBJRCBkZSBsYSBlbnRpZGFkXG4gICAqIEByZXR1cm5zIFByb21pc2UgY29uIGxhIHJlc3B1ZXN0YSBkZSB2ZXJpZmljYWNpw7NuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2hlY2sgPSBhd2FpdCB0aGlzLmZlZWRiYWNrU2VydmljZS5jaGVja0ZlZWRiYWNrKCdhcnRpY2xlJywgJ2FydC0xMjMnKTtcbiAgICogaWYgKGNoZWNrLmhhc0ZlZWRiYWNrKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1lhIGRpbyBmZWVkYmFjazonLCBjaGVjay5yZWFjdGlvblZhbHVlKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNoZWNrRmVlZGJhY2soXG4gICAgZW50aXR5VHlwZTogc3RyaW5nLFxuICAgIGVudGl0eUlkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxDaGVja0ZlZWRiYWNrUmVzcG9uc2U+IHtcbiAgICAvLyBTaSBubyBoYXkgdXN1YXJpbyBhdXRlbnRpY2Fkbywgbm8gcHVlZGUgaGFiZXIgZmVlZGJhY2sgcHJldmlvXG4gICAgLy8gUmV0b3JuYXIgaW5tZWRpYXRhbWVudGUgc2luIGxsYW1hciBhbCBBUEkgKGV2aXRhIDQwMSB5IHJlZGlyZWN0IGEgbG9naW4pXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5hdXRoPy51c2VyKCk/LnVzZXJJZDtcbiAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgcmV0dXJuIHsgb3BlcmF0aW9uSWQ6ICcnLCBoYXNGZWVkYmFjazogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyAxLiBJbnRlbnRhciBGaXJlYmFzZSBwcmltZXJvIChzaSBlc3TDoSBkaXNwb25pYmxlKVxuICAgIGlmICh0aGlzLmZpcmVzdG9yZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUGF0aDogZmVlZGJhY2sve2VudGl0eVR5cGV9L3tlbnRpdHlJZH0ve3VzZXJJZH1cbiAgICAgICAgLy8gRmlyZXN0b3JlU2VydmljZSBhZ3JlZ2EgYXV0b23DoXRpY2FtZW50ZSBlbCBwcmVmaWpvIGFwcHMve2FwcElkfS9cbiAgICAgICAgY29uc3QgY29sbGVjdGlvblBhdGggPSBgZmVlZGJhY2svJHtlbnRpdHlUeXBlfS8ke2VudGl0eUlkfWA7XG4gICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHRoaXMuZmlyZXN0b3JlLmdldERvYzxGZWVkYmFja0ZpcmVzdG9yZURvYz4oXG4gICAgICAgICAgY29sbGVjdGlvblBhdGgsXG4gICAgICAgICAgdXNlcklkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVyYXRpb25JZDogJycsXG4gICAgICAgICAgICBoYXNGZWVkYmFjazogdHJ1ZSxcbiAgICAgICAgICAgIGZlZWRiYWNrSWQ6IGRvYy5mZWVkYmFja0lkLFxuICAgICAgICAgICAgdHlwZTogZG9jLnR5cGUgYXMgRmVlZGJhY2tUeXBlLFxuICAgICAgICAgICAgcmVhY3Rpb25WYWx1ZTogZG9jLnJlYWN0aW9uVmFsdWUgYXMgUmVhY3Rpb25WYWx1ZSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogZG9jLmNyZWF0ZWRBdD8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9jIG5vIGV4aXN0ZSA9IG5vIGhheSBmZWVkYmFja1xuICAgICAgICByZXR1cm4geyBvcGVyYXRpb25JZDogJycsIGhhc0ZlZWRiYWNrOiBmYWxzZSB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbRmVlZGJhY2tTZXJ2aWNlXSBGaXJlYmFzZSBjaGVjayBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBBUEk6JywgZXJyb3IpO1xuICAgICAgICAvLyBGYWxsYmFjayBhIEFQSVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEZhbGxiYWNrOiBsbGFtYXIgQVBJIChzb2xvIHNpIGhheSB1c3VhcmlvIGF1dGVudGljYWRvKVxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgYXBwSWQ6IHRoaXMuY29uZmlnLmFwcElkLFxuICAgICAgZW50aXR5VHlwZSxcbiAgICAgIGVudGl0eUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLmdldDxDaGVja0ZlZWRiYWNrUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vY2hlY2s/JHtwYXJhbXN9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWEgbyBhY3R1YWxpemEgdW5hIHJlYWNjacOzbiAoZmVlZGJhY2sgY29uIGVtb2ppKS5cbiAgICpcbiAgICogQHBhcmFtIGVudGl0eVJlZiAtIFJlZmVyZW5jaWEgYSBsYSBlbnRpZGFkXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbG9yIGRlIGxhIHJlYWNjacOzbiAobmVnYXRpdmUsIG5ldXRyYWwsIHBvc2l0aXZlKVxuICAgKiBAcGFyYW0gY29tbWVudCAtIENvbWVudGFyaW8gb3BjaW9uYWwgKG3DoXggNTAwIGNhcmFjdGVyZXMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgY29uIGxhIHJlc3B1ZXN0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZWVkYmFja1NlcnZpY2UuY3JlYXRlUmVhY3Rpb24oXG4gICAqICAgeyBlbnRpdHlUeXBlOiAnYXJ0aWNsZScsIGVudGl0eUlkOiAnYXJ0LTEyMycgfSxcbiAgICogICAncG9zaXRpdmUnLFxuICAgKiAgICdNdXkgw7p0aWwhJ1xuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJlYWN0aW9uKFxuICAgIGVudGl0eVJlZjogRW50aXR5UmVmLFxuICAgIHZhbHVlOiBSZWFjdGlvblZhbHVlLFxuICAgIGNvbW1lbnQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxDcmVhdGVGZWVkYmFja1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ3JlYXRlRmVlZGJhY2tSZXF1ZXN0ID0ge1xuICAgICAgdHlwZTogJ3JlYWN0aW9uJyxcbiAgICAgIGVudGl0eVJlZixcbiAgICAgIHJlYWN0aW9uVmFsdWU6IHZhbHVlLFxuICAgICAgZGVzY3JpcHRpb246IGNvbW1lbnQgfHwgJycsXG4gICAgICBkZXZpY2VDb250ZXh0OiB0aGlzLmNhcHR1cmVEZXZpY2VDb250ZXh0KCksXG4gICAgICBhcHBJZDogdGhpcy5jb25maWcuYXBwSWQsXG4gICAgfTtcblxuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMuaHR0cC5wb3N0PENyZWF0ZUZlZWRiYWNrUmVzcG9uc2U+KHRoaXMuYmFzZVVybCwgcmVxdWVzdClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWEgZmVlZGJhY2sgYW7Ds25pbW8gKHNpbiBhdXRlbnRpY2FjacOzbiByZXF1ZXJpZGEpLlxuICAgKiBVc2FkbyBwYXJhIGJsb2dzLCBGQVFzIHkgY29udGVuaWRvIHDDumJsaWNvLlxuICAgKlxuICAgKiBAcGFyYW0gZW50aXR5UmVmIC0gUmVmZXJlbmNpYSBhIGxhIGVudGlkYWRcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsb3IgZGUgbGEgcmVhY2Npw7NuIChuZWdhdGl2ZSwgbmV1dHJhbCwgcG9zaXRpdmUpXG4gICAqIEBwYXJhbSBjb21tZW50IC0gQ29tZW50YXJpbyBvcGNpb25hbCAobcOheCA1MDAgY2FyYWN0ZXJlcylcbiAgICogQHJldHVybnMgUHJvbWlzZSBjb24gbGEgcmVzcHVlc3RhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRW4gdW4gYmxvZyBww7pibGljb1xuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNyZWF0ZUFub255bW91c1JlYWN0aW9uKFxuICAgKiAgIHsgZW50aXR5VHlwZTogJ2Jsb2cnLCBlbnRpdHlJZDogJ215LXBvc3Qtc2x1ZycgfSxcbiAgICogICAncG9zaXRpdmUnXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQW5vbnltb3VzUmVhY3Rpb24oXG4gICAgZW50aXR5UmVmOiBFbnRpdHlSZWYsXG4gICAgdmFsdWU6IFJlYWN0aW9uVmFsdWUsXG4gICAgY29tbWVudD86IHN0cmluZ1xuICApOiBQcm9taXNlPENyZWF0ZUZlZWRiYWNrUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgdHlwZTogJ3JlYWN0aW9uJyBhcyBjb25zdCxcbiAgICAgIGVudGl0eVJlZixcbiAgICAgIHJlYWN0aW9uVmFsdWU6IHZhbHVlLFxuICAgICAgZGVzY3JpcHRpb246IGNvbW1lbnQgfHwgJycsXG4gICAgICBkZXZpY2VDb250ZXh0OiB0aGlzLmNhcHR1cmVEZXZpY2VDb250ZXh0KCksXG4gICAgICBhcHBJZDogdGhpcy5jb25maWcuYXBwSWQsXG4gICAgfTtcblxuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMuaHR0cC5wb3N0PENyZWF0ZUZlZWRiYWNrUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vYW5vbnltb3VzYCwgcmVxdWVzdClcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIZWxwZXJzIHByaXZhZG9zIHBhcmEgZGV0ZWNjacOzbiBkZSBicm93c2VyL09TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGRldGVjdEJyb3dzZXIodWE6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdFZGcvJykpIHJldHVybiAnRWRnZSc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdDaHJvbWUvJykpIHJldHVybiAnQ2hyb21lJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ0ZpcmVmb3gvJykpIHJldHVybiAnRmlyZWZveCc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdTYWZhcmkvJykgJiYgIXVhLmluY2x1ZGVzKCdDaHJvbWUnKSkgcmV0dXJuICdTYWZhcmknO1xuICAgIGlmICh1YS5pbmNsdWRlcygnT3BlcmEnKSB8fCB1YS5pbmNsdWRlcygnT1BSLycpKSByZXR1cm4gJ09wZXJhJztcbiAgICByZXR1cm4gJ1Vua25vd24nO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RPUyh1YTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodWEuaW5jbHVkZXMoJ1dpbmRvd3MgTlQgMTAnKSkgcmV0dXJuICdXaW5kb3dzIDEwJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ1dpbmRvd3MgTlQgMTEnKSkgcmV0dXJuICdXaW5kb3dzIDExJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ1dpbmRvd3MnKSkgcmV0dXJuICdXaW5kb3dzJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ01hYyBPUyBYJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdWEubWF0Y2goL01hYyBPUyBYIChcXGQrWy5fXVxcZCspLyk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGBtYWNPUyAke21hdGNoWzFdLnJlcGxhY2UoJ18nLCAnLicpfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ21hY09TJztcbiAgICB9XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdBbmRyb2lkJykpIHJldHVybiAnQW5kcm9pZCc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdpUGhvbmUnKSB8fCB1YS5pbmNsdWRlcygnaVBhZCcpKSByZXR1cm4gJ2lPUyc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdMaW51eCcpKSByZXR1cm4gJ0xpbnV4JztcbiAgICByZXR1cm4gJ1Vua25vd24nO1xuICB9XG59XG4iXX0=
|
|
383
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZGJhY2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmVlZGJhY2svZmVlZGJhY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFjLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFhbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFFbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQUQ1QjtRQUVVLFdBQU0sR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN6QyxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFCLGNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RCxZQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7S0FzWXhEO0lBcFlDOztPQUVHO0lBQ0gsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQy9CLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDL0IsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUN0RCxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7WUFDNUIsU0FBUyxFQUFFLEVBQUU7WUFDYixPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUNKLElBQWtCLEVBQ2xCLEtBQWEsRUFDYixXQUFtQixFQUNuQixjQUF3QixFQUFFLEVBQzFCLFVBQXVCO1FBRXZCLE1BQU0sT0FBTyxHQUEwQjtZQUNyQyxJQUFJO1lBQ0osS0FBSztZQUNMLFdBQVc7WUFDWCxXQUFXO1lBQ1gsVUFBVTtZQUNWLGFBQWEsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDMUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztTQUN6QixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBeUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLElBQWtCLEVBQ2xCLEtBQWEsRUFDYixXQUFtQixFQUNuQixjQUF3QixFQUFFLEVBQzFCLFVBQXVCO1FBRXZCLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLFVBQWtCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQXNCLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBa0I7UUFDbkMsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxJQUFVO1FBQ3JCLG1CQUFtQjtRQUNuQixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFZLEVBQUUsQ0FBQztZQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBWSxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkUsT0FBTztnQkFDTCxLQUFLLEVBQUUsS0FBSztnQkFDWixLQUFLLEVBQUUseUNBQXlDLFNBQVMsSUFBSTthQUM5RCxDQUFDO1FBQ0osQ0FBQztRQUVELGlCQUFpQjtRQUNqQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUN4RCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzVDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osS0FBSyxFQUFFLDhCQUE4QjthQUN0QyxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFVO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFOUIsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCwrQkFBK0I7UUFDL0IsSUFDRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQ2IsQ0FBQztZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUNELHVDQUF1QztRQUN2QyxJQUNFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUNiLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJO1lBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFDZCxDQUFDO1lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsZUFBZTtRQUNmLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdEYsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQsT0FBTztZQUNMLEtBQUssRUFBRSxLQUFLO1lBQ1osS0FBSyxFQUFFLDRFQUE0RTtTQUNwRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFVO1FBQy9CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSxrRUFBa0U7UUFDbEUsTUFBTSxJQUFJLEdBQ1IsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLFlBQVksSUFBSSxNQUFNO1lBQ3JELENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ3JCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLFNBQVMsTUFBTSxhQUFhLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUU1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDNUQsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ3RCLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsa0RBQWtEO0lBQ2xELDRFQUE0RTtJQUU1RTs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQWtCLEVBQUUsUUFBZ0I7UUFDdEQsZ0VBQWdFO1FBQ2hFLDJFQUEyRTtRQUMzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDakQsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUM7Z0JBQ0gsa0RBQWtEO2dCQUNsRCxtRUFBbUU7Z0JBQ25FLE1BQU0sY0FBYyxHQUFHLFlBQVksVUFBVSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUF1QixjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBRXRGLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ1IsT0FBTzt3QkFDTCxXQUFXLEVBQUUsRUFBRTt3QkFDZixXQUFXLEVBQUUsSUFBSTt3QkFDakIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO3dCQUMxQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQW9CO3dCQUM5QixhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQThCO3dCQUNqRCxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUU7cUJBQ3hDLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxrQ0FBa0M7Z0JBQ2xDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNqRCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsSUFBSSxDQUFDLCtEQUErRCxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNyRixpQkFBaUI7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCw0REFBNEQ7UUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUM7WUFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixVQUFVO1lBQ1YsUUFBUTtTQUNULENBQUMsQ0FBQztRQUVILE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF3QixHQUFHLElBQUksQ0FBQyxPQUFPLFVBQVUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQ2xCLFNBQW9CLEVBQ3BCLEtBQW9CLEVBQ3BCLE9BQWdCO1FBRWhCLE1BQU0sT0FBTyxHQUEwQjtZQUNyQyxJQUFJLEVBQUUsVUFBVTtZQUNoQixTQUFTO1lBQ1QsYUFBYSxFQUFFLEtBQUs7WUFDcEIsV0FBVyxFQUFFLE9BQU8sSUFBSSxFQUFFO1lBQzFCLGFBQWEsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDMUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztTQUN6QixDQUFDO1FBRUYsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQXlCLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixTQUFvQixFQUNwQixLQUFvQixFQUNwQixPQUFnQjtRQUVoQixNQUFNLE9BQU8sR0FBRztZQUNkLElBQUksRUFBRSxVQUFtQjtZQUN6QixTQUFTO1lBQ1QsYUFBYSxFQUFFLEtBQUs7WUFDcEIsV0FBVyxFQUFFLE9BQU8sSUFBSSxFQUFFO1lBQzFCLGFBQWEsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDMUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztTQUN6QixDQUFDO1FBRUYsT0FBTyxjQUFjLENBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUF5QixHQUFHLElBQUksQ0FBQyxPQUFPLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FDN0UsQ0FBQztJQUNKLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsZ0RBQWdEO0lBQ2hELDRFQUE0RTtJQUVwRSxhQUFhLENBQUMsRUFBVTtRQUM5QixJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDdkMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzVDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM5QyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQ3RFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQ2hFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxRQUFRLENBQUMsRUFBVTtRQUN6QixJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEQsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ3RELElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM3QyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDaEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixPQUFPLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM3QyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvRCxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDekMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzsrR0ExWVUsZUFBZTttSEFBZixlQUFlLGNBREYsTUFBTTs7NEZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFZBTFRFQ0hfRkVFREJBQ0tfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtcbiAgQ3JlYXRlRmVlZGJhY2tSZXF1ZXN0LFxuICBDcmVhdGVGZWVkYmFja1Jlc3BvbnNlLFxuICBHZXRGZWVkYmFja1Jlc3BvbnNlLFxuICBDaGVja0ZlZWRiYWNrUmVzcG9uc2UsXG4gIERldmljZUNvbnRleHQsXG4gIEZlZWRiYWNrVHlwZSxcbiAgQ29udGVudFJlZixcbiAgRW50aXR5UmVmLFxuICBSZWFjdGlvblZhbHVlLFxuICBGZWVkYmFja0ZpcmVzdG9yZURvYyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBGaXJlc3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vZmlyZWJhc2UvZmlyZXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9maXJlYmFzZS9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoL2F1dGguc2VydmljZSc7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBnZXN0aW9uYXIgZmVlZGJhY2sgZGUgdXN1YXJpb3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBwcml2YXRlIGZlZWRiYWNrU2VydmljZSA9IGluamVjdChGZWVkYmFja1NlcnZpY2UpO1xuICpcbiAqICAgYXN5bmMgc3VibWl0RmVlZGJhY2soKSB7XG4gKiAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZlZWRiYWNrU2VydmljZS5jcmVhdGVBc3luYyhcbiAqICAgICAgICdmZWVkYmFjaycsXG4gKiAgICAgICAnTWkgY29tZW50YXJpbycsXG4gKiAgICAgICAnRGVzY3JpcGNpw7NuIGRldGFsbGFkYS4uLidcbiAqICAgICApO1xuICogICAgIGNvbnNvbGUubG9nKCdGZWVkYmFjayBlbnZpYWRvOicsIHJlc3BvbnNlLmZlZWRiYWNrSWQpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBGZWVkYmFja1NlcnZpY2Uge1xuICBwcml2YXRlIGNvbmZpZyA9IGluamVjdChWQUxURUNIX0ZFRURCQUNLX0NPTkZJRyk7XG4gIHByaXZhdGUgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgcHJpdmF0ZSBmaXJlc3RvcmUgPSBpbmplY3QoRmlyZXN0b3JlU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBzdG9yYWdlID0gaW5qZWN0KFN0b3JhZ2VTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgLyoqXG4gICAqIFVSTCBiYXNlIHBhcmEgZW5kcG9pbnRzIGRlIGZlZWRiYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5hcGlVcmx9JHt0aGlzLmNvbmZpZy5mZWVkYmFja1ByZWZpeH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmEgZWwgY29udGV4dG8gZGVsIGRpc3Bvc2l0aXZvIGF1dG9tw6F0aWNhbWVudGUuXG4gICAqL1xuICBjYXB0dXJlRGV2aWNlQ29udGV4dCgpOiBEZXZpY2VDb250ZXh0IHtcbiAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJyb3dzZXI6IHRoaXMuZGV0ZWN0QnJvd3Nlcih1YSksXG4gICAgICBvczogdGhpcy5kZXRlY3RPUyh1YSksXG4gICAgICB2aWV3cG9ydDogYCR7d2luZG93LmlubmVyV2lkdGh9eCR7d2luZG93LmlubmVySGVpZ2h0fWAsXG4gICAgICBsYW5ndWFnZTogbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgICAgdXNlckFnZW50OiB1YSxcbiAgICAgIHBhZ2VVcmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYSB1biBudWV2byBmZWVkYmFjay5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaXBvIGRlIGZlZWRiYWNrXG4gICAqIEBwYXJhbSB0aXRsZSAtIFTDrXR1bG8gZGVsIGZlZWRiYWNrXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIERlc2NyaXBjacOzbiBkZXRhbGxhZGFcbiAgICogQHBhcmFtIGF0dGFjaG1lbnRzIC0gVVJMcyBkZSBhcmNoaXZvcyBhZGp1bnRvcyAob3BjaW9uYWwpXG4gICAqIEBwYXJhbSBjb250ZW50UmVmIC0gUmVmZXJlbmNpYSBhIGNvbnRlbmlkbyBlc3BlY8OtZmljbyAob3BjaW9uYWwpXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIGxhIHJlc3B1ZXN0YVxuICAgKi9cbiAgY3JlYXRlKFxuICAgIHR5cGU6IEZlZWRiYWNrVHlwZSxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM6IHN0cmluZ1tdID0gW10sXG4gICAgY29udGVudFJlZj86IENvbnRlbnRSZWZcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVGZWVkYmFja1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ3JlYXRlRmVlZGJhY2tSZXF1ZXN0ID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBhdHRhY2htZW50cyxcbiAgICAgIGNvbnRlbnRSZWYsXG4gICAgICBkZXZpY2VDb250ZXh0OiB0aGlzLmNhcHR1cmVEZXZpY2VDb250ZXh0KCksXG4gICAgICBhcHBJZDogdGhpcy5jb25maWcuYXBwSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDcmVhdGVGZWVkYmFja1Jlc3BvbnNlPih0aGlzLmJhc2VVcmwsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWEgdW4gbnVldm8gZmVlZGJhY2sgKHZlcnNpw7NuIGFzeW5jL2F3YWl0KS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFzeW5jKFxuICAgIHR5cGU6IEZlZWRiYWNrVHlwZSxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM6IHN0cmluZ1tdID0gW10sXG4gICAgY29udGVudFJlZj86IENvbnRlbnRSZWZcbiAgKTogUHJvbWlzZTxDcmVhdGVGZWVkYmFja1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuY3JlYXRlKHR5cGUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgYXR0YWNobWVudHMsIGNvbnRlbnRSZWYpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHVuIGZlZWRiYWNrIHBvciBJRCAoc29sbyBlbCBwcm9waWV0YXJpbykuXG4gICAqXG4gICAqIEBwYXJhbSBmZWVkYmFja0lkIC0gSUQgZGVsIGZlZWRiYWNrXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIGxhIHJlc3B1ZXN0YVxuICAgKi9cbiAgZ2V0QnlJZChmZWVkYmFja0lkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEdldEZlZWRiYWNrUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxHZXRGZWVkYmFja1Jlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9LyR7ZmVlZGJhY2tJZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHVuIGZlZWRiYWNrIHBvciBJRCAodmVyc2nDs24gYXN5bmMvYXdhaXQpLlxuICAgKi9cbiAgYXN5bmMgZ2V0QnlJZEFzeW5jKGZlZWRiYWNrSWQ6IHN0cmluZyk6IFByb21pc2U8R2V0RmVlZGJhY2tSZXNwb25zZT4ge1xuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLmdldEJ5SWQoZmVlZGJhY2tJZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYSBzaSB1biBhcmNoaXZvIGN1bXBsZSBjb24gbGFzIHJlc3RyaWNjaW9uZXMuXG4gICAqL1xuICB2YWxpZGF0ZUZpbGUoZmlsZTogRmlsZSk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAgIC8vIFZlcmlmaWNhciB0YW1hw7FvXG4gICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMuY29uZmlnLm1heEZpbGVTaXplISkge1xuICAgICAgY29uc3QgbWF4U2l6ZU1CID0gTWF0aC5yb3VuZCh0aGlzLmNvbmZpZy5tYXhGaWxlU2l6ZSEgLyAoMTAyNCAqIDEwMjQpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGBFbCBhcmNoaXZvIGV4Y2VkZSBlbCB0YW1hw7FvIG3DoXhpbW8gZGUgJHttYXhTaXplTUJ9TUJgLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYXIgdGlwb1xuICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHRoaXMuY29uZmlnLmFsbG93ZWRGaWxlVHlwZXMgfHwgW107XG4gICAgY29uc3QgaXNBbGxvd2VkID0gYWxsb3dlZFR5cGVzLnNvbWUocGF0dGVybiA9PiB7XG4gICAgICBpZiAocGF0dGVybi5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICBjb25zdCBiYXNlVHlwZSA9IHBhdHRlcm4ucmVwbGFjZSgnLyonLCAnJyk7XG4gICAgICAgIHJldHVybiBmaWxlLnR5cGUuc3RhcnRzV2l0aChiYXNlVHlwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsZS50eXBlID09PSBwYXR0ZXJuO1xuICAgIH0pO1xuXG4gICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdUaXBvIGRlIGFyY2hpdm8gbm8gcGVybWl0aWRvJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGEgZWwgQ09OVEVOSURPIGRlbCBhcmNoaXZvIHBvciBtYWdpYy1ieXRlcyAoZmlybWEgYmluYXJpYSkg4oCUXG4gICAqIGRlZmVuc2EgY29udHJhIHNwb29maW5nIGRlbCBjb250ZW50LXR5cGUgZGVjbGFyYWRvLiBMZWUgbG9zIHByaW1lcm9zIDEyXG4gICAqIGJ5dGVzIHkgbG9zIGNvbXBhcmEgY29uIGxhcyBmaXJtYXMgZGUgSlBFRy9QTkcvV2ViUC9QREYgKHdoaXRlbGlzdFxuICAgKiBlc3RyaWN0YSkuIEVzIGNsaWVudC1zaWRlLCBlcmdvIGJ5cGFzc2VhYmxlOyBsYSBkZWZlbnNhIHJlYWwgdml2ZSBlbiBsYXNcbiAgICogU3RvcmFnZSBydWxlcy4gRXN0byBjb3J0YSBlbCA5OSUgZGUgbG9zIGNhc29zIGFjY2lkZW50YWxlcyBvIG5vLXRhcmdldGVkLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVGaWxlQ29udGVudChmaWxlOiBGaWxlKTogUHJvbWlzZTx7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9PiB7XG4gICAgY29uc3QgYnVmID0gYXdhaXQgZmlsZS5zbGljZSgwLCAxMikuYXJyYXlCdWZmZXIoKTtcbiAgICBjb25zdCBiID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcblxuICAgIC8vIEpQRUc6IEZGIEQ4IEZGXG4gICAgaWYgKGJbMF0gPT09IDB4ZmYgJiYgYlsxXSA9PT0gMHhkOCAmJiBiWzJdID09PSAweGZmKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICAgIH1cbiAgICAvLyBQTkc6IDg5IDUwIDRFIDQ3IDBEIDBBIDFBIDBBXG4gICAgaWYgKFxuICAgICAgYlswXSA9PT0gMHg4OSAmJlxuICAgICAgYlsxXSA9PT0gMHg1MCAmJlxuICAgICAgYlsyXSA9PT0gMHg0ZSAmJlxuICAgICAgYlszXSA9PT0gMHg0NyAmJlxuICAgICAgYls0XSA9PT0gMHgwZCAmJlxuICAgICAgYls1XSA9PT0gMHgwYSAmJlxuICAgICAgYls2XSA9PT0gMHgxYSAmJlxuICAgICAgYls3XSA9PT0gMHgwYVxuICAgICkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgICB9XG4gICAgLy8gV2ViUDogXCJSSUZGXCIgKDAuLjMpICsgXCJXRUJQXCIgKDguLjExKVxuICAgIGlmIChcbiAgICAgIGJbMF0gPT09IDB4NTIgJiZcbiAgICAgIGJbMV0gPT09IDB4NDkgJiZcbiAgICAgIGJbMl0gPT09IDB4NDYgJiZcbiAgICAgIGJbM10gPT09IDB4NDYgJiZcbiAgICAgIGJbOF0gPT09IDB4NTcgJiZcbiAgICAgIGJbOV0gPT09IDB4NDUgJiZcbiAgICAgIGJbMTBdID09PSAweDQyICYmXG4gICAgICBiWzExXSA9PT0gMHg1MFxuICAgICkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgICB9XG4gICAgLy8gUERGOiBcIiVQREYtXCJcbiAgICBpZiAoYlswXSA9PT0gMHgyNSAmJiBiWzFdID09PSAweDUwICYmIGJbMl0gPT09IDB4NDQgJiYgYlszXSA9PT0gMHg0NiAmJiBiWzRdID09PSAweDJkKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcjogJ0VsIGNvbnRlbmlkbyBkZWwgYXJjaGl2byBubyBjb2luY2lkZSBjb24gdW4gdGlwbyBwZXJtaXRpZG8gKGltYWdlbiBvIFBERikuJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmUgdW4gYWRqdW50byBhIEZpcmViYXNlIFN0b3JhZ2UgZW4gYHVzZXJzL3t1aWR9L2ZlZWRiYWNrL3t1dWlkfS97bmFtZX1gXG4gICAqIHkgZGV2dWVsdmUgc3UgZG93bmxvYWQgVVJMLiBFamVjdXRhIHRyZXMgdmFsaWRhY2lvbmVzIGVuIG9yZGVuOlxuICAgKiAgIDEuIHRhbWHDsW8gKyB0aXBvIGRlY2xhcmFkbyAoYHZhbGlkYXRlRmlsZWApXG4gICAqICAgMi4gY29udGVuaWRvIHBvciBtYWdpYy1ieXRlcyAoYHZhbGlkYXRlRmlsZUNvbnRlbnRgKVxuICAgKiAgIDMuIHVzdWFyaW8gYXV0ZW50aWNhZG8gKG5vIHNvcG9ydGFtb3MgYWRqdW50b3MgZW4gZmVlZGJhY2sgYW7Ds25pbW8pXG4gICAqXG4gICAqIFNpIGN1YWxxdWllciB2YWxpZGFjacOzbiBmYWxsYSDihpIgcmVjaGF6YSBsYSBwcm9tZXNhIGNvbiB1biBFcnJvciBsZWdpYmxlO1xuICAgKiBlbCBjb21wb25lbnRlIHF1ZSBsYSBjb25zdW1hIGRlYmUgY2FuY2VsYXIgbGEgb3BlcmFjacOzbiBkZSBhZGp1bnRhci5cbiAgICovXG4gIGFzeW5jIHVwbG9hZEF0dGFjaG1lbnQoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgc2l6ZVR5cGVDaGVjayA9IHRoaXMudmFsaWRhdGVGaWxlKGZpbGUpO1xuICAgIGlmICghc2l6ZVR5cGVDaGVjay52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHNpemVUeXBlQ2hlY2suZXJyb3IpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRDaGVjayA9IGF3YWl0IHRoaXMudmFsaWRhdGVGaWxlQ29udGVudChmaWxlKTtcbiAgICBpZiAoIWNvbnRlbnRDaGVjay52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbnRlbnRDaGVjay5lcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5hdXRoPy51c2VyKCk/LnVzZXJJZDtcbiAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZWJlcyBpbmljaWFyIHNlc2nDs24gcGFyYSBhZGp1bnRhciBhcmNoaXZvcy4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RvcmFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdG9yYWdlU2VydmljZSBubyBlc3TDoSBjb25maWd1cmFkby4nKTtcbiAgICB9XG5cbiAgICAvLyBQYXRoIGJham8gYHVzZXJzL3t1aWR9L2ZlZWRiYWNrL2Ag4oCUIHNpYmxpbmcgZGUgYGZpbGVzL2AsIGNvbiBzdSBwcm9waWFcbiAgICAvLyByZWdsYSBlbiBgc3RvcmFnZS5ydWxlc2AgKHdoaXRlbGlzdCBlc3RyaWN0YSBKUEVHL1BORy9XZWJQL1BERiArIDVNQikuXG4gICAgLy8gc2tpcFByZWZpeD10cnVlIHBvcnF1ZSBgdXNlcnMve3VpZH0vYCBlcyBwYXRoIEdMT0JBTCBjcm9zcy1hcHAuXG4gICAgY29uc3QgdXVpZCA9XG4gICAgICB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiAncmFuZG9tVVVJRCcgaW4gY3J5cHRvXG4gICAgICAgID8gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgICAgICA6IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YDtcbiAgICBjb25zdCBzYWZlTmFtZSA9IGZpbGUubmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOS5fLV0vZywgJ18nKTtcbiAgICBjb25zdCBwYXRoID0gYHVzZXJzLyR7dXNlcklkfS9mZWVkYmFjay8ke3V1aWR9LyR7c2FmZU5hbWV9YDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RvcmFnZS51cGxvYWRBbmRHZXRVcmwocGF0aCwgZmlsZSwge1xuICAgICAgY29udGVudFR5cGU6IGZpbGUudHlwZSxcbiAgICAgIHNraXBQcmVmaXg6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5kb3dubG9hZFVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGFjdHVhbCBkZWwgc2VydmljaW8uXG4gICAqL1xuICBnZXRDb25maWcoKTogUmVhZG9ubHk8dHlwZW9mIHRoaXMuY29uZmlnPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGlvbiBNZXRob2RzIChDb250ZW50IGZlZWRiYWNrIHdpdGggZW1vamlzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8geWEgZGlvIGZlZWRiYWNrIHBhcmEgdW5hIGVudGlkYWQgZXNwZWPDrWZpY2EuXG4gICAqXG4gICAqIFByaW1lcm8gaW50ZW50YSBsZWVyIGRlIEZpcmViYXNlIChyw6FwaWRvLCBzaW4gbGF0ZW5jaWEgZGUgcmVkIGFsIGJhY2tlbmQpLlxuICAgKiBTaSBGaXJlYmFzZSBubyBlc3TDoSBkaXNwb25pYmxlIG8gZmFsbGEsIGhhY2UgZmFsbGJhY2sgYSBsYSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlUeXBlIC0gVGlwbyBkZSBlbnRpZGFkIChhcnRpY2xlLCBkb2NzLCBmZWF0dXJlLCBldGMuKVxuICAgKiBAcGFyYW0gZW50aXR5SWQgLSBJRCBkZSBsYSBlbnRpZGFkXG4gICAqIEByZXR1cm5zIFByb21pc2UgY29uIGxhIHJlc3B1ZXN0YSBkZSB2ZXJpZmljYWNpw7NuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2hlY2sgPSBhd2FpdCB0aGlzLmZlZWRiYWNrU2VydmljZS5jaGVja0ZlZWRiYWNrKCdhcnRpY2xlJywgJ2FydC0xMjMnKTtcbiAgICogaWYgKGNoZWNrLmhhc0ZlZWRiYWNrKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1lhIGRpbyBmZWVkYmFjazonLCBjaGVjay5yZWFjdGlvblZhbHVlKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNoZWNrRmVlZGJhY2soZW50aXR5VHlwZTogc3RyaW5nLCBlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTxDaGVja0ZlZWRiYWNrUmVzcG9uc2U+IHtcbiAgICAvLyBTaSBubyBoYXkgdXN1YXJpbyBhdXRlbnRpY2Fkbywgbm8gcHVlZGUgaGFiZXIgZmVlZGJhY2sgcHJldmlvXG4gICAgLy8gUmV0b3JuYXIgaW5tZWRpYXRhbWVudGUgc2luIGxsYW1hciBhbCBBUEkgKGV2aXRhIDQwMSB5IHJlZGlyZWN0IGEgbG9naW4pXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5hdXRoPy51c2VyKCk/LnVzZXJJZDtcbiAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgcmV0dXJuIHsgb3BlcmF0aW9uSWQ6ICcnLCBoYXNGZWVkYmFjazogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyAxLiBJbnRlbnRhciBGaXJlYmFzZSBwcmltZXJvIChzaSBlc3TDoSBkaXNwb25pYmxlKVxuICAgIGlmICh0aGlzLmZpcmVzdG9yZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUGF0aDogZmVlZGJhY2sve2VudGl0eVR5cGV9L3tlbnRpdHlJZH0ve3VzZXJJZH1cbiAgICAgICAgLy8gRmlyZXN0b3JlU2VydmljZSBhZ3JlZ2EgYXV0b23DoXRpY2FtZW50ZSBlbCBwcmVmaWpvIGFwcHMve2FwcElkfS9cbiAgICAgICAgY29uc3QgY29sbGVjdGlvblBhdGggPSBgZmVlZGJhY2svJHtlbnRpdHlUeXBlfS8ke2VudGl0eUlkfWA7XG4gICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHRoaXMuZmlyZXN0b3JlLmdldERvYzxGZWVkYmFja0ZpcmVzdG9yZURvYz4oY29sbGVjdGlvblBhdGgsIHVzZXJJZCk7XG5cbiAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVyYXRpb25JZDogJycsXG4gICAgICAgICAgICBoYXNGZWVkYmFjazogdHJ1ZSxcbiAgICAgICAgICAgIGZlZWRiYWNrSWQ6IGRvYy5mZWVkYmFja0lkLFxuICAgICAgICAgICAgdHlwZTogZG9jLnR5cGUgYXMgRmVlZGJhY2tUeXBlLFxuICAgICAgICAgICAgcmVhY3Rpb25WYWx1ZTogZG9jLnJlYWN0aW9uVmFsdWUgYXMgUmVhY3Rpb25WYWx1ZSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogZG9jLmNyZWF0ZWRBdD8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9jIG5vIGV4aXN0ZSA9IG5vIGhheSBmZWVkYmFja1xuICAgICAgICByZXR1cm4geyBvcGVyYXRpb25JZDogJycsIGhhc0ZlZWRiYWNrOiBmYWxzZSB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbRmVlZGJhY2tTZXJ2aWNlXSBGaXJlYmFzZSBjaGVjayBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBBUEk6JywgZXJyb3IpO1xuICAgICAgICAvLyBGYWxsYmFjayBhIEFQSVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEZhbGxiYWNrOiBsbGFtYXIgQVBJIChzb2xvIHNpIGhheSB1c3VhcmlvIGF1dGVudGljYWRvKVxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgYXBwSWQ6IHRoaXMuY29uZmlnLmFwcElkLFxuICAgICAgZW50aXR5VHlwZSxcbiAgICAgIGVudGl0eUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8Q2hlY2tGZWVkYmFja1Jlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2NoZWNrPyR7cGFyYW1zfWApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhIG8gYWN0dWFsaXphIHVuYSByZWFjY2nDs24gKGZlZWRiYWNrIGNvbiBlbW9qaSkuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlSZWYgLSBSZWZlcmVuY2lhIGEgbGEgZW50aWRhZFxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWxvciBkZSBsYSByZWFjY2nDs24gKG5lZ2F0aXZlLCBuZXV0cmFsLCBwb3NpdGl2ZSlcbiAgICogQHBhcmFtIGNvbW1lbnQgLSBDb21lbnRhcmlvIG9wY2lvbmFsIChtw6F4IDUwMCBjYXJhY3RlcmVzKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIGNvbiBsYSByZXNwdWVzdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNyZWF0ZVJlYWN0aW9uKFxuICAgKiAgIHsgZW50aXR5VHlwZTogJ2FydGljbGUnLCBlbnRpdHlJZDogJ2FydC0xMjMnIH0sXG4gICAqICAgJ3Bvc2l0aXZlJyxcbiAgICogICAnTXV5IMO6dGlsISdcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjcmVhdGVSZWFjdGlvbihcbiAgICBlbnRpdHlSZWY6IEVudGl0eVJlZixcbiAgICB2YWx1ZTogUmVhY3Rpb25WYWx1ZSxcbiAgICBjb21tZW50Pzogc3RyaW5nXG4gICk6IFByb21pc2U8Q3JlYXRlRmVlZGJhY2tSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENyZWF0ZUZlZWRiYWNrUmVxdWVzdCA9IHtcbiAgICAgIHR5cGU6ICdyZWFjdGlvbicsXG4gICAgICBlbnRpdHlSZWYsXG4gICAgICByZWFjdGlvblZhbHVlOiB2YWx1ZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBjb21tZW50IHx8ICcnLFxuICAgICAgZGV2aWNlQ29udGV4dDogdGhpcy5jYXB0dXJlRGV2aWNlQ29udGV4dCgpLFxuICAgICAgYXBwSWQ6IHRoaXMuY29uZmlnLmFwcElkLFxuICAgIH07XG5cbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnBvc3Q8Q3JlYXRlRmVlZGJhY2tSZXNwb25zZT4odGhpcy5iYXNlVXJsLCByZXF1ZXN0KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYSBmZWVkYmFjayBhbsOzbmltbyAoc2luIGF1dGVudGljYWNpw7NuIHJlcXVlcmlkYSkuXG4gICAqIFVzYWRvIHBhcmEgYmxvZ3MsIEZBUXMgeSBjb250ZW5pZG8gcMO6YmxpY28uXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlSZWYgLSBSZWZlcmVuY2lhIGEgbGEgZW50aWRhZFxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWxvciBkZSBsYSByZWFjY2nDs24gKG5lZ2F0aXZlLCBuZXV0cmFsLCBwb3NpdGl2ZSlcbiAgICogQHBhcmFtIGNvbW1lbnQgLSBDb21lbnRhcmlvIG9wY2lvbmFsIChtw6F4IDUwMCBjYXJhY3RlcmVzKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIGNvbiBsYSByZXNwdWVzdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBFbiB1biBibG9nIHDDumJsaWNvXG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZWVkYmFja1NlcnZpY2UuY3JlYXRlQW5vbnltb3VzUmVhY3Rpb24oXG4gICAqICAgeyBlbnRpdHlUeXBlOiAnYmxvZycsIGVudGl0eUlkOiAnbXktcG9zdC1zbHVnJyB9LFxuICAgKiAgICdwb3NpdGl2ZSdcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbm9ueW1vdXNSZWFjdGlvbihcbiAgICBlbnRpdHlSZWY6IEVudGl0eVJlZixcbiAgICB2YWx1ZTogUmVhY3Rpb25WYWx1ZSxcbiAgICBjb21tZW50Pzogc3RyaW5nXG4gICk6IFByb21pc2U8Q3JlYXRlRmVlZGJhY2tSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB0eXBlOiAncmVhY3Rpb24nIGFzIGNvbnN0LFxuICAgICAgZW50aXR5UmVmLFxuICAgICAgcmVhY3Rpb25WYWx1ZTogdmFsdWUsXG4gICAgICBkZXNjcmlwdGlvbjogY29tbWVudCB8fCAnJyxcbiAgICAgIGRldmljZUNvbnRleHQ6IHRoaXMuY2FwdHVyZURldmljZUNvbnRleHQoKSxcbiAgICAgIGFwcElkOiB0aGlzLmNvbmZpZy5hcHBJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLnBvc3Q8Q3JlYXRlRmVlZGJhY2tSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hbm9ueW1vdXNgLCByZXF1ZXN0KVxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhlbHBlcnMgcHJpdmFkb3MgcGFyYSBkZXRlY2Npw7NuIGRlIGJyb3dzZXIvT1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZGV0ZWN0QnJvd3Nlcih1YTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodWEuaW5jbHVkZXMoJ0VkZy8nKSkgcmV0dXJuICdFZGdlJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ0Nocm9tZS8nKSkgcmV0dXJuICdDaHJvbWUnO1xuICAgIGlmICh1YS5pbmNsdWRlcygnRmlyZWZveC8nKSkgcmV0dXJuICdGaXJlZm94JztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ1NhZmFyaS8nKSAmJiAhdWEuaW5jbHVkZXMoJ0Nocm9tZScpKSByZXR1cm4gJ1NhZmFyaSc7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdPcGVyYScpIHx8IHVhLmluY2x1ZGVzKCdPUFIvJykpIHJldHVybiAnT3BlcmEnO1xuICAgIHJldHVybiAnVW5rbm93bic7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdE9TKHVhOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh1YS5pbmNsdWRlcygnV2luZG93cyBOVCAxMCcpKSByZXR1cm4gJ1dpbmRvd3MgMTAnO1xuICAgIGlmICh1YS5pbmNsdWRlcygnV2luZG93cyBOVCAxMScpKSByZXR1cm4gJ1dpbmRvd3MgMTEnO1xuICAgIGlmICh1YS5pbmNsdWRlcygnV2luZG93cycpKSByZXR1cm4gJ1dpbmRvd3MnO1xuICAgIGlmICh1YS5pbmNsdWRlcygnTWFjIE9TIFgnKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB1YS5tYXRjaCgvTWFjIE9TIFggKFxcZCtbLl9dXFxkKykvKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gYG1hY09TICR7bWF0Y2hbMV0ucmVwbGFjZSgnXycsICcuJyl9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnbWFjT1MnO1xuICAgIH1cbiAgICBpZiAodWEuaW5jbHVkZXMoJ0FuZHJvaWQnKSkgcmV0dXJuICdBbmRyb2lkJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ2lQaG9uZScpIHx8IHVhLmluY2x1ZGVzKCdpUGFkJykpIHJldHVybiAnaU9TJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ0xpbnV4JykpIHJldHVybiAnTGludXgnO1xuICAgIHJldHVybiAnVW5rbm93bic7XG4gIH1cbn1cbiJdfQ==
|
package/esm2022/lib/version.mjs
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Current version of valtech-components.
|
|
3
3
|
* This is automatically updated during the publish process.
|
|
4
4
|
*/
|
|
5
|
-
export const VERSION = '2.0.
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
export const VERSION = '2.0.851';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC44NTEnO1xuIl19
|
|
@@ -53,7 +53,7 @@ import 'prismjs/components/prism-json';
|
|
|
53
53
|
* Current version of valtech-components.
|
|
54
54
|
* This is automatically updated during the publish process.
|
|
55
55
|
*/
|
|
56
|
-
const VERSION = '2.0.
|
|
56
|
+
const VERSION = '2.0.851';
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* Servicio para gestionar presets de componentes.
|
|
@@ -44255,8 +44255,10 @@ const VALTECH_FEEDBACK_CONFIG = new InjectionToken('ValtechFeedbackConfig');
|
|
|
44255
44255
|
const DEFAULT_FEEDBACK_CONFIG = {
|
|
44256
44256
|
feedbackPrefix: '/v1/feedback',
|
|
44257
44257
|
maxAttachments: 5,
|
|
44258
|
-
|
|
44259
|
-
|
|
44258
|
+
// Estándar acordado para adjuntos de feedback: solo imágenes (JPEG/PNG/WebP)
|
|
44259
|
+
// y PDF, máx 5 MB. Reflejado en `storage.rules` (path `users/{uid}/feedback/`).
|
|
44260
|
+
maxFileSize: 5 * 1024 * 1024,
|
|
44261
|
+
allowedFileTypes: ['image/jpeg', 'image/png', 'image/webp', 'application/pdf'],
|
|
44260
44262
|
storagePath: 'feedback',
|
|
44261
44263
|
};
|
|
44262
44264
|
/**
|
|
@@ -44288,9 +44290,7 @@ function provideValtechFeedback(config) {
|
|
|
44288
44290
|
...DEFAULT_FEEDBACK_CONFIG,
|
|
44289
44291
|
...config,
|
|
44290
44292
|
};
|
|
44291
|
-
return makeEnvironmentProviders([
|
|
44292
|
-
{ provide: VALTECH_FEEDBACK_CONFIG, useValue: mergedConfig },
|
|
44293
|
-
]);
|
|
44293
|
+
return makeEnvironmentProviders([{ provide: VALTECH_FEEDBACK_CONFIG, useValue: mergedConfig }]);
|
|
44294
44294
|
}
|
|
44295
44295
|
|
|
44296
44296
|
/**
|
|
@@ -44318,6 +44318,7 @@ class FeedbackService {
|
|
|
44318
44318
|
this.config = inject(VALTECH_FEEDBACK_CONFIG);
|
|
44319
44319
|
this.http = inject(HttpClient);
|
|
44320
44320
|
this.firestore = inject(FirestoreService, { optional: true });
|
|
44321
|
+
this.storage = inject(StorageService, { optional: true });
|
|
44321
44322
|
this.auth = inject(AuthService, { optional: true });
|
|
44322
44323
|
}
|
|
44323
44324
|
/**
|
|
@@ -44397,7 +44398,7 @@ class FeedbackService {
|
|
|
44397
44398
|
}
|
|
44398
44399
|
// Verificar tipo
|
|
44399
44400
|
const allowedTypes = this.config.allowedFileTypes || [];
|
|
44400
|
-
const isAllowed = allowedTypes.some(
|
|
44401
|
+
const isAllowed = allowedTypes.some(pattern => {
|
|
44401
44402
|
if (pattern.endsWith('/*')) {
|
|
44402
44403
|
const baseType = pattern.replace('/*', '');
|
|
44403
44404
|
return file.type.startsWith(baseType);
|
|
@@ -44412,6 +44413,91 @@ class FeedbackService {
|
|
|
44412
44413
|
}
|
|
44413
44414
|
return { valid: true };
|
|
44414
44415
|
}
|
|
44416
|
+
/**
|
|
44417
|
+
* Valida el CONTENIDO del archivo por magic-bytes (firma binaria) —
|
|
44418
|
+
* defensa contra spoofing del content-type declarado. Lee los primeros 12
|
|
44419
|
+
* bytes y los compara con las firmas de JPEG/PNG/WebP/PDF (whitelist
|
|
44420
|
+
* estricta). Es client-side, ergo bypasseable; la defensa real vive en las
|
|
44421
|
+
* Storage rules. Esto corta el 99% de los casos accidentales o no-targeted.
|
|
44422
|
+
*/
|
|
44423
|
+
async validateFileContent(file) {
|
|
44424
|
+
const buf = await file.slice(0, 12).arrayBuffer();
|
|
44425
|
+
const b = new Uint8Array(buf);
|
|
44426
|
+
// JPEG: FF D8 FF
|
|
44427
|
+
if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) {
|
|
44428
|
+
return { valid: true };
|
|
44429
|
+
}
|
|
44430
|
+
// PNG: 89 50 4E 47 0D 0A 1A 0A
|
|
44431
|
+
if (b[0] === 0x89 &&
|
|
44432
|
+
b[1] === 0x50 &&
|
|
44433
|
+
b[2] === 0x4e &&
|
|
44434
|
+
b[3] === 0x47 &&
|
|
44435
|
+
b[4] === 0x0d &&
|
|
44436
|
+
b[5] === 0x0a &&
|
|
44437
|
+
b[6] === 0x1a &&
|
|
44438
|
+
b[7] === 0x0a) {
|
|
44439
|
+
return { valid: true };
|
|
44440
|
+
}
|
|
44441
|
+
// WebP: "RIFF" (0..3) + "WEBP" (8..11)
|
|
44442
|
+
if (b[0] === 0x52 &&
|
|
44443
|
+
b[1] === 0x49 &&
|
|
44444
|
+
b[2] === 0x46 &&
|
|
44445
|
+
b[3] === 0x46 &&
|
|
44446
|
+
b[8] === 0x57 &&
|
|
44447
|
+
b[9] === 0x45 &&
|
|
44448
|
+
b[10] === 0x42 &&
|
|
44449
|
+
b[11] === 0x50) {
|
|
44450
|
+
return { valid: true };
|
|
44451
|
+
}
|
|
44452
|
+
// PDF: "%PDF-"
|
|
44453
|
+
if (b[0] === 0x25 && b[1] === 0x50 && b[2] === 0x44 && b[3] === 0x46 && b[4] === 0x2d) {
|
|
44454
|
+
return { valid: true };
|
|
44455
|
+
}
|
|
44456
|
+
return {
|
|
44457
|
+
valid: false,
|
|
44458
|
+
error: 'El contenido del archivo no coincide con un tipo permitido (imagen o PDF).',
|
|
44459
|
+
};
|
|
44460
|
+
}
|
|
44461
|
+
/**
|
|
44462
|
+
* Sube un adjunto a Firebase Storage en `users/{uid}/feedback/{uuid}/{name}`
|
|
44463
|
+
* y devuelve su download URL. Ejecuta tres validaciones en orden:
|
|
44464
|
+
* 1. tamaño + tipo declarado (`validateFile`)
|
|
44465
|
+
* 2. contenido por magic-bytes (`validateFileContent`)
|
|
44466
|
+
* 3. usuario autenticado (no soportamos adjuntos en feedback anónimo)
|
|
44467
|
+
*
|
|
44468
|
+
* Si cualquier validación falla → rechaza la promesa con un Error legible;
|
|
44469
|
+
* el componente que la consuma debe cancelar la operación de adjuntar.
|
|
44470
|
+
*/
|
|
44471
|
+
async uploadAttachment(file) {
|
|
44472
|
+
const sizeTypeCheck = this.validateFile(file);
|
|
44473
|
+
if (!sizeTypeCheck.valid) {
|
|
44474
|
+
throw new Error(sizeTypeCheck.error);
|
|
44475
|
+
}
|
|
44476
|
+
const contentCheck = await this.validateFileContent(file);
|
|
44477
|
+
if (!contentCheck.valid) {
|
|
44478
|
+
throw new Error(contentCheck.error);
|
|
44479
|
+
}
|
|
44480
|
+
const userId = this.auth?.user()?.userId;
|
|
44481
|
+
if (!userId) {
|
|
44482
|
+
throw new Error('Debes iniciar sesión para adjuntar archivos.');
|
|
44483
|
+
}
|
|
44484
|
+
if (!this.storage) {
|
|
44485
|
+
throw new Error('StorageService no está configurado.');
|
|
44486
|
+
}
|
|
44487
|
+
// Path bajo `users/{uid}/feedback/` — sibling de `files/`, con su propia
|
|
44488
|
+
// regla en `storage.rules` (whitelist estricta JPEG/PNG/WebP/PDF + 5MB).
|
|
44489
|
+
// skipPrefix=true porque `users/{uid}/` es path GLOBAL cross-app.
|
|
44490
|
+
const uuid = typeof crypto !== 'undefined' && 'randomUUID' in crypto
|
|
44491
|
+
? crypto.randomUUID()
|
|
44492
|
+
: `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
44493
|
+
const safeName = file.name.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
44494
|
+
const path = `users/${userId}/feedback/${uuid}/${safeName}`;
|
|
44495
|
+
const result = await this.storage.uploadAndGetUrl(path, file, {
|
|
44496
|
+
contentType: file.type,
|
|
44497
|
+
skipPrefix: true,
|
|
44498
|
+
});
|
|
44499
|
+
return result.downloadUrl;
|
|
44500
|
+
}
|
|
44415
44501
|
/**
|
|
44416
44502
|
* Obtiene la configuración actual del servicio.
|
|
44417
44503
|
*/
|