simpo-component-library 3.6.613 → 3.6.615

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 (30) hide show
  1. package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +3 -3
  2. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +3 -3
  3. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +18 -12
  4. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +62 -16
  5. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
  6. package/esm2022/lib/services/analytics.service.mjs +152 -0
  7. package/fesm2022/simpo-component-library.mjs +210 -19
  8. package/fesm2022/simpo-component-library.mjs.map +1 -1
  9. package/lib/components/input-fields/input-fields.component.d.ts +1 -1
  10. package/lib/ecommerce/sections/featured-category/featured-category.component.d.ts +1 -1
  11. package/lib/ecommerce/sections/featured-category/featured-collection.component.d.ts +1 -1
  12. package/lib/ecommerce/sections/new-collection/new-collection.component.d.ts +1 -1
  13. package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +4 -2
  14. package/lib/ecommerce/sections/product-list/product-list.component.d.ts +5 -1
  15. package/lib/ecommerce/sections/schemes/schemes.component.d.ts +1 -1
  16. package/lib/elements/link-editor/link-editor.component.d.ts +1 -1
  17. package/lib/sections/banner-carousel/banner-carousel.component.d.ts +2 -2
  18. package/lib/sections/carousel-banner/carousel-banner.component.d.ts +1 -1
  19. package/lib/sections/contact-us/contact-us.component.d.ts +1 -1
  20. package/lib/sections/faq-section/faq-section.component.d.ts +1 -1
  21. package/lib/sections/image-grid-hotspot/image-grid-hotspot.component.d.ts +1 -1
  22. package/lib/sections/image-grid-section/image-grid-section.component.d.ts +1 -1
  23. package/lib/sections/image-section/image-section.component.d.ts +2 -2
  24. package/lib/sections/logo-showcase/logo-showcase.component.d.ts +2 -2
  25. package/lib/sections/new-testimonials/new-testimonials.component.d.ts +1 -1
  26. package/lib/sections/pricing-section/pricing-section.component.d.ts +2 -2
  27. package/lib/services/analytics.service.d.ts +31 -0
  28. package/package.json +1 -1
  29. package/simpo-component-library-3.6.615.tgz +0 -0
  30. package/simpo-component-library-3.6.613.tgz +0 -0
