valtech-components 2.0.803 → 2.0.805

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.
@@ -0,0 +1,41 @@
1
+ import { InjectionToken, makeEnvironmentProviders } from '@angular/core';
2
+ /**
3
+ * Token de inyección para la configuración de Donation/Support.
4
+ */
5
+ export const VALTECH_DONATION_CONFIG = new InjectionToken('ValtechDonationConfig');
6
+ /** Configuración por defecto — sin métodos habilitados. */
7
+ export const DEFAULT_DONATION_CONFIG = {
8
+ methods: [],
9
+ };
10
+ /**
11
+ * Provee el feature de aportes (Support) a la aplicación Angular.
12
+ *
13
+ * Cada app del factory declara qué métodos habilita. La vista de Support
14
+ * (heredada o local) renderiza solo los métodos configurados.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // main.ts
19
+ * provideValtechDonations({
20
+ * appId: 'showcase',
21
+ * methods: ['coffee', 'bank', 'ads'],
22
+ * coffee: { provider: 'buymeacoffee', url: 'https://buymeacoffee.com/valtech' },
23
+ * bank: {
24
+ * accounts: [{
25
+ * country: 'CL', bank: 'Banco X', accountType: 'Cuenta Corriente',
26
+ * number: '000000000', taxId: '11.111.111-1', holder: 'Valtech SpA',
27
+ * email: 'aportes@valtech.com', currency: 'CLP',
28
+ * }],
29
+ * },
30
+ * ads: { provider: 'admob', rewardedUnitId: 'ca-app-pub-xxx' },
31
+ * }),
32
+ * ```
33
+ */
34
+ export function provideValtechDonations(config) {
35
+ const merged = {
36
+ ...DEFAULT_DONATION_CONFIG,
37
+ ...config,
38
+ };
39
+ return makeEnvironmentProviders([{ provide: VALTECH_DONATION_CONFIG, useValue: merged }]);
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9kb25hdGlvbi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0Y7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLGNBQWMsQ0FDdkQsdUJBQXVCLENBQ3hCLENBQUM7QUFFRiwyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQW1DO0lBQ3JFLE9BQU8sRUFBRSxFQUFFO0NBQ1osQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxNQUE2QjtJQUNuRSxNQUFNLE1BQU0sR0FBMEI7UUFDcEMsR0FBRyx1QkFBdUI7UUFDMUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUVGLE9BQU8sd0JBQXdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgSW5qZWN0aW9uVG9rZW4sIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmFsdGVjaERvbmF0aW9uQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVG9rZW4gZGUgaW55ZWNjacOzbiBwYXJhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIERvbmF0aW9uL1N1cHBvcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxURUNIX0RPTkFUSU9OX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxWYWx0ZWNoRG9uYXRpb25Db25maWc+KFxuICAnVmFsdGVjaERvbmF0aW9uQ29uZmlnJ1xuKTtcblxuLyoqIENvbmZpZ3VyYWNpw7NuIHBvciBkZWZlY3RvIOKAlCBzaW4gbcOpdG9kb3MgaGFiaWxpdGFkb3MuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ET05BVElPTl9DT05GSUc6IFBhcnRpYWw8VmFsdGVjaERvbmF0aW9uQ29uZmlnPiA9IHtcbiAgbWV0aG9kczogW10sXG59O1xuXG4vKipcbiAqIFByb3ZlZSBlbCBmZWF0dXJlIGRlIGFwb3J0ZXMgKFN1cHBvcnQpIGEgbGEgYXBsaWNhY2nDs24gQW5ndWxhci5cbiAqXG4gKiBDYWRhIGFwcCBkZWwgZmFjdG9yeSBkZWNsYXJhIHF1w6kgbcOpdG9kb3MgaGFiaWxpdGEuIExhIHZpc3RhIGRlIFN1cHBvcnRcbiAqIChoZXJlZGFkYSBvIGxvY2FsKSByZW5kZXJpemEgc29sbyBsb3MgbcOpdG9kb3MgY29uZmlndXJhZG9zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBtYWluLnRzXG4gKiBwcm92aWRlVmFsdGVjaERvbmF0aW9ucyh7XG4gKiAgIGFwcElkOiAnc2hvd2Nhc2UnLFxuICogICBtZXRob2RzOiBbJ2NvZmZlZScsICdiYW5rJywgJ2FkcyddLFxuICogICBjb2ZmZWU6IHsgcHJvdmlkZXI6ICdidXltZWFjb2ZmZWUnLCB1cmw6ICdodHRwczovL2J1eW1lYWNvZmZlZS5jb20vdmFsdGVjaCcgfSxcbiAqICAgYmFuazoge1xuICogICAgIGFjY291bnRzOiBbe1xuICogICAgICAgY291bnRyeTogJ0NMJywgYmFuazogJ0JhbmNvIFgnLCBhY2NvdW50VHlwZTogJ0N1ZW50YSBDb3JyaWVudGUnLFxuICogICAgICAgbnVtYmVyOiAnMDAwMDAwMDAwJywgdGF4SWQ6ICcxMS4xMTEuMTExLTEnLCBob2xkZXI6ICdWYWx0ZWNoIFNwQScsXG4gKiAgICAgICBlbWFpbDogJ2Fwb3J0ZXNAdmFsdGVjaC5jb20nLCBjdXJyZW5jeTogJ0NMUCcsXG4gKiAgICAgfV0sXG4gKiAgIH0sXG4gKiAgIGFkczogeyBwcm92aWRlcjogJ2FkbW9iJywgcmV3YXJkZWRVbml0SWQ6ICdjYS1hcHAtcHViLXh4eCcgfSxcbiAqIH0pLFxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmFsdGVjaERvbmF0aW9ucyhjb25maWc6IFZhbHRlY2hEb25hdGlvbkNvbmZpZyk6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgY29uc3QgbWVyZ2VkOiBWYWx0ZWNoRG9uYXRpb25Db25maWcgPSB7XG4gICAgLi4uREVGQVVMVF9ET05BVElPTl9DT05GSUcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW3sgcHJvdmlkZTogVkFMVEVDSF9ET05BVElPTl9DT05GSUcsIHVzZVZhbHVlOiBtZXJnZWQgfV0pO1xufVxuIl19
@@ -0,0 +1,92 @@
1
+ import { computed, inject, Injectable, signal } from '@angular/core';
2
+ import { VALTECH_DONATION_CONFIG } from './config';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * `DonationService`
6
+ *
7
+ * Servicio cross-app para el feature de aportes voluntarios (Support).
8
+ * Patrón factory: cada app llama `provideValtechDonations(...)` y este
9
+ * servicio expone solo los métodos habilitados.
10
+ *
11
+ * **Fase 0 (placeholder)** — abre links externos + expone datos de config.
12
+ * Sin backend. Fases futuras: rewarded ads reales, webhook de café,
13
+ * registro de intents para una página de transparencia.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * private donations = inject(DonationService);
18
+ *
19
+ * methods = this.donations.enabledMethods(); // ['coffee', 'bank']
20
+ * onCoffee() { this.donations.openCoffee(); }
21
+ * accounts = this.donations.bankAccounts();
22
+ * ```
23
+ */
24
+ export class DonationService {
25
+ constructor() {
26
+ this.config = inject(VALTECH_DONATION_CONFIG, {
27
+ optional: true,
28
+ }) ?? { methods: [] };
29
+ /** Último intent registrado — útil para tests / debugging / UI feedback. */
30
+ this._lastIntent = signal(null);
31
+ this.lastIntent = this._lastIntent.asReadonly();
32
+ /** Métodos habilitados por la app, en orden de config. */
33
+ this.enabledMethods = computed(() => this.config.methods ?? []);
34
+ }
35
+ /** `true` si el método está habilitado en la config de la app. */
36
+ isEnabled(method) {
37
+ return this.enabledMethods().includes(method);
38
+ }
39
+ /** Cuentas bancarias configuradas (vacío si `bank` no está habilitado). */
40
+ bankAccounts() {
41
+ if (!this.isEnabled('bank'))
42
+ return [];
43
+ return this.config.bank?.accounts ?? [];
44
+ }
45
+ /** Cuentas filtradas por país ISO — para apps multi-mercado. */
46
+ bankAccountsByCountry(country) {
47
+ return this.bankAccounts().filter(a => a.country.toUpperCase() === country.toUpperCase());
48
+ }
49
+ /**
50
+ * Abre el checkout de "café" (Buy Me a Coffee / Ko-fi) en una pestaña nueva.
51
+ * El proveedor es el merchant of record — Valtech no procesa el pago.
52
+ */
53
+ openCoffee() {
54
+ if (!this.isEnabled('coffee')) {
55
+ return { method: 'coffee', ok: false, reason: 'not-enabled' };
56
+ }
57
+ const url = this.config.coffee?.url;
58
+ if (!url) {
59
+ return { method: 'coffee', ok: false, reason: 'not-configured' };
60
+ }
61
+ this.recordIntent('coffee');
62
+ window.open(url, '_blank', 'noopener,noreferrer');
63
+ return { method: 'coffee', ok: true };
64
+ }
65
+ /**
66
+ * Muestra un anuncio rewarded (opt-in). **Fase 0: no implementado** —
67
+ * placeholder hasta integrar el plugin de ads (AdMob/AdSense) + la
68
+ * categoría de consentimiento. Retorna `not-supported`.
69
+ */
70
+ async showRewardedAd() {
71
+ if (!this.isEnabled('ads')) {
72
+ return { method: 'ads', ok: false, reason: 'not-enabled' };
73
+ }
74
+ // TODO Fase 3 — integrar Capacitor AdMob (mobile) / AdSense (web)
75
+ // + gate en una nueva categoría de consentimiento.
76
+ return { method: 'ads', ok: false, reason: 'not-supported' };
77
+ }
78
+ /**
79
+ * Registra la intención de aporte. **Fase 0: solo estado local.**
80
+ * Fase 4 — POST a un endpoint para una página de transparencia.
81
+ */
82
+ recordIntent(method) {
83
+ this._lastIntent.set(method);
84
+ }
85
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DonationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
86
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DonationService, providedIn: 'root' }); }
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DonationService, decorators: [{
89
+ type: Injectable,
90
+ args: [{ providedIn: 'root' }]
91
+ }] });
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9uYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZG9uYXRpb24vZG9uYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFHbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQUQ1QjtRQUVtQixXQUFNLEdBQUcsTUFBTSxDQUF3Qix1QkFBdUIsRUFBRTtZQUMvRSxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUV0Qiw0RUFBNEU7UUFDM0QsZ0JBQVcsR0FBRyxNQUFNLENBQXdCLElBQUksQ0FBQyxDQUFDO1FBQzFELGVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXBELDBEQUEwRDtRQUNqRCxtQkFBYyxHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7S0F3RHZGO0lBdERDLGtFQUFrRTtJQUNsRSxTQUFTLENBQUMsTUFBc0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLHFCQUFxQixDQUFDLE9BQWU7UUFDbkMsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDaEUsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztRQUNwQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ25FLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUNELGtFQUFrRTtRQUNsRSxtREFBbUQ7UUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxNQUFzQjtRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDOytHQWpFVSxlQUFlO21IQUFmLGVBQWUsY0FERixNQUFNOzs0RkFDbkIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZBTFRFQ0hfRE9OQVRJT05fQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgQmFua0FjY291bnQsIERvbmF0aW9uQWN0aW9uUmVzdWx0LCBEb25hdGlvbk1ldGhvZCwgVmFsdGVjaERvbmF0aW9uQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogYERvbmF0aW9uU2VydmljZWBcbiAqXG4gKiBTZXJ2aWNpbyBjcm9zcy1hcHAgcGFyYSBlbCBmZWF0dXJlIGRlIGFwb3J0ZXMgdm9sdW50YXJpb3MgKFN1cHBvcnQpLlxuICogUGF0csOzbiBmYWN0b3J5OiBjYWRhIGFwcCBsbGFtYSBgcHJvdmlkZVZhbHRlY2hEb25hdGlvbnMoLi4uKWAgeSBlc3RlXG4gKiBzZXJ2aWNpbyBleHBvbmUgc29sbyBsb3MgbcOpdG9kb3MgaGFiaWxpdGFkb3MuXG4gKlxuICogKipGYXNlIDAgKHBsYWNlaG9sZGVyKSoqIOKAlCBhYnJlIGxpbmtzIGV4dGVybm9zICsgZXhwb25lIGRhdG9zIGRlIGNvbmZpZy5cbiAqIFNpbiBiYWNrZW5kLiBGYXNlcyBmdXR1cmFzOiByZXdhcmRlZCBhZHMgcmVhbGVzLCB3ZWJob29rIGRlIGNhZsOpLFxuICogcmVnaXN0cm8gZGUgaW50ZW50cyBwYXJhIHVuYSBww6FnaW5hIGRlIHRyYW5zcGFyZW5jaWEuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgZG9uYXRpb25zID0gaW5qZWN0KERvbmF0aW9uU2VydmljZSk7XG4gKlxuICogbWV0aG9kcyA9IHRoaXMuZG9uYXRpb25zLmVuYWJsZWRNZXRob2RzKCk7ICAvLyBbJ2NvZmZlZScsICdiYW5rJ11cbiAqIG9uQ29mZmVlKCkgeyB0aGlzLmRvbmF0aW9ucy5vcGVuQ29mZmVlKCk7IH1cbiAqIGFjY291bnRzID0gdGhpcy5kb25hdGlvbnMuYmFua0FjY291bnRzKCk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBEb25hdGlvblNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdDxWYWx0ZWNoRG9uYXRpb25Db25maWc+KFZBTFRFQ0hfRE9OQVRJT05fQ09ORklHLCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pID8/IHsgbWV0aG9kczogW10gfTtcblxuICAvKiogw5psdGltbyBpbnRlbnQgcmVnaXN0cmFkbyDigJQgw7p0aWwgcGFyYSB0ZXN0cyAvIGRlYnVnZ2luZyAvIFVJIGZlZWRiYWNrLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9sYXN0SW50ZW50ID0gc2lnbmFsPERvbmF0aW9uTWV0aG9kIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGxhc3RJbnRlbnQgPSB0aGlzLl9sYXN0SW50ZW50LmFzUmVhZG9ubHkoKTtcblxuICAvKiogTcOpdG9kb3MgaGFiaWxpdGFkb3MgcG9yIGxhIGFwcCwgZW4gb3JkZW4gZGUgY29uZmlnLiAqL1xuICByZWFkb25seSBlbmFibGVkTWV0aG9kcyA9IGNvbXB1dGVkPERvbmF0aW9uTWV0aG9kW10+KCgpID0+IHRoaXMuY29uZmlnLm1ldGhvZHMgPz8gW10pO1xuXG4gIC8qKiBgdHJ1ZWAgc2kgZWwgbcOpdG9kbyBlc3TDoSBoYWJpbGl0YWRvIGVuIGxhIGNvbmZpZyBkZSBsYSBhcHAuICovXG4gIGlzRW5hYmxlZChtZXRob2Q6IERvbmF0aW9uTWV0aG9kKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlZE1ldGhvZHMoKS5pbmNsdWRlcyhtZXRob2QpO1xuICB9XG5cbiAgLyoqIEN1ZW50YXMgYmFuY2FyaWFzIGNvbmZpZ3VyYWRhcyAodmFjw61vIHNpIGBiYW5rYCBubyBlc3TDoSBoYWJpbGl0YWRvKS4gKi9cbiAgYmFua0FjY291bnRzKCk6IEJhbmtBY2NvdW50W10ge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQoJ2JhbmsnKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5iYW5rPy5hY2NvdW50cyA/PyBbXTtcbiAgfVxuXG4gIC8qKiBDdWVudGFzIGZpbHRyYWRhcyBwb3IgcGHDrXMgSVNPIOKAlCBwYXJhIGFwcHMgbXVsdGktbWVyY2Fkby4gKi9cbiAgYmFua0FjY291bnRzQnlDb3VudHJ5KGNvdW50cnk6IHN0cmluZyk6IEJhbmtBY2NvdW50W10ge1xuICAgIHJldHVybiB0aGlzLmJhbmtBY2NvdW50cygpLmZpbHRlcihhID0+IGEuY291bnRyeS50b1VwcGVyQ2FzZSgpID09PSBjb3VudHJ5LnRvVXBwZXJDYXNlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFicmUgZWwgY2hlY2tvdXQgZGUgXCJjYWbDqVwiIChCdXkgTWUgYSBDb2ZmZWUgLyBLby1maSkgZW4gdW5hIHBlc3Rhw7FhIG51ZXZhLlxuICAgKiBFbCBwcm92ZWVkb3IgZXMgZWwgbWVyY2hhbnQgb2YgcmVjb3JkIOKAlCBWYWx0ZWNoIG5vIHByb2Nlc2EgZWwgcGFnby5cbiAgICovXG4gIG9wZW5Db2ZmZWUoKTogRG9uYXRpb25BY3Rpb25SZXN1bHQge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQoJ2NvZmZlZScpKSB7XG4gICAgICByZXR1cm4geyBtZXRob2Q6ICdjb2ZmZWUnLCBvazogZmFsc2UsIHJlYXNvbjogJ25vdC1lbmFibGVkJyB9O1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLmNvbmZpZy5jb2ZmZWU/LnVybDtcbiAgICBpZiAoIXVybCkge1xuICAgICAgcmV0dXJuIHsgbWV0aG9kOiAnY29mZmVlJywgb2s6IGZhbHNlLCByZWFzb246ICdub3QtY29uZmlndXJlZCcgfTtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmRJbnRlbnQoJ2NvZmZlZScpO1xuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJyk7XG4gICAgcmV0dXJuIHsgbWV0aG9kOiAnY29mZmVlJywgb2s6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNdWVzdHJhIHVuIGFudW5jaW8gcmV3YXJkZWQgKG9wdC1pbikuICoqRmFzZSAwOiBubyBpbXBsZW1lbnRhZG8qKiDigJRcbiAgICogcGxhY2Vob2xkZXIgaGFzdGEgaW50ZWdyYXIgZWwgcGx1Z2luIGRlIGFkcyAoQWRNb2IvQWRTZW5zZSkgKyBsYVxuICAgKiBjYXRlZ29yw61hIGRlIGNvbnNlbnRpbWllbnRvLiBSZXRvcm5hIGBub3Qtc3VwcG9ydGVkYC5cbiAgICovXG4gIGFzeW5jIHNob3dSZXdhcmRlZEFkKCk6IFByb21pc2U8RG9uYXRpb25BY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCdhZHMnKSkge1xuICAgICAgcmV0dXJuIHsgbWV0aG9kOiAnYWRzJywgb2s6IGZhbHNlLCByZWFzb246ICdub3QtZW5hYmxlZCcgfTtcbiAgICB9XG4gICAgLy8gVE9ETyBGYXNlIDMg4oCUIGludGVncmFyIENhcGFjaXRvciBBZE1vYiAobW9iaWxlKSAvIEFkU2Vuc2UgKHdlYilcbiAgICAvLyArIGdhdGUgZW4gdW5hIG51ZXZhIGNhdGVnb3LDrWEgZGUgY29uc2VudGltaWVudG8uXG4gICAgcmV0dXJuIHsgbWV0aG9kOiAnYWRzJywgb2s6IGZhbHNlLCByZWFzb246ICdub3Qtc3VwcG9ydGVkJyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIGxhIGludGVuY2nDs24gZGUgYXBvcnRlLiAqKkZhc2UgMDogc29sbyBlc3RhZG8gbG9jYWwuKipcbiAgICogRmFzZSA0IOKAlCBQT1NUIGEgdW4gZW5kcG9pbnQgcGFyYSB1bmEgcMOhZ2luYSBkZSB0cmFuc3BhcmVuY2lhLlxuICAgKi9cbiAgcmVjb3JkSW50ZW50KG1ldGhvZDogRG9uYXRpb25NZXRob2QpOiB2b2lkIHtcbiAgICB0aGlzLl9sYXN0SW50ZW50LnNldChtZXRob2QpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Valtech Donation / Support Service
3
+ *
4
+ * Feature cross-app de aportes voluntarios. Patrón factory: cada app llama
5
+ * `provideValtechDonations(...)` y habilita los métodos que quiera
6
+ * (`ads` · `coffee` · `bank`).
7
+ *
8
+ * Importante (legal): el dinero recibido por una entidad con fines de lucro
9
+ * es ingreso afecto a impuesto, NO una donación deducible. La UI debe usar
10
+ * lenguaje de "aporte voluntario / apoyo", nunca "donación".
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // main.ts
15
+ * provideValtechDonations({
16
+ * appId: 'showcase',
17
+ * methods: ['coffee', 'bank'],
18
+ * coffee: { provider: 'buymeacoffee', url: 'https://buymeacoffee.com/valtech' },
19
+ * bank: { accounts: [ ... ] },
20
+ * }),
21
+ * ```
22
+ */
23
+ export { VALTECH_DONATION_CONFIG, provideValtechDonations, DEFAULT_DONATION_CONFIG, } from './config';
24
+ export { DonationService } from './donation.service';
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2RvbmF0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHVCQUF1QixFQUN2Qix1QkFBdUIsR0FDeEIsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWYWx0ZWNoIERvbmF0aW9uIC8gU3VwcG9ydCBTZXJ2aWNlXG4gKlxuICogRmVhdHVyZSBjcm9zcy1hcHAgZGUgYXBvcnRlcyB2b2x1bnRhcmlvcy4gUGF0csOzbiBmYWN0b3J5OiBjYWRhIGFwcCBsbGFtYVxuICogYHByb3ZpZGVWYWx0ZWNoRG9uYXRpb25zKC4uLilgIHkgaGFiaWxpdGEgbG9zIG3DqXRvZG9zIHF1ZSBxdWllcmFcbiAqIChgYWRzYCDCtyBgY29mZmVlYCDCtyBgYmFua2ApLlxuICpcbiAqIEltcG9ydGFudGUgKGxlZ2FsKTogZWwgZGluZXJvIHJlY2liaWRvIHBvciB1bmEgZW50aWRhZCBjb24gZmluZXMgZGUgbHVjcm9cbiAqIGVzIGluZ3Jlc28gYWZlY3RvIGEgaW1wdWVzdG8sIE5PIHVuYSBkb25hY2nDs24gZGVkdWNpYmxlLiBMYSBVSSBkZWJlIHVzYXJcbiAqIGxlbmd1YWplIGRlIFwiYXBvcnRlIHZvbHVudGFyaW8gLyBhcG95b1wiLCBudW5jYSBcImRvbmFjacOzblwiLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBtYWluLnRzXG4gKiBwcm92aWRlVmFsdGVjaERvbmF0aW9ucyh7XG4gKiAgIGFwcElkOiAnc2hvd2Nhc2UnLFxuICogICBtZXRob2RzOiBbJ2NvZmZlZScsICdiYW5rJ10sXG4gKiAgIGNvZmZlZTogeyBwcm92aWRlcjogJ2J1eW1lYWNvZmZlZScsIHVybDogJ2h0dHBzOi8vYnV5bWVhY29mZmVlLmNvbS92YWx0ZWNoJyB9LFxuICogICBiYW5rOiB7IGFjY291bnRzOiBbIC4uLiBdIH0sXG4gKiB9KSxcbiAqIGBgYFxuICovXG5cbmV4cG9ydCB7XG4gIFZBTFRFQ0hfRE9OQVRJT05fQ09ORklHLFxuICBwcm92aWRlVmFsdGVjaERvbmF0aW9ucyxcbiAgREVGQVVMVF9ET05BVElPTl9DT05GSUcsXG59IGZyb20gJy4vY29uZmlnJztcblxuZXhwb3J0IHsgRG9uYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9kb25hdGlvbi5zZXJ2aWNlJztcblxuZXhwb3J0IHtcbiAgRG9uYXRpb25NZXRob2QsXG4gIENvZmZlZVByb3ZpZGVyLFxuICBBZHNQcm92aWRlcixcbiAgQmFua0FjY291bnQsXG4gIENvZmZlZUNvbmZpZyxcbiAgQWRzQ29uZmlnLFxuICBWYWx0ZWNoRG9uYXRpb25Db25maWcsXG4gIERvbmF0aW9uQWN0aW9uUmVzdWx0LFxufSBmcm9tICcuL3R5cGVzJztcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Valtech Donation / Support — tipos.
3
+ *
4
+ * Nota legal importante: el dinero recibido por una entidad con fines de lucro
5
+ * NO es una "donación" deducible de impuestos — es ingreso afecto. Por eso la
6
+ * UI debe usar lenguaje de "aporte voluntario / apoyo", nunca "donación" en su
7
+ * sentido jurídico. Ver `docs/` (pendiente) y la vista Support del consumer.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2RvbmF0aW9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZhbHRlY2ggRG9uYXRpb24gLyBTdXBwb3J0IOKAlCB0aXBvcy5cbiAqXG4gKiBOb3RhIGxlZ2FsIGltcG9ydGFudGU6IGVsIGRpbmVybyByZWNpYmlkbyBwb3IgdW5hIGVudGlkYWQgY29uIGZpbmVzIGRlIGx1Y3JvXG4gKiBOTyBlcyB1bmEgXCJkb25hY2nDs25cIiBkZWR1Y2libGUgZGUgaW1wdWVzdG9zIOKAlCBlcyBpbmdyZXNvIGFmZWN0by4gUG9yIGVzbyBsYVxuICogVUkgZGViZSB1c2FyIGxlbmd1YWplIGRlIFwiYXBvcnRlIHZvbHVudGFyaW8gLyBhcG95b1wiLCBudW5jYSBcImRvbmFjacOzblwiIGVuIHN1XG4gKiBzZW50aWRvIGp1csOtZGljby4gVmVyIGBkb2NzL2AgKHBlbmRpZW50ZSkgeSBsYSB2aXN0YSBTdXBwb3J0IGRlbCBjb25zdW1lci5cbiAqL1xuXG4vKipcbiAqIE3DqXRvZG9zIGRlIGFwb3J0ZSBzb3BvcnRhZG9zLlxuICogLSBgYWRzYCAgICDigJQgZWwgdXN1YXJpbyB2ZSBwdWJsaWNpZGFkIHJld2FyZGVkIChvcHQtaW4pIHBhcmEgYXBveWFyLlxuICogLSBgY29mZmVlYCDigJQgcGFnbyDDum5pY28gdsOtYSBwcm92ZWVkb3IgZXh0ZXJubyAoQnV5IE1lIGEgQ29mZmVlIC8gS28tZmkpLlxuICogLSBgYmFua2AgICDigJQgdHJhbnNmZXJlbmNpYSBiYW5jYXJpYSBkaXJlY3RhIChzZSBtdWVzdHJhbiBsb3MgZGF0b3MpLlxuICovXG5leHBvcnQgdHlwZSBEb25hdGlvbk1ldGhvZCA9ICdhZHMnIHwgJ2NvZmZlZScgfCAnYmFuayc7XG5cbi8qKiBQcm92ZWVkb3IgZGVsIG3DqXRvZG8gXCJjYWbDqVwiLiBFbCBtZXJjaGFudCBvZiByZWNvcmQgZXMgZWwgcHJvdmVlZG9yLiAqL1xuZXhwb3J0IHR5cGUgQ29mZmVlUHJvdmlkZXIgPSAnYnV5bWVhY29mZmVlJyB8ICdrb2ZpJyB8ICdjdXN0b20nO1xuXG4vKiogUHJvdmVlZG9yIGRlIHB1YmxpY2lkYWQgcmV3YXJkZWQuICovXG5leHBvcnQgdHlwZSBBZHNQcm92aWRlciA9ICdhZG1vYicgfCAnYWRzZW5zZScgfCAnY3VzdG9tJztcblxuLyoqXG4gKiBEYXRvcyBkZSB1bmEgY3VlbnRhIGJhbmNhcmlhIHBhcmEgdHJhbnNmZXJlbmNpYS4gUGVuc2FkbyBwYXJhIHNlclxuICogcG9yLXBhw61zIChlbCBtb2RlbG8gZmFjdG9yeSBlcyAxIHByb2R1Y3RvID0gMSBkb21pbmlvLCBjb24gZGF0b3NcbiAqIGZpc2NhbGVzL2JhbmNhcmlvcyBkaXN0aW50b3MgcG9yIG1lcmNhZG8pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtBY2NvdW50IHtcbiAgLyoqIElTTyBjb3VudHJ5IGNvZGUg4oCUIGVqLiAnQ0wnLCAnQVInLCAnTVgnLiAqL1xuICBjb3VudHJ5OiBzdHJpbmc7XG4gIC8qKiBOb21icmUgZGVsIGJhbmNvLiAqL1xuICBiYW5rOiBzdHJpbmc7XG4gIC8qKiBUaXBvIGRlIGN1ZW50YSDigJQgZWouICdDdWVudGEgQ29ycmllbnRlJywgJ1Zpc3RhJywgJ0NoZWNraW5nJy4gKi9cbiAgYWNjb3VudFR5cGU6IHN0cmluZztcbiAgLyoqIE7Dum1lcm8gZGUgY3VlbnRhIC8gSUJBTiAvIENCVS4gKi9cbiAgbnVtYmVyOiBzdHJpbmc7XG4gIC8qKiBJZGVudGlmaWNhZG9yIGZpc2NhbCBkZWwgdGl0dWxhciDigJQgUlVULCBDVUlULCBSRkMsIGV0Yy4gKi9cbiAgdGF4SWQ6IHN0cmluZztcbiAgLyoqIE5vbWJyZSBkZWwgdGl0dWxhciBkZSBsYSBjdWVudGEuICovXG4gIGhvbGRlcjogc3RyaW5nO1xuICAvKiogRW1haWwgcGFyYSBlbnZpYXIgY29tcHJvYmFudGUgZGUgdHJhbnNmZXJlbmNpYS4gKi9cbiAgZW1haWw/OiBzdHJpbmc7XG4gIC8qKiBNb25lZGEg4oCUIGVqLiAnQ0xQJywgJ1VTRCcuICovXG4gIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuXG4vKiogQ29uZmlnIGRlbCBtw6l0b2RvIFwiY2Fmw6lcIi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29mZmVlQ29uZmlnIHtcbiAgcHJvdmlkZXI6IENvZmZlZVByb3ZpZGVyO1xuICAvKiogVVJMIHDDumJsaWNhIGRlbCBwZXJmaWwgKEJNQy9Lby1maSkgbyBjaGVja291dCBjdXN0b20uICovXG4gIHVybDogc3RyaW5nO1xufVxuXG4vKiogQ29uZmlnIGRlbCBtw6l0b2RvIFwiYWRzXCIgKHJld2FyZGVkLCBvcHQtaW4pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZHNDb25maWcge1xuICBwcm92aWRlcjogQWRzUHJvdmlkZXI7XG4gIC8qKiBJRCBkZSBsYSB1bmlkYWQgZGUgYW51bmNpbyByZXdhcmRlZC4gKi9cbiAgcmV3YXJkZWRVbml0SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gZGVsIGZlYXR1cmUgRG9uYXRpb24vU3VwcG9ydC5cbiAqXG4gKiBDYWRhIGFwcCBkZWwgZmFjdG9yeSBkZWNsYXJhIHF1w6kgbcOpdG9kb3MgaGFiaWxpdGEuIFVuYSB2aXN0YSBoZXJlZGFkYVxuICogKGB2YWwtKmAgcGFnZSkgcmVuZGVyaXphIHNvbG8gbG9zIG3DqXRvZG9zIGVuIGBtZXRob2RzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWx0ZWNoRG9uYXRpb25Db25maWcge1xuICAvKiogQXBwSUQg4oCUIHBhcmEgdHJhY2tpbmcgZGUgaW50ZW50cyAoZWouIGFuYWx5dGljcykuICovXG4gIGFwcElkPzogc3RyaW5nO1xuICAvKiogTcOpdG9kb3MgaGFiaWxpdGFkb3MsIGVuIG9yZGVuIGRlIGFwYXJpY2nDs24gZW4gbGEgVUkuICovXG4gIG1ldGhvZHM6IERvbmF0aW9uTWV0aG9kW107XG4gIC8qKiBDb25maWcgZGVsIG3DqXRvZG8gY2Fmw6kg4oCUIHJlcXVlcmlkbyBzaSBgbWV0aG9kc2AgaW5jbHV5ZSBgJ2NvZmZlZSdgLiAqL1xuICBjb2ZmZWU/OiBDb2ZmZWVDb25maWc7XG4gIC8qKiBDdWVudGFzIGJhbmNhcmlhcyDigJQgcmVxdWVyaWRvIHNpIGBtZXRob2RzYCBpbmNsdXllIGAnYmFuaydgLiAqL1xuICBiYW5rPzogeyBhY2NvdW50czogQmFua0FjY291bnRbXSB9O1xuICAvKiogQ29uZmlnIGRlIGFkcyDigJQgcmVxdWVyaWRvIHNpIGBtZXRob2RzYCBpbmNsdXllIGAnYWRzJ2AuICovXG4gIGFkcz86IEFkc0NvbmZpZztcbn1cblxuLyoqXG4gKiBSZXN1bHRhZG8gZGUgdW4gaW50ZW50byBkZSBhcG9ydGUuIERldnVlbHRvIHBvciBsb3MgbcOpdG9kb3MgZGVsIHNlcnZpY2lvXG4gKiBkZSBmb3JtYSBkZXNjcmlwdGl2YSAobm8gc2UgbGFuemFuIGV4Y2VwY2lvbmVzIHBhcmEgZmx1am9zIGVzcGVyYWJsZXMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvbmF0aW9uQWN0aW9uUmVzdWx0IHtcbiAgbWV0aG9kOiBEb25hdGlvbk1ldGhvZDtcbiAgLyoqIGB0cnVlYCBzaSBsYSBhY2Npw7NuIHNlIGluaWNpw7MgY29ycmVjdGFtZW50ZS4gKi9cbiAgb2s6IGJvb2xlYW47XG4gIC8qKiBNb3Rpdm8gY3VhbmRvIGBva2AgZXMgYGZhbHNlYCDigJQgZWouICdub3QtY29uZmlndXJlZCcsICdub3Qtc3VwcG9ydGVkJy4gKi9cbiAgcmVhc29uPzogc3RyaW5nO1xufVxuIl19
@@ -5,9 +5,9 @@
5
5
  * Permite que usuarios autenticados con tu backend (Cognito, etc.) accedan
6
6
  * a servicios de Firebase (Firestore, Storage, FCM) de manera segura.
7
7
  */
8
- import { Inject, Injectable } from '@angular/core';
9
- import { authState, signInWithCustomToken, signOut } from '@angular/fire/auth';
10
- import { BehaviorSubject, distinctUntilChanged, map } from 'rxjs';
8
+ import { Inject, Injectable, signal } from '@angular/core';
9
+ import { authState, signInWithCustomToken, signOut, } from '@angular/fire/auth';
10
+ import { BehaviorSubject, distinctUntilChanged, filter, firstValueFrom, map, take, } from 'rxjs';
11
11
  import { VALTECH_FIREBASE_CONFIG } from './config';
12
12
  import * as i0 from "@angular/core";
13
13
  import * as i1 from "@angular/fire/auth";
@@ -57,12 +57,46 @@ export class FirebaseService {
57
57
  });
