@ieeesa-npm/tenants 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/esm2022/ieeesa-npm-tenants.mjs +5 -0
  2. package/esm2022/lib/assets/constants.json +454 -0
  3. package/esm2022/lib/assets/tenant-validations.mjs +17 -0
  4. package/esm2022/lib/components/create-modify-group-type/create-modify-group-type.component.mjs +476 -0
  5. package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +279 -0
  6. package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +512 -0
  7. package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +391 -0
  8. package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +94 -0
  9. package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +733 -0
  10. package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +194 -0
  11. package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +335 -0
  12. package/esm2022/lib/models/app-type-config.model.mjs +2 -0
  13. package/esm2022/lib/models/app-type.model.mjs +7 -0
  14. package/esm2022/lib/models/create-group-type-config.model.mjs +22 -0
  15. package/esm2022/lib/models/create-group-type.model.mjs +2 -0
  16. package/esm2022/lib/models/feature-permission-id.model.mjs +8 -0
  17. package/esm2022/lib/models/features.model.mjs +2 -0
  18. package/esm2022/lib/models/permission-type.model.mjs +12 -0
  19. package/esm2022/lib/models/role-menu-action.model.mjs +7 -0
  20. package/esm2022/lib/models/role-type.model.mjs +2 -0
  21. package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +7 -0
  22. package/esm2022/lib/models/roles-and-permissions.model.mjs +2 -0
  23. package/esm2022/lib/models/route-config.model.mjs +2 -0
  24. package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +16 -0
  25. package/esm2022/lib/models/tenant-function-type.model.mjs +12 -0
  26. package/esm2022/lib/models/tenant.model.mjs +2 -0
  27. package/esm2022/lib/models/tenants-permission.model.mjs +2 -0
  28. package/esm2022/lib/models/update-tenant-status.model.mjs +2 -0
  29. package/esm2022/lib/models/view-tenant-group-types.model.mjs +11 -0
  30. package/esm2022/lib/services/tenant-applications.service.mjs +618 -0
  31. package/esm2022/lib/services/tenant-permissions-map.service.mjs +36 -0
  32. package/esm2022/lib/services/tenant-permissions.service.mjs +38 -0
  33. package/esm2022/lib/tenant-applications.component.mjs +14 -0
  34. package/esm2022/lib/tenant-applications.module.mjs +16 -0
  35. package/esm2022/public-api.mjs +36 -0
  36. package/fesm2022/ieeesa-npm-tenants.mjs +4233 -0
  37. package/fesm2022/ieeesa-npm-tenants.mjs.map +1 -0
  38. package/index.d.ts +5 -0
  39. package/lib/assets/tenant-validations.d.ts +15 -0
  40. package/lib/components/create-modify-group-type/create-modify-group-type.component.d.ts +129 -0
  41. package/lib/components/create-modify-role/create-modify-role.component.d.ts +103 -0
  42. package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +128 -0
  43. package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +106 -0
  44. package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +471 -0
  45. package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +223 -0
  46. package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +63 -0
  47. package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +134 -0
  48. package/lib/models/app-type-config.model.d.ts +14 -0
  49. package/lib/models/app-type.model.d.ts +4 -0
  50. package/lib/models/create-group-type-config.model.d.ts +16 -0
  51. package/lib/models/create-group-type.model.d.ts +49 -0
  52. package/lib/models/feature-permission-id.model.d.ts +4 -0
  53. package/lib/models/features.model.d.ts +15 -0
  54. package/lib/models/permission-type.model.d.ts +8 -0
  55. package/lib/models/role-menu-action.model.d.ts +4 -0
  56. package/lib/models/role-type.model.d.ts +27 -0
  57. package/lib/models/roles-and-permissions-table-type.model.d.ts +4 -0
  58. package/lib/models/roles-and-permissions.model.d.ts +119 -0
  59. package/lib/models/route-config.model.d.ts +4 -0
  60. package/lib/models/table-column-schema-view-tenant-list.model.d.ts +20 -0
  61. package/lib/models/tenant-function-type.model.d.ts +9 -0
  62. package/lib/models/tenant.model.d.ts +51 -0
  63. package/lib/models/tenants-permission.model.d.ts +9 -0
  64. package/lib/models/update-tenant-status.model.d.ts +14 -0
  65. package/lib/models/view-tenant-group-types.model.d.ts +29 -0
  66. package/lib/services/tenant-applications.service.d.ts +399 -0
  67. package/lib/services/tenant-permissions-map.service.d.ts +13 -0
  68. package/lib/services/tenant-permissions.service.d.ts +22 -0
  69. package/lib/tenant-applications.component.d.ts +5 -0
  70. package/lib/tenant-applications.module.d.ts +6 -0
  71. package/package.json +25 -12
  72. package/{src/public-api.ts → public-api.d.ts} +32 -40
  73. package/.eslintrc.json +0 -31
  74. package/ng-package.json +0 -8
  75. package/src/lib/assets/constants.json +0 -454
  76. package/src/lib/assets/tenant-validations.ts +0 -18
  77. package/src/lib/assets/tenants-mock.ts +0 -1240
  78. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.html +0 -15
  79. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.scss +0 -44
  80. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.spec.ts +0 -574
  81. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.ts +0 -602
  82. package/src/lib/components/create-modify-role/create-modify-role.component.html +0 -15
  83. package/src/lib/components/create-modify-role/create-modify-role.component.scss +0 -83
  84. package/src/lib/components/create-modify-role/create-modify-role.component.spec.ts +0 -346
  85. package/src/lib/components/create-modify-role/create-modify-role.component.ts +0 -321
  86. package/src/lib/components/create-tenant-application/create-tenant-application.component.html +0 -18
  87. package/src/lib/components/create-tenant-application/create-tenant-application.component.scss +0 -73
  88. package/src/lib/components/create-tenant-application/create-tenant-application.component.spec.ts +0 -775
  89. package/src/lib/components/create-tenant-application/create-tenant-application.component.ts +0 -638
  90. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.html +0 -22
  91. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.scss +0 -79
  92. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.spec.ts +0 -716
  93. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.ts +0 -504
  94. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.html +0 -44
  95. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.scss +0 -16
  96. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.spec.ts +0 -115
  97. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.ts +0 -109
  98. package/src/lib/components/view-tenant-details/view-tenant-details.component.html +0 -195
  99. package/src/lib/components/view-tenant-details/view-tenant-details.component.scss +0 -163
  100. package/src/lib/components/view-tenant-details/view-tenant-details.component.spec.ts +0 -1221
  101. package/src/lib/components/view-tenant-details/view-tenant-details.component.ts +0 -876
  102. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.html +0 -10
  103. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.scss +0 -44
  104. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.spec.ts +0 -410
  105. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.ts +0 -219
  106. package/src/lib/components/view-tenants-list/view-tenants-list.component.html +0 -32
  107. package/src/lib/components/view-tenants-list/view-tenants-list.component.scss +0 -35
  108. package/src/lib/components/view-tenants-list/view-tenants-list.component.spec.ts +0 -464
  109. package/src/lib/components/view-tenants-list/view-tenants-list.component.ts +0 -388
  110. package/src/lib/models/app-type-config.model.ts +0 -14
  111. package/src/lib/models/app-type.model.ts +0 -5
  112. package/src/lib/models/create-group-type-config.model.ts +0 -18
  113. package/src/lib/models/create-group-type.model.ts +0 -46
  114. package/src/lib/models/feature-permission-id.model.ts +0 -6
  115. package/src/lib/models/features.model.ts +0 -15
  116. package/src/lib/models/form-status.model.ts +0 -5
  117. package/src/lib/models/permission-type.model.ts +0 -9
  118. package/src/lib/models/role-menu-action.model.ts +0 -5
  119. package/src/lib/models/role-type.model.ts +0 -34
  120. package/src/lib/models/roles-and-permissions-table-type.model.ts +0 -5
  121. package/src/lib/models/roles-and-permissions.model.ts +0 -113
  122. package/src/lib/models/route-config.model.ts +0 -4
  123. package/src/lib/models/table-column-schema-view-tenant-list.model.ts +0 -21
  124. package/src/lib/models/tenant-function-type.model.ts +0 -10
  125. package/src/lib/models/tenant.model.ts +0 -47
  126. package/src/lib/models/tenants-permission.model.ts +0 -9
  127. package/src/lib/models/update-tenant-status.model.ts +0 -12
  128. package/src/lib/models/view-tenant-group-types.model.ts +0 -34
  129. package/src/lib/services/tenant-applications.service.spec.ts +0 -1245
  130. package/src/lib/services/tenant-applications.service.ts +0 -798
  131. package/src/lib/services/tenant-permissions-map.service.spec.ts +0 -25
  132. package/src/lib/services/tenant-permissions-map.service.ts +0 -28
  133. package/src/lib/services/tenant-permissions.service.spec.ts +0 -62
  134. package/src/lib/services/tenant-permissions.service.ts +0 -49
  135. package/src/lib/tenant-applications.component.html +0 -0
  136. package/src/lib/tenant-applications.component.scss +0 -0
  137. package/src/lib/tenant-applications.component.spec.ts +0 -28
  138. package/src/lib/tenant-applications.component.ts +0 -12
  139. package/src/lib/tenant-applications.module.ts +0 -8
  140. package/tsconfig.lib.json +0 -14
  141. package/tsconfig.lib.prod.json +0 -10
  142. package/tsconfig.spec.json +0 -14
