valtech-components 2.0.428 → 2.0.430

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +17 -3
  2. package/esm2022/lib/components/organisms/data-table/types.mjs +1 -1
  3. package/esm2022/lib/services/auth/auth-state.service.mjs +173 -0
  4. package/esm2022/lib/services/auth/auth.service.mjs +432 -0
  5. package/esm2022/lib/services/auth/config.mjs +76 -0
  6. package/esm2022/lib/services/auth/guards.mjs +194 -0
  7. package/esm2022/lib/services/auth/index.mjs +70 -0
  8. package/esm2022/lib/services/auth/interceptor.mjs +98 -0
  9. package/esm2022/lib/services/auth/storage.service.mjs +138 -0
  10. package/esm2022/lib/services/auth/sync.service.mjs +146 -0
  11. package/esm2022/lib/services/auth/token.service.mjs +113 -0
  12. package/esm2022/lib/services/auth/types.mjs +29 -0
  13. package/esm2022/public-api.mjs +4 -1
  14. package/fesm2022/valtech-components.mjs +1465 -8
  15. package/fesm2022/valtech-components.mjs.map +1 -1
  16. package/lib/components/organisms/data-table/types.d.ts +8 -0
  17. package/lib/services/auth/auth-state.service.d.ts +85 -0
  18. package/lib/services/auth/auth.service.d.ts +123 -0
  19. package/lib/services/auth/config.d.ts +38 -0
  20. package/lib/services/auth/guards.d.ts +123 -0
  21. package/lib/services/auth/index.d.ts +63 -0
  22. package/lib/services/auth/interceptor.d.ts +22 -0
  23. package/lib/services/auth/storage.service.d.ts +48 -0
  24. package/lib/services/auth/sync.service.d.ts +49 -0
  25. package/lib/services/auth/token.service.d.ts +51 -0
  26. package/lib/services/auth/types.d.ts +264 -0
  27. package/package.json +1 -9
  28. package/public-api.d.ts +1 -0
