@valtimo/keycloak 10.3.0 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/esm2020/lib/callback.component.mjs +22 -16
  2. package/esm2020/lib/constants/index.mjs +17 -0
  3. package/esm2020/lib/constants/storage-keys.mjs +23 -0
  4. package/esm2020/lib/keycloak-routing.module.mjs +2 -2
  5. package/esm2020/lib/keycloak.init.mjs +8 -9
  6. package/esm2020/lib/keycloak.module.mjs +2 -2
  7. package/esm2020/lib/models/index.mjs +2 -2
  8. package/esm2020/lib/models/keycloak.config.mjs +2 -2
  9. package/esm2020/lib/services/index.mjs +20 -0
  10. package/esm2020/lib/services/keycloak-auth-guard.service.mjs +61 -0
  11. package/esm2020/lib/services/keycloak-options.service.mjs +24 -0
  12. package/esm2020/lib/services/keycloak-storage.service.mjs +43 -0
  13. package/esm2020/lib/services/keycloak-user.service.mjs +180 -0
  14. package/esm2020/public_api.mjs +6 -5
  15. package/fesm2015/valtimo-keycloak.mjs +262 -148
  16. package/fesm2015/valtimo-keycloak.mjs.map +1 -1
  17. package/fesm2020/valtimo-keycloak.mjs +264 -151
  18. package/fesm2020/valtimo-keycloak.mjs.map +1 -1
  19. package/lib/callback.component.d.ts +3 -2
  20. package/lib/callback.component.d.ts.map +1 -1
  21. package/lib/constants/index.d.ts +2 -0
  22. package/lib/constants/index.d.ts.map +1 -0
  23. package/lib/constants/storage-keys.d.ts +8 -0
  24. package/lib/constants/storage-keys.d.ts.map +1 -0
  25. package/lib/keycloak.init.d.ts.map +1 -1
  26. package/lib/services/index.d.ts +5 -0
  27. package/lib/services/index.d.ts.map +1 -0
  28. package/lib/services/keycloak-auth-guard.service.d.ts.map +1 -0
  29. package/lib/services/keycloak-options.service.d.ts.map +1 -0
  30. package/lib/services/keycloak-storage.service.d.ts +11 -0
  31. package/lib/services/keycloak-storage.service.d.ts.map +1 -0
  32. package/lib/{keycloak-user.service.d.ts → services/keycloak-user.service.d.ts} +9 -2
  33. package/lib/services/keycloak-user.service.d.ts.map +1 -0
  34. package/package.json +1 -1
  35. package/public_api.d.ts +4 -3
  36. package/public_api.d.ts.map +1 -1
  37. package/esm2020/lib/keycloak-auth-guard.service.mjs +0 -61
  38. package/esm2020/lib/keycloak-options.service.mjs +0 -24
  39. package/esm2020/lib/keycloak-user.service.mjs +0 -162
  40. package/lib/keycloak-auth-guard.service.d.ts.map +0 -1
  41. package/lib/keycloak-options.service.d.ts.map +0 -1
  42. package/lib/keycloak-user.service.d.ts.map +0 -1
  43. /package/lib/{keycloak-auth-guard.service.d.ts → services/keycloak-auth-guard.service.d.ts} +0 -0
  44. /package/lib/{keycloak-options.service.d.ts → services/keycloak-options.service.d.ts} +0 -0
