@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
@@ -3,59 +3,77 @@ import { combineLatest } from 'rxjs';
3
3
  import { filter } from 'rxjs/operators';
4
4
  import { CookieBannerService } from '../bootstrap/cookie-banner/cookie-banner.service';
5
5
  import { AppStateService } from '../common/ui-state.service';
6
- import { UserPreferencesService } from '../common/user-preferences/user-preferences.service';
7
6
  import { GainsightService } from './gainsight.service';
8
7
  import { ProductExperienceDirective } from './product-experience.directive';
8
+ import { UserEngagementsService } from './user-engagements.service';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "../common/ui-state.service";
11
11
  import * as i2 from "./gainsight.service";
12
12
  import * as i3 from "../bootstrap/cookie-banner/cookie-banner.service";
13
- import * as i4 from "../common/user-preferences/user-preferences.service";
13
+ import * as i4 from "./user-engagements.service";
14
14
  /**
15
15
  * This module enables an tenant to activate the product experience
16
16
  * software [Gainsight](https://www.gainsight.com/product-experience/) to help
17
- * and track user actions. Gainsight is only activated, if the tenant custom
18
- * property `gainsightEnabled` is set to true.
17
+ * and track user actions.
19
18
  */
20
19
  export class ProductExperienceModule {
21
- constructor(appState, gainsightService, cookieBannerService, userPreferencesService) {
20
+ constructor(appState, gainsightService, cookieBannerService,
21
+ // Don't remove it, otherwise UserEngagementsService won't be initialized.
22
+ userEngagementsService) {
22
23
  this.appState = appState;
23
24
  this.gainsightService = gainsightService;
24
25
  this.cookieBannerService = cookieBannerService;
25
- this.userPreferencesService = userPreferencesService;
26
+ this.userEngagementsService = userEngagementsService;
27
+ /**
28
+ * Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
29
+ */
30
+ if (this.gainsightService.isTrackingDisabled()) {
31
+ return;
32
+ }
33
+ this.toggleUserTrackingObservable();
34
+ }
35
+ /**
36
+ * Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
37
+ * It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
38
+ *
39
+ * 1. If the cookie banner is being displayed, it returns without making any changes.
40
+ * 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
41
+ * 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
42
+ */
43
+ toggleUserTrackingObservable() {
26
44
  combineLatest([
27
45
  this.appState.currentTenant.pipe(filter(Boolean)),
28
- this.cookieBannerService.isCookieBannerShowed$,
29
- this.userPreferencesService.observe(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY)
30
- ]).subscribe(async ([currentTenant, isCookieBannerShowed, showGainsightEngagements]) => {
46
+ this.cookieBannerService.isCookieBannerShowed$
47
+ ]).subscribe(async ([currentTenant, isCookieBannerShowed]) => {
31
48
  if (isCookieBannerShowed) {
32
49
  return;
33
50
  }
34
51
  const { customProperties } = currentTenant;
35
- if (this.gainsightService.shouldLoadGainsightTag(customProperties) &&
36
- !(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY))) {
37
- this.gainsightService.loadTag(currentTenant);
52
+ if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
53
+ return;
38
54
  }
39
- /**
40
- * In case the user preference for Gainsight bot does not exist the default value is set to true and saved in user preferences
41
- */
42
- if (showGainsightEngagements === undefined) {
43
- showGainsightEngagements = true;
44
- userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, showGainsightEngagements);
55
+ if (this.shouldLoadTag()) {
56
+ await this.gainsightService.loadTag(currentTenant, await this.gainsightService.shouldSendPiiData());
45
57
  }
46
- this.gainsightService.switchGainsightEngagementsVisibility(showGainsightEngagements);
47
58
  });
48
59
  }
60
+ /**
61
+ * Determines if a tracking tag should be loaded based on cookie preferences.
62
+ * @returns `true` if user cookie preferences exist, otherwise `false`.
63
+ */
64
+ shouldLoadTag() {
65
+ return !!this.cookieBannerService.getUserCookiePreferences();
66
+ }
49
67
  }
50
- ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: i1.AppStateService }, { token: i2.GainsightService }, { token: i3.CookieBannerService }, { token: i4.UserPreferencesService }], target: i0.ɵɵFactoryTarget.NgModule });
68
+ ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: i1.AppStateService }, { token: i2.GainsightService }, { token: i3.CookieBannerService }, { token: i4.UserEngagementsService }], target: i0.ɵɵFactoryTarget.NgModule });
51
69
  ProductExperienceModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] });
