@rangertechnologies/ngnxt 2.1.254 → 2.1.255
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/rangertechnologies-ngnxt.mjs +138 -169
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/pick-location/pick-location.component.d.ts +0 -1
- package/package.json +4 -6
- package/rangertechnologies-ngnxt-2.1.255.tgz +0 -0
- package/esm2022/environments/version.mjs +0 -15
- package/esm2022/lib/components/button/nxt-button.component.mjs +0 -154
- package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -360
- package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -263
- package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -53
- package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -158
- package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1744
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -292
- package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -106
- package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
- package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
- package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
- package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
- package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
- package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
- package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
- package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
- package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
- package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
- package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -392
- package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2972
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -105
- package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -220
- package/esm2022/lib/components/search-box/search-box.component.mjs +0 -470
- package/esm2022/lib/country.json +0 -43237
- package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
- package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
- package/esm2022/lib/model/bookletWrapper.mjs +0 -7
- package/esm2022/lib/model/changeWrapper.mjs +0 -10
- package/esm2022/lib/model/errorWrapper.mjs +0 -6
- package/esm2022/lib/nxt-app.component.mjs +0 -22
- package/esm2022/lib/nxt-app.module.mjs +0 -115
- package/esm2022/lib/nxt-app.service.mjs +0 -14
- package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -616
- package/esm2022/lib/pages/builder/element/element.component.mjs +0 -483
- package/esm2022/lib/pages/builder/form/form.component.mjs +0 -48
- package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -97
- package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1121
- package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -35
- package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -639
- package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1114
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -784
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2206
- package/esm2022/lib/pipe/button-styles.pipe.mjs +0 -26
- package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -37
- package/esm2022/lib/pipe/get-value.pipe.mjs +0 -54
- package/esm2022/lib/pipe/question-by-row.pipe.mjs +0 -51
- package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -40
- package/esm2022/lib/pipe/svg/svg.pipe.mjs +0 -26
- package/esm2022/lib/sample.mjs +0 -3715
- package/esm2022/lib/services/change/change.service.mjs +0 -46
- package/esm2022/lib/services/country/country.service.mjs +0 -135
- package/esm2022/lib/services/data/data.service.mjs +0 -100
- package/esm2022/lib/services/form-builder/form-builder.service.mjs +0 -474
- package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +0 -395
- package/esm2022/lib/services/salesforce/salesforce.service.mjs +0 -41
- package/esm2022/lib/services/shared/shared.service.mjs +0 -100
- package/esm2022/lib/services/storage/storage.service.mjs +0 -59
- package/esm2022/lib/services/template/template.service.mjs +0 -335
- package/esm2022/lib/services/translation/translation.service.mjs +0 -121
- package/esm2022/lib/wrapper.mjs +0 -175
- package/esm2022/public-api.mjs +0 -22
- package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
- package/rangertechnologies-ngnxt-2.1.254.tgz +0 -0
|
@@ -1,360 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
//import { QuestionbookComponent } from '../../pages/questionbook/questionbook.component';
|
|
3
|
-
//import { ComponenthostDirective } from '../../directives/componenthost/componenthost.directive';
|
|
4
|
-
import { CommonModule } from '@angular/common';
|
|
5
|
-
import { NxtCustomTranslatePipe } from '../../pipe/custom-translate.pipe';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "../../services/change/change.service";
|
|
8
|
-
import * as i2 from "@angular/common";
|
|
9
|
-
export class CustomCalendarComponent {
|
|
10
|
-
changeService;
|
|
11
|
-
eventSelected = new EventEmitter();
|
|
12
|
-
// VD 06Sep24 calendar changes
|
|
13
|
-
dateSelected = new EventEmitter();
|
|
14
|
-
openModal = new EventEmitter();
|
|
15
|
-
closeModal = new EventEmitter();
|
|
16
|
-
allEvents = [];
|
|
17
|
-
question;
|
|
18
|
-
nxtId;
|
|
19
|
-
//@ViewChild(ComponenthostDirective, { static: true }) dynamicHost: ComponenthostDirective;
|
|
20
|
-
entries = [];
|
|
21
|
-
referenceQuestions = [];
|
|
22
|
-
qbRefrenceBook;
|
|
23
|
-
calendarQuestion = [];
|
|
24
|
-
calendar = {};
|
|
25
|
-
currentDate = new Date();
|
|
26
|
-
calendarDays = [];
|
|
27
|
-
daysOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
28
|
-
newEventTitle = '';
|
|
29
|
-
newEventTime = '';
|
|
30
|
-
newDescription = '';
|
|
31
|
-
newLink = '';
|
|
32
|
-
selectedDay = null;
|
|
33
|
-
isModalOpen = false;
|
|
34
|
-
modalTitle = 'Custom Modal';
|
|
35
|
-
modalSize = 'large';
|
|
36
|
-
saveButtonValue = 'Save';
|
|
37
|
-
modalFooter = true;
|
|
38
|
-
editingEventId;
|
|
39
|
-
editingEntryGroup;
|
|
40
|
-
showAppoinmentSection = true;
|
|
41
|
-
subscription;
|
|
42
|
-
constructor(changeService) {
|
|
43
|
-
this.changeService = changeService;
|
|
44
|
-
}
|
|
45
|
-
ngOnInit() {
|
|
46
|
-
if (this.question?.input) {
|
|
47
|
-
this.allEvents = this.question.input;
|
|
48
|
-
}
|
|
49
|
-
this.processQuestion();
|
|
50
|
-
this.generateCalendar();
|
|
51
|
-
this.subscription = this.changeService.customChange$.subscribe((changeValue) => {
|
|
52
|
-
if (changeValue == 'calendar-modal-save') {
|
|
53
|
-
this.onSave();
|
|
54
|
-
}
|
|
55
|
-
if (changeValue == 'dataBind') {
|
|
56
|
-
if (this.question?.input) {
|
|
57
|
-
this.allEvents = this.question.input;
|
|
58
|
-
}
|
|
59
|
-
this.processQuestion();
|
|
60
|
-
this.generateCalendar();
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
// this.dateSelected.emit(this.calendar);
|
|
64
|
-
//this.eventSelected.emit(this.allEvents);
|
|
65
|
-
}
|
|
66
|
-
// RS 09DEC24 Changed keys
|
|
67
|
-
processQuestion() {
|
|
68
|
-
// SKS20MAR25 check if question fieldsmeta is string
|
|
69
|
-
this.entries = typeof this.question['fieldsMeta'] === 'object' ? this.question['fieldsMeta'] || [] : JSON.parse(this.question['fieldsMeta']);
|
|
70
|
-
this.qbRefrenceBook = typeof this.question['qbReferenceQuestions'] === 'object' ? this.question['qbReferenceQuestions'] : JSON.parse(this.question['qbReferenceQuestions']);
|
|
71
|
-
let title = this.qbRefrenceBook?.questionbook?.title;
|
|
72
|
-
this.modalTitle = title;
|
|
73
|
-
this.referenceQuestions = [];
|
|
74
|
-
if (this.entries.length > 0) {
|
|
75
|
-
this.entries.forEach(element => {
|
|
76
|
-
if (element.questionReference) {
|
|
77
|
-
let qReference = JSON.parse(element.questionReference);
|
|
78
|
-
this.referenceQuestions.push(qReference?.question);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// sunday comment
|
|
84
|
-
// openQuestionBookModal() {
|
|
85
|
-
// const viewContainerRef = this.dynamicHost.viewContainerRef;
|
|
86
|
-
// viewContainerRef.clear();
|
|
87
|
-
// const componentRef = viewContainerRef.createComponent(QuestionbookComponent);
|
|
88
|
-
// componentRef.instance.qbItem = this.qbRefrenceBook;
|
|
89
|
-
// componentRef.instance.questions = this.referenceQuestions;
|
|
90
|
-
// componentRef.instance.handleQuestion.subscribe((event: any) => this.handleQuestionEvent(event));
|
|
91
|
-
// }
|
|
92
|
-
generateCalendar() {
|
|
93
|
-
const year = this.currentDate.getFullYear();
|
|
94
|
-
const month = this.currentDate.getMonth();
|
|
95
|
-
const startOfMonth = new Date(year, month, 1);
|
|
96
|
-
const endOfMonth = new Date(year, month + 1, 0);
|
|
97
|
-
const startDayOfWeek = startOfMonth.getDay();
|
|
98
|
-
const endDayOfWeek = endOfMonth.getDay();
|
|
99
|
-
const startDate = new Date(startOfMonth);
|
|
100
|
-
startDate.setDate(startDate.getDate() - startDayOfWeek);
|
|
101
|
-
const endDate = new Date(endOfMonth);
|
|
102
|
-
endDate.setDate(endDate.getDate() + (6 - endDayOfWeek));
|
|
103
|
-
const today = new Date(new Date().setHours(0, 0, 0, 0));
|
|
104
|
-
this.calendarDays = [];
|
|
105
|
-
for (let d = new Date(startDate); d <= endDate; d.setDate(d.getDate() + 1)) {
|
|
106
|
-
const date = new Date(d);
|
|
107
|
-
this.calendarDays.push({
|
|
108
|
-
date: date,
|
|
109
|
-
events: [],
|
|
110
|
-
isCurrentMonth: d.getMonth() === month,
|
|
111
|
-
isPast: date < today,
|
|
112
|
-
isToday: date.getTime() === today.getTime(),
|
|
113
|
-
isFuture: date > today,
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
// Populate calendar with events from allEvents array
|
|
117
|
-
this.calendarDays.forEach(day => {
|
|
118
|
-
day.events = this.allEvents?.filter(event => event?.date?.toDateString() === day.date.toDateString());
|
|
119
|
-
});
|
|
120
|
-
// VD 06Sep24 calendar changes
|
|
121
|
-
let cal = {};
|
|
122
|
-
cal['year'] = year;
|
|
123
|
-
cal['month'] = month + 1;
|
|
124
|
-
this.calendar = cal;
|
|
125
|
-
}
|
|
126
|
-
selectDay(day) {
|
|
127
|
-
// VD 06Sep24 calendar changes
|
|
128
|
-
this.showAppoinmentSection = true;
|
|
129
|
-
this.selectedDay = day;
|
|
130
|
-
// this.eventSelected.emit(day?.events);
|
|
131
|
-
const previouslySelectedDay = this.calendarDays.find(d => d.isSelected);
|
|
132
|
-
if (previouslySelectedDay) {
|
|
133
|
-
previouslySelectedDay.isSelected = false;
|
|
134
|
-
}
|
|
135
|
-
// Select the clicked day
|
|
136
|
-
day.isSelected = true;
|
|
137
|
-
// VD 09Sep24- setup the query param data for api call
|
|
138
|
-
let referenceData = [];
|
|
139
|
-
this.referenceQuestions.forEach(ques => {
|
|
140
|
-
// VD 09-09-24 get the selected date
|
|
141
|
-
// need to add in the document
|
|
142
|
-
// RS 09DEC24 Changed keys
|
|
143
|
-
if (ques.referenceField == 'selectedDate') {
|
|
144
|
-
ques.input = day.date.toISOString();
|
|
145
|
-
}
|
|
146
|
-
// VD 09-09-24 get the query refrence field data to pass the queryParam for api
|
|
147
|
-
ques['subText'] = typeof ques?.subText === 'object' ? ques?.subText : JSON.parse(ques['subText'] || {});
|
|
148
|
-
if (ques.subText) {
|
|
149
|
-
let subText = ques.subText;
|
|
150
|
-
if (subText.queryField && subText.queryValueReference) {
|
|
151
|
-
let currentQues = ques;
|
|
152
|
-
let queryReferences = subText.queryValueReference.split(',');
|
|
153
|
-
queryReferences.forEach(refField => {
|
|
154
|
-
let refQues = this.referenceQuestions.find(q => q.referenceField === refField);
|
|
155
|
-
if (refQues) {
|
|
156
|
-
referenceData.push(refQues);
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
// Add the referenceData array to the current question
|
|
160
|
-
currentQues.referenceQueryData = referenceData;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
previousMonth() {
|
|
166
|
-
this.showAppoinmentSection = false;
|
|
167
|
-
this.currentDate.setMonth(this.currentDate.getMonth() - 1);
|
|
168
|
-
this.currentDate = new Date(this.currentDate); // Ensure the date object is updated
|
|
169
|
-
this.generateCalendar();
|
|
170
|
-
this.dateSelected.emit(this.calendar);
|
|
171
|
-
this.eventSelected.emit(this.allEvents);
|
|
172
|
-
}
|
|
173
|
-
nextMonth() {
|
|
174
|
-
// VD 06Sep24 calendar changes
|
|
175
|
-
this.showAppoinmentSection = false;
|
|
176
|
-
this.currentDate.setMonth(this.currentDate.getMonth() + 1);
|
|
177
|
-
this.currentDate = new Date(this.currentDate); // Ensure the date object is updated
|
|
178
|
-
this.generateCalendar();
|
|
179
|
-
this.dateSelected.emit(this.calendar);
|
|
180
|
-
this.eventSelected.emit(this.allEvents);
|
|
181
|
-
}
|
|
182
|
-
addAppointment() {
|
|
183
|
-
this.isModalOpen = true;
|
|
184
|
-
this.calendarQuestion = this.referenceQuestions.map(q => ({ ...q, input: '' }));
|
|
185
|
-
this.referenceQuestions.forEach(ques => {
|
|
186
|
-
// clear the input
|
|
187
|
-
if (ques.referenceField != 'selectedDate') {
|
|
188
|
-
if (ques.type == 'Dropdown') {
|
|
189
|
-
delete ques.input;
|
|
190
|
-
delete ques.selectedValue;
|
|
191
|
-
// VD 06Sep24 calendar changes
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
delete ques.input;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
this.editingEventId = null;
|
|
199
|
-
this.calendarQuestion = this.referenceQuestions;
|
|
200
|
-
this.openBookModel();
|
|
201
|
-
// sunday comment
|
|
202
|
-
//this.openQuestionBookModal();
|
|
203
|
-
}
|
|
204
|
-
openBookModel() {
|
|
205
|
-
this.openModal.emit({
|
|
206
|
-
qbRefrenceBook: this.qbRefrenceBook,
|
|
207
|
-
referenceQuestions: this.referenceQuestions,
|
|
208
|
-
modalTitle: this.modalTitle,
|
|
209
|
-
modalSize: this.modalSize,
|
|
210
|
-
saveButtonValue: this.saveButtonValue,
|
|
211
|
-
modalFooter: this.modalFooter,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
closeCalendarModal() {
|
|
215
|
-
this.isModalOpen = false;
|
|
216
|
-
this.closeModal.emit(true);
|
|
217
|
-
}
|
|
218
|
-
// VD 06Sep24 calendar changes
|
|
219
|
-
editEvent(event, entryGroup) {
|
|
220
|
-
this.isModalOpen = true;
|
|
221
|
-
this.referenceQuestions = Object.values(entryGroup);
|
|
222
|
-
this.calendarQuestion = [...this.referenceQuestions]; // Make a copy of the current entries to edit
|
|
223
|
-
this.editingEventId = event.id;
|
|
224
|
-
this.editingEntryGroup = entryGroup; // Store the entry group being edited
|
|
225
|
-
this.generateCalendar(); // Regenerate the calendar to reflect changes
|
|
226
|
-
this.openBookModel();
|
|
227
|
-
// suday comment
|
|
228
|
-
// this.openQuestionBookModal();
|
|
229
|
-
}
|
|
230
|
-
deleteEvent(eventId, entryGroup) {
|
|
231
|
-
let event = this.allEvents?.find(e => e?.id === eventId);
|
|
232
|
-
if (event) {
|
|
233
|
-
// Find the index of the entryGroup to delete
|
|
234
|
-
const entryIndex = event.entries.indexOf(entryGroup);
|
|
235
|
-
if (entryIndex > -1) {
|
|
236
|
-
event.entries.splice(entryIndex, 1); // Remove the specific entry
|
|
237
|
-
}
|
|
238
|
-
// If the event has no more entries, remove the event entirely
|
|
239
|
-
if (event.entries.length === 0) {
|
|
240
|
-
const eventIndex = this.allEvents?.indexOf(event);
|
|
241
|
-
if (eventIndex > -1) {
|
|
242
|
-
this.allEvents?.splice(eventIndex, 1); // Remove the entire event
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
let eventData = {};
|
|
247
|
-
eventData['action'] = "delete";
|
|
248
|
-
eventData['data'] = event;
|
|
249
|
-
this.eventSelected.emit(eventData);
|
|
250
|
-
this.generateCalendar(); // Regenerate the calendar to reflect the changes
|
|
251
|
-
}
|
|
252
|
-
// VD 06Sep24 calendar changes
|
|
253
|
-
addEvent(day, entryQues) {
|
|
254
|
-
// Transform new entries into the desired format
|
|
255
|
-
const newEntries = entryQues.reduce((acc, q) => {
|
|
256
|
-
acc[q.id] = { ...q };
|
|
257
|
-
return acc;
|
|
258
|
-
}, {});
|
|
259
|
-
// Find an existing event for the given date
|
|
260
|
-
const existingEvent = day.events?.find(event => event.date === day.date);
|
|
261
|
-
if (existingEvent) {
|
|
262
|
-
// Merge new entries into the existing event's entries array
|
|
263
|
-
// Check if the entries array already contains an object with the same id
|
|
264
|
-
const existingEntries = existingEvent.entries.map(entry => ({ ...entry }));
|
|
265
|
-
// Append new entries to the existing entries
|
|
266
|
-
existingEntries.push(newEntries);
|
|
267
|
-
existingEvent.entries = existingEntries;
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
// Create a new event if it doesn't exist for the given date
|
|
271
|
-
const newEvent = {
|
|
272
|
-
id: this.generateId(),
|
|
273
|
-
date: day.date,
|
|
274
|
-
entries: [newEntries] // Wrap the new entries in an array
|
|
275
|
-
};
|
|
276
|
-
day.events = day?.events || [];
|
|
277
|
-
day.events.push(newEvent);
|
|
278
|
-
this.allEvents?.push(newEvent);
|
|
279
|
-
//this.eventSelected.emit(this.allEvents);
|
|
280
|
-
let eventData = {};
|
|
281
|
-
eventData['action'] = "add";
|
|
282
|
-
eventData['data'] = newEvent;
|
|
283
|
-
this.eventSelected.emit(eventData);
|
|
284
|
-
}
|
|
285
|
-
this.generateCalendar();
|
|
286
|
-
}
|
|
287
|
-
// VD 06Sep24 calendar changes
|
|
288
|
-
onSave() {
|
|
289
|
-
if (this.editingEventId !== null) {
|
|
290
|
-
const event = this.allEvents?.find(e => e?.id === this.editingEventId);
|
|
291
|
-
if (event && this.editingEntryGroup) {
|
|
292
|
-
// Update the specific entry group within the event
|
|
293
|
-
const entryIndex = event.entries.findIndex(entryGroup => entryGroup === this.editingEntryGroup);
|
|
294
|
-
if (entryIndex > -1) {
|
|
295
|
-
event.entries[entryIndex] = this.calendarQuestion.reduce((acc, q) => {
|
|
296
|
-
acc[q.id] = { ...q };
|
|
297
|
-
return acc;
|
|
298
|
-
}, {});
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
// this.eventSelected.emit(this.allEvents);
|
|
302
|
-
let eventData = {};
|
|
303
|
-
eventData['action'] = "edit";
|
|
304
|
-
eventData['data'] = event;
|
|
305
|
-
this.eventSelected.emit(eventData);
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
if (this.selectedDay) {
|
|
309
|
-
this.addEvent(this.selectedDay, this.calendarQuestion);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
this.closeCalendarModal();
|
|
313
|
-
this.generateCalendar();
|
|
314
|
-
}
|
|
315
|
-
// onCancel() {
|
|
316
|
-
// this.closeCalendarModal();
|
|
317
|
-
// }
|
|
318
|
-
//this funtion need to be used
|
|
319
|
-
// handleQuestionEvent(ques){
|
|
320
|
-
// // Update the questions array with the new question
|
|
321
|
-
// const index = this.calendarQuestion.findIndex(q => q.id === ques.id);
|
|
322
|
-
// if (index > -1) {
|
|
323
|
-
// // If question already exists, update it
|
|
324
|
-
// this.calendarQuestion[index] = ques;
|
|
325
|
-
// } else {
|
|
326
|
-
// // If question doesn't exist, add it to the array
|
|
327
|
-
// this.calendarQuestion.push(ques);
|
|
328
|
-
// }
|
|
329
|
-
// }
|
|
330
|
-
// VD 06Sep24 calendar changes
|
|
331
|
-
generateId() {
|
|
332
|
-
return '_' + Math.random().toString(36).substr(2, 9);
|
|
333
|
-
}
|
|
334
|
-
getEntryKeys(entryGroup) {
|
|
335
|
-
return Object.keys(entryGroup);
|
|
336
|
-
}
|
|
337
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomCalendarComponent, deps: [{ token: i1.ChangeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
338
|
-
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' | nxtCustomTranslate : 'Previous' }} >></button>\n <h3>{{ currentDate | date: 'MMMM yyyy' }}</h3>\n <button (click)=\"nextMonth()\"><< {{ 'NEXT' | nxtCustomTranslate : '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' | nxtCustomTranslate : 'Add Appointment' }}</h4>\n <button *ngIf=\"selectedDay\" (click)=\"addAppointment()\">{{ 'ADD' | nxtCustomTranslate : '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' | nxtCustomTranslate : '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 {{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\">{{entryGroup[key].questionText}}</a>\n </span>\n </div>\n </div>\n <div class=\"event-actions\">\n <button (click)=\"editEvent(event,entryGroup)\">{{ 'EDIT' | nxtCustomTranslate : 'Edit' }}</button>\n <button (click)=\"deleteEvent(event.id,entryGroup)\">{{ 'DELETE' | nxtCustomTranslate : '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" }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
|
|
339
|
-
}
|
|
340
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomCalendarComponent, decorators: [{
|
|
341
|
-
type: Component,
|
|
342
|
-
args: [{ selector: 'app-custom-calendar', standalone: true, imports: [
|
|
343
|
-
CommonModule, NxtCustomTranslatePipe
|
|
344
|
-
], template: "<div class=\"align-calendar\">\n <div class=\"calendar-container\">\n <div class=\"calendar-header\">\n <button (click)=\"previousMonth()\"><< {{ 'PREVIOUS' | nxtCustomTranslate : 'Previous' }} >></button>\n <h3>{{ currentDate | date: 'MMMM yyyy' }}</h3>\n <button (click)=\"nextMonth()\"><< {{ 'NEXT' | nxtCustomTranslate : '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' | nxtCustomTranslate : 'Add Appointment' }}</h4>\n <button *ngIf=\"selectedDay\" (click)=\"addAppointment()\">{{ 'ADD' | nxtCustomTranslate : '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' | nxtCustomTranslate : '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 {{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\">{{entryGroup[key].questionText}}</a>\n </span>\n </div>\n </div>\n <div class=\"event-actions\">\n <button (click)=\"editEvent(event,entryGroup)\">{{ 'EDIT' | nxtCustomTranslate : 'Edit' }}</button>\n <button (click)=\"deleteEvent(event.id,entryGroup)\">{{ 'DELETE' | nxtCustomTranslate : '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"] }]
|
|
345
|
-
}], ctorParameters: () => [{ type: i1.ChangeService }], propDecorators: { eventSelected: [{
|
|
346
|
-
type: Output
|
|
347
|
-
}], dateSelected: [{
|
|
348
|
-
type: Output
|
|
349
|
-
}], openModal: [{
|
|
350
|
-
type: Output
|
|
351
|
-
}], closeModal: [{
|
|
352
|
-
type: Output
|
|
353
|
-
}], allEvents: [{
|
|
354
|
-
type: Input
|
|
355
|
-
}], question: [{
|
|
356
|
-
type: Input
|
|
357
|
-
}], nxtId: [{
|
|
358
|
-
type: Input
|
|
359
|
-
}] } });
|
|
360
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2N1c3RvbS1jYWxlbmRhci9jdXN0b20tY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLWNhbGVuZGFyL2N1c3RvbS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUVySCwwRkFBMEY7QUFDMUYsa0dBQWtHO0FBQ2xHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7OztBQW1CMUUsTUFBTSxPQUFPLHVCQUF1QjtJQWdDYjtJQS9CWCxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUNsRCw4QkFBOEI7SUFDcEIsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdkMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDcEMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdEMsU0FBUyxHQUFVLEVBQUUsQ0FBQztJQUN0QixRQUFRLENBQVU7SUFDbEIsS0FBSyxDQUFTO0lBQ3ZCLDJGQUEyRjtJQUMzRixPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2Isa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLGNBQWMsQ0FBSztJQUNuQixnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDdEIsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNkLFdBQVcsR0FBUyxJQUFJLElBQUks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QUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsWUFBWSxDQUFDLFVBQWU7UUFDMUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7d0dBNVZZLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLHNSQ3pCcEMsNG1KQXFGdUIsNnJERGpFbkIsWUFBWSw4U0FBRSxzQkFBc0I7OzRGQUszQix1QkFBdUI7a0JBVG5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZLEVBQUUsc0JBQXNCO3FCQUNyQztrRkFLUyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSAnLi4vLi4vd3JhcHBlcic7XG4vL2ltcG9ydCB7IFF1ZXN0aW9uYm9va0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhZ2VzL3F1ZXN0aW9uYm9vay9xdWVzdGlvbmJvb2suY29tcG9uZW50Jztcbi8vaW1wb3J0IHsgQ29tcG9uZW50aG9zdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29tcG9uZW50aG9zdC9jb21wb25lbnRob3N0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoYW5nZS9jaGFuZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBOeHRDdXN0b21UcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZS9jdXN0b20tdHJhbnNsYXRlLnBpcGUnO1xuaW50ZXJmYWNlIENhbGVuZGFyRGF5IHtcbiAgZGF0ZTogRGF0ZTtcbiAgZXZlbnRzOiBhbnlbXTtcbiAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW47XG4gIGlzUGFzdDogYm9vbGVhbjtcbiAgaXNUb2RheTogYm9vbGVhbjtcbiAgaXNGdXR1cmU6IGJvb2xlYW47XG4gIGlzU2VsZWN0ZWQ/OiBib29sZWFuO1xufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWN1c3RvbS1jYWxlbmRhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsIE54dEN1c3RvbVRyYW5zbGF0ZVBpcGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1jYWxlbmRhci5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQE91dHB1dCgpIGV2ZW50U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIEBPdXRwdXQoKSBkYXRlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9wZW5Nb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgY2xvc2VNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSBhbGxFdmVudHM6IGFueVtdID0gW107IFxuICBASW5wdXQoKSBxdWVzdGlvbjogUXVlc3Rpb25cbiAgQElucHV0KCkgbnh0SWQ6IHN0cmluZztcbiAgLy9AVmlld0NoaWxkKENvbXBvbmVudGhvc3REaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGR5bmFtaWNIb3N0OiBDb21wb25lbnRob3N0RGlyZWN0aXZlO1xuICBlbnRyaWVzID0gW107XG4gIHJlZmVyZW5jZVF1ZXN0aW9ucyA9IFtdO1xuICBxYlJlZnJlbmNlQm9vazphbnk7XG4gIGNhbGVuZGFyUXVlc3Rpb24gPSBbXTtcbiAgY2FsZW5kYXIgPSB7fTtcbiAgY3VycmVudERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcbiAgZGF5c09mV2Vlazogc3RyaW5nW10gPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG4gIG5ld0V2ZW50VGl0bGU6IHN0cmluZyA9ICcnO1xuICBuZXdFdmVudFRpbWU6IHN0cmluZyA9ICcnO1xuICBuZXdEZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIG5ld0xpbms6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZERheTogQ2FsZW5kYXJEYXkgfCBudWxsID0gbnVsbDtcbiAgaXNNb2RhbE9wZW4gPSBmYWxzZTtcbiAgbW9kYWxUaXRsZSA9ICdDdXN0b20gTW9kYWwnO1xuICBtb2RhbFNpemUgPSAnbGFyZ2UnO1xuICBzYXZlQnV0dG9uVmFsdWUgPSAnU2F2ZSc7XG4gIG1vZGFsRm9vdGVyID0gdHJ1ZTtcbiAgZWRpdGluZ0V2ZW50SWQ6IG51bWJlcjtcbiAgZWRpdGluZ0VudHJ5R3JvdXA6IGFueTtcbiAgc2hvd0FwcG9pbm1lbnRTZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgc3Vic2NyaXB0aW9uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIGNoYW5nZVNlcnZpY2U6IENoYW5nZVNlcnZpY2UpIHsgfVxuICBuZ09uSW5pdCgpIHtcbiAgICAgaWYodGhpcy5xdWVzdGlvbj8uaW5wdXQpe1xuICAgICAgdGhpcy5hbGxFdmVudHMgPSB0aGlzLnF1ZXN0aW9uLmlucHV0O1xuICAgICB9XG4gICAgdGhpcy5wcm9jZXNzUXVlc3Rpb24oKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2hhbmdlU2VydmljZS5jdXN0b21DaGFuZ2UkLnN1YnNjcmliZShcbiAgICAgIChjaGFuZ2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmKGNoYW5nZVZhbHVlID09ICdjYWxlbmRhci1tb2RhbC1zYXZlJykge1xuICAgICAgICAgICAgdGhpcy5vblNhdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoY2hhbmdlVmFsdWUgPT0gJ2RhdGFCaW5kJykge1xuICAgICAgICAgICAgaWYodGhpcy5xdWVzdGlvbj8uaW5wdXQpe1xuICAgICAgICAgICAgICB0aGlzLmFsbEV2ZW50cyA9IHRoaXMucXVlc3Rpb24uaW5wdXQ7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVlc3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgLy8gdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdCh0aGlzLmNhbGVuZGFyKTtcbiAgICAvL3RoaXMuZXZlbnRTZWxlY3RlZC5lbWl0KHRoaXMuYWxsRXZlbnRzKTtcbiAgfVxuICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xuICBwcm9jZXNzUXVlc3Rpb24oKXtcbiAgICAvLyBTS1MyME1BUjI1IGNoZWNrIGlmIHF1ZXN0aW9uIGZpZWxkc21ldGEgaXMgc3RyaW5nXG4gICAgdGhpcy5lbnRyaWVzID0gIHR5cGVvZiB0aGlzLnF1ZXN0aW9uWydmaWVsZHNNZXRhJ10gPT09ICdvYmplY3QnICA/ICB0aGlzLnF1ZXN0aW9uWydmaWVsZHNNZXRhJ10gfHwgW10gOiBKU09OLnBhcnNlKCB0aGlzLnF1ZXN0aW9uWydmaWVsZHNNZXRhJ10pIDtcbiAgICB0aGlzLnFiUmVmcmVuY2VCb29rID0gdHlwZW9mIHRoaXMucXVlc3Rpb25bJ3FiUmVmZXJlbmNlUXVlc3Rpb25zJ10gPT09ICdvYmplY3QnICA/ICB0aGlzLnF1ZXN0aW9uWydxYlJlZmVyZW5jZVF1ZXN0aW9ucyddIDogSlNPTi5wYXJzZSggdGhpcy5xdWVzdGlvblsncWJSZWZlcmVuY2VRdWVzdGlvbnMnXSkgO1xuICAgIGxldCB0aXRsZSA9IHRoaXMucWJSZWZyZW5jZUJvb2s/LnF1ZXN0aW9uYm9vaz8udGl0bGU7XG4gICAgdGhpcy5tb2RhbFRpdGxlID0gdGl0bGU7XG4gICAgdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnMgPSBbXTtcbiAgICBpZih0aGlzLmVudHJpZXMubGVuZ3RoID4gMCl7XG4gICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgIGlmKGVsZW1lbnQucXVlc3Rpb25SZWZlcmVuY2Upe1xuICAgICAgICAgICAgIGxldCBxUmVmZXJlbmNlID0gSlNPTi5wYXJzZShlbGVtZW50LnF1ZXN0aW9uUmVmZXJlbmNlKTtcbiAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucy5wdXNoKHFSZWZlcmVuY2U/LnF1ZXN0aW9uKTtcbiAgICAgICAgICAgfVxuICAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAgLy8gc3VuZGF5IGNvbW1lbnRcbiAgLy8gb3BlblF1ZXN0aW9uQm9va01vZGFsKCkge1xuICAvLyAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSB0aGlzLmR5bmFtaWNIb3N0LnZpZXdDb250YWluZXJSZWY7XG4gIC8vICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAvLyAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFF1ZXN0aW9uYm9va0NvbXBvbmVudCk7XG4gIC8vICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnFiSXRlbSA9IHRoaXMucWJSZWZyZW5jZUJvb2s7XG4gIC8vICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnF1ZXN0aW9ucyA9IHRoaXMucmVmZXJlbmNlUXVlc3Rpb25zO1xuICAvLyAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5oYW5kbGVRdWVzdGlvbi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHRoaXMuaGFuZGxlUXVlc3Rpb25FdmVudChldmVudCkpO1xuICAvLyB9XG5cbiAgZ2VuZXJhdGVDYWxlbmRhcigpIHtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50RGF0ZS5nZXRNb250aCgpO1xuXG4gICAgY29uc3Qgc3RhcnRPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgIGNvbnN0IGVuZE9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApO1xuXG4gICAgY29uc3Qgc3RhcnREYXlPZldlZWsgPSBzdGFydE9mTW9udGguZ2V0RGF5KCk7XG4gICAgY29uc3QgZW5kRGF5T2ZXZWVrID0gZW5kT2ZNb250aC5nZXREYXkoKTtcblxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKHN0YXJ0T2ZNb250aCk7XG4gICAgc3RhcnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSAtIHN0YXJ0RGF5T2ZXZWVrKTtcblxuICAgIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShlbmRPZk1vbnRoKTtcbiAgICBlbmREYXRlLnNldERhdGUoZW5kRGF0ZS5nZXREYXRlKCkgKyAoNiAtIGVuZERheU9mV2VlaykpO1xuXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLnNldEhvdXJzKDAsIDAsIDAsIDApKTtcbiAgICBcbiAgICAgdGhpcy5jYWxlbmRhckRheXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGQgPSBuZXcgRGF0ZShzdGFydERhdGUpOyBkIDw9IGVuZERhdGU7IGQuc2V0RGF0ZShkLmdldERhdGUoKSArIDEpKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkKTtcbiAgICAgICAgdGhpcy5jYWxlbmRhckRheXMucHVzaCh7XG4gICAgICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgIGlzQ3VycmVudE1vbnRoOiBkLmdldE1vbnRoKCkgPT09IG1vbnRoLFxuICAgICAgICAgIGlzUGFzdDogZGF0ZSA8IHRvZGF5LFxuICAgICAgICAgIGlzVG9kYXk6IGRhdGUuZ2V0VGltZSgpID09PSB0b2RheS5nZXRUaW1lKCksXG4gICAgICAgICAgaXNGdXR1cmU6IGRhdGUgPiB0b2RheSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAvLyBQb3B1bGF0ZSBjYWxlbmRhciB3aXRoIGV2ZW50cyBmcm9tIGFsbEV2ZW50cyBhcnJheVxuICAgIHRoaXMuY2FsZW5kYXJEYXlzLmZvckVhY2goZGF5ID0+IHtcbiAgICAgIGRheS5ldmVudHMgPSB0aGlzLmFsbEV2ZW50cz8uZmlsdGVyKGV2ZW50ID0+IGV2ZW50Py5kYXRlPy50b0RhdGVTdHJpbmcoKSA9PT0gZGF5LmRhdGUudG9EYXRlU3RyaW5nKCkpO1xuICAgIH0pO1xuICAgICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgICBsZXQgY2FsID0ge31cbiAgICBjYWxbJ3llYXInXSA9IHllYXI7XG4gICAgY2FsWydtb250aCddID0gbW9udGggKyAxO1xuICAgIHRoaXMuY2FsZW5kYXIgPSBjYWw7XG4gIH1cblxuICBzZWxlY3REYXkoZGF5OiBDYWxlbmRhckRheSkge1xuICAgICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgICB0aGlzLnNob3dBcHBvaW5tZW50U2VjdGlvbiA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZERheSA9IGRheTtcbiAgIC8vIHRoaXMuZXZlbnRTZWxlY3RlZC5lbWl0KGRheT8uZXZlbnRzKTtcbiAgICBjb25zdCBwcmV2aW91c2x5U2VsZWN0ZWREYXkgPSB0aGlzLmNhbGVuZGFyRGF5cy5maW5kKGQgPT4gZC5pc1NlbGVjdGVkKTtcbiAgICBpZiAocHJldmlvdXNseVNlbGVjdGVkRGF5KSB7XG4gICAgICBwcmV2aW91c2x5U2VsZWN0ZWREYXkuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBTZWxlY3QgdGhlIGNsaWNrZWQgZGF5XG4gICAgZGF5LmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgLy8gVkQgMDlTZXAyNC0gc2V0dXAgdGhlIHF1ZXJ5IHBhcmFtIGRhdGEgZm9yIGFwaSBjYWxsXG4gICAgbGV0IHJlZmVyZW5jZURhdGEgPSBbXTtcbiAgICB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucy5mb3JFYWNoKHF1ZXMgPT4ge1xuICAgICAgLy8gVkQgMDktMDktMjQgZ2V0IHRoZSBzZWxlY3RlZCBkYXRlXG4gICAgICAvLyBuZWVkIHRvIGFkZCBpbiB0aGUgZG9jdW1lbnRcbiAgICAgIC8vIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzXG4gICAgICAgaWYocXVlcy5yZWZlcmVuY2VGaWVsZCA9PSAnc2VsZWN0ZWREYXRlJyl7XG4gICAgICAgICAgcXVlcy5pbnB1dCA9IGRheS5kYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgfVxuICAgICAgIC8vIFZEIDA5LTA5LTI0IGdldCB0aGUgcXVlcnkgcmVmcmVuY2UgIGZpZWxkIGRhdGEgdG8gcGFzcyB0aGUgcXVlcnlQYXJhbSAgZm9yIGFwaVxuICAgICAgcXVlc1snc3ViVGV4dCddID0gdHlwZW9mIHF1ZXM/LnN1YlRleHQgPT09ICdvYmplY3QnID8gcXVlcz8uc3ViVGV4dCA6IEpTT04ucGFyc2UocXVlc1snc3ViVGV4dCddIHx8IHt9KTtcbiAgICAgICBpZihxdWVzLnN1YlRleHQpe1xuICAgICAgICBsZXQgc3ViVGV4dCA9IHF1ZXMuc3ViVGV4dDtcbiAgICAgICAgaWYgKHN1YlRleHQucXVlcnlGaWVsZCAmJiBzdWJUZXh0LnF1ZXJ5VmFsdWVSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50UXVlcyA9IHF1ZXM7XG4gICAgICAgICAgICBsZXQgcXVlcnlSZWZlcmVuY2VzID0gc3ViVGV4dC5xdWVyeVZhbHVlUmVmZXJlbmNlLnNwbGl0KCcsJyk7ICAgXG4gICAgICAgICAgICBxdWVyeVJlZmVyZW5jZXMuZm9yRWFjaChyZWZGaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlZlF1ZXMgPSB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucy5maW5kKHEgPT4gcS5yZWZlcmVuY2VGaWVsZCA9PT0gcmVmRmllbGQpO1xuICAgICAgICAgICAgICAgIGlmIChyZWZRdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZURhdGEucHVzaChyZWZRdWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVmZXJlbmNlRGF0YSBhcnJheSB0byB0aGUgY3VycmVudCBxdWVzdGlvblxuICAgICAgICAgICAgY3VycmVudFF1ZXMucmVmZXJlbmNlUXVlcnlEYXRhID0gcmVmZXJlbmNlRGF0YTtcbiAgICAgICAgfVxuICAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJldmlvdXNNb250aCgpIHtcbiAgICB0aGlzLnNob3dBcHBvaW5tZW50U2VjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudERhdGUuc2V0TW9udGgodGhpcy5jdXJyZW50RGF0ZS5nZXRNb250aCgpIC0gMSk7XG4gICAgdGhpcy5jdXJyZW50RGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUpOyAvLyBFbnN1cmUgdGhlIGRhdGUgb2JqZWN0IGlzIHVwZGF0ZWRcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLmRhdGVTZWxlY3RlZC5lbWl0KHRoaXMuY2FsZW5kYXIpO1xuICAgIHRoaXMuZXZlbnRTZWxlY3RlZC5lbWl0KHRoaXMuYWxsRXZlbnRzKTtcbiAgfVxuXG4gIG5leHRNb250aCgpIHtcbiAgICAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gICAgdGhpcy5zaG93QXBwb2lubWVudFNlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnREYXRlLnNldE1vbnRoKHRoaXMuY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgIHRoaXMuY3VycmVudERhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnREYXRlKTsgLy8gRW5zdXJlIHRoZSBkYXRlIG9iamVjdCBpcyB1cGRhdGVkXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdCh0aGlzLmNhbGVuZGFyKTtcbiAgICB0aGlzLmV2ZW50U2VsZWN0ZWQuZW1pdCh0aGlzLmFsbEV2ZW50cyk7XG4gIH1cblxuICBhZGRBcHBvaW50bWVudCgpIHtcbiAgICB0aGlzLmlzTW9kYWxPcGVuID0gdHJ1ZTtcbiAgICAgdGhpcy5jYWxlbmRhclF1ZXN0aW9uID0gdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnMubWFwKHEgPT4gKHsgLi4ucSwgaW5wdXQ6ICcnIH0pKTtcbiAgICB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucy5mb3JFYWNoKHF1ZXMgPT4ge1xuICAgICAgLy8gY2xlYXIgdGhlIGlucHV0XG4gICAgICBpZihxdWVzLnJlZmVyZW5jZUZpZWxkICE9ICdzZWxlY3RlZERhdGUnKXtcbiAgICAgICAgaWYocXVlcy50eXBlID09ICdEcm9wZG93bicpe1xuICAgICAgICAgIGRlbGV0ZSBxdWVzLmlucHV0O1xuICAgICAgICAgIGRlbGV0ZSBxdWVzLnNlbGVjdGVkVmFsdWU7XG4gICAgICAgICAgIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHF1ZXMuaW5wdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVkaXRpbmdFdmVudElkID0gbnVsbDtcbiAgICB0aGlzLmNhbGVuZGFyUXVlc3Rpb24gPSB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucztcbiAgICB0aGlzLm9wZW5Cb29rTW9kZWwoKTtcbiAgICAvLyBzdW5kYXkgY29tbWVudFxuICAgIC8vdGhpcy5vcGVuUXVlc3Rpb25Cb29rTW9kYWwoKTtcbiAgfVxuXG4gIG9wZW5Cb29rTW9kZWwoKXtcbiAgICB0aGlzLm9wZW5Nb2RhbC5lbWl0KHtcbiAgICAgIHFiUmVmcmVuY2VCb29rOiB0aGlzLnFiUmVmcmVuY2VCb29rLFxuICAgICAgcmVmZXJlbmNlUXVlc3Rpb25zOiB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucyxcbiAgICAgIG1vZGFsVGl0bGUgOiB0aGlzLm1vZGFsVGl0bGUsXG4gICAgICBtb2RhbFNpemUgOiB0aGlzLm1vZGFsU2l6ZSxcbiAgICAgIHNhdmVCdXR0b25WYWx1ZSA6IHRoaXMuc2F2ZUJ1dHRvblZhbHVlLFxuICAgICAgbW9kYWxGb290ZXIgOiB0aGlzLm1vZGFsRm9vdGVyLFxuXG4gICAgfSk7XG4gIH1cblxuICBjbG9zZUNhbGVuZGFyTW9kYWwoKSB7XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2xvc2VNb2RhbC5lbWl0KHRydWUpO1xuICB9XG4gLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG5cbmVkaXRFdmVudChldmVudDogYW55LCBlbnRyeUdyb3VwOiBhbnkpIHtcbiAgdGhpcy5pc01vZGFsT3BlbiA9IHRydWU7XG4gIHRoaXMucmVmZXJlbmNlUXVlc3Rpb25zID0gT2JqZWN0LnZhbHVlcyhlbnRyeUdyb3VwKTtcbiAgdGhpcy5jYWxlbmRhclF1ZXN0aW9uID0gWy4uLnRoaXMucmVmZXJlbmNlUXVlc3Rpb25zXTsgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZW50cmllcyB0byBlZGl0XG4gIHRoaXMuZWRpdGluZ0V2ZW50SWQgPSBldmVudC5pZDtcbiAgdGhpcy5lZGl0aW5nRW50cnlHcm91cCA9IGVudHJ5R3JvdXA7IC8vIFN0b3JlIHRoZSBlbnRyeSBncm91cCBiZWluZyBlZGl0ZWRcbiAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7IC8vIFJlZ2VuZXJhdGUgdGhlIGNhbGVuZGFyIHRvIHJlZmxlY3QgY2hhbmdlc1xuICB0aGlzLm9wZW5Cb29rTW9kZWwoKTtcbiAgLy8gc3VkYXkgY29tbWVudFxuIC8vIHRoaXMub3BlblF1ZXN0aW9uQm9va01vZGFsKCk7XG5cbn1cblxuZGVsZXRlRXZlbnQoIGV2ZW50SWQ6IG51bWJlciwgZW50cnlHcm91cDogYW55KSB7XG4gIGxldCBldmVudCA9IHRoaXMuYWxsRXZlbnRzPy5maW5kKGUgPT4gZT8uaWQgPT09IGV2ZW50SWQpO1xuICBpZiAoZXZlbnQpIHtcbiAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBlbnRyeUdyb3VwIHRvIGRlbGV0ZVxuICAgICAgY29uc3QgZW50cnlJbmRleCA9IGV2ZW50LmVudHJpZXMuaW5kZXhPZihlbnRyeUdyb3VwKTtcbiAgICAgIGlmIChlbnRyeUluZGV4ID4gLTEpIHtcbiAgICAgICAgICBldmVudC5lbnRyaWVzLnNwbGljZShlbnRyeUluZGV4LCAxKTsgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpYyBlbnRyeVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgZXZlbnQgaGFzIG5vIG1vcmUgZW50cmllcywgcmVtb3ZlIHRoZSBldmVudCBlbnRpcmVseVxuICAgICAgaWYgKGV2ZW50LmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IHRoaXMuYWxsRXZlbnRzPy5pbmRleE9mKGV2ZW50KTtcbiAgICAgICAgICBpZiAoZXZlbnRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWxsRXZlbnRzPy5zcGxpY2UoZXZlbnRJbmRleCwgMSk7IC8vIFJlbW92ZSB0aGUgZW50aXJlIGV2ZW50XG4gICAgICAgICAgfVxuICAgICAgfVxuICB9XG4gIGxldCBldmVudERhdGEgPSB7fTtcbiAgIGV2ZW50RGF0YVsnYWN0aW9uJ10gPSBcImRlbGV0ZVwiO1xuICAgZXZlbnREYXRhWydkYXRhJ10gPSBldmVudDtcbiAgdGhpcy5ldmVudFNlbGVjdGVkLmVtaXQoZXZlbnREYXRhKTtcbiAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7IC8vIFJlZ2VuZXJhdGUgdGhlIGNhbGVuZGFyIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXNcbn1cblxuIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBhZGRFdmVudChkYXk6IENhbGVuZGFyRGF5LCBlbnRyeVF1ZXMpIHtcbiAgICAvLyBUcmFuc2Zvcm0gbmV3IGVudHJpZXMgaW50byB0aGUgZGVzaXJlZCBmb3JtYXRcbiAgICBjb25zdCBuZXdFbnRyaWVzID0gZW50cnlRdWVzLnJlZHVjZSgoYWNjLCBxKSA9PiB7XG4gICAgICAgIGFjY1txLmlkXSA9IHsgLi4ucSB9O1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIC8vIEZpbmQgYW4gZXhpc3RpbmcgZXZlbnQgZm9yIHRoZSBnaXZlbiBkYXRlXG4gICAgY29uc3QgZXhpc3RpbmdFdmVudCA9IGRheS5ldmVudHM/LmZpbmQoZXZlbnQgPT4gZXZlbnQuZGF0ZSA9PT0gZGF5LmRhdGUpO1xuXG4gICAgaWYgKGV4aXN0aW5nRXZlbnQpIHtcbiAgICAgICAgLy8gTWVyZ2UgbmV3IGVudHJpZXMgaW50byB0aGUgZXhpc3RpbmcgZXZlbnQncyBlbnRyaWVzIGFycmF5XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRyaWVzIGFycmF5IGFscmVhZHkgY29udGFpbnMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgaWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbnRyaWVzID0gZXhpc3RpbmdFdmVudC5lbnRyaWVzLm1hcChlbnRyeSA9PiAoeyAuLi5lbnRyeSB9KSk7XG4gICAgICAgIC8vIEFwcGVuZCBuZXcgZW50cmllcyB0byB0aGUgZXhpc3RpbmcgZW50cmllc1xuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaChuZXdFbnRyaWVzKTtcbiAgICAgICAgZXhpc3RpbmdFdmVudC5lbnRyaWVzID0gZXhpc3RpbmdFbnRyaWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBldmVudCBpZiBpdCBkb2Vzbid0IGV4aXN0IGZvciB0aGUgZ2l2ZW4gZGF0ZVxuICAgICAgICBjb25zdCBuZXdFdmVudCA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgICAgIGRhdGU6IGRheS5kYXRlLFxuICAgICAgICAgICAgZW50cmllczogW25ld0VudHJpZXNdIC8vIFdyYXAgdGhlIG5ldyBlbnRyaWVzIGluIGFuIGFycmF5XG4gICAgICAgIH07XG4gICAgICAgIGRheS5ldmVudHMgPSBkYXk/LmV2ZW50cyB8fCBbXVxuICAgICAgICBkYXkuZXZlbnRzLnB1c2gobmV3RXZlbnQpO1xuICAgICAgICB0aGlzLmFsbEV2ZW50cz8ucHVzaChuZXdFdmVudCk7XG4gICAgICAgIC8vdGhpcy5ldmVudFNlbGVjdGVkLmVtaXQodGhpcy5hbGxFdmVudHMpO1xuICAgICAgICBsZXQgZXZlbnREYXRhID0ge307XG4gICAgICAgIGV2ZW50RGF0YVsnYWN0aW9uJ10gPSBcImFkZFwiO1xuICAgICAgICBldmVudERhdGFbJ2RhdGEnXSA9IG5ld0V2ZW50O1xuICAgICAgICB0aGlzLmV2ZW50U2VsZWN0ZWQuZW1pdChldmVudERhdGEpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbn1cbiAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiBvblNhdmUoKSB7XG4gICAgaWYgKHRoaXMuZWRpdGluZ0V2ZW50SWQgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmFsbEV2ZW50cz8uZmluZChlID0+IGU/LmlkID09PSB0aGlzLmVkaXRpbmdFdmVudElkKTtcbiAgICAgICAgaWYgKGV2ZW50ICYmIHRoaXMuZWRpdGluZ0VudHJ5R3JvdXApIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3BlY2lmaWMgZW50cnkgZ3JvdXAgd2l0aGluIHRoZSBldmVudFxuICAgICAgICAgICAgY29uc3QgZW50cnlJbmRleCA9IGV2ZW50LmVudHJpZXMuZmluZEluZGV4KGVudHJ5R3JvdXAgPT4gZW50cnlHcm91cCA9PT0gdGhpcy5lZGl0aW5nRW50cnlHcm91cCk7XG4gICAgICAgICAgICBpZiAoZW50cnlJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQuZW50cmllc1tlbnRyeUluZGV4XSA9IHRoaXMuY2FsZW5kYXJRdWVzdGlvbi5yZWR1Y2UoKGFjYywgcSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhY2NbcS5pZF0gPSB7IC4uLnEgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgLy8gdGhpcy5ldmVudFNlbGVjdGVkLmVtaXQodGhpcy5hbGxFdmVudHMpO1xuICAgICAgbGV0IGV2ZW50RGF0YSA9IHt9O1xuICAgICAgZXZlbnREYXRhWydhY3Rpb24nXSA9IFwiZWRpdFwiO1xuICAgICAgZXZlbnREYXRhWydkYXRhJ10gPSBldmVudDtcbiAgICAgIHRoaXMuZXZlbnRTZWxlY3RlZC5lbWl0KGV2ZW50RGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQodGhpcy5zZWxlY3RlZERheSwgdGhpcy5jYWxlbmRhclF1ZXN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNsb3NlQ2FsZW5kYXJNb2RhbCgpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xufVxuXG4gIC8vIG9uQ2FuY2VsKCkge1xuICAvLyAgIHRoaXMuY2xvc2VDYWxlbmRhck1vZGFsKCk7XG4gIC8vIH1cbiAgLy90aGlzIGZ1bnRpb24gbmVlZCB0byBiZSB1c2VkXG4gIC8vIGhhbmRsZVF1ZXN0aW9uRXZlbnQocXVlcyl7XG4gIC8vICAgICAvLyBVcGRhdGUgdGhlIHF1ZXN0aW9ucyBhcnJheSB3aXRoIHRoZSBuZXcgcXVlc3Rpb25cbiAgLy8gICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jYWxlbmRhclF1ZXN0aW9uLmZpbmRJbmRleChxID0+IHEuaWQgPT09IHF1ZXMuaWQpO1xuICAvLyAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgLy8gICAgICAgLy8gSWYgcXVlc3Rpb24gYWxyZWFkeSBleGlzdHMsIHVwZGF0ZSBpdFxuICAvLyAgICAgICB0aGlzLmNhbGVuZGFyUXVlc3Rpb25baW5kZXhdID0gcXVlcztcbiAgLy8gICAgIH0gZWxzZSB7XG4gIC8vICAgICAgIC8vIElmIHF1ZXN0aW9uIGRvZXNuJ3QgZXhpc3QsIGFkZCBpdCB0byB0aGUgYXJyYXlcbiAgLy8gICAgICAgdGhpcy5jYWxlbmRhclF1ZXN0aW9uLnB1c2gocXVlcyk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuXG4gLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIGdlbmVyYXRlSWQoKSB7XG4gICAgcmV0dXJuICdfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcbiAgfVxuXG4gIGdldEVudHJ5S2V5cyhlbnRyeUdyb3VwOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudHJ5R3JvdXApO1xufVxufVxuIiwiPGRpdiBjbGFzcz1cImFsaWduLWNhbGVuZGFyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInByZXZpb3VzTW9udGgoKVwiPjw8IHt7ICdQUkVWSU9VUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUHJldmlvdXMnIH19ID4+PC9idXR0b24+XG4gICAgICAgICAgPGgzPnt7IGN1cnJlbnREYXRlIHwgZGF0ZTogJ01NTU0geXl5eScgfX08L2gzPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5leHRNb250aCgpXCI+PDwge3sgJ05FWFQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ05leHQnIH19ID4+PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ncmlkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRheS1vZi13ZWVrXCIgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzT2ZXZWVrXCI+e3sgZGF5IH19PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNhbGVuZGFyLWRheVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2YgY2FsZW5kYXJEYXlzXCJcbiAgICAgICAgICAgICAgW2NsYXNzLm5vdC1jdXJyZW50LW1vbnRoXT1cIiFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICBbY2xhc3MucGFzdF09XCJkYXkuaXNQYXN0XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cImRheS5pc1RvZGF5XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmZ1dHVyZV09XCJkYXkuaXNGdXR1cmVcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheSlcIlxuICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXktbnVtYmVyXCI+e3sgZGF5LmRhdGUuZ2V0RGF0ZSgpIH19XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXk/LmV2ZW50cz8ubGVuZ3RoID4gMFwiIGNsYXNzPVwiZW50cnktaW5kaWNhdG9yXCIgW2NsYXNzLnNlbGVjdF09XCJkYXk/LmlzU2VsZWN0ZWRcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nRm9yPVwibGV0IGV2ZW50IG9mIGRheS5ldmVudHNcIiA+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbnRyeUdyb3VwIG9mIGV2ZW50LmVudHJpZXNcIiBjbGFzcz1cImV2ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQga2V5IG9mIGdldEVudHJ5S2V5cyhlbnRyeUdyb3VwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZW50cnlHcm91cFtrZXldLnR5cGUgPT0gJ1RpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlbnRyeUdyb3VwW2tleV0uaW5wdXQ/LnZhbHVlIHwgZGF0ZTogJ3Nob3J0VGltZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbnRyeUdyb3VwW2tleV0udHlwZSAhPSAnVGltZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVudHJ5R3JvdXBba2V5XS5pbnB1dCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFwcG9pbmFwcG9pbnRtZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnRzLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxoND57eyAnQUREX0FQUE9JTlRNRU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgQXBwb2ludG1lbnQnIH19PC9oND5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWREYXlcIiAoY2xpY2spPVwiYWRkQXBwb2ludG1lbnQoKVwiPnt7ICdBREQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FkZCcgfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLVZEIDA2U2VwMjQgY2FsZW5kYXIgdXBkYXRlcy0tPiBcbiAgICAgIDwhLS0gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXMtLT4gXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd0FwcG9pbm1lbnRTZWN0aW9uICYmIHNlbGVjdGVkRGF5Py5ldmVudHM/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImFwcG9pbnRtZW50cy1jb250YWluZXJcIj5cbiAgICAgICAgICA8aDQ+e3sgJ0FQUE9JTlRNRU5UUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQXBwb2ludG1lbnRzJyB9fTwvaDQ+XG4gICAgICAgICAgPGRpdiAgKm5nRm9yPVwibGV0IGV2ZW50IG9mIHNlbGVjdGVkRGF5Py5ldmVudHNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50XCIgKm5nRm9yPVwibGV0IGVudHJ5R3JvdXAgb2YgZXZlbnQuZW50cmllc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRFbnRyeUtleXMoZW50cnlHcm91cClcIiBjbGFzcz1cImVudHJ5LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVudHJ5R3JvdXBba2V5XS5xdWVzdGlvblRleHRcIiBjbGFzcz1cImVudHJ5LXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2VudHJ5R3JvdXBba2V5XS5xdWVzdGlvblRleHR9fTpcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVudHJ5LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWRCAwOVNlcDI0LSBkYXRlIHR5cGUgYW5kIGxpbmsgdHlwZSB1cGRhdGVzICAgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZW50cnlHcm91cFtrZXldLnR5cGUgIT0gJ1RpbWUnICYmIGVudHJ5R3JvdXBba2V5XS50eXBlICE9ICdMaW5rJyYmIGVudHJ5R3JvdXBba2V5XS50eXBlICE9ICdEYXRlJ1wiPnt7IGVudHJ5R3JvdXBba2V5XS5pbnB1dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImVudHJ5R3JvdXBba2V5XS50eXBlID09ICdUaW1lJ1wiPnt7IGVudHJ5R3JvdXBba2V5XS5pbnB1dCB8IGRhdGU6ICdzaG9ydFRpbWUnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZW50cnlHcm91cFtrZXldLnR5cGUgPT0gJ0RhdGUnXCI+e3sgZW50cnlHcm91cFtrZXldLmlucHV0IHwgZGF0ZTogJ21lZGl1bURhdGUnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZW50cnlHcm91cFtrZXldLnR5cGUgPT0gJ0xpbmsnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIicvLycrIGVudHJ5R3JvdXBba2V5XS5pbnB1dFwiIHRhcmdldD1cIl9ibGFua1wiPnt7ZW50cnlHcm91cFtrZXldLnF1ZXN0aW9uVGV4dH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZWRpdEV2ZW50KGV2ZW50LGVudHJ5R3JvdXApXCI+e3sgJ0VESVQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VkaXQnIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkZWxldGVFdmVudChldmVudC5pZCxlbnRyeUdyb3VwKVwiPnt7ICdERUxFVEUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0RlbGV0ZScgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gPGFwcC1jdXN0b20tbW9kZWxcbiAgW21vZGFsVGl0bGVdPVwibW9kYWxUaXRsZVwiXG4gIFtpc01vZGFsT3Blbl09XCJpc01vZGFsT3BlblwiXG4gIFttb2RhbFNpemVdPVwibW9kYWxTaXplXCJcbiAgW3NhdmVCdXR0b25WYWx1ZV09XCJzYXZlQnV0dG9uVmFsdWVcIlxuICBbbW9kYWxGb290ZXJdPVwibW9kYWxGb290ZXJcIlxuICAoc2F2ZUJ1dHRvbkVtaXQpPVwib25TYXZlKClcIlxuICAoY2FuY2VsQnV0dG9uRW1pdCk9XCJvbkNhbmNlbCgpXCJcbj5cbjxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJSZWZyZW5jZUJvb2tcIiBbcXVlc3Rpb25zXT1cInJlZmVyZW5jZVF1ZXN0aW9uc1wiIChoYW5kbGVRdWVzdGlvbik9XCJoYW5kbGVRdWVzdGlvbkV2ZW50KCRldmVudClcIj48L2xpYi1xdWVzdGlvbmJvb2s+XG48bmctdGVtcGxhdGUgZHluYW1pY0NvbXBvbmVudEhvc3QgPjwvbmctdGVtcGxhdGU+XG48L2FwcC1jdXN0b20tbW9kZWw+IC0tPiJdfQ==
|