@@ -0,0 +1,180 @@
1
+ /*
2
+ * Copyright 2015-2023 Ritense BV, the Netherlands.
3
+ *
4
+ * Licensed under EUPL, Version 1.2 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Injectable } from '@angular/core';
17
+ import { combineLatest, map, ReplaySubject, Subject, switchMap, timer } from 'rxjs';
18
+ import { KeycloakEventType } from 'keycloak-angular';
19
+ import { ValtimoUserIdentity } from '@valtimo/config';
20
+ import jwt_decode from 'jwt-decode';
21
+ import { take } from 'rxjs/operators';
22
+ import { STORAGE_KEYS } from '../constants';
23
+ import * as i0 from "@angular/core";
24
+ import * as i1 from "keycloak-angular";
25
+ import * as i2 from "./keycloak-options.service";
26
+ import * as i3 from "ngx-logger";
27
+ import * as i4 from "@valtimo/user-interface";
28
+ import * as i5 from "@ngx-translate/core";
29
+ import * as i6 from "@angular/common";
30
+ import * as i7 from "@valtimo/config";
31
+ import * as i8 from "@angular/router";
32
+ import * as i9 from "./keycloak-storage.service";
33
+ export class KeycloakUserService {
34
+ constructor(keycloakService, keycloakOptionsService, logger, promptService, translateService, datePipe, configService, router, keycloakStorageService) {
35
+ this.keycloakService = keycloakService;
36
+ this.keycloakOptionsService = keycloakOptionsService;
37
+ this.logger = logger;
38
+ this.promptService = promptService;
39
+ this.translateService = translateService;
40
+ this.datePipe = datePipe;
41
+ this.configService = configService;
42
+ this.router = router;
43
+ this.keycloakStorageService = keycloakStorageService;
44
+ this._refreshToken$ = new Subject();
45
+ this.FIVE_MINUTES_MS = 300000;
46
+ this.EXPIRE_TOKEN_CONFIRMATION = 'EXPIRE_TOKEN_CONFIRMATION';
47
+ this.openTokenRefreshSubscription();
48
+ this.openRefreshTokenSubscription();
49
+ }
50
+ ngOnDestroy() {
51
+ this.tokenRefreshSubscription?.unsubscribe();
52
+ this.refreshTokenSubscription?.unsubscribe();
53
+ this.closeExpiryTimerSubscription();
54
+ }
55
+ init() {
56
+ this.userIdentity = new ReplaySubject();
57
+ this.keycloakService.loadUserProfile().then(user => {
58
+ this.logger.debug('KeycloakUserService: loadUserProfile = ', user);
59
+ const roles = [];
60
+ this.keycloakService.getUserRoles(true).forEach(role => roles.push(role));
61
+ const valtimoUserIdentity = new ValtimoUserIdentity(user.email, user.firstName, user.lastName, roles, user.username);
62
+ this.logger.debug('KeycloakUserService: loaded user identity', valtimoUserIdentity);
63
+ this.userIdentity.next(valtimoUserIdentity);
64
+ });
65
+ this.setRefreshToken();
66
+ }
67
+ getUserSubject() {
68
+ this.logger.debug('KeycloakUserService: getUserIdentity');
69
+ return this.userIdentity;
70
+ }
71
+ logout() {
72
+ this.logger.debug('KeycloakUserService: logout');
73
+ this.keycloakService.logout(this.keycloakOptionsService.logoutRedirectUri);
74
+ }
75
+ async getToken() {
76
+ this.logger.debug('KeycloakUserService: getToken');
77
+ return this.keycloakService.getToken();
78
+ }
79
+ async updateToken(minValidity) {
80
+ this.logger.debug('KeycloakUserService: updateToken');
81
+ return this.keycloakService.updateToken(minValidity);
82
+ }
83
+ openTokenRefreshSubscription() {
84
+ this.tokenRefreshSubscription = this.keycloakService.keycloakEvents$.subscribe(keycloakEvent => {
85
+ if (keycloakEvent.type === KeycloakEventType.OnAuthRefreshSuccess) {
86
+ this.setRefreshToken();
87
+ }
88
+ });
89
+ }
90
+ openRefreshTokenSubscription() {
91
+ this.refreshTokenSubscription = this._refreshToken$.subscribe(refreshToken => {
92
+ const decodedRefreshToken = jwt_decode(refreshToken);
93
+ const tokenExp = decodedRefreshToken.exp * 1000;
94
+ const expiryTimeMs = tokenExp - Date.now() - 1000;
95
+ this._expiryTimeMs = expiryTimeMs;
96
+ this.closeExpiryTimerSubscription();
97
+ this.openExpiryTimerSubscription();
98
+ });
99
+ }
100
+ setRefreshToken() {
101
+ const refreshToken = this.keycloakService.getKeycloakInstance()?.refreshToken;
102
+ if (refreshToken)
103
+ this._refreshToken$.next(refreshToken);
104
+ }
105
+ openExpiryTimerSubscription() {
106
+ this.expiryTimerSubscription = timer(0, 1000)
107
+ .pipe(map(() => {
108
+ this._expiryTimeMs = this._expiryTimeMs - 1000;
109
+ return this._expiryTimeMs;
110
+ }), switchMap(expiryTimeMs => {
111
+ if (expiryTimeMs <= this.FIVE_MINUTES_MS) {
112
+ this._counter = new Date(0, 0, 0, 0, 0, 0);
113
+ this._counter.setSeconds(expiryTimeMs / 1000);
114
+ }
115
+ return combineLatest([
116
+ this.promptService.promptVisible$,
117
+ this.translateService.stream('keycloak.expiryPromptTitle'),
118
+ this.translateService.stream('keycloak.expiryPromptDescription', {
119
+ expiryTime: this.datePipe.transform(this._counter, 'mm:ss'),
120
+ }),
121
+ this.translateService.stream('keycloak.expiryPromptCancel'),
122
+ this.translateService.stream('keycloak.expiryPromptConfirm'),
123
+ ]);
124
+ }))
125
+ .subscribe(([promptVisible, headerText, bodyText, cancelButtonText, confirmButtonText]) => {
126
+ this.promptService.identifier$.pipe(take(1)).subscribe(identifier => {
127
+ if ((!promptVisible || identifier !== this.EXPIRE_TOKEN_CONFIRMATION) &&
128
+ this._expiryTimeMs <= this.FIVE_MINUTES_MS) {
129
+ this.openConfirmationPrompt(headerText, bodyText, cancelButtonText, confirmButtonText);
130
+ }
131
+ if (promptVisible && identifier === this.EXPIRE_TOKEN_CONFIRMATION) {
132
+ this.promptService.setBodyText(bodyText);
133
+ }
134
+ });
135
+ if (this._expiryTimeMs < 2000) {
136
+ this.saveUrl();
137
+ this.logout();
138
+ }
139
+ });
140
+ }
141
+ closeExpiryTimerSubscription() {
142
+ this.expiryTimerSubscription?.unsubscribe();
143
+ }
144
+ openConfirmationPrompt(headerText, bodyText, cancelButtonText, confirmButtonText) {
145
+ this.promptService.openPrompt({
146
+ identifier: this.EXPIRE_TOKEN_CONFIRMATION,
147
+ headerText,
148
+ bodyText,
149
+ cancelButtonText,
150
+ confirmButtonText,
151
+ cancelMdiIcon: 'logout',
152
+ confirmMdiIcon: 'check',
153
+ closeOnConfirm: true,
154
+ closeOnCancel: false,
155
+ cancelCallbackFunction: () => {
156
+ this.keycloakService.logout();
157
+ },
158
+ confirmCallBackFunction: () => {
159
+ this.closeExpiryTimerSubscription();
160
+ this.updateToken(20);
161
+ },
162
+ });
163
+ }
164
+ saveUrl() {
165
+ const returnToLastUrlAfterTokenExpiration = this.configService?.config?.featureToggles?.returnToLastUrlAfterTokenExpiration;
166
+ if (returnToLastUrlAfterTokenExpiration) {
167
+ sessionStorage.setItem(STORAGE_KEYS.urlBeforeExpiration, this.keycloakStorageService.getCurrentUrl());
168
+ sessionStorage.setItem(STORAGE_KEYS.urlBeforeExpirationParams, this.keycloakStorageService.getCurrentUrlParams());
169
+ }
170
+ }
171
+ }
172
+ KeycloakUserService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: KeycloakUserService, deps: [{ token: i1.KeycloakService }, { token: i2.KeycloakOptionsService }, { token: i3.NGXLogger }, { token: i4.PromptService }, { token: i5.TranslateService }, { token: i6.DatePipe }, { token: i7.ConfigService }, { token: i8.Router }, { token: i9.KeycloakStorageService }], target: i0.ɵɵFactoryTarget.Injectable });
173
+ KeycloakUserService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: KeycloakUserService, providedIn: 'root' });
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: KeycloakUserService, decorators: [{
175
+ type: Injectable,
176
+ args: [{
177
+ providedIn: 'root',
178
+ }]
179
+ }], ctorParameters: function () { return [{ type: i1.KeycloakService }, { type: i2.KeycloakOptionsService }, { type: i3.NGXLogger }, { type: i4.PromptService }, { type: i5.TranslateService }, { type: i6.DatePipe }, { type: i7.ConfigService }, { type: i8.Router }, { type: i9.KeycloakStorageService }]; } });
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWstdXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9rZXljbG9hay9zcmMvbGliL3NlcnZpY2VzL2tleWNsb2FrLXVzZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVoRyxPQUFPLEVBQUMsaUJBQWlCLEVBQWtCLE1BQU0sa0JBQWtCLENBQUM7QUFDcEUsT0FBTyxFQUEyQyxtQkFBbUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTlGLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUlwQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7QUFNMUMsTUFBTSxPQUFPLG1CQUFtQjtJQWdCOUIsWUFDbUIsZUFBZ0MsRUFDaEMsc0JBQThDLEVBQzlDLE1BQWlCLEVBQ2pCLGFBQTRCLEVBQzVCLGdCQUFrQyxFQUNsQyxRQUFrQixFQUNsQixhQUE0QixFQUM1QixNQUFjLEVBQ2Qsc0JBQThDO1FBUjlDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVC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SUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxDQUM1QyxDQUFDO1lBQ0YsY0FBYyxDQUFDLE9BQU8sQ0FDcEIsWUFBWSxDQUFDLHlCQUF5QixFQUN0QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLEVBQUUsQ0FDbEQsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7aUhBaE1VLG1CQUFtQjtxSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07NEZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIzIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgbWFwLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHN3aXRjaE1hcCwgdGltZXJ9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtOR1hMb2dnZXJ9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHtLZXljbG9ha0V2ZW50VHlwZSwgS2V5Y2xvYWtTZXJ2aWNlfSBmcm9tICdrZXljbG9hay1hbmd1bGFyJztcbmltcG9ydCB7Q29uZmlnU2VydmljZSwgVXNlcklkZW50aXR5LCBVc2VyU2VydmljZSwgVmFsdGltb1VzZXJJZGVudGl0eX0gZnJvbSAnQHZhbHRpbW8vY29uZmlnJztcbmltcG9ydCB7S2V5Y2xvYWtPcHRpb25zU2VydmljZX0gZnJvbSAnLi9rZXljbG9hay1vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IGp3dF9kZWNvZGUgZnJvbSAnand0LWRlY29kZSc7XG5pbXBvcnQge1Byb21wdFNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL3VzZXItaW50ZXJmYWNlJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0RhdGVQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7U1RPUkFHRV9LRVlTfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtLZXljbG9ha1N0b3JhZ2VTZXJ2aWNlfSBmcm9tICcuL2tleWNsb2FrLXN0b3JhZ2Uuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBLZXljbG9ha1VzZXJTZXJ2aWNlIGltcGxlbWVudHMgVXNlclNlcnZpY2UsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgdXNlcklkZW50aXR5OiBSZXBsYXlTdWJqZWN0PFVzZXJJZGVudGl0eT47XG5cbiAgcHJpdmF0ZSB0b2tlblJlZnJlc2hTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVmcmVzaFRva2VuU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGV4cGlyeVRpbWVyU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlZnJlc2hUb2tlbiQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBfZXhwaXJ5VGltZU1zITogbnVtYmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgRklWRV9NSU5VVEVTX01TID0gMzAwMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IEVYUElSRV9UT0tFTl9DT05GSVJNQVRJT04gPSAnRVhQSVJFX1RPS0VOX0NPTkZJUk1BVElPTic7XG5cbiAgcHJpdmF0ZSBfY291bnRlciE6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBrZXljbG9ha1NlcnZpY2U6IEtleWNsb2FrU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGtleWNsb2FrT3B0aW9uc1NlcnZpY2U6IEtleWNsb2FrT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb21wdFNlcnZpY2U6IFByb21wdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVBpcGU6IERhdGVQaXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkga2V5Y2xvYWtTdG9yYWdlU2VydmljZTogS2V5Y2xvYWtTdG9yYWdlU2VydmljZVxuICApIHtcbiAgICB0aGlzLm9wZW5Ub2tlblJlZnJlc2hTdWJzY3JpcHRpb24oKTtcbiAgICB0aGlzLm9wZW5SZWZyZXNoVG9rZW5TdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5SZWZyZXNoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucmVmcmVzaFRva2VuU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2xvc2VFeHBpcnlUaW1lclN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJJZGVudGl0eSA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG4gICAgdGhpcy5rZXljbG9ha1NlcnZpY2UubG9hZFVzZXJQcm9maWxlKCkudGhlbih1c2VyID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdLZXljbG9ha1VzZXJTZXJ2aWNlOiBsb2FkVXNlclByb2ZpbGUgPSAnLCB1c2VyKTtcbiAgICAgIGNvbnN0IHJvbGVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICB0aGlzLmtleWNsb2FrU2VydmljZS5nZXRVc2VyUm9sZXModHJ1ZSkuZm9yRWFjaChyb2xlID0+IHJvbGVzLnB1c2gocm9sZSkpO1xuICAgICAgY29uc3QgdmFsdGltb1VzZXJJZGVudGl0eSA9IG5ldyBWYWx0aW1vVXNlcklkZW50aXR5KFxuICAgICAgICB1c2VyLmVtYWlsLFxuICAgICAgICB1c2VyLmZpcnN0TmFtZSxcbiAgICAgICAgdXNlci5sYXN0TmFtZSxcbiAgICAgICAgcm9sZXMsXG4gICAgICAgIHVzZXIudXNlcm5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnS2V5Y2xvYWtVc2VyU2VydmljZTogbG9hZGVkIHVzZXIgaWRlbnRpdHknLCB2YWx0aW1vVXNlcklkZW50aXR5KTtcbiAgICAgIHRoaXMudXNlcklkZW50aXR5Lm5leHQodmFsdGltb1VzZXJJZGVudGl0eSk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRSZWZyZXNoVG9rZW4oKTtcbiAgfVxuXG4gIGdldFVzZXJTdWJqZWN0KCk6IFJlcGxheVN1YmplY3Q8VXNlcklkZW50aXR5PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0tleWNsb2FrVXNlclNlcnZpY2U6IGdldFVzZXJJZGVudGl0eScpO1xuICAgIHJldHVybiB0aGlzLnVzZXJJZGVudGl0eTtcbiAgfVxuXG4gIGxvZ291dCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnS2V5Y2xvYWtVc2VyU2VydmljZTogbG9nb3V0Jyk7XG4gICAgdGhpcy5rZXljbG9ha1NlcnZpY2UubG9nb3V0KHRoaXMua2V5Y2xvYWtPcHRpb25zU2VydmljZS5sb2dvdXRSZWRpcmVjdFVyaSk7XG4gIH1cblxuICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdLZXljbG9ha1VzZXJTZXJ2aWNlOiBnZXRUb2tlbicpO1xuICAgIHJldHVybiB0aGlzLmtleWNsb2FrU2VydmljZS5nZXRUb2tlbigpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlVG9rZW4obWluVmFsaWRpdHk6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdLZXljbG9ha1VzZXJTZXJ2aWNlOiB1cGRhdGVUb2tlbicpO1xuICAgIHJldHVybiB0aGlzLmtleWNsb2FrU2VydmljZS51cGRhdGVUb2tlbihtaW5WYWxpZGl0eSk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Ub2tlblJlZnJlc2hTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblJlZnJlc2hTdWJzY3JpcHRpb24gPSB0aGlzLmtleWNsb2FrU2VydmljZS5rZXljbG9ha0V2ZW50cyQuc3Vic2NyaWJlKFxuICAgICAga2V5Y2xvYWtFdmVudCA9PiB7XG4gICAgICAgIGlmIChrZXljbG9ha0V2ZW50LnR5cGUgPT09IEtleWNsb2FrRXZlbnRUeXBlLk9uQXV0aFJlZnJlc2hTdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5zZXRSZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5SZWZyZXNoVG9rZW5TdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoVG9rZW5TdWJzY3JpcHRpb24gPSB0aGlzLl9yZWZyZXNoVG9rZW4kLnN1YnNjcmliZShyZWZyZXNoVG9rZW4gPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZFJlZnJlc2hUb2tlbjogYW55ID0gand0X2RlY29kZShyZWZyZXNoVG9rZW4pO1xuICAgICAgY29uc3QgdG9rZW5FeHAgPSBkZWNvZGVkUmVmcmVzaFRva2VuLmV4cCAqIDEwMDA7XG4gICAgICBjb25zdCBleHBpcnlUaW1lTXMgPSB0b2tlbkV4cCAtIERhdGUubm93KCkgLSAxMDAwO1xuXG4gICAgICB0aGlzLl9leHBpcnlUaW1lTXMgPSBleHBpcnlUaW1lTXM7XG4gICAgICB0aGlzLmNsb3NlRXhwaXJ5VGltZXJTdWJzY3JpcHRpb24oKTtcbiAgICAgIHRoaXMub3BlbkV4cGlyeVRpbWVyU3Vic2NyaXB0aW9uKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFJlZnJlc2hUb2tlbigpOiB2b2lkIHtcbiAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLmtleWNsb2FrU2VydmljZS5nZXRLZXljbG9ha0luc3RhbmNlKCk/LnJlZnJlc2hUb2tlbjtcbiAgICBpZiAocmVmcmVzaFRva2VuKSB0aGlzLl9yZWZyZXNoVG9rZW4kLm5leHQocmVmcmVzaFRva2VuKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkV4cGlyeVRpbWVyU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwaXJ5VGltZXJTdWJzY3JpcHRpb24gPSB0aW1lcigwLCAxMDAwKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZXhwaXJ5VGltZU1zID0gdGhpcy5fZXhwaXJ5VGltZU1zIC0gMTAwMDtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwaXJ5VGltZU1zO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKGV4cGlyeVRpbWVNcyA9PiB7XG4gICAgICAgICAgaWYgKGV4cGlyeVRpbWVNcyA8PSB0aGlzLkZJVkVfTUlOVVRFU19NUykge1xuICAgICAgICAgICAgdGhpcy5fY291bnRlciA9IG5ldyBEYXRlKDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgdGhpcy5fY291bnRlci5zZXRTZWNvbmRzKGV4cGlyeVRpbWVNcyAvIDEwMDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMucHJvbXB0U2VydmljZS5wcm9tcHRWaXNpYmxlJCxcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleWNsb2FrLmV4cGlyeVByb21wdFRpdGxlJyksXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXljbG9hay5leHBpcnlQcm9tcHREZXNjcmlwdGlvbicsIHtcbiAgICAgICAgICAgICAgZXhwaXJ5VGltZTogdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5fY291bnRlciwgJ21tOnNzJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleWNsb2FrLmV4cGlyeVByb21wdENhbmNlbCcpLFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5Y2xvYWsuZXhwaXJ5UHJvbXB0Q29uZmlybScpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW3Byb21wdFZpc2libGUsIGhlYWRlclRleHQsIGJvZHlUZXh0LCBjYW5jZWxCdXR0b25UZXh0LCBjb25maXJtQnV0dG9uVGV4dF0pID0+IHtcbiAgICAgICAgdGhpcy5wcm9tcHRTZXJ2aWNlLmlkZW50aWZpZXIkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGlkZW50aWZpZXIgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICghcHJvbXB0VmlzaWJsZSB8fCBpZGVudGlmaWVyICE9PSB0aGlzLkVYUElSRV9UT0tFTl9DT05GSVJNQVRJT04pICYmXG4gICAgICAgICAgICB0aGlzLl9leHBpcnlUaW1lTXMgPD0gdGhpcy5GSVZFX01JTlVURVNfTVNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNvbmZpcm1hdGlvblByb21wdChoZWFkZXJUZXh0LCBib2R5VGV4dCwgY2FuY2VsQnV0dG9uVGV4dCwgY29uZmlybUJ1dHRvblRleHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9tcHRWaXNpYmxlICYmIGlkZW50aWZpZXIgPT09IHRoaXMuRVhQSVJFX1RPS0VOX0NPTkZJUk1BVElPTikge1xuICAgICAgICAgICAgdGhpcy5wcm9tcHRTZXJ2aWNlLnNldEJvZHlUZXh0KGJvZHlUZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLl9leHBpcnlUaW1lTXMgPCAyMDAwKSB7XG4gICAgICAgICAgdGhpcy5zYXZlVXJsKCk7XG4gICAgICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlRXhwaXJ5VGltZXJTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5leHBpcnlUaW1lclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkNvbmZpcm1hdGlvblByb21wdChcbiAgICBoZWFkZXJUZXh0OiBzdHJpbmcsXG4gICAgYm9keVRleHQ6IHN0cmluZyxcbiAgICBjYW5jZWxCdXR0b25UZXh0OiBzdHJpbmcsXG4gICAgY29uZmlybUJ1dHRvblRleHQ6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICB0aGlzLnByb21wdFNlcnZpY2Uub3BlblByb21wdCh7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLkVYUElSRV9UT0tFTl9DT05GSVJNQVRJT04sXG4gICAgICBoZWFkZXJUZXh0LFxuICAgICAgYm9keVRleHQsXG4gICAgICBjYW5jZWxCdXR0b25UZXh0LFxuICAgICAgY29uZmlybUJ1dHRvblRleHQsXG4gICAgICBjYW5jZWxNZGlJY29uOiAnbG9nb3V0JyxcbiAgICAgIGNvbmZpcm1NZGlJY29uOiAnY2hlY2snLFxuICAgICAgY2xvc2VPbkNvbmZpcm06IHRydWUsXG4gICAgICBjbG9zZU9uQ2FuY2VsOiBmYWxzZSxcbiAgICAgIGNhbmNlbENhbGxiYWNrRnVuY3Rpb246ICgpID0+IHtcbiAgICAgICAgdGhpcy5rZXljbG9ha1NlcnZpY2UubG9nb3V0KCk7XG4gICAgICB9LFxuICAgICAgY29uZmlybUNhbGxCYWNrRnVuY3Rpb246ICgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZUV4cGlyeVRpbWVyU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVG9rZW4oMjApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXR1cm5Ub0xhc3RVcmxBZnRlclRva2VuRXhwaXJhdGlvbiA9XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2U/LmNvbmZpZz8uZmVhdHVyZVRvZ2dsZXM/LnJldHVyblRvTGFzdFVybEFmdGVyVG9rZW5FeHBpcmF0aW9uO1xuXG4gICAgaWYgKHJldHVyblRvTGFzdFVybEFmdGVyVG9rZW5FeHBpcmF0aW9uKSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICBTVE9SQUdFX0tFWVMudXJsQmVmb3JlRXhwaXJhdGlvbixcbiAgICAgICAgdGhpcy5rZXljbG9ha1N0b3JhZ2VTZXJ2aWNlLmdldEN1cnJlbnRVcmwoKVxuICAgICAgKTtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIFNUT1JBR0VfS0VZUy51cmxCZWZvcmVFeHBpcmF0aW9uUGFyYW1zLFxuICAgICAgICB0aGlzLmtleWNsb2FrU3RvcmFnZVNlcnZpY2UuZ2V0Q3VycmVudFVybFBhcmFtcygpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2015-2020 Ritense BV, the Netherlands.
2
+ * Copyright 2015-2023 Ritense BV, the Netherlands.
3
3
  *
4
4
  * Licensed under EUPL, Version 1.2 (the "License");
5
5
  * you may not use this file except in compliance with the License.
@@ -18,9 +18,10 @@
18
18
  */