58
58
  /** Estado actual de la sesión como Observable */
59
59
  this.state$ = this.sessionState.asObservable();
60
+ /**
61
+ * Signal interna que respalda `firebaseAuthReady`.
62
+ * `true` cuando hay un `firebase.User` activo y por tanto las reglas de
63
+ * Firestore evaluarán `request.auth != null` correctamente.
64
+ */
65
+ this._firebaseAuthReady = signal(false);
66
+ /**
67
+ * Indica si la sesión de **Firebase Auth** está establecida y lista para
68
+ * leer Firestore.
69
+ *
70
+ * IMPORTANTE: esto es distinto del JWT del backend. La sesión de Firebase
71
+ * Auth es una sesión separada que se establece vía `signInWithCustomToken`
72
+ * (ver `AuthService.signInWithFirebase`). En cold start de PWA, el JWT del
73
+ * backend puede estar listo varios cientos de ms antes de que Firebase Auth
74
+ * confirme su `User` — adjuntar un listener de Firestore en esa ventana
75
+ * produce `permission-denied`.
76
+ *
77
+ * Usar este signal (o `whenFirebaseAuthReady()`) como gate antes de
78
+ * suscribirse a cualquier query/listener de Firestore.
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * if (this.firebase.firebaseAuthReady()) {
83
+ * // seguro leer Firestore
84
+ * }
85
+ * ```
86
+ */
87
+ this.firebaseAuthReady = this._firebaseAuthReady.asReadonly();
60
88
  // Inicializar observables que dependen de auth
