@eui/core 15.4.0 → 15.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +296 -296
- package/README.md +26 -26
- package/assets/i18n-eui/bg.json +114 -114
- package/assets/i18n-eui/cs.json +114 -114
- package/assets/i18n-eui/da.json +114 -114
- package/assets/i18n-eui/de.json +114 -114
- package/assets/i18n-eui/el.json +114 -114
- package/assets/i18n-eui/en.json +113 -113
- package/assets/i18n-eui/es.json +114 -114
- package/assets/i18n-eui/et.json +114 -114
- package/assets/i18n-eui/fi.json +114 -114
- package/assets/i18n-eui/fr.json +114 -114
- package/assets/i18n-eui/ga.json +114 -114
- package/assets/i18n-eui/hr.json +114 -114
- package/assets/i18n-eui/hu.json +114 -114
- package/assets/i18n-eui/it.json +114 -114
- package/assets/i18n-eui/lt.json +114 -114
- package/assets/i18n-eui/lv.json +114 -114
- package/assets/i18n-eui/mt.json +114 -114
- package/assets/i18n-eui/nl.json +114 -114
- package/assets/i18n-eui/pl.json +114 -114
- package/assets/i18n-eui/pt.json +114 -114
- package/assets/i18n-eui/ro.json +114 -114
- package/assets/i18n-eui/sk.json +114 -114
- package/assets/i18n-eui/sl.json +114 -114
- package/assets/i18n-eui/sv.json +114 -114
- package/docs/classes/RouterMock.html +5 -5
- package/docs/dependencies.html +95 -7
- package/docs/index.html +36 -59
- package/docs/injectables/CoreAppEffects.html +51 -51
- package/docs/js/menu-wc.js +12 -7
- package/docs/js/menu-wc_es5.js +1 -1
- package/docs/js/search/search_index.js +2 -2
- package/docs/miscellaneous/variables.html +1211 -1211
- package/docs/overview.html +171 -0
- package/esm2020/eui-core.mjs +4 -4
- package/esm2020/index.mjs +13 -13
- package/esm2020/lib/eui-core.module.mjs +78 -78
- package/esm2020/lib/helpers/date-helpers.mjs +3 -3
- package/esm2020/lib/helpers/dom-helpers.mjs +87 -87
- package/esm2020/lib/helpers/event-helpers.mjs +9 -9
- package/esm2020/lib/helpers/form-helpers.mjs +42 -42
- package/esm2020/lib/helpers/format-helpers.mjs +66 -66
- package/esm2020/lib/helpers/http-helpers.mjs +7 -7
- package/esm2020/lib/helpers/index.mjs +8 -8
- package/esm2020/lib/helpers/utils.mjs +7 -7
- package/esm2020/lib/interceptors/add-lang-param.interceptor.mjs +35 -35
- package/esm2020/lib/interceptors/cache-prevention.interceptor.mjs +21 -21
- package/esm2020/lib/interceptors/cors-security.interceptor.mjs +15 -15
- package/esm2020/lib/interceptors/csrf-prevention.interceptor.mjs +15 -15
- package/esm2020/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +72 -72
- package/esm2020/lib/interceptors/index.mjs +8 -8
- package/esm2020/lib/interceptors/openid/index.mjs +4 -4
- package/esm2020/lib/interceptors/openid/openid-connect.interceptor.mjs +149 -149
- package/esm2020/lib/interceptors/openid/openid-connect.service.mjs +56 -56
- package/esm2020/lib/interceptors/openid/openid-connect.service.mock.mjs +8 -8
- package/esm2020/lib/interceptors/ux-request-error-model.interceptor.mjs +31 -31
- package/esm2020/lib/services/app/eui-init-app.mjs +29 -29
- package/esm2020/lib/services/app/eui-pre-init-app.mjs +43 -43
- package/esm2020/lib/services/app/eui-startup.mjs +40 -40
- package/esm2020/lib/services/app/factories/log.mjs +55 -55
- package/esm2020/lib/services/app/index.mjs +2 -2
- package/esm2020/lib/services/config/defaults.mjs +68 -68
- package/esm2020/lib/services/config/tokens.mjs +74 -74
- package/esm2020/lib/services/errors/eui.error.mjs +38 -38
- package/esm2020/lib/services/errors/global-error-handler.mjs +24 -24
- package/esm2020/lib/services/errors/http-error-handler-callback-functions.mjs +17 -17
- package/esm2020/lib/services/errors/http-error-handler.interceptor.mjs +55 -55
- package/esm2020/lib/services/errors/index.mjs +5 -5
- package/esm2020/lib/services/i18n/i18n.loader.mjs +198 -198
- package/esm2020/lib/services/i18n/i18n.resource.mjs +43 -43
- package/esm2020/lib/services/i18n/i18n.service.mjs +228 -228
- package/esm2020/lib/services/i18n/i18n.service.mock.mjs +38 -38
- package/esm2020/lib/services/i18n/index.mjs +6 -6
- package/esm2020/lib/services/index.mjs +19 -19
- package/esm2020/lib/services/locale/index.mjs +3 -3
- package/esm2020/lib/services/locale/locale.service.mjs +232 -232
- package/esm2020/lib/services/locale/locale.service.mock.mjs +43 -43
- package/esm2020/lib/services/log/index.mjs +4 -4
- package/esm2020/lib/services/log/log.module.mjs +38 -38
- package/esm2020/lib/services/log/log.service.mjs +51 -51
- package/esm2020/lib/services/log/log.service.mock.mjs +7 -7
- package/esm2020/lib/services/permission/permission.service.mjs +110 -110
- package/esm2020/lib/services/queue/api-queue.service.mjs +137 -137
- package/esm2020/lib/services/queue/api-queue.service.mock.mjs +23 -23
- package/esm2020/lib/services/queue/index.mjs +3 -3
- package/esm2020/lib/services/storage/async-storage.service.mjs +17 -17
- package/esm2020/lib/services/storage/async-storage.service.mock.mjs +22 -22
- package/esm2020/lib/services/storage/index.mjs +8 -8
- package/esm2020/lib/services/storage/local-forage.service.mjs +93 -93
- package/esm2020/lib/services/storage/local-storage.service.mjs +75 -75
- package/esm2020/lib/services/storage/session-storage.service.mjs +75 -75
- package/esm2020/lib/services/storage/storage.service.mjs +6 -6
- package/esm2020/lib/services/storage/storage.service.mock.mjs +12 -12
- package/esm2020/lib/services/store/actions/app.actions.mjs +74 -74
- package/esm2020/lib/services/store/actions/i18n.actions.mjs +11 -11
- package/esm2020/lib/services/store/actions/index.mjs +6 -6
- package/esm2020/lib/services/store/actions/locale.actions.mjs +11 -11
- package/esm2020/lib/services/store/actions/notifications.actions.mjs +11 -11
- package/esm2020/lib/services/store/actions/user.actions.mjs +39 -39
- package/esm2020/lib/services/store/effects/app.effects.mjs +55 -55
- package/esm2020/lib/services/store/effects/index.mjs +4 -4
- package/esm2020/lib/services/store/index.mjs +6 -6
- package/esm2020/lib/services/store/reducers/app.reducers.mjs +56 -56
- package/esm2020/lib/services/store/reducers/core.reducers.mjs +13 -13
- package/esm2020/lib/services/store/reducers/i18n.reducers.mjs +16 -16
- package/esm2020/lib/services/store/reducers/index.mjs +8 -8
- package/esm2020/lib/services/store/reducers/locale.reducers.mjs +16 -16
- package/esm2020/lib/services/store/reducers/meta.reducers.mjs +89 -89
- package/esm2020/lib/services/store/reducers/notifications.reducers.mjs +13 -13
- package/esm2020/lib/services/store/reducers/user.reducers.mjs +43 -43
- package/esm2020/lib/services/store/store.service.mjs +112 -112
- package/esm2020/lib/services/store/store.service.mock.mjs +22 -22
- package/esm2020/lib/services/user/index.mjs +3 -3
- package/esm2020/lib/services/user/user.service.mjs +64 -64
- package/esm2020/lib/services/user/user.service.mock.mjs +32 -32
- package/esm2020/lib/services/ux-app-shell.service.mjs +690 -690
- package/esm2020/lib/services/ux-dynamic-component/ux-dynamic-component.service.mjs +63 -63
- package/esm2020/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.mjs +66 -66
- package/esm2020/lib/services/ux-error-feedback/ux-error-feedback.service.mjs +99 -99
- package/esm2020/lib/services/ux-error-feedback/ux-error-handler.operator.mjs +16 -16
- package/esm2020/lib/services/ux-timezone.service.mjs +716 -716
- package/fesm2015/eui-core.mjs +4484 -4484
- package/fesm2015/eui-core.mjs.map +1 -1
- package/fesm2020/eui-core.mjs +4538 -4538
- package/fesm2020/eui-core.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/eui-core.module.d.ts +20 -20
- package/lib/helpers/date-helpers.d.ts +2 -2
- package/lib/helpers/dom-helpers.d.ts +26 -26
- package/lib/helpers/event-helpers.d.ts +1 -1
- package/lib/helpers/form-helpers.d.ts +10 -10
- package/lib/helpers/format-helpers.d.ts +12 -12
- package/lib/helpers/http-helpers.d.ts +2 -2
- package/lib/helpers/index.d.ts +7 -7
- package/lib/helpers/utils.d.ts +6 -6
- package/lib/interceptors/add-lang-param.interceptor.d.ts +16 -16
- package/lib/interceptors/cache-prevention.interceptor.d.ts +8 -8
- package/lib/interceptors/cors-security.interceptor.d.ts +8 -8
- package/lib/interceptors/csrf-prevention.interceptor.d.ts +8 -8
- package/lib/interceptors/eu-login-session-timeout-handling.interceptor.d.ts +12 -12
- package/lib/interceptors/index.d.ts +7 -7
- package/lib/interceptors/openid/index.d.ts +3 -3
- package/lib/interceptors/openid/openid-connect.interceptor.d.ts +14 -14
- package/lib/interceptors/openid/openid-connect.service.d.ts +17 -17
- package/lib/interceptors/openid/openid-connect.service.mock.d.ts +5 -5
- package/lib/interceptors/ux-request-error-model.interceptor.d.ts +13 -13
- package/lib/services/app/eui-init-app.d.ts +2 -2
- package/lib/services/app/eui-pre-init-app.d.ts +16 -16
- package/lib/services/app/eui-startup.d.ts +4 -4
- package/lib/services/app/factories/log.d.ts +25 -25
- package/lib/services/app/index.d.ts +1 -1
- package/lib/services/config/defaults.d.ts +11 -11
- package/lib/services/config/tokens.d.ts +19 -19
- package/lib/services/errors/eui.error.d.ts +15 -15
- package/lib/services/errors/global-error-handler.d.ts +10 -10
- package/lib/services/errors/http-error-handler-callback-functions.d.ts +6 -6
- package/lib/services/errors/http-error-handler.interceptor.d.ts +22 -22
- package/lib/services/errors/index.d.ts +4 -4
- package/lib/services/i18n/i18n.loader.d.ts +79 -79
- package/lib/services/i18n/i18n.resource.d.ts +35 -35
- package/lib/services/i18n/i18n.service.d.ts +73 -73
- package/lib/services/i18n/i18n.service.mock.d.ts +19 -19
- package/lib/services/i18n/index.d.ts +4 -4
- package/lib/services/index.d.ts +18 -18
- package/lib/services/locale/index.d.ts +2 -2
- package/lib/services/locale/locale.service.d.ts +68 -68
- package/lib/services/locale/locale.service.mock.d.ts +15 -15
- package/lib/services/log/index.d.ts +3 -3
- package/lib/services/log/log.module.d.ts +15 -15
- package/lib/services/log/log.service.d.ts +27 -27
- package/lib/services/log/log.service.mock.d.ts +4 -4
- package/lib/services/permission/permission.service.d.ts +52 -52
- package/lib/services/queue/api-queue.service.d.ts +76 -76
- package/lib/services/queue/api-queue.service.mock.d.ts +13 -13
- package/lib/services/queue/index.d.ts +2 -2
- package/lib/services/storage/async-storage.service.d.ts +44 -44
- package/lib/services/storage/async-storage.service.mock.d.ts +11 -11
- package/lib/services/storage/index.d.ts +7 -7
- package/lib/services/storage/local-forage.service.d.ts +48 -48
- package/lib/services/storage/local-storage.service.d.ts +34 -34
- package/lib/services/storage/session-storage.service.d.ts +34 -34
- package/lib/services/storage/storage.service.d.ts +28 -28
- package/lib/services/storage/storage.service.mock.d.ts +7 -7
- package/lib/services/store/actions/app.actions.d.ts +82 -82
- package/lib/services/store/actions/i18n.actions.d.ts +11 -11
- package/lib/services/store/actions/index.d.ts +5 -5
- package/lib/services/store/actions/locale.actions.d.ts +11 -11
- package/lib/services/store/actions/notifications.actions.d.ts +10 -10
- package/lib/services/store/actions/user.actions.d.ts +35 -35
- package/lib/services/store/effects/app.effects.d.ts +19 -19
- package/lib/services/store/effects/index.d.ts +3 -3
- package/lib/services/store/index.d.ts +5 -5
- package/lib/services/store/reducers/app.reducers.d.ts +3 -3
- package/lib/services/store/reducers/core.reducers.d.ts +3 -3
- package/lib/services/store/reducers/i18n.reducers.d.ts +3 -3
- package/lib/services/store/reducers/index.d.ts +7 -7
- package/lib/services/store/reducers/locale.reducers.d.ts +3 -3
- package/lib/services/store/reducers/meta.reducers.d.ts +17 -17
- package/lib/services/store/reducers/notifications.reducers.d.ts +3 -3
- package/lib/services/store/reducers/user.reducers.d.ts +3 -3
- package/lib/services/store/store.service.d.ts +43 -43
- package/lib/services/store/store.service.mock.d.ts +12 -12
- package/lib/services/user/index.d.ts +2 -2
- package/lib/services/user/user.service.d.ts +15 -15
- package/lib/services/user/user.service.mock.d.ts +16 -16
- package/lib/services/ux-app-shell.service.d.ts +155 -155
- package/lib/services/ux-dynamic-component/ux-dynamic-component.service.d.ts +36 -36
- package/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.d.ts +14 -14
- package/lib/services/ux-error-feedback/ux-error-feedback.service.d.ts +35 -35
- package/lib/services/ux-error-feedback/ux-error-handler.operator.d.ts +3 -3
- package/lib/services/ux-timezone.service.d.ts +269 -269
- package/package.json +2 -2
|
@@ -1,232 +1,232 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Angular is using a gulp task to generate the locales that we dynamically import. This task can be found here
|
|
3
|
-
* https://github.com/angular/angular/blob/master/tools/gulp-tasks/cldr/cldr-data.js
|
|
4
|
-
* That task is utilizing the CLDR library to load and construct the locale for each region. This service is responsible
|
|
5
|
-
* to load those locale dynamically upon request and to update the state of the eUI app.
|
|
6
|
-
*
|
|
7
|
-
* Parts that are handles through configuration:
|
|
8
|
-
* - update of the LOCALE_ID token
|
|
9
|
-
* - initial dynamical load of locales
|
|
10
|
-
* - bind to translation service for locale changes
|
|
11
|
-
*/
|
|
12
|
-
import { Inject, Injectable, InjectionToken, LOCALE_ID, Optional } from '@angular/core';
|
|
13
|
-
import { getLocaleId } from '@angular/common';
|
|
14
|
-
import { EuiService, getLocaleState, getLocaleServiceConfigFromBase, } from '@eui/base';
|
|
15
|
-
import { of, Subject, throwError } from 'rxjs';
|
|
16
|
-
import { catchError, filter, map, switchMap, take, takeUntil, tap } from 'rxjs/operators';
|
|
17
|
-
import { UpdateLocaleStateAction } from '../store';
|
|
18
|
-
import { GLOBAL_CONFIG_TOKEN } from '../config/tokens';
|
|
19
|
-
import { createSelector } from '@ngrx/store';
|
|
20
|
-
import * as i0 from "@angular/core";
|
|
21
|
-
import * as i1 from "../store";
|
|
22
|
-
import * as i2 from "../i18n";
|
|
23
|
-
import * as i3 from "../log";
|
|
24
|
-
export const LOCALE_ID_MAPPER = new InjectionToken('localeIdMapper');
|
|
25
|
-
export class LocaleService extends EuiService {
|
|
26
|
-
constructor(store, baseGlobalConfig, locale_id, localeMapper, i18n, log) {
|
|
27
|
-
super({ id: getLocaleId(locale_id) });
|
|
28
|
-
this.store = store;
|
|
29
|
-
this.baseGlobalConfig = baseGlobalConfig;
|
|
30
|
-
this.locale_id = locale_id;
|
|
31
|
-
this.localeMapper = localeMapper;
|
|
32
|
-
this.i18n = i18n;
|
|
33
|
-
this.log = log;
|
|
34
|
-
this.subNotifier = new Subject();
|
|
35
|
-
if (log) {
|
|
36
|
-
this.logger = log.getLogger('core.LocaleService');
|
|
37
|
-
}
|
|
38
|
-
this.config = getLocaleServiceConfigFromBase(this.baseGlobalConfig);
|
|
39
|
-
// in case no localeMapper provided, set the angular getLocaleId as default
|
|
40
|
-
if (!this.localeMapper) {
|
|
41
|
-
this.localeMapper = getLocaleId;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
ngOnDestroy() {
|
|
45
|
-
this.subNotifier.next(void 0);
|
|
46
|
-
this.subNotifier.complete();
|
|
47
|
-
}
|
|
48
|
-
getState(keyOrMapFn) {
|
|
49
|
-
let selector = getLocaleState;
|
|
50
|
-
let dotNotationToObject = (obj, key) => key.split('.').reduce((slice, i) => slice[i], obj);
|
|
51
|
-
if (keyOrMapFn) {
|
|
52
|
-
switch (typeof keyOrMapFn) {
|
|
53
|
-
case 'function':
|
|
54
|
-
selector = createSelector(getLocaleState, keyOrMapFn);
|
|
55
|
-
break;
|
|
56
|
-
case 'string':
|
|
57
|
-
selector = createSelector(getLocaleState, (state) => dotNotationToObject(state, keyOrMapFn));
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return this.store.select(selector).pipe(takeUntil(this.subNotifier),
|
|
62
|
-
// in case service didn't init fallback to LOCALE_ID token value
|
|
63
|
-
map((state) => (state ? state : this.stateInstance ? this.stateInstance : this.locale_id)));
|
|
64
|
-
}
|
|
65
|
-
init(state) {
|
|
66
|
-
super.initEuiService();
|
|
67
|
-
// bind language changes to locale changes
|
|
68
|
-
if (this.config?.bindWithTranslate) {
|
|
69
|
-
this.bindTranslateServiceLangChangeToState();
|
|
70
|
-
}
|
|
71
|
-
// dynamically load locale based on provided configuration
|
|
72
|
-
const availableLocales = state?.available || this.config?.available || this.getBrowserLocales() || [this.currentLocale];
|
|
73
|
-
return this.loadLocale(availableLocales).pipe(takeUntil(this.subNotifier), tap(() => this.updateState(state || { id: this.currentLocale })));
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* dynamically load locale and update the state
|
|
77
|
-
*/
|
|
78
|
-
updateState(state) {
|
|
79
|
-
try {
|
|
80
|
-
const id = this.localeMapper(state.id);
|
|
81
|
-
this.store.dispatch(new UpdateLocaleStateAction({ ...state, id }));
|
|
82
|
-
// update global TOKEN ID based on configuration
|
|
83
|
-
if (this.config.affectGlobalLocale) {
|
|
84
|
-
this.locale_id = id;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch (e) {
|
|
88
|
-
const message = `Locale for '${state.id}' is not available.
|
|
89
|
-
Please use addLocale('${state.id}') first`;
|
|
90
|
-
if (this.log) {
|
|
91
|
-
this.logger.info(message, e);
|
|
92
|
-
}
|
|
93
|
-
throw new Error(message);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
addLocale(id) {
|
|
97
|
-
return this.loadLocale(id);
|
|
98
|
-
}
|
|
99
|
-
get previousLocale() {
|
|
100
|
-
return this.prevStateInstance?.id || this.currentLocale;
|
|
101
|
-
}
|
|
102
|
-
get currentLocale() {
|
|
103
|
-
return this.stateInstance?.id;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* load and register locale data dynamically
|
|
107
|
-
*
|
|
108
|
-
* @param locale array of locale to load
|
|
109
|
-
*/
|
|
110
|
-
loadLocale(locale) {
|
|
111
|
-
// locale = Array.isArray(locale) ? locale : [locale];
|
|
112
|
-
// const localeImports: Observable<{ data: any, localeId: string, extraData: any }>[]
|
|
113
|
-
// = this.filterRegisteredLocales(locale).map(this.importDataAndExtraLocale.bind(this));
|
|
114
|
-
//
|
|
115
|
-
// // in case localeImports array is empty because locale exists, Observable still needs to complete
|
|
116
|
-
// if (localeImports.length < 1) {
|
|
117
|
-
// return of({ success: true });
|
|
118
|
-
// }
|
|
119
|
-
//
|
|
120
|
-
// return forkJoin(...localeImports).pipe(
|
|
121
|
-
// takeUntil(this.subNotifier),
|
|
122
|
-
// map(localeData => {
|
|
123
|
-
// // filter out null results and registerLocaleData including extra
|
|
124
|
-
// localeData.filter(({ data }) => data)
|
|
125
|
-
// .forEach(({ data, localeId, extraData }) => registerLocaleData(data, localeId, extraData));
|
|
126
|
-
// return { success: true };
|
|
127
|
-
// }),
|
|
128
|
-
// catchError(error => {
|
|
129
|
-
// if (this.log) {
|
|
130
|
-
// this.logger.debug(`Locale load error: ${error.message}`, error);
|
|
131
|
-
// }
|
|
132
|
-
// return of({ success: false, error: error });
|
|
133
|
-
// })
|
|
134
|
-
// );
|
|
135
|
-
return of({ success: true });
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* listen for language changes and dynamically set locale accordingly. In case of non registered locale register it
|
|
139
|
-
* dynamically.
|
|
140
|
-
*/
|
|
141
|
-
bindTranslateServiceLangChangeToState() {
|
|
142
|
-
if (this.i18n) {
|
|
143
|
-
this.i18n.onStateChange
|
|
144
|
-
.pipe(takeUntil(this.subNotifier),
|
|
145
|
-
// filter out null values
|
|
146
|
-
filter((state) => state?.activeLang !== null && state?.activeLang !== undefined),
|
|
147
|
-
// BEWARE: filter is based on convention that locale id sliced(2) will match activeLang e.g. en-US => en
|
|
148
|
-
// Also, if activeLang is 'en' and locale is 'en-GB' it will not trigger locale change
|
|
149
|
-
filter((state) => state.activeLang.toLowerCase() !== this.stateInstance?.id.slice(0, 2).toLowerCase()),
|
|
150
|
-
// to check if registration of locale otherwise register it
|
|
151
|
-
switchMap((value) => of(value).pipe(
|
|
152
|
-
// getLocaleId may throw Error(`Missing locale data for the locale "${locale}".`);
|
|
153
|
-
switchMap((i18state) => {
|
|
154
|
-
// check if activeLang is null or undefined
|
|
155
|
-
if (!i18state.activeLang) {
|
|
156
|
-
return throwError('Has i18nService initialized? If not make sure i18nService.init().subscribe(..)');
|
|
157
|
-
}
|
|
158
|
-
return of(this.localeMapper(i18state.activeLang));
|
|
159
|
-
}), catchError((error) => {
|
|
160
|
-
if (this.log) {
|
|
161
|
-
this.logger.debug(error);
|
|
162
|
-
}
|
|
163
|
-
return this.loadLocale(value?.activeLang).pipe(filter((s) => s.success), map(() => this.localeMapper(value?.activeLang)), catchError((e) => {
|
|
164
|
-
if (this.log) {
|
|
165
|
-
this.logger.debug('Something went terribly really wrong during locale loading', e.err.message);
|
|
166
|
-
}
|
|
167
|
-
return of(e);
|
|
168
|
-
}));
|
|
169
|
-
}))),
|
|
170
|
-
// update the "available" array attribute with newly registered
|
|
171
|
-
switchMap((id) => this.getState().pipe(take(1), map((state) => {
|
|
172
|
-
const available = state?.available ? state.available : [];
|
|
173
|
-
return { ...state, id, available: Array.from(new Set([...available, id])) };
|
|
174
|
-
}))))
|
|
175
|
-
.subscribe((state) => {
|
|
176
|
-
this.updateState(state);
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* retrieve locales from browser
|
|
182
|
-
*
|
|
183
|
-
* @param options
|
|
184
|
-
*/
|
|
185
|
-
getBrowserLocales() {
|
|
186
|
-
const browserLocales = navigator.languages === undefined ? [navigator.language] : navigator.languages;
|
|
187
|
-
if (!browserLocales) {
|
|
188
|
-
return undefined;
|
|
189
|
-
}
|
|
190
|
-
return browserLocales.map((locale) => locale.trim());
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* if locale is already registered filtered out.
|
|
194
|
-
*
|
|
195
|
-
* @param locales A string array contains all locale id e.g. ["el", "el-CY"]
|
|
196
|
-
*/
|
|
197
|
-
filterRegisteredLocales(locales) {
|
|
198
|
-
return locales.filter((loc) => {
|
|
199
|
-
try {
|
|
200
|
-
getLocaleId(loc);
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
203
|
-
catch (e) {
|
|
204
|
-
return true;
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/** @nocollapse */ LocaleService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocaleService, deps: [{ token: i1.StoreService }, { token: GLOBAL_CONFIG_TOKEN }, { token: LOCALE_ID }, { token: LOCALE_ID_MAPPER, optional: true }, { token: i2.I18nService, optional: true }, { token: i3.LogService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
210
|
-
/** @nocollapse */ LocaleService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocaleService, providedIn: 'root' });
|
|
211
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocaleService, decorators: [{
|
|
212
|
-
type: Injectable,
|
|
213
|
-
args: [{
|
|
214
|
-
providedIn: 'root',
|
|
215
|
-
}]
|
|
216
|
-
}], ctorParameters: function () { return [{ type: i1.StoreService }, { type: undefined, decorators: [{
|
|
217
|
-
type: Inject,
|
|
218
|
-
args: [GLOBAL_CONFIG_TOKEN]
|
|
219
|
-
}] }, { type: undefined, decorators: [{
|
|
220
|
-
type: Inject,
|
|
221
|
-
args: [LOCALE_ID]
|
|
222
|
-
}] }, { type: undefined, decorators: [{
|
|
223
|
-
type: Optional
|
|
224
|
-
}, {
|
|
225
|
-
type: Inject,
|
|
226
|
-
args: [LOCALE_ID_MAPPER]
|
|
227
|
-
}] }, { type: i2.I18nService, decorators: [{
|
|
228
|
-
type: Optional
|
|
229
|
-
}] }, { type: i3.LogService, decorators: [{
|
|
230
|
-
type: Optional
|
|
231
|
-
}] }]; } });
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2xvY2FsZS9sb2NhbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBYSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFDSCxVQUFVLEVBRVYsY0FBYyxFQUNkLDhCQUE4QixHQUtqQyxNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBZ0IsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7QUFHN0MsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLENBQWUsZ0JBQWdCLENBQUMsQ0FBQztBQUtuRixNQUFNLE9BQU8sYUFBbUQsU0FBUSxVQUEyQjtJQUsvRixZQUNjLEtBQW1CLEVBQ1UsZ0JBQThCLEVBQ3hDLFNBQWlCLEVBQ0EsWUFBMEIsRUFDcEQsSUFBaUIsRUFDakIsR0FBZTtRQUVuQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQVA1QixV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Q0FBQzs7NkhBL05RLGFBQWEsOENBT1YsbUJBQW1CLGFBQ25CLFNBQVMsYUFDRyxnQkFBZ0I7aUlBVC9CLGFBQWEsY0FGVixNQUFNOzJGQUVULGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFRUSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsU0FBUzs7MEJBQ2hCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDbkMsUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQW5ndWxhciBpcyB1c2luZyBhIGd1bHAgdGFzayB0byBnZW5lcmF0ZSB0aGUgbG9jYWxlcyB0aGF0IHdlIGR5bmFtaWNhbGx5IGltcG9ydC4gVGhpcyB0YXNrIGNhbiBiZSBmb3VuZCBoZXJlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9jbGRyLWRhdGEuanNcbiAqIFRoYXQgdGFzayBpcyB1dGlsaXppbmcgdGhlIENMRFIgbGlicmFyeSB0byBsb2FkIGFuZCBjb25zdHJ1Y3QgdGhlIGxvY2FsZSBmb3IgZWFjaCByZWdpb24uIFRoaXMgc2VydmljZSBpcyByZXNwb25zaWJsZVxuICogdG8gbG9hZCB0aG9zZSBsb2NhbGUgZHluYW1pY2FsbHkgdXBvbiByZXF1ZXN0IGFuZCB0byB1cGRhdGUgdGhlIHN0YXRlIG9mIHRoZSBlVUkgYXBwLlxuICpcbiAqIFBhcnRzIHRoYXQgYXJlIGhhbmRsZXMgdGhyb3VnaCBjb25maWd1cmF0aW9uOlxuICogIC0gdXBkYXRlIG9mIHRoZSBMT0NBTEVfSUQgdG9rZW5cbiAqICAtIGluaXRpYWwgZHluYW1pY2FsIGxvYWQgb2YgbG9jYWxlc1xuICogIC0gYmluZCB0byB0cmFuc2xhdGlvbiBzZXJ2aWNlIGZvciBsb2NhbGUgY2hhbmdlc1xuICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIExPQ0FMRV9JRCwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxlSWQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBFdWlTZXJ2aWNlLFxuICAgIEV1aVNlcnZpY2VTdGF0dXMsXG4gICAgZ2V0TG9jYWxlU3RhdGUsXG4gICAgZ2V0TG9jYWxlU2VydmljZUNvbmZpZ0Zyb21CYXNlLFxuICAgIEdsb2JhbENvbmZpZyxcbiAgICBMb2NhbGVTZXJ2aWNlQ29uZmlnLFxuICAgIExvY2FsZVN0YXRlLFxuICAgIExvZ2dlcixcbn0gZnJvbSAnQGV1aS9iYXNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN0b3JlU2VydmljZSwgVXBkYXRlTG9jYWxlU3RhdGVBY3Rpb24gfSBmcm9tICcuLi9zdG9yZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBHTE9CQUxfQ09ORklHX1RPS0VOIH0gZnJvbSAnLi4vY29uZmlnL3Rva2Vucyc7XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvciB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcblxuZXhwb3J0IHR5cGUgTG9jYWxlTWFwcGVyID0gKGxvY2FsZTogc3RyaW5nKSA9PiBhbnk7XG5leHBvcnQgY29uc3QgTE9DQUxFX0lEX01BUFBFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxMb2NhbGVNYXBwZXI+KCdsb2NhbGVJZE1hcHBlcicpO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMb2NhbGVTZXJ2aWNlPFQgZXh0ZW5kcyBMb2NhbGVTdGF0ZSA9IExvY2FsZVN0YXRlPiBleHRlbmRzIEV1aVNlcnZpY2U8VCB8IExvY2FsZVN0YXRlPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcbiAgICBwcml2YXRlIHN1Yk5vdGlmaWVyOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICAgIHByb3RlY3RlZCBjb25maWc6IExvY2FsZVNlcnZpY2VDb25maWc7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHN0b3JlOiBTdG9yZVNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoR0xPQkFMX0NPTkZJR19UT0tFTikgcHJvdGVjdGVkIGJhc2VHbG9iYWxDb25maWc6IEdsb2JhbENvbmZpZyxcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByb3RlY3RlZCBsb2NhbGVfaWQ6IHN0cmluZyxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChMT0NBTEVfSURfTUFQUEVSKSBwcml2YXRlIGxvY2FsZU1hcHBlcjogTG9jYWxlTWFwcGVyLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGxvZzogTG9nU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcih7IGlkOiBnZXRMb2NhbGVJZChsb2NhbGVfaWQpIH0pO1xuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZy5nZXRMb2dnZXIoJ2NvcmUuTG9jYWxlU2VydmljZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBnZXRMb2NhbGVTZXJ2aWNlQ29uZmlnRnJvbUJhc2UodGhpcy5iYXNlR2xvYmFsQ29uZmlnKTtcbiAgICAgICAgLy8gaW4gY2FzZSBubyBsb2NhbGVNYXBwZXIgcHJvdmlkZWQsIHNldCB0aGUgYW5ndWxhciBnZXRMb2NhbGVJZCBhcyBkZWZhdWx0XG4gICAgICAgIGlmICghdGhpcy5sb2NhbGVNYXBwZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxlTWFwcGVyID0gZ2V0TG9jYWxlSWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJOb3RpZmllci5uZXh0KHZvaWQgMCk7XG4gICAgICAgIHRoaXMuc3ViTm90aWZpZXIuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBnZXRTdGF0ZTxLID0gVD4obWFwRm4/OiAoc3RhdGU6IFQpID0+IEspOiBPYnNlcnZhYmxlPEs+O1xuICAgIGdldFN0YXRlPGEgZXh0ZW5kcyBrZXlvZiBUPihrZXk/OiBhKTogT2JzZXJ2YWJsZTxUW2FdPjtcbiAgICBnZXRTdGF0ZTxLPihrZXlPck1hcEZuPzogKChzdGF0ZTogVCkgPT4gSykgfCBzdHJpbmcpOiBPYnNlcnZhYmxlPEs+IHtcbiAgICAgICAgbGV0IHNlbGVjdG9yOiBhbnkgPSBnZXRMb2NhbGVTdGF0ZTtcbiAgICAgICAgbGV0IGRvdE5vdGF0aW9uVG9PYmplY3QgPSAob2JqLCBrZXkpID0+IGtleS5zcGxpdCgnLicpLnJlZHVjZSgoc2xpY2UsIGkpID0+IHNsaWNlW2ldLCBvYmopO1xuXG4gICAgICAgIGlmIChrZXlPck1hcEZuKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBrZXlPck1hcEZuKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKGdldExvY2FsZVN0YXRlLCBrZXlPck1hcEZuKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihnZXRMb2NhbGVTdGF0ZSwgKHN0YXRlKSA9PiBkb3ROb3RhdGlvblRvT2JqZWN0KHN0YXRlLCBrZXlPck1hcEZuKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChzZWxlY3RvcikucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnN1Yk5vdGlmaWVyKSxcbiAgICAgICAgICAgIC8vIGluIGNhc2Ugc2VydmljZSBkaWRuJ3QgaW5pdCBmYWxsYmFjayB0byBMT0NBTEVfSUQgdG9rZW4gdmFsdWVcbiAgICAgICAgICAgIG1hcCgoc3RhdGUpID0+IChzdGF0ZSA/IHN0YXRlIDogdGhpcy5zdGF0ZUluc3RhbmNlID8gdGhpcy5zdGF0ZUluc3RhbmNlIDogdGhpcy5sb2NhbGVfaWQpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGluaXQoc3RhdGU/OiBMb2NhbGVTdGF0ZSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RXVpU2VydmljZVN0YXR1cz4ge1xuICAgICAgICBzdXBlci5pbml0RXVpU2VydmljZSgpO1xuXG4gICAgICAgIC8vIGJpbmQgbGFuZ3VhZ2UgY2hhbmdlcyB0byBsb2NhbGUgY2hhbmdlc1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LmJpbmRXaXRoVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRUcmFuc2xhdGVTZXJ2aWNlTGFuZ0NoYW5nZVRvU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGR5bmFtaWNhbGx5IGxvYWQgbG9jYWxlIGJhc2VkIG9uIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlTG9jYWxlcyA9IHN0YXRlPy5hdmFpbGFibGUgfHwgdGhpcy5jb25maWc/LmF2YWlsYWJsZSB8fCB0aGlzLmdldEJyb3dzZXJMb2NhbGVzKCkgfHwgW3RoaXMuY3VycmVudExvY2FsZV07XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRMb2NhbGUoYXZhaWxhYmxlTG9jYWxlcykucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnN1Yk5vdGlmaWVyKSxcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnVwZGF0ZVN0YXRlKHN0YXRlIHx8IHsgaWQ6IHRoaXMuY3VycmVudExvY2FsZSB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkeW5hbWljYWxseSBsb2FkIGxvY2FsZSBhbmQgdXBkYXRlIHRoZSBzdGF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZVN0YXRlKHN0YXRlOiBMb2NhbGVTdGF0ZSk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmxvY2FsZU1hcHBlcihzdGF0ZS5pZCk7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBVcGRhdGVMb2NhbGVTdGF0ZUFjdGlvbih7IC4uLnN0YXRlLCBpZCB9KSk7XG4gICAgICAgICAgICAvLyB1cGRhdGUgZ2xvYmFsIFRPS0VOIElEIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5hZmZlY3RHbG9iYWxMb2NhbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZV9pZCA9IGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYExvY2FsZSBmb3IgJyR7c3RhdGUuaWR9JyBpcyBub3QgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgICBQbGVhc2UgdXNlIGFkZExvY2FsZSgnJHtzdGF0ZS5pZH0nKSBmaXJzdGA7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKG1lc3NhZ2UsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkTG9jYWxlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEV1aVNlcnZpY2VTdGF0dXM+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZExvY2FsZShpZCk7XG4gICAgfVxuXG4gICAgZ2V0IHByZXZpb3VzTG9jYWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZTdGF0ZUluc3RhbmNlPy5pZCB8fCB0aGlzLmN1cnJlbnRMb2NhbGU7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVJbnN0YW5jZT8uaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9hZCBhbmQgcmVnaXN0ZXIgbG9jYWxlIGRhdGEgZHluYW1pY2FsbHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2NhbGUgYXJyYXkgb2YgbG9jYWxlIHRvIGxvYWRcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRMb2NhbGUobG9jYWxlOiBzdHJpbmdbXSB8IHN0cmluZyk6IE9ic2VydmFibGU8RXVpU2VydmljZVN0YXR1cz4ge1xuICAgICAgICAvLyBsb2NhbGUgPSBBcnJheS5pc0FycmF5KGxvY2FsZSkgPyBsb2NhbGUgOiBbbG9jYWxlXTtcbiAgICAgICAgLy8gY29uc3QgbG9jYWxlSW1wb3J0czogT2JzZXJ2YWJsZTx7IGRhdGE6IGFueSwgbG9jYWxlSWQ6IHN0cmluZywgZXh0cmFEYXRhOiBhbnkgfT5bXVxuICAgICAgICAvLyAgICAgPSB0aGlzLmZpbHRlclJlZ2lzdGVyZWRMb2NhbGVzKGxvY2FsZSkubWFwKHRoaXMuaW1wb3J0RGF0YUFuZEV4dHJhTG9jYWxlLmJpbmQodGhpcykpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAvLyBpbiBjYXNlIGxvY2FsZUltcG9ydHMgYXJyYXkgaXMgZW1wdHkgYmVjYXVzZSBsb2NhbGUgZXhpc3RzLCBPYnNlcnZhYmxlIHN0aWxsIG5lZWRzIHRvIGNvbXBsZXRlXG4gICAgICAgIC8vIGlmIChsb2NhbGVJbXBvcnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgLy8gICAgIHJldHVybiBvZih7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy8gcmV0dXJuIGZvcmtKb2luKC4uLmxvY2FsZUltcG9ydHMpLnBpcGUoXG4gICAgICAgIC8vICAgICB0YWtlVW50aWwodGhpcy5zdWJOb3RpZmllciksXG4gICAgICAgIC8vICAgICBtYXAobG9jYWxlRGF0YSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgLy8gZmlsdGVyIG91dCBudWxsIHJlc3VsdHMgYW5kIHJlZ2lzdGVyTG9jYWxlRGF0YSBpbmNsdWRpbmcgZXh0cmFcbiAgICAgICAgLy8gICAgICAgICBsb2NhbGVEYXRhLmZpbHRlcigoeyBkYXRhIH0pID0+IGRhdGEpXG4gICAgICAgIC8vICAgICAgICAgICAgIC5mb3JFYWNoKCh7IGRhdGEsIGxvY2FsZUlkLCBleHRyYURhdGEgfSkgPT4gcmVnaXN0ZXJMb2NhbGVEYXRhKGRhdGEsIGxvY2FsZUlkLCBleHRyYURhdGEpKTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgIC8vICAgICB9KSxcbiAgICAgICAgLy8gICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLmxvZykge1xuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTG9jYWxlIGxvYWQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcik7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgIHJldHVybiBvZih7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZXJyb3IgfSk7XG4gICAgICAgIC8vICAgICB9KVxuICAgICAgICAvLyApO1xuICAgICAgICByZXR1cm4gb2YoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGxpc3RlbiBmb3IgbGFuZ3VhZ2UgY2hhbmdlcyBhbmQgZHluYW1pY2FsbHkgc2V0IGxvY2FsZSBhY2NvcmRpbmdseS4gSW4gY2FzZSBvZiBub24gcmVnaXN0ZXJlZCBsb2NhbGUgcmVnaXN0ZXIgaXRcbiAgICAgKiBkeW5hbWljYWxseS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJpbmRUcmFuc2xhdGVTZXJ2aWNlTGFuZ0NoYW5nZVRvU3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmkxOG4pIHtcbiAgICAgICAgICAgIHRoaXMuaTE4bi5vblN0YXRlQ2hhbmdlXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnN1Yk5vdGlmaWVyKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBudWxsIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZT8uYWN0aXZlTGFuZyAhPT0gbnVsbCAmJiBzdGF0ZT8uYWN0aXZlTGFuZyAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gQkVXQVJFOiBmaWx0ZXIgaXMgYmFzZWQgb24gY29udmVudGlvbiB0aGF0IGxvY2FsZSBpZCBzbGljZWQoMikgd2lsbCBtYXRjaCBhY3RpdmVMYW5nIGUuZy4gZW4tVVMgPT4gZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWxzbywgaWYgYWN0aXZlTGFuZyBpcyAnZW4nIGFuZCBsb2NhbGUgaXMgJ2VuLUdCJyBpdCB3aWxsIG5vdCB0cmlnZ2VyIGxvY2FsZSBjaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChzdGF0ZSkgPT4gc3RhdGUuYWN0aXZlTGFuZy50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLnN0YXRlSW5zdGFuY2U/LmlkLnNsaWNlKDAsIDIpLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAvLyB0byBjaGVjayBpZiByZWdpc3RyYXRpb24gb2YgbG9jYWxlIG90aGVyd2lzZSByZWdpc3RlciBpdFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgb2YodmFsdWUpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0TG9jYWxlSWQgbWF5IHRocm93IEVycm9yKGBNaXNzaW5nIGxvY2FsZSBkYXRhIGZvciB0aGUgbG9jYWxlIFwiJHtsb2NhbGV9XCIuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChpMThzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhY3RpdmVMYW5nIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaTE4c3RhdGUuYWN0aXZlTGFuZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ0hhcyBpMThuU2VydmljZSBpbml0aWFsaXplZD8gSWYgbm90IG1ha2Ugc3VyZSBpMThuU2VydmljZS5pbml0KCkuc3Vic2NyaWJlKC4uKScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih0aGlzLmxvY2FsZU1hcHBlcihpMThzdGF0ZS5hY3RpdmVMYW5nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubG9nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZExvY2FsZSh2YWx1ZT8uYWN0aXZlTGFuZykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcigoczogRXVpU2VydmljZVN0YXR1cykgPT4gcy5zdWNjZXNzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLmxvY2FsZU1hcHBlcih2YWx1ZT8uYWN0aXZlTGFuZykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU29tZXRoaW5nIHdlbnQgdGVycmlibHkgcmVhbGx5IHdyb25nIGR1cmluZyBsb2NhbGUgbG9hZGluZycsIGUuZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgXCJhdmFpbGFibGVcIiBhcnJheSBhdHRyaWJ1dGUgd2l0aCBuZXdseSByZWdpc3RlcmVkXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFN0YXRlKCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoc3RhdGU6IExvY2FsZVN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IHN0YXRlPy5hdmFpbGFibGUgPyBzdGF0ZS5hdmFpbGFibGUgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGlkLCBhdmFpbGFibGU6IEFycmF5LmZyb20obmV3IFNldChbLi4uYXZhaWxhYmxlLCBpZF0pKSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoc3RhdGU6IExvY2FsZVN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0cmlldmUgbG9jYWxlcyBmcm9tIGJyb3dzZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRCcm93c2VyTG9jYWxlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJMb2NhbGVzID0gbmF2aWdhdG9yLmxhbmd1YWdlcyA9PT0gdW5kZWZpbmVkID8gW25hdmlnYXRvci5sYW5ndWFnZV0gOiBuYXZpZ2F0b3IubGFuZ3VhZ2VzO1xuXG4gICAgICAgIGlmICghYnJvd3NlckxvY2FsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYnJvd3NlckxvY2FsZXMubWFwKChsb2NhbGUpID0+IGxvY2FsZS50cmltKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGlmIGxvY2FsZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZmlsdGVyZWQgb3V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvY2FsZXMgQSBzdHJpbmcgYXJyYXkgY29udGFpbnMgYWxsIGxvY2FsZSBpZCBlLmcuIFtcImVsXCIsIFwiZWwtQ1lcIl1cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlclJlZ2lzdGVyZWRMb2NhbGVzKGxvY2FsZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gbG9jYWxlcy5maWx0ZXIoKGxvYzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGdldExvY2FsZUlkKGxvYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIGFuIE9ic2VydmFibGUgd2hpY2ggbG9hZHMgdGhlIGxvY2FsZSBiYXNlZCBvbiBwcm92aWRlZCBJRFxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIHRoZSBsb2NhbGUgaWQgZS5nLiBlbiwgZWwtQ1lcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIC8vIHByaXZhdGUgaW1wb3J0TG9jYWxlKGlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIC8vICAgICAvLyBpbiBjYXNlIG9mIGFuIGVycm9yLCBjYXRjaCBpdCBhbmQgcmV0dXJuIG51bGxcbiAgICAvLyAgICAgcmV0dXJuIGltcG9ydChcbiAgICAvLyAgICAgICAgIC8qIHdlYnBhY2tFeGNsdWRlOiAvXFwuZFxcLnRzJC8gKi9cbiAgICAvLyAgICAgICAgIC8qIHdlYnBhY2tNb2RlOiBcImxhenktb25jZVwiICovXG4gICAgLy8gICAgICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImkxOG4tYmFzZVwiICovXG4gICAgLy8gICAgICAgICBgQC8uLi9ub2RlX21vZHVsZXMvQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvJHtpZH1gKVxuICAgIC8vICAgICAgICAgLnRoZW4obSA9PiBtLmRlZmF1bHQpXG4gICAgLy8gICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgIC8vICAgICAgICAgICAgIGlmICh0aGlzLmxvZykge1xuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTG9jYWxlIHdpdGggSUQ6IFwiJHtpZH1cIiBmYWlsZWQgdG8gbG9hZC4gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcik7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyBhIFByb21pc2Ugd2hpY2ggbG9hZHMgdGhlIGxvY2FsZSBiYXNlZCBvbiBwcm92aWRlZCBJRFxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIHRoZSBsb2NhbGUgaWQgZS5nLiBlbiwgZWwtQ1lcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIC8vIHByaXZhdGUgaW1wb3J0RXh0cmFMb2NhbGUoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gICAgIC8vIGluIGNhc2Ugb2YgYW4gZXJyb3IsIGNhdGNoIGl0IGFuZCByZXR1cm4gbnVsbFxuICAgIC8vICAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8vICAgICAgICAgLyogd2VicGFja0V4Y2x1ZGU6IC9cXC5kXFwudHMkLyAqL1xuICAgIC8vICAgICAgICAgLyogd2VicGFja01vZGU6IFwibGF6eS1vbmNlXCIgKi9cbiAgICAvLyAgICAgICAgIC8qIHdlYnBhY2tDaHVua05hbWU6IFwiaTE4bi1leHRyYVwiICovXG4gICAgLy8gICAgICAgICBgQC8uLi9ub2RlX21vZHVsZXMvQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvZXh0cmEvJHtpZH1gKVxuICAgIC8vICAgICAgICAgLnRoZW4obSA9PiBtLmRlZmF1bHQpXG4gICAgLy8gICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgIC8vICAgICAgICAgICAgIGlmICh0aGlzLmxvZykge1xuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRXh0cmEgTG9jYWxlIHdpdGggSUQ6IFwiJHtpZH1cIiBmYWlsZWQgdG8gbG9hZC4gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcik7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogSW1wb3J0cyBMb2NhbGUgYW5kIHRoZW4gRXh0cmEuIEl0IHJldHVybnMgdGhlIE9iamVjdCB3aGljaCByZWdpc3RlckxvY2FsZSguLi4pIGZ1bmN0aW9uIG5lZWRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvY2FsZUlkIFRoZSBpZCBvZiB0aGUgbG9jYWxlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICAvLyBwcml2YXRlIGltcG9ydERhdGFBbmRFeHRyYUxvY2FsZShsb2NhbGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx7IGRhdGE6IGFueSwgbG9jYWxlSWQ6IHN0cmluZywgZXh0cmFEYXRhOiBhbnkgfT4ge1xuICAgIC8vICAgICByZXR1cm4gZnJvbSh0aGlzLmltcG9ydExvY2FsZShsb2NhbGVJZCkpLnBpcGUoXG4gICAgLy8gICAgICAgICBtZXJnZU1hcCgoZGF0YSkgPT4gZnJvbSh0aGlzLmltcG9ydEV4dHJhTG9jYWxlKGxvY2FsZUlkKSkucGlwZShtYXAoKGV4dHJhRGF0YSkgPT5cbiAgICAvLyAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgeyBkYXRhLCBsb2NhbGVJZCwgZXh0cmFEYXRhIH0pKSksXG4gICAgLy8gICAgICAgICAgICAgMVxuICAgIC8vICAgICAgICAgKSk7XG4gICAgLy8gfVxufVxuIl19
|
|
1
|
+
/**
|
|
2
|
+
* Angular is using a gulp task to generate the locales that we dynamically import. This task can be found here
|
|
3
|
+
* https://github.com/angular/angular/blob/master/tools/gulp-tasks/cldr/cldr-data.js
|
|
4
|
+
* That task is utilizing the CLDR library to load and construct the locale for each region. This service is responsible
|
|
5
|
+
* to load those locale dynamically upon request and to update the state of the eUI app.
|
|
6
|
+
*
|
|
7
|
+
* Parts that are handles through configuration:
|
|
8
|
+
* - update of the LOCALE_ID token
|
|
9
|
+
* - initial dynamical load of locales
|
|
10
|
+
* - bind to translation service for locale changes
|
|
11
|
+
*/
|
|
12
|
+
import { Inject, Injectable, InjectionToken, LOCALE_ID, Optional } from '@angular/core';
|
|
13
|
+
import { getLocaleId } from '@angular/common';
|
|
14
|
+
import { EuiService, getLocaleState, getLocaleServiceConfigFromBase, } from '@eui/base';
|
|
15
|
+
import { of, Subject, throwError } from 'rxjs';
|
|
16
|
+
import { catchError, filter, map, switchMap, take, takeUntil, tap } from 'rxjs/operators';
|
|
17
|
+
import { UpdateLocaleStateAction } from '../store';
|
|
18
|
+
import { GLOBAL_CONFIG_TOKEN } from '../config/tokens';
|
|
19
|
+
import { createSelector } from '@ngrx/store';
|
|
20
|
+
import * as i0 from "@angular/core";
|
|
21
|
+
import * as i1 from "../store";
|
|
22
|
+
import * as i2 from "../i18n";
|
|
23
|
+
import * as i3 from "../log";
|
|
24
|
+
export const LOCALE_ID_MAPPER = new InjectionToken('localeIdMapper');
|
|
25
|
+
export class LocaleService extends EuiService {
|
|
26
|
+
constructor(store, baseGlobalConfig, locale_id, localeMapper, i18n, log) {
|
|
27
|
+
super({ id: getLocaleId(locale_id) });
|
|
28
|
+
this.store = store;
|
|
29
|
+
this.baseGlobalConfig = baseGlobalConfig;
|
|
30
|
+
this.locale_id = locale_id;
|
|
31
|
+
this.localeMapper = localeMapper;
|
|
32
|
+
this.i18n = i18n;
|
|
33
|
+
this.log = log;
|
|
34
|
+
this.subNotifier = new Subject();
|
|
35
|
+
if (log) {
|
|
36
|
+
this.logger = log.getLogger('core.LocaleService');
|
|
37
|
+
}
|
|
38
|
+
this.config = getLocaleServiceConfigFromBase(this.baseGlobalConfig);
|
|
39
|
+
// in case no localeMapper provided, set the angular getLocaleId as default
|
|
40
|
+
if (!this.localeMapper) {
|
|
41
|
+
this.localeMapper = getLocaleId;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
ngOnDestroy() {
|
|
45
|
+
this.subNotifier.next(void 0);
|
|
46
|
+
this.subNotifier.complete();
|
|
47
|
+
}
|
|
48
|
+
getState(keyOrMapFn) {
|
|
49
|
+
let selector = getLocaleState;
|
|
50
|
+
let dotNotationToObject = (obj, key) => key.split('.').reduce((slice, i) => slice[i], obj);
|
|
51
|
+
if (keyOrMapFn) {
|
|
52
|
+
switch (typeof keyOrMapFn) {
|
|
53
|
+
case 'function':
|
|
54
|
+
selector = createSelector(getLocaleState, keyOrMapFn);
|
|
55
|
+
break;
|
|
56
|
+
case 'string':
|
|
57
|
+
selector = createSelector(getLocaleState, (state) => dotNotationToObject(state, keyOrMapFn));
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return this.store.select(selector).pipe(takeUntil(this.subNotifier),
|
|
62
|
+
// in case service didn't init fallback to LOCALE_ID token value
|
|
63
|
+
map((state) => (state ? state : this.stateInstance ? this.stateInstance : this.locale_id)));
|
|
64
|
+
}
|
|
65
|
+
init(state) {
|
|
66
|
+
super.initEuiService();
|
|
67
|
+
// bind language changes to locale changes
|
|
68
|
+
if (this.config?.bindWithTranslate) {
|
|
69
|
+
this.bindTranslateServiceLangChangeToState();
|
|
70
|
+
}
|
|
71
|
+
// dynamically load locale based on provided configuration
|
|
72
|
+
const availableLocales = state?.available || this.config?.available || this.getBrowserLocales() || [this.currentLocale];
|
|
73
|
+
return this.loadLocale(availableLocales).pipe(takeUntil(this.subNotifier), tap(() => this.updateState(state || { id: this.currentLocale })));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* dynamically load locale and update the state
|
|
77
|
+
*/
|
|
78
|
+
updateState(state) {
|
|
79
|
+
try {
|
|
80
|
+
const id = this.localeMapper(state.id);
|
|
81
|
+
this.store.dispatch(new UpdateLocaleStateAction({ ...state, id }));
|
|
82
|
+
// update global TOKEN ID based on configuration
|
|
83
|
+
if (this.config.affectGlobalLocale) {
|
|
84
|
+
this.locale_id = id;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
const message = `Locale for '${state.id}' is not available.
|
|
89
|
+
Please use addLocale('${state.id}') first`;
|
|
90
|
+
if (this.log) {
|
|
91
|
+
this.logger.info(message, e);
|
|
92
|
+
}
|
|
93
|
+
throw new Error(message);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
addLocale(id) {
|
|
97
|
+
return this.loadLocale(id);
|
|
98
|
+
}
|
|
99
|
+
get previousLocale() {
|
|
100
|
+
return this.prevStateInstance?.id || this.currentLocale;
|
|
101
|
+
}
|
|
102
|
+
get currentLocale() {
|
|
103
|
+
return this.stateInstance?.id;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* load and register locale data dynamically
|
|
107
|
+
*
|
|
108
|
+
* @param locale array of locale to load
|
|
109
|
+
*/
|
|
110
|
+
loadLocale(locale) {
|
|
111
|
+
// locale = Array.isArray(locale) ? locale : [locale];
|
|
112
|
+
// const localeImports: Observable<{ data: any, localeId: string, extraData: any }>[]
|
|
113
|
+
// = this.filterRegisteredLocales(locale).map(this.importDataAndExtraLocale.bind(this));
|
|
114
|
+
//
|
|
115
|
+
// // in case localeImports array is empty because locale exists, Observable still needs to complete
|
|
116
|
+
// if (localeImports.length < 1) {
|
|
117
|
+
// return of({ success: true });
|
|
118
|
+
// }
|
|
119
|
+
//
|
|
120
|
+
// return forkJoin(...localeImports).pipe(
|
|
121
|
+
// takeUntil(this.subNotifier),
|
|
122
|
+
// map(localeData => {
|
|
123
|
+
// // filter out null results and registerLocaleData including extra
|
|
124
|
+
// localeData.filter(({ data }) => data)
|
|
125
|
+
// .forEach(({ data, localeId, extraData }) => registerLocaleData(data, localeId, extraData));
|
|
126
|
+
// return { success: true };
|
|
127
|
+
// }),
|
|
128
|
+
// catchError(error => {
|
|
129
|
+
// if (this.log) {
|
|
130
|
+
// this.logger.debug(`Locale load error: ${error.message}`, error);
|
|
131
|
+
// }
|
|
132
|
+
// return of({ success: false, error: error });
|
|
133
|
+
// })
|
|
134
|
+
// );
|
|
135
|
+
return of({ success: true });
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* listen for language changes and dynamically set locale accordingly. In case of non registered locale register it
|
|
139
|
+
* dynamically.
|
|
140
|
+
*/
|
|
141
|
+
bindTranslateServiceLangChangeToState() {
|
|
142
|
+
if (this.i18n) {
|
|
143
|
+
this.i18n.onStateChange
|
|
144
|
+
.pipe(takeUntil(this.subNotifier),
|
|
145
|
+
// filter out null values
|
|
146
|
+
filter((state) => state?.activeLang !== null && state?.activeLang !== undefined),
|
|
147
|
+
// BEWARE: filter is based on convention that locale id sliced(2) will match activeLang e.g. en-US => en
|
|
148
|
+
// Also, if activeLang is 'en' and locale is 'en-GB' it will not trigger locale change
|
|
149
|
+
filter((state) => state.activeLang.toLowerCase() !== this.stateInstance?.id.slice(0, 2).toLowerCase()),
|
|
150
|
+
// to check if registration of locale otherwise register it
|
|
151
|
+
switchMap((value) => of(value).pipe(
|
|
152
|
+
// getLocaleId may throw Error(`Missing locale data for the locale "${locale}".`);
|
|
153
|
+
switchMap((i18state) => {
|
|
154
|
+
// check if activeLang is null or undefined
|
|
155
|
+
if (!i18state.activeLang) {
|
|
156
|
+
return throwError('Has i18nService initialized? If not make sure i18nService.init().subscribe(..)');
|
|
157
|
+
}
|
|
158
|
+
return of(this.localeMapper(i18state.activeLang));
|
|
159
|
+
}), catchError((error) => {
|
|
160
|
+
if (this.log) {
|
|
161
|
+
this.logger.debug(error);
|
|
162
|
+
}
|
|
163
|
+
return this.loadLocale(value?.activeLang).pipe(filter((s) => s.success), map(() => this.localeMapper(value?.activeLang)), catchError((e) => {
|
|
164
|
+
if (this.log) {
|
|
165
|
+
this.logger.debug('Something went terribly really wrong during locale loading', e.err.message);
|
|
166
|
+
}
|
|
167
|
+
return of(e);
|
|
168
|
+
}));
|
|
169
|
+
}))),
|
|
170
|
+
// update the "available" array attribute with newly registered
|
|
171
|
+
switchMap((id) => this.getState().pipe(take(1), map((state) => {
|
|
172
|
+
const available = state?.available ? state.available : [];
|
|
173
|
+
return { ...state, id, available: Array.from(new Set([...available, id])) };
|
|
174
|
+
}))))
|
|
175
|
+
.subscribe((state) => {
|
|
176
|
+
this.updateState(state);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* retrieve locales from browser
|
|
182
|
+
*
|
|
183
|
+
* @param options
|
|
184
|
+
*/
|
|
185
|
+
getBrowserLocales() {
|
|
186
|
+
const browserLocales = navigator.languages === undefined ? [navigator.language] : navigator.languages;
|
|
187
|
+
if (!browserLocales) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
return browserLocales.map((locale) => locale.trim());
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* if locale is already registered filtered out.
|
|
194
|
+
*
|
|
195
|
+
* @param locales A string array contains all locale id e.g. ["el", "el-CY"]
|
|
196
|
+
*/
|
|
197
|
+
filterRegisteredLocales(locales) {
|
|
198
|
+
return locales.filter((loc) => {
|
|
199
|
+
try {
|
|
200
|
+
getLocaleId(loc);
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** @nocollapse */ LocaleService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocaleService, deps: [{ token: i1.StoreService }, { token: GLOBAL_CONFIG_TOKEN }, { token: LOCALE_ID }, { token: LOCALE_ID_MAPPER, optional: true }, { token: i2.I18nService, optional: true }, { token: i3.LogService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
210
|
+
/** @nocollapse */ LocaleService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocaleService, providedIn: 'root' });
|
|
211
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocaleService, decorators: [{
|
|
212
|
+
type: Injectable,
|
|
213
|
+
args: [{
|
|
214
|
+
providedIn: 'root',
|
|
215
|
+
}]
|
|
216
|
+
}], ctorParameters: function () { return [{ type: i1.StoreService }, { type: undefined, decorators: [{
|
|
217
|
+
type: Inject,
|
|
218
|
+
args: [GLOBAL_CONFIG_TOKEN]
|
|
219
|
+
}] }, { type: undefined, decorators: [{
|
|
220
|
+
type: Inject,
|
|
221
|
+
args: [LOCALE_ID]
|
|
222
|
+
}] }, { type: undefined, decorators: [{
|
|
223
|
+
type: Optional
|
|
224
|
+
}, {
|
|
225
|
+
type: Inject,
|
|
226
|
+
args: [LOCALE_ID_MAPPER]
|
|
227
|
+
}] }, { type: i2.I18nService, decorators: [{
|
|
228
|
+
type: Optional
|
|
229
|
+
}] }, { type: i3.LogService, decorators: [{
|
|
230
|
+
type: Optional
|
|
231
|
+
}] }]; } });
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2xvY2FsZS9sb2NhbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBYSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFDSCxVQUFVLEVBRVYsY0FBYyxFQUNkLDhCQUE4QixHQUtqQyxNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBZ0IsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7QUFHN0MsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLENBQWUsZ0JBQWdCLENBQUMsQ0FBQztBQUtuRixNQUFNLE9BQU8sYUFBbUQsU0FBUSxVQUEyQjtJQUsvRixZQUNjLEtBQW1CLEVBQ1UsZ0JBQThCLEVBQ3hDLFNBQWlCLEVBQ0EsWUFBMEIsRUFDcEQsSUFBaUIsRUFDakIsR0FBZTtRQUVuQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQVA1QixV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Q0FBQzs7NkhBL05RLGFBQWEsOENBT1YsbUJBQW1CLGFBQ25CLFNBQVMsYUFDRyxnQkFBZ0I7aUlBVC9CLGFBQWEsY0FGVixNQUFNOzJGQUVULGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFRUSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsU0FBUzs7MEJBQ2hCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDbkMsUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBbmd1bGFyIGlzIHVzaW5nIGEgZ3VscCB0YXNrIHRvIGdlbmVyYXRlIHRoZSBsb2NhbGVzIHRoYXQgd2UgZHluYW1pY2FsbHkgaW1wb3J0LiBUaGlzIHRhc2sgY2FuIGJlIGZvdW5kIGhlcmVcclxuICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci90b29scy9ndWxwLXRhc2tzL2NsZHIvY2xkci1kYXRhLmpzXHJcbiAqIFRoYXQgdGFzayBpcyB1dGlsaXppbmcgdGhlIENMRFIgbGlicmFyeSB0byBsb2FkIGFuZCBjb25zdHJ1Y3QgdGhlIGxvY2FsZSBmb3IgZWFjaCByZWdpb24uIFRoaXMgc2VydmljZSBpcyByZXNwb25zaWJsZVxyXG4gKiB0byBsb2FkIHRob3NlIGxvY2FsZSBkeW5hbWljYWxseSB1cG9uIHJlcXVlc3QgYW5kIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgdGhlIGVVSSBhcHAuXHJcbiAqXHJcbiAqIFBhcnRzIHRoYXQgYXJlIGhhbmRsZXMgdGhyb3VnaCBjb25maWd1cmF0aW9uOlxyXG4gKiAgLSB1cGRhdGUgb2YgdGhlIExPQ0FMRV9JRCB0b2tlblxyXG4gKiAgLSBpbml0aWFsIGR5bmFtaWNhbCBsb2FkIG9mIGxvY2FsZXNcclxuICogIC0gYmluZCB0byB0cmFuc2xhdGlvbiBzZXJ2aWNlIGZvciBsb2NhbGUgY2hhbmdlc1xyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIExPQ0FMRV9JRCwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBnZXRMb2NhbGVJZCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBFdWlTZXJ2aWNlLFxyXG4gICAgRXVpU2VydmljZVN0YXR1cyxcclxuICAgIGdldExvY2FsZVN0YXRlLFxyXG4gICAgZ2V0TG9jYWxlU2VydmljZUNvbmZpZ0Zyb21CYXNlLFxyXG4gICAgR2xvYmFsQ29uZmlnLFxyXG4gICAgTG9jYWxlU2VydmljZUNvbmZpZyxcclxuICAgIExvY2FsZVN0YXRlLFxyXG4gICAgTG9nZ2VyLFxyXG59IGZyb20gJ0BldWkvYmFzZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UsIFVwZGF0ZUxvY2FsZVN0YXRlQWN0aW9uIH0gZnJvbSAnLi4vc3RvcmUnO1xyXG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vbG9nJztcclxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9pMThuJztcclxuaW1wb3J0IHsgR0xPQkFMX0NPTkZJR19UT0tFTiB9IGZyb20gJy4uL2NvbmZpZy90b2tlbnMnO1xyXG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvciB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcclxuXHJcbmV4cG9ydCB0eXBlIExvY2FsZU1hcHBlciA9IChsb2NhbGU6IHN0cmluZykgPT4gYW55O1xyXG5leHBvcnQgY29uc3QgTE9DQUxFX0lEX01BUFBFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxMb2NhbGVNYXBwZXI+KCdsb2NhbGVJZE1hcHBlcicpO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9jYWxlU2VydmljZTxUIGV4dGVuZHMgTG9jYWxlU3RhdGUgPSBMb2NhbGVTdGF0ZT4gZXh0ZW5kcyBFdWlTZXJ2aWNlPFQgfCBMb2NhbGVTdGF0ZT4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcclxuICAgIHByaXZhdGUgc3ViTm90aWZpZXI6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBMb2NhbGVTZXJ2aWNlQ29uZmlnO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByb3RlY3RlZCBzdG9yZTogU3RvcmVTZXJ2aWNlLFxyXG4gICAgICAgIEBJbmplY3QoR0xPQkFMX0NPTkZJR19UT0tFTikgcHJvdGVjdGVkIGJhc2VHbG9iYWxDb25maWc6IEdsb2JhbENvbmZpZyxcclxuICAgICAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJvdGVjdGVkIGxvY2FsZV9pZDogc3RyaW5nLFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTE9DQUxFX0lEX01BUFBFUikgcHJpdmF0ZSBsb2NhbGVNYXBwZXI6IExvY2FsZU1hcHBlcixcclxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlLFxyXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbG9nOiBMb2dTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcih7IGlkOiBnZXRMb2NhbGVJZChsb2NhbGVfaWQpIH0pO1xyXG4gICAgICAgIGlmIChsb2cpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2cuZ2V0TG9nZ2VyKCdjb3JlLkxvY2FsZVNlcnZpY2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlnID0gZ2V0TG9jYWxlU2VydmljZUNvbmZpZ0Zyb21CYXNlKHRoaXMuYmFzZUdsb2JhbENvbmZpZyk7XHJcbiAgICAgICAgLy8gaW4gY2FzZSBubyBsb2NhbGVNYXBwZXIgcHJvdmlkZWQsIHNldCB0aGUgYW5ndWxhciBnZXRMb2NhbGVJZCBhcyBkZWZhdWx0XHJcbiAgICAgICAgaWYgKCF0aGlzLmxvY2FsZU1hcHBlcikge1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsZU1hcHBlciA9IGdldExvY2FsZUlkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN1Yk5vdGlmaWVyLm5leHQodm9pZCAwKTtcclxuICAgICAgICB0aGlzLnN1Yk5vdGlmaWVyLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdGU8SyA9IFQ+KG1hcEZuPzogKHN0YXRlOiBUKSA9PiBLKTogT2JzZXJ2YWJsZTxLPjtcclxuICAgIGdldFN0YXRlPGEgZXh0ZW5kcyBrZXlvZiBUPihrZXk/OiBhKTogT2JzZXJ2YWJsZTxUW2FdPjtcclxuICAgIGdldFN0YXRlPEs+KGtleU9yTWFwRm4/OiAoKHN0YXRlOiBUKSA9PiBLKSB8IHN0cmluZyk6IE9ic2VydmFibGU8Sz4ge1xyXG4gICAgICAgIGxldCBzZWxlY3RvcjogYW55ID0gZ2V0TG9jYWxlU3RhdGU7XHJcbiAgICAgICAgbGV0IGRvdE5vdGF0aW9uVG9PYmplY3QgPSAob2JqLCBrZXkpID0+IGtleS5zcGxpdCgnLicpLnJlZHVjZSgoc2xpY2UsIGkpID0+IHNsaWNlW2ldLCBvYmopO1xyXG5cclxuICAgICAgICBpZiAoa2V5T3JNYXBGbikge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBrZXlPck1hcEZuKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihnZXRMb2NhbGVTdGF0ZSwga2V5T3JNYXBGbik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoZ2V0TG9jYWxlU3RhdGUsIChzdGF0ZSkgPT4gZG90Tm90YXRpb25Ub09iamVjdChzdGF0ZSwga2V5T3JNYXBGbikpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChzZWxlY3RvcikucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuc3ViTm90aWZpZXIpLFxyXG4gICAgICAgICAgICAvLyBpbiBjYXNlIHNlcnZpY2UgZGlkbid0IGluaXQgZmFsbGJhY2sgdG8gTE9DQUxFX0lEIHRva2VuIHZhbHVlXHJcbiAgICAgICAgICAgIG1hcCgoc3RhdGUpID0+IChzdGF0ZSA/IHN0YXRlIDogdGhpcy5zdGF0ZUluc3RhbmNlID8gdGhpcy5zdGF0ZUluc3RhbmNlIDogdGhpcy5sb2NhbGVfaWQpKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChzdGF0ZT86IExvY2FsZVN0YXRlIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxFdWlTZXJ2aWNlU3RhdHVzPiB7XHJcbiAgICAgICAgc3VwZXIuaW5pdEV1aVNlcnZpY2UoKTtcclxuXHJcbiAgICAgICAgLy8gYmluZCBsYW5ndWFnZSBjaGFuZ2VzIHRvIGxvY2FsZSBjaGFuZ2VzXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnPy5iaW5kV2l0aFRyYW5zbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmJpbmRUcmFuc2xhdGVTZXJ2aWNlTGFuZ0NoYW5nZVRvU3RhdGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGR5bmFtaWNhbGx5IGxvYWQgbG9jYWxlIGJhc2VkIG9uIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICBjb25zdCBhdmFpbGFibGVMb2NhbGVzID0gc3RhdGU/LmF2YWlsYWJsZSB8fCB0aGlzLmNvbmZpZz8uYXZhaWxhYmxlIHx8IHRoaXMuZ2V0QnJvd3NlckxvY2FsZXMoKSB8fCBbdGhpcy5jdXJyZW50TG9jYWxlXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkTG9jYWxlKGF2YWlsYWJsZUxvY2FsZXMpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnN1Yk5vdGlmaWVyKSxcclxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMudXBkYXRlU3RhdGUoc3RhdGUgfHwgeyBpZDogdGhpcy5jdXJyZW50TG9jYWxlIH0pKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkeW5hbWljYWxseSBsb2FkIGxvY2FsZSBhbmQgdXBkYXRlIHRoZSBzdGF0ZVxyXG4gICAgICovXHJcbiAgICB1cGRhdGVTdGF0ZShzdGF0ZTogTG9jYWxlU3RhdGUpOiB2b2lkIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMubG9jYWxlTWFwcGVyKHN0YXRlLmlkKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgVXBkYXRlTG9jYWxlU3RhdGVBY3Rpb24oeyAuLi5zdGF0ZSwgaWQgfSkpO1xyXG4gICAgICAgICAgICAvLyB1cGRhdGUgZ2xvYmFsIFRPS0VOIElEIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmFmZmVjdEdsb2JhbExvY2FsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGVfaWQgPSBpZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBMb2NhbGUgZm9yICcke3N0YXRlLmlkfScgaXMgbm90IGF2YWlsYWJsZS5cclxuICAgICAgICAgICAgICAgICBQbGVhc2UgdXNlIGFkZExvY2FsZSgnJHtzdGF0ZS5pZH0nKSBmaXJzdGA7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhtZXNzYWdlLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZExvY2FsZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxFdWlTZXJ2aWNlU3RhdHVzPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZExvY2FsZShpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByZXZpb3VzTG9jYWxlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldlN0YXRlSW5zdGFuY2U/LmlkIHx8IHRoaXMuY3VycmVudExvY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudExvY2FsZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlSW5zdGFuY2U/LmlkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogbG9hZCBhbmQgcmVnaXN0ZXIgbG9jYWxlIGRhdGEgZHluYW1pY2FsbHlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxlIGFycmF5IG9mIGxvY2FsZSB0byBsb2FkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9hZExvY2FsZShsb2NhbGU6IHN0cmluZ1tdIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxFdWlTZXJ2aWNlU3RhdHVzPiB7XHJcbiAgICAgICAgLy8gbG9jYWxlID0gQXJyYXkuaXNBcnJheShsb2NhbGUpID8gbG9jYWxlIDogW2xvY2FsZV07XHJcbiAgICAgICAgLy8gY29uc3QgbG9jYWxlSW1wb3J0czogT2JzZXJ2YWJsZTx7IGRhdGE6IGFueSwgbG9jYWxlSWQ6IHN0cmluZywgZXh0cmFEYXRhOiBhbnkgfT5bXVxyXG4gICAgICAgIC8vICAgICA9IHRoaXMuZmlsdGVyUmVnaXN0ZXJlZExvY2FsZXMobG9jYWxlKS5tYXAodGhpcy5pbXBvcnREYXRhQW5kRXh0cmFMb2NhbGUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyAvLyBpbiBjYXNlIGxvY2FsZUltcG9ydHMgYXJyYXkgaXMgZW1wdHkgYmVjYXVzZSBsb2NhbGUgZXhpc3RzLCBPYnNlcnZhYmxlIHN0aWxsIG5lZWRzIHRvIGNvbXBsZXRlXHJcbiAgICAgICAgLy8gaWYgKGxvY2FsZUltcG9ydHMubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgIC8vICAgICByZXR1cm4gb2YoeyBzdWNjZXNzOiB0cnVlIH0pO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIHJldHVybiBmb3JrSm9pbiguLi5sb2NhbGVJbXBvcnRzKS5waXBlKFxyXG4gICAgICAgIC8vICAgICB0YWtlVW50aWwodGhpcy5zdWJOb3RpZmllciksXHJcbiAgICAgICAgLy8gICAgIG1hcChsb2NhbGVEYXRhID0+IHtcclxuICAgICAgICAvLyAgICAgICAgIC8vIGZpbHRlciBvdXQgbnVsbCByZXN1bHRzIGFuZCByZWdpc3RlckxvY2FsZURhdGEgaW5jbHVkaW5nIGV4dHJhXHJcbiAgICAgICAgLy8gICAgICAgICBsb2NhbGVEYXRhLmZpbHRlcigoeyBkYXRhIH0pID0+IGRhdGEpXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgLmZvckVhY2goKHsgZGF0YSwgbG9jYWxlSWQsIGV4dHJhRGF0YSB9KSA9PiByZWdpc3RlckxvY2FsZURhdGEoZGF0YSwgbG9jYWxlSWQsIGV4dHJhRGF0YSkpO1xyXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xyXG4gICAgICAgIC8vICAgICB9KSxcclxuICAgICAgICAvLyAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5sb2cpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTG9jYWxlIGxvYWQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gb2YoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVycm9yIH0pO1xyXG4gICAgICAgIC8vICAgICB9KVxyXG4gICAgICAgIC8vICk7XHJcbiAgICAgICAgcmV0dXJuIG9mKHsgc3VjY2VzczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGxpc3RlbiBmb3IgbGFuZ3VhZ2UgY2hhbmdlcyBhbmQgZHluYW1pY2FsbHkgc2V0IGxvY2FsZSBhY2NvcmRpbmdseS4gSW4gY2FzZSBvZiBub24gcmVnaXN0ZXJlZCBsb2NhbGUgcmVnaXN0ZXIgaXRcclxuICAgICAqIGR5bmFtaWNhbGx5LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJpbmRUcmFuc2xhdGVTZXJ2aWNlTGFuZ0NoYW5nZVRvU3RhdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaTE4bikge1xyXG4gICAgICAgICAgICB0aGlzLmkxOG4ub25TdGF0ZUNoYW5nZVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuc3ViTm90aWZpZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgbnVsbCB2YWx1ZXNcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZT8uYWN0aXZlTGFuZyAhPT0gbnVsbCAmJiBzdGF0ZT8uYWN0aXZlTGFuZyAhPT0gdW5kZWZpbmVkKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyBCRVdBUkU6IGZpbHRlciBpcyBiYXNlZCBvbiBjb252ZW50aW9uIHRoYXQgbG9jYWxlIGlkIHNsaWNlZCgyKSB3aWxsIG1hdGNoIGFjdGl2ZUxhbmcgZS5nLiBlbi1VUyA9PiBlblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsc28sIGlmIGFjdGl2ZUxhbmcgaXMgJ2VuJyBhbmQgbG9jYWxlIGlzICdlbi1HQicgaXQgd2lsbCBub3QgdHJpZ2dlciBsb2NhbGUgY2hhbmdlXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChzdGF0ZSkgPT4gc3RhdGUuYWN0aXZlTGFuZy50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLnN0YXRlSW5zdGFuY2U/LmlkLnNsaWNlKDAsIDIpLnRvTG93ZXJDYXNlKCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGNoZWNrIGlmIHJlZ2lzdHJhdGlvbiBvZiBsb2NhbGUgb3RoZXJ3aXNlIHJlZ2lzdGVyIGl0XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh2YWx1ZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgb2YodmFsdWUpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRMb2NhbGVJZCBtYXkgdGhyb3cgRXJyb3IoYE1pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIHRoZSBsb2NhbGUgXCIke2xvY2FsZX1cIi5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoaTE4c3RhdGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhY3RpdmVMYW5nIGlzIG51bGwgb3IgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpMThzdGF0ZS5hY3RpdmVMYW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdIYXMgaTE4blNlcnZpY2UgaW5pdGlhbGl6ZWQ/IElmIG5vdCBtYWtlIHN1cmUgaTE4blNlcnZpY2UuaW5pdCgpLnN1YnNjcmliZSguLiknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMubG9jYWxlTWFwcGVyKGkxOHN0YXRlLmFjdGl2ZUxhbmcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTG9jYWxlKHZhbHVlPy5hY3RpdmVMYW5nKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHM6IEV1aVNlcnZpY2VTdGF0dXMpID0+IHMuc3VjY2VzcyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLmxvY2FsZU1hcHBlcih2YWx1ZT8uYWN0aXZlTGFuZykpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU29tZXRoaW5nIHdlbnQgdGVycmlibHkgcmVhbGx5IHdyb25nIGR1cmluZyBsb2NhbGUgbG9hZGluZycsIGUuZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIFwiYXZhaWxhYmxlXCIgYXJyYXkgYXR0cmlidXRlIHdpdGggbmV3bHkgcmVnaXN0ZXJlZFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoaWQpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGUoKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoc3RhdGU6IExvY2FsZVN0YXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gc3RhdGU/LmF2YWlsYWJsZSA/IHN0YXRlLmF2YWlsYWJsZSA6IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBpZCwgYXZhaWxhYmxlOiBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmF2YWlsYWJsZSwgaWRdKSkgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzdGF0ZTogTG9jYWxlU3RhdGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKHN0YXRlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJldHJpZXZlIGxvY2FsZXMgZnJvbSBicm93c2VyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRCcm93c2VyTG9jYWxlcygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgY29uc3QgYnJvd3NlckxvY2FsZXMgPSBuYXZpZ2F0b3IubGFuZ3VhZ2VzID09PSB1bmRlZmluZWQgPyBbbmF2aWdhdG9yLmxhbmd1YWdlXSA6IG5hdmlnYXRvci5sYW5ndWFnZXM7XHJcblxyXG4gICAgICAgIGlmICghYnJvd3NlckxvY2FsZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBicm93c2VyTG9jYWxlcy5tYXAoKGxvY2FsZSkgPT4gbG9jYWxlLnRyaW0oKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBpZiBsb2NhbGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZpbHRlcmVkIG91dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxlcyBBIHN0cmluZyBhcnJheSBjb250YWlucyBhbGwgbG9jYWxlIGlkIGUuZy4gW1wiZWxcIiwgXCJlbC1DWVwiXVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpbHRlclJlZ2lzdGVyZWRMb2NhbGVzKGxvY2FsZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBsb2NhbGVzLmZpbHRlcigobG9jOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGdldExvY2FsZUlkKGxvYyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIGFuIE9ic2VydmFibGUgd2hpY2ggbG9hZHMgdGhlIGxvY2FsZSBiYXNlZCBvbiBwcm92aWRlZCBJRFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpZCB0aGUgbG9jYWxlIGlkIGUuZy4gZW4sIGVsLUNZXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICAvLyBwcml2YXRlIGltcG9ydExvY2FsZShpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vICAgICAvLyBpbiBjYXNlIG9mIGFuIGVycm9yLCBjYXRjaCBpdCBhbmQgcmV0dXJuIG51bGxcclxuICAgIC8vICAgICByZXR1cm4gaW1wb3J0KFxyXG4gICAgLy8gICAgICAgICAvKiB3ZWJwYWNrRXhjbHVkZTogL1xcLmRcXC50cyQvICovXHJcbiAgICAvLyAgICAgICAgIC8qIHdlYnBhY2tNb2RlOiBcImxhenktb25jZVwiICovXHJcbiAgICAvLyAgICAgICAgIC8qIHdlYnBhY2tDaHVua05hbWU6IFwiaTE4bi1iYXNlXCIgKi9cclxuICAgIC8vICAgICAgICAgYEAvLi4vbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzLyR7aWR9YClcclxuICAgIC8vICAgICAgICAgLnRoZW4obSA9PiBtLmRlZmF1bHQpXHJcbiAgICAvLyAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAodGhpcy5sb2cpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTG9jYWxlIHdpdGggSUQ6IFwiJHtpZH1cIiBmYWlsZWQgdG8gbG9hZC4gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcik7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIGEgUHJvbWlzZSB3aGljaCBsb2FkcyB0aGUgbG9jYWxlIGJhc2VkIG9uIHByb3ZpZGVkIElEXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlkIHRoZSBsb2NhbGUgaWQgZS5nLiBlbiwgZWwtQ1lcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIC8vIHByaXZhdGUgaW1wb3J0RXh0cmFMb2NhbGUoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAvLyAgICAgLy8gaW4gY2FzZSBvZiBhbiBlcnJvciwgY2F0Y2ggaXQgYW5kIHJldHVybiBudWxsXHJcbiAgICAvLyAgICAgcmV0dXJuIGltcG9ydChcclxuICAgIC8vICAgICAgICAgLyogd2VicGFja0V4Y2x1ZGU6IC9cXC5kXFwudHMkLyAqL1xyXG4gICAgLy8gICAgICAgICAvKiB3ZWJwYWNrTW9kZTogXCJsYXp5LW9uY2VcIiAqL1xyXG4gICAgLy8gICAgICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImkxOG4tZXh0cmFcIiAqL1xyXG4gICAgLy8gICAgICAgICBgQC8uLi9ub2RlX21vZHVsZXMvQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvZXh0cmEvJHtpZH1gKVxyXG4gICAgLy8gICAgICAgICAudGhlbihtID0+IG0uZGVmYXVsdClcclxuICAgIC8vICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICh0aGlzLmxvZykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBFeHRyYSBMb2NhbGUgd2l0aCBJRDogXCIke2lkfVwiIGZhaWxlZCB0byBsb2FkLiBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgLy8gICAgICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9ydHMgTG9jYWxlIGFuZCB0aGVuIEV4dHJhLiBJdCByZXR1cm5zIHRoZSBPYmplY3Qgd2hpY2ggcmVnaXN0ZXJMb2NhbGUoLi4uKSBmdW5jdGlvbiBuZWVkcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxlSWQgVGhlIGlkIG9mIHRoZSBsb2NhbGVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIC8vIHByaXZhdGUgaW1wb3J0RGF0YUFuZEV4dHJhTG9jYWxlKGxvY2FsZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHsgZGF0YTogYW55LCBsb2NhbGVJZDogc3RyaW5nLCBleHRyYURhdGE6IGFueSB9PiB7XHJcbiAgICAvLyAgICAgcmV0dXJuIGZyb20odGhpcy5pbXBvcnRMb2NhbGUobG9jYWxlSWQpKS5waXBlKFxyXG4gICAgLy8gICAgICAgICBtZXJnZU1hcCgoZGF0YSkgPT4gZnJvbSh0aGlzLmltcG9ydEV4dHJhTG9jYWxlKGxvY2FsZUlkKSkucGlwZShtYXAoKGV4dHJhRGF0YSkgPT5cclxuICAgIC8vICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCB7IGRhdGEsIGxvY2FsZUlkLCBleHRyYURhdGEgfSkpKSxcclxuICAgIC8vICAgICAgICAgICAgIDFcclxuICAgIC8vICAgICAgICAgKSk7XHJcbiAgICAvLyB9XHJcbn1cclxuIl19
|