@propmix/profet-common-header 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +46 -1
  2. package/esm2020/lib/api-endpoints.def.mjs +14 -0
  3. package/esm2020/lib/api-gateway.service.mjs +69 -0
  4. package/esm2020/lib/common-header.interface.mjs +11 -0
  5. package/{esm2022 → esm2020}/lib/common-header.module.mjs +33 -33
  6. package/esm2020/lib/common-header.service.mjs +177 -0
  7. package/{esm2022 → esm2020}/lib/company-switch-warning/company-switch-warning.component.mjs +6 -6
  8. package/esm2020/lib/config/app.config.mjs +21 -0
  9. package/esm2020/lib/header/header.component.mjs +429 -0
  10. package/esm2020/lib/pipes/active-route.pipe.mjs +24 -0
  11. package/{esm2022 → esm2020}/lib/pipes/milliseconds-to-minute.pipe.mjs +4 -4
  12. package/esm2020/lib/session-expiry-info/session-expiry-info.component.mjs +36 -0
  13. package/esm2020/lib/utils/Utilities.mjs +41 -0
  14. package/fesm2015/propmix-profet-common-header.mjs +964 -0
  15. package/fesm2015/propmix-profet-common-header.mjs.map +1 -0
  16. package/{fesm2022 → fesm2020}/propmix-profet-common-header.mjs +115 -96
  17. package/fesm2020/propmix-profet-common-header.mjs.map +1 -0
  18. package/lib/common-header.interface.d.ts +8 -0
  19. package/lib/header/header.component.d.ts +6 -3
  20. package/package.json +11 -5
  21. package/esm2022/lib/api-endpoints.def.mjs +0 -14
  22. package/esm2022/lib/api-gateway.service.mjs +0 -69
  23. package/esm2022/lib/common-header.interface.mjs +0 -2
  24. package/esm2022/lib/common-header.service.mjs +0 -177
  25. package/esm2022/lib/config/app.config.mjs +0 -21
  26. package/esm2022/lib/header/header.component.mjs +0 -420
  27. package/esm2022/lib/pipes/active-route.pipe.mjs +0 -24
  28. package/esm2022/lib/session-expiry-info/session-expiry-info.component.mjs +0 -36
  29. package/esm2022/lib/utils/Utilities.mjs +0 -41
  30. package/fesm2022/propmix-profet-common-header.mjs.map +0 -1
  31. /package/{esm2022 → esm2020}/lib/utils/app.constants.mjs +0 -0
  32. /package/{esm2022 → esm2020}/lib/utils/apps.enum.mjs +0 -0
  33. /package/{esm2022 → esm2020}/lib/utils/image.dataurl.mjs +0 -0
  34. /package/{esm2022 → esm2020}/propmix-profet-common-header.mjs +0 -0
  35. /package/{esm2022 → esm2020}/public-api.mjs +0 -0