19
19
  export * from './lib/models';
20
20
  export * from './lib/keycloak.module';
21
- export * from './lib/keycloak-auth-guard.service';
22
- export * from './lib/keycloak-user.service';
21
+ export * from './lib/services/keycloak-auth-guard.service';
22
+ export * from './lib/services/keycloak-user.service';
23
23
  export * from './lib/keycloak.init';
24
- export * from './lib/keycloak-options.service';
24
+ export * from './lib/services/keycloak-options.service';
25
25
  export * from './lib/callback.component';
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8va2V5Y2xvYWsvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSDs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjAgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBrZXljbG9ha1xuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9rZXljbG9hay5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIva2V5Y2xvYWstYXV0aC1ndWFyZC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2tleWNsb2FrLXVzZXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9rZXljbG9hay5pbml0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2tleWNsb2FrLW9wdGlvbnMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jYWxsYmFjay5jb21wb25lbnQnO1xuIl19
26
+ export * from './lib/constants';
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8va2V5Y2xvYWsvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSDs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGtleWNsb2FrXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2tleWNsb2FrLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9rZXljbG9hay1hdXRoLWd1YXJkLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMva2V5Y2xvYWstdXNlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2tleWNsb2FrLmluaXQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMva2V5Y2xvYWstb3B0aW9ucy5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NhbGxiYWNrLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25zdGFudHMnO1xuIl19