61
- this.user$ = authState(this.auth).pipe(map((user) => (user ? this.mapUser(user) : null)), distinctUntilChanged((a, b) => a?.uid === b?.uid));
62
- this.isAuthenticated$ = this.user$.pipe(map((user) => !!user), distinctUntilChanged());
89
+ this.user$ = authState(this.auth).pipe(map(user => (user ? this.mapUser(user) : null)), distinctUntilChanged((a, b) => a?.uid === b?.uid));
90
+ this.isAuthenticated$ = this.user$.pipe(map(user => !!user), distinctUntilChanged());
91
+ // Gate compartido: emite true en cuanto haya un firebase.User y completa.
92
+ this.firebaseAuthReady$ = authState(this.auth).pipe(filter((user) => !!user), map(() => true), take(1));
63
93
  // Escuchar cambios en el estado de autenticación
64
94
  authState(this.auth).subscribe({
65
- next: (user) => {
95
+ next: user => {
96
+ // Mantener `firebaseAuthReady` sincronizado con la sesión real:
97
+ // true al haber User, false en signout. Permite que los gates
98
+ // re-evalúen tras un logout/login dentro de la misma sesión de página.
99
+ this._firebaseAuthReady.set(!!user);
66
100
  this.sessionState.next({
67
101
  user: user ? this.mapUser(user) : null,
68
102
  isAuthenticated: !!user,
@@ -70,7 +104,8 @@ export class FirebaseService {
70
104
  error: null,
71
105
  });
72
106
  },
73
- error: (error) => {
107
+ error: error => {
108
+ this._firebaseAuthReady.set(false);
74
109
  this.sessionState.next({
75
110
  user: null,
76
111
  isAuthenticated: false,
@@ -80,6 +115,19 @@ export class FirebaseService {
80
115
  },
81
116
  });
82
117
  }
118
+ /**
119
+ * Resuelve en cuanto la sesión de Firebase Auth está lista para leer
120
+ * Firestore. Si ya está lista, resuelve inmediatamente.
121
+ *
122
+ * Útil para gatear la primera suscripción a un listener de Firestore y así
123
+ * cerrar la ventana de `permission-denied` en cold start.
124
+ */
125
+ whenFirebaseAuthReady() {
126
+ if (this._firebaseAuthReady()) {
127
+ return Promise.resolve(true);
128
+ }
129
+ return firstValueFrom(this.firebaseAuthReady$);
130
+ }
83
131
  // ===========================================================================
84
132
  // AUTENTICACIÓN
85
133
  // ===========================================================================
@@ -206,7 +254,7 @@ export class FirebaseService {
206
254
  */
207
255
  async hasRole(role) {
208
256
  const claims = await this.getClaims();
209
- return claims['role'] === role || (Array.isArray(claims['roles']) && claims['roles'].includes(role));
257
+ return (claims['role'] === role || (Array.isArray(claims['roles']) && claims['roles'].includes(role)));
210
258
  }
211
259
  // ===========================================================================
212
260
  // RBAC - PERMISOS Y ORGANIZACIONES
@@ -380,8 +428,8 @@ export class FirebaseService {
380
428
  * @returns Usuario actual o null
381
429
  */
382
430
  waitForAuth() {
383
- return new Promise((resolve) => {
384
- const subscription = this.state$.subscribe((state) => {
431
+ return new Promise(resolve => {
432
+ const subscription = this.state$.subscribe(state => {
385
433
  if (!state.isLoading) {
386
434
  subscription.unsubscribe();
387
435
  resolve(state.user);
@@ -399,7 +447,9 @@ export class FirebaseService {
399
447
  * Indica si los emuladores están habilitados.
400
448
  */
401
449
  isUsingEmulators() {
402
- return !!(this.config.emulator?.firestore || this.config.emulator?.auth || this.config.emulator?.storage);
450
+ return !!(this.config.emulator?.firestore ||
451
+ this.config.emulator?.auth ||
452
+ this.config.emulator?.storage);
403
453
  }
404
454
  // ===========================================================================
405
455
  // MÉTODOS PRIVADOS
@@ -453,4 +503,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
453
503
  type: Inject,
454
504
  args: [VALTECH_FIREBASE_CONFIG]
455
505
  }] }] });
456
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmlyZWJhc2UvZmlyZWJhc2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQVEsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUU5RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUduRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQWtCMUIsWUFDVSxJQUFVLEVBQ3VCLE1BQTZCO1FBRDlELFNBQUksR0FBSixJQUFJLENBQU07UUFDdUIsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFuQnhFLGtDQUFrQztRQUMxQixpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFlO1lBQ3ZELElBQUksRUFBRSxJQUFJO1lBQ1YsZUFBZSxFQUFFLEtBQUs7WUFDdEIsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUVILGlEQUFpRDtRQUN4QyxXQUFNLEdBQTZCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFZM0UsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ3BDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUks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YXNlIFNlcnZpY2VcbiAqXG4gKiBTZXJ2aWNpbyBwcmluY2lwYWwgcGFyYSBsYSBhdXRlbnRpY2FjacOzbiBjb24gRmlyZWJhc2UgdXNhbmRvIEN1c3RvbSBUb2tlbnMuXG4gKiBQZXJtaXRlIHF1ZSB1c3VhcmlvcyBhdXRlbnRpY2Fkb3MgY29uIHR1IGJhY2tlbmQgKENvZ25pdG8sIGV0Yy4pIGFjY2VkYW5cbiAqIGEgc2VydmljaW9zIGRlIEZpcmViYXNlIChGaXJlc3RvcmUsIFN0b3JhZ2UsIEZDTSkgZGUgbWFuZXJhIHNlZ3VyYS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF1dGgsIGF1dGhTdGF0ZSwgc2lnbkluV2l0aEN1c3RvbVRva2VuLCBzaWduT3V0LCBVc2VyLCBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvYXV0aCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9GSVJFQkFTRV9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBGaXJlYmFzZVVzZXIsIE1lbWJlcnNoaXBJbmZvLCBPcmdhbml6YXRpb25JbmZvLCBTZXNzaW9uU3RhdGUsIFZhbHRlY2hGaXJlYmFzZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuIGRlIEZpcmViYXNlLlxuICpcbiAqIEVzdGUgc2VydmljaW8gTk8gbWFuZWphIGVsIGxvZ2luIGRlIHVzdWFyaW9zIGRpcmVjdGFtZW50ZS5cbiAqIEVuIHN1IGx1Z2FyLCB0cmFiYWphIGNvbiBDdXN0b20gVG9rZW5zIGdlbmVyYWRvcyBwb3IgdHUgYmFja2VuZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRGVzcHXDqXMgZGUgYXV0ZW50aWNhcnRlIGNvbiB0dSBiYWNrZW5kIChlajogQ29nbml0bylcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQge1xuICogICBwcml2YXRlIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTsgICAgIC8vIFR1IHNlcnZpY2lvIGRlIGF1dGhcbiAqICAgcHJpdmF0ZSBmaXJlYmFzZSA9IGluamVjdChGaXJlYmFzZVNlcnZpY2UpOyAgICAvLyBFc3RlIHNlcnZpY2lvXG4gKlxuICogICBhc3luYyBsb2dpbihlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gKiAgICAgLy8gMS4gQXV0ZW50aWNhciBjb24gdHUgYmFja2VuZFxuICogICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoU2VydmljZS5sb2dpbihlbWFpbCwgcGFzc3dvcmQpO1xuICpcbiAqICAgICAvLyAyLiBFbCBiYWNrZW5kIGRldnVlbHZlIHVuIEZpcmViYXNlIEN1c3RvbSBUb2tlblxuICogICAgIGlmIChyZXNwb25zZS5maXJlYmFzZVRva2VuKSB7XG4gKiAgICAgICBhd2FpdCB0aGlzLmZpcmViYXNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihyZXNwb25zZS5maXJlYmFzZVRva2VuKTtcbiAqICAgICB9XG4gKlxuICogICAgIC8vIEFob3JhIGVsIHVzdWFyaW8gcHVlZGUgYWNjZWRlciBhIEZpcmVzdG9yZSwgU3RvcmFnZSwgZXRjLlxuICogICB9XG4gKlxuICogICBhc3luYyBsb2dvdXQoKSB7XG4gKiAgICAgYXdhaXQgdGhpcy5hdXRoU2VydmljZS5sb2dvdXQoKTtcbiAqICAgICBhd2FpdCB0aGlzLmZpcmViYXNlLnNpZ25PdXQoKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VTZXJ2aWNlIHtcbiAgLyoqIEVzdGFkbyBpbnRlcm5vIGRlIGxhIHNlc2nDs24gKi9cbiAgcHJpdmF0ZSBzZXNzaW9uU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlc3Npb25TdGF0ZT4oe1xuICAgIHVzZXI6IG51bGwsXG4gICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgZXJyb3I6IG51bGwsXG4gIH0pO1xuXG4gIC8qKiBFc3RhZG8gYWN0dWFsIGRlIGxhIHNlc2nDs24gY29tbyBPYnNlcnZhYmxlICovXG4gIHJlYWRvbmx5IHN0YXRlJDogT2JzZXJ2YWJsZTxTZXNzaW9uU3RhdGU+ID0gdGhpcy5zZXNzaW9uU3RhdGUuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFVzdWFyaW8gYWN0dWFsIGRlIEZpcmViYXNlIGNvbW8gT2JzZXJ2YWJsZSAqL1xuICByZWFkb25seSB1c2VyJDogT2JzZXJ2YWJsZTxGaXJlYmFzZVVzZXIgfCBudWxsPjtcblxuICAvKiogSW5kaWNhIHNpIGVsIHVzdWFyaW8gZXN0w6EgYXV0ZW50aWNhZG8gZW4gRmlyZWJhc2UgKi9cbiAgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGg6IEF1dGgsXG4gICAgQEluamVjdChWQUxURUNIX0ZJUkVCQVNFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hGaXJlYmFzZUNvbmZpZ1xuICApIHtcbiAgICAvLyBJbmljaWFsaXphciBvYnNlcnZhYmxlcyBxdWUgZGVwZW5kZW4gZGUgYXV0aFxuICAgIHRoaXMudXNlciQgPSBhdXRoU3RhdGUodGhpcy5hdXRoKS5waXBlKFxuICAgICAgbWFwKCh1c2VyKSA9PiAodXNlciA/IHRoaXMubWFwVXNlcih1c2VyKSA6IG51bGwpKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBhPy51aWQgPT09IGI/LnVpZClcbiAgICApO1xuXG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy51c2VyJC5waXBlKFxuICAgICAgbWFwKCh1c2VyKSA9PiAhIXVzZXIpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gICAgLy8gRXNjdWNoYXIgY2FtYmlvcyBlbiBlbCBlc3RhZG8gZGUgYXV0ZW50aWNhY2nDs25cbiAgICBhdXRoU3RhdGUodGhpcy5hdXRoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHVzZXIpID0+IHtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdGUubmV4dCh7XG4gICAgICAgICAgdXNlcjogdXNlciA/IHRoaXMubWFwVXNlcih1c2VyKSA6IG51bGwsXG4gICAgICAgICAgaXNBdXRoZW50aWNhdGVkOiAhIXVzZXIsXG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNlc3Npb25TdGF0ZS5uZXh0KHtcbiAgICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFVVEVOVElDQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBdXRlbnRpY2EgYWwgdXN1YXJpbyBjb24gdW4gQ3VzdG9tIFRva2VuIGdlbmVyYWRvIHBvciBlbCBiYWNrZW5kLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBGaXJlYmFzZSBDdXN0b20gVG9rZW4gZ2VuZXJhZG8gcG9yIHR1IGJhY2tlbmRcbiAgICogQHJldHVybnMgVXNlckNyZWRlbnRpYWwgY29uIGxhIGluZm9ybWFjacOzbiBkZWwgdXN1YXJpb1xuICAgKiBAdGhyb3dzIEVycm9yIHNpIGVsIHRva2VuIGVzIGludsOhbGlkbyBvIGV4cGlyw7NcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBEZXNwdcOpcyBkZSBsb2dpbiBleGl0b3NvIGNvbiB0dSBiYWNrZW5kXG4gICAqIGNvbnN0IHsgZmlyZWJhc2VUb2tlbiB9ID0gYXdhaXQgYmFja2VuZEF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkKTtcbiAgICogYXdhaXQgZmlyZWJhc2VTZXJ2aWNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihmaXJlYmFzZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoQ3VzdG9tVG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhDdXN0b21Ub2tlbih0aGlzLmF1dGgsIHRva2VuKTtcblxuICAgICAgLy8gRm9yemFyIHJlZnJlc2ggZGVsIHRva2VuIHBhcmEgYXNlZ3VyYXIgcXVlIGxvcyBjbGFpbXMgZXN0w6luIGFjdHVhbGl6YWRvc1xuICAgICAgLy8gRXN0byBlcyBuZWNlc2FyaW8gcG9ycXVlIGdldElkVG9rZW5SZXN1bHQoKSBjYWNoZWEgZWwgcmVzdWx0YWRvXG4gICAgICBpZiAoY3JlZGVudGlhbC51c2VyKSB7XG4gICAgICAgIGF3YWl0IGNyZWRlbnRpYWwudXNlci5nZXRJZFRva2VuKHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3JlZGVudGlhbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2llcnJhIGxhIHNlc2nDs24gZGUgRmlyZWJhc2UuXG4gICAqIExsYW1hciBqdW50byBjb24gZWwgbG9nb3V0IGRlIHR1IHNpc3RlbWEgZGUgYXV0ZW50aWNhY2nDs24gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIGxvZ291dCgpIHtcbiAgICogICBhd2FpdCB0aGlzLmJhY2tlbmRBdXRoLmxvZ291dCgpOyAgICAvLyBUdSBhdXRoXG4gICAqICAgYXdhaXQgdGhpcy5maXJlYmFzZS5zaWduT3V0KCk7ICAgICAgIC8vIEZpcmViYXNlXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWduT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzaWduT3V0KHRoaXMuYXV0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdFVFRFUlMgU8ONTkNST05PU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2J0aWVuZSBlbCB1c3VhcmlvIGFjdHVhbCBkZSBGaXJlYmFzZSAoc8OtbmNyb25vKS5cbiAgICogUmV0b3JuYSBudWxsIHNpIG5vIGhheSB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyKCk6IEZpcmViYXNlVXNlciB8IG51bGwge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGguY3VycmVudFVzZXI7XG4gICAgcmV0dXJuIHVzZXIgPyB0aGlzLm1hcFVzZXIodXNlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgVUlEIGRlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICogUmV0b3JuYSBudWxsIHNpIG5vIGhheSB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKi9cbiAgZ2V0IHVpZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmN1cnJlbnRVc2VyPy51aWQgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2Egc2kgaGF5IHVuIHVzdWFyaW8gYXV0ZW50aWNhZG8gYWN0dWFsbWVudGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuYXV0aC5jdXJyZW50VXNlcjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUT0tFTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgSUQgVG9rZW4gZGUgRmlyZWJhc2UgcGFyYSBlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICogw5p0aWwgcGFyYSB2YWxpZGFyIGVsIHVzdWFyaW8gZW4gdHUgYmFja2VuZC5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIFNpIHRydWUsIGZ1ZXJ6YSBsYSByZW5vdmFjacOzbiBkZWwgdG9rZW5cbiAgICogQHJldHVybnMgSUQgVG9rZW4gbyBudWxsIHNpIG5vIGhheSB1c3VhcmlvXG4gICAqL1xuICBhc3luYyBnZXRJZFRva2VuKGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcjtcbiAgICBpZiAoIXVzZXIpIHJldHVybiBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB1c2VyLmdldElkVG9rZW4oZm9yY2VSZWZyZXNoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBjbGFpbXMgcGVyc29uYWxpemFkb3MgZGVsIHRva2VuIGRlbCB1c3VhcmlvLlxuICAgKiBMb3MgY2xhaW1zIHNvbiBlc3RhYmxlY2lkb3MgcG9yIHR1IGJhY2tlbmQgYWwgY3JlYXIgZWwgQ3VzdG9tIFRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gU2kgdHJ1ZSwgZnVlcnphIGxhIHJlbm92YWNpw7NuIGRlbCB0b2tlbiBwYXJhIG9idGVuZXIgY2xhaW1zIGFjdHVhbGl6YWRvc1xuICAgKiBAcmV0dXJucyBPYmpldG8gY29uIGxvcyBjbGFpbXMgbyB2YWPDrW8gc2kgbm8gaGF5IHVzdWFyaW9cbiAgICovXG4gIGFzeW5jIGdldENsYWltcyhmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoLmN1cnJlbnRVc2VyO1xuICAgIGlmICghdXNlcikgcmV0dXJuIHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlblJlc3VsdChmb3JjZVJlZnJlc2gpO1xuICAgICAgcmV0dXJuIHJlc3VsdC5jbGFpbXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcm9sIGVzcGVjw61maWNvLlxuICAgKiBFbCByb2wgZGViZSBlc3RhciBkZWZpbmlkbyBlbiBsb3MgY2xhaW1zIGRlbCBDdXN0b20gVG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIC0gTm9tYnJlIGRlbCByb2wgYSB2ZXJpZmljYXJcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIHRpZW5lIGVsIHJvbFxuICAgKi9cbiAgYXN5bmMgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjbGFpbXMgPSBhd2FpdCB0aGlzLmdldENsYWltcygpO1xuICAgIHJldHVybiBjbGFpbXNbJ3JvbGUnXSA9PT0gcm9sZSB8fCAoQXJyYXkuaXNBcnJheShjbGFpbXNbJ3JvbGVzJ10pICYmIGNsYWltc1sncm9sZXMnXS5pbmNsdWRlcyhyb2xlKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUkJBQyAtIFBFUk1JU09TIFkgT1JHQU5JWkFDSU9ORVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGFzIG1lbWJlcnNoaXBzIChvcmdhbml6YWNpb25lcykgZGVsIHVzdWFyaW8uXG4gICAqIENhZGEgbWVtYmVyc2hpcCBjb250aWVuZSBlbCByb2wgeSBwZXJtaXNvcyBlbiBlc2Egb3JnYW5pemFjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIFNpIHRydWUsIGZ1ZXJ6YSBsYSByZW5vdmFjacOzbiBkZWwgdG9rZW5cbiAgICogQHJldHVybnMgTWFwYSBkZSBvcmdJZCDihpIgTWVtYmVyc2hpcEluZm9cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IGZpcmViYXNlU2VydmljZS5nZXRNZW1iZXJzaGlwcygpO1xuICAgKiAvLyB7ICdvcmdfYWJjJzogeyByb2xlSWQ6ICdhZG1pbicsIHJvbGVOYW1lOiAnYWRtaW4nLCBwZXJtaXNzaW9uczogWyd1c2VyczoqJywgLi4uXSB9IH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZW1iZXJzaGlwcyhmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTWVtYmVyc2hpcEluZm8+PiB7XG4gICAgY29uc3QgY2xhaW1zID0gYXdhaXQgdGhpcy5nZXRDbGFpbXMoZm9yY2VSZWZyZXNoKTtcbiAgICByZXR1cm4gKGNsYWltc1snbWVtYmVyc2hpcHMnXSBhcyBSZWNvcmQ8c3RyaW5nLCBNZW1iZXJzaGlwSW5mbz4pIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgb3JnYW5pemFjacOzbiBhY3RpdmEgZGVsIHVzdWFyaW8uXG4gICAqIExhIG9yZ2FuaXphY2nDs24gYWN0aXZhIHNlIGVzdGFibGVjZSBhbCBoYWNlciBsb2dpbiBvIGFsIGNhbWJpYXIgZGUgb3JnLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gU2kgdHJ1ZSwgZnVlcnphIGxhIHJlbm92YWNpw7NuIGRlbCB0b2tlblxuICAgKiBAcmV0dXJucyBJRCBkZSBsYSBvcmdhbml6YWNpw7NuIGFjdGl2YSBvIG51bGwgc2kgbm8gaGF5IG5pbmd1bmFcbiAgICovXG4gIGFzeW5jIGdldEFjdGl2ZU9yZyhmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGNsYWltcyA9IGF3YWl0IHRoaXMuZ2V0Q2xhaW1zKGZvcmNlUmVmcmVzaCk7XG4gICAgcmV0dXJuIChjbGFpbXNbJ2FjdGl2ZU9yZyddIGFzIHN0cmluZykgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGluZm9ybWFjacOzbiBkZSB0b2RhcyBsYXMgb3JnYW5pemFjaW9uZXMgZGVsIHVzdWFyaW8uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBTaSB0cnVlLCBmdWVyemEgbGEgcmVub3ZhY2nDs24gZGVsIHRva2VuXG4gICAqIEByZXR1cm5zIEFycmF5IGNvbiBpbmZvcm1hY2nDs24gZGUgY2FkYSBvcmdhbml6YWNpw7NuXG4gICAqL1xuICBhc3luYyBnZXRPcmdhbml6YXRpb25zKGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxPcmdhbml6YXRpb25JbmZvW10+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMuZ2V0TWVtYmVyc2hpcHMoZm9yY2VSZWZyZXNoKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWVtYmVyc2hpcHMpLm1hcCgoW2lkLCBpbmZvXSkgPT4gKHtcbiAgICAgIGlkLFxuICAgICAgcm9sZUlkOiBpbmZvLnJvbGVJZCxcbiAgICAgIHJvbGVOYW1lOiBpbmZvLnJvbGVOYW1lLFxuICAgICAgcGVybWlzc2lvbnM6IGluZm8ucGVybWlzc2lvbnMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbG9zIElEcyBkZSB0b2RhcyBsYXMgb3JnYW5pemFjaW9uZXMgZGVsIHVzdWFyaW8uXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IGRlIElEcyBkZSBvcmdhbml6YWNpb25lc1xuICAgKi9cbiAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uSWRzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMuZ2V0TWVtYmVyc2hpcHMoKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWVtYmVyc2hpcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcGVydGVuZWNlIGEgdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCAtIElEIGRlIGxhIG9yZ2FuaXphY2nDs25cbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIGVzIG1pZW1icm9cbiAgICovXG4gIGFzeW5jIGlzTWVtYmVyT2Yob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5nZXRNZW1iZXJzaGlwcygpO1xuICAgIHJldHVybiBvcmdJZCBpbiBtZW1iZXJzaGlwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHJvbCBkZWwgdXN1YXJpbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzblxuICAgKiBAcmV0dXJucyBJRCBkZWwgcm9sIG8gbnVsbCBzaSBubyBlcyBtaWVtYnJvXG4gICAqL1xuICBhc3luYyBnZXRSb2xlSW5Pcmcob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5nZXRNZW1iZXJzaGlwcygpO1xuICAgIHJldHVybiBtZW1iZXJzaGlwc1tvcmdJZF0/LnJvbGVJZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbG9zIHBlcm1pc29zIGRlbCB1c3VhcmlvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKlxuICAgKiBAcGFyYW0gb3JnSWQgLSBJRCBkZSBsYSBvcmdhbml6YWNpw7NuXG4gICAqIEByZXR1cm5zIEFycmF5IGRlIHBlcm1pc29zIGVuIGZvcm1hdG8gJ3Jlc291cmNlOmFjdGlvbidcbiAgICovXG4gIGFzeW5jIGdldFBlcm1pc3Npb25zSW5Pcmcob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMuZ2V0TWVtYmVyc2hpcHMoKTtcbiAgICByZXR1cm4gbWVtYmVyc2hpcHNbb3JnSWRdPy5wZXJtaXNzaW9ucyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHBlcm1pc28gZXNwZWPDrWZpY28gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqIFNvcG9ydGEgd2lsZGNhcmRzOiAncmVzb3VyY2U6KicgeSAnKjoqJyAoc3VwZXIgYWRtaW4pLlxuICAgKlxuICAgKiBAcGFyYW0gb3JnSWQgLSBJRCBkZSBsYSBvcmdhbml6YWNpw7NuXG4gICAqIEBwYXJhbSByZXNvdXJjZSAtIFJlY3Vyc28gYSB2ZXJpZmljYXIgKGVqOiAndXNlcnMnLCAnZG9jdW1lbnRzJylcbiAgICogQHBhcmFtIGFjdGlvbiAtIEFjY2nDs24gYSB2ZXJpZmljYXIgKGVqOiAncmVhZCcsICd3cml0ZScsICdjcmVhdGUnLCAnZGVsZXRlJylcbiAgICogQHJldHVybnMgdHJ1ZSBzaSB0aWVuZSBlbCBwZXJtaXNvXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVmVyaWZpY2FyIHBlcm1pc28gZXNwZWPDrWZpY29cbiAgICogY29uc3QgY2FuUmVhZFVzZXJzID0gYXdhaXQgZmlyZWJhc2VTZXJ2aWNlLmhhc1Blcm1pc3Npb24oJ29yZ19hYmMnLCAndXNlcnMnLCAncmVhZCcpO1xuICAgKlxuICAgKiAvLyBWZXJpZmljYXIgZW4gbGEgb3JnYW5pemFjacOzbiBhY3RpdmFcbiAgICogY29uc3Qgb3JnSWQgPSBhd2FpdCBmaXJlYmFzZVNlcnZpY2UuZ2V0QWN0aXZlT3JnKCk7XG4gICAqIGNvbnN0IGNhbkVkaXQgPSBhd2FpdCBmaXJlYmFzZVNlcnZpY2UuaGFzUGVybWlzc2lvbihvcmdJZCEsICdkb2N1bWVudHMnLCAnd3JpdGUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBoYXNQZXJtaXNzaW9uKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFBlcm1pc3Npb25zSW5Pcmcob3JnSWQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb24gPSBgJHtyZXNvdXJjZX06JHthY3Rpb259YDtcblxuICAgIHJldHVybiAoXG4gICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcyhwZXJtaXNzaW9uKSB8fFxuICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoYCR7cmVzb3VyY2V9OipgKSB8fFxuICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJyo6KicpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHB1ZWRlIGxlZXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogQXRham8gcGFyYSBoYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ3JlYWQnKS5cbiAgICovXG4gIGFzeW5jIGNhblJlYWQob3JnSWQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAncmVhZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgZXNjcmliaXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogQXRham8gcGFyYSBoYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ3dyaXRlJykuXG4gICAqL1xuICBhc3luYyBjYW5Xcml0ZShvcmdJZDogc3RyaW5nLCByZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICd3cml0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgY3JlYXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogQXRham8gcGFyYSBoYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ2NyZWF0ZScpLlxuICAgKi9cbiAgYXN5bmMgY2FuQ3JlYXRlKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ2NyZWF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgZWxpbWluYXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogQXRham8gcGFyYSBoYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ2RlbGV0ZScpLlxuICAgKi9cbiAgYXN5bmMgY2FuRGVsZXRlKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgYWRtaW5pc3RyYXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogRXF1aXZhbGUgYSB0ZW5lciAncmVzb3VyY2U6KicgbyAnKjoqJy5cbiAgICovXG4gIGFzeW5jIGNhbk1hbmFnZShvcmdJZDogc3RyaW5nLCByZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFBlcm1pc3Npb25zSW5Pcmcob3JnSWQpO1xuICAgIHJldHVybiBwZXJtaXNzaW9ucy5pbmNsdWRlcyhgJHtyZXNvdXJjZX06KmApIHx8IHBlcm1pc3Npb25zLmluY2x1ZGVzKCcqOionKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIGVzIHN1cGVyIGFkbWluIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKiBTdXBlciBhZG1pbiB0aWVuZSBlbCBwZXJtaXNvICcqOionLlxuICAgKi9cbiAgYXN5bmMgaXNTdXBlckFkbWluKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0UGVybWlzc2lvbnNJbk9yZyhvcmdJZCk7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLmluY2x1ZGVzKCcqOionKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIGVzIGFkbWluIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKi9cbiAgYXN5bmMgaXNBZG1pbkluT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByb2xlID0gYXdhaXQgdGhpcy5nZXRSb2xlSW5Pcmcob3JnSWQpO1xuICAgIHJldHVybiByb2xlID09PSAnYWRtaW4nIHx8IHJvbGUgPT09ICdzdXBlcl9hZG1pbic7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVRJTElEQURFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXNwZXJhIGEgcXVlIGVsIGVzdGFkbyBkZSBhdXRlbnRpY2FjacOzbiBlc3TDqSBkZXRlcm1pbmFkby5cbiAgICogw5p0aWwgZW4gZ3VhcmRzIG8gYWwgaW5pY2lhbGl6YXIgbGEgYXBwLlxuICAgKlxuICAgKiBAcmV0dXJucyBVc3VhcmlvIGFjdHVhbCBvIG51bGxcbiAgICovXG4gIHdhaXRGb3JBdXRoKCk6IFByb21pc2U8RmlyZWJhc2VVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICBpZiAoIXN0YXRlLmlzTG9hZGluZykge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUudXNlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgY29uZmlndXJhY2nDs24gYWN0dWFsIGRlIEZpcmViYXNlLlxuICAgKi9cbiAgZ2V0Q29uZmlnKCk6IFZhbHRlY2hGaXJlYmFzZUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYSBzaSBsb3MgZW11bGFkb3JlcyBlc3TDoW4gaGFiaWxpdGFkb3MuXG4gICAqL1xuICBpc1VzaW5nRW11bGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmNvbmZpZy5lbXVsYXRvcj8uZmlyZXN0b3JlIHx8IHRoaXMuY29uZmlnLmVtdWxhdG9yPy5hdXRoIHx8IHRoaXMuY29uZmlnLmVtdWxhdG9yPy5zdG9yYWdlKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNw4lUT0RPUyBQUklWQURPU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTWFwZWEgdW4gVXNlciBkZSBGaXJlYmFzZSBhIG51ZXN0cmEgaW50ZXJmYWNlIEZpcmViYXNlVXNlclxuICAgKi9cbiAgcHJpdmF0ZSBtYXBVc2VyKHVzZXI6IFVzZXIpOiBGaXJlYmFzZVVzZXIge1xuICAgIHJldHVybiB7XG4gICAgICB1aWQ6IHVzZXIudWlkLFxuICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICBkaXNwbGF5TmFtZTogdXNlci5kaXNwbGF5TmFtZSxcbiAgICAgIHBob3RvVVJMOiB1c2VyLnBob3RvVVJMLFxuICAgICAgZW1haWxWZXJpZmllZDogdXNlci5lbWFpbFZlcmlmaWVkLFxuICAgICAgaXNBbm9ueW1vdXM6IHVzZXIuaXNBbm9ueW1vdXMsXG4gICAgICBwcm92aWRlcklkOiB1c2VyLnByb3ZpZGVySWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252aWVydGUgZXJyb3JlcyBkZSBGaXJlYmFzZSBhIG1lbnNhamVzIGVuIGVzcGHDsW9sXG4gICAqL1xuICBwcml2YXRlIGdldEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSAoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGU7XG5cbiAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICBjYXNlICdhdXRoL2ludmFsaWQtY3VzdG9tLXRva2VuJzpcbiAgICAgICAgICByZXR1cm4gJ1Rva2VuIGRlIGF1dGVudGljYWNpw7NuIGludsOhbGlkbyc7XG4gICAgICAgIGNhc2UgJ2F1dGgvY3VzdG9tLXRva2VuLW1pc21hdGNoJzpcbiAgICAgICAgICByZXR1cm4gJ0VsIHRva2VuIG5vIGNvcnJlc3BvbmRlIGEgZXN0ZSBwcm95ZWN0byc7XG4gICAgICAgIGNhc2UgJ2F1dGgvbmV0d29yay1yZXF1ZXN0LWZhaWxlZCc6XG4gICAgICAgICAgcmV0dXJuICdFcnJvciBkZSBjb25leGnDs24uIFZlcmlmaWNhIHR1IGNvbmV4acOzbiBhIGludGVybmV0JztcbiAgICAgICAgY2FzZSAnYXV0aC90b28tbWFueS1yZXF1ZXN0cyc6XG4gICAgICAgICAgcmV0dXJuICdEZW1hc2lhZG9zIGludGVudG9zLiBJbnRlbnRhIGRlIG51ZXZvIG3DoXMgdGFyZGUnO1xuICAgICAgICBjYXNlICdhdXRoL3VzZXItZGlzYWJsZWQnOlxuICAgICAgICAgIHJldHVybiAnRXN0YSBjdWVudGEgaGEgc2lkbyBkZXNoYWJpbGl0YWRhJztcbiAgICAgICAgY2FzZSAnYXV0aC91c2VyLW5vdC1mb3VuZCc6XG4gICAgICAgICAgcmV0dXJuICdVc3VhcmlvIG5vIGVuY29udHJhZG8nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbiBkZXNjb25vY2lkbyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbiBkZXNjb25vY2lkbyc7XG4gIH1cbn1cbiJdfQ==
506
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmlyZWJhc2UvZmlyZWJhc2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUVMLFNBQVMsRUFDVCxxQkFBcUIsRUFDckIsT0FBTyxHQUdSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUNMLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGNBQWMsRUFDZCxHQUFHLEVBRUgsSUFBSSxHQUNMLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFTbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUF5RDFCLFlBQ1UsSUFBVSxFQUN1QixNQUE2QjtRQUQ5RCxTQUFJLEdBQUosSUFBSSxDQUFNO1FBQ3VCLFdBQU0sR0FBTixNQUFNLENBQXVCO1FBMUR4RSxrQ0FBa0M7UUFDMUIsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZTtZQUN2RCxJQUFJLEVBQUUsSUFBSTtZQUNWLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLENBQUM7UUFFSCxpREFBaUQ7UUFDeEMsV0FBTSxHQUE2QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBUTdFOzs7O1dBSUc7UUFDYyx1QkFBa0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBb0JHO1FBQ00sc0JBQWlCLEdBQW9CLElBQUks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QUksQ0FBQyxXQUFXO1lBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLEtBQWM7UUFDcEMsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUksS0FBMkIsQ0FBQyxJQUFJLENBQUM7WUFFL0MsUUFBUSxJQUFJLEVBQUUsQ0FBQztnQkFDYixLQUFLLDJCQUEyQjtvQkFDOUIsT0FBTyxpQ0FBaUMsQ0FBQztnQkFDM0MsS0FBSyw0QkFBNEI7b0JBQy9CLE9BQU8seUNBQXlDLENBQUM7Z0JBQ25ELEtBQUssNkJBQTZCO29CQUNoQyxPQUFPLG9EQUFvRCxDQUFDO2dCQUM5RCxLQUFLLHdCQUF3QjtvQkFDM0IsT0FBTyxpREFBaUQsQ0FBQztnQkFDM0QsS0FBSyxvQkFBb0I7b0JBQ3ZCLE9BQU8sbUNBQW1DLENBQUM7Z0JBQzdDLEtBQUsscUJBQXFCO29CQUN4QixPQUFPLHVCQUF1QixDQUFDO2dCQUNqQztvQkFDRSxPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUksb0NBQW9DLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLG9DQUFvQyxDQUFDO0lBQzlDLENBQUM7K0dBM2dCVSxlQUFlLHNDQTJEaEIsdUJBQXVCO21IQTNEdEIsZUFBZSxjQURGLE1BQU07OzRGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBNEQ3QixNQUFNOzJCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlyZWJhc2UgU2VydmljZVxuICpcbiAqIFNlcnZpY2lvIHByaW5jaXBhbCBwYXJhIGxhIGF1dGVudGljYWNpw7NuIGNvbiBGaXJlYmFzZSB1c2FuZG8gQ3VzdG9tIFRva2Vucy5cbiAqIFBlcm1pdGUgcXVlIHVzdWFyaW9zIGF1dGVudGljYWRvcyBjb24gdHUgYmFja2VuZCAoQ29nbml0bywgZXRjLikgYWNjZWRhblxuICogYSBzZXJ2aWNpb3MgZGUgRmlyZWJhc2UgKEZpcmVzdG9yZSwgU3RvcmFnZSwgRkNNKSBkZSBtYW5lcmEgc2VndXJhLlxuICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2lnbmFsLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEF1dGgsXG4gIGF1dGhTdGF0ZSxcbiAgc2lnbkluV2l0aEN1c3RvbVRva2VuLFxuICBzaWduT3V0LFxuICBVc2VyLFxuICBVc2VyQ3JlZGVudGlhbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9hdXRoJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgdGFrZSxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFZBTFRFQ0hfRklSRUJBU0VfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtcbiAgRmlyZWJhc2VVc2VyLFxuICBNZW1iZXJzaGlwSW5mbyxcbiAgT3JnYW5pemF0aW9uSW5mbyxcbiAgU2Vzc2lvblN0YXRlLFxuICBWYWx0ZWNoRmlyZWJhc2VDb25maWcsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuIGRlIEZpcmViYXNlLlxuICpcbiAqIEVzdGUgc2VydmljaW8gTk8gbWFuZWphIGVsIGxvZ2luIGRlIHVzdWFyaW9zIGRpcmVjdGFtZW50ZS5cbiAqIEVuIHN1IGx1Z2FyLCB0cmFiYWphIGNvbiBDdXN0b20gVG9rZW5zIGdlbmVyYWRvcyBwb3IgdHUgYmFja2VuZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRGVzcHXDqXMgZGUgYXV0ZW50aWNhcnRlIGNvbiB0dSBiYWNrZW5kIChlajogQ29nbml0bylcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQge1xuICogICBwcml2YXRlIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTsgICAgIC8vIFR1IHNlcnZpY2lvIGRlIGF1dGhcbiAqICAgcHJpdmF0ZSBmaXJlYmFzZSA9IGluamVjdChGaXJlYmFzZVNlcnZpY2UpOyAgICAvLyBFc3RlIHNlcnZpY2lvXG4gKlxuICogICBhc3luYyBsb2dpbihlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gKiAgICAgLy8gMS4gQXV0ZW50aWNhciBjb24gdHUgYmFja2VuZFxuICogICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoU2VydmljZS5sb2dpbihlbWFpbCwgcGFzc3dvcmQpO1xuICpcbiAqICAgICAvLyAyLiBFbCBiYWNrZW5kIGRldnVlbHZlIHVuIEZpcmViYXNlIEN1c3RvbSBUb2tlblxuICogICAgIGlmIChyZXNwb25zZS5maXJlYmFzZVRva2VuKSB7XG4gKiAgICAgICBhd2FpdCB0aGlzLmZpcmViYXNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihyZXNwb25zZS5maXJlYmFzZVRva2VuKTtcbiAqICAgICB9XG4gKlxuICogICAgIC8vIEFob3JhIGVsIHVzdWFyaW8gcHVlZGUgYWNjZWRlciBhIEZpcmVzdG9yZSwgU3RvcmFnZSwgZXRjLlxuICogICB9XG4gKlxuICogICBhc3luYyBsb2dvdXQoKSB7XG4gKiAgICAgYXdhaXQgdGhpcy5hdXRoU2VydmljZS5sb2dvdXQoKTtcbiAqICAgICBhd2FpdCB0aGlzLmZpcmViYXNlLnNpZ25PdXQoKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VTZXJ2aWNlIHtcbiAgLyoqIEVzdGFkbyBpbnRlcm5vIGRlIGxhIHNlc2nDs24gKi9cbiAgcHJpdmF0ZSBzZXNzaW9uU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlc3Npb25TdGF0ZT4oe1xuICAgIHVzZXI6IG51bGwsXG4gICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgZXJyb3I6IG51bGwsXG4gIH0pO1xuXG4gIC8qKiBFc3RhZG8gYWN0dWFsIGRlIGxhIHNlc2nDs24gY29tbyBPYnNlcnZhYmxlICovXG4gIHJlYWRvbmx5IHN0YXRlJDogT2JzZXJ2YWJsZTxTZXNzaW9uU3RhdGU+ID0gdGhpcy5zZXNzaW9uU3RhdGUuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFVzdWFyaW8gYWN0dWFsIGRlIEZpcmViYXNlIGNvbW8gT2JzZXJ2YWJsZSAqL1xuICByZWFkb25seSB1c2VyJDogT2JzZXJ2YWJsZTxGaXJlYmFzZVVzZXIgfCBudWxsPjtcblxuICAvKiogSW5kaWNhIHNpIGVsIHVzdWFyaW8gZXN0w6EgYXV0ZW50aWNhZG8gZW4gRmlyZWJhc2UgKi9cbiAgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAvKipcbiAgICogU2lnbmFsIGludGVybmEgcXVlIHJlc3BhbGRhIGBmaXJlYmFzZUF1dGhSZWFkeWAuXG4gICAqIGB0cnVlYCBjdWFuZG8gaGF5IHVuIGBmaXJlYmFzZS5Vc2VyYCBhY3Rpdm8geSBwb3IgdGFudG8gbGFzIHJlZ2xhcyBkZVxuICAgKiBGaXJlc3RvcmUgZXZhbHVhcsOhbiBgcmVxdWVzdC5hdXRoICE9IG51bGxgIGNvcnJlY3RhbWVudGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9maXJlYmFzZUF1dGhSZWFkeSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLyoqXG4gICAqIEluZGljYSBzaSBsYSBzZXNpw7NuIGRlICoqRmlyZWJhc2UgQXV0aCoqIGVzdMOhIGVzdGFibGVjaWRhIHkgbGlzdGEgcGFyYVxuICAgKiBsZWVyIEZpcmVzdG9yZS5cbiAgICpcbiAgICogSU1QT1JUQU5URTogZXN0byBlcyBkaXN0aW50byBkZWwgSldUIGRlbCBiYWNrZW5kLiBMYSBzZXNpw7NuIGRlIEZpcmViYXNlXG4gICAqIEF1dGggZXMgdW5hIHNlc2nDs24gc2VwYXJhZGEgcXVlIHNlIGVzdGFibGVjZSB2w61hIGBzaWduSW5XaXRoQ3VzdG9tVG9rZW5gXG4gICAqICh2ZXIgYEF1dGhTZXJ2aWNlLnNpZ25JbldpdGhGaXJlYmFzZWApLiBFbiBjb2xkIHN0YXJ0IGRlIFBXQSwgZWwgSldUIGRlbFxuICAgKiBiYWNrZW5kIHB1ZWRlIGVzdGFyIGxpc3RvIHZhcmlvcyBjaWVudG9zIGRlIG1zIGFudGVzIGRlIHF1ZSBGaXJlYmFzZSBBdXRoXG4gICAqIGNvbmZpcm1lIHN1IGBVc2VyYCDigJQgYWRqdW50YXIgdW4gbGlzdGVuZXIgZGUgRmlyZXN0b3JlIGVuIGVzYSB2ZW50YW5hXG4gICAqIHByb2R1Y2UgYHBlcm1pc3Npb24tZGVuaWVkYC5cbiAgICpcbiAgICogVXNhciBlc3RlIHNpZ25hbCAobyBgd2hlbkZpcmViYXNlQXV0aFJlYWR5KClgKSBjb21vIGdhdGUgYW50ZXMgZGVcbiAgICogc3VzY3JpYmlyc2UgYSBjdWFscXVpZXIgcXVlcnkvbGlzdGVuZXIgZGUgRmlyZXN0b3JlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmICh0aGlzLmZpcmViYXNlLmZpcmViYXNlQXV0aFJlYWR5KCkpIHtcbiAgICogICAvLyBzZWd1cm8gbGVlciBGaXJlc3RvcmVcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGZpcmViYXNlQXV0aFJlYWR5OiBTaWduYWw8Ym9vbGVhbj4gPSB0aGlzLl9maXJlYmFzZUF1dGhSZWFkeS5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRlIGB0cnVlYCB1bmEgc29sYSB2ZXogZW4gY3VhbnRvIGxhIHNlc2nDs24gZGUgRmlyZWJhc2UgQXV0aCBlc3TDoSBsaXN0YSxcbiAgICogeSBjb21wbGV0YS4gU2kgeWEgZXN0w6EgbGlzdGEsIGVtaXRlIGlubWVkaWF0YW1lbnRlLlxuICAgKlxuICAgKiBQZW5zYWRvIGNvbW8gZ2F0ZSBjb21wYXJ0aWRvIHBhcmEgYWJyaXIgc3RyZWFtcyBGaXJlc3RvcmUg4oCUIGVzcGVyYSBsYVxuICAgKiB2ZW50YW5hIGRlIGhpZHJhdGFjacOzbiBkZSBGaXJlYmFzZSBBdXRoIHNpbiBuZWNlc2lkYWQgZGUgcmV0cmllcy5cbiAgICovXG4gIHJlYWRvbmx5IGZpcmViYXNlQXV0aFJlYWR5JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGg6IEF1dGgsXG4gICAgQEluamVjdChWQUxURUNIX0ZJUkVCQVNFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hGaXJlYmFzZUNvbmZpZ1xuICApIHtcbiAgICAvLyBJbmljaWFsaXphciBvYnNlcnZhYmxlcyBxdWUgZGVwZW5kZW4gZGUgYXV0aFxuICAgIHRoaXMudXNlciQgPSBhdXRoU3RhdGUodGhpcy5hdXRoKS5waXBlKFxuICAgICAgbWFwKHVzZXIgPT4gKHVzZXIgPyB0aGlzLm1hcFVzZXIodXNlcikgOiBudWxsKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gYT8udWlkID09PSBiPy51aWQpXG4gICAgKTtcblxuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkJCA9IHRoaXMudXNlciQucGlwZShcbiAgICAgIG1hcCh1c2VyID0+ICEhdXNlciksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcblxuICAgIC8vIEdhdGUgY29tcGFydGlkbzogZW1pdGUgdHJ1ZSBlbiBjdWFudG8gaGF5YSB1biBmaXJlYmFzZS5Vc2VyIHkgY29tcGxldGEuXG4gICAgdGhpcy5maXJlYmFzZUF1dGhSZWFkeSQgPSBhdXRoU3RhdGUodGhpcy5hdXRoKS5waXBlKFxuICAgICAgZmlsdGVyKCh1c2VyKTogdXNlciBpcyBVc2VyID0+ICEhdXNlciksXG4gICAgICBtYXAoKCkgPT4gdHJ1ZSksXG4gICAgICB0YWtlKDEpXG4gICAgKTtcblxuICAgIC8vIEVzY3VjaGFyIGNhbWJpb3MgZW4gZWwgZXN0YWRvIGRlIGF1dGVudGljYWNpw7NuXG4gICAgYXV0aFN0YXRlKHRoaXMuYXV0aCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHVzZXIgPT4ge1xuICAgICAgICAvLyBNYW50ZW5lciBgZmlyZWJhc2VBdXRoUmVhZHlgIHNpbmNyb25pemFkbyBjb24gbGEgc2VzacOzbiByZWFsOlxuICAgICAgICAvLyB0cnVlIGFsIGhhYmVyIFVzZXIsIGZhbHNlIGVuIHNpZ25vdXQuIFBlcm1pdGUgcXVlIGxvcyBnYXRlc1xuICAgICAgICAvLyByZS1ldmFsw7plbiB0cmFzIHVuIGxvZ291dC9sb2dpbiBkZW50cm8gZGUgbGEgbWlzbWEgc2VzacOzbiBkZSBww6FnaW5hLlxuICAgICAgICB0aGlzLl9maXJlYmFzZUF1dGhSZWFkeS5zZXQoISF1c2VyKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdGUubmV4dCh7XG4gICAgICAgICAgdXNlcjogdXNlciA/IHRoaXMubWFwVXNlcih1c2VyKSA6IG51bGwsXG4gICAgICAgICAgaXNBdXRoZW50aWNhdGVkOiAhIXVzZXIsXG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5fZmlyZWJhc2VBdXRoUmVhZHkuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdGUubmV4dCh7XG4gICAgICAgICAgdXNlcjogbnVsbCxcbiAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1ZWx2ZSBlbiBjdWFudG8gbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBBdXRoIGVzdMOhIGxpc3RhIHBhcmEgbGVlclxuICAgKiBGaXJlc3RvcmUuIFNpIHlhIGVzdMOhIGxpc3RhLCByZXN1ZWx2ZSBpbm1lZGlhdGFtZW50ZS5cbiAgICpcbiAgICogw5p0aWwgcGFyYSBnYXRlYXIgbGEgcHJpbWVyYSBzdXNjcmlwY2nDs24gYSB1biBsaXN0ZW5lciBkZSBGaXJlc3RvcmUgeSBhc8OtXG4gICAqIGNlcnJhciBsYSB2ZW50YW5hIGRlIGBwZXJtaXNzaW9uLWRlbmllZGAgZW4gY29sZCBzdGFydC5cbiAgICovXG4gIHdoZW5GaXJlYmFzZUF1dGhSZWFkeSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5fZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuZmlyZWJhc2VBdXRoUmVhZHkkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBVVRFTlRJQ0FDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQXV0ZW50aWNhIGFsIHVzdWFyaW8gY29uIHVuIEN1c3RvbSBUb2tlbiBnZW5lcmFkbyBwb3IgZWwgYmFja2VuZC5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gRmlyZWJhc2UgQ3VzdG9tIFRva2VuIGdlbmVyYWRvIHBvciB0dSBiYWNrZW5kXG4gICAqIEByZXR1cm5zIFVzZXJDcmVkZW50aWFsIGNvbiBsYSBpbmZvcm1hY2nDs24gZGVsIHVzdWFyaW9cbiAgICogQHRocm93cyBFcnJvciBzaSBlbCB0b2tlbiBlcyBpbnbDoWxpZG8gbyBleHBpcsOzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVzcHXDqXMgZGUgbG9naW4gZXhpdG9zbyBjb24gdHUgYmFja2VuZFxuICAgKiBjb25zdCB7IGZpcmViYXNlVG9rZW4gfSA9IGF3YWl0IGJhY2tlbmRBdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCk7XG4gICAqIGF3YWl0IGZpcmViYXNlU2VydmljZS5zaWduSW5XaXRoQ3VzdG9tVG9rZW4oZmlyZWJhc2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aEN1c3RvbVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3VzdG9tVG9rZW4odGhpcy5hdXRoLCB0b2tlbik7XG5cbiAgICAgIC8vIEZvcnphciByZWZyZXNoIGRlbCB0b2tlbiBwYXJhIGFzZWd1cmFyIHF1ZSBsb3MgY2xhaW1zIGVzdMOpbiBhY3R1YWxpemFkb3NcbiAgICAgIC8vIEVzdG8gZXMgbmVjZXNhcmlvIHBvcnF1ZSBnZXRJZFRva2VuUmVzdWx0KCkgY2FjaGVhIGVsIHJlc3VsdGFkb1xuICAgICAgaWYgKGNyZWRlbnRpYWwudXNlcikge1xuICAgICAgICBhd2FpdCBjcmVkZW50aWFsLnVzZXIuZ2V0SWRUb2tlbih0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNyZWRlbnRpYWw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENpZXJyYSBsYSBzZXNpw7NuIGRlIEZpcmViYXNlLlxuICAgKiBMbGFtYXIganVudG8gY29uIGVsIGxvZ291dCBkZSB0dSBzaXN0ZW1hIGRlIGF1dGVudGljYWNpw7NuIHByaW5jaXBhbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhc3luYyBsb2dvdXQoKSB7XG4gICAqICAgYXdhaXQgdGhpcy5iYWNrZW5kQXV0aC5sb2dvdXQoKTsgICAgLy8gVHUgYXV0aFxuICAgKiAgIGF3YWl0IHRoaXMuZmlyZWJhc2Uuc2lnbk91dCgpOyAgICAgICAvLyBGaXJlYmFzZVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2lnbk91dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2lnbk91dCh0aGlzLmF1dGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHRVRURVJTIFPDjU5DUk9OT1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgdXN1YXJpbyBhY3R1YWwgZGUgRmlyZWJhc2UgKHPDrW5jcm9ubykuXG4gICAqIFJldG9ybmEgbnVsbCBzaSBubyBoYXkgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICovXG4gIGdldCBjdXJyZW50VXNlcigpOiBGaXJlYmFzZVVzZXIgfCBudWxsIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoLmN1cnJlbnRVc2VyO1xuICAgIHJldHVybiB1c2VyID8gdGhpcy5tYXBVc2VyKHVzZXIpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIFVJRCBkZWwgdXN1YXJpbyBhY3R1YWwuXG4gICAqIFJldG9ybmEgbnVsbCBzaSBubyBoYXkgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICovXG4gIGdldCB1aWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5jdXJyZW50VXNlcj8udWlkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhIHNpIGhheSB1biB1c3VhcmlvIGF1dGVudGljYWRvIGFjdHVhbG1lbnRlLlxuICAgKi9cbiAgZ2V0IGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmF1dGguY3VycmVudFVzZXI7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVE9LRU5TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIElEIFRva2VuIGRlIEZpcmViYXNlIHBhcmEgZWwgdXN1YXJpbyBhY3R1YWwuXG4gICAqIMOadGlsIHBhcmEgdmFsaWRhciBlbCB1c3VhcmlvIGVuIHR1IGJhY2tlbmQuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBTaSB0cnVlLCBmdWVyemEgbGEgcmVub3ZhY2nDs24gZGVsIHRva2VuXG4gICAqIEByZXR1cm5zIElEIFRva2VuIG8gbnVsbCBzaSBubyBoYXkgdXN1YXJpb1xuICAgKi9cbiAgYXN5bmMgZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGguY3VycmVudFVzZXI7XG4gICAgaWYgKCF1c2VyKSByZXR1cm4gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdXNlci5nZXRJZFRva2VuKGZvcmNlUmVmcmVzaCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgY2xhaW1zIHBlcnNvbmFsaXphZG9zIGRlbCB0b2tlbiBkZWwgdXN1YXJpby5cbiAgICogTG9zIGNsYWltcyBzb24gZXN0YWJsZWNpZG9zIHBvciB0dSBiYWNrZW5kIGFsIGNyZWFyIGVsIEN1c3RvbSBUb2tlbi5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIFNpIHRydWUsIGZ1ZXJ6YSBsYSByZW5vdmFjacOzbiBkZWwgdG9rZW4gcGFyYSBvYnRlbmVyIGNsYWltcyBhY3R1YWxpemFkb3NcbiAgICogQHJldHVybnMgT2JqZXRvIGNvbiBsb3MgY2xhaW1zIG8gdmFjw61vIHNpIG5vIGhheSB1c3VhcmlvXG4gICAqL1xuICBhc3luYyBnZXRDbGFpbXMoZm9yY2VSZWZyZXNoID0gZmFsc2UpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcjtcbiAgICBpZiAoIXVzZXIpIHJldHVybiB7fTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1c2VyLmdldElkVG9rZW5SZXN1bHQoZm9yY2VSZWZyZXNoKTtcbiAgICAgIHJldHVybiByZXN1bHQuY2xhaW1zO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBlc3BlY8OtZmljby5cbiAgICogRWwgcm9sIGRlYmUgZXN0YXIgZGVmaW5pZG8gZW4gbG9zIGNsYWltcyBkZWwgQ3VzdG9tIFRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSAtIE5vbWJyZSBkZWwgcm9sIGEgdmVyaWZpY2FyXG4gICAqIEByZXR1cm5zIHRydWUgc2kgZWwgdXN1YXJpbyB0aWVuZSBlbCByb2xcbiAgICovXG4gIGFzeW5jIGhhc1JvbGUocm9sZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2xhaW1zID0gYXdhaXQgdGhpcy5nZXRDbGFpbXMoKTtcbiAgICByZXR1cm4gKFxuICAgICAgY2xhaW1zWydyb2xlJ10gPT09IHJvbGUgfHwgKEFycmF5LmlzQXJyYXkoY2xhaW1zWydyb2xlcyddKSAmJiBjbGFpbXNbJ3JvbGVzJ10uaW5jbHVkZXMocm9sZSkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSQkFDIC0gUEVSTUlTT1MgWSBPUkdBTklaQUNJT05FU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYXMgbWVtYmVyc2hpcHMgKG9yZ2FuaXphY2lvbmVzKSBkZWwgdXN1YXJpby5cbiAgICogQ2FkYSBtZW1iZXJzaGlwIGNvbnRpZW5lIGVsIHJvbCB5IHBlcm1pc29zIGVuIGVzYSBvcmdhbml6YWNpw7NuLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gU2kgdHJ1ZSwgZnVlcnphIGxhIHJlbm92YWNpw7NuIGRlbCB0b2tlblxuICAgKiBAcmV0dXJucyBNYXBhIGRlIG9yZ0lkIOKGkiBNZW1iZXJzaGlwSW5mb1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgZmlyZWJhc2VTZXJ2aWNlLmdldE1lbWJlcnNoaXBzKCk7XG4gICAqIC8vIHsgJ29yZ19hYmMnOiB7IHJvbGVJZDogJ2FkbWluJywgcm9sZU5hbWU6ICdhZG1pbicsIHBlcm1pc3Npb25zOiBbJ3VzZXJzOionLCAuLi5dIH0gfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1lbWJlcnNoaXBzKGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBNZW1iZXJzaGlwSW5mbz4+IHtcbiAgICBjb25zdCBjbGFpbXMgPSBhd2FpdCB0aGlzLmdldENsYWltcyhmb3JjZVJlZnJlc2gpO1xuICAgIHJldHVybiAoY2xhaW1zWydtZW1iZXJzaGlwcyddIGFzIFJlY29yZDxzdHJpbmcsIE1lbWJlcnNoaXBJbmZvPikgfHwge307XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBvcmdhbml6YWNpw7NuIGFjdGl2YSBkZWwgdXN1YXJpby5cbiAgICogTGEgb3JnYW5pemFjacOzbiBhY3RpdmEgc2UgZXN0YWJsZWNlIGFsIGhhY2VyIGxvZ2luIG8gYWwgY2FtYmlhciBkZSBvcmcuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBTaSB0cnVlLCBmdWVyemEgbGEgcmVub3ZhY2nDs24gZGVsIHRva2VuXG4gICAqIEByZXR1cm5zIElEIGRlIGxhIG9yZ2FuaXphY2nDs24gYWN0aXZhIG8gbnVsbCBzaSBubyBoYXkgbmluZ3VuYVxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlT3JnKGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgY2xhaW1zID0gYXdhaXQgdGhpcy5nZXRDbGFpbXMoZm9yY2VSZWZyZXNoKTtcbiAgICByZXR1cm4gKGNsYWltc1snYWN0aXZlT3JnJ10gYXMgc3RyaW5nKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgaW5mb3JtYWNpw7NuIGRlIHRvZGFzIGxhcyBvcmdhbml6YWNpb25lcyBkZWwgdXN1YXJpby5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIFNpIHRydWUsIGZ1ZXJ6YSBsYSByZW5vdmFjacOzbiBkZWwgdG9rZW5cbiAgICogQHJldHVybnMgQXJyYXkgY29uIGluZm9ybWFjacOzbiBkZSBjYWRhIG9yZ2FuaXphY2nDs25cbiAgICovXG4gIGFzeW5jIGdldE9yZ2FuaXphdGlvbnMoZm9yY2VSZWZyZXNoID0gZmFsc2UpOiBQcm9taXNlPE9yZ2FuaXphdGlvbkluZm9bXT4ge1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5nZXRNZW1iZXJzaGlwcyhmb3JjZVJlZnJlc2gpO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhtZW1iZXJzaGlwcykubWFwKChbaWQsIGluZm9dKSA9PiAoe1xuICAgICAgaWQsXG4gICAgICByb2xlSWQ6IGluZm8ucm9sZUlkLFxuICAgICAgcm9sZU5hbWU6IGluZm8ucm9sZU5hbWUsXG4gICAgICBwZXJtaXNzaW9uczogaW5mby5wZXJtaXNzaW9ucyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgSURzIGRlIHRvZGFzIGxhcyBvcmdhbml6YWNpb25lcyBkZWwgdXN1YXJpby5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgZGUgSURzIGRlIG9yZ2FuaXphY2lvbmVzXG4gICAqL1xuICBhc3luYyBnZXRPcmdhbml6YXRpb25JZHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5nZXRNZW1iZXJzaGlwcygpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZW1iZXJzaGlwcyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyBwZXJ0ZW5lY2UgYSB1bmEgb3JnYW5pemFjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzblxuICAgKiBAcmV0dXJucyB0cnVlIHNpIGVsIHVzdWFyaW8gZXMgbWllbWJyb1xuICAgKi9cbiAgYXN5bmMgaXNNZW1iZXJPZihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCB0aGlzLmdldE1lbWJlcnNoaXBzKCk7XG4gICAgcmV0dXJuIG9yZ0lkIGluIG1lbWJlcnNoaXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgcm9sIGRlbCB1c3VhcmlvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKlxuICAgKiBAcGFyYW0gb3JnSWQgLSBJRCBkZSBsYSBvcmdhbml6YWNpw7NuXG4gICAqIEByZXR1cm5zIElEIGRlbCByb2wgbyBudWxsIHNpIG5vIGVzIG1pZW1icm9cbiAgICovXG4gIGFzeW5jIGdldFJvbGVJbk9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCB0aGlzLmdldE1lbWJlcnNoaXBzKCk7XG4gICAgcmV0dXJuIG1lbWJlcnNoaXBzW29yZ0lkXT8ucm9sZUlkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgcGVybWlzb3MgZGVsIHVzdWFyaW8gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCAtIElEIGRlIGxhIG9yZ2FuaXphY2nDs25cbiAgICogQHJldHVybnMgQXJyYXkgZGUgcGVybWlzb3MgZW4gZm9ybWF0byAncmVzb3VyY2U6YWN0aW9uJ1xuICAgKi9cbiAgYXN5bmMgZ2V0UGVybWlzc2lvbnNJbk9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5nZXRNZW1iZXJzaGlwcygpO1xuICAgIHJldHVybiBtZW1iZXJzaGlwc1tvcmdJZF0/LnBlcm1pc3Npb25zIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcGVybWlzbyBlc3BlY8OtZmljbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogU29wb3J0YSB3aWxkY2FyZHM6ICdyZXNvdXJjZToqJyB5ICcqOionIChzdXBlciBhZG1pbikuXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCAtIElEIGRlIGxhIG9yZ2FuaXphY2nDs25cbiAgICogQHBhcmFtIHJlc291cmNlIC0gUmVjdXJzbyBhIHZlcmlmaWNhciAoZWo6ICd1c2VycycsICdkb2N1bWVudHMnKVxuICAgKiBAcGFyYW0gYWN0aW9uIC0gQWNjacOzbiBhIHZlcmlmaWNhciAoZWo6ICdyZWFkJywgJ3dyaXRlJywgJ2NyZWF0ZScsICdkZWxldGUnKVxuICAgKiBAcmV0dXJucyB0cnVlIHNpIHRpZW5lIGVsIHBlcm1pc29cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBWZXJpZmljYXIgcGVybWlzbyBlc3BlY8OtZmljb1xuICAgKiBjb25zdCBjYW5SZWFkVXNlcnMgPSBhd2FpdCBmaXJlYmFzZVNlcnZpY2UuaGFzUGVybWlzc2lvbignb3JnX2FiYycsICd1c2VycycsICdyZWFkJyk7XG4gICAqXG4gICAqIC8vIFZlcmlmaWNhciBlbiBsYSBvcmdhbml6YWNpw7NuIGFjdGl2YVxuICAgKiBjb25zdCBvcmdJZCA9IGF3YWl0IGZpcmViYXNlU2VydmljZS5nZXRBY3RpdmVPcmcoKTtcbiAgICogY29uc3QgY2FuRWRpdCA9IGF3YWl0IGZpcmViYXNlU2VydmljZS5oYXNQZXJtaXNzaW9uKG9yZ0lkISwgJ2RvY3VtZW50cycsICd3cml0ZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGhhc1Blcm1pc3Npb24ob3JnSWQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0UGVybWlzc2lvbnNJbk9yZyhvcmdJZCk7XG4gICAgY29uc3QgcGVybWlzc2lvbiA9IGAke3Jlc291cmNlfToke2FjdGlvbn1gO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBlcm1pc3Npb25zLmluY2x1ZGVzKHBlcm1pc3Npb24pIHx8XG4gICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcyhgJHtyZXNvdXJjZX06KmApIHx8XG4gICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnKjoqJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgbGVlciB1biByZWN1cnNvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKiBBdGFqbyBwYXJhIGhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAncmVhZCcpLlxuICAgKi9cbiAgYXN5bmMgY2FuUmVhZChvcmdJZDogc3RyaW5nLCByZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICdyZWFkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyBwdWVkZSBlc2NyaWJpciB1biByZWN1cnNvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKiBBdGFqbyBwYXJhIGhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAnd3JpdGUnKS5cbiAgICovXG4gIGFzeW5jIGNhbldyaXRlKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ3dyaXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyBwdWVkZSBjcmVhciB1biByZWN1cnNvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKiBBdGFqbyBwYXJhIGhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAnY3JlYXRlJykuXG4gICAqL1xuICBhc3luYyBjYW5DcmVhdGUob3JnSWQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAnY3JlYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyBwdWVkZSBlbGltaW5hciB1biByZWN1cnNvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKiBBdGFqbyBwYXJhIGhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAnZGVsZXRlJykuXG4gICAqL1xuICBhc3luYyBjYW5EZWxldGUob3JnSWQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAnZGVsZXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyBwdWVkZSBhZG1pbmlzdHJhciB1biByZWN1cnNvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKiBFcXVpdmFsZSBhIHRlbmVyICdyZXNvdXJjZToqJyBvICcqOionLlxuICAgKi9cbiAgYXN5bmMgY2FuTWFuYWdlKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0UGVybWlzc2lvbnNJbk9yZyhvcmdJZCk7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLmluY2x1ZGVzKGAke3Jlc291cmNlfToqYCkgfHwgcGVybWlzc2lvbnMuaW5jbHVkZXMoJyo6KicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gZXMgc3VwZXIgYWRtaW4gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqIFN1cGVyIGFkbWluIHRpZW5lIGVsIHBlcm1pc28gJyo6KicuXG4gICAqL1xuICBhc3luYyBpc1N1cGVyQWRtaW4ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRQZXJtaXNzaW9uc0luT3JnKG9yZ0lkKTtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuaW5jbHVkZXMoJyo6KicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gZXMgYWRtaW4gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqL1xuICBhc3luYyBpc0FkbWluSW5Pcmcob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLmdldFJvbGVJbk9yZyhvcmdJZCk7XG4gICAgcmV0dXJuIHJvbGUgPT09ICdhZG1pbicgfHwgcm9sZSA9PT0gJ3N1cGVyX2FkbWluJztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVVElMSURBREVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFc3BlcmEgYSBxdWUgZWwgZXN0YWRvIGRlIGF1dGVudGljYWNpw7NuIGVzdMOpIGRldGVybWluYWRvLlxuICAgKiDDmnRpbCBlbiBndWFyZHMgbyBhbCBpbmljaWFsaXphciBsYSBhcHAuXG4gICAqXG4gICAqIEByZXR1cm5zIFVzdWFyaW8gYWN0dWFsIG8gbnVsbFxuICAgKi9cbiAgd2FpdEZvckF1dGgoKTogUHJvbWlzZTxGaXJlYmFzZVVzZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZSQuc3Vic2NyaWJlKHN0YXRlID0+IHtcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlLnVzZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGFjdHVhbCBkZSBGaXJlYmFzZS5cbiAgICovXG4gIGdldENvbmZpZygpOiBWYWx0ZWNoRmlyZWJhc2VDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2Egc2kgbG9zIGVtdWxhZG9yZXMgZXN0w6FuIGhhYmlsaXRhZG9zLlxuICAgKi9cbiAgaXNVc2luZ0VtdWxhdG9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmNvbmZpZy5lbXVsYXRvcj8uZmlyZXN0b3JlIHx8XG4gICAgICB0aGlzLmNvbmZpZy5lbXVsYXRvcj8uYXV0aCB8fFxuICAgICAgdGhpcy5jb25maWcuZW11bGF0b3I/LnN0b3JhZ2VcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE3DiVRPRE9TIFBSSVZBRE9TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBNYXBlYSB1biBVc2VyIGRlIEZpcmViYXNlIGEgbnVlc3RyYSBpbnRlcmZhY2UgRmlyZWJhc2VVc2VyXG4gICAqL1xuICBwcml2YXRlIG1hcFVzZXIodXNlcjogVXNlcik6IEZpcmViYXNlVXNlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpZDogdXNlci51aWQsXG4gICAgICBlbWFpbDogdXNlci5lbWFpbCxcbiAgICAgIGRpc3BsYXlOYW1lOiB1c2VyLmRpc3BsYXlOYW1lLFxuICAgICAgcGhvdG9VUkw6IHVzZXIucGhvdG9VUkwsXG4gICAgICBlbWFpbFZlcmlmaWVkOiB1c2VyLmVtYWlsVmVyaWZpZWQsXG4gICAgICBpc0Fub255bW91czogdXNlci5pc0Fub255bW91cyxcbiAgICAgIHByb3ZpZGVySWQ6IHVzZXIucHJvdmlkZXJJZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZpZXJ0ZSBlcnJvcmVzIGRlIEZpcmViYXNlIGEgbWVuc2FqZXMgZW4gZXNwYcOxb2xcbiAgICovXG4gIHByaXZhdGUgZ2V0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc3QgY29kZSA9IChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZTtcblxuICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgIGNhc2UgJ2F1dGgvaW52YWxpZC1jdXN0b20tdG9rZW4nOlxuICAgICAgICAgIHJldHVybiAnVG9rZW4gZGUgYXV0ZW50aWNhY2nDs24gaW52w6FsaWRvJztcbiAgICAgICAgY2FzZSAnYXV0aC9jdXN0b20tdG9rZW4tbWlzbWF0Y2gnOlxuICAgICAgICAgIHJldHVybiAnRWwgdG9rZW4gbm8gY29ycmVzcG9uZGUgYSBlc3RlIHByb3llY3RvJztcbiAgICAgICAgY2FzZSAnYXV0aC9uZXR3b3JrLXJlcXVlc3QtZmFpbGVkJzpcbiAgICAgICAgICByZXR1cm4gJ0Vycm9yIGRlIGNvbmV4acOzbi4gVmVyaWZpY2EgdHUgY29uZXhpw7NuIGEgaW50ZXJuZXQnO1xuICAgICAgICBjYXNlICdhdXRoL3Rvby1tYW55LXJlcXVlc3RzJzpcbiAgICAgICAgICByZXR1cm4gJ0RlbWFzaWFkb3MgaW50ZW50b3MuIEludGVudGEgZGUgbnVldm8gbcOhcyB0YXJkZSc7XG4gICAgICAgIGNhc2UgJ2F1dGgvdXNlci1kaXNhYmxlZCc6XG4gICAgICAgICAgcmV0dXJuICdFc3RhIGN1ZW50YSBoYSBzaWRvIGRlc2hhYmlsaXRhZGEnO1xuICAgICAgICBjYXNlICdhdXRoL3VzZXItbm90LWZvdW5kJzpcbiAgICAgICAgICByZXR1cm4gJ1VzdWFyaW8gbm8gZW5jb250cmFkbyc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGRlIGF1dGVudGljYWNpw7NuIGRlc2Nvbm9jaWRvJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJ0Vycm9yIGRlIGF1dGVudGljYWNpw7NuIGRlc2Nvbm9jaWRvJztcbiAgfVxufVxuIl19