@c8y/ngx-components 1018.0.176 → 1018.0.183

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 (38) hide show
  1. package/core/bootstrap/cookie-banner/cookie-banner.service.d.ts +1 -1
  2. package/core/common/ApplicationOptions.d.ts +2 -0
  3. package/core/date-time-picker/close-date-picker.directive.d.ts +14 -0
  4. package/core/date-time-picker/date-time-picker.component.d.ts +7 -2
  5. package/core/date-time-picker/date-time-picker.module.d.ts +8 -7
  6. package/core/product-experience/gainsight.service.d.ts +86 -28
  7. package/core/product-experience/index.d.ts +1 -0
  8. package/core/product-experience/product-experience.module.d.ts +18 -5
  9. package/core/product-experience/user-engagements.service.d.ts +109 -0
  10. package/core/user/user-edit-modal.component.d.ts +33 -6
  11. package/core/user/user-edit.component.d.ts +6 -11
  12. package/esm2020/context-dashboard/widget-config.component.mjs +3 -3
  13. package/esm2020/core/bootstrap/cookie-banner/cookie-banner.service.mjs +2 -2
  14. package/esm2020/core/common/ApplicationOptions.mjs +1 -1
  15. package/esm2020/core/date-time-picker/close-date-picker.directive.mjs +36 -0
  16. package/esm2020/core/date-time-picker/date-time-picker.component.mjs +28 -8
  17. package/esm2020/core/date-time-picker/date-time-picker.module.mjs +4 -3
  18. package/esm2020/core/product-experience/gainsight.service.mjs +170 -81
  19. package/esm2020/core/product-experience/index.mjs +2 -1
  20. package/esm2020/core/product-experience/product-experience.module.mjs +42 -24
  21. package/esm2020/core/product-experience/user-engagements.service.mjs +174 -0
  22. package/esm2020/core/user/user-edit-modal.component.mjs +68 -33
  23. package/esm2020/core/user/user-edit.component.mjs +30 -39
  24. package/esm2020/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +3 -3
  25. package/fesm2015/c8y-ngx-components-context-dashboard.mjs +2 -2
  26. package/fesm2015/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  27. package/fesm2015/c8y-ngx-components-datapoint-selector.mjs +2 -2
  28. package/fesm2015/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  29. package/fesm2015/c8y-ngx-components.mjs +516 -167
  30. package/fesm2015/c8y-ngx-components.mjs.map +1 -1
  31. package/fesm2020/c8y-ngx-components-context-dashboard.mjs +2 -2
  32. package/fesm2020/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  33. package/fesm2020/c8y-ngx-components-datapoint-selector.mjs +2 -2
  34. package/fesm2020/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  35. package/fesm2020/c8y-ngx-components.mjs +511 -161
  36. package/fesm2020/c8y-ngx-components.mjs.map +1 -1
  37. package/locales/locales.pot +2 -2
  38. package/package.json +1 -1
@@ -1,8 +1,7 @@
1
- import { DOCUMENT as Document } from '@angular/common';
2
- import { Inject, Injectable } from '@angular/core';
1
+ import { Injectable } from '@angular/core';
3
2
  import { TranslateService } from '@ngx-translate/core';
4
3
  import { camelCase, flatMap } from 'lodash-es';
5
- import { BehaviorSubject, combineLatest, fromEvent } from 'rxjs';
4
+ import { BehaviorSubject, Subject, combineLatest, fromEvent } from 'rxjs';
6
5
  import { delay, filter, map, take } from 'rxjs/operators';
7
6
  import { CookieBannerService } from '../bootstrap/cookie-banner/cookie-banner.service';
8
7
  import { OptionsService } from '../common/options.service';
@@ -19,8 +18,7 @@ import * as i5 from "@ngx-translate/core";
19
18
  * tag and
20
19
  */
