@sunbird-cb/cbp-ai 0.1.118 → 0.1.120

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 (19) hide show
  1. package/esm2022/lib/components/edit-cbp-plan/edit-cbp-plan.component.mjs +43 -11
  2. package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +347 -89
  3. package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +43 -2
  4. package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +41 -35
  5. package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +2 -2
  6. package/esm2022/lib/components/view-cbp-plan/view-cbp-plan.component.mjs +2 -2
  7. package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +2 -2
  8. package/fesm2022/sunbird-cb-cbp-ai.mjs +474 -137
  9. package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -1
  10. package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts.map +1 -1
  11. package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts +70 -6
  12. package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -1
  13. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +1 -0
  14. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -1
  15. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +1 -1
  16. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -1
  17. package/package.json +1 -1
  18. package/sunbird-cb-cbp-ai-0.1.120.tgz +0 -0
  19. package/sunbird-cb-cbp-ai-0.1.118.tgz +0 -0
@@ -1,5 +1,4 @@
1
1
  import { Component, Input } from '@angular/core';
2
- import { data } from 'jquery';
3
2
  import * as i0 from "@angular/core";
4
3
  import * as i1 from "../../modules/shared/services/shared.service";
5
4
  import * as i2 from "@angular/material/dialog";
@@ -13,52 +12,42 @@ export class GapAnalysisRecommendedCourseComponent {
13
12
  this.loading = false;
14
13
  this.recommended_course_id = '';
15
14
  this.searchText = '';
15
+ this.filterdCourses = [];
16
16
  this.selectFilterCourses = [];
17
- this.competenciesCount = { total: 0, public_courses: 0, igot: 0 };
18
- this.expandedCompetencies = {}; // Track expanded state for each course and competency type
19
- this.planData = data;
17
+ this.competenciesCount = {
18
+ total: 0,
19
+ public_courses: 0,
20
+ igot: 0
21
+ };
22
+ this.expandedCompetencies = {};
23
+ // Gap results for each course, keyed by course index.
24
+ this.courseGapResults = {};
20
25
  }
