@rangertechnologies/ngnxt 2.1.243-beta → 2.1.244

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 (103) hide show
  1. package/esm2022/environments/version.mjs +15 -0
  2. package/esm2022/lib/ar.i18n.mjs +29 -0
  3. package/esm2022/lib/components/button/nxt-button.component.mjs +165 -0
  4. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +361 -0
  5. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +271 -0
  6. package/esm2022/lib/components/custom-model/custom-model.component.mjs +51 -0
  7. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +156 -0
  8. package/esm2022/lib/components/datatable/datatable.component.mjs +1742 -0
  9. package/esm2022/lib/components/file-upload/file-upload.component.mjs +283 -0
  10. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +104 -0
  11. package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +208 -0
  12. package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +562 -0
  13. package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +2 -0
  14. package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +2 -0
  15. package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +2 -0
  16. package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +2 -0
  17. package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +2 -0
  18. package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +2 -0
  19. package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +2 -0
  20. package/esm2022/lib/components/image-cropper/interfaces/index.mjs +2 -0
  21. package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +2 -0
  22. package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +8 -0
  23. package/esm2022/lib/components/image-cropper/services/crop.service.mjs +139 -0
  24. package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +194 -0
  25. package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +239 -0
  26. package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +79 -0
  27. package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +40 -0
  28. package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +4 -0
  29. package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +75 -0
  30. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +401 -0
  31. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +2936 -0
  32. package/esm2022/lib/components/pagination/pagination.component.mjs +101 -0
  33. package/esm2022/lib/components/pick-location/pick-location.component.mjs +227 -0
  34. package/esm2022/lib/components/search-box/search-box.component.mjs +417 -0
  35. package/esm2022/lib/country.json +43237 -0
  36. package/esm2022/lib/en.i18n.mjs +29 -0
  37. package/esm2022/lib/i18n-config.service.mjs +4 -0
  38. package/esm2022/lib/i18n.component.mjs +45 -0
  39. package/esm2022/lib/i18n.module.mjs +38 -0
  40. package/esm2022/lib/i18n.pipe.mjs +26 -0
  41. package/esm2022/lib/i18n.service.mjs +56 -0
  42. package/esm2022/lib/interfaces/actionMeta.mjs +2 -0
  43. package/esm2022/lib/interfaces/apimeta.mjs +2 -0
  44. package/esm2022/lib/interfaces/dependencyMeta.mjs +2 -0
  45. package/esm2022/lib/model/bookletWrapper.mjs +9 -0
  46. package/esm2022/lib/model/changeWrapper.mjs +11 -0
  47. package/esm2022/lib/model/errorWrapper.mjs +6 -0
  48. package/esm2022/lib/nxt-app.component.mjs +22 -0
  49. package/esm2022/lib/nxt-app.module.mjs +139 -0
  50. package/esm2022/lib/nxt-app.service.mjs +14 -0
  51. package/esm2022/lib/pages/booklet/booklet.component.mjs +673 -0
  52. package/esm2022/lib/pages/builder/element/element.component.mjs +476 -0
  53. package/esm2022/lib/pages/builder/form/form.component.mjs +45 -0
  54. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +89 -0
  55. package/esm2022/lib/pages/builder/properties/properties.component.mjs +944 -0
  56. package/esm2022/lib/pages/builder/templates/templates.component.mjs +34 -0
  57. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +680 -0
  58. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +1118 -0
  59. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +838 -0
  60. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +2237 -0
  61. package/esm2022/lib/pipe/custom-translate.pipe.mjs +27 -0
  62. package/esm2022/lib/pipe/get-value.pipe.mjs +48 -0
  63. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +39 -0
  64. package/esm2022/lib/sample.mjs +3715 -0
  65. package/esm2022/lib/services/change.service.mjs +46 -0
  66. package/esm2022/lib/services/country.service.mjs +135 -0
  67. package/esm2022/lib/services/data.service.mjs +100 -0
  68. package/esm2022/lib/services/form-builder.service.mjs +385 -0
  69. package/esm2022/lib/services/pdf-designer.service.mjs +398 -0
  70. package/esm2022/lib/services/salesforce.service.mjs +41 -0
  71. package/esm2022/lib/services/shared.service.mjs +100 -0
  72. package/esm2022/lib/services/storage.service.mjs +43 -0
  73. package/esm2022/lib/services/template.service.mjs +351 -0
  74. package/esm2022/lib/services/translation.service.mjs +61 -0
  75. package/esm2022/lib/tam.i18n.mjs +29 -0
  76. package/esm2022/lib/wrapper.mjs +175 -0
  77. package/esm2022/public-api.mjs +25 -0
  78. package/esm2022/rangertechnologies-ngnxt.mjs +5 -0
  79. package/fesm2022/rangertechnologies-ngnxt.mjs +7614 -7827
  80. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  81. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +2 -1
  82. package/lib/components/datatable/datatable.component.d.ts +34 -28
  83. package/lib/components/file-upload/file-upload.component.d.ts +4 -3
  84. package/lib/components/image-cropper/component/image-cropper.component.d.ts +1 -1
  85. package/lib/components/list-view-filter/list-view-filter.component.d.ts +3 -3
  86. package/lib/components/nxt-input/nxt-input.component.d.ts +5 -1
  87. package/lib/components/pick-location/pick-location.component.d.ts +3 -1
  88. package/lib/components/search-box/search-box.component.d.ts +2 -1
  89. package/lib/pages/builder/element/element.component.d.ts +2 -15
  90. package/lib/pages/builder/properties/common-fields.constants.d.ts +4 -16
  91. package/lib/pages/builder/properties/properties.component.d.ts +95 -129
  92. package/lib/pipe/custom-translate.pipe.d.ts +3 -3
  93. package/lib/pipe/get-value.pipe.d.ts +4 -4
  94. package/lib/pipe/search-filter/search-filter.pipe.d.ts +3 -3
  95. package/lib/services/form-builder.service.d.ts +0 -1
  96. package/package.json +6 -4
  97. package/rangertechnologies-ngnxt-2.1.244.tgz +0 -0
  98. package/lib/pipe/date/date.pipe.d.ts +0 -7
  99. package/lib/pipe/editColumnCheck/edit-column-check.pipe.d.ts +0 -7
  100. package/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.d.ts +0 -7
  101. package/lib/pipe/editColumnType/edit-column-type.pipe.d.ts +0 -7
  102. package/lib/pipe/time/time.pipe.d.ts +0 -7
  103. package/rangertechnologies-ngnxt-2.1.243-beta.tgz +0 -0