@@ -0,0 +1,152 @@
1
+ import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
2
+ import { interval } from 'rxjs';
3
+ import { DOCUMENT } from '@angular/common';
4
+ import { API_URL } from '../tokens/api-token';
5
+ import { LOCAL_STORAGE } from '../services/local-storage.token';
6
+ import { NavigationEnd } from '@angular/router';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ import * as i2 from "./storage.service";
10
+ import * as i3 from "@angular/router";
11
+ export class AnalyticsService {
12
+ constructor(http, platformId, document, storageService, API_URL, storage, router) {
13
+ this.http = http;
14
+ this.platformId = platformId;
15
+ this.document = document;
16
+ this.storageService = storageService;
17
+ this.API_URL = API_URL;
18
+ this.storage = storage;
19
+ this.router = router;
20
+ this.eventQueue = [];
21
+ this.BATCH_SIZE = 10;
22
+ this.FLUSH_INTERVAL = 5000; // 5 seconds
23
+ // ===== Duration Tracking =====
24
+ this.currentPage = '';
25
+ this.currentContextMetadata = null;
26
+ this.contextStartTime = null;
27
+ this.contextActiveTime = 0;
28
+ this.startAutoFlush();
29
+ this.listenToUnload();
30
+ this.listenToRouteChange();
31
+ }
32
+ startNewContext(metadata) {
33
+ this.closeCurrentContext(); // close previous filter session
34
+ this.currentContextMetadata = metadata;
35
+ this.contextStartTime = Date.now();
36
+ this.contextActiveTime = 0;
37
+ }
38
+ closeCurrentContext(useBeacon = false) {
39
+ if (!this.currentContextMetadata)
40
+ return;
41
+ if (this.contextStartTime) {
42
+ this.contextActiveTime += Date.now() - this.contextStartTime;
43
+ }
44
+ const user = this.storageService.getUser();
45
+ const requestFrom = this.storage.getItem('REQUEST_FROM');
46
+ if (!user || requestFrom === 'ECOMMERCE')
47
+ return;
48
+ const event = {
49
+ businessId: this.storage.getItem('bId') || '',
50
+ businessName: this.storage.getItem('bName') || '',
51
+ userId: user.userId,
52
+ createdTimeStamp: new Date().toISOString(),
53
+ page: this.currentPage,
54
+ duration: this.contextActiveTime,
55
+ metadata: this.currentContextMetadata
56
+ };
57
+ if (useBeacon) {
58
+ fetch(this.API_URL + 'ecommerce/analytics/batch', {
59
+ method: 'POST',
60
+ body: JSON.stringify([event]),
61
+ headers: {
62
+ 'Content-Type': 'application/json'
63
+ },
64
+ keepalive: true
65
+ });
66
+ }
67
+ else {
68
+ this.eventQueue.push(event);
69
+ }
70
+ this.currentContextMetadata = null;
71
+ this.contextStartTime = null;
72
+ this.contextActiveTime = 0;
73
+ }
74
+ // ===============================
75
+ // 🔥 ROUTE CHANGE LISTENER
76
+ // ===============================
77
+ listenToRouteChange() {
78
+ this.router.events.subscribe(event => {
79
+ if (event instanceof NavigationEnd) {
80
+ // Close previous page context
81
+ this.closeCurrentContext();
82
+ this.currentPage = this.router.url.split('?')[0];
83
+ this.contextStartTime = Date.now();
84
+ this.contextActiveTime = 0;
85
+ }
86
+ });
87
+ }
88
+ trackUser(event) {
89
+ const user = this.storageService.getUser();
90
+ const requestFrom = this.storage.getItem('REQUEST_FROM');
91
+ if (user === null || requestFrom === 'ECOMMERCE') {
92
+ return;
93
+ }
94
+ const page = this.router.url.split('?')[0];
95
+ this.eventQueue.push({
96
+ businessId: this.storage.getItem('bId') || '',
97
+ businessName: this.storage.getItem('bName') || '',
98
+ userId: user?.userId,
99
+ createdTimeStamp: new Date().toISOString(),
100
+ page: page,
101
+ metadata: event,
102
+ });
103
+ if (this.eventQueue.length >= this.BATCH_SIZE) {
104
+ this.flush();
105
+ }
106
+ }
107
+ startAutoFlush() {
108
+ interval(this.FLUSH_INTERVAL).subscribe(() => {
109
+ if (this.eventQueue.length > 0) {
110
+ this.flush();
111
+ }
112
+ });
113
+ }
114
+ flush() {
115
+ const eventsToSend = [...this.eventQueue];
116
+ this.eventQueue = [];
117
+ this.http.post(this.API_URL + 'ecommerce/analytics/batch', eventsToSend)
118
+ .subscribe({ error: () => { } });
119
+ }
120
+ listenToUnload() {
121
+ this.document.addEventListener('visibilitychange', () => {
122
+ if (this.document.visibilityState === 'visible') {
123
+ this.contextStartTime = Date.now();
124
+ }
125
+ else {
126
+ if (this.contextStartTime) {
127
+ this.contextActiveTime += Date.now() - this.contextStartTime;
128
+ }
129
+ this.closeCurrentContext(true);
130
+ }
131
+ });
132
+ }
133
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnalyticsService, deps: [{ token: i1.HttpClient }, { token: PLATFORM_ID }, { token: DOCUMENT }, { token: i2.StorageServiceService }, { token: API_URL }, { token: LOCAL_STORAGE }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
134
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnalyticsService, providedIn: 'root' }); }
135
+ }
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnalyticsService, decorators: [{
137
+ type: Injectable,
138
+ args: [{ providedIn: 'root' }]
139
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: Object, decorators: [{
140
+ type: Inject,
141
+ args: [PLATFORM_ID]
142
+ }] }, { type: Document, decorators: [{
143
+ type: Inject,
144
+ args: [DOCUMENT]
145
+ }] }, { type: i2.StorageServiceService }, { type: undefined, decorators: [{
146
+ type: Inject,
147
+ args: [API_URL]
148
+ }] }, { type: undefined, decorators: [{
149
+ type: Inject,
150
+ args: [LOCAL_STORAGE]
151
+ }] }, { type: i3.Router }] });
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlcnZpY2VzL2FuYWx5dGljcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxRQUFRLEVBQXFCLE1BQU0saUJBQWlCLENBQUM7QUFFOUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFVLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBR3hELE1BQU0sT0FBTyxnQkFBZ0I7SUFZekIsWUFBb0IsSUFBZ0IsRUFDSCxVQUFrQixFQUNyQixRQUFrQixFQUMzQixjQUFxQyxFQUM3QixPQUFlLEVBQ1QsT0FBb0IsRUFDM0MsTUFBYztRQU5OLFNBQUksR0FBSixJQUFJLENBQVk7UUFDSCxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDM0IsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQzdCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDVCxZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQzNDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFoQmxCLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFDdkIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixtQkFBYyxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7UUFFM0MsZ0NBQWdDO1FBQ3hCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLDJCQUFzQixHQUFRLElBQUksQ0FBQztRQUNuQyxx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QWdCLGNBREgsTUFBTTs7NEZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQWN6QixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixNQUFNOzJCQUFDLFFBQVE7OzBCQUVmLE1BQU07MkJBQUMsT0FBTzs7MEJBQ2QsTUFBTTsyQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEFQSV9VUkwgfSBmcm9tICcuLi90b2tlbnMvYXBpLXRva2VuJztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL2Vjb21tZXJjZS9zdHlsZXMvdXNlci5tb2RhbCc7XHJcbmltcG9ydCB7IFN0b3JhZ2VMaWtlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RvcmFnZS1saWtlJztcclxuaW1wb3J0IHsgTE9DQUxfU1RPUkFHRSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UudG9rZW4nO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIEFuYWx5dGljc1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgZXZlbnRRdWV1ZTogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgQkFUQ0hfU0laRSA9IDEwO1xyXG4gICAgcHJpdmF0ZSBGTFVTSF9JTlRFUlZBTCA9IDUwMDA7IC8vIDUgc2Vjb25kc1xyXG5cclxuICAgIC8vID09PT09IER1cmF0aW9uIFRyYWNraW5nID09PT09XHJcbiAgICBwcml2YXRlIGN1cnJlbnRQYWdlID0gJyc7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRDb250ZXh0TWV0YWRhdGE6IGFueSA9IG51bGw7XHJcbiAgICBwcml2YXRlIGNvbnRleHRTdGFydFRpbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjb250ZXh0QWN0aXZlVGltZSA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcclxuICAgICAgICBASW5qZWN0KEFQSV9VUkwpIHByaXZhdGUgQVBJX1VSTDogc3RyaW5nLFxyXG4gICAgICAgIEBJbmplY3QoTE9DQUxfU1RPUkFHRSkgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlTGlrZSxcclxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnN0YXJ0QXV0b0ZsdXNoKCk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5Ub1VubG9hZCgpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuVG9Sb3V0ZUNoYW5nZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0TmV3Q29udGV4dChtZXRhZGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jbG9zZUN1cnJlbnRDb250ZXh0KCk7ICAgLy8gY2xvc2UgcHJldmlvdXMgZmlsdGVyIHNlc3Npb25cclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGV4dE1ldGFkYXRhID0gbWV0YWRhdGE7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0U3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB0aGlzLmNvbnRleHRBY3RpdmVUaW1lID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsb3NlQ3VycmVudENvbnRleHQodXNlQmVhY29uOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRDb250ZXh0TWV0YWRhdGEpIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dFN0YXJ0VGltZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHRBY3RpdmVUaW1lICs9IERhdGUubm93KCkgLSB0aGlzLmNvbnRleHRTdGFydFRpbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VyOiBVc2VyIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpO1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RGcm9tID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oJ1JFUVVFU1RfRlJPTScpO1xyXG5cclxuICAgICAgICBpZiAoIXVzZXIgfHwgcmVxdWVzdEZyb20gPT09ICdFQ09NTUVSQ0UnKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICAgICAgICBidXNpbmVzc0lkOiB0aGlzLnN0b3JhZ2UuZ2V0SXRlbSgnYklkJykgfHwgJycsXHJcbiAgICAgICAgICAgIGJ1c2luZXNzTmFtZTogdGhpcy5zdG9yYWdlLmdldEl0ZW0oJ2JOYW1lJykgfHwgJycsXHJcbiAgICAgICAgICAgIHVzZXJJZDogdXNlci51c2VySWQsXHJcbiAgICAgICAgICAgIGNyZWF0ZWRUaW1lU3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgcGFnZTogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuY29udGV4dEFjdGl2ZVRpbWUsXHJcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLmN1cnJlbnRDb250ZXh0TWV0YWRhdGFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodXNlQmVhY29uKSB7XHJcblxyXG4gICAgICAgICAgIGZldGNoKHRoaXMuQVBJX1VSTCArICdlY29tbWVyY2UvYW5hbHl0aWNzL2JhdGNoJywge1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShbZXZlbnRdKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZWVwYWxpdmU6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRRdWV1ZS5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudENvbnRleHRNZXRhZGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0U3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNvbnRleHRBY3RpdmVUaW1lID0gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyDwn5SlIFJPVVRFIENIQU5HRSBMSVNURU5FUlxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgcHJpdmF0ZSBsaXN0ZW5Ub1JvdXRlQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgcGFnZSBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQ3VycmVudENvbnRleHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0QWN0aXZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0cmFja1VzZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHVzZXI6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdEZyb20gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbSgnUkVRVUVTVF9GUk9NJylcclxuXHJcbiAgICAgICAgaWYgKHVzZXIgPT09IG51bGwgfHwgcmVxdWVzdEZyb20gPT09ICdFQ09NTUVSQ0UnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudFF1ZXVlLnB1c2goe1xyXG4gICAgICAgICAgICBidXNpbmVzc0lkOiB0aGlzLnN0b3JhZ2UuZ2V0SXRlbSgnYklkJykgfHwgJycsXHJcbiAgICAgICAgICAgIGJ1c2luZXNzTmFtZTogdGhpcy5zdG9yYWdlLmdldEl0ZW0oJ2JOYW1lJykgfHwgJycsXHJcbiAgICAgICAgICAgIHVzZXJJZDogdXNlcj8udXNlcklkLFxyXG4gICAgICAgICAgICBjcmVhdGVkVGltZVN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXHJcbiAgICAgICAgICAgIG1ldGFkYXRhOiBldmVudCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRRdWV1ZS5sZW5ndGggPj0gdGhpcy5CQVRDSF9TSVpFKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydEF1dG9GbHVzaCgpIHtcclxuICAgICAgICBpbnRlcnZhbCh0aGlzLkZMVVNIX0lOVEVSVkFMKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ldmVudFF1ZXVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmx1c2goKSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnRzVG9TZW5kID0gWy4uLnRoaXMuZXZlbnRRdWV1ZV07XHJcbiAgICAgICAgdGhpcy5ldmVudFF1ZXVlID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuQVBJX1VSTCArICdlY29tbWVyY2UvYW5hbHl0aWNzL2JhdGNoJywgZXZlbnRzVG9TZW5kKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHsgZXJyb3I6ICgpID0+IHsgfSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxpc3RlblRvVW5sb2FkKCkge1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRTdGFydFRpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRBY3RpdmVUaW1lICs9IERhdGUubm93KCkgLSB0aGlzLmNvbnRleHRTdGFydFRpbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUN1cnJlbnRDb250ZXh0KHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iXX0=