52
- ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService] });
70
+ ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] });
53
71
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, decorators: [{
54
72
  type: NgModule,
55
73
  args: [{
56
74
  declarations: [ProductExperienceDirective],
57
75
  exports: [ProductExperienceDirective],
58
- providers: [GainsightService]
76
+ providers: [GainsightService, UserEngagementsService]
59
77
  }]
60
- }], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.GainsightService }, { type: i3.CookieBannerService }, { type: i4.UserPreferencesService }]; } });
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1leHBlcmllbmNlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvcHJvZHVjdC1leHBlcmllbmNlL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDN0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7OztBQUM1RTs7Ozs7R0FLRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFDVSxRQUF5QixFQUN6QixnQkFBa0MsRUFDbEMsbUJBQXdDLEVBQ3hDLHNCQUE4QztRQUg5QyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUV0RCxhQUFhLENBQUM7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFpQixPQUFPLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCO1lBQzlDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywwQ0FBMEMsQ0FDakU7U0FDRixDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLEVBQUU7WUFDckYsSUFBSSxvQkFBb0IsRUFBRTtnQkFDeEIsT0FBTzthQUNSO1lBQ0QsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsYUFBYSxDQUFDO1lBQzNDLElBQ0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDO2dCQUM5RCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsOENBQThDLENBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw4QkFBOEIsQ0FDckQsQ0FBQyxFQUNGO2dCQUNBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDOUM7WUFFRDs7ZUFFRztZQUNILElBQUksd0JBQXdCLEtBQUssU0FBUyxFQUFFO2dCQUMxQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7Z0JBQ2hDLHNCQUFzQixDQUFDLEdBQUcsQ0FDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBDQUEwQyxFQUNoRSx3QkFBd0IsQ0FDekIsQ0FBQzthQUNIO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9DQUFvQyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDdkYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztvSEF2Q1UsdUJBQXVCO3FIQUF2Qix1QkFBdUIsaUJBSm5CLDBCQUEwQixhQUMvQiwwQkFBMEI7cUhBR3pCLHVCQUF1QixhQUZ2QixDQUFDLGdCQUFnQixDQUFDOzJGQUVsQix1QkFBdUI7a0JBTG5DLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsMEJBQTBCLENBQUM7b0JBQzFDLE9BQU8sRUFBRSxDQUFDLDBCQUEwQixDQUFDO29CQUNyQyxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUN1cnJlbnRUZW5hbnQgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29raWVCYW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYm9vdHN0cmFwL2Nvb2tpZS1iYW5uZXIvY29va2llLWJhbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdXNlci1wcmVmZXJlbmNlcy91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJy4vZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvZHVjdEV4cGVyaWVuY2VEaXJlY3RpdmUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5kaXJlY3RpdmUnO1xuLyoqXG4gKiBUaGlzIG1vZHVsZSBlbmFibGVzIGFuIHRlbmFudCB0byBhY3RpdmF0ZSB0aGUgcHJvZHVjdCBleHBlcmllbmNlXG4gKiBzb2Z0d2FyZSBbR2FpbnNpZ2h0XShodHRwczovL3d3dy5nYWluc2lnaHQuY29tL3Byb2R1Y3QtZXhwZXJpZW5jZS8pIHRvIGhlbHBcbiAqIGFuZCB0cmFjayB1c2VyIGFjdGlvbnMuIEdhaW5zaWdodCBpcyBvbmx5IGFjdGl2YXRlZCwgaWYgdGhlIHRlbmFudCBjdXN0b21cbiAqIHByb3BlcnR5IGBnYWluc2lnaHRFbmFibGVkYCBpcyBzZXQgdG8gdHJ1ZS5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbUHJvZHVjdEV4cGVyaWVuY2VEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbUHJvZHVjdEV4cGVyaWVuY2VEaXJlY3RpdmVdLFxuICBwcm92aWRlcnM6IFtHYWluc2lnaHRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RXhwZXJpZW5jZU1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclByZWZlcmVuY2VzU2VydmljZTogVXNlclByZWZlcmVuY2VzU2VydmljZVxuICApIHtcbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC5waXBlKGZpbHRlcjxJQ3VycmVudFRlbmFudD4oQm9vbGVhbikpLFxuICAgICAgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzQ29va2llQmFubmVyU2hvd2VkJCxcbiAgICAgIHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZS5vYnNlcnZlPGJvb2xlYW4+KFxuICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UuVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfRU5HQUdFTUVOVFNfS0VZXG4gICAgICApXG4gICAgXSkuc3Vic2NyaWJlKGFzeW5jIChbY3VycmVudFRlbmFudCwgaXNDb29raWVCYW5uZXJTaG93ZWQsIHNob3dHYWluc2lnaHRFbmdhZ2VtZW50c10pID0+IHtcbiAgICAgIGlmIChpc0Nvb2tpZUJhbm5lclNob3dlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IGN1c3RvbVByb3BlcnRpZXMgfSA9IGN1cnJlbnRUZW5hbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5zaG91bGRMb2FkR2FpbnNpZ2h0VGFnKGN1c3RvbVByb3BlcnRpZXMpICYmXG4gICAgICAgICEoYXdhaXQgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLmlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMoXG4gICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0tFWVxuICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5sb2FkVGFnKGN1cnJlbnRUZW5hbnQpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEluIGNhc2UgdGhlIHVzZXIgcHJlZmVyZW5jZSBmb3IgR2FpbnNpZ2h0IGJvdCBkb2VzIG5vdCBleGlzdCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSBhbmQgc2F2ZWQgaW4gdXNlciBwcmVmZXJlbmNlc1xuICAgICAgICovXG4gICAgICBpZiAoc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzID0gdHJ1ZTtcbiAgICAgICAgdXNlclByZWZlcmVuY2VzU2VydmljZS5zZXQoXG4gICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0VOR0FHRU1FTlRTX0tFWSxcbiAgICAgICAgICBzaG93R2FpbnNpZ2h0RW5nYWdlbWVudHNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5zd2l0Y2hHYWluc2lnaHRFbmdhZ2VtZW50c1Zpc2liaWxpdHkoc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
78
+ }], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.GainsightService }, { type: i3.CookieBannerService }, { type: i4.UserEngagementsService }]; } });
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1leHBlcmllbmNlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvcHJvZHVjdC1leHBlcmllbmNlL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7OztBQUNwRTs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLHVCQUF1QjtJQUNsQyxZQUNVLFFBQXlCLEVBQ3pCLGdCQUFrQyxFQUNsQyxtQkFBd0M7SUFDaEQsMEVBQTBFO0lBQ2xFLHNCQUE4QztRQUo5QyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFFeEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUV0RDs7V0FFRztRQUNILElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDOUMsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCw0QkFBNEI7UUFDMUIsYUFBYSxDQUFDO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBaUIsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQjtTQUMvQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLEVBQUU7WUFDM0QsSUFBSSxvQkFBb0IsRUFBRTtnQkFDeEIsT0FBTzthQUNSO1lBQ0QsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsYUFBYSxDQUFDO1lBRTNDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLDJDQUEyQyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQ3ZGLE9BQU87YUFDUjtZQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO2dCQUN4QixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQ2pDLGFBQWEsRUFDYixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUNoRCxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhO1FBQ1gsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDL0QsQ0FBQzs7b0hBdERVLHVCQUF1QjtxSEFBdkIsdUJBQXVCLGlCQUpuQiwwQkFBMEIsYUFDL0IsMEJBQTBCO3FIQUd6Qix1QkFBdUIsYUFGdkIsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQzsyRkFFMUMsdUJBQXVCO2tCQUxuQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLDBCQUEwQixDQUFDO29CQUMxQyxPQUFPLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztvQkFDckMsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsc0JBQXNCLENBQUM7aUJBQ3REIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDdXJyZW50VGVuYW50IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29va2llQmFubmVyU2VydmljZSB9IGZyb20gJy4uL2Jvb3RzdHJhcC9jb29raWUtYmFubmVyL2Nvb2tpZS1iYW5uZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBHYWluc2lnaHRTZXJ2aWNlIH0gZnJvbSAnLi9nYWluc2lnaHQuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpZW5jZURpcmVjdGl2ZSB9IGZyb20gJy4vcHJvZHVjdC1leHBlcmllbmNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBVc2VyRW5nYWdlbWVudHNTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLWVuZ2FnZW1lbnRzLnNlcnZpY2UnO1xuLyoqXG4gKiBUaGlzIG1vZHVsZSBlbmFibGVzIGFuIHRlbmFudCB0byBhY3RpdmF0ZSB0aGUgcHJvZHVjdCBleHBlcmllbmNlXG4gKiBzb2Z0d2FyZSBbR2FpbnNpZ2h0XShodHRwczovL3d3dy5nYWluc2lnaHQuY29tL3Byb2R1Y3QtZXhwZXJpZW5jZS8pIHRvIGhlbHBcbiAqIGFuZCB0cmFjayB1c2VyIGFjdGlvbnMuXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1Byb2R1Y3RFeHBlcmllbmNlRGlyZWN0aXZlXSxcbiAgZXhwb3J0czogW1Byb2R1Y3RFeHBlcmllbmNlRGlyZWN0aXZlXSxcbiAgcHJvdmlkZXJzOiBbR2FpbnNpZ2h0U2VydmljZSwgVXNlckVuZ2FnZW1lbnRzU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdEV4cGVyaWVuY2VNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFwcFN0YXRlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29va2llQmFubmVyU2VydmljZTogQ29va2llQmFubmVyU2VydmljZSxcbiAgICAvLyBEb24ndCByZW1vdmUgaXQsIG90aGVyd2lzZSBVc2VyRW5nYWdlbWVudHNTZXJ2aWNlIHdvbid0IGJlIGluaXRpYWxpemVkLlxuICAgIHByaXZhdGUgdXNlckVuZ2FnZW1lbnRzU2VydmljZTogVXNlckVuZ2FnZW1lbnRzU2VydmljZVxuICApIHtcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgR2FpbnNpZ2h0IHRyYWNraW5nIGlzIGRpc2FibGVkIGluIHRoZSBhcHBsaWNhdGlvbiBhcHB0aW9ucy4gSWYgc28sIGV4aXQgZWFybHkgd2l0aG91dCBwcm9jZXNzaW5nIGZ1cnRoZXIuXG4gICAgICovXG4gICAgaWYgKHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5pc1RyYWNraW5nRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZVVzZXJUcmFja2luZ09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlcyBzZXZlcmFsIGZhY3RvcnMgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0ZSBvZiB1c2VyIHRyYWNraW5nIGFuZCBtYW5hZ2VzIHRoZSB2aXNpYmlsaXR5IG9mIEdhaW5zaWdodCBlbmdhZ2VtZW50cy5cbiAgICogSXQgd2F0Y2hlcyBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB0ZW5hbnQsIHRoZSBzdGF0ZSBvZiB0aGUgY29va2llIGJhbm5lciwgYW5kIHVzZXIncyBwcmVmZXJlbmNlcyBmb3IgR2FpbnNpZ2h0IGVuZ2FnZW1lbnRzLlxuICAgKlxuICAgKiAxLiBJZiB0aGUgY29va2llIGJhbm5lciBpcyBiZWluZyBkaXNwbGF5ZWQsIGl0IHJldHVybnMgd2l0aG91dCBtYWtpbmcgYW55IGNoYW5nZXMuXG4gICAqIDIuIElmIEdhaW5zaWdodCBpcyBkaXNhYmxlZCBhdCB0aGUgdGVuYW50IGxldmVsIHZpYSBjdXN0b20gcHJvcGVydGllcywgaXQgcmV0dXJucyB3aXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcy5cbiAgICogMy4gSWYgdGhlIGNvbmRpdGlvbnMgYXJlIG1ldCBmb3IgbG9hZGluZyB0aGUgR2FpbnNpZ2h0IHRhZywgaXQgbG9hZHMgdGhlIHRhZy5cbiAgICovXG4gIHRvZ2dsZVVzZXJUcmFja2luZ09ic2VydmFibGUoKSB7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmFwcFN0YXRlLmN1cnJlbnRUZW5hbnQucGlwZShmaWx0ZXI8SUN1cnJlbnRUZW5hbnQ+KEJvb2xlYW4pKSxcbiAgICAgIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0Nvb2tpZUJhbm5lclNob3dlZCRcbiAgICBdKS5zdWJzY3JpYmUoYXN5bmMgKFtjdXJyZW50VGVuYW50LCBpc0Nvb2tpZUJhbm5lclNob3dlZF0pID0+IHtcbiAgICAgIGlmIChpc0Nvb2tpZUJhbm5lclNob3dlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IGN1c3RvbVByb3BlcnRpZXMgfSA9IGN1cnJlbnRUZW5hbnQ7XG5cbiAgICAgIGlmICh0aGlzLmdhaW5zaWdodFNlcnZpY2UuaXNHYWluc2lnaHREaXNhYmxlZEF0VGVuYW50Q3VzdG9tUHJvcGVydGllcyhjdXN0b21Qcm9wZXJ0aWVzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZExvYWRUYWcoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmdhaW5zaWdodFNlcnZpY2UubG9hZFRhZyhcbiAgICAgICAgICBjdXJyZW50VGVuYW50LFxuICAgICAgICAgIGF3YWl0IHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5zaG91bGRTZW5kUGlpRGF0YSgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIHRyYWNraW5nIHRhZyBzaG91bGQgYmUgbG9hZGVkIGJhc2VkIG9uIGNvb2tpZSBwcmVmZXJlbmNlcy5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHVzZXIgY29va2llIHByZWZlcmVuY2VzIGV4aXN0LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHNob3VsZExvYWRUYWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmdldFVzZXJDb29raWVQcmVmZXJlbmNlcygpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,174 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { DOCUMENT as Document } from '@angular/common';
3
+ import { BehaviorSubject, combineLatest, from, of } from 'rxjs';
4
+ import { UserPreferencesService } from '../common/user-preferences/user-preferences.service';
5
+ import { GainsightService } from './gainsight.service';
6
+ import { switchMap, take, tap } from 'rxjs/operators';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../common/user-preferences/user-preferences.service";
9
+ import * as i2 from "./gainsight.service";
10
+ export class UserEngagementsService {
11
+ constructor(document, userPreferencesService, gainsightService) {
12
+ this.document = document;
13
+ this.userPreferencesService = userPreferencesService;
14
+ this.gainsightService = gainsightService;
15
+ this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
16
+ this.userEngagementsEnabled$ = new BehaviorSubject(false);
17
+ this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
18
+ this.ENGAGEMENTS = 'engagements';
19
+ this.handleUserEngagements();
20
+ }
21
+ /**
22
+ * Handles user engagement settings based on various conditions.
23
+ *
24
+ * - Waits for the Gainsight tracking to be loaded.
25
+ * - Retrieves the engagement settings.
26
+ * - Updates the engagement settings based on the combined observations.
27
+ * - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
28
+ */
29
+ handleUserEngagements() {
30
+ this.gainsightService.trackingLoaded$
31
+ .pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
32
+ .subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
33
+ }
34
+ /**
35
+ * Updates the user's preference for Gainsight Engagements.
36
+ * @param {boolean} isEnabled - The new value for the user's engagement preference.
37
+ */
38
+ updateUserEngagementPreference(isEnabled) {
39
+ this.userEngagementsEnabled$.next(isEnabled);
40
+ this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
41
+ }
42
+ /**
43
+ * Toggles the visibility of Gainsight Engagements based on the provided flag.
44
+ *
45
+ * @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
46
+ */
47
+ toggleGainsightEngagements(isEnabled) {
48
+ isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
49
+ }
50
+ /**
51
+ * Constructs an observable that emits an array of boolean values representing
52
+ * the current engagement settings. The observable combines the latest values from:
53
+ *
54
+ * 1. User's preferences for Gainsight engagements.
55
+ * 2. A flag indicating if PII data should be sent.
56
+ * 3. A flag indicating if the platform uses custom branding.
57
+ *
58
+ * @returns An observable emitting an array of boolean values.
59
+ */
60
+ getEngagementSettingsObservable() {
61
+ return combineLatest([
62
+ this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
63
+ from(this.gainsightService.shouldSendPiiData()),
64
+ of(this.gainsightService.isCustomBranding())
65
+ ]);
66
+ }
67
+ /**
68
+ * Updates user engagement settings based on provided preferences and settings.
69
+ *
70
+ * Based on the received values, the method decides to:
71
+ * 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
72
+ * 2. Update the user engagement preference if the user engagement bot setting is undefined.
73
+ *
74
+ * @param userEngagementBotSetting - The user's setting for the engagement bot.
75
+ * @param shouldSendPiiData - Indicates whether PII data should be shared.
76
+ * @param hasCustomBranding - Indicates if custom branding is applied.
77
+ */
78
+ updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
79
+ if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
80
+ this.userEngagementsEnabled$.next(false);
81
+ }
82
+ else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
83
+ /**
84
+ * Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
85
+ * When custom branding is not set, we will set the user engagements in the user preferences to true by default.
86
+ */
87
+ this.updateUserEngagementPreference(!hasCustomBranding);
88
+ }
89
+ else {
90
+ this.userEngagementsEnabled$.next(userEngagementBotSetting);
91
+ }
92
+ }
93
+ /**
94
+ * Determines whether user engagements should be disabled due to PII data settings.
95
+ *
96
+ * If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
97
+ * should be disabled to prevent sharing personally identifiable information.
98
+ *
99
+ * @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
100
+ * @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
101
+ */
102
+ shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
103
+ return !shouldSendPiiData;
104
+ }
105
+ /**
106
+ * Determines if the user engagement bot setting is undefined.
107
+ *
108
+ * @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
109
+ * @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
110
+ *
111
+ * This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
112
+ */
113
+ isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
114
+ return userEngagementBotSetting === undefined;
115
+ }
116
+ /**
117
+ * Enables the visibility of Gainsight engagements.
118
+ *
119
+ * This method removes the CSS styles that hide the Gainsight engagements
120
+ * and updates the relevant user attribute to mark the engagements as visible.
121
+ */
122
+ showGainsightEngagements() {
123
+ this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
124
+ this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
125
+ }
126
+ /**
127
+ * Hides the Gainsight engagements.
128
+ *
129
+ * This method applies CSS styles to hide the Gainsight engagements
130
+ * and updates the relevant user attribute to mark the engagements as hidden.
131
+ */
132
+ hideGainsightEngagements() {
133
+ this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
134
+ this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
135
+ }
136
+ /**
137
+ * Removes the specified CSS style from the document.
138
+ *
139
+ * @param {string} styleId - The ID of the CSS style element to remove.
140
+ */
141
+ removeHidingStyle(styleId) {
142
+ const style = this.document.getElementById(styleId);
143
+ style?.remove();
144
+ }
145
+ /**
146
+ * Adds a new CSS style to the document.
147
+ *
148
+ * If the style with the specified ID already exists, the method will do nothing.
149
+ * Otherwise, it creates a new `<style>` element with the given ID and content,
150
+ * then appends it to the document head.
151
+ *
152
+ * @param {string} styleId - The ID to assign to the new style element.
153
+ * @param {string} textContent - The CSS rules to be included in the style.
154
+ */
155
+ addHidingStyle(styleId, textContent) {
156
+ if (this.document.getElementById(styleId)) {
157
+ return;
158
+ }
159
+ const style = this.document.createElement('style');
160
+ style.id = styleId;
161
+ style.textContent = textContent;
162
+ this.document.head.appendChild(style);
163
+ }
164
+ }
165
+ UserEngagementsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, deps: [{ token: Document }, { token: i1.UserPreferencesService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Injectable });
166
+ UserEngagementsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, providedIn: 'root' });
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, decorators: [{
168
+ type: Injectable,
169
+ args: [{ providedIn: 'root' }]
170
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
171
+ type: Inject,
172
+ args: [Document]
173
+ }] }, { type: i1.UserPreferencesService }, { type: i2.GainsightService }]; } });
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lbmdhZ2VtZW50cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9wcm9kdWN0LWV4cGVyaWVuY2UvdXNlci1lbmdhZ2VtZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLElBQUksUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM3RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUd0RCxNQUFNLE9BQU8sc0JBQXNCO0lBT2pDLFlBQzRCLFFBQWtCLEVBQ3BDLHNCQUE4QyxFQUM5QyxnQkFBa0M7UUFGaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNwQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFUbkMsK0NBQTBDLEdBQUcscUJBQXFCLENBQUM7UUFDbkUsNEJBQXVCLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9FLGdDQUEyQixHQUFHLGFBQWEsQ0FBQztRQUNwQyxnQkFBVyxHQUFHLGFBQWEsQ0FBQztRQU8zQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHFCQUFxQjtRQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZTthQUNsQyxJ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LEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxpQkFBaUIsQ0FBQyxPQUFlO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssY0FBYyxDQUFDLE9BQWUsRUFBRSxXQUFtQjtRQUN6RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pDLE9BQU87U0FDUjtRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELEtBQUssQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDOzttSEFwTFUsc0JBQXNCLGtCQVF2QixRQUFRO3VIQVJQLHNCQUFzQixjQURULE1BQU07MkZBQ25CLHNCQUFzQjtrQkFEbEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7MERBU00sUUFBUTswQkFBM0MsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCBhcyBEb2N1bWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuL2dhaW5zaWdodC5zZXJ2aWNlJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFVzZXJFbmdhZ2VtZW50c1NlcnZpY2Uge1xuICByZWFkb25seSBVU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9FTkdBR0VNRU5UU19LRVkgPSAnZ2FpbnNpZ2h0Qm90RW5hYmxlZCc7XG4gIHJlYWRvbmx5IHVzZXJFbmdhZ2VtZW50c0VuYWJsZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICByZWFkb25seSBISURFX0dBSU5TSUdIVF9CT1RfU1RZTEVfSUQgPSAnaGlkZS1ncy1ib3QnO1xuICBwcml2YXRlIHJlYWRvbmx5IEVOR0FHRU1FTlRTID0gJ2VuZ2FnZW1lbnRzJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERvY3VtZW50KSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuaGFuZGxlVXNlckVuZ2FnZW1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB1c2VyIGVuZ2FnZW1lbnQgc2V0dGluZ3MgYmFzZWQgb24gdmFyaW91cyBjb25kaXRpb25zLlxuICAgKlxuICAgKiAtIFdhaXRzIGZvciB0aGUgR2FpbnNpZ2h0IHRyYWNraW5nIHRvIGJlIGxvYWRlZC5cbiAgICogLSBSZXRyaWV2ZXMgdGhlIGVuZ2FnZW1lbnQgc2V0dGluZ3MuXG4gICAqIC0gVXBkYXRlcyB0aGUgZW5nYWdlbWVudCBzZXR0aW5ncyBiYXNlZCBvbiB0aGUgY29tYmluZWQgb2JzZXJ2YXRpb25zLlxuICAgKiAtIEZpbmFsbHksIHRvZ2dsZXMgdGhlIEdhaW5zaWdodCBlbmdhZ2VtZW50cyBiYXNlZCBvbiB0aGUgbGF0ZXN0IGB1c2VyRW5nYWdlbWVudHNFbmFibGVkJGAgdmFsdWUuXG4gICAqL1xuICBoYW5kbGVVc2VyRW5nYWdlbWVudHMoKSB7XG4gICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyYWNraW5nTG9hZGVkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmdldEVuZ2FnZW1lbnRTZXR0aW5nc09ic2VydmFibGUoKSksXG4gICAgICAgIHRhcCgoc2V0dGluZ3M6IFtib29sZWFuLCBib29sZWFuLCBib29sZWFuXSkgPT5cbiAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJFbmdhZ2VtZW50U2V0dGluZ3MoLi4uc2V0dGluZ3MpXG4gICAgICAgICksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnVzZXJFbmdhZ2VtZW50c0VuYWJsZWQkLnBpcGUodGFrZSgxKSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGlzRW5hYmxlZCA9PiB0aGlzLnRvZ2dsZUdhaW5zaWdodEVuZ2FnZW1lbnRzKGlzRW5hYmxlZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHVzZXIncyBwcmVmZXJlbmNlIGZvciBHYWluc2lnaHQgRW5nYWdlbWVudHMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbmFibGVkIC0gVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHVzZXIncyBlbmdhZ2VtZW50IHByZWZlcmVuY2UuXG4gICAqL1xuICB1cGRhdGVVc2VyRW5nYWdlbWVudFByZWZlcmVuY2UoaXNFbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy51c2VyRW5nYWdlbWVudHNFbmFibGVkJC5uZXh0KGlzRW5hYmxlZCk7XG4gICAgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLnNldChcbiAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9FTkdBR0VNRU5UU19LRVksXG4gICAgICB0aGlzLnVzZXJFbmdhZ2VtZW50c0VuYWJsZWQkLnZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIEdhaW5zaWdodCBFbmdhZ2VtZW50cyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZmxhZy5cbiAgICpcbiAgICogQHBhcmFtIGlzRW5hYmxlZCAtIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgR2FpbnNpZ2h0IEVuZ2FnZW1lbnRzIHNob3VsZCBiZSB2aXNpYmxlLlxuICAgKi9cbiAgdG9nZ2xlR2FpbnNpZ2h0RW5nYWdlbWVudHMoaXNFbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaXNFbmFibGVkID8gdGhpcy5zaG93R2FpbnNpZ2h0RW5nYWdlbWVudHMoKSA6IHRoaXMuaGlkZUdhaW5zaWdodEVuZ2FnZW1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgYW4gYXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMgcmVwcmVzZW50aW5nXG4gICAqIHRoZSBjdXJyZW50IGVuZ2FnZW1lbnQgc2V0dGluZ3MuIFRoZSBvYnNlcnZhYmxlIGNvbWJpbmVzIHRoZSBsYXRlc3QgdmFsdWVzIGZyb206XG4gICAqXG4gICAqIDEuIFVzZXIncyBwcmVmZXJlbmNlcyBmb3IgR2FpbnNpZ2h0IGVuZ2FnZW1lbnRzLlxuICAgKiAyLiBBIGZsYWcgaW5kaWNhdGluZyBpZiBQSUkgZGF0YSBzaG91bGQgYmUgc2VudC5cbiAgICogMy4gQSBmbGFnIGluZGljYXRpbmcgaWYgdGhlIHBsYXRmb3JtIHVzZXMgY3VzdG9tIGJyYW5kaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIGFuIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbmdhZ2VtZW50U2V0dGluZ3NPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbltdPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLm9ic2VydmU8Ym9vbGVhbj4odGhpcy5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9FTkdBR0VNRU5UU19LRVkpLFxuICAgICAgZnJvbSh0aGlzLmdhaW5zaWdodFNlcnZpY2Uuc2hvdWxkU2VuZFBpaURhdGEoKSksXG4gICAgICBvZih0aGlzLmdhaW5zaWdodFNlcnZpY2UuaXNDdXN0b21CcmFuZGluZygpKVxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdXNlciBlbmdhZ2VtZW50IHNldHRpbmdzIGJhc2VkIG9uIHByb3ZpZGVkIHByZWZlcmVuY2VzIGFuZCBzZXR0aW5ncy5cbiAgICpcbiAgICogQmFzZWQgb24gdGhlIHJlY2VpdmVkIHZhbHVlcywgdGhlIG1ldGhvZCBkZWNpZGVzIHRvOlxuICAgKiAxLiBEaXNhYmxlIHVzZXIgZW5nYWdlbWVudHMgaWYgUElJIGRhdGEgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3IgY2VydGFpbiBicmFuZGluZy9zZXR0aW5ncyBjb25kaXRpb25zIGFyZSBtZXQuXG4gICAqIDIuIFVwZGF0ZSB0aGUgdXNlciBlbmdhZ2VtZW50IHByZWZlcmVuY2UgaWYgdGhlIHVzZXIgZW5nYWdlbWVudCBib3Qgc2V0dGluZyBpcyB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyRW5nYWdlbWVudEJvdFNldHRpbmcgLSBUaGUgdXNlcidzIHNldHRpbmcgZm9yIHRoZSBlbmdhZ2VtZW50IGJvdC5cbiAgICogQHBhcmFtIHNob3VsZFNlbmRQaWlEYXRhIC0gSW5kaWNhdGVzIHdoZXRoZXIgUElJIGRhdGEgc2hvdWxkIGJlIHNoYXJlZC5cbiAgICogQHBhcmFtIGhhc0N1c3RvbUJyYW5kaW5nIC0gSW5kaWNhdGVzIGlmIGN1c3RvbSBicmFuZGluZyBpcyBhcHBsaWVkLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVVc2VyRW5nYWdlbWVudFNldHRpbmdzKFxuICAgIHVzZXJFbmdhZ2VtZW50Qm90U2V0dGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICBzaG91bGRTZW5kUGlpRGF0YTogYm9vbGVhbixcbiAgICBoYXNDdXN0b21CcmFuZGluZzogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG91bGREaXNhYmxlVXNlckVuZ2FnZW1lbnRzRHVlVG9QSUlEYXRhKHNob3VsZFNlbmRQaWlEYXRhKSkge1xuICAgICAgdGhpcy51c2VyRW5nYWdlbWVudHNFbmFibGVkJC5uZXh0KGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNVc2VyRW5nYWdlbWVudEJvdFNldHRpbmdVbmRlZmluZWQodXNlckVuZ2FnZW1lbnRCb3RTZXR0aW5nKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBDYXNlIHdoZXJlIHRoZSB1c2VyIGlzIG5ldyAoZnJlc2hseSBjcmVhdGVkKSBhbmQgaGFzIG5vdCBjaGFuZ2VkIHRoZSB1c2VyIGVuZ2FnZW1lbnQgc2V0dGluZ3MgaW4gdGhlIHVzZXIgZWRpdCBtb2RhbCAodW50b3VjaGVkIHN0YXRlKS5cbiAgICAgICAqIFdoZW4gY3VzdG9tIGJyYW5kaW5nIGlzIG5vdCBzZXQsIHdlIHdpbGwgc2V0IHRoZSB1c2VyIGVuZ2FnZW1lbnRzIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzIHRvIHRydWUgYnkgZGVmYXVsdC5cbiAgICAgICAqL1xuICAgICAgdGhpcy51cGRhdGVVc2VyRW5nYWdlbWVudFByZWZlcmVuY2UoIWhhc0N1c3RvbUJyYW5kaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VyRW5nYWdlbWVudHNFbmFibGVkJC5uZXh0KHVzZXJFbmdhZ2VtZW50Qm90U2V0dGluZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB1c2VyIGVuZ2FnZW1lbnRzIHNob3VsZCBiZSBkaXNhYmxlZCBkdWUgdG8gUElJIGRhdGEgc2V0dGluZ3MuXG4gICAqXG4gICAqIElmIHRoZSBgc2hvdWxkU2VuZFBpaURhdGFgIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBlbmdhZ2VtZW50c1xuICAgKiBzaG91bGQgYmUgZGlzYWJsZWQgdG8gcHJldmVudCBzaGFyaW5nIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFNlbmRQaWlEYXRhIC0gSW5kaWNhdGVzIHdoZXRoZXIgUElJIGRhdGEgaXMgYWxsb3dlZCB0byBiZSBzZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHVzZXIgZW5nYWdlbWVudHMgc2hvdWxkIGJlIGRpc2FibGVkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZERpc2FibGVVc2VyRW5nYWdlbWVudHNEdWVUb1BJSURhdGEoc2hvdWxkU2VuZFBpaURhdGE6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXNob3VsZFNlbmRQaWlEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIHVzZXIgZW5nYWdlbWVudCBib3Qgc2V0dGluZyBpcyB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gdXNlckVuZ2FnZW1lbnRCb3RTZXR0aW5nIC0gVGhlIHNldHRpbmcgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc2V0dGluZyBpcyB1bmRlZmluZWQ7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICpcbiAgICogVGhpcyBzY2VuYXJpbyBvY2N1cnMgd2hlbiBhIHVzZXIgaXMgbmV3IGFuZCBoYXNuJ3QgbW9kaWZpZWQgdGhlIGJvdCBzZXR0aW5ncyBpbiB0aGUgdXNlciBkZXRhaWxzIFVJIHlldC5cbiAgICovXG4gIHByaXZhdGUgaXNVc2VyRW5nYWdlbWVudEJvdFNldHRpbmdVbmRlZmluZWQoXG4gICAgdXNlckVuZ2FnZW1lbnRCb3RTZXR0aW5nOiBib29sZWFuIHwgdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1c2VyRW5nYWdlbWVudEJvdFNldHRpbmcgPT09IHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgdmlzaWJpbGl0eSBvZiBHYWluc2lnaHQgZW5nYWdlbWVudHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIENTUyBzdHlsZXMgdGhhdCBoaWRlIHRoZSBHYWluc2lnaHQgZW5nYWdlbWVudHNcbiAgICogYW5kIHVwZGF0ZXMgdGhlIHJlbGV2YW50IHVzZXIgYXR0cmlidXRlIHRvIG1hcmsgdGhlIGVuZ2FnZW1lbnRzIGFzIHZpc2libGUuXG4gICAqL1xuICBwcml2YXRlIHNob3dHYWluc2lnaHRFbmdhZ2VtZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lEKTtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudXBkYXRlVXNlckF0dHJpYnV0ZSh0aGlzLkVOR0FHRU1FTlRTLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgR2FpbnNpZ2h0IGVuZ2FnZW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBsaWVzIENTUyBzdHlsZXMgdG8gaGlkZSB0aGUgR2FpbnNpZ2h0IGVuZ2FnZW1lbnRzXG4gICAqIGFuZCB1cGRhdGVzIHRoZSByZWxldmFudCB1c2VyIGF0dHJpYnV0ZSB0byBtYXJrIHRoZSBlbmdhZ2VtZW50cyBhcyBoaWRkZW4uXG4gICAqL1xuICBwcml2YXRlIGhpZGVHYWluc2lnaHRFbmdhZ2VtZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLmFkZEhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lELCAnI2FwdC13aWRnZXQgeyBkaXNwbGF5Om5vbmUgfScpO1xuICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS51cGRhdGVVc2VyQXR0cmlidXRlKHRoaXMuRU5HQUdFTUVOVFMsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgQ1NTIHN0eWxlIGZyb20gdGhlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVJZCAtIFRoZSBJRCBvZiB0aGUgQ1NTIHN0eWxlIGVsZW1lbnQgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVIaWRpbmdTdHlsZShzdHlsZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCk7XG4gICAgc3R5bGU/LnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgQ1NTIHN0eWxlIHRvIHRoZSBkb2N1bWVudC5cbiAgICpcbiAgICogSWYgdGhlIHN0eWxlIHdpdGggdGhlIHNwZWNpZmllZCBJRCBhbHJlYWR5IGV4aXN0cywgdGhlIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuXG4gICAqIE90aGVyd2lzZSwgaXQgY3JlYXRlcyBhIG5ldyBgPHN0eWxlPmAgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgY29udGVudCxcbiAgICogdGhlbiBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCBoZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVJZCAtIFRoZSBJRCB0byBhc3NpZ24gdG8gdGhlIG5ldyBzdHlsZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dENvbnRlbnQgLSBUaGUgQ1NTIHJ1bGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzdHlsZS5cbiAgICovXG4gIHByaXZhdGUgYWRkSGlkaW5nU3R5bGUoc3R5bGVJZDogc3RyaW5nLCB0ZXh0Q29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUuaWQgPSBzdHlsZUlkO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XG4gICAgdGhpcy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgfVxufVxuIl19
@@ -12,6 +12,7 @@ import { gettext } from '../i18n/gettext';
12
12
  import { LoginService } from '../login/login.service';