@@ -0,0 +1,361 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../services/change.service";
5
+ import * as i2 from "@angular/common";
6
+ export class CustomCalendarComponent {
7
+ changeService;
8
+ eventSelected = new EventEmitter();
9
+ // VD 06Sep24 calendar changes
10
+ dateSelected = new EventEmitter();
11
+ openModal = new EventEmitter();
12
+ closeModal = new EventEmitter();
13
+ allEvents = [];
14
+ question;
15
+ nxtId;
16
+ //@ViewChild(ComponenthostDirective, { static: true }) dynamicHost: ComponenthostDirective;
17
+ entries = [];
18
+ referenceQuestions = [];
19
+ qbRefrenceBook;
20
+ calendarQuestion = [];
21
+ calendar = {};
22
+ currentDate = new Date();
23
+ calendarDays = [];
24
+ daysOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
25
+ newEventTitle = '';
26
+ newEventTime = '';
27
+ newDescription = '';
28
+ newLink = '';
29
+ selectedDay = null;
30
+ isModalOpen = false;
31
+ modalTitle = 'Custom Modal';
32
+ modalSize = 'large';
33
+ saveButtonValue = 'Save';
34
+ modalFooter = true;
35
+ editingEventId;
36
+ editingEntryGroup;
37
+ showAppoinmentSection = true;
38
+ subscription;
39
+ constructor(changeService) {
40
+ this.changeService = changeService;
41
+ }
42
+ ngOnInit() {
43
+ if (this.question?.input) {
44
+ this.allEvents = this.question.input;
45
+ }
46
+ this.processQuestion();
47
+ this.generateCalendar();
48
+ this.subscription = this.changeService.customChange$.subscribe((changeValue) => {
49
+ if (changeValue == 'calendar-modal-save') {
50
+ this.onSave();
51
+ }
52
+ if (changeValue == 'dataBind') {
53
+ if (this.question?.input) {
54
+ this.allEvents = this.question.input;
55
+ }
56
+ this.processQuestion();
57
+ this.generateCalendar();
58
+ }
59
+ });
60
+ // this.dateSelected.emit(this.calendar);
61
+ //this.eventSelected.emit(this.allEvents);
62
+ }
63
+ // RS 09DEC24 Changed keys
64
+ processQuestion() {
65
+ // SKS20MAR25 check if question fieldsmeta is string
66
+ this.entries = typeof this.question['fieldsMeta'] === 'object' ? this.question['fieldsMeta'] || [] : JSON.parse(this.question['fieldsMeta']);
67
+ this.qbRefrenceBook = typeof this.question['qbReferenceQuestions'] === 'object' ? this.question['qbReferenceQuestions'] : JSON.parse(this.question['qbReferenceQuestions']);
68
+ let title = this.qbRefrenceBook?.questionbook?.title;
69
+ this.modalTitle = title;
70
+ this.referenceQuestions = [];
71
+ if (this.entries.length > 0) {
72
+ this.entries.forEach(element => {
73
+ if (element.questionReference) {
74
+ let qReference = JSON.parse(element.questionReference);
75
+ this.referenceQuestions.push(qReference?.question);
76
+ }
77
+ });
78
+ }
79
+ }
80
+ // sunday comment
81
+ // openQuestionBookModal() {
82
+ // const viewContainerRef = this.dynamicHost.viewContainerRef;
83
+ // viewContainerRef.clear();
84
+ // const componentRef = viewContainerRef.createComponent(QuestionbookComponent);
85
+ // componentRef.instance.qbItem = this.qbRefrenceBook;
86
+ // componentRef.instance.questions = this.referenceQuestions;
87
+ // componentRef.instance.handleQuestion.subscribe((event: any) => this.handleQuestionEvent(event));
88
+ // }
89
+ generateCalendar() {
90
+ const year = this.currentDate.getFullYear();
91
+ const month = this.currentDate.getMonth();
92
+ const startOfMonth = new Date(year, month, 1);
93
+ const endOfMonth = new Date(year, month + 1, 0);
94
+ const startDayOfWeek = startOfMonth.getDay();
95
+ const endDayOfWeek = endOfMonth.getDay();
96
+ const startDate = new Date(startOfMonth);
97
+ startDate.setDate(startDate.getDate() - startDayOfWeek);
98
+ const endDate = new Date(endOfMonth);
99
+ endDate.setDate(endDate.getDate() + (6 - endDayOfWeek));
100
+ const today = new Date(new Date().setHours(0, 0, 0, 0));
101
+ this.calendarDays = [];
102
+ for (let d = new Date(startDate); d <= endDate; d.setDate(d.getDate() + 1)) {
103
+ const date = new Date(d);
104
+ this.calendarDays.push({
105
+ date: date,
106
+ events: [],
107
+ isCurrentMonth: d.getMonth() === month,
108
+ isPast: date < today,
109
+ isToday: date.getTime() === today.getTime(),
110
+ isFuture: date > today,
111
+ });
112
+ }
113
+ // Populate calendar with events from allEvents array
114
+ this.calendarDays.forEach(day => {
115
+ day.events = this.allEvents?.filter(event => event?.date?.toDateString() === day.date.toDateString());
116
+ });
117
+ // VD 06Sep24 calendar changes
118
+ let cal = {};
119
+ cal['year'] = year;
120
+ cal['month'] = month + 1;
121
+ this.calendar = cal;
122
+ }
123
+ selectDay(day) {
124
+ // VD 06Sep24 calendar changes
125
+ this.showAppoinmentSection = true;
126
+ this.selectedDay = day;
127
+ // this.eventSelected.emit(day?.events);
128
+ const previouslySelectedDay = this.calendarDays.find(d => d.isSelected);
129
+ if (previouslySelectedDay) {
130
+ previouslySelectedDay.isSelected = false;
131
+ }
132
+ // Select the clicked day
133
+ day.isSelected = true;
134
+ // VD 09Sep24- setup the query param data for api call
135
+ let referenceData = [];
136
+ this.referenceQuestions.forEach(ques => {
137
+ // VD 09-09-24 get the selected date
138
+ // need to add in the document
139
+ // RS 09DEC24 Changed keys
140
+ if (ques.referenceField == 'selectedDate') {
141
+ ques.input = day.date.toISOString();
142
+ }
143
+ // VD 09-09-24 get the query refrence field data to pass the queryParam for api
144
+ ques['subText'] = typeof ques?.subText === 'object' ? ques?.subText : JSON.parse(ques['subText'] || {});
145
+ if (ques.subText) {
146
+ let subText = ques.subText;
147
+ if (subText.queryField && subText.queryValueReference) {
148
+ let currentQues = ques;
149
+ let queryReferences = subText.queryValueReference.split(',');
150
+ queryReferences.forEach(refField => {
151
+ let refQues = this.referenceQuestions.find(q => q.referenceField === refField);
152
+ if (refQues) {
153
+ referenceData.push(refQues);
154
+ }
155
+ });
156
+ // Add the referenceData array to the current question
157
+ currentQues.referenceQueryData = referenceData;
158
+ }
159
+ }
160
+ });
161
+ }
162
+ previousMonth() {
163
+ this.showAppoinmentSection = false;
164
+ this.currentDate.setMonth(this.currentDate.getMonth() - 1);
165
+ this.currentDate = new Date(this.currentDate); // Ensure the date object is updated
166
+ this.generateCalendar();
167
+ this.dateSelected.emit(this.calendar);
168
+ this.eventSelected.emit(this.allEvents);
169
+ }
170
+ nextMonth() {
171
+ // VD 06Sep24 calendar changes
172
+ this.showAppoinmentSection = false;
173
+ this.currentDate.setMonth(this.currentDate.getMonth() + 1);
174
+ this.currentDate = new Date(this.currentDate); // Ensure the date object is updated
175
+ this.generateCalendar();
176
+ this.dateSelected.emit(this.calendar);
177
+ this.eventSelected.emit(this.allEvents);
178
+ }
179
+ addAppointment() {
180
+ this.isModalOpen = true;
181
+ this.calendarQuestion = this.referenceQuestions.map(q => ({ ...q, input: '' }));
182
+ this.referenceQuestions.forEach(ques => {
183
+ // clear the input
184
+ if (ques.referenceField != 'selectedDate') {
185
+ if (ques.type == 'Dropdown') {
186
+ delete ques.input;
187
+ delete ques.selectedValue;
188
+ // VD 06Sep24 calendar changes
189
+ }
190
+ else {
191
+ delete ques.input;
192
+ }
193
+ }
194
+ });
195
+ this.editingEventId = null;
196
+ this.calendarQuestion = this.referenceQuestions;
197
+ this.openBookModel();
198
+ // sunday comment
199
+ //this.openQuestionBookModal();
200
+ }
201
+ openBookModel() {
202
+ this.openModal.emit({
203
+ qbRefrenceBook: this.qbRefrenceBook,
204
+ referenceQuestions: this.referenceQuestions,
205
+ modalTitle: this.modalTitle,
206
+ modalSize: this.modalSize,
207
+ saveButtonValue: this.saveButtonValue,
208
+ modalFooter: this.modalFooter,
209
+ });
210
+ }
211
+ closeCalendarModal() {
212
+ this.isModalOpen = false;
213
+ this.closeModal.emit(true);
214
+ }
215
+ // VD 06Sep24 calendar changes
216
+ editEvent(event, entryGroup) {
217
+ this.isModalOpen = true;
218
+ this.referenceQuestions = Object.values(entryGroup);
219
+ this.calendarQuestion = [...this.referenceQuestions]; // Make a copy of the current entries to edit
220
+ this.editingEventId = event.id;
221
+ this.editingEntryGroup = entryGroup; // Store the entry group being edited
222
+ this.generateCalendar(); // Regenerate the calendar to reflect changes
223
+ this.openBookModel();
224
+ // suday comment
225
+ // this.openQuestionBookModal();
226
+ }
227
+ deleteEvent(eventId, entryGroup) {
228
+ let event = this.allEvents?.find(e => e?.id === eventId);
229
+ if (event) {
230
+ // Find the index of the entryGroup to delete
231
+ const entryIndex = event.entries.indexOf(entryGroup);
232
+ if (entryIndex > -1) {
233
+ event.entries.splice(entryIndex, 1); // Remove the specific entry
234
+ }
235
+ // If the event has no more entries, remove the event entirely
236
+ if (event.entries.length === 0) {
237
+ const eventIndex = this.allEvents?.indexOf(event);
238
+ if (eventIndex > -1) {
239
+ this.allEvents?.splice(eventIndex, 1); // Remove the entire event
240
+ }
241
+ }
242
+ }
243
+ let eventData = {};
244
+ eventData['action'] = "delete";
245
+ eventData['data'] = event;
246
+ this.eventSelected.emit(eventData);
247
+ this.generateCalendar(); // Regenerate the calendar to reflect the changes
248
+ }
249
+ // VD 06Sep24 calendar changes
250
+ addEvent(day, entryQues) {
251
+ // Transform new entries into the desired format
252
+ const newEntries = entryQues.reduce((acc, q) => {
253
+ acc[q.id] = { ...q };
254
+ return acc;
255
+ }, {});
256
+ // Find an existing event for the given date
257
+ const existingEvent = day.events?.find(event => event.date === day.date);
258
+ if (existingEvent) {
259
+ // Merge new entries into the existing event's entries array
260
+ // Check if the entries array already contains an object with the same id
261
+ const existingEntries = existingEvent.entries.map(entry => ({ ...entry }));
262
+ // Append new entries to the existing entries
263
+ existingEntries.push(newEntries);
264
+ existingEvent.entries = existingEntries;
265
+ }
266
+ else {
267
+ // Create a new event if it doesn't exist for the given date
268
+ const newEvent = {
269
+ id: this.generateId(),
270
+ date: day.date,
271
+ entries: [newEntries] // Wrap the new entries in an array
272
+ };
273
+ day.events = day?.events || [];
274
+ day.events.push(newEvent);
275
+ this.allEvents?.push(newEvent);
276
+ //this.eventSelected.emit(this.allEvents);
277
+ let eventData = {};
278
+ eventData['action'] = "add";
279
+ eventData['data'] = newEvent;
280
+ this.eventSelected.emit(eventData);
281
+ }
282
+ this.generateCalendar();
283
+ }
284
+ // VD 06Sep24 calendar changes
285
+ onSave() {
286
+ if (this.editingEventId !== null) {
287
+ const event = this.allEvents?.find(e => e?.id === this.editingEventId);
288
+ if (event && this.editingEntryGroup) {
289
+ // Update the specific entry group within the event
290
+ const entryIndex = event.entries.findIndex(entryGroup => entryGroup === this.editingEntryGroup);
291
+ if (entryIndex > -1) {
292
+ event.entries[entryIndex] = this.calendarQuestion.reduce((acc, q) => {
293
+ acc[q.id] = { ...q };
294
+ return acc;
295
+ }, {});
296
+ }
297
+ }
298
+ // this.eventSelected.emit(this.allEvents);
299
+ let eventData = {};
300
+ eventData['action'] = "edit";
301
+ eventData['data'] = event;
302
+ this.eventSelected.emit(eventData);
303
+ }
304
+ else {
305
+ if (this.selectedDay) {
306
+ this.addEvent(this.selectedDay, this.calendarQuestion);
307
+ }
308
+ }
309
+ this.closeCalendarModal();
310
+ this.generateCalendar();
311
+ }
312
+ // onCancel() {
313
+ // this.closeCalendarModal();
314
+ // }
315
+ //this funtion need to be used
316
+ // handleQuestionEvent(ques){
317
+ // // Update the questions array with the new question
318
+ // const index = this.calendarQuestion.findIndex(q => q.id === ques.id);
319
+ // if (index > -1) {
320
+ // // If question already exists, update it
321
+ // this.calendarQuestion[index] = ques;
322
+ // } else {
323
+ // // If question doesn't exist, add it to the array
324
+ // this.calendarQuestion.push(ques);
325
+ // }
326
+ // }
327
+ // VD 06Sep24 calendar changes
328
+ generateId() {
329
+ return '_' + Math.random().toString(36).substr(2, 9);
330
+ }
331
+ getEntryKeys(entryGroup) {
332
+ return Object.keys(entryGroup);
333
+ }
334
+ removeCharacters(questionText) {
335
+ let updatedText = questionText?.replace(/<[^>]*>/g, '');
336
+ return updatedText;
337
+ }
338
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomCalendarComponent, deps: [{ token: i1.ChangeService }], target: i0.ɵɵFactoryTarget.Component });
339
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CustomCalendarComponent, isStandalone: true, selector: "app-custom-calendar", inputs: { allEvents: "allEvents", question: "question", nxtId: "nxtId" }, outputs: { eventSelected: "eventSelected", dateSelected: "dateSelected", openModal: "openModal", closeModal: "closeModal" }, ngImport: i0, template: "<div class=\"align-calendar\">\n <div class=\"calendar-container\">\n <div class=\"calendar-header\">\n <button (click)=\"previousMonth()\"><< Previous >></button>\n <h3>{{ currentDate | date: 'MMMM yyyy' }}</h3>\n <button (click)=\"nextMonth()\"><< Next >></button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"day-of-week\" *ngFor=\"let day of daysOfWeek\">{{ day }}</div>\n <div\n class=\"calendar-day\"\n *ngFor=\"let day of calendarDays\"\n [class.not-current-month]=\"!day.isCurrentMonth\"\n [class.past]=\"day.isPast\"\n [class.today]=\"day.isToday\"\n [class.future]=\"day.isFuture\"\n [class.selected]=\"day.isSelected\"\n (click)=\"selectDay(day)\"\n >\n <div class=\"day-number\">{{ day.date.getDate() }}\n <span *ngIf=\"day?.events?.length > 0\" class=\"entry-indicator\" [class.select]=\"day?.isSelected\"></span>\n </div>\n <!-- <div *ngFor=\"let event of day.events\" >\n <div *ngFor=\"let entryGroup of event.entries\" class=\"event\">\n <div *ngFor=\"let key of getEntryKeys(entryGroup)\">\n <div *ngIf=\"entryGroup[key].type == 'Time'\">\n {{ entryGroup[key].input?.value | date: 'shortTime' }}\n </div>\n <div *ngIf=\"entryGroup[key].type != 'Time'\">\n {{ entryGroup[key].input }}\n </div>\n </div>\n </div>\n </div> -->\n </div>\n </div>\n </div>\n <div class=\"appoinappointment\">\n <div class=\"appointments-container\">\n <h4>Add Appointment</h4>\n <button *ngIf=\"selectedDay\" (click)=\"addAppointment()\">Add</button>\n </div>\n <!--VD 06Sep24 calendar updates--> \n <!-- RS 09DEC24 Changed keys--> \n <div *ngIf=\"showAppoinmentSection && selectedDay?.events?.length > 0\" class=\"appointments-container\">\n <h4>Appointments</h4>\n <div *ngFor=\"let event of selectedDay?.events\">\n <div class=\"event\" *ngFor=\"let entryGroup of event.entries\">\n <div class=\"event-info\">\n <div *ngFor=\"let key of getEntryKeys(entryGroup)\" class=\"entry-row\">\n <div *ngIf=\"entryGroup[key].questionText\" class=\"entry-text\">\n {{removeCharacters(entryGroup[key].questionText)}}:\n </div>\n <div class=\"entry-value\">\n <!-- VD 09Sep24- date type and link type updates -->\n <span *ngIf=\"entryGroup[key].type != 'Time' && entryGroup[key].type != 'Link'&& entryGroup[key].type != 'Date'\">{{ entryGroup[key].input }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Time'\">{{ entryGroup[key].input | date: 'shortTime' }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Date'\">{{ entryGroup[key].input | date: 'mediumDate' }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Link'\">\n <a [href]=\"'//'+ entryGroup[key].input\" target=\"_blank\">{{removeCharacters(entryGroup[key].questionText)}}</a>\n </span>\n </div>\n </div>\n <div class=\"event-actions\">\n <button (click)=\"editEvent(event,entryGroup)\">Edit</button>\n <button (click)=\"deleteEvent(event.id,entryGroup)\">Delete</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- <app-custom-model\n [modalTitle]=\"modalTitle\"\n [isModalOpen]=\"isModalOpen\"\n [modalSize]=\"modalSize\"\n [saveButtonValue]=\"saveButtonValue\"\n [modalFooter]=\"modalFooter\"\n (saveButtonEmit)=\"onSave()\"\n (cancelButtonEmit)=\"onCancel()\"\n>\n<lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\" (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n<ng-template dynamicComponentHost ></ng-template>\n</app-custom-model> -->", styles: [".calendar-container{flex:1}.appoinappointment{flex:1;margin-left:10px}.calendar-header{display:flex;justify-content:space-between;align-items:center}.selected{box-shadow:0 0 5px #00000080;background-color:green!important;color:#fff!important}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.day-of-week{text-align:center;font-weight:700;padding:5px;background-color:#f0f0f0;border:1px solid #ccc}.calendar-day{border:1px solid #ccc;padding:5px;display:flex;flex-direction:column;align-items:flex-start;background-color:#fff;position:relative;cursor:pointer}.calendar-day.not-current-month{background-color:#f0f0f0}.calendar-day.past{color:#aaa}.calendar-day.today{background-color:#e6ffe6;font-weight:700}.calendar-day.future{color:#000}.day-number{font-size:1.2em;margin-bottom:5px}.event{background-color:#d1e7dd;border-left:4px solid #0f5132;margin:5px 0;padding:2px 5px;border-radius:3px}.event-title{font-weight:700}.event-time{font-size:.8em}input[type=text],input[type=time]{width:100%;margin-top:5px;box-sizing:border-box}button{margin-top:5px;align-self:stretch;margin-left:0!important}.calendar-header button{margin-top:5px;align-self:stretch;margin-left:0!important;border:none;background:none}.align-calendar{display:flex;width:100%}.form-group.content-box{padding-bottom:0!important}.entry-indicator{position:absolute;top:5px;right:5px;width:10px;height:10px;background-color:#0f5132;border-radius:50%}.select{background-color:#fff}.entry-row{display:flex;align-items:center;margin-bottom:5px}.entry-text{font-weight:700;margin-right:10px;white-space:nowrap}.entry-value{flex:1;word-break:break-word}.entry-value a{color:#4caf50}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
340
+ }
341
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomCalendarComponent, decorators: [{
342
+ type: Component,
343
+ args: [{ selector: 'app-custom-calendar', standalone: true, imports: [
344
+ CommonModule,
345
+ ], template: "<div class=\"align-calendar\">\n <div class=\"calendar-container\">\n <div class=\"calendar-header\">\n <button (click)=\"previousMonth()\"><< Previous >></button>\n <h3>{{ currentDate | date: 'MMMM yyyy' }}</h3>\n <button (click)=\"nextMonth()\"><< Next >></button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"day-of-week\" *ngFor=\"let day of daysOfWeek\">{{ day }}</div>\n <div\n class=\"calendar-day\"\n *ngFor=\"let day of calendarDays\"\n [class.not-current-month]=\"!day.isCurrentMonth\"\n [class.past]=\"day.isPast\"\n [class.today]=\"day.isToday\"\n [class.future]=\"day.isFuture\"\n [class.selected]=\"day.isSelected\"\n (click)=\"selectDay(day)\"\n >\n <div class=\"day-number\">{{ day.date.getDate() }}\n <span *ngIf=\"day?.events?.length > 0\" class=\"entry-indicator\" [class.select]=\"day?.isSelected\"></span>\n </div>\n <!-- <div *ngFor=\"let event of day.events\" >\n <div *ngFor=\"let entryGroup of event.entries\" class=\"event\">\n <div *ngFor=\"let key of getEntryKeys(entryGroup)\">\n <div *ngIf=\"entryGroup[key].type == 'Time'\">\n {{ entryGroup[key].input?.value | date: 'shortTime' }}\n </div>\n <div *ngIf=\"entryGroup[key].type != 'Time'\">\n {{ entryGroup[key].input }}\n </div>\n </div>\n </div>\n </div> -->\n </div>\n </div>\n </div>\n <div class=\"appoinappointment\">\n <div class=\"appointments-container\">\n <h4>Add Appointment</h4>\n <button *ngIf=\"selectedDay\" (click)=\"addAppointment()\">Add</button>\n </div>\n <!--VD 06Sep24 calendar updates--> \n <!-- RS 09DEC24 Changed keys--> \n <div *ngIf=\"showAppoinmentSection && selectedDay?.events?.length > 0\" class=\"appointments-container\">\n <h4>Appointments</h4>\n <div *ngFor=\"let event of selectedDay?.events\">\n <div class=\"event\" *ngFor=\"let entryGroup of event.entries\">\n <div class=\"event-info\">\n <div *ngFor=\"let key of getEntryKeys(entryGroup)\" class=\"entry-row\">\n <div *ngIf=\"entryGroup[key].questionText\" class=\"entry-text\">\n {{removeCharacters(entryGroup[key].questionText)}}:\n </div>\n <div class=\"entry-value\">\n <!-- VD 09Sep24- date type and link type updates -->\n <span *ngIf=\"entryGroup[key].type != 'Time' && entryGroup[key].type != 'Link'&& entryGroup[key].type != 'Date'\">{{ entryGroup[key].input }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Time'\">{{ entryGroup[key].input | date: 'shortTime' }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Date'\">{{ entryGroup[key].input | date: 'mediumDate' }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Link'\">\n <a [href]=\"'//'+ entryGroup[key].input\" target=\"_blank\">{{removeCharacters(entryGroup[key].questionText)}}</a>\n </span>\n </div>\n </div>\n <div class=\"event-actions\">\n <button (click)=\"editEvent(event,entryGroup)\">Edit</button>\n <button (click)=\"deleteEvent(event.id,entryGroup)\">Delete</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- <app-custom-model\n [modalTitle]=\"modalTitle\"\n [isModalOpen]=\"isModalOpen\"\n [modalSize]=\"modalSize\"\n [saveButtonValue]=\"saveButtonValue\"\n [modalFooter]=\"modalFooter\"\n (saveButtonEmit)=\"onSave()\"\n (cancelButtonEmit)=\"onCancel()\"\n>\n<lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\" (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n<ng-template dynamicComponentHost ></ng-template>\n</app-custom-model> -->", styles: [".calendar-container{flex:1}.appoinappointment{flex:1;margin-left:10px}.calendar-header{display:flex;justify-content:space-between;align-items:center}.selected{box-shadow:0 0 5px #00000080;background-color:green!important;color:#fff!important}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.day-of-week{text-align:center;font-weight:700;padding:5px;background-color:#f0f0f0;border:1px solid #ccc}.calendar-day{border:1px solid #ccc;padding:5px;display:flex;flex-direction:column;align-items:flex-start;background-color:#fff;position:relative;cursor:pointer}.calendar-day.not-current-month{background-color:#f0f0f0}.calendar-day.past{color:#aaa}.calendar-day.today{background-color:#e6ffe6;font-weight:700}.calendar-day.future{color:#000}.day-number{font-size:1.2em;margin-bottom:5px}.event{background-color:#d1e7dd;border-left:4px solid #0f5132;margin:5px 0;padding:2px 5px;border-radius:3px}.event-title{font-weight:700}.event-time{font-size:.8em}input[type=text],input[type=time]{width:100%;margin-top:5px;box-sizing:border-box}button{margin-top:5px;align-self:stretch;margin-left:0!important}.calendar-header button{margin-top:5px;align-self:stretch;margin-left:0!important;border:none;background:none}.align-calendar{display:flex;width:100%}.form-group.content-box{padding-bottom:0!important}.entry-indicator{position:absolute;top:5px;right:5px;width:10px;height:10px;background-color:#0f5132;border-radius:50%}.select{background-color:#fff}.entry-row{display:flex;align-items:center;margin-bottom:5px}.entry-text{font-weight:700;margin-right:10px;white-space:nowrap}.entry-value{flex:1;word-break:break-word}.entry-value a{color:#4caf50}\n"] }]
346
+ }], ctorParameters: () => [{ type: i1.ChangeService }], propDecorators: { eventSelected: [{
347
+ type: Output
348
+ }], dateSelected: [{
349
+ type: Output
350
+ }], openModal: [{
351
+ type: Output
352
+ }], closeModal: [{
353
+ type: Output
354
+ }], allEvents: [{
355
+ type: Input
356
+ }], question: [{
357
+ type: Input
358
+ }], nxtId: [{
359
+ type: Input
360
+ }] } });
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2N1c3RvbS1jYWxlbmRhci9jdXN0b20tY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLWNhbGVuZGFyL2N1c3RvbS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUtySCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFtQi9DLE1BQU0sT0FBTyx1QkFBdUI7SUFnQ2I7SUEvQlgsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbEQsOEJBQThCO0lBQ3BCLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3ZDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3RDLFNBQVMsR0FBVSxFQUFFLENBQUM7SUFDdEIsUUFBUSxDQUFVO0lBQ2xCLEtBQUssQ0FBUztJQUN2QiwyRkFBMkY7SUFDM0YsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztJQUN4QixjQUFjLENBQUs7SUFDbkIsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDZCxXQUFXLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUMvQixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxVQUFVLEdBQWEsQ0FBQyxRQUFRLEVBQUUsUUFB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QVksQ0FBQyxVQUFlO1FBQzFCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsWUFBbUI7UUFDbEMsSUFBSSxXQUFXLEdBQUcsWUFBWSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQzt3R0FqV1ksdUJBQXVCOzRGQUF2Qix1QkFBdUIsc1JDeEJwQyw4MklBcUZ1Qiw2ckREbEVuQixZQUFZOzs0RkFLSCx1QkFBdUI7a0JBVG5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3FCQUNiO2tGQUtTLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0UsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICcuLi8uLi93cmFwcGVyJztcbi8vaW1wb3J0IHsgUXVlc3Rpb25ib29rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcGFnZXMvcXVlc3Rpb25ib29rL3F1ZXN0aW9uYm9vay5jb21wb25lbnQnO1xuLy9pbXBvcnQgeyBDb21wb25lbnRob3N0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jb21wb25lbnRob3N0L2NvbXBvbmVudGhvc3QuZGlyZWN0aXZlJztcbmltcG9ydCB7IENoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGFuZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW50ZXJmYWNlIENhbGVuZGFyRGF5IHtcbiAgZGF0ZTogRGF0ZTtcbiAgZXZlbnRzOiBhbnlbXTtcbiAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW47XG4gIGlzUGFzdDogYm9vbGVhbjtcbiAgaXNUb2RheTogYm9vbGVhbjtcbiAgaXNGdXR1cmU6IGJvb2xlYW47XG4gIGlzU2VsZWN0ZWQ/OiBib29sZWFuO1xufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWN1c3RvbS1jYWxlbmRhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jdXN0b20tY2FsZW5kYXIuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21DYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBldmVudFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBAT3V0cHV0KCkgZGF0ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvcGVuTW9kYWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGNsb3NlTW9kYWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQElucHV0KCkgYWxsRXZlbnRzOiBhbnlbXSA9IFtdOyBcbiAgQElucHV0KCkgcXVlc3Rpb246IFF1ZXN0aW9uXG4gIEBJbnB1dCgpIG54dElkOiBzdHJpbmc7XG4gIC8vQFZpZXdDaGlsZChDb21wb25lbnRob3N0RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBkeW5hbWljSG9zdDogQ29tcG9uZW50aG9zdERpcmVjdGl2ZTtcbiAgZW50cmllcyA9IFtdO1xuICByZWZlcmVuY2VRdWVzdGlvbnMgPSBbXTtcbiAgcWJSZWZyZW5jZUJvb2s6YW55O1xuICBjYWxlbmRhclF1ZXN0aW9uID0gW107XG4gIGNhbGVuZGFyID0ge307XG4gIGN1cnJlbnREYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG4gIGRheXNPZldlZWs6IHN0cmluZ1tdID0gWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddO1xuICBuZXdFdmVudFRpdGxlOiBzdHJpbmcgPSAnJztcbiAgbmV3RXZlbnRUaW1lOiBzdHJpbmcgPSAnJztcbiAgbmV3RGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBuZXdMaW5rOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWREYXk6IENhbGVuZGFyRGF5IHwgbnVsbCA9IG51bGw7XG4gIGlzTW9kYWxPcGVuID0gZmFsc2U7XG4gIG1vZGFsVGl0bGUgPSAnQ3VzdG9tIE1vZGFsJztcbiAgbW9kYWxTaXplID0gJ2xhcmdlJztcbiAgc2F2ZUJ1dHRvblZhbHVlID0gJ1NhdmUnO1xuICBtb2RhbEZvb3RlciA9IHRydWU7XG4gIGVkaXRpbmdFdmVudElkOiBudW1iZXI7XG4gIGVkaXRpbmdFbnRyeUdyb3VwOiBhbnk7XG4gIHNob3dBcHBvaW5tZW50U2VjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIHN1YnNjcmlwdGlvbjogYW55O1xuICBjb25zdHJ1Y3RvciggcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlKSB7IH1cbiAgbmdPbkluaXQoKSB7XG4gICAgIGlmKHRoaXMucXVlc3Rpb24/LmlucHV0KXtcbiAgICAgIHRoaXMuYWxsRXZlbnRzID0gdGhpcy5xdWVzdGlvbi5pbnB1dDtcbiAgICAgfVxuICAgIHRoaXMucHJvY2Vzc1F1ZXN0aW9uKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYW5nZVNlcnZpY2UuY3VzdG9tQ2hhbmdlJC5zdWJzY3JpYmUoXG4gICAgICAoY2hhbmdlVmFsdWUpID0+IHtcbiAgICAgICAgICBpZihjaGFuZ2VWYWx1ZSA9PSAnY2FsZW5kYXItbW9kYWwtc2F2ZScpIHtcbiAgICAgICAgICAgIHRoaXMub25TYXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGNoYW5nZVZhbHVlID09ICdkYXRhQmluZCcpIHtcbiAgICAgICAgICAgIGlmKHRoaXMucXVlc3Rpb24/LmlucHV0KXtcbiAgICAgICAgICAgICAgdGhpcy5hbGxFdmVudHMgPSB0aGlzLnF1ZXN0aW9uLmlucHV0O1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1F1ZXN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgIC8vIHRoaXMuZGF0ZVNlbGVjdGVkLmVtaXQodGhpcy5jYWxlbmRhcik7XG4gICAgLy90aGlzLmV2ZW50U2VsZWN0ZWQuZW1pdCh0aGlzLmFsbEV2ZW50cyk7XG4gIH1cbiAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgcHJvY2Vzc1F1ZXN0aW9uKCl7XG4gICAgLy8gU0tTMjBNQVIyNSBjaGVjayBpZiBxdWVzdGlvbiBmaWVsZHNtZXRhIGlzIHN0cmluZ1xuICAgIHRoaXMuZW50cmllcyA9ICB0eXBlb2YgdGhpcy5xdWVzdGlvblsnZmllbGRzTWV0YSddID09PSAnb2JqZWN0JyAgPyAgdGhpcy5xdWVzdGlvblsnZmllbGRzTWV0YSddIHx8IFtdIDogSlNPTi5wYXJzZSggdGhpcy5xdWVzdGlvblsnZmllbGRzTWV0YSddKSA7XG4gICAgdGhpcy5xYlJlZnJlbmNlQm9vayA9IHR5cGVvZiB0aGlzLnF1ZXN0aW9uWydxYlJlZmVyZW5jZVF1ZXN0aW9ucyddID09PSAnb2JqZWN0JyAgPyAgdGhpcy5xdWVzdGlvblsncWJSZWZlcmVuY2VRdWVzdGlvbnMnXSA6IEpTT04ucGFyc2UoIHRoaXMucXVlc3Rpb25bJ3FiUmVmZXJlbmNlUXVlc3Rpb25zJ10pIDtcbiAgICBsZXQgdGl0bGUgPSB0aGlzLnFiUmVmcmVuY2VCb29rPy5xdWVzdGlvbmJvb2s/LnRpdGxlO1xuICAgIHRoaXMubW9kYWxUaXRsZSA9IHRpdGxlO1xuICAgIHRoaXMucmVmZXJlbmNlUXVlc3Rpb25zID0gW107XG4gICAgaWYodGhpcy5lbnRyaWVzLmxlbmd0aCA+IDApe1xuICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICBpZihlbGVtZW50LnF1ZXN0aW9uUmVmZXJlbmNlKXtcbiAgICAgICAgICAgICBsZXQgcVJlZmVyZW5jZSA9IEpTT04ucGFyc2UoZWxlbWVudC5xdWVzdGlvblJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnMucHVzaChxUmVmZXJlbmNlPy5xdWVzdGlvbik7XG4gICAgICAgICAgIH1cbiAgICAgICB9KTtcbiAgICB9XG4gIH1cbiAgIC8vIHN1bmRheSBjb21tZW50XG4gIC8vIG9wZW5RdWVzdGlvbkJvb2tNb2RhbCgpIHtcbiAgLy8gICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gdGhpcy5keW5hbWljSG9zdC52aWV3Q29udGFpbmVyUmVmO1xuICAvLyAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcbiAgLy8gICBjb25zdCBjb21wb25lbnRSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChRdWVzdGlvbmJvb2tDb21wb25lbnQpO1xuICAvLyAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5xYkl0ZW0gPSB0aGlzLnFiUmVmcmVuY2VCb29rO1xuICAvLyAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5xdWVzdGlvbnMgPSB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucztcbiAgLy8gICBjb21wb25lbnRSZWYuaW5zdGFuY2UuaGFuZGxlUXVlc3Rpb24uc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLmhhbmRsZVF1ZXN0aW9uRXZlbnQoZXZlbnQpKTtcbiAgLy8gfVxuXG4gIGdlbmVyYXRlQ2FsZW5kYXIoKSB7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudERhdGUuZ2V0TW9udGgoKTtcblxuICAgIGNvbnN0IHN0YXJ0T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICBjb25zdCBlbmRPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKTtcblxuICAgIGNvbnN0IHN0YXJ0RGF5T2ZXZWVrID0gc3RhcnRPZk1vbnRoLmdldERheSgpO1xuICAgIGNvbnN0IGVuZERheU9mV2VlayA9IGVuZE9mTW9udGguZ2V0RGF5KCk7XG5cbiAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZShzdGFydE9mTW9udGgpO1xuICAgIHN0YXJ0RGF0ZS5zZXREYXRlKHN0YXJ0RGF0ZS5nZXREYXRlKCkgLSBzdGFydERheU9mV2Vlayk7XG5cbiAgICBjb25zdCBlbmREYXRlID0gbmV3IERhdGUoZW5kT2ZNb250aCk7XG4gICAgZW5kRGF0ZS5zZXREYXRlKGVuZERhdGUuZ2V0RGF0ZSgpICsgKDYgLSBlbmREYXlPZldlZWspKTtcblxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUobmV3IERhdGUoKS5zZXRIb3VycygwLCAwLCAwLCAwKSk7XG4gICAgXG4gICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gW107XG4gICAgICBmb3IgKGxldCBkID0gbmV3IERhdGUoc3RhcnREYXRlKTsgZCA8PSBlbmREYXRlOyBkLnNldERhdGUoZC5nZXREYXRlKCkgKyAxKSkge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZCk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJEYXlzLnB1c2goe1xuICAgICAgICAgIGRhdGU6IGRhdGUsXG4gICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICBpc0N1cnJlbnRNb250aDogZC5nZXRNb250aCgpID09PSBtb250aCxcbiAgICAgICAgICBpc1Bhc3Q6IGRhdGUgPCB0b2RheSxcbiAgICAgICAgICBpc1RvZGF5OiBkYXRlLmdldFRpbWUoKSA9PT0gdG9kYXkuZ2V0VGltZSgpLFxuICAgICAgICAgIGlzRnV0dXJlOiBkYXRlID4gdG9kYXksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgLy8gUG9wdWxhdGUgY2FsZW5kYXIgd2l0aCBldmVudHMgZnJvbSBhbGxFdmVudHMgYXJyYXlcbiAgICB0aGlzLmNhbGVuZGFyRGF5cy5mb3JFYWNoKGRheSA9PiB7XG4gICAgICBkYXkuZXZlbnRzID0gdGhpcy5hbGxFdmVudHM/LmZpbHRlcihldmVudCA9PiBldmVudD8uZGF0ZT8udG9EYXRlU3RyaW5nKCkgPT09IGRheS5kYXRlLnRvRGF0ZVN0cmluZygpKTtcbiAgICB9KTtcbiAgICAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gICAgbGV0IGNhbCA9IHt9XG4gICAgY2FsWyd5ZWFyJ10gPSB5ZWFyO1xuICAgIGNhbFsnbW9udGgnXSA9IG1vbnRoICsgMTtcbiAgICB0aGlzLmNhbGVuZGFyID0gY2FsO1xuICB9XG5cbiAgc2VsZWN0RGF5KGRheTogQ2FsZW5kYXJEYXkpIHtcbiAgICAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gICAgdGhpcy5zaG93QXBwb2lubWVudFNlY3Rpb24gPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBkYXk7XG4gICAvLyB0aGlzLmV2ZW50U2VsZWN0ZWQuZW1pdChkYXk/LmV2ZW50cyk7XG4gICAgY29uc3QgcHJldmlvdXNseVNlbGVjdGVkRGF5ID0gdGhpcy5jYWxlbmRhckRheXMuZmluZChkID0+IGQuaXNTZWxlY3RlZCk7XG4gICAgaWYgKHByZXZpb3VzbHlTZWxlY3RlZERheSkge1xuICAgICAgcHJldmlvdXNseVNlbGVjdGVkRGF5LmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gU2VsZWN0IHRoZSBjbGlja2VkIGRheVxuICAgIGRheS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgIC8vIFZEIDA5U2VwMjQtIHNldHVwIHRoZSBxdWVyeSBwYXJhbSBkYXRhIGZvciBhcGkgY2FsbFxuICAgIGxldCByZWZlcmVuY2VEYXRhID0gW107XG4gICAgdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnMuZm9yRWFjaChxdWVzID0+IHtcbiAgICAgIC8vIFZEIDA5LTA5LTI0IGdldCB0aGUgc2VsZWN0ZWQgZGF0ZVxuICAgICAgLy8gbmVlZCB0byBhZGQgaW4gdGhlIGRvY3VtZW50XG4gICAgICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xuICAgICAgIGlmKHF1ZXMucmVmZXJlbmNlRmllbGQgPT0gJ3NlbGVjdGVkRGF0ZScpe1xuICAgICAgICAgIHF1ZXMuaW5wdXQgPSBkYXkuZGF0ZS50b0lTT1N0cmluZygpO1xuICAgICAgIH1cbiAgICAgICAvLyBWRCAwOS0wOS0yNCBnZXQgdGhlIHF1ZXJ5IHJlZnJlbmNlICBmaWVsZCBkYXRhIHRvIHBhc3MgdGhlIHF1ZXJ5UGFyYW0gIGZvciBhcGlcbiAgICAgIHF1ZXNbJ3N1YlRleHQnXSA9IHR5cGVvZiBxdWVzPy5zdWJUZXh0ID09PSAnb2JqZWN0JyA/IHF1ZXM/LnN1YlRleHQgOiBKU09OLnBhcnNlKHF1ZXNbJ3N1YlRleHQnXSB8fCB7fSk7XG4gICAgICAgaWYocXVlcy5zdWJUZXh0KXtcbiAgICAgICAgbGV0IHN1YlRleHQgPSBxdWVzLnN1YlRleHQ7XG4gICAgICAgIGlmIChzdWJUZXh0LnF1ZXJ5RmllbGQgJiYgc3ViVGV4dC5xdWVyeVZhbHVlUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudFF1ZXMgPSBxdWVzO1xuICAgICAgICAgICAgbGV0IHF1ZXJ5UmVmZXJlbmNlcyA9IHN1YlRleHQucXVlcnlWYWx1ZVJlZmVyZW5jZS5zcGxpdCgnLCcpOyAgIFxuICAgICAgICAgICAgcXVlcnlSZWZlcmVuY2VzLmZvckVhY2gocmVmRmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZWZRdWVzID0gdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnMuZmluZChxID0+IHEucmVmZXJlbmNlRmllbGQgPT09IHJlZkZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmUXVlcykge1xuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VEYXRhLnB1c2gocmVmUXVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIHJlZmVyZW5jZURhdGEgYXJyYXkgdG8gdGhlIGN1cnJlbnQgcXVlc3Rpb25cbiAgICAgICAgICAgIGN1cnJlbnRRdWVzLnJlZmVyZW5jZVF1ZXJ5RGF0YSA9IHJlZmVyZW5jZURhdGE7XG4gICAgICAgIH1cbiAgICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByZXZpb3VzTW9udGgoKSB7XG4gICAgdGhpcy5zaG93QXBwb2lubWVudFNlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnREYXRlLnNldE1vbnRoKHRoaXMuY3VycmVudERhdGUuZ2V0TW9udGgoKSAtIDEpO1xuICAgIHRoaXMuY3VycmVudERhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnREYXRlKTsgLy8gRW5zdXJlIHRoZSBkYXRlIG9iamVjdCBpcyB1cGRhdGVkXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdCh0aGlzLmNhbGVuZGFyKTtcbiAgICB0aGlzLmV2ZW50U2VsZWN0ZWQuZW1pdCh0aGlzLmFsbEV2ZW50cyk7XG4gIH1cblxuICBuZXh0TW9udGgoKSB7XG4gICAgIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICAgIHRoaXMuc2hvd0FwcG9pbm1lbnRTZWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5jdXJyZW50RGF0ZS5zZXRNb250aCh0aGlzLmN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICB0aGlzLmN1cnJlbnREYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50RGF0ZSk7IC8vIEVuc3VyZSB0aGUgZGF0ZSBvYmplY3QgaXMgdXBkYXRlZFxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIHRoaXMuZGF0ZVNlbGVjdGVkLmVtaXQodGhpcy5jYWxlbmRhcik7XG4gICAgdGhpcy5ldmVudFNlbGVjdGVkLmVtaXQodGhpcy5hbGxFdmVudHMpO1xuICB9XG5cbiAgYWRkQXBwb2ludG1lbnQoKSB7XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IHRydWU7XG4gICAgIHRoaXMuY2FsZW5kYXJRdWVzdGlvbiA9IHRoaXMucmVmZXJlbmNlUXVlc3Rpb25zLm1hcChxID0+ICh7IC4uLnEsIGlucHV0OiAnJyB9KSk7XG4gICAgdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnMuZm9yRWFjaChxdWVzID0+IHtcbiAgICAgIC8vIGNsZWFyIHRoZSBpbnB1dFxuICAgICAgaWYocXVlcy5yZWZlcmVuY2VGaWVsZCAhPSAnc2VsZWN0ZWREYXRlJyl7XG4gICAgICAgIGlmKHF1ZXMudHlwZSA9PSAnRHJvcGRvd24nKXtcbiAgICAgICAgICBkZWxldGUgcXVlcy5pbnB1dDtcbiAgICAgICAgICBkZWxldGUgcXVlcy5zZWxlY3RlZFZhbHVlO1xuICAgICAgICAgICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgICAgICAgfWVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBxdWVzLmlucHV0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lZGl0aW5nRXZlbnRJZCA9IG51bGw7XG4gICAgdGhpcy5jYWxlbmRhclF1ZXN0aW9uID0gdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnM7XG4gICAgdGhpcy5vcGVuQm9va01vZGVsKCk7XG4gICAgLy8gc3VuZGF5IGNvbW1lbnRcbiAgICAvL3RoaXMub3BlblF1ZXN0aW9uQm9va01vZGFsKCk7XG4gIH1cblxuICBvcGVuQm9va01vZGVsKCl7XG4gICAgdGhpcy5vcGVuTW9kYWwuZW1pdCh7XG4gICAgICBxYlJlZnJlbmNlQm9vazogdGhpcy5xYlJlZnJlbmNlQm9vayxcbiAgICAgIHJlZmVyZW5jZVF1ZXN0aW9uczogdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnMsXG4gICAgICBtb2RhbFRpdGxlIDogdGhpcy5tb2RhbFRpdGxlLFxuICAgICAgbW9kYWxTaXplIDogdGhpcy5tb2RhbFNpemUsXG4gICAgICBzYXZlQnV0dG9uVmFsdWUgOiB0aGlzLnNhdmVCdXR0b25WYWx1ZSxcbiAgICAgIG1vZGFsRm9vdGVyIDogdGhpcy5tb2RhbEZvb3RlcixcblxuICAgIH0pO1xuICB9XG5cbiAgY2xvc2VDYWxlbmRhck1vZGFsKCkge1xuICAgIHRoaXMuaXNNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNsb3NlTW9kYWwuZW1pdCh0cnVlKTtcbiAgfVxuIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuXG5lZGl0RXZlbnQoZXZlbnQ6IGFueSwgZW50cnlHcm91cDogYW55KSB7XG4gIHRoaXMuaXNNb2RhbE9wZW4gPSB0cnVlO1xuICB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucyA9IE9iamVjdC52YWx1ZXMoZW50cnlHcm91cCk7XG4gIHRoaXMuY2FsZW5kYXJRdWVzdGlvbiA9IFsuLi50aGlzLnJlZmVyZW5jZVF1ZXN0aW9uc107IC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGVudHJpZXMgdG8gZWRpdFxuICB0aGlzLmVkaXRpbmdFdmVudElkID0gZXZlbnQuaWQ7XG4gIHRoaXMuZWRpdGluZ0VudHJ5R3JvdXAgPSBlbnRyeUdyb3VwOyAvLyBTdG9yZSB0aGUgZW50cnkgZ3JvdXAgYmVpbmcgZWRpdGVkXG4gIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpOyAvLyBSZWdlbmVyYXRlIHRoZSBjYWxlbmRhciB0byByZWZsZWN0IGNoYW5nZXNcbiAgdGhpcy5vcGVuQm9va01vZGVsKCk7XG4gIC8vIHN1ZGF5IGNvbW1lbnRcbiAvLyB0aGlzLm9wZW5RdWVzdGlvbkJvb2tNb2RhbCgpO1xuXG59XG5cbmRlbGV0ZUV2ZW50KCBldmVudElkOiBudW1iZXIsIGVudHJ5R3JvdXA6IGFueSkge1xuICBsZXQgZXZlbnQgPSB0aGlzLmFsbEV2ZW50cz8uZmluZChlID0+IGU/LmlkID09PSBldmVudElkKTtcbiAgaWYgKGV2ZW50KSB7XG4gICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZW50cnlHcm91cCB0byBkZWxldGVcbiAgICAgIGNvbnN0IGVudHJ5SW5kZXggPSBldmVudC5lbnRyaWVzLmluZGV4T2YoZW50cnlHcm91cCk7XG4gICAgICBpZiAoZW50cnlJbmRleCA+IC0xKSB7XG4gICAgICAgICAgZXZlbnQuZW50cmllcy5zcGxpY2UoZW50cnlJbmRleCwgMSk7IC8vIFJlbW92ZSB0aGUgc3BlY2lmaWMgZW50cnlcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGV2ZW50IGhhcyBubyBtb3JlIGVudHJpZXMsIHJlbW92ZSB0aGUgZXZlbnQgZW50aXJlbHlcbiAgICAgIGlmIChldmVudC5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSB0aGlzLmFsbEV2ZW50cz8uaW5kZXhPZihldmVudCk7XG4gICAgICAgICAgaWYgKGV2ZW50SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICB0aGlzLmFsbEV2ZW50cz8uc3BsaWNlKGV2ZW50SW5kZXgsIDEpOyAvLyBSZW1vdmUgdGhlIGVudGlyZSBldmVudFxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICBsZXQgZXZlbnREYXRhID0ge307XG4gICBldmVudERhdGFbJ2FjdGlvbiddID0gXCJkZWxldGVcIjtcbiAgIGV2ZW50RGF0YVsnZGF0YSddID0gZXZlbnQ7XG4gIHRoaXMuZXZlbnRTZWxlY3RlZC5lbWl0KGV2ZW50RGF0YSk7XG4gIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpOyAvLyBSZWdlbmVyYXRlIHRoZSBjYWxlbmRhciB0byByZWZsZWN0IHRoZSBjaGFuZ2VzXG59XG5cbiAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgYWRkRXZlbnQoZGF5OiBDYWxlbmRhckRheSwgZW50cnlRdWVzKSB7XG4gICAgLy8gVHJhbnNmb3JtIG5ldyBlbnRyaWVzIGludG8gdGhlIGRlc2lyZWQgZm9ybWF0XG4gICAgY29uc3QgbmV3RW50cmllcyA9IGVudHJ5UXVlcy5yZWR1Y2UoKGFjYywgcSkgPT4ge1xuICAgICAgICBhY2NbcS5pZF0gPSB7IC4uLnEgfTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICAvLyBGaW5kIGFuIGV4aXN0aW5nIGV2ZW50IGZvciB0aGUgZ2l2ZW4gZGF0ZVxuICAgIGNvbnN0IGV4aXN0aW5nRXZlbnQgPSBkYXkuZXZlbnRzPy5maW5kKGV2ZW50ID0+IGV2ZW50LmRhdGUgPT09IGRheS5kYXRlKTtcblxuICAgIGlmIChleGlzdGluZ0V2ZW50KSB7XG4gICAgICAgIC8vIE1lcmdlIG5ldyBlbnRyaWVzIGludG8gdGhlIGV4aXN0aW5nIGV2ZW50J3MgZW50cmllcyBhcnJheVxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50cmllcyBhcnJheSBhbHJlYWR5IGNvbnRhaW5zIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGlkXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IGV4aXN0aW5nRXZlbnQuZW50cmllcy5tYXAoZW50cnkgPT4gKHsgLi4uZW50cnkgfSkpO1xuICAgICAgICAvLyBBcHBlbmQgbmV3IGVudHJpZXMgdG8gdGhlIGV4aXN0aW5nIGVudHJpZXNcbiAgICAgICAgZXhpc3RpbmdFbnRyaWVzLnB1c2gobmV3RW50cmllcyk7XG4gICAgICAgIGV4aXN0aW5nRXZlbnQuZW50cmllcyA9IGV4aXN0aW5nRW50cmllcztcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZXZlbnQgaWYgaXQgZG9lc24ndCBleGlzdCBmb3IgdGhlIGdpdmVuIGRhdGVcbiAgICAgICAgY29uc3QgbmV3RXZlbnQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5nZW5lcmF0ZUlkKCksXG4gICAgICAgICAgICBkYXRlOiBkYXkuZGF0ZSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtuZXdFbnRyaWVzXSAvLyBXcmFwIHRoZSBuZXcgZW50cmllcyBpbiBhbiBhcnJheVxuICAgICAgICB9O1xuICAgICAgICBkYXkuZXZlbnRzID0gZGF5Py5ldmVudHMgfHwgW11cbiAgICAgICAgZGF5LmV2ZW50cy5wdXNoKG5ld0V2ZW50KTtcbiAgICAgICAgdGhpcy5hbGxFdmVudHM/LnB1c2gobmV3RXZlbnQpO1xuICAgICAgICAvL3RoaXMuZXZlbnRTZWxlY3RlZC5lbWl0KHRoaXMuYWxsRXZlbnRzKTtcbiAgICAgICAgbGV0IGV2ZW50RGF0YSA9IHt9O1xuICAgICAgICBldmVudERhdGFbJ2FjdGlvbiddID0gXCJhZGRcIjtcbiAgICAgICAgZXZlbnREYXRhWydkYXRhJ10gPSBuZXdFdmVudDtcbiAgICAgICAgdGhpcy5ldmVudFNlbGVjdGVkLmVtaXQoZXZlbnREYXRhKTtcbiAgICB9XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG59XG4gLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gb25TYXZlKCkge1xuICAgIGlmICh0aGlzLmVkaXRpbmdFdmVudElkICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5hbGxFdmVudHM/LmZpbmQoZSA9PiBlPy5pZCA9PT0gdGhpcy5lZGl0aW5nRXZlbnRJZCk7XG4gICAgICAgIGlmIChldmVudCAmJiB0aGlzLmVkaXRpbmdFbnRyeUdyb3VwKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNwZWNpZmljIGVudHJ5IGdyb3VwIHdpdGhpbiB0aGUgZXZlbnRcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5SW5kZXggPSBldmVudC5lbnRyaWVzLmZpbmRJbmRleChlbnRyeUdyb3VwID0+IGVudHJ5R3JvdXAgPT09IHRoaXMuZWRpdGluZ0VudHJ5R3JvdXApO1xuICAgICAgICAgICAgaWYgKGVudHJ5SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LmVudHJpZXNbZW50cnlJbmRleF0gPSB0aGlzLmNhbGVuZGFyUXVlc3Rpb24ucmVkdWNlKChhY2MsIHEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjW3EuaWRdID0geyAuLi5xIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgIC8vIHRoaXMuZXZlbnRTZWxlY3RlZC5lbWl0KHRoaXMuYWxsRXZlbnRzKTtcbiAgICAgIGxldCBldmVudERhdGEgPSB7fTtcbiAgICAgIGV2ZW50RGF0YVsnYWN0aW9uJ10gPSBcImVkaXRcIjtcbiAgICAgIGV2ZW50RGF0YVsnZGF0YSddID0gZXZlbnQ7XG4gICAgICB0aGlzLmV2ZW50U2VsZWN0ZWQuZW1pdChldmVudERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50KHRoaXMuc2VsZWN0ZWREYXksIHRoaXMuY2FsZW5kYXJRdWVzdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbG9zZUNhbGVuZGFyTW9kYWwoKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbn1cblxuICAvLyBvbkNhbmNlbCgpIHtcbiAgLy8gICB0aGlzLmNsb3NlQ2FsZW5kYXJNb2RhbCgpO1xuICAvLyB9XG4gIC8vdGhpcyBmdW50aW9uIG5lZWQgdG8gYmUgdXNlZFxuICAvLyBoYW5kbGVRdWVzdGlvbkV2ZW50KHF1ZXMpe1xuICAvLyAgICAgLy8gVXBkYXRlIHRoZSBxdWVzdGlvbnMgYXJyYXkgd2l0aCB0aGUgbmV3IHF1ZXN0aW9uXG4gIC8vICAgICBjb25zdCBpbmRleCA9IHRoaXMuY2FsZW5kYXJRdWVzdGlvbi5maW5kSW5kZXgocSA9PiBxLmlkID09PSBxdWVzLmlkKTtcbiAgLy8gICAgIGlmIChpbmRleCA+IC0xKSB7XG4gIC8vICAgICAgIC8vIElmIHF1ZXN0aW9uIGFscmVhZHkgZXhpc3RzLCB1cGRhdGUgaXRcbiAgLy8gICAgICAgdGhpcy5jYWxlbmRhclF1ZXN0aW9uW2luZGV4XSA9IHF1ZXM7XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAvLyBJZiBxdWVzdGlvbiBkb2Vzbid0IGV4aXN0LCBhZGQgaXQgdG8gdGhlIGFycmF5XG4gIC8vICAgICAgIHRoaXMuY2FsZW5kYXJRdWVzdGlvbi5wdXNoKHF1ZXMpO1xuICAvLyAgICAgfVxuICAvLyAgIH1cblxuIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBnZW5lcmF0ZUlkKCkge1xuICAgIHJldHVybiAnXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSk7XG4gIH1cblxuICBnZXRFbnRyeUtleXMoZW50cnlHcm91cDogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnRyeUdyb3VwKTtcbn1cblxucmVtb3ZlQ2hhcmFjdGVycyhxdWVzdGlvblRleHQ6c3RyaW5nKXtcbiAgbGV0IHVwZGF0ZWRUZXh0ID0gcXVlc3Rpb25UZXh0Py5yZXBsYWNlKC88W14+XSo+L2csICcnKTtcbiAgcmV0dXJuIHVwZGF0ZWRUZXh0O1xufVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiYWxpZ24tY2FsZW5kYXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicHJldmlvdXNNb250aCgpXCI+PDwgUHJldmlvdXMgPj48L2J1dHRvbj5cbiAgICAgICAgICA8aDM+e3sgY3VycmVudERhdGUgfCBkYXRlOiAnTU1NTSB5eXl5JyB9fTwvaDM+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj48PCBOZXh0ID4+PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ncmlkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRheS1vZi13ZWVrXCIgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzT2ZXZWVrXCI+e3sgZGF5IH19PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNhbGVuZGFyLWRheVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2YgY2FsZW5kYXJEYXlzXCJcbiAgICAgICAgICAgICAgW2NsYXNzLm5vdC1jdXJyZW50LW1vbnRoXT1cIiFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICBbY2xhc3MucGFzdF09XCJkYXkuaXNQYXN0XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cImRheS5pc1RvZGF5XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmZ1dHVyZV09XCJkYXkuaXNGdXR1cmVcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheSlcIlxuICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXktbnVtYmVyXCI+e3sgZGF5LmRhdGUuZ2V0RGF0ZSgpIH19XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXk/LmV2ZW50cz8ubGVuZ3RoID4gMFwiIGNsYXNzPVwiZW50cnktaW5kaWNhdG9yXCIgW2NsYXNzLnNlbGVjdF09XCJkYXk/LmlzU2VsZWN0ZWRcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nRm9yPVwibGV0IGV2ZW50IG9mIGRheS5ldmVudHNcIiA+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbnRyeUdyb3VwIG9mIGV2ZW50LmVudHJpZXNcIiBjbGFzcz1cImV2ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQga2V5IG9mIGdldEVudHJ5S2V5cyhlbnRyeUdyb3VwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZW50cnlHcm91cFtrZXldLnR5cGUgPT0gJ1RpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlbnRyeUdyb3VwW2tleV0uaW5wdXQ/LnZhbHVlIHwgZGF0ZTogJ3Nob3J0VGltZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbnRyeUdyb3VwW2tleV0udHlwZSAhPSAnVGltZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVudHJ5R3JvdXBba2V5XS5pbnB1dCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFwcG9pbmFwcG9pbnRtZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnRzLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxoND5BZGQgQXBwb2ludG1lbnQ8L2g0PlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWxlY3RlZERheVwiIChjbGljayk9XCJhZGRBcHBvaW50bWVudCgpXCI+QWRkPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS1WRCAwNlNlcDI0IGNhbGVuZGFyIHVwZGF0ZXMtLT4gXG4gICAgICA8IS0tIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzLS0+IFxuICAgICAgPGRpdiAqbmdJZj1cInNob3dBcHBvaW5tZW50U2VjdGlvbiAmJiBzZWxlY3RlZERheT8uZXZlbnRzPy5sZW5ndGggPiAwXCIgY2xhc3M9XCJhcHBvaW50bWVudHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGg0PkFwcG9pbnRtZW50czwvaDQ+XG4gICAgICAgICAgPGRpdiAgKm5nRm9yPVwibGV0IGV2ZW50IG9mIHNlbGVjdGVkRGF5Py5ldmVudHNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50XCIgKm5nRm9yPVwibGV0IGVudHJ5R3JvdXAgb2YgZXZlbnQuZW50cmllc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRFbnRyeUtleXMoZW50cnlHcm91cClcIiBjbGFzcz1cImVudHJ5LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVudHJ5R3JvdXBba2V5XS5xdWVzdGlvblRleHRcIiBjbGFzcz1cImVudHJ5LXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3JlbW92ZUNoYXJhY3RlcnMoZW50cnlHcm91cFtrZXldLnF1ZXN0aW9uVGV4dCl9fTpcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVudHJ5LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWRCAwOVNlcDI0LSBkYXRlIHR5cGUgYW5kIGxpbmsgdHlwZSB1cGRhdGVzICAgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZW50cnlHcm91cFtrZXldLnR5cGUgIT0gJ1RpbWUnICYmIGVudHJ5R3JvdXBba2V5XS50eXBlICE9ICdMaW5rJyYmIGVudHJ5R3JvdXBba2V5XS50eXBlICE9ICdEYXRlJ1wiPnt7IGVudHJ5R3JvdXBba2V5XS5pbnB1dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImVudHJ5R3JvdXBba2V5XS50eXBlID09ICdUaW1lJ1wiPnt7IGVudHJ5R3JvdXBba2V5XS5pbnB1dCB8IGRhdGU6ICdzaG9ydFRpbWUnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZW50cnlHcm91cFtrZXldLnR5cGUgPT0gJ0RhdGUnXCI+e3sgZW50cnlHcm91cFtrZXldLmlucHV0IHwgZGF0ZTogJ21lZGl1bURhdGUnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZW50cnlHcm91cFtrZXldLnR5cGUgPT0gJ0xpbmsnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIicvLycrIGVudHJ5R3JvdXBba2V5XS5pbnB1dFwiIHRhcmdldD1cIl9ibGFua1wiPnt7cmVtb3ZlQ2hhcmFjdGVycyhlbnRyeUdyb3VwW2tleV0ucXVlc3Rpb25UZXh0KX19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZWRpdEV2ZW50KGV2ZW50LGVudHJ5R3JvdXApXCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlRXZlbnQoZXZlbnQuaWQsZW50cnlHcm91cClcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gPGFwcC1jdXN0b20tbW9kZWxcbiAgW21vZGFsVGl0bGVdPVwibW9kYWxUaXRsZVwiXG4gIFtpc01vZGFsT3Blbl09XCJpc01vZGFsT3BlblwiXG4gIFttb2RhbFNpemVdPVwibW9kYWxTaXplXCJcbiAgW3NhdmVCdXR0b25WYWx1ZV09XCJzYXZlQnV0dG9uVmFsdWVcIlxuICBbbW9kYWxGb290ZXJdPVwibW9kYWxGb290ZXJcIlxuICAoc2F2ZUJ1dHRvbkVtaXQpPVwib25TYXZlKClcIlxuICAoY2FuY2VsQnV0dG9uRW1pdCk9XCJvbkNhbmNlbCgpXCJcbj5cbjxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJSZWZyZW5jZUJvb2tcIiBbcXVlc3Rpb25zXT1cInJlZmVyZW5jZVF1ZXN0aW9uc1wiIChoYW5kbGVRdWVzdGlvbik9XCJoYW5kbGVRdWVzdGlvbkV2ZW50KCRldmVudClcIj48L2xpYi1xdWVzdGlvbmJvb2s+XG48bmctdGVtcGxhdGUgZHluYW1pY0NvbXBvbmVudEhvc3QgPjwvbmctdGVtcGxhdGU+XG48L2FwcC1jdXN0b20tbW9kZWw+IC0tPiJdfQ==