vcomply-workflow-engine 3.9.0 → 3.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/constants/template.constant.mjs +6 -0
- package/esm2022/lib/services/auth.service.mjs +172 -0
- package/esm2022/lib/sharedComponents/document-section/document-section.component.mjs +49 -24
- package/esm2022/lib/sharedComponents/policy-template/constants/template.constant.mjs +3 -0
- package/esm2022/lib/sharedComponents/policy-template/policy-template.module.mjs +65 -0
- package/esm2022/lib/sharedComponents/policy-template/select-template-list/select-template-list.component.mjs +205 -0
- package/esm2022/lib/sharedComponents/policy-template/services/template.service.mjs +67 -0
- package/esm2022/lib/sharedComponents/policy-template/template-list-table/template-list-table.component.mjs +42 -0
- package/esm2022/lib/sharedComponents/policy-template/template-pipes/get-template-category.pipe.mjs +19 -0
- package/esm2022/lib/sharedComponents/policy-template/template-pipes/search-template.pipe.mjs +59 -0
- package/esm2022/lib/sharedComponents/policy-template/template-pipes/template-pipes.module.mjs +19 -0
- package/esm2022/lib/sharedComponents/policy-template/view-policy/view-policy/view-policy.component.mjs +91 -0
- package/esm2022/lib/sharedComponents/policy-template/view-policy/view-policy.module.mjs +19 -0
- package/esm2022/lib/ui-kit/multi-select/cs-multiselect/cs-multiselect.component.mjs +203 -0
- package/esm2022/lib/ui-kit/multi-select/cs-multiselect-option/cs-multiselect-option.component.mjs +31 -0
- package/esm2022/lib/ui-kit/multi-select/multi-select.module.mjs +37 -0
- package/esm2022/lib/ui-kit/multi-select/multi-select.service.mjs +16 -0
- package/esm2022/lib/workflow-engine.module.mjs +11 -3
- package/esm2022/lib/workflow-policy/workflow-policy.component.mjs +35 -16
- package/fesm2022/vcomply-workflow-engine.mjs +875 -28
- package/fesm2022/vcomply-workflow-engine.mjs.map +1 -1
- package/lib/constants/template.constant.d.ts +5 -0
- package/lib/services/auth.service.d.ts +39 -0
- package/lib/sharedComponents/document-section/document-section.component.d.ts +3 -1
- package/lib/sharedComponents/policy-template/constants/template.constant.d.ts +2 -0
- package/lib/sharedComponents/policy-template/policy-template.module.d.ts +20 -0
- package/lib/sharedComponents/policy-template/select-template-list/select-template-list.component.d.ts +48 -0
- package/lib/sharedComponents/policy-template/services/template.service.d.ts +19 -0
- package/lib/sharedComponents/policy-template/template-list-table/template-list-table.component.d.ts +14 -0
- package/lib/sharedComponents/policy-template/template-pipes/get-template-category.pipe.d.ts +7 -0
- package/lib/sharedComponents/policy-template/template-pipes/search-template.pipe.d.ts +37 -0
- package/lib/sharedComponents/policy-template/template-pipes/template-pipes.module.d.ts +9 -0
- package/lib/sharedComponents/policy-template/view-policy/view-policy/view-policy.component.d.ts +25 -0
- package/lib/sharedComponents/policy-template/view-policy/view-policy.module.d.ts +9 -0
- package/lib/ui-kit/multi-select/cs-multiselect/cs-multiselect.component.d.ts +69 -0
- package/lib/ui-kit/multi-select/cs-multiselect-option/cs-multiselect-option.component.d.ts +12 -0
- package/lib/ui-kit/multi-select/multi-select.module.d.ts +11 -0
- package/lib/ui-kit/multi-select/multi-select.service.d.ts +7 -0
- package/lib/workflow-engine.module.d.ts +3 -1
- package/lib/workflow-policy/workflow-policy.component.d.ts +2 -0
- package/lib/workflow-risk/workflow-risk.component.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const APIs = {
|
|
2
|
+
fetchTemplates: 'templates/list',
|
|
3
|
+
default_categories: `default/getDefaultCategories`,
|
|
4
|
+
fetch_content: 'fetchTemplateContent?id=',
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY29uc3RhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92eC13b3JrZmxvdy1lbmdpbmUvc3JjL2xpYi9jb25zdGFudHMvdGVtcGxhdGUuY29uc3RhbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHO0lBQ2xCLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsa0JBQWtCLEVBQUUsOEJBQThCO0lBQ2xELGFBQWEsRUFBRSwwQkFBMEI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBBUElzID0ge1xyXG4gIGZldGNoVGVtcGxhdGVzOiAndGVtcGxhdGVzL2xpc3QnLFxyXG4gIGRlZmF1bHRfY2F0ZWdvcmllczogYGRlZmF1bHQvZ2V0RGVmYXVsdENhdGVnb3JpZXNgLFxyXG4gIGZldGNoX2NvbnRlbnQ6ICdmZXRjaFRlbXBsYXRlQ29udGVudD9pZD0nLFxyXG59O1xyXG4iXX0=
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, map, retry, shareReplay } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common/http";
|
|
5
|
+
import * as i2 from "@vcomply/authorizer";
|
|
6
|
+
import * as i3 from "../workflow-services/common-workflow-services/organization-common.service";
|
|
7
|
+
import * as i4 from "../configurations";
|
|
8
|
+
export class AuthService {
|
|
9
|
+
constructor(http, authorizer, organizationCommonService, config) {
|
|
10
|
+
this.http = http;
|
|
11
|
+
this.authorizer = authorizer;
|
|
12
|
+
this.organizationCommonService = organizationCommonService;
|
|
13
|
+
this.subscriptionDetails = new BehaviorSubject([]);
|
|
14
|
+
this.userDetails = new BehaviorSubject({});
|
|
15
|
+
this.permissions = [];
|
|
16
|
+
this.getSubscriptionDetails();
|
|
17
|
+
this.env = config?.envConfig;
|
|
18
|
+
}
|
|
19
|
+
setPermission() {
|
|
20
|
+
const assessmentPermission = this.roleBasedPermission.filter((ele) => ele.moduleName === 'assessment');
|
|
21
|
+
if (assessmentPermission?.length > 0) {
|
|
22
|
+
const permission = assessmentPermission[0];
|
|
23
|
+
const allowedFlows = [];
|
|
24
|
+
permission.subModule.forEach((ele) => {
|
|
25
|
+
ele.permissions.forEach((subModule) => {
|
|
26
|
+
switch (subModule?.code) {
|
|
27
|
+
case 'AALVAL': {
|
|
28
|
+
if (subModule?.defaultPermission == 1 || subModule?.enable == 1) {
|
|
29
|
+
allowedFlows.push('VIEW_ASSESSMENT_LIBRARY');
|
|
30
|
+
}
|
|
31
|
+
;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case 'AALMAL': {
|
|
35
|
+
if (subModule?.defaultPermission || subModule?.enable) {
|
|
36
|
+
allowedFlows.push('MANAGE_ASSESSMENT_LIBRARY');
|
|
37
|
+
}
|
|
38
|
+
;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
case 'AAVA': {
|
|
42
|
+
if (subModule?.defaultPermission || subModule?.enable) {
|
|
43
|
+
allowedFlows.push('VIEW_ASSESSMENTS');
|
|
44
|
+
}
|
|
45
|
+
;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case 'AAMA': {
|
|
49
|
+
if (subModule?.defaultPermission || subModule?.enable) {
|
|
50
|
+
allowedFlows.push('MANAGE_ASSESSMENTS');
|
|
51
|
+
}
|
|
52
|
+
;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
this.permissions = allowedFlows;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns weather the user data loaded or not
|
|
63
|
+
* @returns
|
|
64
|
+
*/
|
|
65
|
+
startApp() {
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
this.getUser().subscribe((res) => {
|
|
68
|
+
resolve(true);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Gets user details
|
|
74
|
+
* @returns
|
|
75
|
+
*/
|
|
76
|
+
getUser() {
|
|
77
|
+
return this.http.get(this.env.organizationGet + 'memberFindbyId&id=' + this.authorizer.getMemberId() ?? '')
|
|
78
|
+
.pipe(map((res) => {
|
|
79
|
+
this.userDetails.next(res);
|
|
80
|
+
this.roleBasedPermission = res?.roleActions;
|
|
81
|
+
this.setPermission();
|
|
82
|
+
}), shareReplay(1)).pipe(retry(2));
|
|
83
|
+
}
|
|
84
|
+
getSubscriptionDetails() {
|
|
85
|
+
return this.organizationCommonService
|
|
86
|
+
?.getSubscriptionDetailsInfo()
|
|
87
|
+
?.subscribe({
|
|
88
|
+
next: (res) => {
|
|
89
|
+
this.subscriptionDetails?.next(res);
|
|
90
|
+
},
|
|
91
|
+
error: (error) => {
|
|
92
|
+
console.error(error);
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
getUserRole() {
|
|
97
|
+
if (this.authorizer.isKeyAdmin()) {
|
|
98
|
+
return 'KEY_ADMIN';
|
|
99
|
+
}
|
|
100
|
+
else if (this.authorizer.isAdmin()) {
|
|
101
|
+
return 'ADMIN';
|
|
102
|
+
}
|
|
103
|
+
else if (this.authorizer.isManager()) {
|
|
104
|
+
return 'MANAGER';
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
return 'EXECUTIVE';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
logout() {
|
|
111
|
+
this.authorizer.logout();
|
|
112
|
+
}
|
|
113
|
+
convertUtcToLocalDateTime(timestamp) {
|
|
114
|
+
if (typeof timestamp !== 'string') {
|
|
115
|
+
let TimeZone = this.authorizer.getUserTimezone() ?? '';
|
|
116
|
+
const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
117
|
+
const dayName = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
118
|
+
if (TimeZone === '' || parseInt(timestamp.toString(), 10) <= 0) {
|
|
119
|
+
return '0';
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const UTC_TIME = new Intl.DateTimeFormat('en', {
|
|
123
|
+
timeZone: TimeZone,
|
|
124
|
+
hour: 'numeric',
|
|
125
|
+
minute: 'numeric',
|
|
126
|
+
});
|
|
127
|
+
const GET_TIME = UTC_TIME.format(new Date(timestamp * 1000));
|
|
128
|
+
const UTC_DATE = new Intl.DateTimeFormat('en', {
|
|
129
|
+
timeZone: TimeZone,
|
|
130
|
+
});
|
|
131
|
+
const MY_DATE = UTC_DATE.format(new Date(timestamp * 1000));
|
|
132
|
+
const date = new Date(MY_DATE);
|
|
133
|
+
const DAY_NAME = dayName[date.getDay()];
|
|
134
|
+
let day = date.getDate().toString();
|
|
135
|
+
day = day.length === 1 ? '0' + day : day;
|
|
136
|
+
const monthIndex = date.getMonth();
|
|
137
|
+
const year = date.getFullYear();
|
|
138
|
+
const GET_DATE = day + '-' + monthNames[monthIndex] + '-' + year;
|
|
139
|
+
// const DATE_TIME = GET_DATE + ' ' + GET_TIME ;
|
|
140
|
+
return GET_DATE;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return '';
|
|
144
|
+
}
|
|
145
|
+
getNotificationDetails() {
|
|
146
|
+
return this.http.get(this.env.complianceGet + 'complianceReport/TotalResponsibilityQueue').pipe(retry(2));
|
|
147
|
+
}
|
|
148
|
+
userId() {
|
|
149
|
+
return this.authorizer.getUserId() ?? '';
|
|
150
|
+
}
|
|
151
|
+
getBussinessCycle() {
|
|
152
|
+
return this.http.get(this.env.organizationGet + 'orgDetails&id=' + this.getOrgId()).pipe(retry(2));
|
|
153
|
+
}
|
|
154
|
+
getOrgId() {
|
|
155
|
+
const userInfo = this.authorizer.getUser();
|
|
156
|
+
return userInfo?.organisation_id ? userInfo.organisation_id : null;
|
|
157
|
+
}
|
|
158
|
+
resetBusinessCycle() {
|
|
159
|
+
localStorage.removeItem('businessCycle');
|
|
160
|
+
}
|
|
161
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthService, deps: [{ token: i1.HttpClient }, { token: i2.AuthorizerService }, { token: i3.OrganizationCommonService }, { token: i4.Configurations, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
162
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthService, providedIn: 'root' }); }
|
|
163
|
+
}
|
|
164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthService, decorators: [{
|
|
165
|
+
type: Injectable,
|
|
166
|
+
args: [{
|
|
167
|
+
providedIn: 'root',
|
|
168
|
+
}]
|
|
169
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.AuthorizerService }, { type: i3.OrganizationCommonService }, { type: i4.Configurations, decorators: [{
|
|
170
|
+
type: Optional
|
|
171
|
+
}] }]; } });
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdngtd29ya2Zsb3ctZW5naW5lL3NyYy9saWIvc2VydmljZXMvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQWMsR0FBRyxFQUF5QixLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFPbkcsTUFBTSxPQUFPLFdBQVc7SUFnQnRCLFlBQ1UsSUFBZ0IsRUFDaEIsVUFBNkIsRUFDN0IseUJBQW9ELEVBQ2hELE1BQXVCO1FBSDNCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQWxCdkQsd0JBQW1CLEdBQTJCLElBQUksZUFBZSxDQUV0RSxFQUFFLENBQUMsQ0FBQztRQUNDLGdCQUFXLEdBQXlCLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLGdCQUFXLEdBQU0sRUFBRSxDQUFDO1FBZ0JsQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sRUFBRSxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUNELGFBQWE7UUFDWCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssWUFBWSxDQUFDLENBQUE7UUFDMUcsSUFBRyxvQkFBb0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sWUFBWSxHQUFPLEVBQUUsQ0FBQTtZQUMzQixVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQU8sRUFBQyxFQUFFO2dCQUV0QyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQWEsRUFBQyxFQUFFO29CQUd2QyxRQUFPLFNBQVMsRUFBRSxJQUFJLEVBQUM7d0JBQ3JCLEtBQUssUUFBUyxDQUFDLENBQUM7NEJBR0MsSUFBRyxTQUFTLEVBQUUsaUJBQWlCLElBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxNQUFNLElBQUUsQ0FBQyxFQUFDO2dDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQTs2QkFBQzs0QkFBQSxDQUFDOzRCQUMxRyxNQUFNO3lCQUNOO3dCQUNqQixLQUFLLFFBQVMsQ0FBQyxDQUFDOzRCQUNBLElBQUksU0FBUyxFQUFFLGlCQUFpQixJQUFJLFNBQVMsRUFBRSxNQUFNLEVBQUM7Z0NBQUUsWUFBWSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBOzZCQUFDOzRCQUFBLENBQUM7NEJBQ3ZHLE1BQU07eUJBQ047d0JBQ2pCLEtBQUssTUFBTyxDQUFDLENBQUM7NEJBQ0ksSUFBRyxTQUFTLEVBQUUsaUJBQWlCLElBQUksU0FBUyxFQUFFLE1BQU0sRUFBQztnQ0FBRSxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7NkJBQUM7NEJBQUEsQ0FBQzs0QkFDOUYsTUFBTTt5QkFDTjt3QkFDbEIsS0FBSyxNQUFRLENBQUMsQ0FBQTs0QkFDRSxJQUFHLFNBQVMsRUFBRSxpQkFBaUIsSUFBSSxTQUFTLEVBQUUsTUFBTSxFQUFDO2dDQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQTs2QkFBQzs0QkFBQSxDQUFDOzRCQUNoRyxNQUFNO3lCQUNOO3FCQUVqQjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQ7OztNQUdFO0lBQ0YsUUFBUTtRQUNOLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O01BR0U7SUFDRixPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN4RyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBVSxDQUFDLENBQUM7WUFFbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsRUFBRSxXQUFXLENBQUU7WUFDN0MsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDakIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyx5QkFBeUI7WUFDbkMsRUFBRSwwQkFBMEIsRUFBRTtZQUM5QixFQUFFLFNBQVMsQ0FBQztZQUNWLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEdBQVUsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFZLEVBQUUsRUFBRTtnQkFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDaEMsT0FBTyxXQUFXLENBQUM7U0FDcEI7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDcEMsT0FBTyxPQUFPLENBQUM7U0FDaEI7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDdEMsT0FBTyxTQUFTLENBQUM7U0FDbEI7YUFBTTtZQUNMLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUNELE1BQU07UUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFDRCx5QkFBeUIsQ0FBQyxTQUEwQjtRQUNsRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNqQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxJQUFFLEVBQUUsQ0FBQztZQUNyRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEcsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvRixJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlELE9BQU8sR0FBRyxDQUFDO2FBQ1o7aUJBQU07Z0JBQ0wsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRTtvQkFDN0MsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLElBQUksRUFBRSxTQUFTO29CQUNmLE1BQU0sRUFBRSxTQUFTO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRTtvQkFDN0MsUUFBUSxFQUFFLFFBQVE7aUJBQ25CLENBQUMsQ0FBQztnQkFFSCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3BDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFFaEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztnQkFFakUsZ0RBQWdEO2dCQUNoRCxPQUFPLFFBQVEsQ0FBQzthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0Qsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsMkNBQTJDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEgsQ0FBQztJQUVBLE1BQU07UUFDTCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUUsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxpQkFBaUI7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLFFBQVEsR0FBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVDLE9BQU8sUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUEsSUFBSSxDQUFDO0lBQ3BFLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMzQyxDQUFDOytHQTNLVSxXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBcUJJLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNhdGNoRXJyb3IsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHBsdWNrLCByZXRyeSwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQXV0aG9yaXplclNlcnZpY2UgfSBmcm9tICdAdmNvbXBseS9hdXRob3JpemVyJztcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbnMgfSBmcm9tICcuLi9jb25maWd1cmF0aW9ucyc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkNvbW1vblNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1zZXJ2aWNlcy9jb21tb24td29ya2Zsb3ctc2VydmljZXMvb3JnYW5pemF0aW9uLWNvbW1vbi5zZXJ2aWNlJztcclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcclxuICBwdWJsaWMgc3Vic2NyaXB0aW9uRGV0YWlsczogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICBhbnlbXVxyXG4gID4oW10pO1xyXG4gIHB1YmxpYyB1c2VyRGV0YWlsczogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xyXG4gIGVudjogYW55O1xyXG4gIHBlcm1pc3Npb25zOmFueSA9W107XHJcblxyXG5cclxuICAvL1ZJRVdfQVNTRVNTTUVOVF9MSUJSQVJZXHJcbiAgLy9NQU5BR0VfQVNTRVNTTUVOVF9MSUJSQVJZXHJcbiAgLy9WSUVXX0FTU0VTU01FTlRTXHJcbiAgLy9WSUVXX0FTU0VTU01FTlRTXHJcblxyXG4gIHJvbGVCYXNlZFBlcm1pc3Npb24gITphbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBhdXRob3JpemVyOiBBdXRob3JpemVyU2VydmljZSxcclxuICAgIHByaXZhdGUgb3JnYW5pemF0aW9uQ29tbW9uU2VydmljZTogT3JnYW5pemF0aW9uQ29tbW9uU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIGNvbmZpZz86IENvbmZpZ3VyYXRpb25zXHJcbiAgKSB7XHJcbiAgICB0aGlzLmdldFN1YnNjcmlwdGlvbkRldGFpbHMoKTtcclxuICAgIHRoaXMuZW52ID0gY29uZmlnPy5lbnZDb25maWc7XHJcbiAgfVxyXG4gIHNldFBlcm1pc3Npb24oKXtcclxuICAgIGNvbnN0IGFzc2Vzc21lbnRQZXJtaXNzaW9uID0gdGhpcy5yb2xlQmFzZWRQZXJtaXNzaW9uLmZpbHRlcigoZWxlOmFueSkgPT4gZWxlLm1vZHVsZU5hbWUgPT09ICdhc3Nlc3NtZW50JylcclxuICAgIGlmKGFzc2Vzc21lbnRQZXJtaXNzaW9uPy5sZW5ndGggPiAwKXtcclxuICAgICAgY29uc3QgcGVybWlzc2lvbiA9IGFzc2Vzc21lbnRQZXJtaXNzaW9uWzBdO1xyXG4gICAgICBjb25zdCBhbGxvd2VkRmxvd3M6YW55ID0gW11cclxuICAgICAgcGVybWlzc2lvbi5zdWJNb2R1bGUuZm9yRWFjaCgoZWxlOmFueSk9PntcclxuXHJcbiAgICAgICAgZWxlLnBlcm1pc3Npb25zLmZvckVhY2goKHN1Yk1vZHVsZTphbnkpPT57XHJcblxyXG5cclxuICAgICAgICAgIHN3aXRjaChzdWJNb2R1bGU/LmNvZGUpe1xyXG4gICAgICAgICAgICBjYXNlICdBQUxWQUwnIDoge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3ViTW9kdWxlPy5kZWZhdWx0UGVybWlzc2lvbj09MSB8fCBzdWJNb2R1bGU/LmVuYWJsZT09MSl7YWxsb3dlZEZsb3dzLnB1c2goJ1ZJRVdfQVNTRVNTTUVOVF9MSUJSQVJZJyl9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdBQUxNQUwnIDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk1vZHVsZT8uZGVmYXVsdFBlcm1pc3Npb24gfHwgc3ViTW9kdWxlPy5lbmFibGUpeyBhbGxvd2VkRmxvd3MucHVzaCgnTUFOQUdFX0FTU0VTU01FTlRfTElCUkFSWScpfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnQUFWQScgOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN1Yk1vZHVsZT8uZGVmYXVsdFBlcm1pc3Npb24gfHwgc3ViTW9kdWxlPy5lbmFibGUpeyBhbGxvd2VkRmxvd3MucHVzaCgnVklFV19BU1NFU1NNRU5UUycpfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdBQU1BJyAgOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN1Yk1vZHVsZT8uZGVmYXVsdFBlcm1pc3Npb24gfHwgc3ViTW9kdWxlPy5lbmFibGUpeyBhbGxvd2VkRmxvd3MucHVzaCgnTUFOQUdFX0FTU0VTU01FTlRTJyl9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBhbGxvd2VkRmxvd3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFJldHVybnMgd2VhdGhlciB0aGUgdXNlciBkYXRhIGxvYWRlZCBvciBub3RcclxuICAqIEByZXR1cm5zXHJcbiAgKi9cclxuICBzdGFydEFwcCgpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZ2V0VXNlcigpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBHZXRzIHVzZXIgZGV0YWlsc1xyXG4gICogQHJldHVybnNcclxuICAqL1xyXG4gIGdldFVzZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmVudi5vcmdhbml6YXRpb25HZXQgKyAnbWVtYmVyRmluZGJ5SWQmaWQ9JyArIHRoaXMuYXV0aG9yaXplci5nZXRNZW1iZXJJZCgpID8/ICcnKVxyXG4gICAgICAucGlwZShtYXAoKHJlczphbnkpID0+IHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzLm5leHQocmVzIGFzIGFueSk7XHJcblxyXG4gICAgICAgIHRoaXMucm9sZUJhc2VkUGVybWlzc2lvbiA9IHJlcz8ucm9sZUFjdGlvbnMgO1xyXG4gICAgICAgIHRoaXMuc2V0UGVybWlzc2lvbigpO1xyXG4gICAgICB9KSwgc2hhcmVSZXBsYXkoMSlcclxuICAgICAgKS5waXBlKHJldHJ5KDIpKTtcclxuICB9XHJcblxyXG4gIGdldFN1YnNjcmlwdGlvbkRldGFpbHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcmdhbml6YXRpb25Db21tb25TZXJ2aWNlXHJcbiAgICAgID8uZ2V0U3Vic2NyaXB0aW9uRGV0YWlsc0luZm8oKVxyXG4gICAgICA/LnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkRldGFpbHM/Lm5leHQocmVzIGFzIGFueSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBFcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyUm9sZSgpOiAnS0VZX0FETUlOJyB8ICdBRE1JTicgfCAnTUFOQUdFUicgfCAnRVhFQ1VUSVZFJyB7XHJcbiAgICBpZiAodGhpcy5hdXRob3JpemVyLmlzS2V5QWRtaW4oKSkge1xyXG4gICAgICByZXR1cm4gJ0tFWV9BRE1JTic7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aG9yaXplci5pc0FkbWluKCkpIHtcclxuICAgICAgcmV0dXJuICdBRE1JTic7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aG9yaXplci5pc01hbmFnZXIoKSkge1xyXG4gICAgICByZXR1cm4gJ01BTkFHRVInO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdFWEVDVVRJVkUnO1xyXG4gICAgfVxyXG4gIH1cclxuICBsb2dvdXQoKXtcclxuICAgIHRoaXMuYXV0aG9yaXplci5sb2dvdXQoKVxyXG4gIH1cclxuICBjb252ZXJ0VXRjVG9Mb2NhbERhdGVUaW1lKHRpbWVzdGFtcDogc3RyaW5nIHwgbnVtYmVyKSB7XHJcbiAgICBpZiAodHlwZW9mIHRpbWVzdGFtcCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgbGV0IFRpbWVab25lID0gdGhpcy5hdXRob3JpemVyLmdldFVzZXJUaW1lem9uZSgpPz8nJztcclxuICAgICAgY29uc3QgbW9udGhOYW1lcyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcclxuICAgICAgY29uc3QgZGF5TmFtZSA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcclxuICAgICAgaWYgKFRpbWVab25lID09PSAnJyB8fCBwYXJzZUludCh0aW1lc3RhbXAudG9TdHJpbmcoKSwgMTApIDw9IDApIHtcclxuICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IFVUQ19USU1FID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuJywge1xyXG4gICAgICAgICAgdGltZVpvbmU6IFRpbWVab25lLFxyXG4gICAgICAgICAgaG91cjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgbWludXRlOiAnbnVtZXJpYycsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgR0VUX1RJTUUgPSBVVENfVElNRS5mb3JtYXQobmV3IERhdGUodGltZXN0YW1wICogMTAwMCkpO1xyXG5cclxuICAgICAgICBjb25zdCBVVENfREFURSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbicsIHtcclxuICAgICAgICAgIHRpbWVab25lOiBUaW1lWm9uZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgTVlfREFURSA9IFVUQ19EQVRFLmZvcm1hdChuZXcgRGF0ZSh0aW1lc3RhbXAgKiAxMDAwKSk7XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKE1ZX0RBVEUpO1xyXG4gICAgICAgIGNvbnN0IERBWV9OQU1FID0gZGF5TmFtZVtkYXRlLmdldERheSgpXTtcclxuICAgICAgICBsZXQgZGF5ID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKTtcclxuICAgICAgICBkYXkgPSBkYXkubGVuZ3RoID09PSAxID8gJzAnICsgZGF5IDogZGF5O1xyXG4gICAgICAgIGNvbnN0IG1vbnRoSW5kZXggPSBkYXRlLmdldE1vbnRoKCk7XHJcbiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICAgICAgY29uc3QgR0VUX0RBVEUgPSBkYXkgKyAnLScgKyBtb250aE5hbWVzW21vbnRoSW5kZXhdICsgJy0nICsgeWVhcjtcclxuXHJcbiAgICAgICAgLy8gY29uc3QgREFURV9USU1FID0gR0VUX0RBVEUgKyAnICcgKyBHRVRfVElNRSA7XHJcbiAgICAgICAgcmV0dXJuIEdFVF9EQVRFO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG4gIGdldE5vdGlmaWNhdGlvbkRldGFpbHMoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odGhpcy5lbnYuY29tcGxpYW5jZUdldCArICdjb21wbGlhbmNlUmVwb3J0L1RvdGFsUmVzcG9uc2liaWxpdHlRdWV1ZScpLnBpcGUocmV0cnkoMikpO1xyXG4gIH1cclxuXHJcbiAgIHVzZXJJZCgpe1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aG9yaXplci5nZXRVc2VySWQoKT8/Jyc7XHJcbiAgIH1cclxuXHJcbiAgIGdldEJ1c3NpbmVzc0N5Y2xlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5lbnYub3JnYW5pemF0aW9uR2V0ICsgJ29yZ0RldGFpbHMmaWQ9JyArIHRoaXMuZ2V0T3JnSWQoKSkucGlwZShyZXRyeSgyKSk7XHJcbiAgfVxyXG5cclxuICBnZXRPcmdJZCgpe1xyXG4gICAgY29uc3QgdXNlckluZm8gID0gdGhpcy5hdXRob3JpemVyLmdldFVzZXIoKTtcclxuICAgIHJldHVybiB1c2VySW5mbz8ub3JnYW5pc2F0aW9uX2lkID8gdXNlckluZm8ub3JnYW5pc2F0aW9uX2lkIDpudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRCdXNpbmVzc0N5Y2xlKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2J1c2luZXNzQ3ljbGUnKTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG59XHJcbiJdfQ==
|