21
26
  ngOnInit() {
22
27
  this.loading = true;
23
28
  this.cbpPlanData = this.sharedService.cbpPlanFinalObj;
24
- // this.sharedService.getRecommendedCourse(this.planData.id).subscribe((res)=>{
25
- // this.loading = false
26
- // console.log('res', res)
27
- // this.recommended_course_id = res.id
28
- // let allCourses = []
29
- // if(res && res.filtered_courses && res.filtered_courses.length) {
30
- // res.filtered_courses.forEach((item)=>{
31
- // if(item?.relevancy > 85) {
32
- // allCourses.push(item)
33
- // }
34
- // })
35
- // }
36
- // this.filterdCourses = allCourses
37
- // console.log('this.filterdCourses', this.filterdCourses)
38
- // this.updateCompetencyCounts()
39
- // this.getUserCourse()
40
- // })
41
29
  this.sharedService.getRecommendedCourse(this.planData.id).subscribe({
42
30
  next: (res) => {
43
- this.loading = false;
44
- console.log('res', res);
45
- this.recommended_course_id = res.id;
46
- let allCourses = [];
47
- if (res && res.filtered_courses && res.filtered_courses.length) {
31
+ this.recommended_course_id = res?.id || '';
32
+ const allCourses = [];
33
+ if (Array.isArray(res?.filtered_courses)) {
48
34
  res.filtered_courses.forEach((item) => {
49
- if (item?.relevancy > 75) {
35
+ // Relevancy remains the initial course recommendation filter.
36
+ // Gap analysis is performed separately using Area + Theme +
37
+ // Subtheme + course_level.
38
+ if (Number(item?.relevancy || 0) > 75) {
50
39
  allCourses.push(item);
51
40
  }
52
41
  });
53
42
  }
54
43
  this.filterdCourses = allCourses;
55
- console.log('this.filterdCourses', this.filterdCourses);
56
44
  this.updateCompetencyCounts();
45
+ this.calculateAllCourseGaps();
57
46
  this.getUserCourse();
58
47
  },
59
48
  error: (error) => {
60
49
  this.loading = false;
61
- this.snackBar.open(error?.error?.detail, 'X', {
50
+ this.snackBar.open(error?.error?.detail || 'Unable to load recommended courses.', 'X', {
62
51
  duration: 3000,
63
52
  panelClass: ['snackbar-error']
64
53
  });
@@ -66,92 +55,360 @@ export class GapAnalysisRecommendedCourseComponent {
66
55
  });
67
56
  }
68
57
  updateCompetencyCounts() {
69
- // const comps = this.competenciesArray.value;
70
- this.competenciesCount = { total: 0, public_courses: 0, igot: 0 };
71
- this.filterdCourses.forEach(c => {
72
- this.competenciesCount.total++;
73
- if (c.is_public)
74
- this.competenciesCount.public_courses++;
75
- if (!c.is_public)
76
- this.competenciesCount.igot++;
77
- });
58
+ this.competenciesCount = {
59
+ total: this.filterdCourses.length,
60
+ public_courses: this.filterdCourses.filter(c => c?.is_public).length,
61
+ igot: this.filterdCourses.filter(c => !c?.is_public).length
62
+ };
78
63
  }
79
64
  getUserCourse() {
80
- let role_mapping_id = this.planData.id;
65
+ const role_mapping_id = this.planData.id;
81
66
  this.loading = true;
82
67
  this.sharedService.getUserCourse(role_mapping_id).subscribe({
83
68
  next: (res) => {
84
- // Success handling
85
69
  this.loading = false;
86
- // Process user-added courses to ensure proper structure
87
- for (let i = 0; i < res.length; i++) {
88
- this.filterdCourses.push(res[i]);
70
+ if (Array.isArray(res) && res.length) {
71
+ res.forEach((course) => {
72
+ this.filterdCourses.push(course);
73
+ });
89
74
  }
90
- // Rebuild filterdCourses to include all course types
75
+ this.updateCompetencyCounts();
76
+ this.calculateAllCourseGaps();
91
77
  console.log('filterdCourses after adding user courses:', this.filterdCourses);
92
- //this.successRoleMapping.emit(this.roleMappingForm)
93
78
  },
94
79
  error: (error) => {
95
80
  console.log('error', error);
96
81
  this.loading = false;
97
- // Handle 409 Conflict here
98
- // alert('Conflict detected: The resource already exists or action conflicts.');
99
- //this.get
100
- // Or you can set a UI error message variable
101
- this.loading = false;
102
- //this.alreadyAvailableRoleMapping.emit(this.roleMappingForm)
103
82
  }
104
83
  });
105
84
  }
85
+ /**
86
+ * Returns competencies from either competencies or competencies_v6.
87
+ */
88
+ getCourseCompetencies(course) {
89
+ if (Array.isArray(course?.competencies)) {
90
+ return course.competencies;
91
+ }
92
+ if (Array.isArray(course?.competencies_v6)) {
93
+ return course.competencies_v6;
94
+ }
95
+ return [];
96
+ }
97
+ normalize(value) {
98
+ return String(value ?? '')
99
+ .trim()
100
+ .toLowerCase()
101
+ .replace(/\s+/g, ' ');
102
+ }
103
+ /**
104
+ * Gets the first available value from the supplied keys.
105
+ */
106
+ getValue(object, keys) {
107
+ if (!object) {
108
+ return '';
109
+ }
110
+ for (const key of keys) {
111
+ if (object[key] !== undefined &&
112
+ object[key] !== null &&
113
+ String(object[key]).trim() !== '') {
114
+ return object[key];
115
+ }
116
+ }
117
+ return '';
118
+ }
119
+ getCompetencyArea(competency) {
120
+ return this.getValue(competency, [
121
+ 'competencyAreaName',
122
+ 'area',
123
+ 'competency_area',
124
+ 'competencyArea'
125
+ ]);
126
+ }
127
+ getCompetencyTheme(competency) {
128
+ return this.getValue(competency, [
129
+ 'competencyThemeName',
130
+ 'theme',
131
+ 'competency_theme',
132
+ 'competencyTheme'
133
+ ]);
134
+ }
135
+ getCompetencySubtheme(competency) {
136
+ return this.getValue(competency, [
137
+ 'competencySubthemeName',
138
+ 'subtheme',
139
+ 'competency_subtheme',
140
+ 'competencySubtheme'
141
+ ]);
142
+ }
143
+ getProficiencyLevel(competency) {
144
+ return this.getValue(competency, [
145
+ 'proficiency_level',
146
+ 'proficiencyLevel',
147
+ 'requiredProficiency',
148
+ 'required_proficiency',
149
+ 'currentProficiency',
150
+ 'current_proficiency'
151
+ ]);
152
+ }
153
+ /**
154
+ * IMPORTANT:
155
+ * course_level is the authoritative STO level of a course.
156
+ */
157
+ getCourseLevel(course, competency) {
158
+ return this.getValue(course, ['course_level']) ||
159
+ this.getValue(competency, ['course_level']);
160
+ }
161
+ /**
162
+ * Finds role competency data from planData / cbpPlanData.
163
+ */
164
+ getRequiredCompetencies() {
165
+ const possibleSources = [
166
+ this.planData?.competencies,
167
+ this.planData?.competency,
168
+ this.planData?.competency_data,
169
+ this.planData?.role_competencies,
170
+ this.planData?.competencies_v6,
171
+ this.cbpPlanData?.competencies,
172
+ this.cbpPlanData?.competency,
173
+ this.cbpPlanData?.role_competencies
174
+ ];
175
+ for (const source of possibleSources) {
176
+ if (Array.isArray(source) && source.length) {
177
+ return source;
178
+ }
179
+ }
180
+ return [];
181
+ }
182
+ getRequiredLevel(competency) {
183
+ return this.getValue(competency, [
184
+ 'requiredProficiency',
185
+ 'required_proficiency',
186
+ 'requiredLevel',
187
+ 'required_level',
188
+ 'proficiencyLevel',
189
+ 'proficiency_level',
190
+ 'level',
191
+ 'stoLevel',
192
+ 'sto_level'
193
+ ]);
194
+ }
195
+ getCurrentLevel(competency) {
196
+ return this.getValue(competency, [
197
+ 'currentProficiency',
198
+ 'current_proficiency',
199
+ 'currentLevel',
200
+ 'current_level',
201
+ 'currentProficiencyLevel',
202
+ 'current_proficiency_level'
203
+ ]);
204
+ }
205
+ /**
206
+ * STO hierarchy:
207
+ * Operational < Tactical < Strategic
208
+ */
209
+ getLevelRank(level) {
210
+ switch (this.normalize(level)) {
211
+ case 'operational':
212
+ return 1;
213
+ case 'tactical':
214
+ return 2;
215
+ case 'strategic':
216
+ return 3;
217
+ default:
218
+ return 0;
219
+ }
220
+ }
221
+ /**
222
+ * Match course competency to role competency using:
223
+ * Area -> Theme -> Subtheme
224
+ *
225
+ * Then compare the course's course_level with the required level.
226
+ */
227
+ calculateCourseGaps(course) {
228
+ const requiredCompetencies = this.getRequiredCompetencies();
229
+ if (!requiredCompetencies.length) {
230
+ return [];
231
+ }
232
+ const courseCompetencies = this.getCourseCompetencies(course);
233
+ const results = [];
234
+ courseCompetencies.forEach((courseCompetency) => {
235
+ const courseArea = this.normalize(this.getCompetencyArea(courseCompetency));
236
+ const courseTheme = this.normalize(this.getCompetencyTheme(courseCompetency));
237
+ const courseSubtheme = this.normalize(this.getCompetencySubtheme(courseCompetency));
238
+ if (!courseTheme || !courseSubtheme) {
239
+ return;
240
+ }
241
+ const courseLevel = this.getCourseLevel(course, courseCompetency);
242
+ requiredCompetencies.forEach((requiredCompetency) => {
243
+ const requiredArea = this.normalize(this.getCompetencyArea(requiredCompetency));
244
+ const requiredTheme = this.normalize(this.getCompetencyTheme(requiredCompetency));
245
+ const requiredSubtheme = this.normalize(this.getCompetencySubtheme(requiredCompetency));
246
+ const requiredProficiencyLevel = this.normalize(this.getProficiencyLevel(requiredCompetency));
247
+ if (!requiredTheme || !requiredSubtheme) {
248
+ return;
249
+ }
250
+ const courseProficiencyLevel = this.normalize(this.getProficiencyLevel(courseCompetency));
251
+ /*
252
+ * Match:
253
+ * Area + Theme + Subtheme + Proficiency Level
254
+ */
255
+ const areaMatches = !courseArea ||
256
+ !requiredArea ||
257
+ courseArea === requiredArea;
258
+ const themeMatches = courseTheme === requiredTheme;
259
+ const subthemeMatches = courseSubtheme === requiredSubtheme;
260
+ const proficiencyLevelMatches = courseProficiencyLevel === requiredProficiencyLevel;
261
+ /*
262
+ * All 4 parameters must match.
263
+ *
264
+ * If all 4 match:
265
+ * NOT part of gap
266
+ *
267
+ * If any one does not match:
268
+ * PART of gap
269
+ */
270
+ const allFourMatch = areaMatches &&
271
+ themeMatches &&
272
+ subthemeMatches &&
273
+ proficiencyLevelMatches;
274
+ const requiredLevel = this.getRequiredLevel(requiredCompetency);
275
+ const currentLevel = this.getCurrentLevel(requiredCompetency);
276
+ const requiredRank = this.getLevelRank(requiredLevel);
277
+ const courseRank = this.getLevelRank(courseLevel);
278
+ let status;
279
+ let reason;
280
+ if (allFourMatch) {
281
+ /*
282
+ * All four competency attributes match.
283
+ * Therefore this competency is NOT part of the gap.
284
+ */
285
+ status = 'FULL';
286
+ reason =
287
+ 'Competency Area, Theme, Subtheme and Proficiency Level all match. This competency is not part of the gap.';
288
+ }
289
+ else {
290
+ /*
291
+ * At least one of the four attributes does not match.
292
+ * Therefore this competency is part of the gap.
293
+ */
294
+ const mismatches = [];
295
+ if (!areaMatches) {
296
+ mismatches.push('Competency Area');
297
+ }
298
+ if (!themeMatches) {
299
+ mismatches.push('Theme');
300
+ }
301
+ if (!subthemeMatches) {
302
+ mismatches.push('Subtheme');
303
+ }
304
+ if (!proficiencyLevelMatches) {
305
+ mismatches.push('Proficiency Level');
306
+ }
307
+ status = 'NO_MATCH';
308
+ reason =
309
+ `${mismatches.join(', ')} ${mismatches.length === 1 ? 'does' : 'do'} not match. This competency is part of the gap.`;
310
+ }
311
+ results.push({
312
+ area: this.getCompetencyArea(requiredCompetency),
313
+ theme: this.getCompetencyTheme(requiredCompetency),
314
+ subtheme: this.getCompetencySubtheme(requiredCompetency),
315
+ proficiencyLevel: this.getProficiencyLevel(requiredCompetency),
316
+ currentLevel,
317
+ requiredLevel,
318
+ courseLevel,
319
+ status,
320
+ reason
321
+ });
322
+ });
323
+ });
324
+ return this.removeDuplicateGapResults(results);
325
+ }
326
+ removeDuplicateGapResults(results) {
327
+ const unique = new Map();
328
+ results.forEach(result => {
329
+ const key = [
330
+ this.normalize(result.area),
331
+ this.normalize(result.theme),
332
+ this.normalize(result.subtheme),
333
+ this.normalize(result.proficiencyLevel),
334
+ this.normalize(result.requiredLevel),
335
+ this.normalize(result.courseLevel)
336
+ ].join('|');
337
+ if (!unique.has(key)) {
338
+ unique.set(key, result);
339
+ }
340
+ });
341
+ return Array.from(unique.values());
342
+ }
343
+ calculateAllCourseGaps() {
344
+ this.courseGapResults = {};
345
+ this.filterdCourses.forEach((course, index) => {
346
+ this.courseGapResults[index] = this.calculateCourseGaps(course);
347
+ });
348
+ }
349
+ getCourseGapResults(index) {
350
+ return this.courseGapResults[index] || [];
351
+ }
352
+ getFullMatches(index) {
353
+ return this.getCourseGapResults(index)
354
+ .filter(result => result.status === 'FULL');
355
+ }
356
+ getPartialMatches(index) {
357
+ return this.getCourseGapResults(index)
358
+ .filter(result => result.status === 'PARTIAL');
359
+ }
360
+ getNoMatches(index) {
361
+ return this.getCourseGapResults(index)
362
+ .filter(result => result.status === 'NO_MATCH');
363
+ }
364
+ hasGapMatch(index) {
365
+ return this.getCourseGapResults(index).some(result => result.status === 'FULL' ||
366
+ result.status === 'PARTIAL');
367
+ }
368
+ getCourseGapStatus(index) {
369
+ const results = this.getCourseGapResults(index);
370
+ if (results.some(result => result.status === 'FULL')) {
371
+ return 'FULL';
372
+ }
373
+ if (results.some(result => result.status === 'PARTIAL')) {
374
+ return 'PARTIAL';
375
+ }
376
+ return 'NO_MATCH';
377
+ }
378
+ getCourseGapStatusLabel(index) {
379
+ switch (this.getCourseGapStatus(index)) {
380
+ case 'FULL':
381
+ return 'Full Gap Match';
382
+ case 'PARTIAL':
383
+ return 'Partial Gap Match';
384
+ default:
385
+ return 'No Gap Match';
386
+ }
387
+ }
106
388
  getCompetenciesByType(type, index) {
107
389
  const course = this.filterdCourses[index];
108
390
  if (!course) {
109
391
  console.log(`No course found at index ${index}`);
110
392
  return [];
111
393
  }
112
- // Handle different competency property names
113
- // AI Recommended & Public courses use 'competencies'
114
- // Manually Suggested - iGOT courses use 'competencies_v6'
115
- // User Added courses use 'competencies'
116
- let competencies = [];
117
- if (course.competencies && Array.isArray(course.competencies)) {
118
- competencies = course.competencies;
119
- // console.log(`Course ${index} (${course.course_type || course.name || 'Unknown'}) using 'competencies' property:`, competencies);
120
- }
121
- else if (course.competencies_v6 && Array.isArray(course.competencies_v6)) {
122
- competencies = course.competencies_v6;
123
- // console.log(`Course ${index} (${course.course_type || course.name || 'Unknown'}) using 'competencies_v6' property:`, competencies);
124
- }
125
- else {
126
- // console.log(`Course ${index} (${course.course_type || course.name || 'Unknown'}) has no valid competencies property:`, {
127
- // hasCompetencies: !!course.competencies,
128
- // competenciesType: typeof course.competencies,
129
- // hasCompetenciesV6: !!course.competencies_v6,
130
- // competenciesV6Type: typeof course.competencies_v6,
131
- // courseKeys: Object.keys(course)
132
- // });
133
- }
134
- if (competencies.length === 0) {
394
+ const competencies = this.getCourseCompetencies(course);
395
+ if (!competencies.length) {
135
396
  console.log(`No competencies found for course ${index} and type ${type}`);
136
397
  return [];
137
398
  }
138
- // Normalize the type for comparison (case-insensitive + handle spelling variations)
139
- const normalizedType = type.toLowerCase().trim();
140
- const matchedCompetencies = competencies.filter(c => {
141
- if (!c || !c.competencyAreaName) {
142
- console.log(`Invalid competency structure in course ${index}:`, c);
399
+ const normalizedType = this.normalize(type);
400
+ return competencies.filter((c) => {
401
+ if (!c || !this.getCompetencyArea(c)) {
143
402
  return false;
144
403
  }
145
- const competencyArea = c.competencyAreaName.toLowerCase().trim();
146
- // Handle both "behavioral" and "behavioural" spellings
147
- if (normalizedType === 'behavioural' || normalizedType === 'behavioral') {
148
- return competencyArea === 'behavioral' || competencyArea === 'behavioural';
404
+ const competencyArea = this.normalize(this.getCompetencyArea(c));
405
+ if (normalizedType === 'behavioural' ||
406
+ normalizedType === 'behavioral') {
407
+ return (competencyArea === 'behavioral' ||
408
+ competencyArea === 'behavioural');
149
409
  }
150
- // For other types, do case-insensitive comparison
151
410
  return competencyArea === normalizedType;
152
411
  });
153
- // console.log(`Found ${matchedCompetencies.length} competencies of type ${type} for course ${index}:`, matchedCompetencies);
154
- return matchedCompetencies;
155
412
  }
156
413
  getDisplayedCompetencies(type, index) {
157
414
  const competencies = this.getCompetenciesByType(type, index);
@@ -163,7 +420,8 @@ export class GapAnalysisRecommendedCourseComponent {
163
420
  }
164
421
  toggleCompetencies(type, index) {
165
422
  const key = `${index}-${type}`;
166
- this.expandedCompetencies[key] = !this.expandedCompetencies[key];
423
+ this.expandedCompetencies[key] =
424
+ !this.expandedCompetencies[key];
167
425
  }
168
426
  isExpanded(type, index) {
169
427
  const key = `${index}-${type}`;
@@ -174,7 +432,7 @@ export class GapAnalysisRecommendedCourseComponent {
174
432
  }
175
433
  getRemainingCount(type, index) {
176
434
  const totalCount = this.getCompetenciesByType(type, index).length;
177
- return totalCount - 2;
435
+ return Math.max(totalCount - 2, 0);
178
436
  }
179
437
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GapAnalysisRecommendedCourseComponent, deps: [{ token: i1.SharedService }, { token: i2.MatDialog }, { token: i3.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
180
438
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GapAnalysisRecommendedCourseComponent, selector: "app-gap-analysis-recommended-course", inputs: { planData: "planData" }, ngImport: i0, template: "<div class=\"section-container mt-2\">\n <div class=\"competency-container\">\n <div class=\"outside-layer-total\">\n <div class=\"inside-layer\">\n Total Courses\n </div>\n <div class=\"count\">\n {{competenciesCount?.total}}\n </div>\n </div>\n <div class=\"outside-layer-total\">\n <div class=\"inside-layer\">\n iGOT Platform Courses\n </div>\n <div class=\"count\">\n {{competenciesCount?.igot}}\n </div>\n </div>\n <div class=\"outside-layer-total\">\n <div class=\"inside-layer\">\n Public Courses\n </div>\n <div class=\"count\">\n {{competenciesCount?.public_courses}}\n\n </div>\n </div>\n\n </div>\n <div class=\"my-4\">\n\n <div class=\"course-list-container\">\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n\n <div>\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <span>AI Recommended</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\" target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation[0]}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\" target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation[0]}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\" target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation[0]}}</span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"course-title mt-4\">\n <div>\n <div *ngIf=\"item?.course\">{{item?.course}}</div>\n <div *ngIf=\"item?.name\">{{item?.name}}</div>\n </div>\n </div>\n <div class=\"course-desc mt-2\">\n <div>\n <div>{{item?.rationale}}</div>\n </div>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioral Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\" *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\" (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\" *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\" (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\" *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\" (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\" *ngIf=\"item?.relevancy\">{{item?.relevancy}}%</div>\n <div class=\"percentage\" *ngIf=\"!item?.relevancy\">N/A</div>\n </div>\n </div>\n <!-- <div>\n <div class=\"competencies-matched-container\">\n <div class=\"competencies-matched\">Competencies Matched</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">80%</div>\n </div>\n </div> -->\n </div>\n <!-- <div class=\"course-list-item\">\n <div class=\"course-header\">\n <div>\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">Course</div>\n </div>\n </div>\n <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <span>AI Recommended</span>\n\n </div>\n </div>\n </div>\n </div>\n <div class=\"course-title\">\n <div>\n <div>Maternal, Infant And Young Child Nutrition</div>\n </div>\n </div>\n <div class=\"course-desc\">\n <div>\n <div>This Course directly addresses a primary responsibility of Anganwandi Care takers,\n which is\n to provide and educate on nutrition for mother and young children</div>\n </div>\n </div>\n <div>\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">90%</div>\n </div>\n </div>\n <div>\n <div class=\"competencies-matched-container\">\n <div class=\"competencies-matched\">Competencies Matched</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">80%</div>\n </div>\n </div>\n </div> -->\n\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.ministry-heading{color:#1b4ca1;font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex;justify-content:normal;gap:16px;flex-direction:row;margin-left:20px}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved{display:flex;flex-direction:column;gap:16px}.search-and-buttons-container{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.search-container-compact{flex:0 0 auto;min-width:280px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:1px solid #d5d0d0;padding:8px 12px 8px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
@@ -185,4 +443,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
185
443
  }], ctorParameters: function () { return [{ type: i1.SharedService }, { type: i2.MatDialog }, { type: i3.MatSnackBar }]; }, propDecorators: { planData: [{
186
444
  type: Input
187
445
  }] } });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7OztBQVE5QixNQUFNLE9BQU8scUNBQXFDO0lBTWhELFlBQXFCLGFBQTRCLEVBQVUsTUFBaUIsRUFBVSxRQUFxQjtRQUF0RixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVc7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBSDNHLFlBQU8sR0FBQyxLQUFLLENBQUE7UUFDYiwwQkFBcUIsR0FBQyxFQUFFLENBQUE7UUFLeEIsZUFBVSxHQUFHLEVBQUUsQ0FBQTtRQUVmLHdCQUFtQixHQUFPLEVBQUUsQ0FBQTtRQUM1QixzQkFBaUIsR0FBRyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUUsY0FBYyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxFQUFDLENBQUE7UUFDdkQseUJBQW9CLEdBQVEsRUFBRSxDQUFDLENBQUMsMkRBQTJEO1FBTnZGLElBQUksQ0FBQyxRQUFR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QUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRSxPQUFPLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQzsrR0FyTVUscUNBQXFDO21HQUFyQyxxQ0FBcUMsNkdDWGxELG1xYUEwUE07OzRGRC9PTyxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0UscUNBQXFDO3NKQU10QyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IGRhdGEgfSBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWdhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBHYXBBbmFseXNpc1JlY29tbWVuZGVkQ291cnNlQ29tcG9uZW50IHtcblxuICBASW5wdXQoKSBwbGFuRGF0YTphbnlcbiAgbG9hZGluZz1mYWxzZVxuICByZWNvbW1lbmRlZF9jb3Vyc2VfaWQ9JydcbiAgY2JwUGxhbkRhdGE6YW55XG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyKSB7XG4gICAgICB0aGlzLnBsYW5EYXRhID0gZGF0YVxuICAgIH1cbiAgc2VhcmNoVGV4dCA9ICcnXG4gIGZpbHRlcmRDb3Vyc2VzIDphbnlcbiAgc2VsZWN0RmlsdGVyQ291cnNlczphbnkgPSBbXVxuICBjb21wZXRlbmNpZXNDb3VudCA9IHt0b3RhbDowLCBwdWJsaWNfY291cnNlczowLCBpZ290OjB9XG4gIGV4cGFuZGVkQ29tcGV0ZW5jaWVzOiBhbnkgPSB7fTsgLy8gVHJhY2sgZXhwYW5kZWQgc3RhdGUgZm9yIGVhY2ggY291cnNlIGFuZCBjb21wZXRlbmN5IHR5cGVcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMuY2JwUGxhbkRhdGEgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqXG4gICAgLy8gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHRoaXMucGxhbkRhdGEuaWQpLnN1YnNjcmliZSgocmVzKT0+e1xuICAgIC8vICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgLy8gICB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCA9IHJlcy5pZFxuICAgIC8vICAgbGV0IGFsbENvdXJzZXMgPSBbXVxuICAgIC8vICAgaWYocmVzICYmIHJlcy5maWx0ZXJlZF9jb3Vyc2VzICYmIHJlcy5maWx0ZXJlZF9jb3Vyc2VzLmxlbmd0aCkge1xuICAgIC8vICAgICByZXMuZmlsdGVyZWRfY291cnNlcy5mb3JFYWNoKChpdGVtKT0+e1xuICAgIC8vICAgICAgIGlmKGl0ZW0/LnJlbGV2YW5jeSA+IDg1KSB7XG4gICAgLy8gICAgICAgICBhbGxDb3Vyc2VzLnB1c2goaXRlbSlcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICB9XG4gICAgLy8gICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQ291cnNlc1xuICAgIC8vICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZENvdXJzZXMnLCB0aGlzLmZpbHRlcmRDb3Vyc2VzKVxuICAgIC8vICAgdGhpcy51cGRhdGVDb21wZXRlbmN5Q291bnRzKClcbiAgICAvLyAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpXG4gICAgLy8gfSlcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSZWNvbW1lbmRlZENvdXJzZSh0aGlzLnBsYW5EYXRhLmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCA9IHJlcy5pZFxuICAgICAgICBsZXQgYWxsQ291cnNlcyA9IFtdXG4gICAgICAgIGlmKHJlcyAmJiByZXMuZmlsdGVyZWRfY291cnNlcyAmJiByZXMuZmlsdGVyZWRfY291cnNlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXMuZmlsdGVyZWRfY291cnNlcy5mb3JFYWNoKChpdGVtKT0+e1xuICAgICAgICAgICAgaWYoaXRlbT8ucmVsZXZhbmN5ID4gNzUpIHtcbiAgICAgICAgICAgICAgYWxsQ291cnNlcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQ291cnNlc1xuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5maWx0ZXJkQ291cnNlcycsIHRoaXMuZmlsdGVyZENvdXJzZXMpXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcGV0ZW5jeUNvdW50cygpXG4gICAgICAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNvbXBldGVuY3lDb3VudHMoKSB7XG4gICAvLyBjb25zdCBjb21wcyA9IHRoaXMuY29tcGV0ZW5jaWVzQXJyYXkudmFsdWU7XG4gICAgdGhpcy5jb21wZXRlbmNpZXNDb3VudCA9IHt0b3RhbDogMCwgcHVibGljX2NvdXJzZXM6IDAsIGlnb3Q6IDB9O1xuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMuZm9yRWFjaChjID0+IHtcbiAgICAgIHRoaXMuY29tcGV0ZW5jaWVzQ291bnQudG90YWwrKztcbiAgICAgIGlmIChjLmlzX3B1YmxpYykgdGhpcy5jb21wZXRlbmNpZXNDb3VudC5wdWJsaWNfY291cnNlcysrO1xuICAgICAgaWYgKCFjLmlzX3B1YmxpYykgdGhpcy5jb21wZXRlbmNpZXNDb3VudC5pZ290Kys7XG4gICAgfSk7XG4gIH1cblxuXG5cblxuXG4gIGdldFVzZXJDb3Vyc2UoKSB7XG4gICAgbGV0IHJvbGVfbWFwcGluZ19pZCA9IHRoaXMucGxhbkRhdGEuaWRcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVzZXJDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIFxuICAgICAgICAvLyBQcm9jZXNzIHVzZXItYWRkZWQgY291cnNlcyB0byBlbnN1cmUgcHJvcGVyIHN0cnVjdHVyZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMucHVzaChyZXNbaV0pXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgdG8gaW5jbHVkZSBhbGwgY291cnNlIHR5cGVzXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coJ2ZpbHRlcmRDb3Vyc2VzIGFmdGVyIGFkZGluZyB1c2VyIGNvdXJzZXM6JywgdGhpcy5maWx0ZXJkQ291cnNlcyk7XG4gICAgICAgIC8vdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvcicsIGVycm9yKVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvLyBIYW5kbGUgNDA5IENvbmZsaWN0IGhlcmVcbiAgICAgICAgLy8gYWxlcnQoJ0NvbmZsaWN0IGRldGVjdGVkOiBUaGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgb3IgYWN0aW9uIGNvbmZsaWN0cy4nKTtcbiAgICAgICAgLy90aGlzLmdldFxuICAgICAgICAvLyBPciB5b3UgY2FuIHNldCBhIFVJIGVycm9yIG1lc3NhZ2UgdmFyaWFibGVcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvL3RoaXMuYWxyZWFkeUF2YWlsYWJsZVJvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9XG5cblxuICAgIH0pXG4gIH1cblxuICBnZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZTogc3RyaW5nLCBpbmRleCk6IGFueVtdIHtcbiAgICBjb25zdCBjb3Vyc2UgPSB0aGlzLmZpbHRlcmRDb3Vyc2VzW2luZGV4XTtcbiAgICBpZiAoIWNvdXJzZSkge1xuICAgICAgY29uc29sZS5sb2coYE5vIGNvdXJzZSBmb3VuZCBhdCBpbmRleCAke2luZGV4fWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAvLyBBSSBSZWNvbW1lbmRlZCAmIFB1YmxpYyBjb3Vyc2VzIHVzZSAnY29tcGV0ZW5jaWVzJ1xuICAgIC8vIE1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1QgY291cnNlcyB1c2UgJ2NvbXBldGVuY2llc192NidcbiAgICAvLyBVc2VyIEFkZGVkIGNvdXJzZXMgdXNlICdjb21wZXRlbmNpZXMnXG4gICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llcykpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4vLyAgICAgIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIHVzaW5nICdjb21wZXRlbmNpZXMnIHByb3BlcnR5OmAsIGNvbXBldGVuY2llcyk7XG4gICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgLy8gIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIHVzaW5nICdjb21wZXRlbmNpZXNfdjYnIHByb3BlcnR5OmAsIGNvbXBldGVuY2llcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIGhhcyBubyB2YWxpZCBjb21wZXRlbmNpZXMgcHJvcGVydHk6YCwge1xuICAgICAgLy8gICBoYXNDb21wZXRlbmNpZXM6ICEhY291cnNlLmNvbXBldGVuY2llcyxcbiAgICAgIC8vICAgY29tcGV0ZW5jaWVzVHlwZTogdHlwZW9mIGNvdXJzZS5jb21wZXRlbmNpZXMsXG4gICAgICAvLyAgIGhhc0NvbXBldGVuY2llc1Y2OiAhIWNvdXJzZS5jb21wZXRlbmNpZXNfdjYsXG4gICAgICAvLyAgIGNvbXBldGVuY2llc1Y2VHlwZTogdHlwZW9mIGNvdXJzZS5jb21wZXRlbmNpZXNfdjYsXG4gICAgICAvLyAgIGNvdXJzZUtleXM6IE9iamVjdC5rZXlzKGNvdXJzZSlcbiAgICAgIC8vIH0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAoY29tcGV0ZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coYE5vIGNvbXBldGVuY2llcyBmb3VuZCBmb3IgY291cnNlICR7aW5kZXh9IGFuZCB0eXBlICR7dHlwZX1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIGZvciBjb21wYXJpc29uIChjYXNlLWluc2Vuc2l0aXZlICsgaGFuZGxlIHNwZWxsaW5nIHZhcmlhdGlvbnMpXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIFxuICAgIGNvbnN0IG1hdGNoZWRDb21wZXRlbmNpZXMgPSBjb21wZXRlbmNpZXMuZmlsdGVyKGMgPT4ge1xuICAgICAgaWYgKCFjIHx8ICFjLmNvbXBldGVuY3lBcmVhTmFtZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgSW52YWxpZCBjb21wZXRlbmN5IHN0cnVjdHVyZSBpbiBjb3Vyc2UgJHtpbmRleH06YCwgYyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgY29tcGV0ZW5jeUFyZWEgPSBjLmNvbXBldGVuY3lBcmVhTmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIGJvdGggXCJiZWhhdmlvcmFsXCIgYW5kIFwiYmVoYXZpb3VyYWxcIiBzcGVsbGluZ3NcbiAgICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gJ2JlaGF2aW91cmFsJyB8fCBub3JtYWxpemVkVHlwZSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICAgIHJldHVybiBjb21wZXRlbmN5QXJlYSA9PT0gJ2JlaGF2aW9yYWwnIHx8IGNvbXBldGVuY3lBcmVhID09PSAnYmVoYXZpb3VyYWwnO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3Igb3RoZXIgdHlwZXMsIGRvIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIGNvbXBldGVuY3lBcmVhID09PSBub3JtYWxpemVkVHlwZTtcbiAgICB9KTtcbiAgICBcbi8vICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke21hdGNoZWRDb21wZXRlbmNpZXMubGVuZ3RofSBjb21wZXRlbmNpZXMgb2YgdHlwZSAke3R5cGV9IGZvciBjb3Vyc2UgJHtpbmRleH06YCwgbWF0Y2hlZENvbXBldGVuY2llcyk7XG4gICAgcmV0dXJuIG1hdGNoZWRDb21wZXRlbmNpZXM7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55W10ge1xuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IHRoaXMuZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKHR5cGUsIGluZGV4KTtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG5cbiAgICBpZiAodGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldKSB7XG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wZXRlbmNpZXMuc2xpY2UoMCwgMik7XG4gIH1cblxuICB0b2dnbGVDb21wZXRlbmNpZXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7aW5kZXh9LSR7dHlwZX1gO1xuICAgIHRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XSA9ICF0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV07XG4gIH1cblxuICBpc0V4cGFuZGVkKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IGAke2luZGV4fS0ke3R5cGV9YDtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldIHx8IGZhbHNlO1xuICB9XG5cbiAgaGFzTW9yZVRoYW5Ud28odHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKHR5cGUsIGluZGV4KS5sZW5ndGggPiAyO1xuICB9XG5cbiAgZ2V0UmVtYWluaW5nQ291bnQodHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbENvdW50ID0gdGhpcy5nZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZSwgaW5kZXgpLmxlbmd0aDtcbiAgICByZXR1cm4gdG90YWxDb3VudCAtIDI7XG4gIH1cblxuXG59XG4iLCI8ZGl2IGNsYXNzPVwic2VjdGlvbi1jb250YWluZXIgbXQtMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3V0c2lkZS1sYXllci10b3RhbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc2lkZS1sYXllclwiPlxuICAgICAgICAgICAgICAgIFRvdGFsIENvdXJzZXNcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+XG4gICAgICAgICAgICAgICAge3tjb21wZXRlbmNpZXNDb3VudD8udG90YWx9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3V0c2lkZS1sYXllci10b3RhbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc2lkZS1sYXllclwiPlxuICAgICAgICAgICAgICAgIGlHT1QgUGxhdGZvcm0gQ291cnNlc1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj5cbiAgICAgICAgICAgICAgICB7e2NvbXBldGVuY2llc0NvdW50Py5pZ290fX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm91dHNpZGUtbGF5ZXItdG90YWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNpZGUtbGF5ZXJcIj5cbiAgICAgICAgICAgICAgICBQdWJsaWMgQ291cnNlc1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj5cbiAgICAgICAgICAgICAgICB7e2NvbXBldGVuY2llc0NvdW50Py5wdWJsaWNfY291cnNlc319XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS00XCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1saXN0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1saXN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJkQ291cnNlcztsZXQgaT1pbmRleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2VkLWNvdXJzZS1jb250YWluZXJcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2NvdXJzZS5zdmdcIj48L3NwYW4+Jm5ic3A7PHNwYW4+Q291cnNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LnJhdGlvbmFsZSAmJiAhaXRlbT8uaXNfcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1ncmVlbi10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFJIFJlY29tbWVuZGVkIC0gaUdPVCA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3Bhbj5QbGF0Zm9ybSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb3ZpZGVyIC0ge3tpdGVtPy5vcmdhbmlzYXRpb25bMF19fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LnJhdGlvbmFsZSAmJiBpdGVtPy5pc19wdWJsaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1wdWJsaWMtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZCAtIFB1YmxpYyA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3Bhbj5QbGF0Zm9ybSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb3ZpZGVyIC0ge3tpdGVtPy5vcmdhbmlzYXRpb25bMF19fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtPy5yYXRpb25hbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JheS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1QgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/LnBsYXRmb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIFtocmVmXT1cIml0ZW0/LnB1YmxpY19saW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8ucGxhdGZvcm19fTwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/Lm9yZ2FuaXNhdGlvbj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9uWzBdfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS10aXRsZSBtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8uY291cnNlXCI+e3tpdGVtPy5jb3Vyc2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/Lm5hbWVcIj57e2l0ZW0/Lm5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWRlc2MgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2l0ZW0/LnJhdGlvbmFsZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0JlaGF2aW91cmFsJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+QmVoYXZpb3JhbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImJlaGF2aW91cmFsLXBpbGxcIiAqbmdGb3I9XCJsZXQgY29tcCBvZiBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXMoJ0JlaGF2aW91cmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0XCI+IHt7IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuY29tcGV0ZW5jeVN1YlRoZW1lTmFtZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0JlaGF2aW91cmFsJyxpKVwiIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNob3ctbW9yZS1saW5rIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnQmVoYXZpb3VyYWwnLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzRXhwYW5kZWQoJ0JlaGF2aW91cmFsJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nQ291bnQoJ0JlaGF2aW91cmFsJyxpKSArICcgTW9yZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0Z1bmN0aW9uYWwnLGkpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktc3ViLWhlYWRpbmdcIj5GdW5jdGlvbmFsIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3QgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnVuY3Rpb25hbC1waWxsXCIgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdGdW5jdGlvbmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0XCI+IHt7IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuY29tcGV0ZW5jeVN1YlRoZW1lTmFtZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0Z1bmN0aW9uYWwnLGkpXCIgY2xhc3M9XCJzaG93LW1vcmUtY29tcGV0ZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29tcGV0ZW5jaWVzKCdGdW5jdGlvbmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdGdW5jdGlvbmFsJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nQ291bnQoJ0Z1bmN0aW9uYWwnLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdJZj1cImdldENvbXBldGVuY2llc0J5VHlwZSgnRG9tYWluJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+RG9tYWluIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3QgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZG9tYWluLXBpbGxcIiAqbmdGb3I9XCJsZXQgY29tcCBvZiBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXMoJ0RvbWFpbicsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImhhc01vcmVUaGFuVHdvKCdEb21haW4nLGkpXCIgY2xhc3M9XCJzaG93LW1vcmUtY29tcGV0ZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29tcGV0ZW5jaWVzKCdEb21haW4nLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzRXhwYW5kZWQoJ0RvbWFpbicsaSkgPyAnU2hvdyBMZXNzJyA6ICcrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdEb21haW4nLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3lcIj5SZWxldmFuY3k8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXNoXCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIiAqbmdJZj1cIml0ZW0/LnJlbGV2YW5jeVwiPnt7aXRlbT8ucmVsZXZhbmN5fX0lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiICpuZ0lmPVwiIWl0ZW0/LnJlbGV2YW5jeVwiPk4vQTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jaWVzLW1hdGNoZWQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY2llcy1tYXRjaGVkXCI+Q29tcGV0ZW5jaWVzIE1hdGNoZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiPjgwJTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY291cnNlLWxpc3QtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsLXRleHRcIj5Db3Vyc2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pk1hdGVybmFsLCBJbmZhbnQgQW5kIFlvdW5nIENoaWxkIE51dHJpdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWRlc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5UaGlzIENvdXJzZSBkaXJlY3RseSBhZGRyZXNzZXMgYSBwcmltYXJ5IHJlc3BvbnNpYmlsaXR5IG9mIEFuZ2Fud2FuZGkgQ2FyZSB0YWtlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgYW5kIGVkdWNhdGUgb24gbnV0cml0aW9uIGZvciBtb3RoZXIgYW5kIHlvdW5nIGNoaWxkcmVuPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3lcIj5SZWxldmFuY3k8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiPjkwJTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY2llcy1tYXRjaGVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmNpZXMtbWF0Y2hlZFwiPkNvbXBldGVuY2llcyBNYXRjaGVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhc2hcIj4tPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIj44MCU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
446
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUF3QnpELE1BQU0sT0FBTyxxQ0FBcUM7SUF1QmhELFlBQ1UsYUFBNEIsRUFDNUIsTUFBaUIsRUFDakIsUUFBcUI7UUFGckIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBdEIvQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUczQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLG1CQUFjLEdBQVUsRUFBRSxDQUFDO1FBQzNCLHdCQUFtQixHQUFVLEVBQUUsQ0FBQztRQUVoQyxzQkFBaUIsR0FBRztZQUNsQixLQUFLLEVBQUUsQ0FBQztZQUNSLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLElBQUksRUFBRSxDQUFDO1NBQ1IsQ0FBQztRQUVGLHlCQUFvQixHQUErQixFQUFFLENBQUM7UUFFdEQsc0RBQXNEO1FBQ3RELHFCQUFnQixHQUE2QyxFQUFF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QUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQztZQUM1QixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUMzQyxNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUVqRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDOytHQWhrQlUscUNBQXFDO21HQUFyQyxxQ0FBcUMsNkdDeEJsRCxtcWFBMFBNOzs0RkRsT08scUNBQXFDO2tCQUxqRCxTQUFTOytCQUNFLHFDQUFxQztzSkFNdEMsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5cbnR5cGUgR2FwU3RhdHVzID0gJ0ZVTEwnIHwgJ1BBUlRJQUwnIHwgJ05PX01BVENIJztcblxuaW50ZXJmYWNlIEdhcEFuYWx5c2lzUmVzdWx0IHtcbiAgYXJlYTogc3RyaW5nO1xuICB0aGVtZTogc3RyaW5nO1xuICBzdWJ0aGVtZTogc3RyaW5nO1xuICBwcm9maWNpZW5jeUxldmVsOiBzdHJpbmc7XG4gIGN1cnJlbnRMZXZlbDogc3RyaW5nO1xuICByZXF1aXJlZExldmVsOiBzdHJpbmc7XG4gIGNvdXJzZUxldmVsOiBzdHJpbmc7XG4gIHN0YXR1czogR2FwU3RhdHVzO1xuICByZWFzb246IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWdhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBHYXBBbmFseXNpc1JlY29tbWVuZGVkQ291cnNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBwbGFuRGF0YTogYW55O1xuXG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgcmVjb21tZW5kZWRfY291cnNlX2lkID0gJyc7XG4gIGNicFBsYW5EYXRhOiBhbnk7XG5cbiAgc2VhcmNoVGV4dCA9ICcnO1xuICBmaWx0ZXJkQ291cnNlczogYW55W10gPSBbXTtcbiAgc2VsZWN0RmlsdGVyQ291cnNlczogYW55W10gPSBbXTtcblxuICBjb21wZXRlbmNpZXNDb3VudCA9IHtcbiAgICB0b3RhbDogMCxcbiAgICBwdWJsaWNfY291cnNlczogMCxcbiAgICBpZ290OiAwXG4gIH07XG5cbiAgZXhwYW5kZWRDb21wZXRlbmNpZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgLy8gR2FwIHJlc3VsdHMgZm9yIGVhY2ggY291cnNlLCBrZXllZCBieSBjb3Vyc2UgaW5kZXguXG4gIGNvdXJzZUdhcFJlc3VsdHM6IHsgW2luZGV4OiBudW1iZXJdOiBHYXBBbmFseXNpc1Jlc3VsdFtdIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhclxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNicFBsYW5EYXRhID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iajtcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSZWNvbW1lbmRlZENvdXJzZSh0aGlzLnBsYW5EYXRhLmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCA9IHJlcz8uaWQgfHwgJyc7XG5cbiAgICAgICAgY29uc3QgYWxsQ291cnNlczogYW55W10gPSBbXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXM/LmZpbHRlcmVkX2NvdXJzZXMpKSB7XG4gICAgICAgICAgcmVzLmZpbHRlcmVkX2NvdXJzZXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBSZWxldmFuY3kgcmVtYWlucyB0aGUgaW5pdGlhbCBjb3Vyc2UgcmVjb21tZW5kYXRpb24gZmlsdGVyLlxuICAgICAgICAgICAgLy8gR2FwIGFuYWx5c2lzIGlzIHBlcmZvcm1lZCBzZXBhcmF0ZWx5IHVzaW5nIEFyZWEgKyBUaGVtZSArXG4gICAgICAgICAgICAvLyBTdWJ0aGVtZSArIGNvdXJzZV9sZXZlbC5cbiAgICAgICAgICAgIGlmIChOdW1iZXIoaXRlbT8ucmVsZXZhbmN5IHx8IDApID4gNzUpIHtcbiAgICAgICAgICAgICAgYWxsQ291cnNlcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IGFsbENvdXJzZXM7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb21wZXRlbmN5Q291bnRzKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQWxsQ291cnNlR2FwcygpO1xuICAgICAgICB0aGlzLmdldFVzZXJDb3Vyc2UoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHwgJ1VuYWJsZSB0byBsb2FkIHJlY29tbWVuZGVkIGNvdXJzZXMuJyxcbiAgICAgICAgICAnWCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVDb21wZXRlbmN5Q291bnRzKCk6IHZvaWQge1xuICAgIHRoaXMuY29tcGV0ZW5jaWVzQ291bnQgPSB7XG4gICAgICB0b3RhbDogdGhpcy5maWx0ZXJkQ291cnNlcy5sZW5ndGgsXG4gICAgICBwdWJsaWNfY291cnNlczogdGhpcy5maWx0ZXJkQ291cnNlcy5maWx0ZXIoYyA9PiBjPy5pc19wdWJsaWMpLmxlbmd0aCxcbiAgICAgIGlnb3Q6IHRoaXMuZmlsdGVyZENvdXJzZXMuZmlsdGVyKGMgPT4gIWM/LmlzX3B1YmxpYykubGVuZ3RoXG4gICAgfTtcbiAgfVxuXG4gIGdldFVzZXJDb3Vyc2UoKTogdm9pZCB7XG4gICAgY29uc3Qgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZDtcblxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0VXNlckNvdXJzZShyb2xlX21hcHBpbmdfaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykgJiYgcmVzLmxlbmd0aCkge1xuICAgICAgICAgIHJlcy5mb3JFYWNoKChjb3Vyc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcy5wdXNoKGNvdXJzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBldGVuY3lDb3VudHMoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBbGxDb3Vyc2VHYXBzKCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgJ2ZpbHRlcmRDb3Vyc2VzIGFmdGVyIGFkZGluZyB1c2VyIGNvdXJzZXM6JyxcbiAgICAgICAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcik7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY29tcGV0ZW5jaWVzIGZyb20gZWl0aGVyIGNvbXBldGVuY2llcyBvciBjb21wZXRlbmNpZXNfdjYuXG4gICAqL1xuICBnZXRDb3Vyc2VDb21wZXRlbmNpZXMoY291cnNlOiBhbnkpOiBhbnlbXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY291cnNlPy5jb21wZXRlbmNpZXMpKSB7XG4gICAgICByZXR1cm4gY291cnNlLmNvbXBldGVuY2llcztcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb3Vyc2U/LmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIHJldHVybiBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2O1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIG5vcm1hbGl6ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlID8/ICcnKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhbHVlIGZyb20gdGhlIHN1cHBsaWVkIGtleXMuXG4gICAqL1xuICBnZXRWYWx1ZShvYmplY3Q6IGFueSwga2V5czogc3RyaW5nW10pOiBhbnkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKFxuICAgICAgICBvYmplY3Rba2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIG9iamVjdFtrZXldICE9PSBudWxsICYmXG4gICAgICAgIFN0cmluZyhvYmplY3Rba2V5XSkudHJpbSgpICE9PSAnJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXRDb21wZXRlbmN5QXJlYShjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdjb21wZXRlbmN5QXJlYU5hbWUnLFxuICAgICAgJ2FyZWEnLFxuICAgICAgJ2NvbXBldGVuY3lfYXJlYScsXG4gICAgICAnY29tcGV0ZW5jeUFyZWEnXG4gICAgXSk7XG4gIH1cblxuICBnZXRDb21wZXRlbmN5VGhlbWUoY29tcGV0ZW5jeTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShjb21wZXRlbmN5LCBbXG4gICAgICAnY29tcGV0ZW5jeVRoZW1lTmFtZScsXG4gICAgICAndGhlbWUnLFxuICAgICAgJ2NvbXBldGVuY3lfdGhlbWUnLFxuICAgICAgJ2NvbXBldGVuY3lUaGVtZSdcbiAgICBdKTtcbiAgfVxuXG4gIGdldENvbXBldGVuY3lTdWJ0aGVtZShjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdjb21wZXRlbmN5U3VidGhlbWVOYW1lJyxcbiAgICAgICdzdWJ0aGVtZScsXG4gICAgICAnY29tcGV0ZW5jeV9zdWJ0aGVtZScsXG4gICAgICAnY29tcGV0ZW5jeVN1YnRoZW1lJ1xuICAgIF0pO1xuICB9XG5cbiAgZ2V0UHJvZmljaWVuY3lMZXZlbChjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdwcm9maWNpZW5jeV9sZXZlbCcsXG4gICAgICAncHJvZmljaWVuY3lMZXZlbCcsXG4gICAgICAncmVxdWlyZWRQcm9maWNpZW5jeScsXG4gICAgICAncmVxdWlyZWRfcHJvZmljaWVuY3knLFxuICAgICAgJ2N1cnJlbnRQcm9maWNpZW5jeScsXG4gICAgICAnY3VycmVudF9wcm9maWNpZW5jeSdcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJTVBPUlRBTlQ6XG4gICAqIGNvdXJzZV9sZXZlbCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBTVE8gbGV2ZWwgb2YgYSBjb3Vyc2UuXG4gICAqL1xuICBnZXRDb3Vyc2VMZXZlbChjb3Vyc2U6IGFueSwgY29tcGV0ZW5jeT86IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoY291cnNlLCBbJ2NvdXJzZV9sZXZlbCddKSB8fFxuICAgICAgdGhpcy5nZXRWYWx1ZShjb21wZXRlbmN5LCBbJ2NvdXJzZV9sZXZlbCddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyByb2xlIGNvbXBldGVuY3kgZGF0YSBmcm9tIHBsYW5EYXRhIC8gY2JwUGxhbkRhdGEuXG4gICAqL1xuICBnZXRSZXF1aXJlZENvbXBldGVuY2llcygpOiBhbnlbXSB7XG4gICAgY29uc3QgcG9zc2libGVTb3VyY2VzID0gW1xuICAgICAgdGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzLFxuICAgICAgdGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jeSxcbiAgICAgIHRoaXMucGxhbkRhdGE/LmNvbXBldGVuY3lfZGF0YSxcbiAgICAgIHRoaXMucGxhbkRhdGE/LnJvbGVfY29tcGV0ZW5jaWVzLFxuICAgICAgdGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzX3Y2LFxuICAgICAgdGhpcy5jYnBQbGFuRGF0YT8uY29tcGV0ZW5jaWVzLFxuICAgICAgdGhpcy5jYnBQbGFuRGF0YT8uY29tcGV0ZW5jeSxcbiAgICAgIHRoaXMuY2JwUGxhbkRhdGE/LnJvbGVfY29tcGV0ZW5jaWVzXG4gICAgXTtcblxuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHBvc3NpYmxlU291cmNlcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSAmJiBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0UmVxdWlyZWRMZXZlbChjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdyZXF1aXJlZFByb2ZpY2llbmN5JyxcbiAgICAgICdyZXF1aXJlZF9wcm9maWNpZW5jeScsXG4gICAgICAncmVxdWlyZWRMZXZlbCcsXG4gICAgICAncmVxdWlyZWRfbGV2ZWwnLFxuICAgICAgJ3Byb2ZpY2llbmN5TGV2ZWwnLFxuICAgICAgJ3Byb2ZpY2llbmN5X2xldmVsJyxcbiAgICAgICdsZXZlbCcsXG4gICAgICAnc3RvTGV2ZWwnLFxuICAgICAgJ3N0b19sZXZlbCdcbiAgICBdKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRMZXZlbChjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdjdXJyZW50UHJvZmljaWVuY3knLFxuICAgICAgJ2N1cnJlbnRfcHJvZmljaWVuY3knLFxuICAgICAgJ2N1cnJlbnRMZXZlbCcsXG4gICAgICAnY3VycmVudF9sZXZlbCcsXG4gICAgICAnY3VycmVudFByb2ZpY2llbmN5TGV2ZWwnLFxuICAgICAgJ2N1cnJlbnRfcHJvZmljaWVuY3lfbGV2ZWwnXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogU1RPIGhpZXJhcmNoeTpcbiAgICogT3BlcmF0aW9uYWwgPCBUYWN0aWNhbCA8IFN0cmF0ZWdpY1xuICAgKi9cbiAgZ2V0TGV2ZWxSYW5rKGxldmVsOiBhbnkpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5ub3JtYWxpemUobGV2ZWwpKSB7XG4gICAgICBjYXNlICdvcGVyYXRpb25hbCc6XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgY2FzZSAndGFjdGljYWwnOlxuICAgICAgICByZXR1cm4gMjtcbiAgICAgIGNhc2UgJ3N0cmF0ZWdpYyc6XG4gICAgICAgIHJldHVybiAzO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hdGNoIGNvdXJzZSBjb21wZXRlbmN5IHRvIHJvbGUgY29tcGV0ZW5jeSB1c2luZzpcbiAgICogQXJlYSAtPiBUaGVtZSAtPiBTdWJ0aGVtZVxuICAgKlxuICAgKiBUaGVuIGNvbXBhcmUgdGhlIGNvdXJzZSdzIGNvdXJzZV9sZXZlbCB3aXRoIHRoZSByZXF1aXJlZCBsZXZlbC5cbiAgICovXG4gIGNhbGN1bGF0ZUNvdXJzZUdhcHMoY291cnNlOiBhbnkpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICBjb25zdCByZXF1aXJlZENvbXBldGVuY2llcyA9IHRoaXMuZ2V0UmVxdWlyZWRDb21wZXRlbmNpZXMoKTtcblxuICAgIGlmICghcmVxdWlyZWRDb21wZXRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgY291cnNlQ29tcGV0ZW5jaWVzID0gdGhpcy5nZXRDb3Vyc2VDb21wZXRlbmNpZXMoY291cnNlKTtcbiAgICBjb25zdCByZXN1bHRzOiBHYXBBbmFseXNpc1Jlc3VsdFtdID0gW107XG5cbiAgICBjb3Vyc2VDb21wZXRlbmNpZXMuZm9yRWFjaCgoY291cnNlQ29tcGV0ZW5jeTogYW55KSA9PiB7XG4gICAgICBjb25zdCBjb3Vyc2VBcmVhID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeUFyZWEoY291cnNlQ29tcGV0ZW5jeSlcbiAgICAgICk7XG4gICAgICBjb25zdCBjb3Vyc2VUaGVtZSA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldENvbXBldGVuY3lUaGVtZShjb3Vyc2VDb21wZXRlbmN5KVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvdXJzZVN1YnRoZW1lID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeVN1YnRoZW1lKGNvdXJzZUNvbXBldGVuY3kpXG4gICAgICApO1xuXG4gICAgICBpZiAoIWNvdXJzZVRoZW1lIHx8ICFjb3Vyc2VTdWJ0aGVtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvdXJzZUxldmVsID0gdGhpcy5nZXRDb3Vyc2VMZXZlbChjb3Vyc2UsIGNvdXJzZUNvbXBldGVuY3kpO1xuXG4gICAgICByZXF1aXJlZENvbXBldGVuY2llcy5mb3JFYWNoKChyZXF1aXJlZENvbXBldGVuY3k6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWlyZWRBcmVhID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeUFyZWEocmVxdWlyZWRDb21wZXRlbmN5KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVxdWlyZWRUaGVtZSA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldENvbXBldGVuY3lUaGVtZShyZXF1aXJlZENvbXBldGVuY3kpXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXF1aXJlZFN1YnRoZW1lID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeVN1YnRoZW1lKHJlcXVpcmVkQ29tcGV0ZW5jeSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlcXVpcmVkUHJvZmljaWVuY3lMZXZlbCA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldFByb2ZpY2llbmN5TGV2ZWwocmVxdWlyZWRDb21wZXRlbmN5KVxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXF1aXJlZFRoZW1lIHx8ICFyZXF1aXJlZFN1YnRoZW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY291cnNlUHJvZmljaWVuY3lMZXZlbCA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldFByb2ZpY2llbmN5TGV2ZWwoY291cnNlQ29tcGV0ZW5jeSlcbiAgICAgICk7XG5cbiAgICAgIC8qXG4gICAgICAqIE1hdGNoOlxuICAgICAgKiBBcmVhICsgVGhlbWUgKyBTdWJ0aGVtZSArIFByb2ZpY2llbmN5IExldmVsXG4gICAgICAqL1xuXG4gICAgICBjb25zdCBhcmVhTWF0Y2hlcyA9XG4gICAgICAgICFjb3Vyc2VBcmVhIHx8XG4gICAgICAgICFyZXF1aXJlZEFyZWEgfHxcbiAgICAgICAgY291cnNlQXJlYSA9PT0gcmVxdWlyZWRBcmVhO1xuXG4gICAgICBjb25zdCB0aGVtZU1hdGNoZXMgPVxuICAgICAgICBjb3Vyc2VUaGVtZSA9PT0gcmVxdWlyZWRUaGVtZTtcblxuICAgICAgY29uc3Qgc3VidGhlbWVNYXRjaGVzID1cbiAgICAgICAgY291cnNlU3VidGhlbWUgPT09IHJlcXVpcmVkU3VidGhlbWU7XG5cbiAgICAgIGNvbnN0IHByb2ZpY2llbmN5TGV2ZWxNYXRjaGVzID1cbiAgICAgICAgY291cnNlUHJvZmljaWVuY3lMZXZlbCA9PT0gcmVxdWlyZWRQcm9maWNpZW5jeUxldmVsO1xuXG4gICAgICAvKlxuICAgICAgKiBBbGwgNCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2guXG4gICAgICAqXG4gICAgICAqIElmIGFsbCA0IG1hdGNoOlxuICAgICAgKiAgICAgTk9UIHBhcnQgb2YgZ2FwXG4gICAgICAqXG4gICAgICAqIElmIGFueSBvbmUgZG9lcyBub3QgbWF0Y2g6XG4gICAgICAqICAgICBQQVJUIG9mIGdhcFxuICAgICAgKi9cbiAgICAgIGNvbnN0IGFsbEZvdXJNYXRjaCA9XG4gICAgICAgIGFyZWFNYXRjaGVzICYmXG4gICAgICAgIHRoZW1lTWF0Y2hlcyAmJlxuICAgICAgICBzdWJ0aGVtZU1hdGNoZXMgJiZcbiAgICAgICAgcHJvZmljaWVuY3lMZXZlbE1hdGNoZXM7XG5cbiAgICAgIGNvbnN0IHJlcXVpcmVkTGV2ZWwgPSB0aGlzLmdldFJlcXVpcmVkTGV2ZWwocmVxdWlyZWRDb21wZXRlbmN5KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IHRoaXMuZ2V0Q3VycmVudExldmVsKHJlcXVpcmVkQ29tcGV0ZW5jeSk7XG5cbiAgICAgIGNvbnN0IHJlcXVpcmVkUmFuayA9IHRoaXMuZ2V0TGV2ZWxSYW5rKHJlcXVpcmVkTGV2ZWwpO1xuICAgICAgY29uc3QgY291cnNlUmFuayA9IHRoaXMuZ2V0TGV2ZWxSYW5rKGNvdXJzZUxldmVsKTtcblxuICAgICAgbGV0IHN0YXR1czogR2FwU3RhdHVzO1xuICAgICAgbGV0IHJlYXNvbjogc3RyaW5nO1xuXG4gICAgICBpZiAoYWxsRm91ck1hdGNoKSB7XG4gICAgICAgIC8qXG4gICAgICAgICogQWxsIGZvdXIgY29tcGV0ZW5jeSBhdHRyaWJ1dGVzIG1hdGNoLlxuICAgICAgICAqIFRoZXJlZm9yZSB0aGlzIGNvbXBldGVuY3kgaXMgTk9UIHBhcnQgb2YgdGhlIGdhcC5cbiAgICAgICAgKi9cbiAgICAgICAgc3RhdHVzID0gJ0ZVTEwnO1xuXG4gICAgICAgIHJlYXNvbiA9XG4gICAgICAgICAgJ0NvbXBldGVuY3kgQXJlYSwgVGhlbWUsIFN1YnRoZW1lIGFuZCBQcm9maWNpZW5jeSBMZXZlbCBhbGwgbWF0Y2guIFRoaXMgY29tcGV0ZW5jeSBpcyBub3QgcGFydCBvZiB0aGUgZ2FwLic7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qXG4gICAgICAgICogQXQgbGVhc3Qgb25lIG9mIHRoZSBmb3VyIGF0dHJpYnV0ZXMgZG9lcyBub3QgbWF0Y2guXG4gICAgICAgICogVGhlcmVmb3JlIHRoaXMgY29tcGV0ZW5jeSBpcyBwYXJ0IG9mIHRoZSBnYXAuXG4gICAgICAgICovXG5cbiAgICAgICAgY29uc3QgbWlzbWF0Y2hlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAoIWFyZWFNYXRjaGVzKSB7XG4gICAgICAgICAgbWlzbWF0Y2hlcy5wdXNoKCdDb21wZXRlbmN5IEFyZWEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhlbWVNYXRjaGVzKSB7XG4gICAgICAgICAgbWlzbWF0Y2hlcy5wdXNoKCdUaGVtZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdWJ0aGVtZU1hdGNoZXMpIHtcbiAgICAgICAgICBtaXNtYXRjaGVzLnB1c2goJ1N1YnRoZW1lJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb2ZpY2llbmN5TGV2ZWxNYXRjaGVzKSB7XG4gICAgICAgICAgbWlzbWF0Y2hlcy5wdXNoKCdQcm9maWNpZW5jeSBMZXZlbCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdHVzID0gJ05PX01BVENIJztcblxuICAgICAgICByZWFzb24gPVxuICAgICAgICAgIGAke21pc21hdGNoZXMuam9pbignLCAnKX0gJHttaXNtYXRjaGVzLmxlbmd0aCA9PT0gMSA/ICdkb2VzJyA6ICdkbyd9IG5vdCBtYXRjaC4gVGhpcyBjb21wZXRlbmN5IGlzIHBhcnQgb2YgdGhlIGdhcC5gO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBhcmVhOiB0aGlzLmdldENvbXBldGVuY3lBcmVhKHJlcXVpcmVkQ29tcGV0ZW5jeSksXG4gICAgICAgIHRoZW1lOiB0aGlzLmdldENvbXBldGVuY3lUaGVtZShyZXF1aXJlZENvbXBldGVuY3kpLFxuICAgICAgICBzdWJ0aGVtZTogdGhpcy5nZXRDb21wZXRlbmN5U3VidGhlbWUocmVxdWlyZWRDb21wZXRlbmN5KSxcbiAgICAgICAgcHJvZmljaWVuY3lMZXZlbDogdGhpcy5nZXRQcm9maWNpZW5jeUxldmVsKHJlcXVpcmVkQ29tcGV0ZW5jeSksXG4gICAgICAgIGN1cnJlbnRMZXZlbCxcbiAgICAgICAgcmVxdWlyZWRMZXZlbCxcbiAgICAgICAgY291cnNlTGV2ZWwsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnJlbW92ZUR1cGxpY2F0ZUdhcFJlc3VsdHMocmVzdWx0cyk7XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVHYXBSZXN1bHRzKFxuICAgIHJlc3VsdHM6IEdhcEFuYWx5c2lzUmVzdWx0W11cbiAgKTogR2FwQW5hbHlzaXNSZXN1bHRbXSB7XG4gICAgY29uc3QgdW5pcXVlID0gbmV3IE1hcDxzdHJpbmcsIEdhcEFuYWx5c2lzUmVzdWx0PigpO1xuXG4gICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBbXG4gICAgICAgIHRoaXMubm9ybWFsaXplKHJlc3VsdC5hcmVhKSxcbiAgICAgICAgdGhpcy5ub3JtYWxpemUocmVzdWx0LnRoZW1lKSxcbiAgICAgICAgdGhpcy5ub3JtYWxpemUocmVzdWx0LnN1YnRoZW1lKSxcbiAgICAgICAgdGhpcy5ub3JtYWxpemUocmVzdWx0LnByb2ZpY2llbmN5TGV2ZWwpLFxuICAgICAgICB0aGlzLm5vcm1hbGl6ZShyZXN1bHQucmVxdWlyZWRMZXZlbCksXG4gICAgICAgIHRoaXMubm9ybWFsaXplKHJlc3VsdC5jb3Vyc2VMZXZlbClcbiAgICAgIF0uam9pbignfCcpO1xuXG4gICAgICBpZiAoIXVuaXF1ZS5oYXMoa2V5KSkge1xuICAgICAgICB1bmlxdWUuc2V0KGtleSwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZS52YWx1ZXMoKSk7XG4gIH1cblxuICBjYWxjdWxhdGVBbGxDb3Vyc2VHYXBzKCk6IHZvaWQge1xuICAgIHRoaXMuY291cnNlR2FwUmVzdWx0cyA9IHt9O1xuXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcy5mb3JFYWNoKChjb3Vyc2UsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLmNvdXJzZUdhcFJlc3VsdHNbaW5kZXhdID0gdGhpcy5jYWxjdWxhdGVDb3Vyc2VHYXBzKGNvdXJzZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5jb3Vyc2VHYXBSZXN1bHRzW2luZGV4XSB8fCBbXTtcbiAgfVxuXG4gIGdldEZ1bGxNYXRjaGVzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4KVxuICAgICAgLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ0ZVTEwnKTtcbiAgfVxuXG4gIGdldFBhcnRpYWxNYXRjaGVzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4KVxuICAgICAgLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ1BBUlRJQUwnKTtcbiAgfVxuXG4gIGdldE5vTWF0Y2hlcyhpbmRleDogbnVtYmVyKTogR2FwQW5hbHlzaXNSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q291cnNlR2FwUmVzdWx0cyhpbmRleClcbiAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdOT19NQVRDSCcpO1xuICB9XG5cbiAgaGFzR2FwTWF0Y2goaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvdXJzZUdhcFJlc3VsdHMoaW5kZXgpLnNvbWUoXG4gICAgICByZXN1bHQgPT5cbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9PT0gJ0ZVTEwnIHx8XG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPT09ICdQQVJUSUFMJ1xuICAgICk7XG4gIH1cblxuICBnZXRDb3Vyc2VHYXBTdGF0dXMoaW5kZXg6IG51bWJlcik6IEdhcFN0YXR1cyB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ2V0Q291cnNlR2FwUmVzdWx0cyhpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0cy5zb21lKHJlc3VsdCA9PiByZXN1bHQuc3RhdHVzID09PSAnRlVMTCcpKSB7XG4gICAgICByZXR1cm4gJ0ZVTEwnO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRzLnNvbWUocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdQQVJUSUFMJykpIHtcbiAgICAgIHJldHVybiAnUEFSVElBTCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdOT19NQVRDSCc7XG4gIH1cblxuICBnZXRDb3Vyc2VHYXBTdGF0dXNMYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMuZ2V0Q291cnNlR2FwU3RhdHVzKGluZGV4KSkge1xuICAgICAgY2FzZSAnRlVMTCc6XG4gICAgICAgIHJldHVybiAnRnVsbCBHYXAgTWF0Y2gnO1xuICAgICAgY2FzZSAnUEFSVElBTCc6XG4gICAgICAgIHJldHVybiAnUGFydGlhbCBHYXAgTWF0Y2gnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdObyBHYXAgTWF0Y2gnO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgY29uc3QgY291cnNlID0gdGhpcy5maWx0ZXJkQ291cnNlc1tpbmRleF07XG5cbiAgICBpZiAoIWNvdXJzZSkge1xuICAgICAgY29uc29sZS5sb2coYE5vIGNvdXJzZSBmb3VuZCBhdCBpbmRleCAke2luZGV4fWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IHRoaXMuZ2V0Q291cnNlQ29tcGV0ZW5jaWVzKGNvdXJzZSk7XG5cbiAgICBpZiAoIWNvbXBldGVuY2llcy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBObyBjb21wZXRlbmNpZXMgZm91bmQgZm9yIGNvdXJzZSAke2luZGV4fSBhbmQgdHlwZSAke3R5cGV9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZSh0eXBlKTtcblxuICAgIHJldHVybiBjb21wZXRlbmNpZXMuZmlsdGVyKChjOiBhbnkpID0+IHtcbiAgICAgIGlmICghYyB8fCAhdGhpcy5nZXRDb21wZXRlbmN5QXJlYShjKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBldGVuY3lBcmVhID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeUFyZWEoYylcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbm9ybWFsaXplZFR5cGUgPT09ICdiZWhhdmlvdXJhbCcgfHxcbiAgICAgICAgbm9ybWFsaXplZFR5cGUgPT09ICdiZWhhdmlvcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29tcGV0ZW5jeUFyZWEgPT09ICdiZWhhdmlvcmFsJyB8fFxuICAgICAgICAgIGNvbXBldGVuY3lBcmVhID09PSAnYmVoYXZpb3VyYWwnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wZXRlbmN5QXJlYSA9PT0gbm9ybWFsaXplZFR5cGU7XG4gICAgfSk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55W10ge1xuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IHRoaXMuZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKHR5cGUsIGluZGV4KTtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG5cbiAgICBpZiAodGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldKSB7XG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wZXRlbmNpZXMuc2xpY2UoMCwgMik7XG4gIH1cblxuICB0b2dnbGVDb21wZXRlbmNpZXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7aW5kZXh9LSR7dHlwZX1gO1xuICAgIHRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XSA9XG4gICAgICAhdGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldO1xuICB9XG5cbiAgaXNFeHBhbmRlZCh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XSB8fCBmYWxzZTtcbiAgfVxuXG4gIGhhc01vcmVUaGFuVHdvKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCkubGVuZ3RoID4gMjtcbiAgfVxuXG4gIGdldFJlbWFpbmluZ0NvdW50KHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWxDb3VudCA9XG4gICAgICB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KHRvdGFsQ291bnQgLSAyLCAwKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGFpbmVyIG10LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm91dHNpZGUtbGF5ZXItdG90YWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNpZGUtbGF5ZXJcIj5cbiAgICAgICAgICAgICAgICBUb3RhbCBDb3Vyc2VzXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudFwiPlxuICAgICAgICAgICAgICAgIHt7Y29tcGV0ZW5jaWVzQ291bnQ/LnRvdGFsfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm91dHNpZGUtbGF5ZXItdG90YWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNpZGUtbGF5ZXJcIj5cbiAgICAgICAgICAgICAgICBpR09UIFBsYXRmb3JtIENvdXJzZXNcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+XG4gICAgICAgICAgICAgICAge3tjb21wZXRlbmNpZXNDb3VudD8uaWdvdH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvdXRzaWRlLWxheWVyLXRvdGFsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zaWRlLWxheWVyXCI+XG4gICAgICAgICAgICAgICAgUHVibGljIENvdXJzZXNcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+XG4gICAgICAgICAgICAgICAge3tjb21wZXRlbmNpZXNDb3VudD8ucHVibGljX2NvdXJzZXN9fVxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktNFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtbGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZENvdXJzZXM7bGV0IGk9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tlZC1jb3Vyc2UtY29udGFpbmVyXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9jb3Vyc2Uuc3ZnXCI+PC9zcGFuPiZuYnNwOzxzcGFuPkNvdXJzZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgUmVjb21tZW5kZWQ8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5yYXRpb25hbGUgJiYgIWl0ZW0/LmlzX3B1YmxpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1ncmVlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JlZW4tdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZCAtIGlHT1QgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/LnBsYXRmb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIFtocmVmXT1cIml0ZW0/LnB1YmxpY19saW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8ucGxhdGZvcm19fTwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/Lm9yZ2FuaXNhdGlvbj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9uWzBdfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5yYXRpb25hbGUgJiYgaXRlbT8uaXNfcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLXB1YmxpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtcHVibGljLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgUmVjb21tZW5kZWQgLSBQdWJsaWMgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/LnBsYXRmb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIFtocmVmXT1cIml0ZW0/LnB1YmxpY19saW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8ucGxhdGZvcm19fTwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/Lm9yZ2FuaXNhdGlvbj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9uWzBdfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbT8ucmF0aW9uYWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyYXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyYXktdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5NYW51YWxseSBTdWdnZXN0ZWQgLSBpR09UIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5wbGF0Zm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBbaHJlZl09XCJpdGVtPy5wdWJsaWNfbGlua1wiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuPlBsYXRmb3JtIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0/LnBsYXRmb3JtfX08L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5vcmdhbmlzYXRpb24/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UHJvdmlkZXIgLSB7e2l0ZW0/Lm9yZ2FuaXNhdGlvblswXX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtdGl0bGUgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmNvdXJzZVwiPnt7aXRlbT8uY291cnNlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5uYW1lXCI+e3tpdGVtPy5uYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1kZXNjIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tpdGVtPy5yYXRpb25hbGV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdCZWhhdmlvdXJhbCcsaSk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJiZWhhdmlvdXJhbC1waWxsXCIgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdCZWhhdmlvdXJhbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImhhc01vcmVUaGFuVHdvKCdCZWhhdmlvdXJhbCcsaSlcIiBjbGFzcz1cInNob3ctbW9yZS1jb21wZXRlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaG93LW1vcmUtbGluayBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJ0b2dnbGVDb21wZXRlbmNpZXMoJ0JlaGF2aW91cmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdCZWhhdmlvdXJhbCcsaSkgPyAnU2hvdyBMZXNzJyA6ICcrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdCZWhhdmlvdXJhbCcsaSkgKyAnIE1vcmUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdGdW5jdGlvbmFsJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+RnVuY3Rpb25hbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZ1bmN0aW9uYWwtcGlsbFwiICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldERpc3BsYXllZENvbXBldGVuY2llcygnRnVuY3Rpb25hbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImhhc01vcmVUaGFuVHdvKCdGdW5jdGlvbmFsJyxpKVwiIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNob3ctbW9yZS1saW5rIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnRnVuY3Rpb25hbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXNFeHBhbmRlZCgnRnVuY3Rpb25hbCcsaSkgPyAnU2hvdyBMZXNzJyA6ICcrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdGdW5jdGlvbmFsJyxpKSArICcgTW9yZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0RvbWFpbicsaSk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkRvbWFpbiBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRvbWFpbi1waWxsXCIgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdEb21haW4nLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHRcIj4ge3sgY29tcC5jb21wZXRlbmN5VGhlbWVOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5jb21wZXRlbmN5U3ViVGhlbWVOYW1lIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJoYXNNb3JlVGhhblR3bygnRG9tYWluJyxpKVwiIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNob3ctbW9yZS1saW5rIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnRG9tYWluJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdEb21haW4nLGkpID8gJ1Nob3cgTGVzcycgOiAnKycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZW1haW5pbmdDb3VudCgnRG9tYWluJyxpKSArICcgTW9yZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3ktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5XCI+UmVsZXZhbmN5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlXCIgKm5nSWY9XCJpdGVtPy5yZWxldmFuY3lcIj57e2l0ZW0/LnJlbGV2YW5jeX19JTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIiAqbmdJZj1cIiFpdGVtPy5yZWxldmFuY3lcIj5OL0E8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY2llcy1tYXRjaGVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmNpZXMtbWF0Y2hlZFwiPkNvbXBldGVuY2llcyBNYXRjaGVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhc2hcIj4tPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIj44MCU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvdXJzZS1saXN0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbC10ZXh0XCI+Q291cnNlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgUmVjb21tZW5kZWQ8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5NYXRlcm5hbCwgSW5mYW50IEFuZCBZb3VuZyBDaGlsZCBOdXRyaXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1kZXNjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+VGhpcyBDb3Vyc2UgZGlyZWN0bHkgYWRkcmVzc2VzIGEgcHJpbWFyeSByZXNwb25zaWJpbGl0eSBvZiBBbmdhbndhbmRpIENhcmUgdGFrZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm92aWRlIGFuZCBlZHVjYXRlIG9uIG51dHJpdGlvbiBmb3IgbW90aGVyIGFuZCB5b3VuZyBjaGlsZHJlbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5XCI+UmVsZXZhbmN5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhc2hcIj4tPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIj45MCU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmNpZXMtbWF0Y2hlZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jaWVzLW1hdGNoZWRcIj5Db21wZXRlbmNpZXMgTWF0Y2hlZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXNoXCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlXCI+ODAlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19