21
20
  export class GainsightService {
22
- constructor(document, appState, options, cookieBannerService, userPreferencesService, translateService) {
23
- this.document = document;
21
+ constructor(appState, options, cookieBannerService, userPreferencesService, translateService) {
24
22
  this.appState = appState;
25
23
  this.options = options;
26
24
  this.cookieBannerService = cookieBannerService;
@@ -30,6 +28,11 @@ export class GainsightService {
30
28
  * A subject that emits the tag function as soon as a new tag is set.
31
29
  */
32
30
  this.tagFunction$ = new BehaviorSubject(null);
31
+ this.trackingLoaded$ = new Subject();
32
+ /**
33
+ * Gainsight is activated only when the cookie banner is present. If functional cookies are enabled, both personally identifiable information (PII) and required data are sent.
34
+ * Otherwise, only the required data is transmitted during the identity step execution.
35
+ */
33
36
  this.USER_PREFERENCES_GAINSIGHT_KEY = 'gainsightEnabled';
34
37
  /**
35
38
  * The name of the key remained unchanged, but applies to all engagements.
@@ -41,13 +44,21 @@ export class GainsightService {
41
44
  this.SCRIPT_EXECUTION_WAIT_TIME = 500;
42
45
  this.OPTIONS_KEY_CATEGORY = 'gainsight';
43
46
  this.OPTIONS_KEY_NAME = 'api.key';
44
- this.ENGAGEMENTS = 'engagements';
45
47
  this.isScriptLoaded = false;
46
48
  }
49
+ /**
50
+ * Checks if the specified Gainsight preference is disabled in user preferences.
51
+ * @param preferenceName - Name of the Gainsight preference.
52
+ * @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
53
+ */
47
54
  async isGainsightPreferenceDisabledInUserPreferences(preferenceName) {
48
55
  const userGainsightPref = await this.userPreferencesService.get(preferenceName).toPromise();
49
56
  return userGainsightPref === false;
50
57
  }
58
+ /**
59
+ * Sets the state of the functional cookie.
60
+ * @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
61
+ */
51
62
  setFunctionalCookie(value) {
52
63
  const cookies = this.cookieBannerService.getUserCookiePreferences();
53
64
  if (cookies) {
@@ -76,56 +87,119 @@ export class GainsightService {
76
87
  /**
77
88
  * Load the script tag and calls the identify function to start the tracking.
78
89
  * @param currentTenant The current tenant.
79
- * @param identify If set to false, only the tag is loaded.
90
+ * @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
80
91
  */
81
- async loadTag(currentTenant, identify = true) {
92
+ async loadTag(currentTenant, sendPiiData) {
82
93
  const scriptTag = document.createElement('script');
83
94
  const key = await this.getGainsightKey();
84
95
  if (key && !this.isScriptLoaded) {
85
96
  this.loadScriptTag(scriptTag, key);
86
- combineLatest(this.appState.currentUser, fromEvent(scriptTag, 'load'), this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1)))
97
+ const currentUserStream = this.appState.currentUser;
98
+ const scriptLoadStream = fromEvent(scriptTag, 'load');
99
+ const versionStream = this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1));
100
+ const sourceStreams = sendPiiData
101
+ ? [currentUserStream, scriptLoadStream, versionStream]
102
+ : [currentUserStream, scriptLoadStream];
103
+ combineLatest(sourceStreams)
87
104
  .pipe(delay(this.SCRIPT_EXECUTION_WAIT_TIME), filter(([user, scriptEvent]) => !!(scriptEvent && user)))
88
- .subscribe(([user, , versions]) => {
105
+ .subscribe(args => {
106
+ const [user, , versions] = args;
107
+ this.setGlobalContext();
89
108
  const instanceId = this.getInstanceIdFromUrl();
90
- if (identify) {
91
- this.setGlobalContext();
92
- this.identify(user, currentTenant, instanceId, versions.ui.ngx, versions.backend);
109
+ if (sendPiiData) {
110
+ const versionUI = versions.ui.ngx;
111
+ const versionBE = versions.backend;
112
+ const extendedIdentifyData = {
113
+ user,
114
+ currentTenant,
115
+ instanceId,
116
+ versionUI,
117
+ versionBE
118
+ };
119
+ this.identify(sendPiiData, extendedIdentifyData);
120
+ }
121
+ else {
122
+ const requiredIdentifyData = { user, currentTenant, instanceId };
123
+ this.identify(sendPiiData, requiredIdentifyData);
93
124
  }
94
125
  this.isScriptLoaded = true;
95
126
  this.tagFunction$.next(this.tagFunction);
127
+ this.trackingLoaded$.next(true);
96
128
  });
97
129
  }
98
130
  }
99
131
  /**
100
132
  * Identifies the user/account at Gainsight.
101
- * @param user The user which is given to Gainsight.
102
- * @param tenant The tenant which is given to Gainsight.
103
- * @param versionUI The UI version used.
104
- * @param versionBE The BE version used.
133
+ * @param sendPiiData Flag for sending personally identifiable information.
134
+ * @param identifyData Object containing identification data.
105
135
  */
106
- identify(user, tenant, instanceId, versionUI, versionBE) {
136
+ identify(sendPiiData, identifyData) {
107
137
  const windowRef = window;
108
- const { id: userId, email, userName, firstName, lastName, roles } = user;
109
- const { name, customProperties, domainName } = tenant;
110
- const { externalReference } = customProperties || {};
111
- windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', {
112
- id: `${userId}_${name}_${instanceId}`,
113
- email,
114
- userName,
115
- firstName,
116
- lastName,
117
- domainName,
118
- versionUI,
119
- versionBE,
120
- userLanguage: this.translateService.currentLang,
121
- instanceId,
122
- externalReference,
123
- userRoles: this.transformUserRolesToStr(roles?.references)
124
- }, {
125
- id: `${name}_${instanceId}`,
126
- instanceId
127
- });
138
+ const { id: userId, email } = identifyData.user;
139
+ const { name: tenantID } = identifyData.currentTenant;
140
+ const { instanceId } = identifyData;
141
+ /**
142
+ * Passing ID is a minimum required data to make an identify call to Gainsight.
143
+ * isUserCreatedAfterAnonymizationWasActivated parameter is passed to later distinguish between users created before and after data anonymization done by Gainsight.
144
+ * tenantID Used to distinguish between tenants when same email is used for different tenants.
145
+ *
146
+ * Due to GS limitations (GS does not allow clearing user attr/preferences via the GS tag!),
147
+ * we always need to initialize fields related to PII to prevent leaking this data to GS when the user has disabled functional cookies.
148
+ */
149
+ const requiredIdentify = {
150
+ /**
151
+ * Email was not mandatory form field until 10.14
152
+ */
153
+ id: email ? email : `${userId}_${tenantID}_${instanceId}`,
154
+ isUserCreatedAfterAnonymizationWasActivated: true,
155
+ tenantID: tenantID,
156
+ email: '--',
157
+ userName: '',
158
+ firstName: '',
159
+ lastName: '',
160
+ domainName: '',
161
+ versionUI: '',
162
+ versionBE: '',
163
+ userLanguage: '',
164
+ instanceId: '',
165
+ externalReference: '',
166
+ userRoles: '',
167
+ customBranding: this.isCustomBranding(),
168
+ fullTracking: sendPiiData
169
+ };
170
+ if (sendPiiData) {
171
+ const { userName, firstName, lastName, roles } = identifyData.user;
172
+ const { customProperties, domainName } = identifyData.currentTenant;
173
+ const { versionUI, versionBE } = identifyData;
174
+ const extendedIdentify = {
175
+ ...requiredIdentify,
176
+ email,
177
+ userName,
178
+ firstName,
179
+ lastName,
180
+ domainName,
181
+ versionUI,
182
+ versionBE,
183
+ userLanguage: this.translateService.currentLang,
184
+ instanceId,
185
+ externalReference: customProperties?.externalReference,
186
+ userRoles: this.transformUserRolesToStr(roles?.references)
187
+ };
188
+ windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', extendedIdentify, {
189
+ id: `${tenantID}_${instanceId}`,
190
+ instanceId
191
+ });
192
+ return;
193
+ }
194
+ windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', requiredIdentify);
128
195
  }
196
+ /**
197
+ * Triggers an event to be recorded by Gainsight PX.
198
+ * This method calls the Gainsight PX's tracking mechanism to log a specific event
199
+ * along with its associated properties.
200
+ * @param eventName - Name of the event to be triggered.
201
+ * @param props - Optional properties associated with the event.
202
+ */
129
203
  triggerEvent(eventName, props) {
130
204
  if (this.tagFunction && eventName) {
131
205
  eventName = this.prepareEventName(eventName);
@@ -147,38 +221,51 @@ export class GainsightService {
147
221
  return this.getEnTranslation(textToTranslate, this.cachedRevertedTranslations);
148
222
  }
149
223
  /**
150
- * Checks if the Gainsight's tag should be loaded.
151
- * The decision to load Gainsight will depend on custom properties and functional cookies.
152
- * @param customProperties Tenant's customProperties.
224
+ * Determines whether personally identifiable information (PII) should be sent while loading a tag.
225
+ * The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
226
+ * if the functional cookie is enabled, and if the user grants permission.
153
227
  */
154
- shouldLoadGainsightTag(customProperties) {
228
+ async shouldSendPiiData() {
155
229
  return (this.cookieBannerService.isConfigCookiePreferencesDefined() &&
156
230
  this.cookieBannerService.isFunctionalCookieEnabled() &&
157
- !this.isGainsightDisabled(customProperties) &&
158
- !this.isCustomBranding());
231
+ !(await this.isGainsightPreferenceDisabledInUserPreferences(this.USER_PREFERENCES_GAINSIGHT_KEY)));
159
232
  }
233
+ /**
234
+ * Updates a specific user attribute in the Gainsight global scope.
235
+ * This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
236
+ * @param name - Name of the user attribute to be updated.
237
+ * @param value - Value to set for the specified user attribute.
238
+ */
160
239
  updateUserAttribute(name, value) {
161
240
  window[this.GAINSIGHT_GLOBAL_SCOPE]?.('set', 'user', { [name]: value });
162
241
  }
242
+ /**
243
+ * Determines if the current user has the capability to modify Gainsight PX settings.
244
+ *
245
+ * This method checks multiple conditions:
246
+ * 1. Whether tracking has been disabled globally via application options.
247
+ * 2. Whether Gainsight is disabled at the tenant level through custom properties.
248
+ * 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
249
+ * 4. Whether cookie preferences are defined and available for the user.
250
+ *
251
+ * @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
252
+ */
163
253
  async canEditProductExperienceSettings() {
164
254
  const currentTenant = this.appState.currentTenant.value;
165
255
  const { customProperties } = currentTenant;
256
+ if (this.isTrackingDisabled() ||
257
+ this.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
258
+ return false;
259
+ }
166
260
  const gainsightKey = !!this.gainsightKey || !!(await this.getGainsightKey());
167
261
  return (gainsightKey &&
168
262
  this.cookieBannerService.isConfigCookiePreferencesDefined() &&
169
- !this.isGainsightDisabled(customProperties) &&
170
- !!this.cookieBannerService.getUserCookiePreferences() &&
171
- !this.isCustomBranding());
172
- }
173
- switchGainsightEngagementsVisibility(showGainsightEngagements) {
174
- if (showGainsightEngagements) {
175
- this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
176
- this.updateUserAttribute(this.ENGAGEMENTS, true);
177
- return;
178
- }
179
- this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
180
- this.updateUserAttribute(this.ENGAGEMENTS, false);
263
+ !!this.cookieBannerService.getUserCookiePreferences());
181
264
  }
265
+ /**
266
+ * Sets the global context for Gainsight with the current application name.
267
+ * The global context can be utilized by Gainsight for various purposes, such as segmenting users.
268
+ */
182
269
  setGlobalContext() {
183
270
  const currentAppState = this.appState.state$.value;
184
271
  const currentAppName = currentAppState.app.name;
@@ -190,18 +277,31 @@ export class GainsightService {
190
277
  }
191
278
  return flatMap(userRoles, (userRole) => userRole.role.name).join();
192
279
  }
193
- addHidingStyle(styleId, textContent) {
194
- if (this.document.getElementById(styleId)) {
195
- return;
196
- }
197
- const style = this.document.createElement('style');
198
- style.id = styleId;
199
- style.textContent = textContent;
200
- this.document.head.appendChild(style);
280
+ /**
281
+ * Checks if Gainsight is disabled based on tenant custom properties.
282
+ *
283
+ * @param customProperties - The custom properties of the tenant.
284
+ * @returns {boolean} - True if Gainsight is disabled, false otherwise.
285
+ */
286
+ isGainsightDisabledAtTenantCustomProperties(customProperties) {
287
+ const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
288
+ return gainsightEnabled === false;
201
289
  }
202
- removeHidingStyle(styleId) {
203
- const style = this.document.getElementById(styleId);
204
- style?.remove();
290
+ /**
291
+ * Determines if custom branding is enabled based on the presence of a brand logo.
292
+ *
293
+ * @returns {boolean} - True if custom branding is applied, false otherwise.
294
+ */
295
+ isCustomBranding() {
296
+ const brandingCssVars = this.options.get('brandingCssVars') || {};
297
+ return !!brandingCssVars['brand-logo-img'];
298
+ }
299
+ /**
300
+ * Determines if tracking is disabled based on the application options.
301
+ * @returns `true` if tracking is disabled, otherwise `false`.
302
+ */
303
+ isTrackingDisabled() {
304
+ return this.options.disableTracking === true;
205
305
  }
206
306
  prepareEventName(baseEventName) {
207
307
  return baseEventName
@@ -212,14 +312,6 @@ export class GainsightService {
212
312
  return eventNamePart.replace(/`[\w\W]*`/g, '');
213
313
  }
214
314
  }
215
- isGainsightDisabled(customProperties) {
216
- const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
217
- return gainsightEnabled === false;
218
- }
219
- isCustomBranding() {
220
- const brandingCssVars = this.options.get('brandingCssVars') || {};
221
- return !!brandingCssVars['brand-logo-img'];
222
- }
223
315
  loadScriptTag(scriptTag, key) {
224
316
  try {
225
317
  const windowRef = window;
@@ -282,15 +374,12 @@ export class GainsightService {
282
374
  return enTranslation;
283
375
  }
284
376
  }
285
- GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token: Document }, { token: i1.AppStateService }, { token: i2.OptionsService }, { token: i3.CookieBannerService }, { token: i4.UserPreferencesService }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
377
+ GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token: i1.AppStateService }, { token: i2.OptionsService }, { token: i3.CookieBannerService }, { token: i4.UserPreferencesService }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
286
378
  GainsightService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, providedIn: 'root' });
287
379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, decorators: [{
288
380
  type: Injectable,
289
381
  args: [{
290
382
  providedIn: 'root'
291
383
  }]
292
- }], ctorParameters: function () { return [{ type: Document, decorators: [{
293
- type: Inject,
294
- args: [Document]
295
- }] }, { type: i1.AppStateService }, { type: i2.OptionsService }, { type: i3.CookieBannerService }, { type: i4.UserPreferencesService }, { type: i5.TranslateService }]; } });
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FpbnNpZ2h0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxJQUFJLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7Ozs7OztBQVk3Rjs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBdUIzQixZQUM0QixRQUFrQixFQUNwQyxRQUF5QixFQUN6QixPQUF1QixFQUN2QixtQkFBd0MsRUFDeEMsc0JBQThDLEVBQzlDLGdCQUFrQztRQUxoQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFD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dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDdXN0b21Qcm9wZXJ0aWVzIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgY2FtZWxDYXNlLCBmbGF0TWFwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWxheSwgZmlsdGVyLCBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29raWVCYW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYm9vdHN0cmFwL2Nvb2tpZS1iYW5uZXIvY29va2llLWJhbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL29wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFB4RXZlbnREYXRhIH0gZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuXG5pbnRlcmZhY2UgVXNlclJvbGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb2xlIHtcbiAgcm9sZTogVXNlclJvbGU7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlIHRvIG1hbmFnZSB0aGUgR2FpbnNpZ2h0IGludGVncmF0aW9uLiBJdCBhbGxvd3MgdG8gbG9hZCB0aGVcbiAqIHRhZyBhbmRcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR2FpbnNpZ2h0U2VydmljZSB7XG4gIC8qKlxuICAgKiBBIHN1YmplY3QgdGhhdCBlbWl0cyB0aGUgdGFnIGZ1bmN0aW9uIGFzIHNvb24gYXMgYSBuZXcgdGFnIGlzIHNldC5cbiAgICovXG4gIHRhZ0Z1bmN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgcmVhZG9ubHkgVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfS0VZID0gJ2dhaW5zaWdodEVuYWJsZWQnO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGtleSByZW1haW5lZCB1bmNoYW5nZWQsIGJ1dCBhcHBsaWVzIHRvIGFsbCBlbmdhZ2VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IFVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0VOR0FHRU1FTlRTX0tFWSA9ICdnYWluc2lnaHRCb3RFbmFibGVkJztcbiAgcmVhZG9ubHkgSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lEID0gJ2hpZGUtZ3MtYm90JztcbiAgcHJpdmF0ZSByZWFkb25seSBHQUlOU0lHSFRfVVJMID0gJ3dlYi1zZGsuYXB0cmluc2ljLmNvbS9hcGkvYXB0cmluc2ljLmpzP2E9JztcbiAgcHJpdmF0ZSByZWFkb25seSBHQUlOU0lHSFRfR0xPQkFMX1NDT1BFID0gJ2FwdHJpbnNpYyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0NSSVBUX0VYRUNVVElPTl9XQUlUX1RJTUUgPSA1MDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgT1BUSU9OU19LRVlfQ0FURUdPUlkgPSAnZ2FpbnNpZ2h0JztcbiAgcHJpdmF0ZSByZWFkb25seSBPUFRJT05TX0tFWV9OQU1FID0gJ2FwaS5rZXknO1xuICBwcml2YXRlIHJlYWRvbmx5IEVOR0FHRU1FTlRTID0gJ2VuZ2FnZW1lbnRzJztcbiAgcHJpdmF0ZSBpc1NjcmlwdExvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdhaW5zaWdodEtleTogc3RyaW5nO1xuICBwcml2YXRlIGNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIGNhY2hlZExhbmd1YWdlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChEb2N1bWVudCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uczogT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclByZWZlcmVuY2VzU2VydmljZTogVXNlclByZWZlcmVuY2VzU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIGlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMocHJlZmVyZW5jZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHVzZXJHYWluc2lnaHRQcmVmID0gYXdhaXQgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChwcmVmZXJlbmNlTmFtZSkudG9Qcm9taXNlKCk7XG4gICAgcmV0dXJuIHVzZXJHYWluc2lnaHRQcmVmID09PSBmYWxzZTtcbiAgfVxuXG4gIHNldEZ1bmN0aW9uYWxDb29raWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb29raWVzID0gdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmdldFVzZXJDb29raWVQcmVmZXJlbmNlcygpO1xuICAgIGlmIChjb29raWVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhjb29raWVzKS5mb3JFYWNoKGNvb2tpZU5hbWUgPT4ge1xuICAgICAgICBpZiAoY29va2llTmFtZSA9PT0gJ2Z1bmN0aW9uYWwnKSB7XG4gICAgICAgICAgY29va2llc1tjb29raWVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWNjZXB0Q29va2llTm90aWNlJywgSlNPTi5zdHJpbmdpZnkoY29va2llcykpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEdhaW5zaWdodEtleSgpIHtcbiAgICB0aGlzLmdhaW5zaWdodEtleSA9XG4gICAgICB0aGlzLm9wdGlvbnMuZ2FpbnNpZ2h0S2V5IHx8XG4gICAgICAoYXdhaXQgdGhpcy5vcHRpb25zLmdldFN5c3RlbU9wdGlvbih0aGlzLk9QVElPTlNfS0VZX0NBVEVHT1JZLCB0aGlzLk9QVElPTlNfS0VZX05BTUUpKTtcbiAgICByZXR1cm4gdGhpcy5nYWluc2lnaHRLZXk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFnIGdsb2JhbCBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB1c2VyXG4gICAqIG9yIGFkZCBzcGVjaWFsIGV2ZW50cy5cbiAgICovXG4gIGdldCB0YWdGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgc2NyaXB0IHRhZyBhbmQgY2FsbHMgdGhlIGlkZW50aWZ5IGZ1bmN0aW9uIHRvIHN0YXJ0IHRoZSB0cmFja2luZy5cbiAgICogQHBhcmFtIGN1cnJlbnRUZW5hbnQgVGhlIGN1cnJlbnQgdGVuYW50LlxuICAgKiBAcGFyYW0gaWRlbnRpZnkgSWYgc2V0IHRvIGZhbHNlLCBvbmx5IHRoZSB0YWcgaXMgbG9hZGVkLlxuICAgKi9cbiAgYXN5bmMgbG9hZFRhZyhjdXJyZW50VGVuYW50LCBpZGVudGlmeSA9IHRydWUpIHtcbiAgICBjb25zdCBzY3JpcHRUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmdldEdhaW5zaWdodEtleSgpO1xuXG4gICAgaWYgKGtleSAmJiAhdGhpcy5pc1NjcmlwdExvYWRlZCkge1xuICAgICAgdGhpcy5sb2FkU2NyaXB0VGFnKHNjcmlwdFRhZywga2V5KTtcbiAgICAgIGNvbWJpbmVMYXRlc3QoXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuY3VycmVudFVzZXIsXG4gICAgICAgIGZyb21FdmVudChzY3JpcHRUYWcsICdsb2FkJyksXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuc3RhdGUkLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKCh7IHZlcnNpb25zIH0pID0+IHZlcnNpb25zLmJhY2tlbmQpLFxuICAgICAgICAgIG1hcCgoeyB2ZXJzaW9ucyB9KSA9PiB2ZXJzaW9ucyksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlbGF5KHRoaXMuU0NSSVBUX0VYRUNVVElPTl9XQUlUX1RJTUUpLFxuICAgICAgICAgIGZpbHRlcigoW3VzZXIsIHNjcmlwdEV2ZW50XSkgPT4gISEoc2NyaXB0RXZlbnQgJiYgdXNlcikpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoW3VzZXIsICwgdmVyc2lvbnNdKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VJZCA9IHRoaXMuZ2V0SW5zdGFuY2VJZEZyb21VcmwoKTtcbiAgICAgICAgICBpZiAoaWRlbnRpZnkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0R2xvYmFsQ29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5pZGVudGlmeSh1c2VyLCBjdXJyZW50VGVuYW50LCBpbnN0YW5jZUlkLCB2ZXJzaW9ucy51aS5uZ3gsIHZlcnNpb25zLmJhY2tlbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnRhZ0Z1bmN0aW9uJC5uZXh0KHRoaXMudGFnRnVuY3Rpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUgdXNlci9hY2NvdW50IGF0IEdhaW5zaWdodC5cbiAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICAgKiBAcGFyYW0gdGVuYW50IFRoZSB0ZW5hbnQgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICAgKiBAcGFyYW0gdmVyc2lvblVJIFRoZSBVSSB2ZXJzaW9uIHVzZWQuXG4gICAqIEBwYXJhbSB2ZXJzaW9uQkUgVGhlIEJFIHZlcnNpb24gdXNlZC5cbiAgICovXG4gIGlkZW50aWZ5KHVzZXIsIHRlbmFudCwgaW5zdGFuY2VJZCwgdmVyc2lvblVJPywgdmVyc2lvbkJFPykge1xuICAgIGNvbnN0IHdpbmRvd1JlZiA9IHdpbmRvdyBhcyBhbnk7XG4gICAgY29uc3QgeyBpZDogdXNlcklkLCBlbWFpbCwgdXNlck5hbWUsIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHJvbGVzIH0gPSB1c2VyO1xuICAgIGNvbnN0IHsgbmFtZSwgY3VzdG9tUHJvcGVydGllcywgZG9tYWluTmFtZSB9ID0gdGVuYW50O1xuICAgIGNvbnN0IHsgZXh0ZXJuYWxSZWZlcmVuY2UgfSA9IGN1c3RvbVByb3BlcnRpZXMgfHwge307XG4gICAgd2luZG93UmVmW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0oXG4gICAgICAnaWRlbnRpZnknLFxuICAgICAge1xuICAgICAgICBpZDogYCR7dXNlcklkfV8ke25hbWV9XyR7aW5zdGFuY2VJZH1gLFxuICAgICAgICBlbWFpbCxcbiAgICAgICAgdXNlck5hbWUsXG4gICAgICAgIGZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWUsXG4gICAgICAgIGRvbWFpbk5hbWUsXG4gICAgICAgIHZlcnNpb25VSSxcbiAgICAgICAgdmVyc2lvbkJFLFxuICAgICAgICB1c2VyTGFuZ3VhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyxcbiAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgZXh0ZXJuYWxSZWZlcmVuY2UsXG4gICAgICAgIHVzZXJSb2xlczogdGhpcy50cmFuc2Zvcm1Vc2VyUm9sZXNUb1N0cihyb2xlcz8ucmVmZXJlbmNlcylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBgJHtuYW1lfV8ke2luc3RhbmNlSWR9YCxcbiAgICAgICAgaW5zdGFuY2VJZFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BzPzogUHhFdmVudERhdGEpIHtcbiAgICBpZiAodGhpcy50YWdGdW5jdGlvbiAmJiBldmVudE5hbWUpIHtcbiAgICAgIGV2ZW50TmFtZSA9IHRoaXMucHJlcGFyZUV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgICAgdGhpcy50YWdGdW5jdGlvbigndHJhY2snLCBldmVudE5hbWUsIHByb3BzKTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVUb0VuZ2xpc2godGV4dFRvVHJhbnNsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY3VycmVudExhbmcgfSA9IHRoaXMudHJhbnNsYXRlU2VydmljZTtcblxuICAgIGlmIChjdXJyZW50TGFuZyA9PT0gJ2VuJykge1xuICAgICAgcmV0dXJuIHRleHRUb1RyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudExhbmcgJiYgY3VycmVudExhbmcgIT09IHRoaXMuY2FjaGVkTGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zKSB7XG4gICAgICB0aGlzLmNhY2hlZExhbmd1YWdlID0gY3VycmVudExhbmc7XG4gICAgICB0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zID0gdGhpcy5nZXRSZXZlcnRlZFRyYW5zbGF0aW9ucyhjdXJyZW50TGFuZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5UcmFuc2xhdGlvbih0ZXh0VG9UcmFuc2xhdGUsIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgR2FpbnNpZ2h0J3MgdGFnIHNob3VsZCBiZSBsb2FkZWQuXG4gICAqIFRoZSBkZWNpc2lvbiB0byBsb2FkIEdhaW5zaWdodCB3aWxsIGRlcGVuZCBvbiBjdXN0b20gcHJvcGVydGllcyBhbmQgZnVuY3Rpb25hbCBjb29raWVzLlxuICAgKiBAcGFyYW0gY3VzdG9tUHJvcGVydGllcyBUZW5hbnQncyBjdXN0b21Qcm9wZXJ0aWVzLlxuICAgKi9cbiAgc2hvdWxkTG9hZEdhaW5zaWdodFRhZyhjdXN0b21Qcm9wZXJ0aWVzOiBJQ3VzdG9tUHJvcGVydGllcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvb2tpZUJhbm5lclNlcnZpY2UuaXNDb25maWdDb29raWVQcmVmZXJlbmNlc0RlZmluZWQoKSAmJlxuICAgICAgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzRnVuY3Rpb25hbENvb2tpZUVuYWJsZWQoKSAmJlxuICAgICAgIXRoaXMuaXNHYWluc2lnaHREaXNhYmxlZChjdXN0b21Qcm9wZXJ0aWVzKSAmJlxuICAgICAgIXRoaXMuaXNDdXN0b21CcmFuZGluZygpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVVzZXJBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlciB8IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB3aW5kb3dbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXT8uKCdzZXQnLCAndXNlcicsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGFzeW5jIGNhbkVkaXRQcm9kdWN0RXhwZXJpZW5jZVNldHRpbmdzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGN1cnJlbnRUZW5hbnQgPSB0aGlzLmFwcFN0YXRlLmN1cnJlbnRUZW5hbnQudmFsdWU7XG4gICAgY29uc3QgeyBjdXN0b21Qcm9wZXJ0aWVzIH0gPSBjdXJyZW50VGVuYW50O1xuXG4gICAgY29uc3QgZ2FpbnNpZ2h0S2V5ID0gISF0aGlzLmdhaW5zaWdodEtleSB8fCAhIShhd2FpdCB0aGlzLmdldEdhaW5zaWdodEtleSgpKTtcblxuICAgIHJldHVybiAoXG4gICAgICBnYWluc2lnaHRLZXkgJiZcbiAgICAgIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0NvbmZpZ0Nvb2tpZVByZWZlcmVuY2VzRGVmaW5lZCgpICYmXG4gICAgICAhdGhpcy5pc0dhaW5zaWdodERpc2FibGVkKGN1c3RvbVByb3BlcnRpZXMpICYmXG4gICAgICAhIXRoaXMuY29va2llQmFubmVyU2VydmljZS5nZXRVc2VyQ29va2llUHJlZmVyZW5jZXMoKSAmJlxuICAgICAgIXRoaXMuaXNDdXN0b21CcmFuZGluZygpXG4gICAgKTtcbiAgfVxuXG4gIHN3aXRjaEdhaW5zaWdodEVuZ2FnZW1lbnRzVmlzaWJpbGl0eShzaG93R2FpbnNpZ2h0RW5nYWdlbWVudHM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzKSB7XG4gICAgICB0aGlzLnJlbW92ZUhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lEKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckF0dHJpYnV0ZSh0aGlzLkVOR0FHRU1FTlRTLCB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lELCAnI2FwdC13aWRnZXQgeyBkaXNwbGF5Om5vbmUgfScpO1xuICAgIHRoaXMudXBkYXRlVXNlckF0dHJpYnV0ZSh0aGlzLkVOR0FHRU1FTlRTLCBmYWxzZSk7XG4gIH1cblxuICBzZXRHbG9iYWxDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRBcHBTdGF0ZSA9IHRoaXMuYXBwU3RhdGUuc3RhdGUkLnZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRBcHBOYW1lID0gY3VycmVudEFwcFN0YXRlLmFwcC5uYW1lO1xuXG4gICAgd2luZG93W3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0/Lignc2V0JywgJ2dsb2JhbENvbnRleHQnLCB7IHByb2plY3ROYW1lOiBjdXJyZW50QXBwTmFtZSB9KTtcbiAgfVxuXG4gIHRyYW5zZm9ybVVzZXJSb2xlc1RvU3RyKHVzZXJSb2xlcz86IFJvbGVbXSk6IHN0cmluZyB7XG4gICAgaWYgKCF1c2VyUm9sZXMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcCh1c2VyUm9sZXMsICh1c2VyUm9sZTogeyByb2xlOiBVc2VyUm9sZSB9KSA9PiB1c2VyUm9sZS5yb2xlLm5hbWUpLmpvaW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSGlkaW5nU3R5bGUoc3R5bGVJZDogc3RyaW5nLCB0ZXh0Q29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9IHN0eWxlSWQ7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcbiAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVIaWRpbmdTdHlsZShzdHlsZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCk7XG4gICAgc3R5bGU/LnJlbW92ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlRXZlbnROYW1lKGJhc2VFdmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJhc2VFdmVudE5hbWVcbiAgICAgIC5zcGxpdCgnOicpXG4gICAgICAubWFwKGV2ZW50TmFtZVBhcnQgPT4gY2FtZWxDYXNlKHJlbW92ZVRyYW5zbGF0aW9uQ29udGV4dChldmVudE5hbWVQYXJ0KSkpXG4gICAgICAuam9pbignOicpO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlVHJhbnNsYXRpb25Db250ZXh0KGV2ZW50TmFtZVBhcnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXZlbnROYW1lUGFydC5yZXBsYWNlKC9gW1xcd1xcV10qYC9nLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0dhaW5zaWdodERpc2FibGVkKGN1c3RvbVByb3BlcnRpZXM6IElDdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgZ2FpbnNpZ2h0RW5hYmxlZCA9IGN1c3RvbVByb3BlcnRpZXMgJiYgY3VzdG9tUHJvcGVydGllcy5nYWluc2lnaHRFbmFibGVkO1xuICAgIHJldHVybiBnYWluc2lnaHRFbmFibGVkID09PSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDdXN0b21CcmFuZGluZygpOiBib29sZWFuIHtcbiAgICBjb25zdCBicmFuZGluZ0Nzc1ZhcnMgPSB0aGlzLm9wdGlvbnMuZ2V0KCdicmFuZGluZ0Nzc1ZhcnMnKSB8fCB7fTtcbiAgICByZXR1cm4gISFicmFuZGluZ0Nzc1ZhcnNbJ2JyYW5kLWxvZ28taW1nJ107XG4gIH1cblxuICBwcml2YXRlIGxvYWRTY3JpcHRUYWcoc2NyaXB0VGFnOiBIVE1MU2NyaXB0RWxlbWVudCwga2V5OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2luZG93UmVmID0gd2luZG93IGFzIGFueTtcbiAgICAgIGNvbnN0IGZpcnN0VGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgICAgY29uc3QgcHJvdG9jb2wgPSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICAgIGNvbnN0IGdhaW5zaWdodEdsb2JhbFNjb3BlID0gdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFO1xuICAgICAgc2NyaXB0VGFnLnNyYyA9IGAke3Byb3RvY29sfS8vJHt0aGlzLkdBSU5TSUdIVF9VUkx9JHtrZXl9YDtcbiAgICAgICh3aW5kb3dSZWZbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXSA9XG4gICAgICAgIHdpbmRvd1JlZlt0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdIHx8XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpvbmx5LWFycm93LWZ1bmN0aW9uc1xuICAgICAgICBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICh3aW5kb3dSZWZbZ2FpbnNpZ2h0R2xvYmFsU2NvcGVdLnEgPSB3aW5kb3dSZWZbZ2FpbnNpZ2h0R2xvYmFsU2NvcGVdLnEgfHwgW10pLnB1c2goYXJncyk7XG4gICAgICAgIH0pLFxuICAgICAgICAod2luZG93UmVmW2dhaW5zaWdodEdsb2JhbFNjb3BlXS5wID0ga2V5KTtcbiAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG4gICAgICBmaXJzdFRhZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHRUYWcsIGZpcnN0VGFnKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBHYWluc2lnaHQgUFgnLCBleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnN0YW5jZUlkRnJvbVVybCgpIHtcbiAgICBjb25zdCBob3N0TmFtZSA9IGxvY2F0aW9uLmhvc3RuYW1lO1xuICAgIHJldHVybiBob3N0TmFtZS5zdWJzdHJpbmcoaG9zdE5hbWUuaW5kZXhPZignLicpICsgMSk7XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJzZXMgdGhlIHRyYW5zbGF0aW9uIG9iamVjdC5cbiAgICpcbiAgICogKipFeGFtcGxlKipcbiAgICogeyBBZGQgd2lkZ2V0OiBcIldpZGdldCBoaW56dWbDvGdlblwiIH1cbiAgICpcbiAgICogd2lsbCBiZSBjaGFuZ2VkIHRvOlxuICAgKlxuICAgKiB7IFdpZGdldCBoaW56dWbDvGdlbjogXCJBZGQgd2lkZ2V0XCIgfVxuICAgKlxuICAgKiBAcGFyYW0gY3VycmVudExhbmcgTGFuZ3VhZ2Ugd2hvc2UgdHJhbnNsYXRlZCB2YWx1ZXMgYXJlIHRvIGJlIHBsYWNlZCBpbiB0aGUgb2JqZWN0IGtleS5cbiAgICogQHJldHVybnMgUmV0dXJucyBhbiBpbnZlcnRlZCBvYmplY3Qgd2hlcmUgdGhlIGtleXMgaGF2ZSBiZWVuIHN3YXBwZWQgd2l0aCB0aGUgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSZXZlcnRlZFRyYW5zbGF0aW9ucyhjdXJyZW50TGFuZzogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0b3JlLnRyYW5zbGF0aW9uc1tjdXJyZW50TGFuZ107XG5cbiAgICBjb25zdCBzd2FwcGVkS2V5c1dpdGhWYWx1ZXMgPSB7fTtcbiAgICBPYmplY3Qua2V5cyh0cmFuc2xhdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHN3YXBwZWRLZXlzV2l0aFZhbHVlc1t0cmFuc2xhdGlvbnNba2V5XV0gPSBrZXk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN3YXBwZWRLZXlzV2l0aFZhbHVlcztcbiAgfVxuXG4gIC8qKlRyYW5zbGF0ZXMgc3RyaW5nIGJhY2sgaW50byBFbmdsaXNoLlxuICAgKiBJZiB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBsYW5ndWFnZSBpcyBzZXQgdG8gRW5nbGlzaCwgdGhlIHN0cmluZyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB0ZXh0VG9UcmFuc2xhdGUgc3RyaW5nIHRvIHRyYW5zbGF0ZS5cbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgc3RyaW5nIHRyYW5zbGF0ZWQgaW50byBFbmdsaXNoLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFblRyYW5zbGF0aW9uKFxuICAgIHRleHRUb1RyYW5zbGF0ZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxuICApOiBzdHJpbmcge1xuICAgIGxldCBlblRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW3RleHRUb1RyYW5zbGF0ZV07XG4gICAgaWYgKCFlblRyYW5zbGF0aW9uKSB7XG4gICAgICByZXR1cm4gdGV4dFRvVHJhbnNsYXRlO1xuICAgIH1cbiAgICAvKiogcmVtb3ZlIHRyYW5zbGF0aW9uIGNvbnRleHQgKi9cbiAgICBjb25zdCByZWdleCA9IC9cXGAoLio/KVxcYC87XG4gICAgZW5UcmFuc2xhdGlvbiA9IGVuVHJhbnNsYXRpb24ucmVwbGFjZShyZWdleCwgJycpO1xuXG4gICAgcmV0dXJuIGVuVHJhbnNsYXRpb247XG4gIH1cbn1cbiJdfQ==
384
+ }], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.OptionsService }, { type: i3.CookieBannerService }, { type: i4.UserPreferencesService }, { type: i5.TranslateService }]; } });
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FpbnNpZ2h0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scURBQXFELENBQUM7Ozs7Ozs7QUF1QjdGOzs7R0FHRztBQUlILE1BQU0sT0FBTyxnQkFBZ0I7SUEyQjNCLFlBQ1UsUUFBeUIsRUFDekIsT0FBdUIsRUFDdkIsbUJBQXdDLEVBQ3hDLHNCQUE4QyxFQUM5QyxnQkFBa0M7UUFKbEMsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUEvQjVDOztXQUVHO1FBQ0gsaUJBQVksR0FBRyxJ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LENBQUM7UUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEMscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxxQkFBcUIsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQixDQUN0QixlQUF1QixFQUN2QixZQUF1QztRQUV2QyxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixPQUFPLGVBQWUsQ0FBQztTQUN4QjtRQUNELGlDQUFpQztRQUNqQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUM7UUFDMUIsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7OzZHQWphVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDdXJyZW50VGVuYW50LCBJQ3VzdG9tUHJvcGVydGllcywgSUlkZW50aWZpZWQsIElVc2VyIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgY2FtZWxDYXNlLCBmbGF0TWFwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWxheSwgZmlsdGVyLCBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29raWVCYW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYm9vdHN0cmFwL2Nvb2tpZS1iYW5uZXIvY29va2llLWJhbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL29wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFB4RXZlbnREYXRhIH0gZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuXG5pbnRlcmZhY2UgVXNlclJvbGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQHByb3BlcnR5IHVzZXIgVGhlIHVzZXIgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICogQHByb3BlcnR5IHRlbmFudCBUaGUgdGVuYW50IHdoaWNoIGlzIGdpdmVuIHRvIEdhaW5zaWdodC5cbiAqIEBwcm9wZXJ0eSBpbnN0YW5jZUlkIEV4dHJhY3RlZCBkb21haW4gcGFydCBvZiBhbiBVUkwuXG4gKiBAcHJvcGVydHkgdmVyc2lvblVJIFRoZSBVSSB2ZXJzaW9uIHVzZWQuXG4gKiBAcHJvcGVydHkgdmVyc2lvbkJFIFRoZSBCRSB2ZXJzaW9uIHVzZWQuXG4gKi9cbmludGVyZmFjZSBJZGVudGlmeURhdGEge1xuICB1c2VyOiBJVXNlcjtcbiAgY3VycmVudFRlbmFudDogSUN1cnJlbnRUZW5hbnQ7XG4gIGluc3RhbmNlSWQ6IHN0cmluZztcbiAgdmVyc2lvblVJPzogc3RyaW5nO1xuICB2ZXJzaW9uQkU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlIHRvIG1hbmFnZSB0aGUgR2FpbnNpZ2h0IGludGVncmF0aW9uLiBJdCBhbGxvd3MgdG8gbG9hZCB0aGVcbiAqIHRhZyBhbmRcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR2FpbnNpZ2h0U2VydmljZSB7XG4gIC8qKlxuICAgKiBBIHN1YmplY3QgdGhhdCBlbWl0cyB0aGUgdGFnIGZ1bmN0aW9uIGFzIHNvb24gYXMgYSBuZXcgdGFnIGlzIHNldC5cbiAgICovXG4gIHRhZ0Z1bmN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIHRyYWNraW5nTG9hZGVkJDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgLyoqXG4gICAqIEdhaW5zaWdodCBpcyBhY3RpdmF0ZWQgb25seSB3aGVuIHRoZSBjb29raWUgYmFubmVyIGlzIHByZXNlbnQuIElmIGZ1bmN0aW9uYWwgY29va2llcyBhcmUgZW5hYmxlZCwgYm90aCBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiAoUElJKSBhbmQgcmVxdWlyZWQgZGF0YSBhcmUgc2VudC5cbiAgICogT3RoZXJ3aXNlLCBvbmx5IHRoZSByZXF1aXJlZCBkYXRhIGlzIHRyYW5zbWl0dGVkIGR1cmluZyB0aGUgaWRlbnRpdHkgc3RlcCBleGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSBVU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9LRVkgPSAnZ2FpbnNpZ2h0RW5hYmxlZCc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUga2V5IHJlbWFpbmVkIHVuY2hhbmdlZCwgYnV0IGFwcGxpZXMgdG8gYWxsIGVuZ2FnZW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfRU5HQUdFTUVOVFNfS0VZID0gJ2dhaW5zaWdodEJvdEVuYWJsZWQnO1xuICByZWFkb25seSBISURFX0dBSU5TSUdIVF9CT1RfU1RZTEVfSUQgPSAnaGlkZS1ncy1ib3QnO1xuICBwcml2YXRlIHJlYWRvbmx5IEdBSU5TSUdIVF9VUkwgPSAnd2ViLXNkay5hcHRyaW5zaWMuY29tL2FwaS9hcHRyaW5zaWMuanM/YT0nO1xuICBwcml2YXRlIHJlYWRvbmx5IEdBSU5TSUdIVF9HTE9CQUxfU0NPUEUgPSAnYXB0cmluc2ljJztcbiAgcHJpdmF0ZSByZWFkb25seSBTQ1JJUFRfRVhFQ1VUSU9OX1dBSVRfVElNRSA9IDUwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBPUFRJT05TX0tFWV9DQVRFR09SWSA9ICdnYWluc2lnaHQnO1xuICBwcml2YXRlIHJlYWRvbmx5IE9QVElPTlNfS0VZX05BTUUgPSAnYXBpLmtleSc7XG4gIHByaXZhdGUgaXNTY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnYWluc2lnaHRLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSBjYWNoZWRSZXZlcnRlZFRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSBjYWNoZWRMYW5ndWFnZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29va2llQmFubmVyU2VydmljZTogQ29va2llQmFubmVyU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgR2FpbnNpZ2h0IHByZWZlcmVuY2UgaXMgZGlzYWJsZWQgaW4gdXNlciBwcmVmZXJlbmNlcy5cbiAgICogQHBhcmFtIHByZWZlcmVuY2VOYW1lIC0gTmFtZSBvZiB0aGUgR2FpbnNpZ2h0IHByZWZlcmVuY2UuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgcHJlZmVyZW5jZSBpcyBkaXNhYmxlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBhc3luYyBpc0dhaW5zaWdodFByZWZlcmVuY2VEaXNhYmxlZEluVXNlclByZWZlcmVuY2VzKHByZWZlcmVuY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB1c2VyR2FpbnNpZ2h0UHJlZiA9IGF3YWl0IHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZS5nZXQocHJlZmVyZW5jZU5hbWUpLnRvUHJvbWlzZSgpO1xuXG4gICAgcmV0dXJuIHVzZXJHYWluc2lnaHRQcmVmID09PSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZnVuY3Rpb25hbCBjb29raWUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEEgYm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmdW5jdGlvbmFsIGNvb2tpZSBzaG91bGQgYmUgZW5hYmxlZCAoYHRydWVgKSBvciBkaXNhYmxlZCAoYGZhbHNlYCkuXG4gICAqL1xuICBzZXRGdW5jdGlvbmFsQ29va2llKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29va2llcyA9IHRoaXMuY29va2llQmFubmVyU2VydmljZS5nZXRVc2VyQ29va2llUHJlZmVyZW5jZXMoKTtcbiAgICBpZiAoY29va2llcykge1xuICAgICAgT2JqZWN0LmtleXMoY29va2llcykuZm9yRWFjaChjb29raWVOYW1lID0+IHtcbiAgICAgICAgaWYgKGNvb2tpZU5hbWUgPT09ICdmdW5jdGlvbmFsJykge1xuICAgICAgICAgIGNvb2tpZXNbY29va2llTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FjY2VwdENvb2tpZU5vdGljZScsIEpTT04uc3RyaW5naWZ5KGNvb2tpZXMpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRHYWluc2lnaHRLZXkoKSB7XG4gICAgdGhpcy5nYWluc2lnaHRLZXkgPVxuICAgICAgdGhpcy5vcHRpb25zLmdhaW5zaWdodEtleSB8fFxuICAgICAgKGF3YWl0IHRoaXMub3B0aW9ucy5nZXRTeXN0ZW1PcHRpb24odGhpcy5PUFRJT05TX0tFWV9DQVRFR09SWSwgdGhpcy5PUFRJT05TX0tFWV9OQU1FKSk7XG4gICAgcmV0dXJuIHRoaXMuZ2FpbnNpZ2h0S2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhZyBnbG9iYWwgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdXNlclxuICAgKiBvciBhZGQgc3BlY2lhbCBldmVudHMuXG4gICAqL1xuICBnZXQgdGFnRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVt0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIHNjcmlwdCB0YWcgYW5kIGNhbGxzIHRoZSBpZGVudGlmeSBmdW5jdGlvbiB0byBzdGFydCB0aGUgdHJhY2tpbmcuXG4gICAqIEBwYXJhbSBjdXJyZW50VGVuYW50IFRoZSBjdXJyZW50IHRlbmFudC5cbiAgICogQHBhcmFtIHNlbmRQaWlEYXRhIEZsYWcgZm9yIHNlbmRpbmcgcGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24gKFBJSSkgZHVyaW5nIGlkZW50aWZpY2F0aW9uIGluIEdhaW5zaWdodC5cbiAgICovXG4gIGFzeW5jIGxvYWRUYWcoY3VycmVudFRlbmFudDogSUN1cnJlbnRUZW5hbnQsIHNlbmRQaWlEYXRhOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5nZXRHYWluc2lnaHRLZXkoKTtcblxuICAgIGlmIChrZXkgJiYgIXRoaXMuaXNTY3JpcHRMb2FkZWQpIHtcbiAgICAgIHRoaXMubG9hZFNjcmlwdFRhZyhzY3JpcHRUYWcsIGtleSk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VyU3RyZWFtID0gdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlcjtcbiAgICAgIGNvbnN0IHNjcmlwdExvYWRTdHJlYW0gPSBmcm9tRXZlbnQoc2NyaXB0VGFnLCAnbG9hZCcpO1xuICAgICAgY29uc3QgdmVyc2lvblN0cmVhbSA9IHRoaXMuYXBwU3RhdGUuc3RhdGUkLnBpcGUoXG4gICAgICAgIGZpbHRlcigoeyB2ZXJzaW9ucyB9KSA9PiB2ZXJzaW9ucy5iYWNrZW5kKSxcbiAgICAgICAgbWFwKCh7IHZlcnNpb25zIH0pID0+IHZlcnNpb25zKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlU3RyZWFtcyA9IHNlbmRQaWlEYXRhXG4gICAgICAgID8gW2N1cnJlbnRVc2VyU3RyZWFtLCBzY3JpcHRMb2FkU3RyZWFtLCB2ZXJzaW9uU3RyZWFtXVxuICAgICAgICA6IFtjdXJyZW50VXNlclN0cmVhbSwgc2NyaXB0TG9hZFN0cmVhbV07XG5cbiAgICAgIGNvbWJpbmVMYXRlc3Qoc291cmNlU3RyZWFtcylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVsYXkodGhpcy5TQ1JJUFRfRVhFQ1VUSU9OX1dBSVRfVElNRSksXG4gICAgICAgICAgZmlsdGVyKChbdXNlciwgc2NyaXB0RXZlbnRdKSA9PiAhIShzY3JpcHRFdmVudCAmJiB1c2VyKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKGFyZ3MgPT4ge1xuICAgICAgICAgIGNvbnN0IFt1c2VyLCAsIHZlcnNpb25zXSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5zZXRHbG9iYWxDb250ZXh0KCk7XG5cbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUlkID0gdGhpcy5nZXRJbnN0YW5jZUlkRnJvbVVybCgpO1xuICAgICAgICAgIGlmIChzZW5kUGlpRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgdmVyc2lvblVJOiBzdHJpbmcgPSB2ZXJzaW9ucy51aS5uZ3g7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uQkU6IHN0cmluZyA9IHZlcnNpb25zLmJhY2tlbmQ7XG4gICAgICAgICAgICBjb25zdCBleHRlbmRlZElkZW50aWZ5RGF0YTogSWRlbnRpZnlEYXRhID0ge1xuICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICBjdXJyZW50VGVuYW50LFxuICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICB2ZXJzaW9uVUksXG4gICAgICAgICAgICAgIHZlcnNpb25CRVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpZnkoc2VuZFBpaURhdGEsIGV4dGVuZGVkSWRlbnRpZnlEYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRJZGVudGlmeURhdGE6IElkZW50aWZ5RGF0YSA9IHsgdXNlciwgY3VycmVudFRlbmFudCwgaW5zdGFuY2VJZCB9O1xuICAgICAgICAgICAgdGhpcy5pZGVudGlmeShzZW5kUGlpRGF0YSwgcmVxdWlyZWRJZGVudGlmeURhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnRhZ0Z1bmN0aW9uJC5uZXh0KHRoaXMudGFnRnVuY3Rpb24pO1xuICAgICAgICAgIHRoaXMudHJhY2tpbmdMb2FkZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIHRoZSB1c2VyL2FjY291bnQgYXQgR2FpbnNpZ2h0LlxuICAgKiBAcGFyYW0gc2VuZFBpaURhdGEgRmxhZyBmb3Igc2VuZGluZyBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIGlkZW50aWZ5RGF0YSBPYmplY3QgY29udGFpbmluZyBpZGVudGlmaWNhdGlvbiBkYXRhLlxuICAgKi9cbiAgaWRlbnRpZnkoc2VuZFBpaURhdGE6IGJvb2xlYW4sIGlkZW50aWZ5RGF0YTogSWRlbnRpZnlEYXRhKSB7XG4gICAgY29uc3Qgd2luZG93UmVmID0gd2luZG93IGFzIGFueTtcbiAgICBjb25zdCB7IGlkOiB1c2VySWQsIGVtYWlsIH0gPSBpZGVudGlmeURhdGEudXNlcjtcbiAgICBjb25zdCB7IG5hbWU6IHRlbmFudElEIH0gPSBpZGVudGlmeURhdGEuY3VycmVudFRlbmFudDtcbiAgICBjb25zdCB7IGluc3RhbmNlSWQgfSA9IGlkZW50aWZ5RGF0YTtcblxuICAgIC8qKlxuICAgICAqIFBhc3NpbmcgSUQgaXMgYSBtaW5pbXVtIHJlcXVpcmVkIGRhdGEgdG8gbWFrZSBhbiBpZGVudGlmeSBjYWxsIHRvIEdhaW5zaWdodC5cbiAgICAgKiBpc1VzZXJDcmVhdGVkQWZ0ZXJBbm9ueW1pemF0aW9uV2FzQWN0aXZhdGVkIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gbGF0ZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiB1c2VycyBjcmVhdGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZGF0YSBhbm9ueW1pemF0aW9uIGRvbmUgYnkgR2FpbnNpZ2h0LlxuICAgICAqIHRlbmFudElEIFVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0ZW5hbnRzIHdoZW4gc2FtZSBlbWFpbCBpcyB1c2VkIGZvciBkaWZmZXJlbnQgdGVuYW50cy5cbiAgICAgKlxuICAgICAqIER1ZSB0byBHUyBsaW1pdGF0aW9ucyAoR1MgZG9lcyBub3QgYWxsb3cgY2xlYXJpbmcgdXNlciBhdHRyL3ByZWZlcmVuY2VzIHZpYSB0aGUgR1MgdGFnISksXG4gICAgICogd2UgYWx3YXlzIG5lZWQgdG8gaW5pdGlhbGl6ZSBmaWVsZHMgcmVsYXRlZCB0byBQSUkgdG8gcHJldmVudCBsZWFraW5nIHRoaXMgZGF0YSB0byBHUyB3aGVuIHRoZSB1c2VyIGhhcyBkaXNhYmxlZCBmdW5jdGlvbmFsIGNvb2tpZXMuXG4gICAgICovXG4gICAgY29uc3QgcmVxdWlyZWRJZGVudGlmeSA9IHtcbiAgICAgIC8qKlxuICAgICAgICogRW1haWwgd2FzIG5vdCBtYW5kYXRvcnkgZm9ybSBmaWVsZCB1bnRpbCAxMC4xNFxuICAgICAgICovXG4gICAgICBpZDogZW1haWwgPyBlbWFpbCA6IGAke3VzZXJJZH1fJHt0ZW5hbnRJRH1fJHtpbnN0YW5jZUlkfWAsXG4gICAgICBpc1VzZXJDcmVhdGVkQWZ0ZXJBbm9ueW1pemF0aW9uV2FzQWN0aXZhdGVkOiB0cnVlLFxuICAgICAgdGVuYW50SUQ6IHRlbmFudElELFxuICAgICAgZW1haWw6ICctLScsXG4gICAgICB1c2VyTmFtZTogJycsXG4gICAgICBmaXJzdE5hbWU6ICcnLFxuICAgICAgbGFzdE5hbWU6ICcnLFxuICAgICAgZG9tYWluTmFtZTogJycsXG4gICAgICB2ZXJzaW9uVUk6ICcnLFxuICAgICAgdmVyc2lvbkJFOiAnJyxcbiAgICAgIHVzZXJMYW5ndWFnZTogJycsXG4gICAgICBpbnN0YW5jZUlkOiAnJyxcbiAgICAgIGV4dGVybmFsUmVmZXJlbmNlOiAnJyxcbiAgICAgIHVzZXJSb2xlczogJycsXG4gICAgICBjdXN0b21CcmFuZGluZzogdGhpcy5pc0N1c3RvbUJyYW5kaW5nKCksXG4gICAgICBmdWxsVHJhY2tpbmc6IHNlbmRQaWlEYXRhXG4gICAgfTtcblxuICAgIGlmIChzZW5kUGlpRGF0YSkge1xuICAgICAgY29uc3QgeyB1c2VyTmFtZSwgZmlyc3ROYW1lLCBsYXN0TmFtZSwgcm9sZXMgfSA9IGlkZW50aWZ5RGF0YS51c2VyO1xuICAgICAgY29uc3QgeyBjdXN0b21Qcm9wZXJ0aWVzLCBkb21haW5OYW1lIH0gPSBpZGVudGlmeURhdGEuY3VycmVudFRlbmFudDtcbiAgICAgIGNvbnN0IHsgdmVyc2lvblVJLCB2ZXJzaW9uQkUgfSA9IGlkZW50aWZ5RGF0YTtcblxuICAgICAgY29uc3QgZXh0ZW5kZWRJZGVudGlmeSA9IHtcbiAgICAgICAgLi4ucmVxdWlyZWRJZGVudGlmeSxcbiAgICAgICAgZW1haWwsXG4gICAgICAgIHVzZXJOYW1lLFxuICAgICAgICBmaXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lLFxuICAgICAgICBkb21haW5OYW1lLFxuICAgICAgICB2ZXJzaW9uVUksXG4gICAgICAgIHZlcnNpb25CRSxcbiAgICAgICAgdXNlckxhbmd1YWdlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcsXG4gICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgIGV4dGVybmFsUmVmZXJlbmNlOiBjdXN0b21Qcm9wZXJ0aWVzPy5leHRlcm5hbFJlZmVyZW5jZSxcbiAgICAgICAgdXNlclJvbGVzOiB0aGlzLnRyYW5zZm9ybVVzZXJSb2xlc1RvU3RyKHJvbGVzPy5yZWZlcmVuY2VzKVxuICAgICAgfTtcblxuICAgICAgd2luZG93UmVmW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0oJ2lkZW50aWZ5JywgZXh0ZW5kZWRJZGVudGlmeSwge1xuICAgICAgICBpZDogYCR7dGVuYW50SUR9XyR7aW5zdGFuY2VJZH1gLFxuICAgICAgICBpbnN0YW5jZUlkXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3aW5kb3dSZWZbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXSgnaWRlbnRpZnknLCByZXF1aXJlZElkZW50aWZ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhbiBldmVudCB0byBiZSByZWNvcmRlZCBieSBHYWluc2lnaHQgUFguXG4gICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBHYWluc2lnaHQgUFgncyB0cmFja2luZyBtZWNoYW5pc20gdG8gbG9nIGEgc3BlY2lmaWMgZXZlbnRcbiAgICogYWxvbmcgd2l0aCBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gTmFtZSBvZiB0aGUgZXZlbnQgdG8gYmUgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBPcHRpb25hbCBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuXG4gICAqL1xuICB0cmlnZ2VyRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BzPzogUHhFdmVudERhdGEpIHtcbiAgICBpZiAodGhpcy50YWdGdW5jdGlvbiAmJiBldmVudE5hbWUpIHtcbiAgICAgIGV2ZW50TmFtZSA9IHRoaXMucHJlcGFyZUV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgICAgdGhpcy50YWdGdW5jdGlvbigndHJhY2snLCBldmVudE5hbWUsIHByb3BzKTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVUb0VuZ2xpc2godGV4dFRvVHJhbnNsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY3VycmVudExhbmcgfSA9IHRoaXMudHJhbnNsYXRlU2VydmljZTtcblxuICAgIGlmIChjdXJyZW50TGFuZyA9PT0gJ2VuJykge1xuICAgICAgcmV0dXJuIHRleHRUb1RyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudExhbmcgJiYgY3VycmVudExhbmcgIT09IHRoaXMuY2FjaGVkTGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zKSB7XG4gICAgICB0aGlzLmNhY2hlZExhbmd1YWdlID0gY3VycmVudExhbmc7XG4gICAgICB0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zID0gdGhpcy5nZXRSZXZlcnRlZFRyYW5zbGF0aW9ucyhjdXJyZW50TGFuZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5UcmFuc2xhdGlvbih0ZXh0VG9UcmFuc2xhdGUsIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiAoUElJKSBzaG91bGQgYmUgc2VudCB3aGlsZSBsb2FkaW5nIGEgdGFnLlxuICAgKiBUaGUgZGVjaXNpb24gdG8gYWN0aXZhdGUgR2FpbnNpZ2h0IGFuZCBzZW5kIFBJSSByZWxpZXMgb24gd2hldGhlciB0aGUgY29va2llUHJlZmVyZW5jZXMgb3B0aW9uIGlzIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLFxuICAgKiBpZiB0aGUgZnVuY3Rpb25hbCBjb29raWUgaXMgZW5hYmxlZCwgYW5kIGlmIHRoZSB1c2VyIGdyYW50cyBwZXJtaXNzaW9uLlxuICAgKi9cbiAgYXN5bmMgc2hvdWxkU2VuZFBpaURhdGEoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0NvbmZpZ0Nvb2tpZVByZWZlcmVuY2VzRGVmaW5lZCgpICYmXG4gICAgICB0aGlzLmNvb2tpZUJhbm5lclNlcnZpY2UuaXNGdW5jdGlvbmFsQ29va2llRW5hYmxlZCgpICYmXG4gICAgICAhKGF3YWl0IHRoaXMuaXNHYWluc2lnaHRQcmVmZXJlbmNlRGlzYWJsZWRJblVzZXJQcmVmZXJlbmNlcyhcbiAgICAgICAgdGhpcy5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9LRVlcbiAgICAgICkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgc3BlY2lmaWMgdXNlciBhdHRyaWJ1dGUgaW4gdGhlIEdhaW5zaWdodCBnbG9iYWwgc2NvcGUuXG4gICAqIFRoaXMgbWV0aG9kIGludGVyZmFjZXMgd2l0aCB0aGUgR2FpbnNpZ2h0IGdsb2JhbCBvYmplY3QgdG8gc2V0IGEgdXNlcidzIHNwZWNpZmljIGF0dHJpYnV0ZSB3aXRoIGEgcHJvdmlkZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgdXNlciBhdHRyaWJ1dGUgdG8gYmUgdXBkYXRlZC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc2V0IGZvciB0aGUgc3BlY2lmaWVkIHVzZXIgYXR0cmlidXRlLlxuICAgKi9cbiAgdXBkYXRlVXNlckF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyIHwgYm9vbGVhbik6IHZvaWQge1xuICAgIHdpbmRvd1t0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdPy4oJ3NldCcsICd1c2VyJywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgdGhlIGNhcGFiaWxpdHkgdG8gbW9kaWZ5IEdhaW5zaWdodCBQWCBzZXR0aW5ncy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIG11bHRpcGxlIGNvbmRpdGlvbnM6XG4gICAqIDEuIFdoZXRoZXIgdHJhY2tpbmcgaGFzIGJlZW4gZGlzYWJsZWQgZ2xvYmFsbHkgdmlhIGFwcGxpY2F0aW9uIG9wdGlvbnMuXG4gICAqIDIuIFdoZXRoZXIgR2FpbnNpZ2h0IGlzIGRpc2FibGVkIGF0IHRoZSB0ZW5hbnQgbGV2ZWwgdGhyb3VnaCBjdXN0b20gcHJvcGVydGllcy5cbiAgICogMy4gV2hldGhlciBhIEdhaW5zaWdodCBrZXkgaXMgYXZhaWxhYmxlLCBlaXRoZXIgY3VycmVudGx5IGxvYWRlZCBvciBmZXRjaGVkIGFzeW5jaHJvbm91c2x5LlxuICAgKiA0LiBXaGV0aGVyIGNvb2tpZSBwcmVmZXJlbmNlcyBhcmUgZGVmaW5lZCBhbmQgYXZhaWxhYmxlIGZvciB0aGUgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbi4gVHJ1ZSBpbmRpY2F0ZXMgdGhlIHVzZXIgY2FuIGVkaXQgcHJvZHVjdCBleHBlcmllbmNlIHNldHRpbmdzLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgY2FuRWRpdFByb2R1Y3RFeHBlcmllbmNlU2V0dGluZ3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY3VycmVudFRlbmFudCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC52YWx1ZTtcbiAgICBjb25zdCB7IGN1c3RvbVByb3BlcnRpZXMgfSA9IGN1cnJlbnRUZW5hbnQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1RyYWNraW5nRGlzYWJsZWQoKSB8fFxuICAgICAgdGhpcy5pc0dhaW5zaWdodERpc2FibGVkQXRUZW5hbnRDdXN0b21Qcm9wZXJ0aWVzKGN1c3RvbVByb3BlcnRpZXMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGdhaW5zaWdodEtleSA9ICEhdGhpcy5nYWluc2lnaHRLZXkgfHwgISEoYXdhaXQgdGhpcy5nZXRHYWluc2lnaHRLZXkoKSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGdhaW5zaWdodEtleSAmJlxuICAgICAgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzQ29uZmlnQ29va2llUHJlZmVyZW5jZXNEZWZpbmVkKCkgJiZcbiAgICAgICEhdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmdldFVzZXJDb29raWVQcmVmZXJlbmNlcygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnbG9iYWwgY29udGV4dCBmb3IgR2FpbnNpZ2h0IHdpdGggdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gbmFtZS5cbiAgICogVGhlIGdsb2JhbCBjb250ZXh0IGNhbiBiZSB1dGlsaXplZCBieSBHYWluc2lnaHQgZm9yIHZhcmlvdXMgcHVycG9zZXMsIHN1Y2ggYXMgc2VnbWVudGluZyB1c2Vycy5cbiAgICovXG4gIHNldEdsb2JhbENvbnRleHQoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudEFwcFN0YXRlID0gdGhpcy5hcHBTdGF0ZS5zdGF0ZSQudmFsdWU7XG4gICAgY29uc3QgY3VycmVudEFwcE5hbWUgPSBjdXJyZW50QXBwU3RhdGUuYXBwLm5hbWU7XG5cbiAgICB3aW5kb3dbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXT8uKCdzZXQnLCAnZ2xvYmFsQ29udGV4dCcsIHsgcHJvamVjdE5hbWU6IGN1cnJlbnRBcHBOYW1lIH0pO1xuICB9XG5cbiAgdHJhbnNmb3JtVXNlclJvbGVzVG9TdHIodXNlclJvbGVzPzogSUlkZW50aWZpZWRbXSk6IHN0cmluZyB7XG4gICAgaWYgKCF1c2VyUm9sZXMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcCh1c2VyUm9sZXMsICh1c2VyUm9sZTogeyByb2xlOiBVc2VyUm9sZSB9KSA9PiB1c2VyUm9sZS5yb2xlLm5hbWUpLmpvaW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgR2FpbnNpZ2h0IGlzIGRpc2FibGVkIGJhc2VkIG9uIHRlbmFudCBjdXN0b20gcHJvcGVydGllcy5cbiAgICpcbiAgICogQHBhcmFtIGN1c3RvbVByb3BlcnRpZXMgLSBUaGUgY3VzdG9tIHByb3BlcnRpZXMgb2YgdGhlIHRlbmFudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiBHYWluc2lnaHQgaXMgZGlzYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzR2FpbnNpZ2h0RGlzYWJsZWRBdFRlbmFudEN1c3RvbVByb3BlcnRpZXMoY3VzdG9tUHJvcGVydGllczogSUN1c3RvbVByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBnYWluc2lnaHRFbmFibGVkID0gY3VzdG9tUHJvcGVydGllcyAmJiBjdXN0b21Qcm9wZXJ0aWVzLmdhaW5zaWdodEVuYWJsZWQ7XG4gICAgcmV0dXJuIGdhaW5zaWdodEVuYWJsZWQgPT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgY3VzdG9tIGJyYW5kaW5nIGlzIGVuYWJsZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgYnJhbmQgbG9nby5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiBjdXN0b20gYnJhbmRpbmcgaXMgYXBwbGllZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNDdXN0b21CcmFuZGluZygpOiBib29sZWFuIHtcbiAgICBjb25zdCBicmFuZGluZ0Nzc1ZhcnMgPSB0aGlzLm9wdGlvbnMuZ2V0KCdicmFuZGluZ0Nzc1ZhcnMnKSB8fCB7fTtcbiAgICByZXR1cm4gISFicmFuZGluZ0Nzc1ZhcnNbJ2JyYW5kLWxvZ28taW1nJ107XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0cmFja2luZyBpcyBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgYXBwbGljYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRyYWNraW5nIGlzIGRpc2FibGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIGlzVHJhY2tpbmdEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRpc2FibGVUcmFja2luZyA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUV2ZW50TmFtZShiYXNlRXZlbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlRXZlbnROYW1lXG4gICAgICAuc3BsaXQoJzonKVxuICAgICAgLm1hcChldmVudE5hbWVQYXJ0ID0+IGNhbWVsQ2FzZShyZW1vdmVUcmFuc2xhdGlvbkNvbnRleHQoZXZlbnROYW1lUGFydCkpKVxuICAgICAgLmpvaW4oJzonKTtcblxuICAgIGZ1bmN0aW9uIHJlbW92ZVRyYW5zbGF0aW9uQ29udGV4dChldmVudE5hbWVQYXJ0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGV2ZW50TmFtZVBhcnQucmVwbGFjZSgvYFtcXHdcXFddKmAvZywgJycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZFNjcmlwdFRhZyhzY3JpcHRUYWc6IEhUTUxTY3JpcHRFbGVtZW50LCBrZXk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3aW5kb3dSZWYgPSB3aW5kb3cgYXMgYW55O1xuICAgICAgY29uc3QgZmlyc3RUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgICBjb25zdCBwcm90b2NvbCA9IGxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgY29uc3QgZ2FpbnNpZ2h0R2xvYmFsU2NvcGUgPSB0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEU7XG4gICAgICBzY3JpcHRUYWcuc3JjID0gYCR7cHJvdG9jb2x9Ly8ke3RoaXMuR0FJTlNJR0hUX1VSTH0ke2tleX1gO1xuICAgICAgKHdpbmRvd1JlZlt0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdID1cbiAgICAgICAgd2luZG93UmVmW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0gfHxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm9ubHktYXJyb3ctZnVuY3Rpb25zXG4gICAgICAgIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgKHdpbmRvd1JlZltnYWluc2lnaHRHbG9iYWxTY29wZV0ucSA9IHdpbmRvd1JlZltnYWluc2lnaHRHbG9iYWxTY29wZV0ucSB8fCBbXSkucHVzaChhcmdzKTtcbiAgICAgICAgfSksXG4gICAgICAgICh3aW5kb3dSZWZbZ2FpbnNpZ2h0R2xvYmFsU2NvcGVdLnAgPSBrZXkpO1xuICAgICAgc2NyaXB0VGFnLmFzeW5jID0gdHJ1ZTtcbiAgICAgIGZpcnN0VGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNjcmlwdFRhZywgZmlyc3RUYWcpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIEdhaW5zaWdodCBQWCcsIGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEluc3RhbmNlSWRGcm9tVXJsKCkge1xuICAgIGNvbnN0IGhvc3ROYW1lID0gbG9jYXRpb24uaG9zdG5hbWU7XG4gICAgcmV0dXJuIGhvc3ROYW1lLnN1YnN0cmluZyhob3N0TmFtZS5pbmRleE9mKCcuJykgKyAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlcyB0aGUgdHJhbnNsYXRpb24gb2JqZWN0LlxuICAgKlxuICAgKiAqKkV4YW1wbGUqKlxuICAgKiB7IEFkZCB3aWRnZXQ6IFwiV2lkZ2V0IGhpbnp1ZsO8Z2VuXCIgfVxuICAgKlxuICAgKiB3aWxsIGJlIGNoYW5nZWQgdG86XG4gICAqXG4gICAqIHsgV2lkZ2V0IGhpbnp1ZsO8Z2VuOiBcIkFkZCB3aWRnZXRcIiB9XG4gICAqXG4gICAqIEBwYXJhbSBjdXJyZW50TGFuZyBMYW5ndWFnZSB3aG9zZSB0cmFuc2xhdGVkIHZhbHVlcyBhcmUgdG8gYmUgcGxhY2VkIGluIHRoZSBvYmplY3Qga2V5LlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGludmVydGVkIG9iamVjdCB3aGVyZSB0aGUga2V5cyBoYXZlIGJlZW4gc3dhcHBlZCB3aXRoIHRoZSB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIGdldFJldmVydGVkVHJhbnNsYXRpb25zKGN1cnJlbnRMYW5nOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RvcmUudHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXTtcblxuICAgIGNvbnN0IHN3YXBwZWRLZXlzV2l0aFZhbHVlcyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHRyYW5zbGF0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgc3dhcHBlZEtleXNXaXRoVmFsdWVzW3RyYW5zbGF0aW9uc1trZXldXSA9IGtleTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3dhcHBlZEtleXNXaXRoVmFsdWVzO1xuICB9XG5cbiAgLyoqVHJhbnNsYXRlcyBzdHJpbmcgYmFjayBpbnRvIEVuZ2xpc2guXG4gICAqIElmIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGxhbmd1YWdlIGlzIHNldCB0byBFbmdsaXNoLCB0aGUgc3RyaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudCBpcyByZXR1cm5lZC5cbiAgICogQHBhcmFtIHRleHRUb1RyYW5zbGF0ZSBzdHJpbmcgdG8gdHJhbnNsYXRlLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzdHJpbmcgdHJhbnNsYXRlZCBpbnRvIEVuZ2xpc2guXG4gICAqL1xuICBwcml2YXRlIGdldEVuVHJhbnNsYXRpb24oXG4gICAgdGV4dFRvVHJhbnNsYXRlOiBzdHJpbmcsXG4gICAgdHJhbnNsYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9XG4gICk6IHN0cmluZyB7XG4gICAgbGV0IGVuVHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbdGV4dFRvVHJhbnNsYXRlXTtcbiAgICBpZiAoIWVuVHJhbnNsYXRpb24pIHtcbiAgICAgIHJldHVybiB0ZXh0VG9UcmFuc2xhdGU7XG4gICAgfVxuICAgIC8qKiByZW1vdmUgdHJhbnNsYXRpb24gY29udGV4dCAqL1xuICAgIGNvbnN0IHJlZ2V4ID0gL1xcYCguKj8pXFxgLztcbiAgICBlblRyYW5zbGF0aW9uID0gZW5UcmFuc2xhdGlvbi5yZXBsYWNlKHJlZ2V4LCAnJyk7XG5cbiAgICByZXR1cm4gZW5UcmFuc2xhdGlvbjtcbiAgfVxufVxuIl19
@@ -2,4 +2,5 @@ export * from './gainsight.service';
2
2
  export * from './product-experience.directive';
3
3
  export * from './product-experience.model';
4
4
  export * from './product-experience.module';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nYWluc2lnaHQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kdWxlJztcbiJdfQ==
5
+ export * from './user-engagements.service';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2dhaW5zaWdodC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZHVjdC1leHBlcmllbmNlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyLWVuZ2FnZW1lbnRzLnNlcnZpY2UnO1xuIl19