@@ -37,3 +37,11 @@ export interface Company {
37
37
  export interface SessionOutInfo {
38
38
  sessionOutTimeInMins?: number;
39
39
  }
40
+ export declare enum LogoutReason {
41
+ USER_INITIATED = "USER_INITIATED",
42
+ SESSION_TIMEOUT = "SESSION_TIMEOUT"
43
+ }
44
+ export declare enum LogoutStatus {
45
+ INITIATED = "INITIATED",
46
+ COMPLETED = "COMPLETED"
47
+ }
@@ -4,7 +4,7 @@ import { MatMenuTrigger } from '@angular/material/menu';
4
4
  import { MatSidenav } from '@angular/material/sidenav';
5
5
  import { DomSanitizer } from '@angular/platform-browser';
6
6
  import { Router } from '@angular/router';
7
- import { AppMenu, Company } from '../common-header.interface';
7
+ import { AppMenu, Company, LogoutReason, LogoutStatus } from '../common-header.interface';
8
8
  import { CommonHeaderService } from '../common-header.service';
9
9
  import * as i0 from "@angular/core";
10
10
  export declare class HeaderComponent implements OnInit, OnDestroy {
@@ -40,7 +40,10 @@ export declare class HeaderComponent implements OnInit, OnDestroy {
40
40
  INACTIVITY_LIMIT: number;
41
41
  appLogoNavigationUrl?: string;
42
42
  disableAppMenu?: boolean;
43
- logoutEvent: EventEmitter<void>;
43
+ logoutEvent: EventEmitter<{
44
+ reason: LogoutReason;
45
+ status: LogoutStatus;
46
+ }>;
44
47
  companyControl: FormControl<any>;
45
48
  appConfig: any;
46
49
  companyList: Company[];
@@ -74,5 +77,5 @@ export declare class HeaderComponent implements OnInit, OnDestroy {
74
77
  get resolvedAppLogoNavigationUrl(): string | undefined;
75
78
  get resolvedDisableAppMenu(): boolean | undefined;
76
79
  static ɵfac: i0.ɵɵFactoryDeclaration<HeaderComponent, never>;
77
- static ɵcmp: i0.ɵɵComponentDeclaration<HeaderComponent, "lib-header", never, { "INACTIVITY_LIMIT": { "alias": "INACTIVITY_LIMIT"; "required": false; }; "appLogoNavigationUrl": { "alias": "appLogoNavigationUrl"; "required": false; }; "disableAppMenu": { "alias": "disableAppMenu"; "required": false; }; }, { "logoutEvent": "logoutEvent"; }, never, ["*"], false, never>;
80
+ static ɵcmp: i0.ɵɵComponentDeclaration<HeaderComponent, "lib-header", never, { "INACTIVITY_LIMIT": "INACTIVITY_LIMIT"; "appLogoNavigationUrl": "appLogoNavigationUrl"; "disableAppMenu": "disableAppMenu"; }, { "logoutEvent": "logoutEvent"; }, never, ["*"], false, never>;
78
81
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@propmix/profet-common-header",
3
- "version": "3.5.0",
3
+ "version": "3.6.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=15.2.0",
6
6
  "@angular/core": ">=15.2.0",
@@ -11,7 +11,11 @@
11
11
  "tslib": "^2.3.0"
12
12
  },
13
13
  "sideEffects": false,
14
- "module": "fesm2022/propmix-profet-common-header.mjs",
14
+ "module": "fesm2015/propmix-profet-common-header.mjs",
15
+ "es2020": "fesm2020/propmix-profet-common-header.mjs",
16
+ "esm2020": "esm2020/propmix-profet-common-header.mjs",
17
+ "fesm2020": "fesm2020/propmix-profet-common-header.mjs",
18
+ "fesm2015": "fesm2015/propmix-profet-common-header.mjs",
15
19
  "typings": "index.d.ts",
16
20
  "exports": {
17
21
  "./package.json": {
@@ -19,9 +23,11 @@
19
23
  },
20
24
  ".": {
21
25
  "types": "./index.d.ts",
22
- "esm2022": "./esm2022/propmix-profet-common-header.mjs",
23
- "esm": "./esm2022/propmix-profet-common-header.mjs",
24
- "default": "./fesm2022/propmix-profet-common-header.mjs"
26
+ "esm2020": "./esm2020/propmix-profet-common-header.mjs",
27
+ "es2020": "./fesm2020/propmix-profet-common-header.mjs",
28
+ "es2015": "./fesm2015/propmix-profet-common-header.mjs",
29
+ "node": "./fesm2015/propmix-profet-common-header.mjs",
30
+ "default": "./fesm2020/propmix-profet-common-header.mjs"
25
31
  }
26
32
  }
27
33
  }
@@ -1,14 +0,0 @@
1
- export class EndPoints {
2
- static { this.API_URLS = {
3
- getAppsApi: '/api/company/getAllUserAccessApplications',
4
- getCompanyApplications: '/api/company/getCompanyApplications',
5
- getUserCompanies: '/api/profile/getUserCompanies', // TODO -- Needs to remove
6
- updateUserCompany: '/api/company/updateUserCompany',
7
- fetchCompanyProfile: '/fetchCompanyProfile',
8
- getUserDetails: '/api/user/getUserInformation',
9
- getCompanyList: '/api/user/getUserCompanies',
10
- getAppMenu: '/api/user/getAppMenu',
11
- updateLastAccessedApplication: '/api/user/updateLastAccessedApplication'
12
- }; }
13
- }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWVuZHBvaW50cy5kZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24taGVhZGVyL3NyYy9saWIvYXBpLWVuZHBvaW50cy5kZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFNBQVM7YUFDSixhQUFRLEdBQUc7UUFDckIsVUFBVSxFQUFFLDJDQUEyQztRQUN2RCxzQkFBc0IsRUFBRSxxQ0FBcUM7UUFDN0QsZ0JBQWdCLEVBQUUsK0JBQStCLEVBQUcsMEJBQTBCO1FBQzlFLGlCQUFpQixFQUFFLGdDQUFnQztRQUNuRCxtQkFBbUIsRUFBRSxzQkFBc0I7UUFDM0MsY0FBYyxFQUFFLDhCQUE4QjtRQUU5QyxjQUFjLEVBQUUsNEJBQTRCO1FBQzVDLFVBQVUsRUFBRSxzQkFBc0I7UUFDbEMsNkJBQTZCLEVBQUUseUNBQXlDO0tBQzNFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRW5kUG9pbnRzIHtcbiAgICBwdWJsaWMgc3RhdGljIEFQSV9VUkxTID0ge1xuICAgICAgICBnZXRBcHBzQXBpOiAnL2FwaS9jb21wYW55L2dldEFsbFVzZXJBY2Nlc3NBcHBsaWNhdGlvbnMnLFxuICAgICAgICBnZXRDb21wYW55QXBwbGljYXRpb25zOiAnL2FwaS9jb21wYW55L2dldENvbXBhbnlBcHBsaWNhdGlvbnMnLFxuICAgICAgICBnZXRVc2VyQ29tcGFuaWVzOiAnL2FwaS9wcm9maWxlL2dldFVzZXJDb21wYW5pZXMnLCAgLy8gVE9ETyAtLSBOZWVkcyB0byByZW1vdmVcbiAgICAgICAgdXBkYXRlVXNlckNvbXBhbnk6ICcvYXBpL2NvbXBhbnkvdXBkYXRlVXNlckNvbXBhbnknLFxuICAgICAgICBmZXRjaENvbXBhbnlQcm9maWxlOiAnL2ZldGNoQ29tcGFueVByb2ZpbGUnLFxuICAgICAgICBnZXRVc2VyRGV0YWlsczogJy9hcGkvdXNlci9nZXRVc2VySW5mb3JtYXRpb24nLFxuXG4gICAgICAgIGdldENvbXBhbnlMaXN0OiAnL2FwaS91c2VyL2dldFVzZXJDb21wYW5pZXMnLFxuICAgICAgICBnZXRBcHBNZW51OiAnL2FwaS91c2VyL2dldEFwcE1lbnUnLFxuICAgICAgICB1cGRhdGVMYXN0QWNjZXNzZWRBcHBsaWNhdGlvbjogJy9hcGkvdXNlci91cGRhdGVMYXN0QWNjZXNzZWRBcHBsaWNhdGlvbidcbiAgICB9XG59Il19
@@ -1,69 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Injectable, inject } from '@angular/core';
3
- import { Observable } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- export class ApiGatewayService {
6
- constructor() {
7
- this._http = inject(HttpClient);
8
- }
9
- doGet(url, config) {
10
- return new Observable(observer => {
11
- if (!config) {
12
- config = {
13
- isLoaderHidden: false
14
- };
15
- }
16
- ;
17
- let headers;
18
- if (config.isUnauthorized) {
19
- headers = {
20
- skip: "true"
21
- };
22
- }
23
- // this._loaderService.requestStarted(config);
24
- this._http
25
- .get(url, { headers: headers })
26
- .subscribe({
27
- next: (data) => {
28
- // this._loaderService.requestEnded();
29
- observer.next(data);
30
- observer.complete();
31
- },
32
- error: (error) => {
33
- // this.handleError(error, config, observer);
34
- }
35
- });
36
- });
37
- }
38
- doPost(url, req_body) {
39
- return new Observable(observer => {
40
- let headers;
41
- this._http
42
- .post(url, req_body, { headers: headers })
43
- .subscribe({
44
- next: (data) => {
45
- if (data && data.hasOwnProperty('status')) {
46
- observer.next(data);
47
- observer.complete();
48
- }
49
- else {
50
- observer.next(data);
51
- observer.complete();
52
- }
53
- },
54
- error: (error) => {
55
- // this.handleError(error, config, observer);
56
- }
57
- });
58
- });
59
- }
60
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ApiGatewayService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
61
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ApiGatewayService, providedIn: 'root' }); }
62
- }
63
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ApiGatewayService, decorators: [{
64
- type: Injectable,
65
- args: [{
66
- providedIn: 'root'
67
- }]
68
- }] });
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWdhdGV3YXkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbW1vbi1oZWFkZXIvc3JjL2xpYi9hcGktZ2F0ZXdheS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUtsQyxNQUFNLE9BQU8saUJBQWlCO0lBSDlCO1FBSVUsVUFBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztLQW9EcEM7SUFsREMsS0FBSyxDQUFDLEdBQVcsRUFBRSxNQUFZO1FBQzdCLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sR0FBRztvQkFDUCxjQUFjLEVBQUUsS0FBSztpQkFDdEIsQ0FBQztZQUNKLENBQUM7WUFBQSxDQUFDO1lBQ0YsSUFBSSxPQUFXLENBQUM7WUFDaEIsSUFBRyxNQUFNLENBQUMsY0FBYyxFQUFDLENBQUM7Z0JBQ3hCLE9BQU8sR0FBRztvQkFDUixJQUFJLEVBQUUsTUFBTTtpQkFDYixDQUFBO1lBQ0gsQ0FBQztZQUVELDhDQUE4QztZQUM5QyxJQUFJLENBQUMsS0FBSztpQkFDUCxHQUFHLENBQUMsR0FBRyxFQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQyxDQUFDO2lCQUMzQixTQUFTLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ2Isc0NBQXNDO29CQUN0QyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2YsNkNBQTZDO2dCQUMvQyxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQVcsRUFBRSxRQUFjO1FBQ2hDLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDL0IsSUFBSSxPQUFXLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUs7aUJBQ1AsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLENBQUM7aUJBQ3RDLFNBQVMsQ0FBQztnQkFDVCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7d0JBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3BCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDdEIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3BCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDdEIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEtBQVMsRUFBRSxFQUFFO29CQUNuQiw2Q0FBNkM7Z0JBQy9DLENBQUM7YUFDRixDQUFDLENBQUE7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBcERVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFwaUdhdGV3YXlTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgXG4gIGRvR2V0KHVybDogc3RyaW5nLCBjb25maWc/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICBjb25maWcgPSB7XG4gICAgICAgICAgaXNMb2FkZXJIaWRkZW46IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgbGV0IGhlYWRlcnM6YW55O1xuICAgICAgaWYoY29uZmlnLmlzVW5hdXRob3JpemVkKXtcbiAgICAgICAgaGVhZGVycyA9IHtcbiAgICAgICAgICBza2lwOiBcInRydWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAgXG4gICAgICAvLyB0aGlzLl9sb2FkZXJTZXJ2aWNlLnJlcXVlc3RTdGFydGVkKGNvbmZpZyk7XG4gICAgICB0aGlzLl9odHRwXG4gICAgICAgIC5nZXQodXJsLHtoZWFkZXJzOiBoZWFkZXJzfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIC8vIHRoaXMuX2xvYWRlclNlcnZpY2UucmVxdWVzdEVuZGVkKCk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIC8vIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIGNvbmZpZywgb2JzZXJ2ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgfVxuICBkb1Bvc3QodXJsOiBzdHJpbmcsIHJlcV9ib2R5PzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IGhlYWRlcnM6YW55O1xuICAgICAgdGhpcy5faHR0cFxuICAgICAgICAucG9zdCh1cmwsIHJlcV9ib2R5LHtoZWFkZXJzOiBoZWFkZXJzfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuaGFzT3duUHJvcGVydHkoJ3N0YXR1cycpKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcjphbnkpID0+IHtcbiAgICAgICAgICAgIC8vIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIGNvbmZpZywgb2JzZXJ2ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWhlYWRlci5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24taGVhZGVyL3NyYy9saWIvY29tbW9uLWhlYWRlci5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBST0ZFVF9BUFBTIH0gZnJvbSBcIi4vdXRpbHMvYXBwcy5lbnVtXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwTWVudSB7XG4gICAgYXBwVHlwZTogUFJPRkVUX0FQUFM7XG4gICAgbWVudU5hbWU6IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBncm91cEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcbiAgICBba2V5IGluIFBST0ZFVF9BUFBTXToge1xuICAgICAgICBhcHBOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFwcExvZ29Vcmk6IHN0cmluZztcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyQ29uZmlnIHtcbiAgICBhcGlVcmw6IHN0cmluZztcbiAgICBwb3J0YWxGcm9udGVuZFVybD86IHN0cmluZztcbiAgICBzaWduT3V0VXJsOiBzdHJpbmc7XG4gICAgYXBwVHlwZTogUFJPRkVUX0FQUFM7XG4gICAgZW5hYmxlTGFzdFVybFJlZGlyZWN0aW9uPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQXBwTWVudT86IGJvb2xlYW47XG4gICAgYXBwTG9nb05hdmlnYXRpb25Vcmw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGFueSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBjb21wYW55S2V5OiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGxvZ28/OiBzdHJpbmc7XG4gICAgaXNBY3RpdmU6IGJvb2xlYW47XG4gICAgYmFzZVVybHM6IHtcbiAgICAgICAgcHJvZmV0X3BvcnRhbD86IHN0cmluZyxcbiAgICAgICAgYXBwcmFpc2FsX21hbmFnZW1lbnQ/OiBzdHJpbmcsXG4gICAgICAgIGFwcHJhaXNhbF9yZXZpZXc/OiBzdHJpbmcsXG4gICAgICAgIGFwcHJhaXNhbF92YWx1YXRpb24/OiBzdHJpbmdcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbk91dEluZm8ge1xuICAgIHNlc3Npb25PdXRUaW1lSW5NaW5zPzogbnVtYmVyO1xufSJdfQ==
@@ -1,177 +0,0 @@
1
- import { Inject, inject, Injectable } from '@angular/core';
2
- import { MatDialog } from '@angular/material/dialog';
3
- import { reduce, ReplaySubject } from 'rxjs';
4
- import { APP_DOMAIN } from '../public-api';
5
- import { EndPoints } from './api-endpoints.def';
6
- import { ApiGatewayService } from './api-gateway.service';
7
- import { SessionExpiryInfoComponent } from './session-expiry-info/session-expiry-info.component';
8
- import { Utilities } from './utils/Utilities';
9
- import * as i0 from "@angular/core";
10
- export class CommonHeaderService {
11
- constructor(config) {
12
- this.config = config;
13
- this.SESSION_EXPIRED_KEY = 'session_expired';
14
- this.LAST_ACTIVE_SESSION_KEY = 'lastActiveSessionTime';
15
- this.baseUrl = '';
16
- this.isSessionExpiryDialogOpen = false;
17
- this._apiGatewayService = inject(ApiGatewayService);
18
- this._dialog = inject(MatDialog);
19
- this.menuStateSubject = new ReplaySubject(1);
20
- this.activeMenuList$ = this.menuStateSubject.asObservable();
21
- this.companyListSubject = new ReplaySubject(1);
22
- this.companyList$ = this.companyListSubject.asObservable();
23
- this.headerConfig = config;
24
- this.baseUrl = config.apiUrl;
25
- }
26
- setMenuState(data) {
27
- this.menuStateSubject.next(data);
28
- }
29
- setCompanyList(data) {
30
- this.companyListSubject.next(data);
31
- }
32
- obtainDataByUrl(url) {
33
- return this._apiGatewayService.doGet(url);
34
- }
35
- openSessionExpireInfo(sessioninfo) {
36
- let info = {};
37
- if (sessioninfo) {
38
- info = sessioninfo;
39
- }
40
- this.isSessionExpiryDialogOpen = true;
41
- this._dialog.open(SessionExpiryInfoComponent, { data: sessioninfo });
42
- }
43
- getDomainInfo() {
44
- let dom = document.location.host.split('.');
45
- let domainInfo = APP_DOMAIN.find(x => x.domain === dom[0]);
46
- if (domainInfo) {
47
- return domainInfo;
48
- }
49
- // Check if the second part of the domain exists before using it
50
- domainInfo = dom[1] ? APP_DOMAIN.find(x => x.domain === dom[1]) : undefined;
51
- return domainInfo || undefined;
52
- }
53
- getApps() {
54
- let url = `${this.baseUrl + EndPoints.API_URLS.getAppsApi}`;
55
- return this._apiGatewayService.doGet(url);
56
- }
57
- getCompanyApplications() {
58
- let url = `${this.baseUrl + EndPoints.API_URLS.getCompanyApplications}`;
59
- return this._apiGatewayService.doGet(url);
60
- }
61
- // TODO -- need to remove
62
- getUserCompanies() {
63
- let url = `${this.baseUrl + EndPoints.API_URLS.getUserCompanies}`;
64
- return this._apiGatewayService.doGet(url);
65
- }
66
- updateUserCompany(reqBody) {
67
- let url = `${this.baseUrl + EndPoints.API_URLS.updateUserCompany}`;
68
- return this._apiGatewayService.doPost(url, reqBody);
69
- }
70
- fetchCompanyProfile(reqBody) {
71
- let config = {
72
- isUnauthorized: true
73
- };
74
- let url = `${this.baseUrl + EndPoints.API_URLS.fetchCompanyProfile + '?' + Utilities.convertObjectToQueryString(reqBody)}`;
75
- return this._apiGatewayService.doGet(url, config).pipe(reduce((acc, res) => {
76
- if (res?.data) {
77
- acc = res.data;
78
- }
79
- return acc;
80
- }, {}));
81
- }
82
- getUserDetails() {
83
- let url = `${this.baseUrl + EndPoints.API_URLS.getUserDetails}`;
84
- return this._apiGatewayService.doGet(url);
85
- }
86
- getCompanyList() {
87
- let url = `${this.baseUrl + EndPoints.API_URLS.getCompanyList}`;
88
- return this._apiGatewayService.doGet(url).pipe(reduce((acc, res) => {
89
- if (res?.data?.companies) {
90
- acc = res?.data?.companies;
91
- }
92
- return acc;
93
- }, {}));
94
- }
95
- getMenuList() {
96
- let url = `${this.baseUrl + EndPoints.API_URLS.getAppMenu}`;
97
- return this._apiGatewayService.doGet(url).pipe(reduce((acc, res) => {
98
- if (res?.data?.AppMenu) {
99
- acc = res?.data?.AppMenu;
100
- }
101
- return acc;
102
- }, {}));
103
- }
104
- updateLastAccessedApplication(reqBody) {
105
- let url = `${this.baseUrl + EndPoints.API_URLS.updateLastAccessedApplication}`;
106
- return this._apiGatewayService.doPost(url, reqBody);
107
- }
108
- /**
109
- * Helper to get the root domain (e.g. .profet.ai) to share cookies across subdomains/ports.
110
- * If on localhost or an IP, it falls back to the hostname.
111
- */
112
- getRootDomain() {
113
- const hostname = window.location.hostname;
114
- const parts = hostname.split('.');
115
- if (parts.length > 2 && !/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(hostname)) {
116
- // If we have 4+ parts (e.g. app1.local.profet.ai), we want to include the environment (local.profet.ai)
117
- // to avoid sharing cookies with app1.dev.profet.ai or app1.profet.ai.
118
- if (parts.length > 3) {
119
- return '.' + parts.slice(-3).join('.');
120
- }
121
- // For standard 3 parts (app1.profet.ai), share on .profet.ai
122
- return '.' + parts.slice(-2).join('.');
123
- }
124
- return hostname;
125
- }
126
- /**
127
- * Generates a unique cookie name based on the environment root domain.
128
- * e.g. 'lastActive' on .qa.profet.ai -> 'lastActive_qa_profet_ai'
129
- * @param name Base cookie name
130
- */
131
- getSuffixedCookieName(name) {
132
- const rootDomain = this.getRootDomain();
133
- // Replace dots with underscores to create a clean suffix
134
- const suffix = rootDomain.replace(/\./g, '_');
135
- return `${name}${suffix}`;
136
- }
137
- setCookie(name, value, days) {
138
- const uniqueName = this.getSuffixedCookieName(name);
139
- let expires = "";
140
- if (days) {
141
- const date = new Date();
142
- date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
143
- expires = "; expires=" + date.toUTCString();
144
- }
145
- // Important: set domain to allow sharing across subdomains
146
- const domain = "; domain=" + this.getRootDomain();
147
- document.cookie = uniqueName + "=" + (value || "") + expires + domain + "; path=/";
148
- }
149
- getCookie(name) {
150
- const uniqueName = this.getSuffixedCookieName(name);
151
- const nameEQ = uniqueName + "=";
152
- const ca = document.cookie.split(';');
153
- for (let i = 0; i < ca.length; i++) {
154
- let c = ca[i];
155
- while (c.charAt(0) == ' ')
156
- c = c.substring(1, c.length);
157
- if (c.indexOf(nameEQ) == 0)
158
- return c.substring(nameEQ.length, c.length);
159
- }
160
- return null;
161
- }
162
- deleteCookie(name) {
163
- this.setCookie(name, '', -1);
164
- }
165
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommonHeaderService, deps: [{ token: 'headerConfig' }], target: i0.ɵɵFactoryTarget.Injectable }); }
166
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommonHeaderService, providedIn: 'root' }); }
167
- }
168
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommonHeaderService, decorators: [{
169
- type: Injectable,
170
- args: [{
171
- providedIn: 'root'
172
- }]
173
- }], ctorParameters: () => [{ type: undefined, decorators: [{
174
- type: Inject,
175
- args: ['headerConfig']
176
- }] }] });
177
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWhlYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uLWhlYWRlci9zcmMvbGliL2NvbW1vbi1oZWFkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFLOUMsTUFBTSxPQUFPLG1CQUFtQjtJQWdCOUIsWUFBNEMsTUFBb0I7UUFBcEIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQWZoRCx3QkFBbUIsR0FBRyxpQkFBaUIsQ0FBQztRQUN4Qyw0QkFBdUIsR0FBRyx1QkFBdUIsQ0FBQztRQUUxRCxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBRTdCLDhCQUF5QixHQUFHLEtBQUssQ0FBQztRQUMxQix1QkFBa0IsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoRCxZQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNCLHFCQUFnQixHQUFHLElBQUksYUFBYSxDQUFtQixDQUFDLENBQUMsQ0FBQztRQUMzRCxvQkFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZ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QUM7SUFDL0IsQ0FBQzsrR0FsTFUsbUJBQW1CLGtCQWdCVixjQUFjO21IQWhCdkIsbUJBQW1CLGNBRmxCLE1BQU07OzRGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQWlCYyxNQUFNOzJCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IHJlZHVjZSwgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVBQX0RPTUFJTiB9IGZyb20gJy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgRW5kUG9pbnRzIH0gZnJvbSAnLi9hcGktZW5kcG9pbnRzLmRlZic7XG5pbXBvcnQgeyBBcGlHYXRld2F5U2VydmljZSB9IGZyb20gJy4vYXBpLWdhdGV3YXkuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBNZW51LCBDb21wYW55LCBIZWFkZXJDb25maWcsIFNlc3Npb25PdXRJbmZvIH0gZnJvbSAnLi9jb21tb24taGVhZGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZXNzaW9uRXhwaXJ5SW5mb0NvbXBvbmVudCB9IGZyb20gJy4vc2Vzc2lvbi1leHBpcnktaW5mby9zZXNzaW9uLWV4cGlyeS1pbmZvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVdGlsaXRpZXMgfSBmcm9tICcuL3V0aWxzL1V0aWxpdGllcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvbW1vbkhlYWRlclNlcnZpY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgU0VTU0lPTl9FWFBJUkVEX0tFWSA9ICdzZXNzaW9uX2V4cGlyZWQnO1xuICBwdWJsaWMgcmVhZG9ubHkgTEFTVF9BQ1RJVkVfU0VTU0lPTl9LRVkgPSAnbGFzdEFjdGl2ZVNlc3Npb25UaW1lJztcblxuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZyA9ICcnO1xuICBoZWFkZXJDb25maWc6IEhlYWRlckNvbmZpZztcbiAgaXNTZXNzaW9uRXhwaXJ5RGlhbG9nT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hcGlHYXRld2F5U2VydmljZSA9IGluamVjdChBcGlHYXRld2F5U2VydmljZSk7XG4gIHB1YmxpYyBfZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG5cbiAgcHJpdmF0ZSBtZW51U3RhdGVTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8QXBwTWVudVtdIHwgbnVsbD4oMSk7XG4gIHB1YmxpYyBhY3RpdmVNZW51TGlzdCQgPSB0aGlzLm1lbnVTdGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBjb21wYW55TGlzdFN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxDb21wYW55W10gfCBudWxsPigxKTtcbiAgcHVibGljIGNvbXBhbnlMaXN0JCA9IHRoaXMuY29tcGFueUxpc3RTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2hlYWRlckNvbmZpZycpIHByaXZhdGUgY29uZmlnOiBIZWFkZXJDb25maWcpIHtcbiAgICB0aGlzLmhlYWRlckNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmJhc2VVcmwgPSBjb25maWcuYXBpVXJsO1xuICB9XG5cbiAgc2V0TWVudVN0YXRlKGRhdGE6IEFwcE1lbnVbXSk6IHZvaWQge1xuICAgIHRoaXMubWVudVN0YXRlU3ViamVjdC5uZXh0KGRhdGEpO1xuICB9XG4gIHNldENvbXBhbnlMaXN0KGRhdGE6IENvbXBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMuY29tcGFueUxpc3RTdWJqZWN0Lm5leHQoZGF0YSk7XG4gIH1cblxuICBvYnRhaW5EYXRhQnlVcmwodXJsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpR2F0ZXdheVNlcnZpY2UuZG9HZXQodXJsKTtcbiAgfVxuXG4gIG9wZW5TZXNzaW9uRXhwaXJlSW5mbyhzZXNzaW9uaW5mbz86IFNlc3Npb25PdXRJbmZvKSB7XG4gICAgbGV0IGluZm86IFNlc3Npb25PdXRJbmZvID0ge307XG4gICAgaWYgKHNlc3Npb25pbmZvKSB7XG4gICAgICBpbmZvID0gc2Vzc2lvbmluZm87XG4gICAgfVxuICAgIHRoaXMuaXNTZXNzaW9uRXhwaXJ5RGlhbG9nT3BlbiA9IHRydWU7XG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oU2Vzc2lvbkV4cGlyeUluZm9Db21wb25lbnQsIHsgZGF0YTogc2Vzc2lvbmluZm8gfSk7XG4gIH1cblxuICBnZXREb21haW5JbmZvKCkge1xuICAgIGxldCBkb20gPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0LnNwbGl0KCcuJyk7XG4gICAgbGV0IGRvbWFpbkluZm8gPSBBUFBfRE9NQUlOLmZpbmQoeCA9PiB4LmRvbWFpbiA9PT0gZG9tWzBdKTtcbiAgICBpZiAoZG9tYWluSW5mbykge1xuICAgICAgcmV0dXJuIGRvbWFpbkluZm87XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBkb21haW4gZXhpc3RzIGJlZm9yZSB1c2luZyBpdFxuICAgIGRvbWFpbkluZm8gPSBkb21bMV0gPyBBUFBfRE9NQUlOLmZpbmQoeCA9PiB4LmRvbWFpbiA9PT0gZG9tWzFdKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZG9tYWluSW5mbyB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBcHBzKCkge1xuICAgIGxldCB1cmwgPSBgJHt0aGlzLmJhc2VVcmwgKyBFbmRQb2ludHMuQVBJX1VSTFMuZ2V0QXBwc0FwaX1gO1xuICAgIHJldHVybiB0aGlzLl9hcGlHYXRld2F5U2VydmljZS5kb0dldCh1cmwpO1xuICB9XG4gIGdldENvbXBhbnlBcHBsaWNhdGlvbnMoKSB7XG4gICAgbGV0IHVybCA9IGAke3RoaXMuYmFzZVVybCArIEVuZFBvaW50cy5BUElfVVJMUy5nZXRDb21wYW55QXBwbGljYXRpb25zfWA7XG4gICAgcmV0dXJuIHRoaXMuX2FwaUdhdGV3YXlTZXJ2aWNlLmRvR2V0KHVybCk7XG4gIH1cblxuICAvLyBUT0RPIC0tIG5lZWQgdG8gcmVtb3ZlXG4gIGdldFVzZXJDb21wYW5pZXMoKSB7XG4gICAgbGV0IHVybCA9IGAke3RoaXMuYmFzZVVybCArIEVuZFBvaW50cy5BUElfVVJMUy5nZXRVc2VyQ29tcGFuaWVzfWA7XG4gICAgcmV0dXJuIHRoaXMuX2FwaUdhdGV3YXlTZXJ2aWNlLmRvR2V0KHVybCk7XG4gIH1cbiAgdXBkYXRlVXNlckNvbXBhbnkocmVxQm9keTogYW55KSB7XG4gICAgbGV0IHVybCA9IGAke3RoaXMuYmFzZVVybCArIEVuZFBvaW50cy5BUElfVVJMUy51cGRhdGVVc2VyQ29tcGFueX1gO1xuICAgIHJldHVybiB0aGlzLl9hcGlHYXRld2F5U2VydmljZS5kb1Bvc3QodXJsLCByZXFCb2R5KTtcbiAgfVxuXG4gIGZldGNoQ29tcGFueVByb2ZpbGUocmVxQm9keTogYW55KSB7XG4gICAgbGV0IGNvbmZpZzogYW55ID0ge1xuICAgICAgaXNVbmF1dGhvcml6ZWQ6IHRydWVcbiAgICB9XG4gICAgbGV0IHVybCA9IGAke3RoaXMuYmFzZVVybCArIEVuZFBvaW50cy5BUElfVVJMUy5mZXRjaENvbXBhbnlQcm9maWxlICsgJz8nICsgVXRpbGl0aWVzLmNvbnZlcnRPYmplY3RUb1F1ZXJ5U3RyaW5nKHJlcUJvZHkpfWA7XG4gICAgcmV0dXJuIHRoaXMuX2FwaUdhdGV3YXlTZXJ2aWNlLmRvR2V0KHVybCwgY29uZmlnKS5waXBlKFxuICAgICAgcmVkdWNlKChhY2MsIHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgYWNjID0gcmVzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KVxuICAgICk7XG4gIH1cbiAgZ2V0VXNlckRldGFpbHMoKSB7XG4gICAgbGV0IHVybCA9IGAke3RoaXMuYmFzZVVybCArIEVuZFBvaW50cy5BUElfVVJMUy5nZXRVc2VyRGV0YWlsc31gO1xuICAgIHJldHVybiB0aGlzLl9hcGlHYXRld2F5U2VydmljZS5kb0dldCh1cmwpO1xuICB9XG5cbiAgZ2V0Q29tcGFueUxpc3QoKSB7XG4gICAgbGV0IHVybCA9IGAke3RoaXMuYmFzZVVybCArIEVuZFBvaW50cy5BUElfVVJMUy5nZXRDb21wYW55TGlzdH1gO1xuICAgIHJldHVybiB0aGlzLl9hcGlHYXRld2F5U2VydmljZS5kb0dldCh1cmwpLnBpcGUoXG4gICAgICByZWR1Y2UoKGFjYywgcmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXM/LmRhdGE/LmNvbXBhbmllcykge1xuICAgICAgICAgIGFjYyA9IHJlcz8uZGF0YT8uY29tcGFuaWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSlcbiAgICApO1xuICB9XG4gIGdldE1lbnVMaXN0KCkge1xuICAgIGxldCB1cmwgPSBgJHt0aGlzLmJhc2VVcmwgKyBFbmRQb2ludHMuQVBJX1VSTFMuZ2V0QXBwTWVudX1gO1xuICAgIHJldHVybiB0aGlzLl9hcGlHYXRld2F5U2VydmljZS5kb0dldCh1cmwpLnBpcGUoXG4gICAgICByZWR1Y2UoKGFjYywgcmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXM/LmRhdGE/LkFwcE1lbnUpIHtcbiAgICAgICAgICBhY2MgPSByZXM/LmRhdGE/LkFwcE1lbnU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KVxuICAgICk7XG4gIH1cblxuICB1cGRhdGVMYXN0QWNjZXNzZWRBcHBsaWNhdGlvbihyZXFCb2R5OiBhbnkpIHtcbiAgICBsZXQgdXJsID0gYCR7dGhpcy5iYXNlVXJsICsgRW5kUG9pbnRzLkFQSV9VUkxTLnVwZGF0ZUxhc3RBY2Nlc3NlZEFwcGxpY2F0aW9ufWA7XG4gICAgcmV0dXJuIHRoaXMuX2FwaUdhdGV3YXlTZXJ2aWNlLmRvUG9zdCh1cmwsIHJlcUJvZHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBnZXQgdGhlIHJvb3QgZG9tYWluIChlLmcuIC5wcm9mZXQuYWkpIHRvIHNoYXJlIGNvb2tpZXMgYWNyb3NzIHN1YmRvbWFpbnMvcG9ydHMuXG4gICAqIElmIG9uIGxvY2FsaG9zdCBvciBhbiBJUCwgaXQgZmFsbHMgYmFjayB0byB0aGUgaG9zdG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um9vdERvbWFpbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhvc3RuYW1lID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO1xuICAgIGNvbnN0IHBhcnRzID0gaG9zdG5hbWUuc3BsaXQoJy4nKTtcblxuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyICYmICEvXlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9JC8udGVzdChob3N0bmFtZSkpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgNCsgcGFydHMgKGUuZy4gYXBwMS5sb2NhbC5wcm9mZXQuYWkpLCB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIGVudmlyb25tZW50IChsb2NhbC5wcm9mZXQuYWkpXG4gICAgICAvLyB0byBhdm9pZCBzaGFyaW5nIGNvb2tpZXMgd2l0aCBhcHAxLmRldi5wcm9mZXQuYWkgb3IgYXBwMS5wcm9mZXQuYWkuXG4gICAgICBpZiAocGFydHMubGVuZ3RoID4gMykge1xuICAgICAgICByZXR1cm4gJy4nICsgcGFydHMuc2xpY2UoLTMpLmpvaW4oJy4nKTtcbiAgICAgIH1cbiAgICAgIC8vIEZvciBzdGFuZGFyZCAzIHBhcnRzIChhcHAxLnByb2ZldC5haSksIHNoYXJlIG9uIC5wcm9mZXQuYWlcbiAgICAgIHJldHVybiAnLicgKyBwYXJ0cy5zbGljZSgtMikuam9pbignLicpO1xuICAgIH1cbiAgICByZXR1cm4gaG9zdG5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgdW5pcXVlIGNvb2tpZSBuYW1lIGJhc2VkIG9uIHRoZSBlbnZpcm9ubWVudCByb290IGRvbWFpbi5cbiAgICogZS5nLiAnbGFzdEFjdGl2ZScgb24gLnFhLnByb2ZldC5haSAtPiAnbGFzdEFjdGl2ZV9xYV9wcm9mZXRfYWknXG4gICAqIEBwYXJhbSBuYW1lIEJhc2UgY29va2llIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRTdWZmaXhlZENvb2tpZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByb290RG9tYWluID0gdGhpcy5nZXRSb290RG9tYWluKCk7XG4gICAgLy8gUmVwbGFjZSBkb3RzIHdpdGggdW5kZXJzY29yZXMgdG8gY3JlYXRlIGEgY2xlYW4gc3VmZml4XG4gICAgY29uc3Qgc3VmZml4ID0gcm9vdERvbWFpbi5yZXBsYWNlKC9cXC4vZywgJ18nKTtcbiAgICByZXR1cm4gYCR7bmFtZX0ke3N1ZmZpeH1gO1xuICB9XG5cbiAgcHVibGljIHNldENvb2tpZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGRheXM6IG51bWJlcikge1xuICAgIGNvbnN0IHVuaXF1ZU5hbWUgPSB0aGlzLmdldFN1ZmZpeGVkQ29va2llTmFtZShuYW1lKTtcbiAgICBsZXQgZXhwaXJlcyA9IFwiXCI7XG4gICAgaWYgKGRheXMpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgKGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKSk7XG4gICAgICBleHBpcmVzID0gXCI7IGV4cGlyZXM9XCIgKyBkYXRlLnRvVVRDU3RyaW5nKCk7XG4gICAgfVxuICAgIC8vIEltcG9ydGFudDogc2V0IGRvbWFpbiB0byBhbGxvdyBzaGFyaW5nIGFjcm9zcyBzdWJkb21haW5zXG4gICAgY29uc3QgZG9tYWluID0gXCI7IGRvbWFpbj1cIiArIHRoaXMuZ2V0Um9vdERvbWFpbigpO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IHVuaXF1ZU5hbWUgKyBcIj1cIiArICh2YWx1ZSB8fCBcIlwiKSArIGV4cGlyZXMgKyBkb21haW4gKyBcIjsgcGF0aD0vXCI7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29va2llKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHVuaXF1ZU5hbWUgPSB0aGlzLmdldFN1ZmZpeGVkQ29va2llTmFtZShuYW1lKTtcbiAgICBjb25zdCBuYW1lRVEgPSB1bmlxdWVOYW1lICsgXCI9XCI7XG4gICAgY29uc3QgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYyA9IGNhW2ldO1xuICAgICAgd2hpbGUgKGMuY2hhckF0KDApID09ICcgJykgYyA9IGMuc3Vic3RyaW5nKDEsIGMubGVuZ3RoKTtcbiAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PSAwKSByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCwgYy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVDb29raWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRDb29raWUobmFtZSwgJycsIC0xKTtcbiAgfVxufVxuIl19