@@ -0,0 +1,618 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject, catchError, map } from 'rxjs';
3
+ import * as screenTexts from '../assets/constants.json';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@ieeesa-npm/utility";
6
+ import * as i2 from "./tenant-permissions.service";
7
+ import * as i3 from "./tenant-permissions-map.service";
8
+ export class TenantApplicationsService {
9
+ constructor(
10
+ // eslint-disable-next-line no-unused-vars
11
+ httpService,
12
+ // eslint-disable-next-line no-unused-vars
13
+ tenantPermissionsService,
14
+ // eslint-disable-next-line no-unused-vars
15
+ tenantPermissionsMapService // eslint-disable-next-line no-empty-function
16
+ ) {
17
+ this.httpService = httpService;
18
+ this.tenantPermissionsService = tenantPermissionsService;
19
+ this.tenantPermissionsMapService = tenantPermissionsMapService;
20
+ this.tenantsText = screenTexts?.viewTenants?.errors;
21
+ this.createTenantsText = screenTexts?.createTenant?.errors;
22
+ this.radioOptions = [];
23
+ this.checkBoxOptions = [];
24
+ this.appTypeInfo = [];
25
+ this.featureList = [];
26
+ this.roleTypeOptions = [];
27
+ this.isGroupTypeAddedOrModified = new Subject();
28
+ }
29
+ setAppConfig(apiBaseUrl, userPermission) {
30
+ this.apiBaseUrl = apiBaseUrl;
31
+ this.userPermission = userPermission;
32
+ }
33
+ /**
34
+ * Gets tenant details from server using HttpService
35
+ * @param {string} appId
36
+ * @return {Observable<TenantDetailsResponse>}
37
+ * @memberof TenantApplicationsService
38
+ */
39
+ getTenantDetails(appId) {
40
+ return this.httpService
41
+ .getData(`${this.apiBaseUrl}/configurations/app/details/${appId}`)
42
+ .pipe(map((response) => {
43
+ return response;
44
+ }), catchError((error) => {
45
+ throw error;
46
+ }));
47
+ }
48
+ /**
49
+ * Sets the user tenants permissions
50
+ * @param {TenantsPermissions[]} TenantsPermissions
51
+ * @memberof TenantApplicationsService
52
+ */
53
+ setUserTenantsPermissions(userTenantsPermissions) {
54
+ this.userTenantsPermissions = userTenantsPermissions;
55
+ }
56
+ /**
57
+ * Returns the user tenants permissions
58
+ * @return {TenantsPermissions[]}
59
+ * @memberof TenantApplicationsService
60
+ */
61
+ getUserTenantsPermissions() {
62
+ return this.userTenantsPermissions;
63
+ }
64
+ /**
65
+ * Sets the user tenants information
66
+ * @param {TenantBasicInfo} tenantInfo
67
+ * @memberof TenantApplicationsService
68
+ */
69
+ setSelectedTenantInformation(tenantInfo) {
70
+ this.selectedTenantInfo = tenantInfo;
71
+ }
72
+ /**
73
+ * Returns the tenants information
74
+ * @return {TenantBasicInfo}
75
+ * @memberof TenantApplicationsService
76
+ */
77
+ getSelectedTenantInformation() {
78
+ return this.selectedTenantInfo;
79
+ }
80
+ /**
81
+ * Sets the roles informations
82
+ * @param {Role} roles
83
+ * @memberof TenantApplicationsService
84
+ */
85
+ setRolesInfo(roles) {
86
+ this.roles = roles;
87
+ }
88
+ /**
89
+ * Returns the roles information
90
+ * @return {Role}
91
+ * @memberof TenantApplicationsService
92
+ */
93
+ getRolesInfo() {
94
+ return this.roles;
95
+ }
96
+ /**
97
+ * Sets the selected role information.
98
+ * @param {RoleDetails} roleInfo
99
+ * @memberof TenantApplicationsService
100
+ */
101
+ setSelectedRoleInformation(roleInfo) {
102
+ this.selectedRoleInfo = roleInfo;
103
+ }
104
+ /**
105
+ * Returns the selected role information.
106
+ * @return {RoleDetails}
107
+ * @memberof TenantApplicationsService
108
+ */
109
+ getSelectedRoleInformation() {
110
+ return this.selectedRoleInfo;
111
+ }
112
+ /**
113
+ * Sets the tenant role type options.
114
+ * @param {RoleTypeOption} roleTypeOptions
115
+ * @memberof TenantApplicationsService
116
+ */
117
+ setRoleTypeOption(roleTypeOptions) {
118
+ this.roleTypeOption = roleTypeOptions;
119
+ }
120
+ /**
121
+ * Returns the tenant role type options.
122
+ * @return {RoleTypeOption}
123
+ * @memberof TenantApplicationsService
124
+ */
125
+ getRoleTypeOption() {
126
+ return this.roleTypeOption;
127
+ }
128
+ /**
129
+ * Sets the list of application type information
130
+ * @param {RadioOption} appTypeInfo
131
+ * @memberof TenantApplicationsService
132
+ */
133
+ setApplicationType(appTypeInfo) {
134
+ this.appTypeInfo = appTypeInfo;
135
+ }
136
+ /**
137
+ * Returns the list of application type information
138
+ * @return {RadioOption}
139
+ * @memberof TenantApplicationsService
140
+ */
141
+ getApplicationType() {
142
+ return this.appTypeInfo;
143
+ }
144
+ /**
145
+ * Filter permissions
146
+ * @param usersPermissions
147
+ * @returns @memberof TenantApplicationsService
148
+ */
149
+ filterPermission(usersPermissions) {
150
+ return this.tenantPermissionsService?.filterTenantsPermissions(usersPermissions, this.tenantPermissionsMapService?.getGlobalTenantsPermissions());
151
+ }
152
+ /**
153
+ * Validating access for tenants
154
+ * @param permissionType Permission Type to validate permission
155
+ * @param mappedUserPermissions Permission which are mapped with tenants
156
+ * @returns true if permission is granted
157
+ */
158
+ validateAccess(permissionType, permissions) {
159
+ return this.tenantPermissionsService.validateAccessPermission(permissionType, permissions);
160
+ }
161
+ /**
162
+ * Gets the tenants.
163
+ * @param {GetTenantsPayload} payload
164
+ * @return {Observable<GetTenantsResponse>}
165
+ * @memberof TenantApplicationsService
166
+ */
167
+ getTenantsList(payload) {
168
+ return this.httpService
169
+ .postData(`${this.apiBaseUrl}/configurations/app/config`, payload)
170
+ .pipe(map((response) => {
171
+ return response;
172
+ }), catchError((error) => {
173
+ throw error;
174
+ }));
175
+ }
176
+ /**
177
+ * Gets list of features from server using HttpService.
178
+ * @return {Observable<GetFeaturesResponse>}
179
+ * @memberof TenantApplicationsService
180
+ */
181
+ getFeatures() {
182
+ return this.httpService
183
+ .getData(`${this.apiBaseUrl}/configurations/app/features`)
184
+ .pipe(map((response) => {
185
+ return response;
186
+ }), catchError((error) => {
187
+ throw error;
188
+ }));
189
+ }
190
+ /**
191
+ * Gets list of roles from server using HttpService.
192
+ * @param {string} appId
193
+ * @return {*} {Observable<GetRolesResponse>}
194
+ * @memberof TenantApplicationsService
195
+ */
196
+ getRoles(appId) {
197
+ return this.httpService
198
+ .getData(`${this.apiBaseUrl}/groups/role/${appId}`)
199
+ .pipe(map((response) => {
200
+ return response;
201
+ }), catchError((error) => {
202
+ throw error;
203
+ }));
204
+ }
205
+ /**
206
+ * Gets the list of permissions based on the appId and return the success or error response as Observable.
207
+ * @param {string} appId
208
+ * @return {Observable<GetPermissionsResponse>}
209
+ * @memberof TenantApplicationsService
210
+ */
211
+ getPermissions(appId) {
212
+ return this.httpService
213
+ .getData(`${this.apiBaseUrl}/groups/permissions/${appId}`)
214
+ .pipe(map((response) => {
215
+ return response;
216
+ }), catchError((error) => {
217
+ throw error;
218
+ }));
219
+ }
220
+ /**
221
+ * Gets the list of roles or permissions based on the roleId or permissionId in the payload and return the success or error response as Observable.
222
+ * @param {RolePermissionMappingRequestPayload} payload
223
+ * @returns {Observable<RolePermissionMappingResponse>}
224
+ * @memberof TenantApplicationsService
225
+ */
226
+ getRolePermissionMapping(payload) {
227
+ return this.httpService
228
+ .postData(`${this.apiBaseUrl}/groups/users/rolePermissionMapping`, payload)
229
+ .pipe(map((response) => {
230
+ return response;
231
+ }), catchError((error) => {
232
+ throw error;
233
+ }));
234
+ }
235
+ /**
236
+ * Submit the new mappings of roles to permissions to the server.
237
+ * @param {RolesAndPermissionsRequestPayload} payload
238
+ * @returns {Observable<RolesAndPermissionsResponse>}
239
+ * @memberof TenantApplicationsService
240
+ */
241
+ saveRolePermissionMapping(payload) {
242
+ return this.httpService
243
+ .postData(`${this.apiBaseUrl}/groups/users/rolePermission`, payload)
244
+ .pipe(map((response) => {
245
+ return response;
246
+ }), catchError((error) => {
247
+ throw error;
248
+ }));
249
+ }
250
+ /**
251
+ * Gets list of roles and permissions mappings from server using HttpService.
252
+ * @param {string} appId
253
+ * @param {GetRolesAndPermissionsPayload} payload
254
+ * @return {*} {Observable<GetRolesAndPermissionsResponse>}
255
+ * @memberof TenantApplicationsService
256
+ */
257
+ getRolesAndPermissionsMappings(appId, payload) {
258
+ return this.httpService
259
+ .postData(`${this.apiBaseUrl}/groups/roleBasedPermissions/${appId}`, payload)
260
+ .pipe(map((response) => {
261
+ return response;
262
+ }), catchError((error) => {
263
+ throw error;
264
+ }));
265
+ }
266
+ /**
267
+ * Gets list of application types from server using HttpService.
268
+ * @return {Observable<GetAppTypesResponse>}
269
+ * @memberof TenantApplicationsService
270
+ */
271
+ getApplicationTypes() {
272
+ return this.httpService
273
+ .getData(`${this.apiBaseUrl}/configurations/config/app_type`)
274
+ .pipe(map((response) => {
275
+ return response;
276
+ }), catchError((error) => {
277
+ throw error;
278
+ }));
279
+ }
280
+ /**
281
+ * Posts create role form data to server using HttpService to create a new role.
282
+ * @param {CreateModifyRoleRequestPayload} createModifyRolePayload
283
+ * @return {Observable<CreateModifyRoleResponse>}
284
+ * @memberof TenantApplicationsService
285
+ */
286
+ createRole(createModifyRolePayload) {
287
+ return this.httpService
288
+ .postData(`${this.apiBaseUrl}/groups/role`, createModifyRolePayload)
289
+ .pipe(map((response) => {
290
+ return response;
291
+ }), catchError((error) => {
292
+ throw error;
293
+ }));
294
+ }
295
+ /**
296
+ * Posts the edited role form data to server using HttpService for updating the role information.
297
+ * @param {CreateModifyRoleRequestPayload} createModifyRolePayload
298
+ * @return {Observable<CreateModifyRoleResponse>}
299
+ * @memberof TenantApplicationsService
300
+ */
301
+ editRole(createModifyRolePayload) {
302
+ return this.httpService
303
+ .putData(`${this.apiBaseUrl}/groups/role`, createModifyRolePayload)
304
+ .pipe(map((response) => {
305
+ return response;
306
+ }), catchError((error) => {
307
+ throw error;
308
+ }));
309
+ }
310
+ /**
311
+ * Gets list of role types from server using HttpService.
312
+ * @param {GetRoleTypesPayload} payload
313
+ * @return {Observable<RoleTypeResponse>}
314
+ * @memberof TenantApplicationsService
315
+ */
316
+ getRoleTypes(payload) {
317
+ return this.httpService
318
+ .postData(`${this.apiBaseUrl}/configurations/config/configField`, payload)
319
+ .pipe(map((response) => {
320
+ return response;
321
+ }), catchError((error) => {
322
+ throw error;
323
+ }));
324
+ }
325
+ /**
326
+ * Constructs the select/dropdown options from the role types received from server.
327
+ * @param {RoleTypeConfiguration[]} roleTypeResponse
328
+ * @return {RoleTypeOption[]}
329
+ * @memberof TenantApplicationsService
330
+ */
331
+ getRoleTypeOptions(roleTypeResponse) {
332
+ this.roleTypeOptions = [];
333
+ roleTypeResponse.forEach((item) => {
334
+ this.roleTypeOptions?.push({
335
+ id: item?.configFieldId,
336
+ name: item?.configFieldValue?.roleTypeName,
337
+ order: item?.configFieldValue?.viewOrder,
338
+ });
339
+ });
340
+ this.roleTypeOptions.sort((a, b) => a.order - b.order);
341
+ return this.roleTypeOptions;
342
+ }
343
+ /**
344
+ * Posts tenant application form data to server using HttpService for creating new tenant application.
345
+ * @param {CreateTenantPayload} createTenantPayload
346
+ * @return {Observable<CreateTenantResponse>}
347
+ * @memberof TenantApplicationsService
348
+ */
349
+ createTenant(createTenantPayload) {
350
+ return this.httpService
351
+ .postData(`${this.apiBaseUrl}/configurations/app/createTenant`, createTenantPayload)
352
+ .pipe(map((response) => {
353
+ return response;
354
+ }), catchError((error) => {
355
+ throw error;
356
+ }));
357
+ }
358
+ /**
359
+ * Constructs the checkbox options from features list from server.
360
+ * @param {FeaturesList[]} features
361
+ * @returns {CheckboxOption[]}
362
+ */
363
+ getFeatureOptions(features) {
364
+ this.checkBoxOptions = [];
365
+ features?.forEach((feature) => {
366
+ this.checkBoxOptions?.push({
367
+ id: feature?.featureId,
368
+ name: feature?.featureName,
369
+ checked: feature?.isDefault,
370
+ disabled: feature?.isDefault,
371
+ });
372
+ });
373
+ return this.checkBoxOptions;
374
+ }
375
+ /**
376
+ * Constructs the radio options from application types from server.
377
+ * @param {AppTypeConfig[]} appTypeOptions
378
+ * @returns {RadioOption[]}
379
+ */
380
+ getApplicationTypeOptions(appTypeOptions) {
381
+ this.radioOptions = [];
382
+ appTypeOptions?.forEach((appType) => {
383
+ this.radioOptions?.push({
384
+ id: appType?.configFieldId,
385
+ label: appType?.configFieldValue?.type,
386
+ });
387
+ });
388
+ return this.radioOptions;
389
+ }
390
+ /**
391
+ * Constructs the selected features id's.
392
+ * @param {CheckboxOption[]} featureOptions
393
+ * @returns {FeatureId[]}
394
+ */
395
+ getFeatureIds(featureOptions) {
396
+ const featureIds = [];
397
+ featureOptions?.forEach((featureOption) => {
398
+ if (featureOption?.checked) {
399
+ featureIds.push({
400
+ featureId: featureOption.id,
401
+ });
402
+ }
403
+ });
404
+ return featureIds;
405
+ }
406
+ /**
407
+ * Sets the newly created tenant information.
408
+ * @param {NewTenantInfo} newTenantInfo
409
+ */
410
+ setNewTenantInfo(newTenantInfo) {
411
+ this.newTenantInfo = newTenantInfo;
412
+ }
413
+ /**
414
+ * Returns the newly created tenant information.
415
+ */
416
+ get getNewTenantInfo() {
417
+ return this.newTenantInfo;
418
+ }
419
+ /**
420
+ * Sets tenant function type.
421
+ * @param {TenantFunctionType} tenantFunctionType -tenant function type.
422
+ */
423
+ setTenantFunctionType(tenantFunctionType) {
424
+ this.tenantFunctionType = tenantFunctionType;
425
+ }
426
+ /**
427
+ * Returns tenant function type.
428
+ * @return {TenantFunctionType} -tenant function type.
429
+ */
430
+ getTenantFunctionType() {
431
+ return this.tenantFunctionType;
432
+ }
433
+ /**
434
+ * Stores the newly created role information.
435
+ * @param {RoleInfo} newlyCreatedRole -create role information.
436
+ */
437
+ setNewlyCreatedRoleInfo(newlyCreatedRole) {
438
+ this.newlyCreatedRole = newlyCreatedRole;
439
+ }
440
+ /**
441
+ * Returns the newly created role information.
442
+ * @return {RoleInfo} -create role information.
443
+ */
444
+ getNewlyCreatedRoleInfo() {
445
+ return this.newlyCreatedRole;
446
+ }
447
+ /**
448
+ * Stores the newly created group type information.
449
+ * @param {CreatedOrModifiedGroupTypeInfo} newlyCreatedGroupType
450
+ * @memberof TenantApplicationsService
451
+ */
452
+ setNewlyCreatedGroupTypeInfo(newlyCreatedGroupType) {
453
+ this.newlyCreatedGroupType = newlyCreatedGroupType;
454
+ }
455
+ /**
456
+ * Returns the newly created group type information.
457
+ * @return {*} {CreatedOrModifiedGroupTypeInfo}
458
+ * @memberof TenantApplicationsService
459
+ */
460
+ getNewlyCreatedGroupTypeInfo() {
461
+ return this.newlyCreatedGroupType;
462
+ }
463
+ /**
464
+ * Posts the edited tenant application form data to server using HttpService for updating the tenant information.
465
+ * @param {CreateTenantPayload} editTenantPayload
466
+ * @return {Observable<CreateTenantResponse>}
467
+ * @memberof TenantApplicationsService
468
+ */
469
+ editTenant(editTenantPayload) {
470
+ return this.httpService
471
+ .putData(`${this.apiBaseUrl}/configurations/app/editTenant`, editTenantPayload)
472
+ .pipe(map((response) => {
473
+ return response;
474
+ }), catchError((error) => {
475
+ throw error;
476
+ }));
477
+ }
478
+ /**
479
+ * Sends update request to the server to update the tenant application status to active/inactive using HttpService and returns the success or failure response.
480
+ * @param {UpdateTenantStatusRequestPayload} updateTenantStatusPayload
481
+ * @return {Observable<UpdateTenantStatusResponse>}
482
+ * @memberof TenantApplicationsService
483
+ */
484
+ updateTenantStatus(updateTenantStatusPayload) {
485
+ return this.httpService
486
+ .putData(`${this.apiBaseUrl}/configurations/app/updateStatus`, updateTenantStatusPayload)
487
+ .pipe(map((response) => {
488
+ return response;
489
+ }), catchError((error) => {
490
+ throw error;
491
+ }));
492
+ }
493
+ /**
494
+ * It generates Feature list from checkbox options generated in form array.
495
+ * @param {CheckboxOption[]} features
496
+ * @return {Features[]}
497
+ * @memberof TenantApplicationsService
498
+ */
499
+ getFeaturesList(features) {
500
+ this.featureList = [];
501
+ features?.forEach((feature) => {
502
+ if (feature.checked)
503
+ this.featureList?.push({
504
+ featureId: feature?.id,
505
+ featureName: feature?.name,
506
+ isDefault: feature?.checked,
507
+ });
508
+ });
509
+ return this.featureList;
510
+ }
511
+ /**
512
+ * Gets roster type from server using HttpService.
513
+ * @return {*} {Observable<GetRosterTypeOrSettingsResponse>}
514
+ * @memberof TenantApplicationsService
515
+ */
516
+ getRosterType() {
517
+ return this.httpService
518
+ .getData(`${this.apiBaseUrl}/configurations/lookup/RosterType`)
519
+ .pipe(map((response) => {
520
+ return response;
521
+ }), catchError((error) => {
522
+ throw error;
523
+ }));
524
+ }
525
+ /**
526
+ * Gets group type settings from server using HttpService.
527
+ * @return {*} {Observable<GetRosterTypeOrSettingsResponse>}
528
+ * @memberof TenantApplicationsService
529
+ */
530
+ getGroupTypeSettings() {
531
+ return this.httpService
532
+ .getData(`${this.apiBaseUrl}/configurations/lookup/GT_Settings`)
533
+ .pipe(map((response) => {
534
+ return response;
535
+ }), catchError((error) => {
536
+ throw error;
537
+ }));
538
+ }
539
+ /**
540
+ * Posts the group type details to server using HttpService to create new group type.
541
+ * @param {CreateGroupTypeRequestPayload} createGroupTypePayload
542
+ * @return {*} {Observable<CreateGroupTypeResponse>}
543
+ * @memberof TenantApplicationsService
544
+ */
545
+ createGroupType(createGroupTypePayload) {
546
+ return this.httpService
547
+ .postData(`${this.apiBaseUrl}/configurations/config/groupType`, createGroupTypePayload)
548
+ .pipe(map((response) => {
549
+ return response;
550
+ }), catchError((error) => {
551
+ throw error;
552
+ }));
553
+ }
554
+ /**
555
+ * Returns sorted role list data.
556
+ * @param {Role[]} roleList
557
+ * @return {Role[]}
558
+ * @memberof TenantApplicationsService
559
+ */
560
+ sortRolesByRoleType(roleList) {
561
+ return roleList.sort((a, b) => a?.viewOrder - b?.viewOrder);
562
+ }
563
+ /**
564
+ * Posts the role details to server using HttpService for deleting the role.
565
+ * @param {DeleteRoleRequestPayload} deleteRoleRequestPayload
566
+ * @return {Observable<DeleteRoleResponse>}
567
+ * @memberof TenantApplicationsService
568
+ */
569
+ deleteRole(deleteRolePayload) {
570
+ return this.httpService
571
+ .putData(`${this.apiBaseUrl}/groups/role/deleteRole`, deleteRolePayload)
572
+ .pipe(map((response) => {
573
+ return response;
574
+ }), catchError((error) => {
575
+ throw error;
576
+ }));
577
+ }
578
+ /**
579
+ * Gets group types from server using HttpService.
580
+ * @param {string} appId
581
+ * @return {Observable<ViewGroupTypeResponse>}
582
+ * @memberof TenantApplicationsService
583
+ */
584
+ getGroupTypes(appId) {
585
+ return this.httpService
586
+ .getData(`${this.apiBaseUrl}/configurations/config/appGroupTypeDetails/${appId}`)
587
+ .pipe(map((response) => {
588
+ return response;
589
+ }), catchError((error) => {
590
+ throw error;
591
+ }));
592
+ }
593
+ /**
594
+ * Sets group type details.
595
+ * @param {ViewGroupTypeResponse} groupTypes
596
+ * @memberof TenantApplicationsService
597
+ */
598
+ setGroupTypeDetails(groupTypes) {
599
+ this.groupTypes = groupTypes;
600
+ }
601
+ /**
602
+ * Returns group type details.
603
+ * @return {ViewGroupTypeResponse}
604
+ * @memberof TenantApplicationsService
605
+ */
606
+ getGroupTypeDetails() {
607
+ return this.groupTypes;
608
+ }
609
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, deps: [{ token: i1.HttpService }, { token: i2.TenantPermissionsService }, { token: i3.TenantPermissionsMapService }], target: i0.ɵɵFactoryTarget.Injectable }); }
610
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, providedIn: 'root' }); }
611
+ }
612
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, decorators: [{
613
+ type: Injectable,
614
+ args: [{
615
+ providedIn: 'root',
616
+ }]
617
+ }], ctorParameters: function () { return [{ type: i1.HttpService }, { type: i2.TenantPermissionsService }, { type: i3.TenantPermissionsMapService }]; } });
618
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWFwcGxpY2F0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVuYW50cy9zcmMvbGliL3NlcnZpY2VzL3RlbmFudC1hcHBsaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEtBQUssV0FBVyxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWtFeEQsTUFBTSxPQUFPLHlCQUF5QjtJQXFCcEM7SUFDRSwwQ0FBMEM7SUFDbEMsV0FBd0I7SUFDaEMsMENBQTBDO0lBQ2xDLHdCQUFrRDtJQUMxRCwwQ0FBMEM7SUFDbEMsMkJBQXdELENBQUMsNkNBQTZDOztRQUp0RyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUV4Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBRWxELGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUExQmxFLGdCQUFXLEdBQUcsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFLL0Msc0JBQWlCLEdBQUcsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUM7UUFHdEQsaUJBQVksR0FBa0IsRUFBRSxDQUFDO1FBQ2pDLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUN2QyxnQkFBVyxHQUFrQixFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBZSxFQUFFLENBQUM7UUFDN0Isb0JBQWUsR0FBcUIsRUFBRSxDQUFDO1FBT3ZDLCtCQUEwQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFRakQsQ0FBQztJQUNKLFlBQVksQ0FBQyxVQUFrQixFQUFFLGNBQWdDO1FBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElB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Ozs7T0FLRztJQUNILFVBQVUsQ0FDUixpQkFBMkM7UUFFM0MsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNwQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSx5QkFBeUIsRUFBRSxpQkFBaUIsQ0FBQzthQUN2RSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsS0FBYTtRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ3BCLE9BQU8sQ0FDTixHQUFHLElBQUksQ0FBQyxVQUFVLDhDQUE4QyxLQUFLLEVBQUUsQ0FDeEU7YUFDQSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFVBQWlDO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOytHQXh0QlUseUJBQXlCO21IQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7NEZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2UgfSBmcm9tICdAaWVlZXNhLW5wbS91dGlsaXR5JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIHNjcmVlblRleHRzIGZyb20gJy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcbmltcG9ydCB7IEdldFRlbmFudHNQYXlsb2FkIH0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLWNvbHVtbi1zY2hlbWEtdmlldy10ZW5hbnQtbGlzdC5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgVGVuYW50c1Blcm1pc3Npb25zLFxyXG4gIFVzZXJQZXJtaXNzaW9uLFxyXG59IGZyb20gJy4uL21vZGVscy90ZW5hbnRzLXBlcm1pc3Npb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9wZXJtaXNzaW9uLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBUZW5hbnRQZXJtaXNzaW9uc01hcFNlcnZpY2UgfSBmcm9tICcuL3RlbmFudC1wZXJtaXNzaW9ucy1tYXAuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ3JlYXRlVGVuYW50UmVxdWVzdFBheWxvYWQsXHJcbiAgQ3JlYXRlVGVuYW50UmVzcG9uc2UsXHJcbiAgR2V0VGVuYW50c1Jlc3BvbnNlLFxyXG4gIE5ld1RlbmFudEluZm8sXHJcbiAgVGVuYW50QmFzaWNJbmZvLFxyXG4gIFRlbmFudERldGFpbHNSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvdGVuYW50Lm1vZGVsJztcclxuaW1wb3J0IHsgUmFkaW9PcHRpb24gfSBmcm9tICdAaWVlZXNhLW5wbS9wcmVzZW50YXRpb24nO1xyXG5pbXBvcnQgeyBDaGVja2JveE9wdGlvbiB9IGZyb20gJ0BpZWVlc2EtbnBtL21vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgRmVhdHVyZUlkLFxyXG4gIEZlYXR1cmVzLFxyXG4gIEdldEZlYXR1cmVzUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2ZlYXR1cmVzLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBBcHBUeXBlQ29uZmlnLFxyXG4gIEdldEFwcFR5cGVzUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2FwcC10eXBlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFRlbmFudFBlcm1pc3Npb25zU2VydmljZSB9IGZyb20gJy4vdGVuYW50LXBlcm1pc3Npb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUZW5hbnRGdW5jdGlvblR5cGUgfSBmcm9tICcuLi9tb2RlbHMvdGVuYW50LWZ1bmN0aW9uLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdldFJvbGVzQW5kUGVybWlzc2lvbnNQYXlsb2FkLFxyXG4gIEdldFJvbGVzQW5kUGVybWlzc2lvbnNSZXNwb25zZSxcclxuICBHZXRSb2xlc1Jlc3BvbnNlLFxyXG4gIFJvbGVJbmZvLFxyXG4gIERlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZCxcclxuICBEZWxldGVSb2xlUmVzcG9uc2UsXHJcbiAgUm9sZSxcclxuICBHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlLFxyXG4gIFJvbGVQZXJtaXNzaW9uTWFwcGluZ1JlcXVlc3RQYXlsb2FkLFxyXG4gIFJvbGVQZXJtaXNzaW9uTWFwcGluZ1Jlc3BvbnNlLFxyXG4gIFJvbGVzQW5kUGVybWlzc2lvbnNSZXF1ZXN0UGF5bG9hZCxcclxuICBSb2xlc0FuZFBlcm1pc3Npb25zUmVzcG9uc2UsXHJcbiAgUm9sZURldGFpbHMsXHJcbiAgQ3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkLFxyXG4gIENyZWF0ZU1vZGlmeVJvbGVSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvcm9sZXMtYW5kLXBlcm1pc3Npb25zLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBVcGRhdGVUZW5hbnRTdGF0dXNSZXF1ZXN0UGF5bG9hZCxcclxuICBVcGRhdGVUZW5hbnRTdGF0dXNSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvdXBkYXRlLXRlbmFudC1zdGF0dXMubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdldFJvbGVUeXBlc1BheWxvYWQsXHJcbiAgUm9sZVR5cGVDb25maWd1cmF0aW9uLFxyXG4gIFJvbGVUeXBlT3B0aW9uLFxyXG4gIFJvbGVUeXBlUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3JvbGUtdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IFZpZXdHcm91cFR5cGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy92aWV3LXRlbmFudC1ncm91cC10eXBlcy5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgQ3JlYXRlR3JvdXBUeXBlUmVxdWVzdFBheWxvYWQsXHJcbiAgQ3JlYXRlR3JvdXBUeXBlUmVzcG9uc2UsXHJcbiAgQ3JlYXRlZE9yTW9kaWZpZWRHcm91cFR5cGVJbmZvLFxyXG4gIEdldFJvc3RlclR5cGVPclNldHRpbmdzUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL2NyZWF0ZS1ncm91cC10eXBlLm1vZGVsJztcclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2Uge1xyXG4gIHRlbmFudHNUZXh0ID0gc2NyZWVuVGV4dHM/LnZpZXdUZW5hbnRzPy5lcnJvcnM7XHJcbiAgYXBpQmFzZVVybCE6IHN0cmluZztcclxuICB1c2VyUGVybWlzc2lvbiE6IFVzZXJQZXJtaXNzaW9uW107XHJcbiAgc2VsZWN0ZWRUZW5hbnRJbmZvITogVGVuYW50QmFzaWNJbmZvIHwgdW5kZWZpbmVkO1xyXG4gIHVzZXJUZW5hbnRzUGVybWlzc2lvbnMhOiBUZW5hbnRzUGVybWlzc2lvbnNbXTtcclxuICBjcmVhdGVUZW5hbnRzVGV4dCA9IHNjcmVlblRleHRzPy5jcmVhdGVUZW5hbnQ/LmVycm9ycztcclxuICBuZXdUZW5hbnRJbmZvITogTmV3VGVuYW50SW5mbztcclxuICB0ZW5hbnRGdW5jdGlvblR5cGUhOiBUZW5hbnRGdW5jdGlvblR5cGU7XHJcbiAgcmFkaW9PcHRpb25zOiBSYWRpb09wdGlvbltdID0gW107XHJcbiAgY2hlY2tCb3hPcHRpb25zOiBDaGVja2JveE9wdGlvbltdID0gW107XHJcbiAgYXBwVHlwZUluZm86IFJhZGlvT3B0aW9uW10gPSBbXTtcclxuICBmZWF0dXJlTGlzdDogRmVhdHVyZXNbXSA9IFtdO1xyXG4gIHJvbGVUeXBlT3B0aW9uczogUm9sZVR5cGVPcHRpb25bXSA9IFtdO1xyXG4gIG5ld2x5Q3JlYXRlZFJvbGUhOiBSb2xlSW5mbztcclxuICByb2xlVHlwZU9wdGlvbiE6IFJvbGVUeXBlT3B0aW9uW107XHJcbiAgc2VsZWN0ZWRSb2xlSW5mbyE6IFJvbGVEZXRhaWxzO1xyXG4gIHJvbGVzITogUm9sZVtdO1xyXG4gIGdyb3VwVHlwZXMhOiBWaWV3R3JvdXBUeXBlUmVzcG9uc2U7XHJcbiAgbmV3bHlDcmVhdGVkR3JvdXBUeXBlITogQ3JlYXRlZE9yTW9kaWZpZWRHcm91cFR5cGVJbmZvO1xyXG4gIGlzR3JvdXBUeXBlQWRkZWRPck1vZGlmaWVkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBodHRwU2VydmljZTogSHR0cFNlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgdGVuYW50UGVybWlzc2lvbnNTZXJ2aWNlOiBUZW5hbnRQZXJtaXNzaW9uc1NlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgdGVuYW50UGVybWlzc2lvbnNNYXBTZXJ2aWNlOiBUZW5hbnRQZXJtaXNzaW9uc01hcFNlcnZpY2UgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgKSB7fVxyXG4gIHNldEFwcENvbmZpZyhhcGlCYXNlVXJsOiBzdHJpbmcsIHVzZXJQZXJtaXNzaW9uOiBVc2VyUGVybWlzc2lvbltdKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwaUJhc2VVcmwgPSBhcGlCYXNlVXJsO1xyXG4gICAgdGhpcy51c2VyUGVybWlzc2lvbiA9IHVzZXJQZXJtaXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0ZW5hbnQgZGV0YWlscyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8VGVuYW50RGV0YWlsc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFRlbmFudERldGFpbHMoYXBwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8VGVuYW50RGV0YWlsc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2FwcC9kZXRhaWxzLyR7YXBwSWR9YClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB1c2VyIHRlbmFudHMgcGVybWlzc2lvbnNcclxuICAgKiBAcGFyYW0ge1RlbmFudHNQZXJtaXNzaW9uc1tdfSBUZW5hbnRzUGVybWlzc2lvbnNcclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFVzZXJUZW5hbnRzUGVybWlzc2lvbnModXNlclRlbmFudHNQZXJtaXNzaW9uczogVGVuYW50c1Blcm1pc3Npb25zW10pIHtcclxuICAgIHRoaXMudXNlclRlbmFudHNQZXJtaXNzaW9ucyA9IHVzZXJUZW5hbnRzUGVybWlzc2lvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHVzZXIgdGVuYW50cyBwZXJtaXNzaW9uc1xyXG4gICAqIEByZXR1cm4ge1RlbmFudHNQZXJtaXNzaW9uc1tdfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0VXNlclRlbmFudHNQZXJtaXNzaW9ucygpOiBUZW5hbnRzUGVybWlzc2lvbnNbXSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyVGVuYW50c1Blcm1pc3Npb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdXNlciB0ZW5hbnRzIGluZm9ybWF0aW9uXHJcbiAgICogQHBhcmFtIHtUZW5hbnRCYXNpY0luZm99IHRlbmFudEluZm9cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFNlbGVjdGVkVGVuYW50SW5mb3JtYXRpb24odGVuYW50SW5mbzogVGVuYW50QmFzaWNJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGVuYW50SW5mbyA9IHRlbmFudEluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRlbmFudHMgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtUZW5hbnRCYXNpY0luZm99XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRTZWxlY3RlZFRlbmFudEluZm9ybWF0aW9uKCk6IFRlbmFudEJhc2ljSW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRlbmFudEluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHJvbGVzIGluZm9ybWF0aW9uc1xyXG4gICAqIEBwYXJhbSB7Um9sZX0gcm9sZXNcclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFJvbGVzSW5mbyhyb2xlczogUm9sZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvbGVzID0gcm9sZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHJvbGVzIGluZm9ybWF0aW9uXHJcbiAgICogQHJldHVybiB7Um9sZX1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJvbGVzSW5mbygpOiBSb2xlW10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMucm9sZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHNlbGVjdGVkIHJvbGUgaW5mb3JtYXRpb24uXHJcbiAgICogQHBhcmFtIHtSb2xlRGV0YWlsc30gcm9sZUluZm9cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFNlbGVjdGVkUm9sZUluZm9ybWF0aW9uKHJvbGVJbmZvOiBSb2xlRGV0YWlscyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZFJvbGVJbmZvID0gcm9sZUluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHJvbGUgaW5mb3JtYXRpb24uXHJcbiAgICogQHJldHVybiB7Um9sZURldGFpbHN9XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRTZWxlY3RlZFJvbGVJbmZvcm1hdGlvbigpOiBSb2xlRGV0YWlscyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvbGVJbmZvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB0ZW5hbnQgcm9sZSB0eXBlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtSb2xlVHlwZU9wdGlvbn0gcm9sZVR5cGVPcHRpb25zXHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXRSb2xlVHlwZU9wdGlvbihyb2xlVHlwZU9wdGlvbnM6IFJvbGVUeXBlT3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMucm9sZVR5cGVPcHRpb24gPSByb2xlVHlwZU9wdGlvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRlbmFudCByb2xlIHR5cGUgb3B0aW9ucy5cclxuICAgKiBAcmV0dXJuIHtSb2xlVHlwZU9wdGlvbn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJvbGVUeXBlT3B0aW9uKCk6IFJvbGVUeXBlT3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMucm9sZVR5cGVPcHRpb247XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGxpc3Qgb2YgYXBwbGljYXRpb24gdHlwZSBpbmZvcm1hdGlvblxyXG4gICAqIEBwYXJhbSB7UmFkaW9PcHRpb259IGFwcFR5cGVJbmZvXHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXRBcHBsaWNhdGlvblR5cGUoYXBwVHlwZUluZm86IFJhZGlvT3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwVHlwZUluZm8gPSBhcHBUeXBlSW5mbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiB0eXBlIGluZm9ybWF0aW9uXHJcbiAgICogQHJldHVybiB7UmFkaW9PcHRpb259XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRBcHBsaWNhdGlvblR5cGUoKTogUmFkaW9PcHRpb25bXSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBUeXBlSW5mbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIHBlcm1pc3Npb25zXHJcbiAgICogQHBhcmFtIHVzZXJzUGVybWlzc2lvbnNcclxuICAgKiBAcmV0dXJucyBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGZpbHRlclBlcm1pc3Npb24odXNlcnNQZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25bXSk6IFRlbmFudHNQZXJtaXNzaW9uc1tdIHtcclxuICAgIHJldHVybiB0aGlzLnRlbmFudFBlcm1pc3Npb25zU2VydmljZT8uZmlsdGVyVGVuYW50c1Blcm1pc3Npb25zKFxyXG4gICAgICB1c2Vyc1Blcm1pc3Npb25zLFxyXG4gICAgICB0aGlzLnRlbmFudFBlcm1pc3Npb25zTWFwU2VydmljZT8uZ2V0R2xvYmFsVGVuYW50c1Blcm1pc3Npb25zKClcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRpbmcgYWNjZXNzIGZvciB0ZW5hbnRzXHJcbiAgICogQHBhcmFtIHBlcm1pc3Npb25UeXBlIFBlcm1pc3Npb24gVHlwZSB0byB2YWxpZGF0ZSBwZXJtaXNzaW9uXHJcbiAgICogQHBhcmFtIG1hcHBlZFVzZXJQZXJtaXNzaW9ucyBQZXJtaXNzaW9uIHdoaWNoIGFyZSBtYXBwZWQgd2l0aCB0ZW5hbnRzXHJcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWRcclxuICAgKi9cclxuICB2YWxpZGF0ZUFjY2VzcyhcclxuICAgIHBlcm1pc3Npb25UeXBlOiBQZXJtaXNzaW9uVHlwZSxcclxuICAgIHBlcm1pc3Npb25zOiBUZW5hbnRzUGVybWlzc2lvbnNbXVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVuYW50UGVybWlzc2lvbnNTZXJ2aWNlLnZhbGlkYXRlQWNjZXNzUGVybWlzc2lvbihcclxuICAgICAgcGVybWlzc2lvblR5cGUsXHJcbiAgICAgIHBlcm1pc3Npb25zXHJcbiAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSB0ZW5hbnRzLlxyXG4gICAqIEBwYXJhbSB7R2V0VGVuYW50c1BheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdldFRlbmFudHNSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRUZW5hbnRzTGlzdChwYXlsb2FkOiBHZXRUZW5hbnRzUGF5bG9hZCk6IE9ic2VydmFibGU8R2V0VGVuYW50c1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9hcHAvY29uZmlnYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIGxpc3Qgb2YgZmVhdHVyZXMgZnJvbSBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxHZXRGZWF0dXJlc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEZlYXR1cmVzKCk6IE9ic2VydmFibGU8R2V0RmVhdHVyZXNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9hcHAvZmVhdHVyZXNgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGlzdCBvZiByb2xlcyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwSWRcclxuICAgKiBAcmV0dXJuIHsqfSAge09ic2VydmFibGU8R2V0Um9sZXNSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRSb2xlcyhhcHBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxHZXRSb2xlc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlLyR7YXBwSWR9YClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHBlcm1pc3Npb25zIGJhc2VkIG9uIHRoZSBhcHBJZCBhbmQgcmV0dXJuIHRoZSBzdWNjZXNzIG9yIGVycm9yIHJlc3BvbnNlIGFzIE9ic2VydmFibGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcElkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFBlcm1pc3Npb25zKGFwcElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEdldFBlcm1pc3Npb25zUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3Blcm1pc3Npb25zLyR7YXBwSWR9YClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHJvbGVzIG9yIHBlcm1pc3Npb25zIGJhc2VkIG9uIHRoZSByb2xlSWQgb3IgcGVybWlzc2lvbklkIGluIHRoZSBwYXlsb2FkIGFuZCByZXR1cm4gdGhlIHN1Y2Nlc3Mgb3IgZXJyb3IgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZS5cclxuICAgKiBAcGFyYW0ge1JvbGVQZXJtaXNzaW9uTWFwcGluZ1JlcXVlc3RQYXlsb2FkfSBwYXlsb2FkXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Um9sZVBlcm1pc3Npb25NYXBwaW5nUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9sZVBlcm1pc3Npb25NYXBwaW5nKFxyXG4gICAgcGF5bG9hZDogUm9sZVBlcm1pc3Npb25NYXBwaW5nUmVxdWVzdFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPFJvbGVQZXJtaXNzaW9uTWFwcGluZ1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvdXNlcnMvcm9sZVBlcm1pc3Npb25NYXBwaW5nYCxcclxuICAgICAgICBwYXlsb2FkXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTdWJtaXQgdGhlIG5ldyBtYXBwaW5ncyBvZiByb2xlcyB0byBwZXJtaXNzaW9ucyB0byB0aGUgc2VydmVyLlxyXG4gICAqIEBwYXJhbSB7Um9sZXNBbmRQZXJtaXNzaW9uc1JlcXVlc3RQYXlsb2FkfSBwYXlsb2FkXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNhdmVSb2xlUGVybWlzc2lvbk1hcHBpbmcoXHJcbiAgICBwYXlsb2FkOiBSb2xlc0FuZFBlcm1pc3Npb25zUmVxdWVzdFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPFJvbGVzQW5kUGVybWlzc2lvbnNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3VzZXJzL3JvbGVQZXJtaXNzaW9uYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIGxpc3Qgb2Ygcm9sZXMgYW5kIHBlcm1pc3Npb25zIG1hcHBpbmdzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZFxyXG4gICAqIEBwYXJhbSB7R2V0Um9sZXNBbmRQZXJtaXNzaW9uc1BheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJuIHsqfSAge09ic2VydmFibGU8R2V0Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJvbGVzQW5kUGVybWlzc2lvbnNNYXBwaW5ncyhcclxuICAgIGFwcElkOiBzdHJpbmcsXHJcbiAgICBwYXlsb2FkOiBHZXRSb2xlc0FuZFBlcm1pc3Npb25zUGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8R2V0Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvcm9sZUJhc2VkUGVybWlzc2lvbnMvJHthcHBJZH1gLFxyXG4gICAgICAgIHBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGlzdCBvZiBhcHBsaWNhdGlvbiB0eXBlcyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdldEFwcFR5cGVzUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0QXBwbGljYXRpb25UeXBlcygpOiBPYnNlcnZhYmxlPEdldEFwcFR5cGVzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvY29uZmlnL2FwcF90eXBlYClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3N0cyBjcmVhdGUgcm9sZSBmb3JtIGRhdGEgdG8gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlIHRvIGNyZWF0ZSBhIG5ldyByb2xlLlxyXG4gICAqIEBwYXJhbSB7Q3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkfSBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q3JlYXRlTW9kaWZ5Um9sZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGNyZWF0ZVJvbGUoXHJcbiAgICBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZDogQ3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVNb2RpZnlSb2xlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlYCwgY3JlYXRlTW9kaWZ5Um9sZVBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUG9zdHMgdGhlIGVkaXRlZCByb2xlIGZvcm0gZGF0YSB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UgZm9yIHVwZGF0aW5nIHRoZSByb2xlIGluZm9ybWF0aW9uLlxyXG4gICAqIEBwYXJhbSB7Q3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkfSBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q3JlYXRlTW9kaWZ5Um9sZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGVkaXRSb2xlKFxyXG4gICAgY3JlYXRlTW9kaWZ5Um9sZVBheWxvYWQ6IENyZWF0ZU1vZGlmeVJvbGVSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8Q3JlYXRlTW9kaWZ5Um9sZVJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlYCwgY3JlYXRlTW9kaWZ5Um9sZVBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGlzdCBvZiByb2xlIHR5cGVzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7R2V0Um9sZVR5cGVzUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Um9sZVR5cGVSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRSb2xlVHlwZXMocGF5bG9hZDogR2V0Um9sZVR5cGVzUGF5bG9hZCk6IE9ic2VydmFibGU8Um9sZVR5cGVSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvY29uZmlnL2NvbmZpZ0ZpZWxkYCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSBzZWxlY3QvZHJvcGRvd24gb3B0aW9ucyBmcm9tIHRoZSByb2xlIHR5cGVzIHJlY2VpdmVkIGZyb20gc2VydmVyLlxyXG4gICAqIEBwYXJhbSB7Um9sZVR5cGVDb25maWd1cmF0aW9uW119IHJvbGVUeXBlUmVzcG9uc2VcclxuICAgKiBAcmV0dXJuIHtSb2xlVHlwZU9wdGlvbltdfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9sZVR5cGVPcHRpb25zKFxyXG4gICAgcm9sZVR5cGVSZXNwb25zZTogUm9sZVR5cGVDb25maWd1cmF0aW9uW11cclxuICApOiBSb2xlVHlwZU9wdGlvbltdIHtcclxuICAgIHRoaXMucm9sZVR5cGVPcHRpb25zID0gW107XHJcbiAgICByb2xlVHlwZVJlc3BvbnNlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgdGhpcy5yb2xlVHlwZU9wdGlvbnM/LnB1c2goe1xyXG4gICAgICAgIGlkOiBpdGVtPy5jb25maWdGaWVsZElkLFxyXG4gICAgICAgIG5hbWU6IGl0ZW0/LmNvbmZpZ0ZpZWxkVmFsdWU/LnJvbGVUeXBlTmFtZSxcclxuICAgICAgICBvcmRlcjogaXRlbT8uY29uZmlnRmllbGRWYWx1ZT8udmlld09yZGVyLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb2xlVHlwZU9wdGlvbnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xyXG4gICAgcmV0dXJuIHRoaXMucm9sZVR5cGVPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9zdHMgdGVuYW50IGFwcGxpY2F0aW9uIGZvcm0gZGF0YSB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UgZm9yIGNyZWF0aW5nIG5ldyB0ZW5hbnQgYXBwbGljYXRpb24uXHJcbiAgICogQHBhcmFtIHtDcmVhdGVUZW5hbnRQYXlsb2FkfSBjcmVhdGVUZW5hbnRQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDcmVhdGVUZW5hbnRSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBjcmVhdGVUZW5hbnQoXHJcbiAgICBjcmVhdGVUZW5hbnRQYXlsb2FkOiBDcmVhdGVUZW5hbnRSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8Q3JlYXRlVGVuYW50UmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2FwcC9jcmVhdGVUZW5hbnRgLFxyXG4gICAgICAgIGNyZWF0ZVRlbmFudFBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSBjaGVja2JveCBvcHRpb25zIGZyb20gZmVhdHVyZXMgbGlzdCBmcm9tIHNlcnZlci5cclxuICAgKiBAcGFyYW0ge0ZlYXR1cmVzTGlzdFtdfSBmZWF0dXJlc1xyXG4gICAqIEByZXR1cm5zIHtDaGVja2JveE9wdGlvbltdfVxyXG4gICAqL1xyXG4gIGdldEZlYXR1cmVPcHRpb25zKGZlYXR1cmVzOiBGZWF0dXJlc1tdKTogQ2hlY2tib3hPcHRpb25bXSB7XHJcbiAgICB0aGlzLmNoZWNrQm94T3B0aW9ucyA9IFtdO1xyXG4gICAgZmVhdHVyZXM/LmZvckVhY2goKGZlYXR1cmU6IEZlYXR1cmVzKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hlY2tCb3hPcHRpb25zPy5wdXNoKHtcclxuICAgICAgICBpZDogZmVhdHVyZT8uZmVhdHVyZUlkLFxyXG4gICAgICAgIG5hbWU6IGZlYXR1cmU/LmZlYXR1cmVOYW1lLFxyXG4gICAgICAgIGNoZWNrZWQ6IGZlYXR1cmU/LmlzRGVmYXVsdCxcclxuICAgICAgICBkaXNhYmxlZDogZmVhdHVyZT8uaXNEZWZhdWx0LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuY2hlY2tCb3hPcHRpb25zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSByYWRpbyBvcHRpb25zIGZyb20gYXBwbGljYXRpb24gdHlwZXMgZnJvbSBzZXJ2ZXIuXHJcbiAgICogQHBhcmFtIHtBcHBUeXBlQ29uZmlnW119IGFwcFR5cGVPcHRpb25zXHJcbiAgICogQHJldHVybnMge1JhZGlvT3B0aW9uW119XHJcbiAgICovXHJcbiAgZ2V0QXBwbGljYXRpb25UeXBlT3B0aW9ucyhhcHBUeXBlT3B0aW9uczogQXBwVHlwZUNvbmZpZ1tdKTogUmFkaW9PcHRpb25bXSB7XHJcbiAgICB0aGlzLnJhZGlvT3B0aW9ucyA9IFtdO1xyXG4gICAgYXBwVHlwZU9wdGlvbnM/LmZvckVhY2goKGFwcFR5cGU6IEFwcFR5cGVDb25maWcpID0+IHtcclxuICAgICAgdGhpcy5yYWRpb09wdGlvbnM/LnB1c2goe1xyXG4gICAgICAgIGlkOiBhcHBUeXBlPy5jb25maWdGaWVsZElkLFxyXG4gICAgICAgIGxhYmVsOiBhcHBUeXBlPy5jb25maWdGaWVsZFZhbHVlPy50eXBlLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMucmFkaW9PcHRpb25zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSBzZWxlY3RlZCBmZWF0dXJlcyBpZCdzLlxyXG4gICAqIEBwYXJhbSB7Q2hlY2tib3hPcHRpb25bXX0gZmVhdHVyZU9wdGlvbnNcclxuICAgKiBAcmV0dXJucyB7RmVhdHVyZUlkW119XHJcbiAgICovXHJcbiAgZ2V0RmVhdHVyZUlkcyhmZWF0dXJlT3B0aW9uczogQ2hlY2tib3hPcHRpb25bXSk6IEZlYXR1cmVJZFtdIHtcclxuICAgIGNvbnN0IGZlYXR1cmVJZHM6IEZlYXR1cmVJZFtdID0gW107XHJcbiAgICBmZWF0dXJlT3B0aW9ucz8uZm9yRWFjaCgoZmVhdHVyZU9wdGlvbjogQ2hlY2tib3hPcHRpb24pID0+IHtcclxuICAgICAgaWYgKGZlYXR1cmVPcHRpb24/LmNoZWNrZWQpIHtcclxuICAgICAgICBmZWF0dXJlSWRzLnB1c2goe1xyXG4gICAgICAgICAgZmVhdHVyZUlkOiBmZWF0dXJlT3B0aW9uLmlkIGFzIHN0cmluZyxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZmVhdHVyZUlkcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgbmV3bHkgY3JlYXRlZCB0ZW5hbnQgaW5mb3JtYXRpb24uXHJcbiAgICogQHBhcmFtIHtOZXdUZW5hbnRJbmZvfSBuZXdUZW5hbnRJbmZvXHJcbiAgICovXHJcbiAgc2V0TmV3VGVuYW50SW5mbyhuZXdUZW5hbnRJbmZvOiBOZXdUZW5hbnRJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLm5ld1RlbmFudEluZm8gPSBuZXdUZW5hbnRJbmZvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIHRlbmFudCBpbmZvcm1hdGlvbi5cclxuICAgKi9cclxuICBnZXQgZ2V0TmV3VGVuYW50SW5mbygpOiBOZXdUZW5hbnRJbmZvIHtcclxuICAgIHJldHVybiB0aGlzLm5ld1RlbmFudEluZm87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRlbmFudCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqIEBwYXJhbSB7VGVuYW50RnVuY3Rpb25UeXBlfSB0ZW5hbnRGdW5jdGlvblR5cGUgLXRlbmFudCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqL1xyXG4gIHNldFRlbmFudEZ1bmN0aW9uVHlwZSh0ZW5hbnRGdW5jdGlvblR5cGU6IFRlbmFudEZ1bmN0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnRGdW5jdGlvblR5cGUgPSB0ZW5hbnRGdW5jdGlvblR5cGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRlbmFudCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqIEByZXR1cm4ge1RlbmFudEZ1bmN0aW9uVHlwZX0gLXRlbmFudCBmdW5jdGlvbiB0eXBlLlxyXG4gICAqL1xyXG4gIGdldFRlbmFudEZ1bmN0aW9uVHlwZSgpOiBUZW5hbnRGdW5jdGlvblR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMudGVuYW50RnVuY3Rpb25UeXBlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTdG9yZXMgdGhlIG5ld2x5IGNyZWF0ZWQgcm9sZSBpbmZvcm1hdGlvbi5cclxuICAgKiBAcGFyYW0ge1JvbGVJbmZvfSBuZXdseUNyZWF0ZWRSb2xlIC1jcmVhdGUgcm9sZSBpbmZvcm1hdGlvbi5cclxuICAgKi9cclxuICBzZXROZXdseUNyZWF0ZWRSb2xlSW5mbyhuZXdseUNyZWF0ZWRSb2xlOiBSb2xlSW5mbyk6IHZvaWQge1xyXG4gICAgdGhpcy5uZXdseUNyZWF0ZWRSb2xlID0gbmV3bHlDcmVhdGVkUm9sZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCByb2xlIGluZm9ybWF0aW9uLlxyXG4gICAqIEByZXR1cm4ge1JvbGVJbmZvfSAtY3JlYXRlIHJvbGUgaW5mb3JtYXRpb24uXHJcbiAgICovXHJcbiAgZ2V0TmV3bHlDcmVhdGVkUm9sZUluZm8oKTogUm9sZUluZm8ge1xyXG4gICAgcmV0dXJuIHRoaXMubmV3bHlDcmVhdGVkUm9sZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU3RvcmVzIHRoZSBuZXdseSBjcmVhdGVkIGdyb3VwIHR5cGUgaW5mb3JtYXRpb24uXHJcbiAgICogQHBhcmFtIHtDcmVhdGVkT3JNb2RpZmllZEdyb3VwVHlwZUluZm99IG5ld2x5Q3JlYXRlZEdyb3VwVHlwZVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0TmV3bHlDcmVhdGVkR3JvdXBUeXBlSW5mbyhuZXdseUNyZWF0ZWRHcm91cFR5cGU6IENyZWF0ZWRPck1vZGlmaWVkR3JvdXBUeXBlSW5mbyk6IHZvaWQge1xyXG4gICAgdGhpcy5uZXdseUNyZWF0ZWRHcm91cFR5cGUgPSBuZXdseUNyZWF0ZWRHcm91cFR5cGU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgZ3JvdXAgdHlwZSBpbmZvcm1hdGlvbi5cclxuICAgKiBAcmV0dXJuIHsqfSAge0NyZWF0ZWRPck1vZGlmaWVkR3JvdXBUeXBlSW5mb31cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldE5ld2x5Q3JlYXRlZEdyb3VwVHlwZUluZm8oKTogQ3JlYXRlZE9yTW9kaWZpZWRHcm91cFR5cGVJbmZvIHtcclxuICAgIHJldHVybiB0aGlzLm5ld2x5Q3JlYXRlZEdyb3VwVHlwZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUG9zdHMgdGhlIGVkaXRlZCB0ZW5hbnQgYXBwbGljYXRpb24gZm9ybSBkYXRhIHRvIHNlcnZlciB1c2luZyBIdHRwU2VydmljZSBmb3IgdXBkYXRpbmcgdGhlIHRlbmFudCBpbmZvcm1hdGlvbi5cclxuICAgKiBAcGFyYW0ge0NyZWF0ZVRlbmFudFBheWxvYWR9IGVkaXRUZW5hbnRQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDcmVhdGVUZW5hbnRSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBlZGl0VGVuYW50KFxyXG4gICAgZWRpdFRlbmFudFBheWxvYWQ6IENyZWF0ZVRlbmFudFJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVUZW5hbnRSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnB1dERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9hcHAvZWRpdFRlbmFudGAsXHJcbiAgICAgICAgZWRpdFRlbmFudFBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIHVwZGF0ZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdG8gdXBkYXRlIHRoZSB0ZW5hbnQgYXBwbGljYXRpb24gc3RhdHVzIHRvIGFjdGl2ZS9pbmFjdGl2ZSB1c2luZyBIdHRwU2VydmljZSBhbmQgcmV0dXJucyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIHJlc3BvbnNlLlxyXG4gICAqIEBwYXJhbSB7VXBkYXRlVGVuYW50U3RhdHVzUmVxdWVzdFBheWxvYWR9IHVwZGF0ZVRlbmFudFN0YXR1c1BheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFVwZGF0ZVRlbmFudFN0YXR1c1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHVwZGF0ZVRlbmFudFN0YXR1cyhcclxuICAgIHVwZGF0ZVRlbmFudFN0YXR1c1BheWxvYWQ6IFVwZGF0ZVRlbmFudFN0YXR1c1JlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxVcGRhdGVUZW5hbnRTdGF0dXNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnB1dERhdGEoXHJcbiAgICAgICAgYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9hcHAvdXBkYXRlU3RhdHVzYCxcclxuICAgICAgICB1cGRhdGVUZW5hbnRTdGF0dXNQYXlsb2FkXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBJdCBnZW5lcmF0ZXMgRmVhdHVyZSBsaXN0IGZyb20gY2hlY2tib3ggb3B0aW9ucyBnZW5lcmF0ZWQgaW4gZm9ybSBhcnJheS5cclxuICAgKiBAcGFyYW0ge0NoZWNrYm94T3B0aW9uW119IGZlYXR1cmVzXHJcbiAgICogQHJldHVybiB7RmVhdHVyZXNbXX1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEZlYXR1cmVzTGlzdChmZWF0dXJlczogQ2hlY2tib3hPcHRpb25bXSk6IEZlYXR1cmVzW10ge1xyXG4gICAgdGhpcy5mZWF0dXJlTGlzdCA9IFtdO1xyXG4gICAgZmVhdHVyZXM/LmZvckVhY2goKGZlYXR1cmU6IENoZWNrYm94T3B0aW9uKSA9PiB7XHJcbiAgICAgIGlmIChmZWF0dXJlLmNoZWNrZWQpXHJcbiAgICAgICAgdGhpcy5mZWF0dXJlTGlzdD8ucHVzaCh7XHJcbiAgICAgICAgICBmZWF0dXJlSWQ6IGZlYXR1cmU/LmlkIGFzIHN0cmluZyxcclxuICAgICAgICAgIGZlYXR1cmVOYW1lOiBmZWF0dXJlPy5uYW1lIGFzIHN0cmluZyxcclxuICAgICAgICAgIGlzRGVmYXVsdDogZmVhdHVyZT8uY2hlY2tlZCxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuZmVhdHVyZUxpc3Q7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgcm9zdGVyIHR5cGUgZnJvbSBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHJldHVybiB7Kn0gIHtPYnNlcnZhYmxlPEdldFJvc3RlclR5cGVPclNldHRpbmdzUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9zdGVyVHlwZSgpOiBPYnNlcnZhYmxlPEdldFJvc3RlclR5cGVPclNldHRpbmdzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvbG9va3VwL1Jvc3RlclR5cGVgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgZ3JvdXAgdHlwZSBzZXR0aW5ncyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZS5cclxuICAgKiBAcmV0dXJuIHsqfSAge09ic2VydmFibGU8R2V0Um9zdGVyVHlwZU9yU2V0dGluZ3NSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRHcm91cFR5cGVTZXR0aW5ncygpOiBPYnNlcnZhYmxlPEdldFJvc3RlclR5cGVPclNldHRpbmdzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvbG9va3VwL0dUX1NldHRpbmdzYClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3N0cyB0aGUgZ3JvdXAgdHlwZSBkZXRhaWxzIHRvIHNlcnZlciB1c2luZyBIdHRwU2VydmljZSB0byBjcmVhdGUgbmV3IGdyb3VwIHR5cGUuXHJcbiAgICogQHBhcmFtIHtDcmVhdGVHcm91cFR5cGVSZXF1ZXN0UGF5bG9hZH0gY3JlYXRlR3JvdXBUeXBlUGF5bG9hZFxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxDcmVhdGVHcm91cFR5cGVSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBjcmVhdGVHcm91cFR5cGUoXHJcbiAgICBjcmVhdGVHcm91cFR5cGVQYXlsb2FkOiBDcmVhdGVHcm91cFR5cGVSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8Q3JlYXRlR3JvdXBUeXBlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2NvbmZpZy9ncm91cFR5cGVgLFxyXG4gICAgICAgIGNyZWF0ZUdyb3VwVHlwZVBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgc29ydGVkIHJvbGUgbGlzdCBkYXRhLlxyXG4gICAqIEBwYXJhbSB7Um9sZVtdfSByb2xlTGlzdFxyXG4gICAqIEByZXR1cm4ge1JvbGVbXX1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNvcnRSb2xlc0J5Um9sZVR5cGUocm9sZUxpc3Q6IFJvbGVbXSk6IFJvbGVbXSB7XHJcbiAgICByZXR1cm4gcm9sZUxpc3Quc29ydCgoYSwgYikgPT4gYT8udmlld09yZGVyIC0gYj8udmlld09yZGVyKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUG9zdHMgdGhlIHJvbGUgZGV0YWlscyB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UgZm9yIGRlbGV0aW5nIHRoZSByb2xlLlxyXG4gICAqIEBwYXJhbSB7RGVsZXRlUm9sZVJlcXVlc3RQYXlsb2FkfSBkZWxldGVSb2xlUmVxdWVzdFBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPERlbGV0ZVJvbGVSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBkZWxldGVSb2xlKFxyXG4gICAgZGVsZXRlUm9sZVBheWxvYWQ6IERlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8RGVsZXRlUm9sZVJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlL2RlbGV0ZVJvbGVgLCBkZWxldGVSb2xlUGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIGdyb3VwIHR5cGVzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Vmlld0dyb3VwVHlwZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwVHlwZXMoYXBwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Vmlld0dyb3VwVHlwZVJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2NvbmZpZy9hcHBHcm91cFR5cGVEZXRhaWxzLyR7YXBwSWR9YFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyBncm91cCB0eXBlIGRldGFpbHMuXHJcbiAgICogQHBhcmFtIHtWaWV3R3JvdXBUeXBlUmVzcG9uc2V9IGdyb3VwVHlwZXNcclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldEdyb3VwVHlwZURldGFpbHMoZ3JvdXBUeXBlczogVmlld0dyb3VwVHlwZVJlc3BvbnNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyb3VwVHlwZXMgPSBncm91cFR5cGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBncm91cCB0eXBlIGRldGFpbHMuXHJcbiAgICogQHJldHVybiB7Vmlld0dyb3VwVHlwZVJlc3BvbnNlfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0R3JvdXBUeXBlRGV0YWlscygpOiBWaWV3R3JvdXBUeXBlUmVzcG9uc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBUeXBlcztcclxuICB9XHJcbn1cclxuIl19