@csmart/ngc-smart-core 1.13.20 → 1.13.21
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/README.md +24 -24
- package/csmart-ngc-smart-core.d.ts +5 -5
- package/esm2020/csmart-ngc-smart-core.mjs +4 -4
- package/esm2020/lib/ngc-smart-core.module.mjs +97 -97
- package/esm2020/lib/smart-auth/smart-access-control-config.mjs +12 -12
- package/esm2020/lib/smart-auth/smart-access-control.directive.mjs +39 -39
- package/esm2020/lib/smart-auth/smart-auth.service.mjs +505 -505
- package/esm2020/lib/smart-auth/smart-authorization-guard.service.mjs +35 -35
- package/esm2020/lib/smart-auth/smart-error.component.mjs +37 -37
- package/esm2020/lib/smart-auth/smart-login-staff-resolver.service.mjs +59 -59
- package/esm2020/lib/smart-auth/smart-selected-offender-resolver.service.mjs +49 -49
- package/esm2020/lib/smart-navbar/smart-navbar-config.mjs +2 -2
- package/esm2020/lib/smart-navbar/smart-navbar.component.mjs +167 -167
- package/esm2020/lib/smart-navbar/smart-navbar.service.mjs +63 -63
- package/esm2020/lib/smart-offender-header/smart-offender-header.component.mjs +151 -151
- package/esm2020/lib/smart-offender-header/smart-offender-header.service.mjs +41 -41
- package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.mjs +25 -25
- package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options.component.mjs +78 -78
- package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options.service.mjs +132 -132
- package/esm2020/lib/smart-storage/smart-storage-model.mjs +30 -30
- package/esm2020/lib/smart-storage/xdm.service.mjs +171 -158
- package/esm2020/public-api.mjs +20 -20
- package/fesm2015/csmart-ngc-smart-core.mjs +1530 -1517
- package/fesm2015/csmart-ngc-smart-core.mjs.map +1 -1
- package/fesm2020/csmart-ngc-smart-core.mjs +1516 -1503
- package/fesm2020/csmart-ngc-smart-core.mjs.map +1 -1
- package/lib/ngc-smart-core.module.d.ts +20 -20
- package/lib/smart-auth/smart-access-control-config.d.ts +17 -17
- package/lib/smart-auth/smart-access-control.directive.d.ts +14 -14
- package/lib/smart-auth/smart-auth.service.d.ts +41 -41
- package/lib/smart-auth/smart-authorization-guard.service.d.ts +13 -13
- package/lib/smart-auth/smart-error.component.d.ts +17 -17
- package/lib/smart-auth/smart-login-staff-resolver.service.d.ts +13 -13
- package/lib/smart-auth/smart-selected-offender-resolver.service.d.ts +15 -15
- package/lib/smart-navbar/smart-navbar-config.d.ts +7 -7
- package/lib/smart-navbar/smart-navbar.component.d.ts +40 -40
- package/lib/smart-navbar/smart-navbar.service.d.ts +12 -12
- package/lib/smart-offender-header/smart-offender-header.component.d.ts +32 -32
- package/lib/smart-offender-header/smart-offender-header.service.d.ts +18 -18
- package/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.d.ts +11 -11
- package/lib/smart-staff-offender-options/smart-staff-offender-options.component.d.ts +22 -22
- package/lib/smart-staff-offender-options/smart-staff-offender-options.service.d.ts +19 -19
- package/lib/smart-storage/smart-storage-model.d.ts +58 -58
- package/lib/smart-storage/xdm.service.d.ts +42 -42
- package/package.json +1 -1
- package/public-api.d.ts +16 -16
|
@@ -1,505 +1,505 @@
|
|
|
1
|
-
import { Injectable, Inject, isDevMode } from '@angular/core';
|
|
2
|
-
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
3
|
-
import { of, from, throwError, lastValueFrom } from 'rxjs';
|
|
4
|
-
import { map, switchMap, take, catchError } from 'rxjs/operators';
|
|
5
|
-
import { MsalService } from '@azure/msal-angular';
|
|
6
|
-
import { SMART_DATA_SERVICE_URL, SMART_DOMAIN_FORMAT, } from '../smart-storage/smart-storage-model';
|
|
7
|
-
import { XdmService } from '../smart-storage/xdm.service';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common/http";
|
|
10
|
-
import * as i2 from "@azure/msal-angular";
|
|
11
|
-
import * as i3 from "../smart-storage/xdm.service";
|
|
12
|
-
// import { stringify } from 'querystring';
|
|
13
|
-
export class SmartAuthService {
|
|
14
|
-
constructor(http, authnService, xdmService, smartDataServiceUrl, smartDomainFormatUrl) {
|
|
15
|
-
this.http = http;
|
|
16
|
-
this.authnService = authnService;
|
|
17
|
-
this.xdmService = xdmService;
|
|
18
|
-
this.smartDataServiceUrl = smartDataServiceUrl;
|
|
19
|
-
this.smartDomainFormatUrl = smartDomainFormatUrl;
|
|
20
|
-
}
|
|
21
|
-
getLoginStaff() {
|
|
22
|
-
if (isDevMode) {
|
|
23
|
-
console.log('SmartAuthService - getLoginStaff()');
|
|
24
|
-
}
|
|
25
|
-
if (!isDevMode && this.loginStaff) {
|
|
26
|
-
if (this.loginStaff.staffId) {
|
|
27
|
-
if (isDevMode) {
|
|
28
|
-
console.log('##### getLoginStaff(): get internal instance in service', this.loginStaff);
|
|
29
|
-
}
|
|
30
|
-
return of(this.loginStaff);
|
|
31
|
-
}
|
|
32
|
-
else if (this.loginStaff.userName) {
|
|
33
|
-
if (isDevMode) {
|
|
34
|
-
console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
|
|
35
|
-
}
|
|
36
|
-
return this.getStaff(this.loginStaff.userName);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return from(this.xdmService.getLoginStaff()).pipe(switchMap((storedResult) => {
|
|
40
|
-
if (storedResult && storedResult.staffId) {
|
|
41
|
-
if (isDevMode) {
|
|
42
|
-
console.log('##### getLoginStaff(): get from session.', storedResult);
|
|
43
|
-
}
|
|
44
|
-
this.loginStaff = storedResult;
|
|
45
|
-
return of(storedResult);
|
|
46
|
-
}
|
|
47
|
-
else if (storedResult && storedResult.userName) {
|
|
48
|
-
if (isDevMode) {
|
|
49
|
-
console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
|
|
50
|
-
}
|
|
51
|
-
return this.getStaff(storedResult.userName);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
const userName = this.userName;
|
|
55
|
-
const staffName = userName.substring(0, userName.indexOf('@'));
|
|
56
|
-
if (isDevMode) {
|
|
57
|
-
console.log('##### loginLoginStaff(): get using login staff name ', staffName);
|
|
58
|
-
}
|
|
59
|
-
return this.getStaff(staffName);
|
|
60
|
-
}
|
|
61
|
-
}));
|
|
62
|
-
}
|
|
63
|
-
get userName() {
|
|
64
|
-
if (this.authnService.instance.getAllAccounts().length > 0) {
|
|
65
|
-
const account = this.authnService.instance.getAllAccounts()[0];
|
|
66
|
-
return account.username;
|
|
67
|
-
}
|
|
68
|
-
return '';
|
|
69
|
-
}
|
|
70
|
-
getTeamUrl(app, afterHash) {
|
|
71
|
-
return this.smartDomainFormatUrl.replace('${APP}', app) + afterHash;
|
|
72
|
-
}
|
|
73
|
-
isSameHost(url, app) {
|
|
74
|
-
return this.smartDomainFormatUrl.replace('${APP}', app) === url;
|
|
75
|
-
}
|
|
76
|
-
redirectToTeam(loginStaff) {
|
|
77
|
-
if (loginStaff.roles.findIndex((role) => role.roleId === 'EUUSPC') > -1) {
|
|
78
|
-
if (!this.isSameHost(window.location.origin, 'investigation')) {
|
|
79
|
-
window.location.href = this.getTeamUrl('investigation', '/assignment');
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else if (loginStaff.roles.findIndex((role) => role.roleId.substring(0, 3) === 'RSC') > -1) {
|
|
83
|
-
if (!this.isSameHost(window.location.origin, 'rsc')) {
|
|
84
|
-
window.location.href = this.getTeamUrl('rsc', '/offender-list');
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
async setSelectedOffender(selectedOffender) {
|
|
89
|
-
if (!this.loginStaff) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
if (selectedOffender) {
|
|
93
|
-
// if (!selectedOffender.assignmentStaffRelationId) {
|
|
94
|
-
const relation = await lastValueFrom(this.getStaffOffenderRelation(this.loginStaff.staffId, selectedOffender.offenderId));
|
|
95
|
-
if (relation) {
|
|
96
|
-
selectedOffender.assignmentStaffRelationId = relation;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
|
|
100
|
-
}
|
|
101
|
-
// }
|
|
102
|
-
}
|
|
103
|
-
this.xdmService.setSelectedOffender(selectedOffender);
|
|
104
|
-
this.selectedOffender = selectedOffender;
|
|
105
|
-
}
|
|
106
|
-
logout() {
|
|
107
|
-
this.xdmService.clearAll();
|
|
108
|
-
this.authnService.logout();
|
|
109
|
-
}
|
|
110
|
-
async setPermission(appModuleId, route) {
|
|
111
|
-
if (!this.loginStaff) {
|
|
112
|
-
this.loginStaff = await this.xdmService.getLoginStaff();
|
|
113
|
-
}
|
|
114
|
-
const permissions = this.loginStaff.permissions;
|
|
115
|
-
const resource = route.url && route.url.length > 0 ? route.url[0].path : '';
|
|
116
|
-
if (!this.selectedOffender) {
|
|
117
|
-
this.selectedOffender = await this.xdmService.getSelectedOffender();
|
|
118
|
-
}
|
|
119
|
-
if (this.selectedOffender) {
|
|
120
|
-
// if (!this.selectedOffender.assignmentStaffRelationId) {
|
|
121
|
-
const relation = await this.getStaffOffenderRelation(this.loginStaff.staffId, this.selectedOffender.offenderId).toPromise();
|
|
122
|
-
if (relation) {
|
|
123
|
-
this.selectedOffender.assignmentStaffRelationId = relation;
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
this.selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
|
|
127
|
-
}
|
|
128
|
-
this.xdmService.setSelectedOffender(this.selectedOffender);
|
|
129
|
-
// }
|
|
130
|
-
}
|
|
131
|
-
const assignmentStaffRelationId = this.selectedOffender.assignmentStaffRelationId;
|
|
132
|
-
const elements = document.querySelectorAll('[class^="sac-"]');
|
|
133
|
-
const pattern = /^sac-(\S+)-(\S+)$/i;
|
|
134
|
-
Array.from(elements).forEach((element) => {
|
|
135
|
-
let hide;
|
|
136
|
-
let disable;
|
|
137
|
-
element.classList.forEach((c) => {
|
|
138
|
-
const results = c.match(pattern);
|
|
139
|
-
// console.log(results);
|
|
140
|
-
if (results && results.length > 2) {
|
|
141
|
-
const roleId = results[1] ? results[1].toUpperCase() : null;
|
|
142
|
-
const right = results[2];
|
|
143
|
-
// console.log(results[0]);
|
|
144
|
-
// console.log(results[1]);
|
|
145
|
-
// console.log(results[2]);
|
|
146
|
-
const permission = permissions.find(function (p) {
|
|
147
|
-
return (p.appModuleId === appModuleId &&
|
|
148
|
-
p.resource === resource &&
|
|
149
|
-
p.roleId === roleId &&
|
|
150
|
-
p.assignmentStaffRelationId === assignmentStaffRelationId);
|
|
151
|
-
});
|
|
152
|
-
/*
|
|
153
|
-
console.log('##### setPermission() resource: ', resource);
|
|
154
|
-
console.log('##### setPermission() appModuleId: ', appModuleId);
|
|
155
|
-
console.log('##### setPermission() roleId: ', roleId);
|
|
156
|
-
console.log(
|
|
157
|
-
'##### setPermission() assignment relation: ',
|
|
158
|
-
assignmentStaffRelationId,
|
|
159
|
-
);
|
|
160
|
-
*/
|
|
161
|
-
console.log('##### Matched permission: ', permission);
|
|
162
|
-
if (permission) {
|
|
163
|
-
if (right === 'read') {
|
|
164
|
-
if (!permission.readFlag) {
|
|
165
|
-
if (hide !== false) {
|
|
166
|
-
hide = true;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
hide = false;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
else if ((right === 'create' && !permission.createFlag) ||
|
|
174
|
-
(right === 'update' && !permission.updateFlag) ||
|
|
175
|
-
(right === 'delete' && !permission.deleteFlag) ||
|
|
176
|
-
(right === 'assign' && !permission.assignFlag) ||
|
|
177
|
-
(right === 'close' && !permission.closeFlag) ||
|
|
178
|
-
(right === 'expunge' && !permission.expungeFlag) ||
|
|
179
|
-
(right === 'reopen' && !permission.reopenFlag)) {
|
|
180
|
-
if (element.nodeName === 'BUTTON') {
|
|
181
|
-
if (hide !== false) {
|
|
182
|
-
hide = true;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
if (disable !== false) {
|
|
187
|
-
disable = true;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
if (element.nodeName === 'BUTTON') {
|
|
193
|
-
hide = false;
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
disable = false;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
if (right === 'read') {
|
|
202
|
-
if (hide !== false) {
|
|
203
|
-
hide = true;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
else if (element.nodeName === 'BUTTON') {
|
|
207
|
-
if (hide !== false) {
|
|
208
|
-
hide = true;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
else if (disable !== false) {
|
|
212
|
-
disable = true;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
console.log('hide: ', hide);
|
|
218
|
-
console.log('disable: ', disable);
|
|
219
|
-
if (hide === true) {
|
|
220
|
-
this.hideHtmlElement(element);
|
|
221
|
-
}
|
|
222
|
-
else if (disable === true) {
|
|
223
|
-
this.disableHtmlElement(element);
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
checkPermission(accessControlConfig) {
|
|
228
|
-
const selData = accessControlConfig.route.data;
|
|
229
|
-
this.loginStaff = selData.loginStaff;
|
|
230
|
-
this.selectedOffender = selData.selectedOffender;
|
|
231
|
-
let routePath = '';
|
|
232
|
-
if (accessControlConfig.route.url &&
|
|
233
|
-
accessControlConfig.route.url.length > 0) {
|
|
234
|
-
routePath = accessControlConfig.route.url[0].path;
|
|
235
|
-
}
|
|
236
|
-
const permissions = this.loginStaff.permissions;
|
|
237
|
-
const resource = routePath;
|
|
238
|
-
const roleId = accessControlConfig.roleId
|
|
239
|
-
? accessControlConfig.roleId.toUpperCase()
|
|
240
|
-
: null;
|
|
241
|
-
const accessType = accessControlConfig.accessType;
|
|
242
|
-
const assignmentStaffRelationId = (!this.selectedOffender || !this.selectedOffender
|
|
243
|
-
.assignmentStaffRelationId)
|
|
244
|
-
? 'N/A'
|
|
245
|
-
: this.selectedOffender.assignmentStaffRelationId;
|
|
246
|
-
const permission = permissions.find((p) => {
|
|
247
|
-
return (p.appModuleId === accessControlConfig.appModuleId &&
|
|
248
|
-
p.resource === resource &&
|
|
249
|
-
(!roleId || p.roleId === roleId) &&
|
|
250
|
-
(p.assignmentStaffRelationId === 'N/A' ||
|
|
251
|
-
p.assignmentStaffRelationId === assignmentStaffRelationId));
|
|
252
|
-
});
|
|
253
|
-
if (permission) {
|
|
254
|
-
if (accessType === 'read') {
|
|
255
|
-
if (!permission.readFlag) {
|
|
256
|
-
return false;
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
return true;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
else if ((accessType === 'create' && !permission.createFlag) ||
|
|
263
|
-
(accessType === 'update' && !permission.updateFlag) ||
|
|
264
|
-
(accessType === 'delete' && !permission.deleteFlag) ||
|
|
265
|
-
(accessType === 'assign' && !permission.assignFlag) ||
|
|
266
|
-
(accessType === 'close' && !permission.closeFlag) ||
|
|
267
|
-
(accessType === 'expunge' && !permission.expungeFlag) ||
|
|
268
|
-
(accessType === 'reopen' && !permission.reopenFlag)) {
|
|
269
|
-
return false;
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
return true;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
if (accessType === 'read') {
|
|
277
|
-
return false;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
return false;
|
|
281
|
-
}
|
|
282
|
-
canAppFeatureActivate(loginStaff, feature, appModuleId = null) {
|
|
283
|
-
// if (!this.isAuthEnable(loginStaff.roles, appModuleId)) {
|
|
284
|
-
// return true;
|
|
285
|
-
// }
|
|
286
|
-
return this.hasAppFeaturePermission(loginStaff.permissions, feature, appModuleId);
|
|
287
|
-
}
|
|
288
|
-
// public isAuthEnable(roles: Role[], appModuleId: string) {
|
|
289
|
-
// if (roles && roles.length > 0) {
|
|
290
|
-
// return roles.map(r => r.roleId).findIndex(this.isExternalRole) > -1 || appModuleId === 'RR';
|
|
291
|
-
// }
|
|
292
|
-
// return false;
|
|
293
|
-
// }
|
|
294
|
-
hasIntakeRole(roles) {
|
|
295
|
-
if (roles && roles.length > 0) {
|
|
296
|
-
return roles.findIndex(this.isIntakeRole) > -1;
|
|
297
|
-
}
|
|
298
|
-
return false;
|
|
299
|
-
}
|
|
300
|
-
hasAppFeaturePermission(permissions, feature, appModuleId) {
|
|
301
|
-
if (permissions && permissions.length > 0) {
|
|
302
|
-
if (appModuleId) {
|
|
303
|
-
return (permissions.findIndex((p) => p.resource === feature && p.appModuleId === appModuleId) > -1);
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
return permissions.findIndex((p) => p.resource === feature) > -1;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
return false;
|
|
310
|
-
}
|
|
311
|
-
isExternalRole(roleId) {
|
|
312
|
-
switch (roleId) {
|
|
313
|
-
case 'EUDTL':
|
|
314
|
-
case 'EUDUSM':
|
|
315
|
-
case 'EUJDG':
|
|
316
|
-
case 'EUMPD':
|
|
317
|
-
case 'EUSOTV':
|
|
318
|
-
case 'EUUSA2':
|
|
319
|
-
case 'EUUSAO':
|
|
320
|
-
case 'EUUSPC':
|
|
321
|
-
return true;
|
|
322
|
-
default:
|
|
323
|
-
return false;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
isIntakeRole(role) {
|
|
327
|
-
switch (role.roleId) {
|
|
328
|
-
case 'OPA':
|
|
329
|
-
case 'OPS':
|
|
330
|
-
case 'SOPS':
|
|
331
|
-
return true;
|
|
332
|
-
default:
|
|
333
|
-
return false;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
disableHtmlElement(element) {
|
|
337
|
-
// console.log(element);
|
|
338
|
-
switch (element.nodeName) {
|
|
339
|
-
case 'A':
|
|
340
|
-
element.setAttribute('style', 'pointer-events: none;cursor: not-allowed;');
|
|
341
|
-
element.setAttribute('tabIndex', '-1');
|
|
342
|
-
break;
|
|
343
|
-
default:
|
|
344
|
-
element.setAttribute('disabled', 'disabled');
|
|
345
|
-
break;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
hideHtmlElement(element) {
|
|
349
|
-
// element.setAttribute('hidden', 'hidden');
|
|
350
|
-
element.setAttribute('style', 'display: none;');
|
|
351
|
-
}
|
|
352
|
-
getStaff(userName) {
|
|
353
|
-
return this.query({
|
|
354
|
-
query: this.findStaffQuery,
|
|
355
|
-
variables: {
|
|
356
|
-
input: {
|
|
357
|
-
where: {
|
|
358
|
-
userName: userName,
|
|
359
|
-
activeFlag: true,
|
|
360
|
-
},
|
|
361
|
-
}
|
|
362
|
-
},
|
|
363
|
-
}).pipe(take(1), map((result) => {
|
|
364
|
-
if (isDevMode) {
|
|
365
|
-
console.log('##### getStaff() from service ', result);
|
|
366
|
-
}
|
|
367
|
-
if (result.findvStaffs.data.length > 0) {
|
|
368
|
-
const data = result.findvStaffs.data[0];
|
|
369
|
-
this.xdmService.setLoginStaff(data);
|
|
370
|
-
this.loginStaff = data;
|
|
371
|
-
return data;
|
|
372
|
-
}
|
|
373
|
-
else {
|
|
374
|
-
return of(null);
|
|
375
|
-
}
|
|
376
|
-
}), catchError((error) => {
|
|
377
|
-
console.log('error ' + error);
|
|
378
|
-
return of(null);
|
|
379
|
-
}));
|
|
380
|
-
}
|
|
381
|
-
query(options) {
|
|
382
|
-
return this.http
|
|
383
|
-
.post(this.smartDataServiceUrl, {
|
|
384
|
-
query: options.query,
|
|
385
|
-
variables: options.variables,
|
|
386
|
-
}, {
|
|
387
|
-
headers: new HttpHeaders({
|
|
388
|
-
'Content-Type': 'application/json',
|
|
389
|
-
'No-Auth': 'True',
|
|
390
|
-
}),
|
|
391
|
-
})
|
|
392
|
-
.pipe(map((d) => d.data));
|
|
393
|
-
}
|
|
394
|
-
get findStaffQuery() {
|
|
395
|
-
return `
|
|
396
|
-
query findvStaffs($input: vStaffMultiInput) {
|
|
397
|
-
findvStaffs(input: $input) {
|
|
398
|
-
totalCount
|
|
399
|
-
message
|
|
400
|
-
data {
|
|
401
|
-
staffId
|
|
402
|
-
userName
|
|
403
|
-
lastName
|
|
404
|
-
firstName
|
|
405
|
-
phone
|
|
406
|
-
email
|
|
407
|
-
roles {
|
|
408
|
-
roleId
|
|
409
|
-
role
|
|
410
|
-
}
|
|
411
|
-
permissions {
|
|
412
|
-
roleId
|
|
413
|
-
appModuleId
|
|
414
|
-
resource
|
|
415
|
-
assignmentStaffRelationId
|
|
416
|
-
readFlag
|
|
417
|
-
createFlag
|
|
418
|
-
updateFlag
|
|
419
|
-
deleteFlag
|
|
420
|
-
assignFlag
|
|
421
|
-
reopenFlag
|
|
422
|
-
closeFlag
|
|
423
|
-
expungeFlag
|
|
424
|
-
}
|
|
425
|
-
options {
|
|
426
|
-
offenderListOptionId
|
|
427
|
-
name
|
|
428
|
-
serviceApiFieldName
|
|
429
|
-
selectedFlag
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
`;
|
|
435
|
-
}
|
|
436
|
-
getStaffOffenderRelation(staffId, offenderId) {
|
|
437
|
-
const queryString = `
|
|
438
|
-
{
|
|
439
|
-
findvStaffOffenderRelations(input: {where: {staffId: ${staffId}, offenderId: ${offenderId}}}) {
|
|
440
|
-
data {
|
|
441
|
-
assignmentStaffRelationId
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}`;
|
|
445
|
-
return this.http
|
|
446
|
-
.post(this.smartDataServiceUrl, { query: queryString })
|
|
447
|
-
.pipe(take(1), map((result) => {
|
|
448
|
-
if (isDevMode) {
|
|
449
|
-
console.log('##### getStaffOffenderRelation() from service ', result);
|
|
450
|
-
}
|
|
451
|
-
if (result.data.findvStaffOffenderRelations.data.length > 0) {
|
|
452
|
-
const data = result.data.findvStaffOffenderRelations.data[0];
|
|
453
|
-
return data.assignmentStaffRelationId;
|
|
454
|
-
}
|
|
455
|
-
else {
|
|
456
|
-
return null;
|
|
457
|
-
// return throwError('No access right.');
|
|
458
|
-
}
|
|
459
|
-
}), catchError((error) => {
|
|
460
|
-
console.log('error ' + error);
|
|
461
|
-
return null;
|
|
462
|
-
}));
|
|
463
|
-
}
|
|
464
|
-
getRolePermissions(appModuleId, resource) {
|
|
465
|
-
const queryString = `
|
|
466
|
-
query findvRolePermissionPivots{
|
|
467
|
-
findvRolePermissionPivots(input: {where: {appModuleId: ${appModuleId}, resource: ${resource}}}){
|
|
468
|
-
totalCount
|
|
469
|
-
message
|
|
470
|
-
}
|
|
471
|
-
}`;
|
|
472
|
-
return this.http
|
|
473
|
-
.post(this.smartDataServiceUrl, { query: queryString })
|
|
474
|
-
.pipe(take(1), map((result) => {
|
|
475
|
-
if (isDevMode) {
|
|
476
|
-
console.log('##### findvRolePermissionPivots() from service ', result);
|
|
477
|
-
}
|
|
478
|
-
if (result.data.findvRolePermissionPivots.totalCount > 0) {
|
|
479
|
-
return true;
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
return false;
|
|
483
|
-
// return throwError('No access right.');
|
|
484
|
-
}
|
|
485
|
-
}), catchError((error) => {
|
|
486
|
-
console.log('error ' + error);
|
|
487
|
-
return throwError(error);
|
|
488
|
-
}));
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
/** @nocollapse */ /** @nocollapse */ SmartAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, deps: [{ token: i1.HttpClient }, { token: i2.MsalService }, { token: i3.XdmService }, { token: SMART_DATA_SERVICE_URL }, { token: SMART_DOMAIN_FORMAT }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
492
|
-
/** @nocollapse */ /** @nocollapse */ SmartAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, providedIn: 'root' });
|
|
493
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, decorators: [{
|
|
494
|
-
type: Injectable,
|
|
495
|
-
args: [{
|
|
496
|
-
providedIn: 'root',
|
|
497
|
-
}]
|
|
498
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.MsalService }, { type: i3.XdmService }, { type: undefined, decorators: [{
|
|
499
|
-
type: Inject,
|
|
500
|
-
args: [SMART_DATA_SERVICE_URL]
|
|
501
|
-
}] }, { type: undefined, decorators: [{
|
|
502
|
-
type: Inject,
|
|
503
|
-
args: [SMART_DOMAIN_FORMAT]
|
|
504
|
-
}] }]; } });
|
|
505
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3NtYXJ0L25nYy1zbWFydC1jb3JlL3NyYy9saWIvc21hcnQtYXV0aC9zbWFydC1hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2xELE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBR3BCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7OztBQUcxRCwyQ0FBMkM7QUFLM0MsTUFBTSxPQUFPLGdCQUFnQjtJQUkzQixZQUNVLElBQWdCLEVBQ2hCLFlBQXlCLEVBQ3pCLFVBQXNCLEVBQ1UsbUJBQW1CLEVBQ3RCLG9CQUE0QjtRQUp6RCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDVSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQUE7UUFDdEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFRO0lBQ2hFLENBQUM7SUFFRyxhQUFhO1FBQ2xCLElBQUksU0FBUyxFQUFFO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FB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LE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBmcm9tLCB0aHJvd0Vycm9yLCBsYXN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwLCB0YWtlLCBjYXRjaEVycm9yfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSAnQGF6dXJlL21zYWwtYW5ndWxhcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBMb2dpblN0YWZmLFxyXG4gIFNlbGVjdGVkT2ZmZW5kZXIsXHJcbiAgU01BUlRfREFUQV9TRVJWSUNFX1VSTCxcclxuICBTTUFSVF9ET01BSU5fRk9STUFULFxyXG4gIFJvbGUsXHJcbiAgUGVybWlzc2lvbixcclxufSBmcm9tICcuLi9zbWFydC1zdG9yYWdlL3NtYXJ0LXN0b3JhZ2UtbW9kZWwnO1xyXG5pbXBvcnQgeyBYZG1TZXJ2aWNlIH0gZnJvbSAnLi4vc21hcnQtc3RvcmFnZS94ZG0uc2VydmljZSc7XHJcbmltcG9ydCB7IFNtYXJ0QWNjZXNzQ29udHJvbENvbmZpZyB9IGZyb20gJy4vc21hcnQtYWNjZXNzLWNvbnRyb2wtY29uZmlnJztcclxuaW1wb3J0IHsgbnVsbFNhZmVJc0VxdWl2YWxlbnQgfSBmcm9tICdAYW5ndWxhci9jb21waWxlci9zcmMvb3V0cHV0L291dHB1dF9hc3QnO1xyXG4vLyBpbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICdxdWVyeXN0cmluZyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRBdXRoU2VydmljZSB7XHJcbiAgbG9naW5TdGFmZjogTG9naW5TdGFmZjtcclxuICBzZWxlY3RlZE9mZmVuZGVyOiBTZWxlY3RlZE9mZmVuZGVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgYXV0aG5TZXJ2aWNlOiBNc2FsU2VydmljZSxcclxuICAgIHByaXZhdGUgeGRtU2VydmljZTogWGRtU2VydmljZSxcclxuICAgIEBJbmplY3QoU01BUlRfREFUQV9TRVJWSUNFX1VSTCkgcHJpdmF0ZSBzbWFydERhdGFTZXJ2aWNlVXJsLFxyXG4gICAgQEluamVjdChTTUFSVF9ET01BSU5fRk9STUFUKSBwcml2YXRlIHNtYXJ0RG9tYWluRm9ybWF0VXJsOiBzdHJpbmcsXHJcbiAgKSB7fVxyXG5cclxuICBwdWJsaWMgZ2V0TG9naW5TdGFmZigpOiBPYnNlcnZhYmxlPExvZ2luU3RhZmY+IHtcclxuICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ1NtYXJ0QXV0aFNlcnZpY2UgLSBnZXRMb2dpblN0YWZmKCknKTtcclxuICAgIH1cclxuICAgIGlmICghaXNEZXZNb2RlICYmIHRoaXMubG9naW5TdGFmZikge1xyXG4gICAgICBpZiAodGhpcy5sb2dpblN0YWZmLnN0YWZmSWQpIHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IGludGVybmFsIGluc3RhbmNlIGluIHNlcnZpY2UnLFxyXG4gICAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2YodGhpcy5sb2dpblN0YWZmKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luU3RhZmYudXNlck5hbWUpIHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIHByZXNldCB1c2VyIG5hbWUnLFxyXG4gICAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFmZih0aGlzLmxvZ2luU3RhZmYudXNlck5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLnhkbVNlcnZpY2UuZ2V0TG9naW5TdGFmZigpKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHN0b3JlZFJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChzdG9yZWRSZXN1bHQgJiYgc3RvcmVkUmVzdWx0LnN0YWZmSWQpIHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IGZyb20gc2Vzc2lvbi4nLFxyXG4gICAgICAgICAgICAgIHN0b3JlZFJlc3VsdCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9naW5TdGFmZiA9IHN0b3JlZFJlc3VsdDtcclxuICAgICAgICAgIHJldHVybiBvZihzdG9yZWRSZXN1bHQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RvcmVkUmVzdWx0ICYmIHN0b3JlZFJlc3VsdC51c2VyTmFtZSkge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAnIyMjIyMgZ2V0TG9naW5TdGFmZigpOiBnZXQgdXNpbmcgcHJlc2V0IHVzZXIgbmFtZScsXHJcbiAgICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhZmYoc3RvcmVkUmVzdWx0LnVzZXJOYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgdXNlck5hbWUgPSB0aGlzLnVzZXJOYW1lO1xyXG4gICAgICAgICAgY29uc3Qgc3RhZmZOYW1lID0gdXNlck5hbWUuc3Vic3RyaW5nKDAsIHVzZXJOYW1lLmluZGV4T2YoJ0AnKSk7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBsb2dpbkxvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIGxvZ2luIHN0YWZmIG5hbWUgJyxcclxuICAgICAgICAgICAgICBzdGFmZk5hbWUsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFmZihzdGFmZk5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVzZXJOYW1lKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5hdXRoblNlcnZpY2UuaW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLmF1dGhuU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpWzBdO1xyXG4gICAgICByZXR1cm4gYWNjb3VudC51c2VybmFtZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRlYW1VcmwoYXBwOiBzdHJpbmcsIGFmdGVySGFzaDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNtYXJ0RG9tYWluRm9ybWF0VXJsLnJlcGxhY2UoJyR7QVBQfScsIGFwcCkgKyBhZnRlckhhc2g7XHJcbiAgfVxyXG4gIHByaXZhdGUgaXNTYW1lSG9zdCh1cmwsIGFwcCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc21hcnREb21haW5Gb3JtYXRVcmwucmVwbGFjZSgnJHtBUFB9JywgYXBwKSA9PT0gdXJsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZGlyZWN0VG9UZWFtKGxvZ2luU3RhZmY6IExvZ2luU3RhZmYpIHtcclxuICAgIGlmIChsb2dpblN0YWZmLnJvbGVzLmZpbmRJbmRleCgocm9sZSkgPT4gcm9sZS5yb2xlSWQgPT09ICdFVVVTUEMnKSA+IC0xKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1NhbWVIb3N0KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sICdpbnZlc3RpZ2F0aW9uJykpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuZ2V0VGVhbVVybCgnaW52ZXN0aWdhdGlvbicsICcvYXNzaWdubWVudCcpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBsb2dpblN0YWZmLnJvbGVzLmZpbmRJbmRleChcclxuICAgICAgICAocm9sZSkgPT4gcm9sZS5yb2xlSWQuc3Vic3RyaW5nKDAsIDMpID09PSAnUlNDJyxcclxuICAgICAgKSA+IC0xXHJcbiAgICApIHtcclxuICAgICAgaWYgKCF0aGlzLmlzU2FtZUhvc3Qod2luZG93LmxvY2F0aW9uLm9yaWdpbiwgJ3JzYycpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmdldFRlYW1VcmwoJ3JzYycsICcvb2ZmZW5kZXItbGlzdCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0U2VsZWN0ZWRPZmZlbmRlcihzZWxlY3RlZE9mZmVuZGVyOiBTZWxlY3RlZE9mZmVuZGVyKSB7XHJcbiAgICBpZiAoIXRoaXMubG9naW5TdGFmZikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkT2ZmZW5kZXIpIHtcclxuICAgICAgLy8gaWYgKCFzZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpIHtcclxuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuZ2V0U3RhZmZPZmZlbmRlclJlbGF0aW9uKFxyXG4gICAgICAgICAgdGhpcy5sb2dpblN0YWZmLnN0YWZmSWQsXHJcbiAgICAgICAgICBzZWxlY3RlZE9mZmVuZGVyLm9mZmVuZGVySWQsXHJcbiAgICAgICAgKSxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlbGF0aW9uKSB7XHJcbiAgICAgICAgc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gcmVsYXRpb247XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gJ05PQVNTSUdOJztcclxuICAgICAgfVxyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnhkbVNlcnZpY2Uuc2V0U2VsZWN0ZWRPZmZlbmRlcihzZWxlY3RlZE9mZmVuZGVyKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlciA9IHNlbGVjdGVkT2ZmZW5kZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9nb3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy54ZG1TZXJ2aWNlLmNsZWFyQWxsKCk7XHJcbiAgICB0aGlzLmF1dGhuU2VydmljZS5sb2dvdXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRQZXJtaXNzaW9uKFxyXG4gICAgYXBwTW9kdWxlSWQ6IHN0cmluZyxcclxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gICkge1xyXG4gICAgaWYgKCF0aGlzLmxvZ2luU3RhZmYpIHtcclxuICAgICAgdGhpcy5sb2dpblN0YWZmID0gYXdhaXQgdGhpcy54ZG1TZXJ2aWNlLmdldExvZ2luU3RhZmYoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5sb2dpblN0YWZmLnBlcm1pc3Npb25zO1xyXG4gICAgY29uc3QgcmVzb3VyY2UgPVxyXG4gICAgICByb3V0ZS51cmwgJiYgcm91dGUudXJsLmxlbmd0aCA+IDAgPyByb3V0ZS51cmxbMF0hLnBhdGggOiAnJztcclxuXHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRPZmZlbmRlcikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIgPSBhd2FpdCB0aGlzLnhkbVNlcnZpY2UuZ2V0U2VsZWN0ZWRPZmZlbmRlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkT2ZmZW5kZXIpIHtcclxuICAgICAgLy8gaWYgKCF0aGlzLnNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCkge1xyXG4gICAgICBjb25zdCByZWxhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3RhZmZPZmZlbmRlclJlbGF0aW9uKFxyXG4gICAgICAgIHRoaXMubG9naW5TdGFmZi5zdGFmZklkLFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlci5vZmZlbmRlcklkLFxyXG4gICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmVsYXRpb24pIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9IHJlbGF0aW9uO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gJ05PQVNTSUdOJztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnhkbVNlcnZpY2Uuc2V0U2VsZWN0ZWRPZmZlbmRlcih0aGlzLnNlbGVjdGVkT2ZmZW5kZXIpO1xyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkO1xyXG5cclxuICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2NsYXNzXj1cInNhYy1cIl0nKTtcclxuICAgIGNvbnN0IHBhdHRlcm4gPSAvXnNhYy0oXFxTKyktKFxcUyspJC9pO1xyXG5cclxuICAgIEFycmF5LmZyb20oZWxlbWVudHMpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgbGV0IGhpZGU7XHJcbiAgICAgIGxldCBkaXNhYmxlO1xyXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGMubWF0Y2gocGF0dGVybik7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0cyk7XHJcbiAgICAgICAgaWYgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICBjb25zdCByb2xlSWQgPSByZXN1bHRzWzFdID8gcmVzdWx0c1sxXS50b1VwcGVyQ2FzZSgpIDogbnVsbDtcclxuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gcmVzdWx0c1syXTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHNbMF0pO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0c1sxXSk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHRzWzJdKTtcclxuICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSBwZXJtaXNzaW9ucy5maW5kKGZ1bmN0aW9uIChwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgcC5hcHBNb2R1bGVJZCA9PT0gYXBwTW9kdWxlSWQgJiZcclxuICAgICAgICAgICAgICBwLnJlc291cmNlID09PSByZXNvdXJjZSAmJlxyXG4gICAgICAgICAgICAgIHAucm9sZUlkID09PSByb2xlSWQgJiZcclxuICAgICAgICAgICAgICBwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLypcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgcmVzb3VyY2U6ICcsIHJlc291cmNlKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgYXBwTW9kdWxlSWQ6ICcsIGFwcE1vZHVsZUlkKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgcm9sZUlkOiAnLCByb2xlSWQpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgYXNzaWdubWVudCByZWxhdGlvbjogJyxcclxuICAgICAgICAgICAgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAqL1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIE1hdGNoZWQgcGVybWlzc2lvbjogJywgcGVybWlzc2lvbik7XHJcblxyXG4gICAgICAgICAgaWYgKHBlcm1pc3Npb24pIHtcclxuICAgICAgICAgICAgaWYgKHJpZ2h0ID09PSAncmVhZCcpIHtcclxuICAgICAgICAgICAgICBpZiAoIXBlcm1pc3Npb24ucmVhZEZsYWcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChoaWRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaGlkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdjcmVhdGUnICYmICFwZXJtaXNzaW9uLmNyZWF0ZUZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAndXBkYXRlJyAmJiAhcGVybWlzc2lvbi51cGRhdGVGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2RlbGV0ZScgJiYgIXBlcm1pc3Npb24uZGVsZXRlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdhc3NpZ24nICYmICFwZXJtaXNzaW9uLmFzc2lnbkZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnY2xvc2UnICYmICFwZXJtaXNzaW9uLmNsb3NlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdleHB1bmdlJyAmJiAhcGVybWlzc2lvbi5leHB1bmdlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdyZW9wZW4nICYmICFwZXJtaXNzaW9uLnJlb3BlbkZsYWcpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnQlVUVE9OJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhpZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnQlVUVE9OJykge1xyXG4gICAgICAgICAgICAgICAgaGlkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmlnaHQgPT09ICdyZWFkJykge1xyXG4gICAgICAgICAgICAgIGlmIChoaWRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgaGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdCVVRUT04nKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGhpZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlzYWJsZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICBkaXNhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdoaWRlOiAnLCBoaWRlKTtcclxuICAgICAgY29uc29sZS5sb2coJ2Rpc2FibGU6ICcsIGRpc2FibGUpO1xyXG4gICAgICBpZiAoaGlkZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuaGlkZUh0bWxFbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGRpc2FibGUgPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVIdG1sRWxlbWVudChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hlY2tQZXJtaXNzaW9uKGFjY2Vzc0NvbnRyb2xDb25maWc6IFNtYXJ0QWNjZXNzQ29udHJvbENvbmZpZykge1xyXG4gICAgY29uc3Qgc2VsRGF0YSA9IGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUuZGF0YTtcclxuICAgIHRoaXMubG9naW5TdGFmZiA9IHNlbERhdGEubG9naW5TdGFmZjtcclxuICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlciA9IHNlbERhdGEuc2VsZWN0ZWRPZmZlbmRlcjtcclxuICAgIGxldCByb3V0ZVBhdGggPSAnJztcclxuICAgIGlmIChcclxuICAgICAgYWNjZXNzQ29udHJvbENvbmZpZy5yb3V0ZS51cmwgJiZcclxuICAgICAgYWNjZXNzQ29udHJvbENvbmZpZy5yb3V0ZS51cmwubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJvdXRlUGF0aCA9IGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUudXJsWzBdIS5wYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5sb2dpblN0YWZmLnBlcm1pc3Npb25zO1xyXG4gICAgY29uc3QgcmVzb3VyY2UgPSByb3V0ZVBhdGg7XHJcbiAgICBjb25zdCByb2xlSWQgPSBhY2Nlc3NDb250cm9sQ29uZmlnLnJvbGVJZFxyXG4gICAgICA/IGFjY2Vzc0NvbnRyb2xDb25maWcucm9sZUlkLnRvVXBwZXJDYXNlKClcclxuICAgICAgOiBudWxsO1xyXG4gICAgY29uc3QgYWNjZXNzVHlwZSA9IGFjY2Vzc0NvbnRyb2xDb25maWcuYWNjZXNzVHlwZTtcclxuICAgIGNvbnN0IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSAoIXRoaXMuc2VsZWN0ZWRPZmZlbmRlciB8fCAhdGhpcy5zZWxlY3RlZE9mZmVuZGVyXHJcbiAgICAgIC5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkKVxyXG4gICAgICA/ICdOL0EnXHJcbiAgICAgIDogdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcblxyXG4gICAgY29uc3QgcGVybWlzc2lvbiA9IHBlcm1pc3Npb25zLmZpbmQoKHApID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBwLmFwcE1vZHVsZUlkID09PSBhY2Nlc3NDb250cm9sQ29uZmlnLmFwcE1vZHVsZUlkICYmXHJcbiAgICAgICAgcC5yZXNvdXJjZSA9PT0gcmVzb3VyY2UgJiZcclxuICAgICAgICAoIXJvbGVJZCB8fCBwLnJvbGVJZCA9PT0gcm9sZUlkKSAmJlxyXG4gICAgICAgIChwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09ICdOL0EnIHx8XHJcbiAgICAgICAgICBwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgaWYgKCFwZXJtaXNzaW9uLnJlYWRGbGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2NyZWF0ZScgJiYgIXBlcm1pc3Npb24uY3JlYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3VwZGF0ZScgJiYgIXBlcm1pc3Npb24udXBkYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2RlbGV0ZScgJiYgIXBlcm1pc3Npb24uZGVsZXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Fzc2lnbicgJiYgIXBlcm1pc3Npb24uYXNzaWduRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Nsb3NlJyAmJiAhcGVybWlzc2lvbi5jbG9zZUZsYWcpIHx8XHJcbiAgICAgICAgKGFjY2Vzc1R5cGUgPT09ICdleHB1bmdlJyAmJiAhcGVybWlzc2lvbi5leHB1bmdlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3Jlb3BlbicgJiYgIXBlcm1pc3Npb24ucmVvcGVuRmxhZylcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuQXBwRmVhdHVyZUFjdGl2YXRlKFxyXG4gICAgbG9naW5TdGFmZjogTG9naW5TdGFmZixcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkID0gbnVsbCxcclxuICApIHtcclxuICAgIC8vIGlmICghdGhpcy5pc0F1dGhFbmFibGUobG9naW5TdGFmZi5yb2xlcywgYXBwTW9kdWxlSWQpKSB7XHJcbiAgICAvLyAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIHRoaXMuaGFzQXBwRmVhdHVyZVBlcm1pc3Npb24oXHJcbiAgICAgIGxvZ2luU3RhZmYucGVybWlzc2lvbnMsXHJcbiAgICAgIGZlYXR1cmUsXHJcbiAgICAgIGFwcE1vZHVsZUlkLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBpc0F1dGhFbmFibGUocm9sZXM6IFJvbGVbXSwgYXBwTW9kdWxlSWQ6IHN0cmluZykge1xyXG4gIC8vICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgcmV0dXJuIHJvbGVzLm1hcChyID0+IHIucm9sZUlkKS5maW5kSW5kZXgodGhpcy5pc0V4dGVybmFsUm9sZSkgPiAtMSB8fCBhcHBNb2R1bGVJZCA9PT0gJ1JSJztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBoYXNJbnRha2VSb2xlKHJvbGVzOiBSb2xlW10pIHtcclxuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiByb2xlcy5maW5kSW5kZXgodGhpcy5pc0ludGFrZVJvbGUpID4gLTE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0FwcEZlYXR1cmVQZXJtaXNzaW9uKFxyXG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSxcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgKSB7XHJcbiAgICBpZiAocGVybWlzc2lvbnMgJiYgcGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoYXBwTW9kdWxlSWQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSAmJiBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCxcclxuICAgICAgICAgICkgPiAtMVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmZpbmRJbmRleCgocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSkgPiAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNFeHRlcm5hbFJvbGUocm9sZUlkKSB7XHJcbiAgICBzd2l0Y2ggKHJvbGVJZCkge1xyXG4gICAgICBjYXNlICdFVURUTCc6XHJcbiAgICAgIGNhc2UgJ0VVRFVTTSc6XHJcbiAgICAgIGNhc2UgJ0VVSkRHJzpcclxuICAgICAgY2FzZSAnRVVNUEQnOlxyXG4gICAgICBjYXNlICdFVVNPVFYnOlxyXG4gICAgICBjYXNlICdFVVVTQTInOlxyXG4gICAgICBjYXNlICdFVVVTQU8nOlxyXG4gICAgICBjYXNlICdFVVVTUEMnOlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNJbnRha2VSb2xlKHJvbGU6IFJvbGUpIHtcclxuICAgIHN3aXRjaCAocm9sZS5yb2xlSWQpIHtcclxuICAgICAgY2FzZSAnT1BBJzpcclxuICAgICAgY2FzZSAnT1BTJzpcclxuICAgICAgY2FzZSAnU09QUyc6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNhYmxlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coZWxlbWVudCk7XHJcbiAgICBzd2l0Y2ggKGVsZW1lbnQubm9kZU5hbWUpIHtcclxuICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAnc3R5bGUnLFxyXG4gICAgICAgICAgJ3BvaW50ZXItZXZlbnRzOiBub25lO2N1cnNvcjogbm90LWFsbG93ZWQ7JyxcclxuICAgICAgICApO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaWRlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTtcclxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lOycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGFmZih1c2VyTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxMb2dpblN0YWZmPiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeTxhbnk+KHtcclxuICAgICAgcXVlcnk6IHRoaXMuZmluZFN0YWZmUXVlcnksXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICB3aGVyZToge1xyXG4gICAgICAgICAgICB1c2VyTmFtZTogdXNlck5hbWUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUZsYWc6IHRydWUsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIH0pLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgZ2V0U3RhZmYoKSBmcm9tIHNlcnZpY2UgJywgcmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZXN1bHQuZmluZHZTdGFmZnMuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZmluZHZTdGFmZnMuZGF0YVswXTtcclxuICAgICAgICAgICAgdGhpcy54ZG1TZXJ2aWNlLnNldExvZ2luU3RhZmYoZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9naW5TdGFmZiA9IGRhdGE7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyArIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcXVlcnk8VD4ob3B0aW9uczoge1xyXG4gICAgcXVlcnk6IHN0cmluZztcclxuICAgIHZhcmlhYmxlcz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XHJcbiAgfSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDx7IGRhdGE6IFQgfT4oXHJcbiAgICAgICAgdGhpcy5zbWFydERhdGFTZXJ2aWNlVXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5LFxyXG4gICAgICAgICAgdmFyaWFibGVzOiBvcHRpb25zLnZhcmlhYmxlcyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAgICdOby1BdXRoJzogJ1RydWUnLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnBpcGUobWFwKChkKSA9PiBkLmRhdGEpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbmRTdGFmZlF1ZXJ5KCl7XHJcbiAgICByZXR1cm4gYFxyXG4gICAgIHF1ZXJ5IGZpbmR2U3RhZmZzKCRpbnB1dDogdlN0YWZmTXVsdGlJbnB1dCkge1xyXG4gICAgICAgIGZpbmR2U3RhZmZzKGlucHV0OiAkaW5wdXQpIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICAgIG1lc3NhZ2VcclxuICAgICAgICAgIGRhdGEge1xyXG4gICAgICAgICAgICBzdGFmZklkXHJcbiAgICAgICAgICAgIHVzZXJOYW1lXHJcbiAgICAgICAgICAgIGxhc3ROYW1lXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZVxyXG4gICAgICAgICAgICBwaG9uZVxyXG4gICAgICAgICAgICBlbWFpbFxyXG4gICAgICAgICAgICByb2xlcyB7XHJcbiAgICAgICAgICAgICAgcm9sZUlkXHJcbiAgICAgICAgICAgICAgcm9sZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgICAgICAgICByb2xlSWRcclxuICAgICAgICAgICAgICBhcHBNb2R1bGVJZFxyXG4gICAgICAgICAgICAgIHJlc291cmNlXHJcbiAgICAgICAgICAgICAgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICAgICAgICAgIHJlYWRGbGFnXHJcbiAgICAgICAgICAgICAgY3JlYXRlRmxhZ1xyXG4gICAgICAgICAgICAgIHVwZGF0ZUZsYWdcclxuICAgICAgICAgICAgICBkZWxldGVGbGFnXHJcbiAgICAgICAgICAgICAgYXNzaWduRmxhZ1xyXG4gICAgICAgICAgICAgIHJlb3BlbkZsYWdcclxuICAgICAgICAgICAgICBjbG9zZUZsYWdcclxuICAgICAgICAgICAgICBleHB1bmdlRmxhZ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wdGlvbnMge1xyXG4gICAgICAgICAgICAgIG9mZmVuZGVyTGlzdE9wdGlvbklkXHJcbiAgICAgICAgICAgICAgbmFtZVxyXG4gICAgICAgICAgICAgIHNlcnZpY2VBcGlGaWVsZE5hbWVcclxuICAgICAgICAgICAgICBzZWxlY3RlZEZsYWdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U3RhZmZPZmZlbmRlclJlbGF0aW9uKFxyXG4gICAgc3RhZmZJZDogbnVtYmVyLFxyXG4gICAgb2ZmZW5kZXJJZDogbnVtYmVyLFxyXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGZpbmR2U3RhZmZPZmZlbmRlclJlbGF0aW9ucyhpbnB1dDoge3doZXJlOiB7c3RhZmZJZDogJHtzdGFmZklkfSwgb2ZmZW5kZXJJZDogJHtvZmZlbmRlcklkfX19KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhIHtcclxuICAgICAgICAgICAgICAgICAgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxhbnk+KHRoaXMuc21hcnREYXRhU2VydmljZVVybCwgeyBxdWVyeTogcXVlcnlTdHJpbmcgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAnIyMjIyMgZ2V0U3RhZmZPZmZlbmRlclJlbGF0aW9uKCkgZnJvbSBzZXJ2aWNlICcsXHJcbiAgICAgICAgICAgICAgcmVzdWx0LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmZpbmR2U3RhZmZPZmZlbmRlclJlbGF0aW9ucy5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5kYXRhLmZpbmR2U3RhZmZPZmZlbmRlclJlbGF0aW9ucy5kYXRhWzBdO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0aHJvd0Vycm9yKCdObyBhY2Nlc3MgcmlnaHQuJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnICsgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJvbGVQZXJtaXNzaW9ucyhcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgICByZXNvdXJjZTogc3RyaW5nLFxyXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgXHJcbiAgICAgICAgICAgcXVlcnkgZmluZHZSb2xlUGVybWlzc2lvblBpdm90c3tcclxuICAgICAgICAgICAgZmluZHZSb2xlUGVybWlzc2lvblBpdm90cyhpbnB1dDoge3doZXJlOiB7YXBwTW9kdWxlSWQ6ICR7YXBwTW9kdWxlSWR9LCByZXNvdXJjZTogJHtyZXNvdXJjZX19fSl7XHJcbiAgICAgICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxhbnk+KHRoaXMuc21hcnREYXRhU2VydmljZVVybCwgeyBxdWVyeTogcXVlcnlTdHJpbmcgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAnIyMjIyMgZmluZHZSb2xlUGVybWlzc2lvblBpdm90cygpIGZyb20gc2VydmljZSAnLFxyXG4gICAgICAgICAgICAgIHJlc3VsdCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5maW5kdlJvbGVQZXJtaXNzaW9uUGl2b3RzLnRvdGFsQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhyb3dFcnJvcignTm8gYWNjZXNzIHJpZ2h0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnICsgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1
|
+
import { Injectable, Inject, isDevMode } from '@angular/core';
|
|
2
|
+
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { of, from, throwError, lastValueFrom } from 'rxjs';
|
|
4
|
+
import { map, switchMap, take, catchError } from 'rxjs/operators';
|
|
5
|
+
import { MsalService } from '@azure/msal-angular';
|
|
6
|
+
import { SMART_DATA_SERVICE_URL, SMART_DOMAIN_FORMAT, } from '../smart-storage/smart-storage-model';
|
|
7
|
+
import { XdmService } from '../smart-storage/xdm.service';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common/http";
|
|
10
|
+
import * as i2 from "@azure/msal-angular";
|
|
11
|
+
import * as i3 from "../smart-storage/xdm.service";
|
|
12
|
+
// import { stringify } from 'querystring';
|
|
13
|
+
export class SmartAuthService {
|
|
14
|
+
constructor(http, authnService, xdmService, smartDataServiceUrl, smartDomainFormatUrl) {
|
|
15
|
+
this.http = http;
|
|
16
|
+
this.authnService = authnService;
|
|
17
|
+
this.xdmService = xdmService;
|
|
18
|
+
this.smartDataServiceUrl = smartDataServiceUrl;
|
|
19
|
+
this.smartDomainFormatUrl = smartDomainFormatUrl;
|
|
20
|
+
}
|
|
21
|
+
getLoginStaff() {
|
|
22
|
+
if (isDevMode) {
|
|
23
|
+
console.log('SmartAuthService - getLoginStaff()');
|
|
24
|
+
}
|
|
25
|
+
if (!isDevMode && this.loginStaff) {
|
|
26
|
+
if (this.loginStaff.staffId) {
|
|
27
|
+
if (isDevMode) {
|
|
28
|
+
console.log('##### getLoginStaff(): get internal instance in service', this.loginStaff);
|
|
29
|
+
}
|
|
30
|
+
return of(this.loginStaff);
|
|
31
|
+
}
|
|
32
|
+
else if (this.loginStaff.userName) {
|
|
33
|
+
if (isDevMode) {
|
|
34
|
+
console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
|
|
35
|
+
}
|
|
36
|
+
return this.getStaff(this.loginStaff.userName);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return from(this.xdmService.getLoginStaff()).pipe(switchMap((storedResult) => {
|
|
40
|
+
if (storedResult && storedResult.staffId) {
|
|
41
|
+
if (isDevMode) {
|
|
42
|
+
console.log('##### getLoginStaff(): get from session.', storedResult);
|
|
43
|
+
}
|
|
44
|
+
this.loginStaff = storedResult;
|
|
45
|
+
return of(storedResult);
|
|
46
|
+
}
|
|
47
|
+
else if (storedResult && storedResult.userName) {
|
|
48
|
+
if (isDevMode) {
|
|
49
|
+
console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
|
|
50
|
+
}
|
|
51
|
+
return this.getStaff(storedResult.userName);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const userName = this.userName;
|
|
55
|
+
const staffName = userName.substring(0, userName.indexOf('@'));
|
|
56
|
+
if (isDevMode) {
|
|
57
|
+
console.log('##### loginLoginStaff(): get using login staff name ', staffName);
|
|
58
|
+
}
|
|
59
|
+
return this.getStaff(staffName);
|
|
60
|
+
}
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
get userName() {
|
|
64
|
+
if (this.authnService.instance.getAllAccounts().length > 0) {
|
|
65
|
+
const account = this.authnService.instance.getAllAccounts()[0];
|
|
66
|
+
return account.username;
|
|
67
|
+
}
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
getTeamUrl(app, afterHash) {
|
|
71
|
+
return this.smartDomainFormatUrl.replace('${APP}', app) + afterHash;
|
|
72
|
+
}
|
|
73
|
+
isSameHost(url, app) {
|
|
74
|
+
return this.smartDomainFormatUrl.replace('${APP}', app) === url;
|
|
75
|
+
}
|
|
76
|
+
redirectToTeam(loginStaff) {
|
|
77
|
+
if (loginStaff.roles.findIndex((role) => role.roleId === 'EUUSPC') > -1) {
|
|
78
|
+
if (!this.isSameHost(window.location.origin, 'investigation')) {
|
|
79
|
+
window.location.href = this.getTeamUrl('investigation', '/assignment');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (loginStaff.roles.findIndex((role) => role.roleId.substring(0, 3) === 'RSC') > -1) {
|
|
83
|
+
if (!this.isSameHost(window.location.origin, 'rsc')) {
|
|
84
|
+
window.location.href = this.getTeamUrl('rsc', '/offender-list');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async setSelectedOffender(selectedOffender) {
|
|
89
|
+
if (!this.loginStaff) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (selectedOffender) {
|
|
93
|
+
// if (!selectedOffender.assignmentStaffRelationId) {
|
|
94
|
+
const relation = await lastValueFrom(this.getStaffOffenderRelation(this.loginStaff.staffId, selectedOffender.offenderId));
|
|
95
|
+
if (relation) {
|
|
96
|
+
selectedOffender.assignmentStaffRelationId = relation;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
|
|
100
|
+
}
|
|
101
|
+
// }
|
|
102
|
+
}
|
|
103
|
+
this.xdmService.setSelectedOffender(selectedOffender);
|
|
104
|
+
this.selectedOffender = selectedOffender;
|
|
105
|
+
}
|
|
106
|
+
logout() {
|
|
107
|
+
this.xdmService.clearAll();
|
|
108
|
+
this.authnService.logout();
|
|
109
|
+
}
|
|
110
|
+
async setPermission(appModuleId, route) {
|
|
111
|
+
if (!this.loginStaff) {
|
|
112
|
+
this.loginStaff = await this.xdmService.getLoginStaff();
|
|
113
|
+
}
|
|
114
|
+
const permissions = this.loginStaff.permissions;
|
|
115
|
+
const resource = route.url && route.url.length > 0 ? route.url[0].path : '';
|
|
116
|
+
if (!this.selectedOffender) {
|
|
117
|
+
this.selectedOffender = await this.xdmService.getSelectedOffender();
|
|
118
|
+
}
|
|
119
|
+
if (this.selectedOffender) {
|
|
120
|
+
// if (!this.selectedOffender.assignmentStaffRelationId) {
|
|
121
|
+
const relation = await this.getStaffOffenderRelation(this.loginStaff.staffId, this.selectedOffender.offenderId).toPromise();
|
|
122
|
+
if (relation) {
|
|
123
|
+
this.selectedOffender.assignmentStaffRelationId = relation;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
|
|
127
|
+
}
|
|
128
|
+
this.xdmService.setSelectedOffender(this.selectedOffender);
|
|
129
|
+
// }
|
|
130
|
+
}
|
|
131
|
+
const assignmentStaffRelationId = this.selectedOffender.assignmentStaffRelationId;
|
|
132
|
+
const elements = document.querySelectorAll('[class^="sac-"]');
|
|
133
|
+
const pattern = /^sac-(\S+)-(\S+)$/i;
|
|
134
|
+
Array.from(elements).forEach((element) => {
|
|
135
|
+
let hide;
|
|
136
|
+
let disable;
|
|
137
|
+
element.classList.forEach((c) => {
|
|
138
|
+
const results = c.match(pattern);
|
|
139
|
+
// console.log(results);
|
|
140
|
+
if (results && results.length > 2) {
|
|
141
|
+
const roleId = results[1] ? results[1].toUpperCase() : null;
|
|
142
|
+
const right = results[2];
|
|
143
|
+
// console.log(results[0]);
|
|
144
|
+
// console.log(results[1]);
|
|
145
|
+
// console.log(results[2]);
|
|
146
|
+
const permission = permissions.find(function (p) {
|
|
147
|
+
return (p.appModuleId === appModuleId &&
|
|
148
|
+
p.resource === resource &&
|
|
149
|
+
p.roleId === roleId &&
|
|
150
|
+
p.assignmentStaffRelationId === assignmentStaffRelationId);
|
|
151
|
+
});
|
|
152
|
+
/*
|
|
153
|
+
console.log('##### setPermission() resource: ', resource);
|
|
154
|
+
console.log('##### setPermission() appModuleId: ', appModuleId);
|
|
155
|
+
console.log('##### setPermission() roleId: ', roleId);
|
|
156
|
+
console.log(
|
|
157
|
+
'##### setPermission() assignment relation: ',
|
|
158
|
+
assignmentStaffRelationId,
|
|
159
|
+
);
|
|
160
|
+
*/
|
|
161
|
+
console.log('##### Matched permission: ', permission);
|
|
162
|
+
if (permission) {
|
|
163
|
+
if (right === 'read') {
|
|
164
|
+
if (!permission.readFlag) {
|
|
165
|
+
if (hide !== false) {
|
|
166
|
+
hide = true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
hide = false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if ((right === 'create' && !permission.createFlag) ||
|
|
174
|
+
(right === 'update' && !permission.updateFlag) ||
|
|
175
|
+
(right === 'delete' && !permission.deleteFlag) ||
|
|
176
|
+
(right === 'assign' && !permission.assignFlag) ||
|
|
177
|
+
(right === 'close' && !permission.closeFlag) ||
|
|
178
|
+
(right === 'expunge' && !permission.expungeFlag) ||
|
|
179
|
+
(right === 'reopen' && !permission.reopenFlag)) {
|
|
180
|
+
if (element.nodeName === 'BUTTON') {
|
|
181
|
+
if (hide !== false) {
|
|
182
|
+
hide = true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
if (disable !== false) {
|
|
187
|
+
disable = true;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
if (element.nodeName === 'BUTTON') {
|
|
193
|
+
hide = false;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
disable = false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
if (right === 'read') {
|
|
202
|
+
if (hide !== false) {
|
|
203
|
+
hide = true;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else if (element.nodeName === 'BUTTON') {
|
|
207
|
+
if (hide !== false) {
|
|
208
|
+
hide = true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else if (disable !== false) {
|
|
212
|
+
disable = true;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
console.log('hide: ', hide);
|
|
218
|
+
console.log('disable: ', disable);
|
|
219
|
+
if (hide === true) {
|
|
220
|
+
this.hideHtmlElement(element);
|
|
221
|
+
}
|
|
222
|
+
else if (disable === true) {
|
|
223
|
+
this.disableHtmlElement(element);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
checkPermission(accessControlConfig) {
|
|
228
|
+
const selData = accessControlConfig.route.data;
|
|
229
|
+
this.loginStaff = selData.loginStaff;
|
|
230
|
+
this.selectedOffender = selData.selectedOffender;
|
|
231
|
+
let routePath = '';
|
|
232
|
+
if (accessControlConfig.route.url &&
|
|
233
|
+
accessControlConfig.route.url.length > 0) {
|
|
234
|
+
routePath = accessControlConfig.route.url[0].path;
|
|
235
|
+
}
|
|
236
|
+
const permissions = this.loginStaff.permissions;
|
|
237
|
+
const resource = routePath;
|
|
238
|
+
const roleId = accessControlConfig.roleId
|
|
239
|
+
? accessControlConfig.roleId.toUpperCase()
|
|
240
|
+
: null;
|
|
241
|
+
const accessType = accessControlConfig.accessType;
|
|
242
|
+
const assignmentStaffRelationId = (!this.selectedOffender || !this.selectedOffender
|
|
243
|
+
.assignmentStaffRelationId)
|
|
244
|
+
? 'N/A'
|
|
245
|
+
: this.selectedOffender.assignmentStaffRelationId;
|
|
246
|
+
const permission = permissions.find((p) => {
|
|
247
|
+
return (p.appModuleId === accessControlConfig.appModuleId &&
|
|
248
|
+
p.resource === resource &&
|
|
249
|
+
(!roleId || p.roleId === roleId) &&
|
|
250
|
+
(p.assignmentStaffRelationId === 'N/A' ||
|
|
251
|
+
p.assignmentStaffRelationId === assignmentStaffRelationId));
|
|
252
|
+
});
|
|
253
|
+
if (permission) {
|
|
254
|
+
if (accessType === 'read') {
|
|
255
|
+
if (!permission.readFlag) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else if ((accessType === 'create' && !permission.createFlag) ||
|
|
263
|
+
(accessType === 'update' && !permission.updateFlag) ||
|
|
264
|
+
(accessType === 'delete' && !permission.deleteFlag) ||
|
|
265
|
+
(accessType === 'assign' && !permission.assignFlag) ||
|
|
266
|
+
(accessType === 'close' && !permission.closeFlag) ||
|
|
267
|
+
(accessType === 'expunge' && !permission.expungeFlag) ||
|
|
268
|
+
(accessType === 'reopen' && !permission.reopenFlag)) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
if (accessType === 'read') {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
canAppFeatureActivate(loginStaff, feature, appModuleId = null) {
|
|
283
|
+
// if (!this.isAuthEnable(loginStaff.roles, appModuleId)) {
|
|
284
|
+
// return true;
|
|
285
|
+
// }
|
|
286
|
+
return this.hasAppFeaturePermission(loginStaff.permissions, feature, appModuleId);
|
|
287
|
+
}
|
|
288
|
+
// public isAuthEnable(roles: Role[], appModuleId: string) {
|
|
289
|
+
// if (roles && roles.length > 0) {
|
|
290
|
+
// return roles.map(r => r.roleId).findIndex(this.isExternalRole) > -1 || appModuleId === 'RR';
|
|
291
|
+
// }
|
|
292
|
+
// return false;
|
|
293
|
+
// }
|
|
294
|
+
hasIntakeRole(roles) {
|
|
295
|
+
if (roles && roles.length > 0) {
|
|
296
|
+
return roles.findIndex(this.isIntakeRole) > -1;
|
|
297
|
+
}
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
hasAppFeaturePermission(permissions, feature, appModuleId) {
|
|
301
|
+
if (permissions && permissions.length > 0) {
|
|
302
|
+
if (appModuleId) {
|
|
303
|
+
return (permissions.findIndex((p) => p.resource === feature && p.appModuleId === appModuleId) > -1);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
return permissions.findIndex((p) => p.resource === feature) > -1;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
isExternalRole(roleId) {
|
|
312
|
+
switch (roleId) {
|
|
313
|
+
case 'EUDTL':
|
|
314
|
+
case 'EUDUSM':
|
|
315
|
+
case 'EUJDG':
|
|
316
|
+
case 'EUMPD':
|
|
317
|
+
case 'EUSOTV':
|
|
318
|
+
case 'EUUSA2':
|
|
319
|
+
case 'EUUSAO':
|
|
320
|
+
case 'EUUSPC':
|
|
321
|
+
return true;
|
|
322
|
+
default:
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
isIntakeRole(role) {
|
|
327
|
+
switch (role.roleId) {
|
|
328
|
+
case 'OPA':
|
|
329
|
+
case 'OPS':
|
|
330
|
+
case 'SOPS':
|
|
331
|
+
return true;
|
|
332
|
+
default:
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
disableHtmlElement(element) {
|
|
337
|
+
// console.log(element);
|
|
338
|
+
switch (element.nodeName) {
|
|
339
|
+
case 'A':
|
|
340
|
+
element.setAttribute('style', 'pointer-events: none;cursor: not-allowed;');
|
|
341
|
+
element.setAttribute('tabIndex', '-1');
|
|
342
|
+
break;
|
|
343
|
+
default:
|
|
344
|
+
element.setAttribute('disabled', 'disabled');
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
hideHtmlElement(element) {
|
|
349
|
+
// element.setAttribute('hidden', 'hidden');
|
|
350
|
+
element.setAttribute('style', 'display: none;');
|
|
351
|
+
}
|
|
352
|
+
getStaff(userName) {
|
|
353
|
+
return this.query({
|
|
354
|
+
query: this.findStaffQuery,
|
|
355
|
+
variables: {
|
|
356
|
+
input: {
|
|
357
|
+
where: {
|
|
358
|
+
userName: userName,
|
|
359
|
+
activeFlag: true,
|
|
360
|
+
},
|
|
361
|
+
}
|
|
362
|
+
},
|
|
363
|
+
}).pipe(take(1), map((result) => {
|
|
364
|
+
if (isDevMode) {
|
|
365
|
+
console.log('##### getStaff() from service ', result);
|
|
366
|
+
}
|
|
367
|
+
if (result.findvStaffs.data.length > 0) {
|
|
368
|
+
const data = result.findvStaffs.data[0];
|
|
369
|
+
this.xdmService.setLoginStaff(data);
|
|
370
|
+
this.loginStaff = data;
|
|
371
|
+
return data;
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
return of(null);
|
|
375
|
+
}
|
|
376
|
+
}), catchError((error) => {
|
|
377
|
+
console.log('error ' + error);
|
|
378
|
+
return of(null);
|
|
379
|
+
}));
|
|
380
|
+
}
|
|
381
|
+
query(options) {
|
|
382
|
+
return this.http
|
|
383
|
+
.post(this.smartDataServiceUrl, {
|
|
384
|
+
query: options.query,
|
|
385
|
+
variables: options.variables,
|
|
386
|
+
}, {
|
|
387
|
+
headers: new HttpHeaders({
|
|
388
|
+
'Content-Type': 'application/json',
|
|
389
|
+
'No-Auth': 'True',
|
|
390
|
+
}),
|
|
391
|
+
})
|
|
392
|
+
.pipe(map((d) => d.data));
|
|
393
|
+
}
|
|
394
|
+
get findStaffQuery() {
|
|
395
|
+
return `
|
|
396
|
+
query findvStaffs($input: vStaffMultiInput) {
|
|
397
|
+
findvStaffs(input: $input) {
|
|
398
|
+
totalCount
|
|
399
|
+
message
|
|
400
|
+
data {
|
|
401
|
+
staffId
|
|
402
|
+
userName
|
|
403
|
+
lastName
|
|
404
|
+
firstName
|
|
405
|
+
phone
|
|
406
|
+
email
|
|
407
|
+
roles {
|
|
408
|
+
roleId
|
|
409
|
+
role
|
|
410
|
+
}
|
|
411
|
+
permissions {
|
|
412
|
+
roleId
|
|
413
|
+
appModuleId
|
|
414
|
+
resource
|
|
415
|
+
assignmentStaffRelationId
|
|
416
|
+
readFlag
|
|
417
|
+
createFlag
|
|
418
|
+
updateFlag
|
|
419
|
+
deleteFlag
|
|
420
|
+
assignFlag
|
|
421
|
+
reopenFlag
|
|
422
|
+
closeFlag
|
|
423
|
+
expungeFlag
|
|
424
|
+
}
|
|
425
|
+
options {
|
|
426
|
+
offenderListOptionId
|
|
427
|
+
name
|
|
428
|
+
serviceApiFieldName
|
|
429
|
+
selectedFlag
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
`;
|
|
435
|
+
}
|
|
436
|
+
getStaffOffenderRelation(staffId, offenderId) {
|
|
437
|
+
const queryString = `
|
|
438
|
+
{
|
|
439
|
+
findvStaffOffenderRelations(input: {where: {staffId: ${staffId}, offenderId: ${offenderId}}}) {
|
|
440
|
+
data {
|
|
441
|
+
assignmentStaffRelationId
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}`;
|
|
445
|
+
return this.http
|
|
446
|
+
.post(this.smartDataServiceUrl, { query: queryString })
|
|
447
|
+
.pipe(take(1), map((result) => {
|
|
448
|
+
if (isDevMode) {
|
|
449
|
+
console.log('##### getStaffOffenderRelation() from service ', result);
|
|
450
|
+
}
|
|
451
|
+
if (result.data.findvStaffOffenderRelations.data.length > 0) {
|
|
452
|
+
const data = result.data.findvStaffOffenderRelations.data[0];
|
|
453
|
+
return data.assignmentStaffRelationId;
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
return null;
|
|
457
|
+
// return throwError('No access right.');
|
|
458
|
+
}
|
|
459
|
+
}), catchError((error) => {
|
|
460
|
+
console.log('error ' + error);
|
|
461
|
+
return null;
|
|
462
|
+
}));
|
|
463
|
+
}
|
|
464
|
+
getRolePermissions(appModuleId, resource) {
|
|
465
|
+
const queryString = `
|
|
466
|
+
query findvRolePermissionPivots{
|
|
467
|
+
findvRolePermissionPivots(input: {where: {appModuleId: ${appModuleId}, resource: ${resource}}}){
|
|
468
|
+
totalCount
|
|
469
|
+
message
|
|
470
|
+
}
|
|
471
|
+
}`;
|
|
472
|
+
return this.http
|
|
473
|
+
.post(this.smartDataServiceUrl, { query: queryString })
|
|
474
|
+
.pipe(take(1), map((result) => {
|
|
475
|
+
if (isDevMode) {
|
|
476
|
+
console.log('##### findvRolePermissionPivots() from service ', result);
|
|
477
|
+
}
|
|
478
|
+
if (result.data.findvRolePermissionPivots.totalCount > 0) {
|
|
479
|
+
return true;
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
return false;
|
|
483
|
+
// return throwError('No access right.');
|
|
484
|
+
}
|
|
485
|
+
}), catchError((error) => {
|
|
486
|
+
console.log('error ' + error);
|
|
487
|
+
return throwError(error);
|
|
488
|
+
}));
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/** @nocollapse */ /** @nocollapse */ SmartAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, deps: [{ token: i1.HttpClient }, { token: i2.MsalService }, { token: i3.XdmService }, { token: SMART_DATA_SERVICE_URL }, { token: SMART_DOMAIN_FORMAT }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
492
|
+
/** @nocollapse */ /** @nocollapse */ SmartAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, providedIn: 'root' });
|
|
493
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: SmartAuthService, decorators: [{
|
|
494
|
+
type: Injectable,
|
|
495
|
+
args: [{
|
|
496
|
+
providedIn: 'root',
|
|
497
|
+
}]
|
|
498
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.MsalService }, { type: i3.XdmService }, { type: undefined, decorators: [{
|
|
499
|
+
type: Inject,
|
|
500
|
+
args: [SMART_DATA_SERVICE_URL]
|
|
501
|
+
}] }, { type: undefined, decorators: [{
|
|
502
|
+
type: Inject,
|
|
503
|
+
args: [SMART_DOMAIN_FORMAT]
|
|
504
|
+
}] }]; } });
|
|
505
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3NtYXJ0L25nYy1zbWFydC1jb3JlL3NyYy9saWIvc21hcnQtYXV0aC9zbWFydC1hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2xELE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBR3BCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7OztBQUcxRCwyQ0FBMkM7QUFLM0MsTUFBTSxPQUFPLGdCQUFnQjtJQUkzQixZQUNVLElBQWdCLEVBQ2hCLFlBQXlCLEVBQ3pCLFVBQXNCLEVBQ1UsbUJBQW1CLEVBQ3RCLG9CQUE0QjtRQUp6RCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDVSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQUE7UUFDdEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFRO0lBQ2hFLENBQUM7SUFFRyxhQUFhO1FBQ2xCLElBQUksU0FBUyxFQUFFO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FB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LE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIGZyb20sIHRocm93RXJyb3IsIGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwLCB0YWtlLCBjYXRjaEVycm9yfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gJ0BhenVyZS9tc2FsLWFuZ3VsYXInO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7XG4gIExvZ2luU3RhZmYsXG4gIFNlbGVjdGVkT2ZmZW5kZXIsXG4gIFNNQVJUX0RBVEFfU0VSVklDRV9VUkwsXG4gIFNNQVJUX0RPTUFJTl9GT1JNQVQsXG4gIFJvbGUsXG4gIFBlcm1pc3Npb24sXG59IGZyb20gJy4uL3NtYXJ0LXN0b3JhZ2Uvc21hcnQtc3RvcmFnZS1tb2RlbCc7XG5pbXBvcnQgeyBYZG1TZXJ2aWNlIH0gZnJvbSAnLi4vc21hcnQtc3RvcmFnZS94ZG0uc2VydmljZSc7XG5pbXBvcnQgeyBTbWFydEFjY2Vzc0NvbnRyb2xDb25maWcgfSBmcm9tICcuL3NtYXJ0LWFjY2Vzcy1jb250cm9sLWNvbmZpZyc7XG5pbXBvcnQgeyBudWxsU2FmZUlzRXF1aXZhbGVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyL3NyYy9vdXRwdXQvb3V0cHV0X2FzdCc7XG4vLyBpbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICdxdWVyeXN0cmluZyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTbWFydEF1dGhTZXJ2aWNlIHtcbiAgbG9naW5TdGFmZjogTG9naW5TdGFmZjtcbiAgc2VsZWN0ZWRPZmZlbmRlcjogU2VsZWN0ZWRPZmZlbmRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhdXRoblNlcnZpY2U6IE1zYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgeGRtU2VydmljZTogWGRtU2VydmljZSxcbiAgICBASW5qZWN0KFNNQVJUX0RBVEFfU0VSVklDRV9VUkwpIHByaXZhdGUgc21hcnREYXRhU2VydmljZVVybCxcbiAgICBASW5qZWN0KFNNQVJUX0RPTUFJTl9GT1JNQVQpIHByaXZhdGUgc21hcnREb21haW5Gb3JtYXRVcmw6IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXRMb2dpblN0YWZmKCk6IE9ic2VydmFibGU8TG9naW5TdGFmZj4ge1xuICAgIGlmIChpc0Rldk1vZGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdTbWFydEF1dGhTZXJ2aWNlIC0gZ2V0TG9naW5TdGFmZigpJyk7XG4gICAgfVxuICAgIGlmICghaXNEZXZNb2RlICYmIHRoaXMubG9naW5TdGFmZikge1xuICAgICAgaWYgKHRoaXMubG9naW5TdGFmZi5zdGFmZklkKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCBpbnRlcm5hbCBpbnN0YW5jZSBpbiBzZXJ2aWNlJyxcbiAgICAgICAgICAgIHRoaXMubG9naW5TdGFmZixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZih0aGlzLmxvZ2luU3RhZmYpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luU3RhZmYudXNlck5hbWUpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIHByZXNldCB1c2VyIG5hbWUnLFxuICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhZmYodGhpcy5sb2dpblN0YWZmLnVzZXJOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyb20odGhpcy54ZG1TZXJ2aWNlLmdldExvZ2luU3RhZmYoKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoc3RvcmVkUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzdG9yZWRSZXN1bHQgJiYgc3RvcmVkUmVzdWx0LnN0YWZmSWQpIHtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IGZyb20gc2Vzc2lvbi4nLFxuICAgICAgICAgICAgICBzdG9yZWRSZXN1bHQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYgPSBzdG9yZWRSZXN1bHQ7XG4gICAgICAgICAgcmV0dXJuIG9mKHN0b3JlZFJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RvcmVkUmVzdWx0ICYmIHN0b3JlZFJlc3VsdC51c2VyTmFtZSkge1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAnIyMjIyMgZ2V0TG9naW5TdGFmZigpOiBnZXQgdXNpbmcgcHJlc2V0IHVzZXIgbmFtZScsXG4gICAgICAgICAgICAgIHRoaXMubG9naW5TdGFmZixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0YWZmKHN0b3JlZFJlc3VsdC51c2VyTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdXNlck5hbWUgPSB0aGlzLnVzZXJOYW1lO1xuICAgICAgICAgIGNvbnN0IHN0YWZmTmFtZSA9IHVzZXJOYW1lLnN1YnN0cmluZygwLCB1c2VyTmFtZS5pbmRleE9mKCdAJykpO1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAnIyMjIyMgbG9naW5Mb2dpblN0YWZmKCk6IGdldCB1c2luZyBsb2dpbiBzdGFmZiBuYW1lICcsXG4gICAgICAgICAgICAgIHN0YWZmTmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0YWZmKHN0YWZmTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBnZXQgdXNlck5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5hdXRoblNlcnZpY2UuaW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gdGhpcy5hdXRoblNlcnZpY2UuaW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKVswXTtcbiAgICAgIHJldHVybiBhY2NvdW50LnVzZXJuYW1lO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGVhbVVybChhcHA6IHN0cmluZywgYWZ0ZXJIYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNtYXJ0RG9tYWluRm9ybWF0VXJsLnJlcGxhY2UoJyR7QVBQfScsIGFwcCkgKyBhZnRlckhhc2g7XG4gIH1cbiAgcHJpdmF0ZSBpc1NhbWVIb3N0KHVybCwgYXBwKSB7XG4gICAgcmV0dXJuIHRoaXMuc21hcnREb21haW5Gb3JtYXRVcmwucmVwbGFjZSgnJHtBUFB9JywgYXBwKSA9PT0gdXJsO1xuICB9XG5cbiAgcHVibGljIHJlZGlyZWN0VG9UZWFtKGxvZ2luU3RhZmY6IExvZ2luU3RhZmYpIHtcbiAgICBpZiAobG9naW5TdGFmZi5yb2xlcy5maW5kSW5kZXgoKHJvbGUpID0+IHJvbGUucm9sZUlkID09PSAnRVVVU1BDJykgPiAtMSkge1xuICAgICAgaWYgKCF0aGlzLmlzU2FtZUhvc3Qod2luZG93LmxvY2F0aW9uLm9yaWdpbiwgJ2ludmVzdGlnYXRpb24nKSkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuZ2V0VGVhbVVybCgnaW52ZXN0aWdhdGlvbicsICcvYXNzaWdubWVudCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBsb2dpblN0YWZmLnJvbGVzLmZpbmRJbmRleChcbiAgICAgICAgKHJvbGUpID0+IHJvbGUucm9sZUlkLnN1YnN0cmluZygwLCAzKSA9PT0gJ1JTQycsXG4gICAgICApID4gLTFcbiAgICApIHtcbiAgICAgIGlmICghdGhpcy5pc1NhbWVIb3N0KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sICdyc2MnKSkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuZ2V0VGVhbVVybCgncnNjJywgJy9vZmZlbmRlci1saXN0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldFNlbGVjdGVkT2ZmZW5kZXIoc2VsZWN0ZWRPZmZlbmRlcjogU2VsZWN0ZWRPZmZlbmRlcikge1xuICAgIGlmICghdGhpcy5sb2dpblN0YWZmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNlbGVjdGVkT2ZmZW5kZXIpIHtcbiAgICAgIC8vIGlmICghc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkKSB7XG4gICAgICBjb25zdCByZWxhdGlvbiA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuZ2V0U3RhZmZPZmZlbmRlclJlbGF0aW9uKFxuICAgICAgICAgIHRoaXMubG9naW5TdGFmZi5zdGFmZklkLFxuICAgICAgICAgIHNlbGVjdGVkT2ZmZW5kZXIub2ZmZW5kZXJJZCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gcmVsYXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSAnTk9BU1NJR04nO1xuICAgICAgfVxuICAgICAgLy8gfVxuICAgIH1cbiAgICB0aGlzLnhkbVNlcnZpY2Uuc2V0U2VsZWN0ZWRPZmZlbmRlcihzZWxlY3RlZE9mZmVuZGVyKTtcbiAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIgPSBzZWxlY3RlZE9mZmVuZGVyO1xuICB9XG5cbiAgcHVibGljIGxvZ291dCgpOiB2b2lkIHtcbiAgICB0aGlzLnhkbVNlcnZpY2UuY2xlYXJBbGwoKTtcbiAgICB0aGlzLmF1dGhuU2VydmljZS5sb2dvdXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRQZXJtaXNzaW9uKFxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gICkge1xuICAgIGlmICghdGhpcy5sb2dpblN0YWZmKSB7XG4gICAgICB0aGlzLmxvZ2luU3RhZmYgPSBhd2FpdCB0aGlzLnhkbVNlcnZpY2UuZ2V0TG9naW5TdGFmZigpO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMubG9naW5TdGFmZi5wZXJtaXNzaW9ucztcbiAgICBjb25zdCByZXNvdXJjZSA9XG4gICAgICByb3V0ZS51cmwgJiYgcm91dGUudXJsLmxlbmd0aCA+IDAgPyByb3V0ZS51cmxbMF0hLnBhdGggOiAnJztcblxuICAgIGlmICghdGhpcy5zZWxlY3RlZE9mZmVuZGVyKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIgPSBhd2FpdCB0aGlzLnhkbVNlcnZpY2UuZ2V0U2VsZWN0ZWRPZmZlbmRlcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGVkT2ZmZW5kZXIpIHtcbiAgICAgIC8vIGlmICghdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gYXdhaXQgdGhpcy5nZXRTdGFmZk9mZmVuZGVyUmVsYXRpb24oXG4gICAgICAgIHRoaXMubG9naW5TdGFmZi5zdGFmZklkLFxuICAgICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIub2ZmZW5kZXJJZCxcbiAgICAgICkudG9Qcm9taXNlKCk7XG4gICAgICBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSByZWxhdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gJ05PQVNTSUdOJztcbiAgICAgIH1cbiAgICAgIHRoaXMueGRtU2VydmljZS5zZXRTZWxlY3RlZE9mZmVuZGVyKHRoaXMuc2VsZWN0ZWRPZmZlbmRlcik7XG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgY29uc3QgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9XG4gICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZDtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2NsYXNzXj1cInNhYy1cIl0nKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gL15zYWMtKFxcUyspLShcXFMrKSQvaTtcblxuICAgIEFycmF5LmZyb20oZWxlbWVudHMpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGxldCBoaWRlO1xuICAgICAgbGV0IGRpc2FibGU7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBjLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgICAgaWYgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgY29uc3Qgcm9sZUlkID0gcmVzdWx0c1sxXSA/IHJlc3VsdHNbMV0udG9VcHBlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgY29uc3QgcmlnaHQgPSByZXN1bHRzWzJdO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHNbMF0pO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHNbMV0pO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHNbMl0pO1xuICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSBwZXJtaXNzaW9ucy5maW5kKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCAmJlxuICAgICAgICAgICAgICBwLnJlc291cmNlID09PSByZXNvdXJjZSAmJlxuICAgICAgICAgICAgICBwLnJvbGVJZCA9PT0gcm9sZUlkICYmXG4gICAgICAgICAgICAgIHAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9PT0gYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvKlxuICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgcmVzb3VyY2U6ICcsIHJlc291cmNlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgc2V0UGVybWlzc2lvbigpIGFwcE1vZHVsZUlkOiAnLCBhcHBNb2R1bGVJZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIHNldFBlcm1pc3Npb24oKSByb2xlSWQ6ICcsIHJvbGVJZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAnIyMjIyMgc2V0UGVybWlzc2lvbigpIGFzc2lnbm1lbnQgcmVsYXRpb246ICcsXG4gICAgICAgICAgICBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgKi9cbiAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgTWF0Y2hlZCBwZXJtaXNzaW9uOiAnLCBwZXJtaXNzaW9uKTtcblxuICAgICAgICAgIGlmIChwZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAocmlnaHQgPT09ICdyZWFkJykge1xuICAgICAgICAgICAgICBpZiAoIXBlcm1pc3Npb24ucmVhZEZsYWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoaWRlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2NyZWF0ZScgJiYgIXBlcm1pc3Npb24uY3JlYXRlRmxhZykgfHxcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAndXBkYXRlJyAmJiAhcGVybWlzc2lvbi51cGRhdGVGbGFnKSB8fFxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdkZWxldGUnICYmICFwZXJtaXNzaW9uLmRlbGV0ZUZsYWcpIHx8XG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2Fzc2lnbicgJiYgIXBlcm1pc3Npb24uYXNzaWduRmxhZykgfHxcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnY2xvc2UnICYmICFwZXJtaXNzaW9uLmNsb3NlRmxhZykgfHxcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnZXhwdW5nZScgJiYgIXBlcm1pc3Npb24uZXhwdW5nZUZsYWcpIHx8XG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ3Jlb3BlbicgJiYgIXBlcm1pc3Npb24ucmVvcGVuRmxhZylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0JVVFRPTicpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIGRpc2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdCVVRUT04nKSB7XG4gICAgICAgICAgICAgICAgaGlkZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc2FibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocmlnaHQgPT09ICdyZWFkJykge1xuICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnQlVUVE9OJykge1xuICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXNhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBkaXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coJ2hpZGU6ICcsIGhpZGUpO1xuICAgICAgY29uc29sZS5sb2coJ2Rpc2FibGU6ICcsIGRpc2FibGUpO1xuICAgICAgaWYgKGhpZGUgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5oaWRlSHRtbEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9IGVsc2UgaWYgKGRpc2FibGUgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlSHRtbEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tQZXJtaXNzaW9uKGFjY2Vzc0NvbnRyb2xDb25maWc6IFNtYXJ0QWNjZXNzQ29udHJvbENvbmZpZykge1xuICAgIGNvbnN0IHNlbERhdGEgPSBhY2Nlc3NDb250cm9sQ29uZmlnLnJvdXRlLmRhdGE7XG4gICAgdGhpcy5sb2dpblN0YWZmID0gc2VsRGF0YS5sb2dpblN0YWZmO1xuICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlciA9IHNlbERhdGEuc2VsZWN0ZWRPZmZlbmRlcjtcbiAgICBsZXQgcm91dGVQYXRoID0gJyc7XG4gICAgaWYgKFxuICAgICAgYWNjZXNzQ29udHJvbENvbmZpZy5yb3V0ZS51cmwgJiZcbiAgICAgIGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUudXJsLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHJvdXRlUGF0aCA9IGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUudXJsWzBdIS5wYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5sb2dpblN0YWZmLnBlcm1pc3Npb25zO1xuICAgIGNvbnN0IHJlc291cmNlID0gcm91dGVQYXRoO1xuICAgIGNvbnN0IHJvbGVJZCA9IGFjY2Vzc0NvbnRyb2xDb25maWcucm9sZUlkXG4gICAgICA/IGFjY2Vzc0NvbnRyb2xDb25maWcucm9sZUlkLnRvVXBwZXJDYXNlKClcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBhY2Nlc3NUeXBlID0gYWNjZXNzQ29udHJvbENvbmZpZy5hY2Nlc3NUeXBlO1xuICAgIGNvbnN0IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSAoIXRoaXMuc2VsZWN0ZWRPZmZlbmRlciB8fCAhdGhpcy5zZWxlY3RlZE9mZmVuZGVyXG4gICAgICAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZClcbiAgICAgID8gJ04vQSdcbiAgICAgIDogdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XG5cbiAgICBjb25zdCBwZXJtaXNzaW9uID0gcGVybWlzc2lvbnMuZmluZCgocCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgcC5hcHBNb2R1bGVJZCA9PT0gYWNjZXNzQ29udHJvbENvbmZpZy5hcHBNb2R1bGVJZCAmJlxuICAgICAgICBwLnJlc291cmNlID09PSByZXNvdXJjZSAmJlxuICAgICAgICAoIXJvbGVJZCB8fCBwLnJvbGVJZCA9PT0gcm9sZUlkKSAmJlxuICAgICAgICAocC5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID09PSAnTi9BJyB8fFxuICAgICAgICAgIHAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9PT0gYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpZiAocGVybWlzc2lvbikge1xuICAgICAgaWYgKGFjY2Vzc1R5cGUgPT09ICdyZWFkJykge1xuICAgICAgICBpZiAoIXBlcm1pc3Npb24ucmVhZEZsYWcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChhY2Nlc3NUeXBlID09PSAnY3JlYXRlJyAmJiAhcGVybWlzc2lvbi5jcmVhdGVGbGFnKSB8fFxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3VwZGF0ZScgJiYgIXBlcm1pc3Npb24udXBkYXRlRmxhZykgfHxcbiAgICAgICAgKGFjY2Vzc1R5cGUgPT09ICdkZWxldGUnICYmICFwZXJtaXNzaW9uLmRlbGV0ZUZsYWcpIHx8XG4gICAgICAgIChhY2Nlc3NUeXBlID09PSAnYXNzaWduJyAmJiAhcGVybWlzc2lvbi5hc3NpZ25GbGFnKSB8fFxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Nsb3NlJyAmJiAhcGVybWlzc2lvbi5jbG9zZUZsYWcpIHx8XG4gICAgICAgIChhY2Nlc3NUeXBlID09PSAnZXhwdW5nZScgJiYgIXBlcm1pc3Npb24uZXhwdW5nZUZsYWcpIHx8XG4gICAgICAgIChhY2Nlc3NUeXBlID09PSAncmVvcGVuJyAmJiAhcGVybWlzc2lvbi5yZW9wZW5GbGFnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGNhbkFwcEZlYXR1cmVBY3RpdmF0ZShcbiAgICBsb2dpblN0YWZmOiBMb2dpblN0YWZmLFxuICAgIGZlYXR1cmU6IHN0cmluZyxcbiAgICBhcHBNb2R1bGVJZCA9IG51bGwsXG4gICkge1xuICAgIC8vIGlmICghdGhpcy5pc0F1dGhFbmFibGUobG9naW5TdGFmZi5yb2xlcywgYXBwTW9kdWxlSWQpKSB7XG4gICAgLy8gICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9XG4gICAgcmV0dXJuIHRoaXMuaGFzQXBwRmVhdHVyZVBlcm1pc3Npb24oXG4gICAgICBsb2dpblN0YWZmLnBlcm1pc3Npb25zLFxuICAgICAgZmVhdHVyZSxcbiAgICAgIGFwcE1vZHVsZUlkLFxuICAgICk7XG4gIH1cblxuICAvLyBwdWJsaWMgaXNBdXRoRW5hYmxlKHJvbGVzOiBSb2xlW10sIGFwcE1vZHVsZUlkOiBzdHJpbmcpIHtcbiAgLy8gICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAvLyAgICAgcmV0dXJuIHJvbGVzLm1hcChyID0+IHIucm9sZUlkKS5maW5kSW5kZXgodGhpcy5pc0V4dGVybmFsUm9sZSkgPiAtMSB8fCBhcHBNb2R1bGVJZCA9PT0gJ1JSJztcbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIGZhbHNlO1xuICAvLyB9XG5cbiAgcHVibGljIGhhc0ludGFrZVJvbGUocm9sZXM6IFJvbGVbXSkge1xuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcm9sZXMuZmluZEluZGV4KHRoaXMuaXNJbnRha2VSb2xlKSA+IC0xO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhc0FwcEZlYXR1cmVQZXJtaXNzaW9uKFxuICAgIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10sXG4gICAgZmVhdHVyZTogc3RyaW5nLFxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXG4gICkge1xuICAgIGlmIChwZXJtaXNzaW9ucyAmJiBwZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoYXBwTW9kdWxlSWQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBwZXJtaXNzaW9ucy5maW5kSW5kZXgoXG4gICAgICAgICAgICAocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSAmJiBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCxcbiAgICAgICAgICApID4gLTFcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwZXJtaXNzaW9ucy5maW5kSW5kZXgoKHApID0+IHAucmVzb3VyY2UgPT09IGZlYXR1cmUpID4gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0V4dGVybmFsUm9sZShyb2xlSWQpIHtcbiAgICBzd2l0Y2ggKHJvbGVJZCkge1xuICAgICAgY2FzZSAnRVVEVEwnOlxuICAgICAgY2FzZSAnRVVEVVNNJzpcbiAgICAgIGNhc2UgJ0VVSkRHJzpcbiAgICAgIGNhc2UgJ0VVTVBEJzpcbiAgICAgIGNhc2UgJ0VVU09UVic6XG4gICAgICBjYXNlICdFVVVTQTInOlxuICAgICAgY2FzZSAnRVVVU0FPJzpcbiAgICAgIGNhc2UgJ0VVVVNQQyc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNJbnRha2VSb2xlKHJvbGU6IFJvbGUpIHtcbiAgICBzd2l0Y2ggKHJvbGUucm9sZUlkKSB7XG4gICAgICBjYXNlICdPUEEnOlxuICAgICAgY2FzZSAnT1BTJzpcbiAgICAgIGNhc2UgJ1NPUFMnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVIdG1sRWxlbWVudChlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5sb2coZWxlbWVudCk7XG4gICAgc3dpdGNoIChlbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgICBjYXNlICdBJzpcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAncG9pbnRlci1ldmVudHM6IG5vbmU7Y3Vyc29yOiBub3QtYWxsb3dlZDsnLFxuICAgICAgICApO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnLTEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoaWRlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnaGlkZGVuJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmU7Jyk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWZmKHVzZXJOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvZ2luU3RhZmY+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeTxhbnk+KHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmZpbmRTdGFmZlF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgIHVzZXJOYW1lOiB1c2VyTmFtZSxcbiAgICAgICAgICAgIGFjdGl2ZUZsYWc6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KS5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBnZXRTdGFmZigpIGZyb20gc2VydmljZSAnLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmZpbmR2U3RhZmZzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5maW5kdlN0YWZmcy5kYXRhWzBdO1xuICAgICAgICAgICAgdGhpcy54ZG1TZXJ2aWNlLnNldExvZ2luU3RhZmYoZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYgPSBkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnICsgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBxdWVyeTxUPihvcHRpb25zOiB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICB2YXJpYWJsZXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8eyBkYXRhOiBUIH0+KFxuICAgICAgICB0aGlzLnNtYXJ0RGF0YVNlcnZpY2VVcmwsXG4gICAgICAgIHtcbiAgICAgICAgICBxdWVyeTogb3B0aW9ucy5xdWVyeSxcbiAgICAgICAgICB2YXJpYWJsZXM6IG9wdGlvbnMudmFyaWFibGVzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnTm8tQXV0aCc6ICdUcnVlJyxcbiAgICAgICAgICB9KSxcbiAgICAgICB9XG4gICAgICApXG4gICAgICAucGlwZShtYXAoKGQpID0+IGQuZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZmluZFN0YWZmUXVlcnkoKXtcbiAgICByZXR1cm4gYFxuICAgICBxdWVyeSBmaW5kdlN0YWZmcygkaW5wdXQ6IHZTdGFmZk11bHRpSW5wdXQpIHtcbiAgICAgICAgZmluZHZTdGFmZnMoaW5wdXQ6ICRpbnB1dCkge1xuICAgICAgICAgIHRvdGFsQ291bnRcbiAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICAgZGF0YSB7XG4gICAgICAgICAgICBzdGFmZklkXG4gICAgICAgICAgICB1c2VyTmFtZVxuICAgICAgICAgICAgbGFzdE5hbWVcbiAgICAgICAgICAgIGZpcnN0TmFtZVxuICAgICAgICAgICAgcGhvbmVcbiAgICAgICAgICAgIGVtYWlsXG4gICAgICAgICAgICByb2xlcyB7XG4gICAgICAgICAgICAgIHJvbGVJZFxuICAgICAgICAgICAgICByb2xlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZXJtaXNzaW9ucyB7XG4gICAgICAgICAgICAgIHJvbGVJZFxuICAgICAgICAgICAgICBhcHBNb2R1bGVJZFxuICAgICAgICAgICAgICByZXNvdXJjZVxuICAgICAgICAgICAgICBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkXG4gICAgICAgICAgICAgIHJlYWRGbGFnXG4gICAgICAgICAgICAgIGNyZWF0ZUZsYWdcbiAgICAgICAgICAgICAgdXBkYXRlRmxhZ1xuICAgICAgICAgICAgICBkZWxldGVGbGFnXG4gICAgICAgICAgICAgIGFzc2lnbkZsYWdcbiAgICAgICAgICAgICAgcmVvcGVuRmxhZ1xuICAgICAgICAgICAgICBjbG9zZUZsYWdcbiAgICAgICAgICAgICAgZXhwdW5nZUZsYWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMge1xuICAgICAgICAgICAgICBvZmZlbmRlckxpc3RPcHRpb25JZFxuICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgIHNlcnZpY2VBcGlGaWVsZE5hbWVcbiAgICAgICAgICAgICAgc2VsZWN0ZWRGbGFnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhZmZPZmZlbmRlclJlbGF0aW9uKFxuICAgIHN0YWZmSWQ6IG51bWJlcixcbiAgICBvZmZlbmRlcklkOiBudW1iZXIsXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpbmR2U3RhZmZPZmZlbmRlclJlbGF0aW9ucyhpbnB1dDoge3doZXJlOiB7c3RhZmZJZDogJHtzdGFmZklkfSwgb2ZmZW5kZXJJZDogJHtvZmZlbmRlcklkfX19KSB7XG4gICAgICAgICAgICAgICAgZGF0YSB7XG4gICAgICAgICAgICAgICAgICBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9YDtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PGFueT4odGhpcy5zbWFydERhdGFTZXJ2aWNlVXJsLCB7IHF1ZXJ5OiBxdWVyeVN0cmluZyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICcjIyMjIyBnZXRTdGFmZk9mZmVuZGVyUmVsYXRpb24oKSBmcm9tIHNlcnZpY2UgJyxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmZpbmR2U3RhZmZPZmZlbmRlclJlbGF0aW9ucy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZGF0YS5maW5kdlN0YWZmT2ZmZW5kZXJSZWxhdGlvbnMuZGF0YVswXTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgLy8gcmV0dXJuIHRocm93RXJyb3IoJ05vIGFjY2VzcyByaWdodC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnICsgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFJvbGVQZXJtaXNzaW9ucyhcbiAgICBhcHBNb2R1bGVJZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gYFxuICAgICAgICAgICBxdWVyeSBmaW5kdlJvbGVQZXJtaXNzaW9uUGl2b3Rze1xuICAgICAgICAgICAgZmluZHZSb2xlUGVybWlzc2lvblBpdm90cyhpbnB1dDoge3doZXJlOiB7YXBwTW9kdWxlSWQ6ICR7YXBwTW9kdWxlSWR9LCByZXNvdXJjZTogJHtyZXNvdXJjZX19fSl7XG4gICAgICAgICAgICAgIHRvdGFsQ291bnRcbiAgICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1gO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8YW55Pih0aGlzLnNtYXJ0RGF0YVNlcnZpY2VVcmwsIHsgcXVlcnk6IHF1ZXJ5U3RyaW5nIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgbWFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgJyMjIyMjIGZpbmR2Um9sZVBlcm1pc3Npb25QaXZvdHMoKSBmcm9tIHNlcnZpY2UgJyxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmZpbmR2Um9sZVBlcm1pc3Npb25QaXZvdHMudG90YWxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyByZXR1cm4gdGhyb3dFcnJvcignTm8gYWNjZXNzIHJpZ2h0LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyArIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxufVxuIl19
|