@@ -0,0 +1,173 @@
1
+ import { Injectable, signal, computed } from '@angular/core';
2
+ import { INITIAL_AUTH_STATE, INITIAL_MFA_STATE, } from './types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Servicio para manejo de estado de autenticación con Angular Signals.
6
+ * Proporciona estado reactivo inmutable.
7
+ */
8
+ export class AuthStateService {
9
+ constructor() {
10
+ // Estado interno (mutable solo dentro del servicio)
11
+ this._state = signal(INITIAL_AUTH_STATE);
12
+ this._mfaPending = signal(INITIAL_MFA_STATE);
13
+ // =============================================
14
+ // Signals públicos (readonly)
15
+ // =============================================
16
+ /** Estado completo de autenticación */
17
+ this.state = this._state.asReadonly();
18
+ /** Estado de MFA pendiente */
19
+ this.mfaPending = this._mfaPending.asReadonly();
20
+ /** Usuario está autenticado */
21
+ this.isAuthenticated = computed(() => this._state().isAuthenticated);
22
+ /** Estado de carga */
23
+ this.isLoading = computed(() => this._state().isLoading);
24
+ /** Token de acceso */
25
+ this.accessToken = computed(() => this._state().accessToken);
26
+ /** Roles del usuario */
27
+ this.roles = computed(() => this._state().roles);
28
+ /** Permisos del usuario */
29
+ this.permissions = computed(() => this._state().permissions);
30
+ /** Usuario es super admin */
31
+ this.isSuperAdmin = computed(() => this._state().isSuperAdmin);
32
+ /** Error actual */
33
+ this.error = computed(() => this._state().error);
34
+ /** Información del usuario */
35
+ this.user = computed(() => {
36
+ const state = this._state();
37
+ if (!state.isAuthenticated || !state.userId) {
38
+ return null;
39
+ }
40
+ return {
41
+ userId: state.userId,
42
+ email: state.email || '',
43
+ roles: state.roles,
44
+ permissions: state.permissions,
45
+ isSuperAdmin: state.isSuperAdmin,
46
+ };
47
+ });
48
+ }
49
+ // =============================================
50
+ // Métodos de actualización
51
+ // =============================================
52
+ /**
53
+ * Establece el estado de carga.
54
+ */
55
+ setLoading(isLoading) {
56
+ this._state.update((s) => ({ ...s, isLoading }));
57
+ }
58
+ /**
59
+ * Establece el estado de autenticación exitosa.
60
+ */
61
+ setAuthenticated(data) {
62
+ this._state.set({
63
+ isAuthenticated: true,
64
+ isLoading: false,
65
+ accessToken: data.accessToken,
66
+ refreshToken: data.refreshToken,
67
+ userId: data.userId || null,
68
+ email: data.email || null,
69
+ roles: data.roles,
70
+ permissions: data.permissions,
71
+ isSuperAdmin: data.isSuperAdmin,
72
+ expiresAt: data.expiresAt,
73
+ error: null,
74
+ });
75
+ }
76
+ /**
77
+ * Actualiza solo el access token (después de refresh).
78
+ */
79
+ updateAccessToken(accessToken, expiresIn) {
80
+ const expiresAt = Date.now() + expiresIn * 1000;
81
+ this._state.update((s) => ({
82
+ ...s,
83
+ accessToken,
84
+ expiresAt,
85
+ }));
86
+ }
87
+ /**
88
+ * Actualiza los permisos.
89
+ */
90
+ updatePermissions(roles, permissions, isSuperAdmin) {
91
+ this._state.update((s) => ({
92
+ ...s,
93
+ roles,
94
+ permissions,
95
+ isSuperAdmin,
96
+ }));
97
+ }
98
+ /**
99
+ * Establece un error de autenticación.
100
+ */
101
+ setError(error) {
102
+ this._state.update((s) => ({
103
+ ...s,
104
+ error,
105
+ isLoading: false,
106
+ }));
107
+ }
108
+ /**
109
+ * Limpia el error.
110
+ */
111
+ clearError() {
112
+ this._state.update((s) => ({
113
+ ...s,
114
+ error: null,
115
+ }));
116
+ }
117
+ /**
118
+ * Establece estado de MFA pendiente.
119
+ */
120
+ setMFAPending(mfaState) {
121
+ this._mfaPending.set(mfaState);
122
+ }
123
+ /**
124
+ * Limpia el estado de MFA pendiente.
125
+ */
126
+ clearMFAPending() {
127
+ this._mfaPending.set(INITIAL_MFA_STATE);
128
+ }
129
+ /**
130
+ * Resetea todo el estado a valores iniciales.
131
+ */
132
+ reset() {
133
+ this._state.set(INITIAL_AUTH_STATE);
134
+ this._mfaPending.set(INITIAL_MFA_STATE);
135
+ }
136
+ /**
137
+ * Restaura estado desde datos almacenados.
138
+ */
139
+ restoreFromStorage(stored) {
140
+ if (stored.accessToken) {
141
+ this._state.set({
142
+ isAuthenticated: true,
143
+ isLoading: false,
144
+ accessToken: stored.accessToken,
145
+ refreshToken: stored.refreshToken || null,
146
+ userId: null, // Se extraerá del token
147
+ email: null, // Se extraerá del token
148
+ roles: stored.roles || [],
149
+ permissions: stored.permissions || [],
150
+ isSuperAdmin: stored.isSuperAdmin || false,
151
+ expiresAt: stored.expiresAt || null,
152
+ error: null,
153
+ });
154
+ }
155
+ }
156
+ /**
157
+ * Actualiza el userId y email (después de parsear el token).
158
+ */
159
+ updateUserInfo(userId, email) {
160
+ this._state.update((s) => ({
161
+ ...s,
162
+ userId,
163
+ email,
164
+ }));
165
+ }
166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
167
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthStateService, providedIn: 'root' }); }
168
+ }
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthStateService, decorators: [{
170
+ type: Injectable,
171
+ args: [{ providedIn: 'root' }]
172
+ }] });
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGgtc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUtMLGtCQUFrQixFQUNsQixpQkFBaUIsR0FFbEIsTUFBTSxTQUFTLENBQUM7O0FBRWpCOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFRSxvREFBb0Q7UUFDNUMsV0FBTSxHQUFHLE1BQU0sQ0FBWSxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9DLGdCQUFXLEdBQUcsTUFBTSxDQUFrQixpQkFBaUIsQ0FBQyxDQUFDO1FBRWpFLGdEQUFnRDtRQUNoRCw4QkFBOEI7UUFDOUIsZ0RBQWdEO1FBRWhELHVDQUF1QztRQUM5QixVQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUxQyw4QkFBOEI7UUFDckIsZUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFcEQsK0JBQStCO1FBQ3RCLG9CQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV6RSxzQkFBc0I7UUFDYixjQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3RCxzQkFBc0I7UUFDYixnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFakUsd0JBQXdCO1FBQ2YsVUFBSyxHQUFHLFFBQVEs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QUFFLHdCQUF3QjtnQkFDdEMsS0FBSyxFQUFFLElBQUksRUFBRSx3QkFBd0I7Z0JBQ3JDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUU7Z0JBQ3JDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLEtBQUs7Z0JBQzFDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUk7Z0JBQ25DLEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxNQUFjLEVBQUUsS0FBYTtRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6QixHQUFHLENBQUM7WUFDSixNQUFNO1lBQ04sS0FBSztTQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQzsrR0EvTFUsZ0JBQWdCO21IQUFoQixnQkFBZ0IsY0FESCxNQUFNOzs0RkFDbkIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCwgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEF1dGhTdGF0ZSxcbiAgQXV0aFVzZXIsXG4gIEF1dGhFcnJvcixcbiAgTUZBUGVuZGluZ1N0YXRlLFxuICBJTklUSUFMX0FVVEhfU1RBVEUsXG4gIElOSVRJQUxfTUZBX1NUQVRFLFxuICBTdG9yZWRBdXRoU3RhdGUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgbWFuZWpvIGRlIGVzdGFkbyBkZSBhdXRlbnRpY2FjacOzbiBjb24gQW5ndWxhciBTaWduYWxzLlxuICogUHJvcG9yY2lvbmEgZXN0YWRvIHJlYWN0aXZvIGlubXV0YWJsZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdXRoU3RhdGVTZXJ2aWNlIHtcbiAgLy8gRXN0YWRvIGludGVybm8gKG11dGFibGUgc29sbyBkZW50cm8gZGVsIHNlcnZpY2lvKVxuICBwcml2YXRlIF9zdGF0ZSA9IHNpZ25hbDxBdXRoU3RhdGU+KElOSVRJQUxfQVVUSF9TVEFURSk7XG4gIHByaXZhdGUgX21mYVBlbmRpbmcgPSBzaWduYWw8TUZBUGVuZGluZ1N0YXRlPihJTklUSUFMX01GQV9TVEFURSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNpZ25hbHMgcMO6YmxpY29zIChyZWFkb25seSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEVzdGFkbyBjb21wbGV0byBkZSBhdXRlbnRpY2FjacOzbiAqL1xuICByZWFkb25seSBzdGF0ZSA9IHRoaXMuX3N0YXRlLmFzUmVhZG9ubHkoKTtcblxuICAvKiogRXN0YWRvIGRlIE1GQSBwZW5kaWVudGUgKi9cbiAgcmVhZG9ubHkgbWZhUGVuZGluZyA9IHRoaXMuX21mYVBlbmRpbmcuYXNSZWFkb25seSgpO1xuXG4gIC8qKiBVc3VhcmlvIGVzdMOhIGF1dGVudGljYWRvICovXG4gIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3N0YXRlKCkuaXNBdXRoZW50aWNhdGVkKTtcblxuICAvKiogRXN0YWRvIGRlIGNhcmdhICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3N0YXRlKCkuaXNMb2FkaW5nKTtcblxuICAvKiogVG9rZW4gZGUgYWNjZXNvICovXG4gIHJlYWRvbmx5IGFjY2Vzc1Rva2VuID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fc3RhdGUoKS5hY2Nlc3NUb2tlbik7XG5cbiAgLyoqIFJvbGVzIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHJvbGVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fc3RhdGUoKS5yb2xlcyk7XG5cbiAgLyoqIFBlcm1pc29zIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fc3RhdGUoKS5wZXJtaXNzaW9ucyk7XG5cbiAgLyoqIFVzdWFyaW8gZXMgc3VwZXIgYWRtaW4gKi9cbiAgcmVhZG9ubHkgaXNTdXBlckFkbWluID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fc3RhdGUoKS5pc1N1cGVyQWRtaW4pO1xuXG4gIC8qKiBFcnJvciBhY3R1YWwgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9zdGF0ZSgpLmVycm9yKTtcblxuICAvKiogSW5mb3JtYWNpw7NuIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHVzZXIgPSBjb21wdXRlZDxBdXRoVXNlciB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlKCk7XG4gICAgaWYgKCFzdGF0ZS5pc0F1dGhlbnRpY2F0ZWQgfHwgIXN0YXRlLnVzZXJJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1c2VySWQ6IHN0YXRlLnVzZXJJZCxcbiAgICAgIGVtYWlsOiBzdGF0ZS5lbWFpbCB8fCAnJyxcbiAgICAgIHJvbGVzOiBzdGF0ZS5yb2xlcyxcbiAgICAgIHBlcm1pc3Npb25zOiBzdGF0ZS5wZXJtaXNzaW9ucyxcbiAgICAgIGlzU3VwZXJBZG1pbjogc3RhdGUuaXNTdXBlckFkbWluLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNw6l0b2RvcyBkZSBhY3R1YWxpemFjacOzblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXN0YWJsZWNlIGVsIGVzdGFkbyBkZSBjYXJnYS5cbiAgICovXG4gIHNldExvYWRpbmcoaXNMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUudXBkYXRlKChzKSA9PiAoeyAuLi5zLCBpc0xvYWRpbmcgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGVjZSBlbCBlc3RhZG8gZGUgYXV0ZW50aWNhY2nDs24gZXhpdG9zYS5cbiAgICovXG4gIHNldEF1dGhlbnRpY2F0ZWQoZGF0YToge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgdXNlcklkPzogc3RyaW5nO1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIHJvbGVzOiBzdHJpbmdbXTtcbiAgICBwZXJtaXNzaW9uczogc3RyaW5nW107XG4gICAgaXNTdXBlckFkbWluOiBib29sZWFuO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUuc2V0KHtcbiAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBhY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogZGF0YS5yZWZyZXNoVG9rZW4sXG4gICAgICB1c2VySWQ6IGRhdGEudXNlcklkIHx8IG51bGwsXG4gICAgICBlbWFpbDogZGF0YS5lbWFpbCB8fCBudWxsLFxuICAgICAgcm9sZXM6IGRhdGEucm9sZXMsXG4gICAgICBwZXJtaXNzaW9uczogZGF0YS5wZXJtaXNzaW9ucyxcbiAgICAgIGlzU3VwZXJBZG1pbjogZGF0YS5pc1N1cGVyQWRtaW4sXG4gICAgICBleHBpcmVzQXQ6IGRhdGEuZXhwaXJlc0F0LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIHNvbG8gZWwgYWNjZXNzIHRva2VuIChkZXNwdcOpcyBkZSByZWZyZXNoKS5cbiAgICovXG4gIHVwZGF0ZUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuOiBzdHJpbmcsIGV4cGlyZXNJbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIGV4cGlyZXNJbiAqIDEwMDA7XG4gICAgdGhpcy5fc3RhdGUudXBkYXRlKChzKSA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgZXhwaXJlc0F0LFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxpemEgbG9zIHBlcm1pc29zLlxuICAgKi9cbiAgdXBkYXRlUGVybWlzc2lvbnMoXG4gICAgcm9sZXM6IHN0cmluZ1tdLFxuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXSxcbiAgICBpc1N1cGVyQWRtaW46IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUudXBkYXRlKChzKSA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIHJvbGVzLFxuICAgICAgcGVybWlzc2lvbnMsXG4gICAgICBpc1N1cGVyQWRtaW4sXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGVjZSB1biBlcnJvciBkZSBhdXRlbnRpY2FjacOzbi5cbiAgICovXG4gIHNldEVycm9yKGVycm9yOiBBdXRoRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0ZS51cGRhdGUoKHMpID0+ICh7XG4gICAgICAuLi5zLFxuICAgICAgZXJyb3IsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW1waWEgZWwgZXJyb3IuXG4gICAqL1xuICBjbGVhckVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXRlLnVwZGF0ZSgocykgPT4gKHtcbiAgICAgIC4uLnMsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRXN0YWJsZWNlIGVzdGFkbyBkZSBNRkEgcGVuZGllbnRlLlxuICAgKi9cbiAgc2V0TUZBUGVuZGluZyhtZmFTdGF0ZTogTUZBUGVuZGluZ1N0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5fbWZhUGVuZGluZy5zZXQobWZhU3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbXBpYSBlbCBlc3RhZG8gZGUgTUZBIHBlbmRpZW50ZS5cbiAgICovXG4gIGNsZWFyTUZBUGVuZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9tZmFQZW5kaW5nLnNldChJTklUSUFMX01GQV9TVEFURSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRlYSB0b2RvIGVsIGVzdGFkbyBhIHZhbG9yZXMgaW5pY2lhbGVzLlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUuc2V0KElOSVRJQUxfQVVUSF9TVEFURSk7XG4gICAgdGhpcy5fbWZhUGVuZGluZy5zZXQoSU5JVElBTF9NRkFfU1RBVEUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RhdXJhIGVzdGFkbyBkZXNkZSBkYXRvcyBhbG1hY2VuYWRvcy5cbiAgICovXG4gIHJlc3RvcmVGcm9tU3RvcmFnZShzdG9yZWQ6IFBhcnRpYWw8U3RvcmVkQXV0aFN0YXRlPik6IHZvaWQge1xuICAgIGlmIChzdG9yZWQuYWNjZXNzVG9rZW4pIHtcbiAgICAgIHRoaXMuX3N0YXRlLnNldCh7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgYWNjZXNzVG9rZW46IHN0b3JlZC5hY2Nlc3NUb2tlbixcbiAgICAgICAgcmVmcmVzaFRva2VuOiBzdG9yZWQucmVmcmVzaFRva2VuIHx8IG51bGwsXG4gICAgICAgIHVzZXJJZDogbnVsbCwgLy8gU2UgZXh0cmFlcsOhIGRlbCB0b2tlblxuICAgICAgICBlbWFpbDogbnVsbCwgLy8gU2UgZXh0cmFlcsOhIGRlbCB0b2tlblxuICAgICAgICByb2xlczogc3RvcmVkLnJvbGVzIHx8IFtdLFxuICAgICAgICBwZXJtaXNzaW9uczogc3RvcmVkLnBlcm1pc3Npb25zIHx8IFtdLFxuICAgICAgICBpc1N1cGVyQWRtaW46IHN0b3JlZC5pc1N1cGVyQWRtaW4gfHwgZmFsc2UsXG4gICAgICAgIGV4cGlyZXNBdDogc3RvcmVkLmV4cGlyZXNBdCB8fCBudWxsLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxpemEgZWwgdXNlcklkIHkgZW1haWwgKGRlc3B1w6lzIGRlIHBhcnNlYXIgZWwgdG9rZW4pLlxuICAgKi9cbiAgdXBkYXRlVXNlckluZm8odXNlcklkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0ZS51cGRhdGUoKHMpID0+ICh7XG4gICAgICAuLi5zLFxuICAgICAgdXNlcklkLFxuICAgICAgZW1haWwsXG4gICAgfSkpO1xuICB9XG59XG4iXX0=