13
13
  import { ModalService } from '../modal/modal.service';
14
14
  import { GainsightService } from '../product-experience/gainsight.service';
15
+ import { UserEngagementsService } from '../product-experience/user-engagements.service';
15
16
  import * as i0 from "@angular/core";
16
17
  import * as i1 from "ngx-bootstrap/modal";
17
18
  import * as i2 from "@c8y/client";
@@ -23,12 +24,13 @@ import * as i7 from "../product-experience/gainsight.service";
23
24
  import * as i8 from "../bootstrap/cookie-banner/cookie-banner.service";
24
25
  import * as i9 from "../login/login.service";
25
26
  import * as i10 from "../authentication/password.service";
26
- import * as i11 from "../modal/modal.component";
27
- import * as i12 from "./user-edit.component";
28
- import * as i13 from "../i18n/c8y-translate.pipe";
29
- import * as i14 from "@angular/common";
27
+ import * as i11 from "../product-experience/user-engagements.service";
28
+ import * as i12 from "../modal/modal.component";
29
+ import * as i13 from "./user-edit.component";
30
+ import * as i14 from "../i18n/c8y-translate.pipe";
31
+ import * as i15 from "@angular/common";
30
32
  export class UserEditModalComponent {
31
- constructor(modal, user, ui, auth, client, alert, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService) {
33
+ constructor(modal, user, ui, auth, client, alert, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService, userEngagementsService) {
32
34
  this.modal = modal;
33
35
  this.user = user;
34
36
  this.ui = ui;
@@ -41,29 +43,43 @@ export class UserEditModalComponent {
41
43
  this.cookieBannerService = cookieBannerService;
42
44
  this.loginService = loginService;
43
45
  this.passwordService = passwordService;
46
+ this.userEngagementsService = userEngagementsService;
44
47
  this.loading = false;
45
- this.showProductUsageSetting = false;
48
+ this.showProductExperienceOptions = false;
46
49
  }
47
50
  async ngOnInit() {
48
51
  this.updateUserInAppState();
49
- this.showProductUsageSetting = await this.gainsightService.canEditProductExperienceSettings();
50
- if (this.showProductUsageSetting) {
51
- if (this.cookieBannerService.isFunctionalCookieEnabled()) {
52
- this.currentUsageTrackingState =
53
- !(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
54
- this.currentGainsightEngagementsState =
55
- !(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY));
56
- }
52
+ await this.setInitialProductExperienceOptions();
53
+ }
54
+ /**
55
+ * Initializes product experience options for the user.
56
+ *
57
+ * This function performs the following operations:
58
+ * - Determines if the user has the permission to edit product experience options.
59
+ * - If the user has the permission and functional cookies are enabled:
60
+ * - Checks whether personalized product experience tracking is active.
61
+ * - Checks whether in-product information and communication is active.
62
+ */
63
+ async setInitialProductExperienceOptions() {
64
+ this.showProductExperienceOptions =
65
+ await this.gainsightService.canEditProductExperienceSettings();
66
+ if (this.showProductExperienceOptions && this.cookieBannerService.isFunctionalCookieEnabled()) {
67
+ // Enable personalized product experience tracking option
68
+ this.currentUsageTrackingState =
69
+ !(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
70
+ // Enable in-product information & communication option
71
+ this.currentUserEngagementPreferenceInitialState =
72
+ this.userEngagementsService.userEngagementsEnabled$.value;
57
73
  }
58
74
  }
59
75
  async onDismiss() {
60
76
  this.modal.hide();
61
77
  }
62
- onProductExperience(option) {
63
- this.usageTrackingState = option;
78
+ onUsageTrackingChange(isEnabled) {
79
+ this.usageTrackingState = isEnabled;
64
80
  }
65
- onGainsightEngagements(option) {
66
- this.gainsightEngagementsState = option;
81
+ onUserEngagementPreferenceChange(isEnabled) {
82
+ this.userEngagementPreferenceNewState = isEnabled;
67
83
  }
68
84
  async updateAndClose(user) {
69
85
  this.loading = true;
@@ -81,16 +97,7 @@ export class UserEditModalComponent {
81
97
  this.updateCredentials(user.password);
82
98
  }
83
99
  }
84
- if (this.currentGainsightEngagementsState !== this.gainsightEngagementsState) {
85
- await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.gainsightEngagementsState);
86
- }
87
- if (this.currentUsageTrackingState !== this.usageTrackingState) {
88
- await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
89
- this.gainsightService.setFunctionalCookie(this.usageTrackingState);
90
- this.usageTrackingState
91
- ? await this.gainsightService.loadTag(this.client.tenant)
92
- : await this.gainsightTrackingAppReload();
93
- }
100
+ await this.updateProductExperienceOptions();
94
101
  if (user.customProperties.userOrigin !== 'OAUTH2') {
95
102
  await this.user.updateCurrent(omit(user, 'password'));
96
103
  await this.updateUserInAppState();
@@ -119,6 +126,34 @@ export class UserEditModalComponent {
119
126
  // do nothing
120
127
  }
121
128
  }
129
+ async updateProductExperienceOptions() {
130
+ this.updateUserEngagementsPreference();
131
+ await this.updateTrackingOption();
132
+ }
133
+ /**
134
+ * Updates the user engagement preference if it has changed from the initial state.
135
+ * Calls the user engagements service to update the preference.
136
+ *
137
+ * The update only occurs if the current preference differs from the new state.
138
+ */
139
+ updateUserEngagementsPreference() {
140
+ if (this.currentUserEngagementPreferenceInitialState !== this.userEngagementPreferenceNewState) {
141
+ this.userEngagementsService.updateUserEngagementPreference(this.userEngagementPreferenceNewState);
142
+ }
143
+ }
144
+ /**
145
+ * Asynchronously updates the tracking option for user preferences.
146
+ * If the current usage tracking state differs from the new state,
147
+ * it updates the Gainsight preferences and sets a functional cookie
148
+ * before triggering a reload of the application.
149
+ */
150
+ async updateTrackingOption() {
151
+ if (this.currentUsageTrackingState !== this.usageTrackingState) {
152
+ await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
153
+ this.gainsightService.setFunctionalCookie(this.usageTrackingState);
154
+ await this.gainsightTrackingAppReload();
155
+ }
156
+ }
122
157
  async updateUserInAppState() {
123
158
  const currentUserResult = await this.user.current();
124
159
  this.ui.currentUser.next(currentUserResult.data);
@@ -132,10 +167,10 @@ export class UserEditModalComponent {
132
167
  this.auth.updateCredentials(newCredentials);
133
168
  }
134
169
  }
135
- UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1.BsModalRef }, { token: i2.UserService }, { token: i3.AppStateService }, { token: i2.BasicAuth }, { token: i2.FetchClient }, { token: i4.AlertService }, { token: i5.UserPreferencesService }, { token: i6.ModalService }, { token: i7.GainsightService }, { token: i8.CookieBannerService }, { token: i9.LoginService }, { token: i10.PasswordService }], target: i0.ɵɵFactoryTarget.Component });
136
- UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal [customFooter]=\"true\" [title]=\"'Edit user' | translate\" (onDismiss)=\"onDismiss()\">\n <c8y-user-edit\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isGainsightEngagementsEnabled]=\"currentGainsightEngagementsState\"\n [showProductUsageSetting]=\"showProductUsageSetting\"\n (onProductExperience)=\"onProductExperience($event)\"\n (onGainsightEngagements)=\"onGainsightEngagements($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n >\n</c8y-user-edit>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: i11.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i12.UserEditComponent, selector: "c8y-user-edit", inputs: ["loading", "user", "showProductUsageSetting", "isUsageTrackingEnabled", "isGainsightEngagementsEnabled"], outputs: ["onUser", "onProductExperience", "onGainsightEngagements", "onCancel"] }, { kind: "pipe", type: i13.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i14.AsyncPipe, name: "async" }] });
170
+ UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1.BsModalRef }, { token: i2.UserService }, { token: i3.AppStateService }, { token: i2.BasicAuth }, { token: i2.FetchClient }, { token: i4.AlertService }, { token: i5.UserPreferencesService }, { token: i6.ModalService }, { token: i7.GainsightService }, { token: i8.CookieBannerService }, { token: i9.LoginService }, { token: i10.PasswordService }, { token: i11.UserEngagementsService }], target: i0.ɵɵFactoryTarget.Component });
171
+ UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n ></c8y-user-edit>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: i12.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i13.UserEditComponent, selector: "c8y-user-edit", inputs: ["loading", "user", "showProductExperienceOptions", "isUsageTrackingEnabled", "isUserEngagementPreferenceEnabled"], outputs: ["onUser", "onUsageTrackingChange", "onUserEngagementPreferenceChange", "onCancel"] }, { kind: "pipe", type: i14.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i15.AsyncPipe, name: "async" }] });
137
172
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, decorators: [{
138
173
  type: Component,
139
- args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal [customFooter]=\"true\" [title]=\"'Edit user' | translate\" (onDismiss)=\"onDismiss()\">\n <c8y-user-edit\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isGainsightEngagementsEnabled]=\"currentGainsightEngagementsState\"\n [showProductUsageSetting]=\"showProductUsageSetting\"\n (onProductExperience)=\"onProductExperience($event)\"\n (onGainsightEngagements)=\"onGainsightEngagements($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n >\n</c8y-user-edit>\n</c8y-modal>\n" }]
140
- }], ctorParameters: function () { return [{ type: i1.BsModalRef }, { type: i2.UserService }, { type: i3.AppStateService }, { type: i2.BasicAuth }, { type: i2.FetchClient }, { type: i4.AlertService }, { type: i5.UserPreferencesService }, { type: i6.ModalService }, { type: i7.GainsightService }, { type: i8.CookieBannerService }, { type: i9.LoginService }, { type: i10.PasswordService }]; } });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvdXNlci91c2VyLWVkaXQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS91c2VyL3VzZXItZWRpdC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUdYLHFCQUFxQixFQUNyQixXQUFXLEVBQ1osTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBTTNFLE1BQU0sT0FBTyxzQkFBc0I7SUFVakMsWUFDUyxLQUFpQixF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QXNCO2tCQUpsQyxTQUFTOytCQUNFLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCYXNpY0F1dGgsXG4gIEZldGNoQ2xpZW50LFxuICBJQ3JlZGVudGlhbHMsXG4gIElVc2VyLFxuICBUZW5hbnRMb2dpbk9wdGlvblR5cGUsXG4gIFVzZXJTZXJ2aWNlXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoZW50aWNhdGlvbi9wYXNzd29yZC5zZXJ2aWNlJztcbmltcG9ydCB7IENvb2tpZUJhbm5lclNlcnZpY2UgfSBmcm9tICcuLi9ib290c3RyYXAvY29va2llLWJhbm5lci9jb29raWUtYmFubmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi4vY29tbW9uL3N0YXR1cy5tb2RlbCc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi9pMThuL2dldHRleHQnO1xuaW1wb3J0IHsgTG9naW5TZXJ2aWNlIH0gZnJvbSAnLi4vbG9naW4vbG9naW4uc2VydmljZSc7XG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi9tb2RhbC9tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktdXNlci1lZGl0LW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZWRpdC1tb2RhbC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVXNlckVkaXRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGN1cnJlbnRVc2VyOiBJVXNlcjtcbiAgY2hhbmdlZExhbmc6IHN0cmluZztcbiAgbG9hZGluZyA9IGZhbHNlO1xuICBzaG93UHJvZHVjdFVzYWdlU2V0dGluZyA9IGZhbHNlO1xuICBjdXJyZW50VXNhZ2VUcmFja2luZ1N0YXRlOiBib29sZWFuO1xuICBjdXJyZW50R2FpbnNpZ2h0RW5nYWdlbWVudHNTdGF0ZTogYm9vbGVhbjtcbiAgdXNhZ2VUcmFja2luZ1N0YXRlOiBib29sZWFuO1xuICBnYWluc2lnaHRFbmdhZ2VtZW50c1N0YXRlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtb2RhbDogQnNNb2RhbFJlZixcbiAgICBwdWJsaWMgdXNlcjogVXNlclNlcnZpY2UsXG4gICAgcHVibGljIHVpOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoOiBCYXNpY0F1dGgsXG4gICAgcHJpdmF0ZSBjbGllbnQ6IEZldGNoQ2xpZW50LFxuICAgIHByaXZhdGUgYWxlcnQ6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlczogVXNlclByZWZlcmVuY2VzU2VydmljZSxcbiAgICBwcml2YXRlIGM4eU1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZTogR2FpbnNpZ2h0U2VydmljZSxcbiAgICBwcml2YXRlIGNvb2tpZUJhbm5lclNlcnZpY2U6IENvb2tpZUJhbm5lclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dpblNlcnZpY2U6IExvZ2luU2VydmljZSxcbiAgICBwcml2YXRlIHBhc3N3b3JkU2VydmljZTogUGFzc3dvcmRTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZVVzZXJJbkFwcFN0YXRlKCk7XG4gICAgdGhpcy5zaG93UHJvZHVjdFVzYWdlU2V0dGluZyA9IGF3YWl0IHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5jYW5FZGl0UHJvZHVjdEV4cGVyaWVuY2VTZXR0aW5ncygpO1xuICAgIGlmICh0aGlzLnNob3dQcm9kdWN0VXNhZ2VTZXR0aW5nKSB7XG4gICAgICBpZiAodGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzRnVuY3Rpb25hbENvb2tpZUVuYWJsZWQoKSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGUgPVxuICAgICAgICAgICEoYXdhaXQgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLmlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMoXG4gICAgICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UuVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfS0VZXG4gICAgICAgICAgKSk7XG4gICAgICAgIHRoaXMuY3VycmVudEdhaW5zaWdodEVuZ2FnZW1lbnRzU3RhdGUgPVxuICAgICAgICAgICEoYXdhaXQgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLmlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMoXG4gICAgICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UuVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfRU5HQUdFTUVOVFNfS0VZXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25EaXNtaXNzKCkge1xuICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICB9XG5cbiAgb25Qcm9kdWN0RXhwZXJpZW5jZShvcHRpb246IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVzYWdlVHJhY2tpbmdTdGF0ZSA9IG9wdGlvbjtcbiAgfVxuXG4gIG9uR2FpbnNpZ2h0RW5nYWdlbWVudHMob3B0aW9uOiBib29sZWFuKSB7XG4gICAgdGhpcy5nYWluc2lnaHRFbmdhZ2VtZW50c1N0YXRlID0gb3B0aW9uO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQW5kQ2xvc2UodXNlcikge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFzc3dvcmRDaGFuZ2VkID0gQm9vbGVhbih1c2VyLnBhc3N3b3JkKTtcbiAgICAgIGNvbnN0IHVzZXNCYXNpYyA9IHRoaXMubG9naW5TZXJ2aWNlLmxvZ2luTW9kZS50eXBlID09PSBUZW5hbnRMb2dpbk9wdGlvblR5cGUuQkFTSUM7XG4gICAgICBjb25zdCBpc0V4dGVybmFsVXNlciA9IHVzZXIuY3VzdG9tUHJvcGVydGllcy51c2VyT3JpZ2luID09PSAnT0FVVEgyJztcblxuICAgICAgaWYgKCFpc0V4dGVybmFsVXNlciAmJiBwYXNzd29yZENoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBhc3N3b3JkID0gYXdhaXQgdGhpcy5wYXNzd29yZFNlcnZpY2UuY3VycmVudFBhc3N3b3JkKCkudG9Qcm9taXNlKCk7XG4gICAgICAgIGlmICghY3VycmVudFBhc3N3b3JkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMudXNlci5jaGFuZ2VDdXJyZW50VXNlclBhc3N3b3JkKHVzZXIucGFzc3dvcmQsIGN1cnJlbnRQYXNzd29yZCk7XG4gICAgICAgIGlmICh1c2VzQmFzaWMpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNyZWRlbnRpYWxzKHVzZXIucGFzc3dvcmQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRHYWluc2lnaHRFbmdhZ2VtZW50c1N0YXRlICE9PSB0aGlzLmdhaW5zaWdodEVuZ2FnZW1lbnRzU3RhdGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51c2VyUHJlZmVyZW5jZXMuc2V0KFxuICAgICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9FTkdBR0VNRU5UU19LRVksXG4gICAgICAgICAgdGhpcy5nYWluc2lnaHRFbmdhZ2VtZW50c1N0YXRlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGUgIT09IHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlclByZWZlcmVuY2VzLnNldChcbiAgICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UuVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfS0VZLFxuICAgICAgICAgIHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnNldEZ1bmN0aW9uYWxDb29raWUodGhpcy51c2FnZVRyYWNraW5nU3RhdGUpO1xuICAgICAgICB0aGlzLnVzYWdlVHJhY2tpbmdTdGF0ZVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLmxvYWRUYWcodGhpcy5jbGllbnQudGVuYW50KVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5nYWluc2lnaHRUcmFja2luZ0FwcFJlbG9hZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlci5jdXN0b21Qcm9wZXJ0aWVzLnVzZXJPcmlnaW4gIT09ICdPQVVUSDInKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlci51cGRhdGVDdXJyZW50KG9taXQodXNlciwgJ3Bhc3N3b3JkJykpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJJbkFwcFN0YXRlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICAgIHRoaXMuYWxlcnQuc3VjY2VzcyhnZXR0ZXh0KCdVc2VyIHNhdmVkLicpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICB0aGlzLmFsZXJ0LmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdhaW5zaWdodFRyYWNraW5nQXBwUmVsb2FkKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmM4eU1vZGFsU2VydmljZS5jb25maXJtKFxuICAgICAgICBnZXR0ZXh0KCdSZWxvYWQgcmVxdWlyZWQnKSxcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAnVG8gY2hhbmdlIHRoZSB0cmFja2luZyBvcHRpb24gaW4gdGhlIGVudGlyZSBhcHBsaWNhdGlvbiwgeW91IG5lZWQgdG8gcmVsb2FkIHRoZSBwYWdlLiBJZiB5b3UgaGF2ZSBhbnkgdW5zYXZlZCBjaGFuZ2VzLCB5b3UgY2FuIHJlbG9hZCBsYXRlci4gSG93IHdvdWxkIHlvdSBsaWtlIHRvIHByb2NlZWQ/J1xuICAgICAgICApLFxuICAgICAgICBTdGF0dXMuV0FSTklORyxcbiAgICAgICAge1xuICAgICAgICAgIG9rOiBnZXR0ZXh0KCdSZWxvYWQgbm93JyksXG4gICAgICAgICAgY2FuY2VsOiBnZXR0ZXh0KCdSZWxvYWQgbGF0ZXInKVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVVzZXJJbkFwcFN0YXRlKCkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyUmVzdWx0ID0gYXdhaXQgdGhpcy51c2VyLmN1cnJlbnQoKTtcbiAgICB0aGlzLnVpLmN1cnJlbnRVc2VyLm5leHQoY3VycmVudFVzZXJSZXN1bHQuZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNyZWRlbnRpYWxzKHBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuZXdDcmVkZW50aWFsczogSUNyZWRlbnRpYWxzID0ge1xuICAgICAgcGFzc3dvcmQsXG4gICAgICB1c2VyOiB0aGlzLnVpLmN1cnJlbnRVc2VyLnZhbHVlLmlkLFxuICAgICAgdGVuYW50OiB0aGlzLmNsaWVudC50ZW5hbnRcbiAgICB9O1xuICAgIHRoaXMuYXV0aC51cGRhdGVDcmVkZW50aWFscyhuZXdDcmVkZW50aWFscyk7XG4gIH1cbn1cbiIsIjxjOHktbW9kYWwgW2N1c3RvbUZvb3Rlcl09XCJ0cnVlXCIgW3RpdGxlXT1cIidFZGl0IHVzZXInIHwgdHJhbnNsYXRlXCIgKG9uRGlzbWlzcyk9XCJvbkRpc21pc3MoKVwiPlxuICA8Yzh5LXVzZXItZWRpdFxuICBbdXNlcl09XCJ1aS5jdXJyZW50VXNlciB8IGFzeW5jXCJcbiAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gIFtpc1VzYWdlVHJhY2tpbmdFbmFibGVkXT1cImN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGVcIlxuICBbaXNHYWluc2lnaHRFbmdhZ2VtZW50c0VuYWJsZWRdPVwiY3VycmVudEdhaW5zaWdodEVuZ2FnZW1lbnRzU3RhdGVcIlxuICBbc2hvd1Byb2R1Y3RVc2FnZVNldHRpbmddPVwic2hvd1Byb2R1Y3RVc2FnZVNldHRpbmdcIlxuICAob25Qcm9kdWN0RXhwZXJpZW5jZSk9XCJvblByb2R1Y3RFeHBlcmllbmNlKCRldmVudClcIlxuICAob25HYWluc2lnaHRFbmdhZ2VtZW50cyk9XCJvbkdhaW5zaWdodEVuZ2FnZW1lbnRzKCRldmVudClcIlxuICAob25Vc2VyKT1cInVwZGF0ZUFuZENsb3NlKCRldmVudClcIlxuICAob25DYW5jZWwpPVwib25EaXNtaXNzKClcIlxuICA+XG48L2M4eS11c2VyLWVkaXQ+XG48L2M4eS1tb2RhbD5cbiJdfQ==
174
+ args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n ></c8y-user-edit>\n</c8y-modal>\n" }]
175
+ }], ctorParameters: function () { return [{ type: i1.BsModalRef }, { type: i2.UserService }, { type: i3.AppStateService }, { type: i2.BasicAuth }, { type: i2.FetchClient }, { type: i4.AlertService }, { type: i5.UserPreferencesService }, { type: i6.ModalService }, { type: i7.GainsightService }, { type: i8.CookieBannerService }, { type: i9.LoginService }, { type: i10.PasswordService }, { type: i11.UserEngagementsService }]; } });
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvdXNlci91c2VyLWVkaXQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS91c2VyL3VzZXItZWRpdC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUdYLHFCQUFxQixFQUNyQixXQUFXLEVBQ1osTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7Ozs7Ozs7Ozs7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Q0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07U0FDM0IsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7bUhBOUtVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDJEQzNCbkMsZ3FCQWlCQTsyRkRVYSxzQkFBc0I7a0JBSmxDLFNBQVM7K0JBQ0UscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJhc2ljQXV0aCxcbiAgRmV0Y2hDbGllbnQsXG4gIElDcmVkZW50aWFscyxcbiAgSVVzZXIsXG4gIFRlbmFudExvZ2luT3B0aW9uVHlwZSxcbiAgVXNlclNlcnZpY2Vcbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkU2VydmljZSB9IGZyb20gJy4uL2F1dGhlbnRpY2F0aW9uL3Bhc3N3b3JkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29va2llQmFubmVyU2VydmljZSB9IGZyb20gJy4uL2Jvb3RzdHJhcC9jb29raWUtYmFubmVyL2Nvb2tpZS1iYW5uZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9jb21tb24vc3RhdHVzLm1vZGVsJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdXNlci1wcmVmZXJlbmNlcy91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBMb2dpblNlcnZpY2UgfSBmcm9tICcuLi9sb2dpbi9sb2dpbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL21vZGFsL21vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyRW5nYWdlbWVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvZHVjdC1leHBlcmllbmNlL3VzZXItZW5nYWdlbWVudHMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS11c2VyLWVkaXQtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1lZGl0LW1vZGFsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBVc2VyRWRpdE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY3VycmVudFVzZXI6IElVc2VyO1xuICBjaGFuZ2VkTGFuZzogc3RyaW5nO1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIHNob3dQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMgPSBmYWxzZTtcbiAgY3VycmVudFVzYWdlVHJhY2tpbmdTdGF0ZTogYm9vbGVhbjtcbiAgY3VycmVudFVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUluaXRpYWxTdGF0ZTogYm9vbGVhbjtcbiAgdXNhZ2VUcmFja2luZ1N0YXRlOiBib29sZWFuO1xuICB1c2VyRW5nYWdlbWVudFByZWZlcmVuY2VOZXdTdGF0ZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbW9kYWw6IEJzTW9kYWxSZWYsXG4gICAgcHVibGljIHVzZXI6IFVzZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyB1aTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aDogQmFzaWNBdXRoLFxuICAgIHByaXZhdGUgY2xpZW50OiBGZXRjaENsaWVudCxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZXM6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjOHlNb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9naW5TZXJ2aWNlOiBMb2dpblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwYXNzd29yZFNlcnZpY2U6IFBhc3N3b3JkU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJFbmdhZ2VtZW50c1NlcnZpY2U6IFVzZXJFbmdhZ2VtZW50c1NlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXBkYXRlVXNlckluQXBwU3RhdGUoKTtcbiAgICBhd2FpdCB0aGlzLnNldEluaXRpYWxQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBwcm9kdWN0IGV4cGVyaWVuY2Ugb3B0aW9ucyBmb3IgdGhlIHVzZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOlxuICAgKiAtIERldGVybWluZXMgaWYgdGhlIHVzZXIgaGFzIHRoZSBwZXJtaXNzaW9uIHRvIGVkaXQgcHJvZHVjdCBleHBlcmllbmNlIG9wdGlvbnMuXG4gICAqIC0gSWYgdGhlIHVzZXIgaGFzIHRoZSBwZXJtaXNzaW9uIGFuZCBmdW5jdGlvbmFsIGNvb2tpZXMgYXJlIGVuYWJsZWQ6XG4gICAqICAgLSBDaGVja3Mgd2hldGhlciBwZXJzb25hbGl6ZWQgcHJvZHVjdCBleHBlcmllbmNlIHRyYWNraW5nIGlzIGFjdGl2ZS5cbiAgICogICAtIENoZWNrcyB3aGV0aGVyIGluLXByb2R1Y3QgaW5mb3JtYXRpb24gYW5kIGNvbW11bmljYXRpb24gaXMgYWN0aXZlLlxuICAgKi9cbiAgYXN5bmMgc2V0SW5pdGlhbFByb2R1Y3RFeHBlcmllbmNlT3B0aW9ucygpIHtcbiAgICB0aGlzLnNob3dQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMgPVxuICAgICAgYXdhaXQgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLmNhbkVkaXRQcm9kdWN0RXhwZXJpZW5jZVNldHRpbmdzKCk7XG5cbiAgICBpZiAodGhpcy5zaG93UHJvZHVjdEV4cGVyaWVuY2VPcHRpb25zICYmIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0Z1bmN0aW9uYWxDb29raWVFbmFibGVkKCkpIHtcbiAgICAgIC8vIEVuYWJsZSBwZXJzb25hbGl6ZWQgcHJvZHVjdCBleHBlcmllbmNlIHRyYWNraW5nIG9wdGlvblxuICAgICAgdGhpcy5jdXJyZW50VXNhZ2VUcmFja2luZ1N0YXRlID1cbiAgICAgICAgIShhd2FpdCB0aGlzLmdhaW5zaWdodFNlcnZpY2UuaXNHYWluc2lnaHRQcmVmZXJlbmNlRGlzYWJsZWRJblVzZXJQcmVmZXJlbmNlcyhcbiAgICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UuVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfS0VZXG4gICAgICAgICkpO1xuXG4gICAgICAvLyBFbmFibGUgaW4tcHJvZHVjdCBpbmZvcm1hdGlvbiAmIGNvbW11bmljYXRpb24gb3B0aW9uXG4gICAgICB0aGlzLmN1cnJlbnRVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VJbml0aWFsU3RhdGUgPVxuICAgICAgICB0aGlzLnVzZXJFbmdhZ2VtZW50c1NlcnZpY2UudXNlckVuZ2FnZW1lbnRzRW5hYmxlZCQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25EaXNtaXNzKCkge1xuICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICB9XG5cbiAgb25Vc2FnZVRyYWNraW5nQ2hhbmdlKGlzRW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlID0gaXNFbmFibGVkO1xuICB9XG5cbiAgb25Vc2VyRW5nYWdlbWVudFByZWZlcmVuY2VDaGFuZ2UoaXNFbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy51c2VyRW5nYWdlbWVudFByZWZlcmVuY2VOZXdTdGF0ZSA9IGlzRW5hYmxlZDtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFuZENsb3NlKHVzZXIpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkQ2hhbmdlZCA9IEJvb2xlYW4odXNlci5wYXNzd29yZCk7XG4gICAgICBjb25zdCB1c2VzQmFzaWMgPSB0aGlzLmxvZ2luU2VydmljZS5sb2dpbk1vZGUudHlwZSA9PT0gVGVuYW50TG9naW5PcHRpb25UeXBlLkJBU0lDO1xuICAgICAgY29uc3QgaXNFeHRlcm5hbFVzZXIgPSB1c2VyLmN1c3RvbVByb3BlcnRpZXMudXNlck9yaWdpbiA9PT0gJ09BVVRIMic7XG5cbiAgICAgIGlmICghaXNFeHRlcm5hbFVzZXIgJiYgcGFzc3dvcmRDaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXNzd29yZCA9IGF3YWl0IHRoaXMucGFzc3dvcmRTZXJ2aWNlLmN1cnJlbnRQYXNzd29yZCgpLnRvUHJvbWlzZSgpO1xuICAgICAgICBpZiAoIWN1cnJlbnRQYXNzd29yZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnVzZXIuY2hhbmdlQ3VycmVudFVzZXJQYXNzd29yZCh1c2VyLnBhc3N3b3JkLCBjdXJyZW50UGFzc3dvcmQpO1xuICAgICAgICBpZiAodXNlc0Jhc2ljKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVDcmVkZW50aWFscyh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVByb2R1Y3RFeHBlcmllbmNlT3B0aW9ucygpO1xuXG4gICAgICBpZiAodXNlci5jdXN0b21Qcm9wZXJ0aWVzLnVzZXJPcmlnaW4gIT09ICdPQVVUSDInKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlci51cGRhdGVDdXJyZW50KG9taXQodXNlciwgJ3Bhc3N3b3JkJykpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJJbkFwcFN0YXRlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICAgIHRoaXMuYWxlcnQuc3VjY2VzcyhnZXR0ZXh0KCdVc2VyIHNhdmVkLicpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICB0aGlzLmFsZXJ0LmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdhaW5zaWdodFRyYWNraW5nQXBwUmVsb2FkKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmM4eU1vZGFsU2VydmljZS5jb25maXJtKFxuICAgICAgICBnZXR0ZXh0KCdSZWxvYWQgcmVxdWlyZWQnKSxcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAnVG8gY2hhbmdlIHRoZSB0cmFja2luZyBvcHRpb24gaW4gdGhlIGVudGlyZSBhcHBsaWNhdGlvbiwgeW91IG5lZWQgdG8gcmVsb2FkIHRoZSBwYWdlLiBJZiB5b3UgaGF2ZSBhbnkgdW5zYXZlZCBjaGFuZ2VzLCB5b3UgY2FuIHJlbG9hZCBsYXRlci4gSG93IHdvdWxkIHlvdSBsaWtlIHRvIHByb2NlZWQ/J1xuICAgICAgICApLFxuICAgICAgICBTdGF0dXMuV0FSTklORyxcbiAgICAgICAge1xuICAgICAgICAgIG9rOiBnZXR0ZXh0KCdSZWxvYWQgbm93JyksXG4gICAgICAgICAgY2FuY2VsOiBnZXR0ZXh0KCdSZWxvYWQgbGF0ZXInKVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVByb2R1Y3RFeHBlcmllbmNlT3B0aW9ucygpIHtcbiAgICB0aGlzLnVwZGF0ZVVzZXJFbmdhZ2VtZW50c1ByZWZlcmVuY2UoKTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVRyYWNraW5nT3B0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdXNlciBlbmdhZ2VtZW50IHByZWZlcmVuY2UgaWYgaXQgaGFzIGNoYW5nZWQgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAgICogQ2FsbHMgdGhlIHVzZXIgZW5nYWdlbWVudHMgc2VydmljZSB0byB1cGRhdGUgdGhlIHByZWZlcmVuY2UuXG4gICAqXG4gICAqIFRoZSB1cGRhdGUgb25seSBvY2N1cnMgaWYgdGhlIGN1cnJlbnQgcHJlZmVyZW5jZSBkaWZmZXJzIGZyb20gdGhlIG5ldyBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVXNlckVuZ2FnZW1lbnRzUHJlZmVyZW5jZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmN1cnJlbnRVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VJbml0aWFsU3RhdGUgIT09IHRoaXMudXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlTmV3U3RhdGVcbiAgICApIHtcbiAgICAgIHRoaXMudXNlckVuZ2FnZW1lbnRzU2VydmljZS51cGRhdGVVc2VyRW5nYWdlbWVudFByZWZlcmVuY2UoXG4gICAgICAgIHRoaXMudXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlTmV3U3RhdGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHVwZGF0ZXMgdGhlIHRyYWNraW5nIG9wdGlvbiBmb3IgdXNlciBwcmVmZXJlbmNlcy5cbiAgICogSWYgdGhlIGN1cnJlbnQgdXNhZ2UgdHJhY2tpbmcgc3RhdGUgZGlmZmVycyBmcm9tIHRoZSBuZXcgc3RhdGUsXG4gICAqIGl0IHVwZGF0ZXMgdGhlIEdhaW5zaWdodCBwcmVmZXJlbmNlcyBhbmQgc2V0cyBhIGZ1bmN0aW9uYWwgY29va2llXG4gICAqIGJlZm9yZSB0cmlnZ2VyaW5nIGEgcmVsb2FkIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVHJhY2tpbmdPcHRpb24oKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFVzYWdlVHJhY2tpbmdTdGF0ZSAhPT0gdGhpcy51c2FnZVRyYWNraW5nU3RhdGUpIHtcbiAgICAgIGF3YWl0IHRoaXMudXNlclByZWZlcmVuY2VzLnNldChcbiAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0tFWSxcbiAgICAgICAgdGhpcy51c2FnZVRyYWNraW5nU3RhdGVcbiAgICAgICk7XG4gICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2Uuc2V0RnVuY3Rpb25hbENvb2tpZSh0aGlzLnVzYWdlVHJhY2tpbmdTdGF0ZSk7XG4gICAgICBhd2FpdCB0aGlzLmdhaW5zaWdodFRyYWNraW5nQXBwUmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVVc2VySW5BcHBTdGF0ZSgpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlclJlc3VsdCA9IGF3YWl0IHRoaXMudXNlci5jdXJyZW50KCk7XG4gICAgdGhpcy51aS5jdXJyZW50VXNlci5uZXh0KGN1cnJlbnRVc2VyUmVzdWx0LmRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDcmVkZW50aWFscyhwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmV3Q3JlZGVudGlhbHM6IElDcmVkZW50aWFscyA9IHtcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgdXNlcjogdGhpcy51aS5jdXJyZW50VXNlci52YWx1ZS5pZCxcbiAgICAgIHRlbmFudDogdGhpcy5jbGllbnQudGVuYW50XG4gICAgfTtcbiAgICB0aGlzLmF1dGgudXBkYXRlQ3JlZGVudGlhbHMobmV3Q3JlZGVudGlhbHMpO1xuICB9XG59XG4iLCI8Yzh5LW1vZGFsXG4gIFt0aXRsZV09XCInRWRpdCB1c2VyJyB8IHRyYW5zbGF0ZVwiXG4gIFtjdXN0b21Gb290ZXJdPVwidHJ1ZVwiXG4gIChvbkRpc21pc3MpPVwib25EaXNtaXNzKClcIlxuPlxuICA8Yzh5LXVzZXItZWRpdFxuICAgIFt1c2VyXT1cInVpLmN1cnJlbnRVc2VyIHwgYXN5bmNcIlxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgIFtpc1VzYWdlVHJhY2tpbmdFbmFibGVkXT1cImN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGVcIlxuICAgIFtpc1VzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUVuYWJsZWRdPVwiY3VycmVudFVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUluaXRpYWxTdGF0ZVwiXG4gICAgW3Nob3dQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnNdPVwic2hvd1Byb2R1Y3RFeHBlcmllbmNlT3B0aW9uc1wiXG4gICAgKG9uVXNhZ2VUcmFja2luZ0NoYW5nZSk9XCJvblVzYWdlVHJhY2tpbmdDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKG9uVXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlQ2hhbmdlKT1cIm9uVXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlQ2hhbmdlKCRldmVudClcIlxuICAgIChvblVzZXIpPVwidXBkYXRlQW5kQ2xvc2UoJGV2ZW50KVwiXG4gICAgKG9uQ2FuY2VsKT1cIm9uRGlzbWlzcygpXCJcbiAgPjwvYzh5LXVzZXItZWRpdD5cbjwvYzh5LW1vZGFsPlxuIl19