jconsumer-shared 0.0.3 → 1.0.1
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/esm2022/lib/account-service.mjs +158 -9
- package/esm2022/lib/auth-service.mjs +12 -4
- package/esm2022/lib/booking-service.mjs +480 -0
- package/esm2022/lib/calendar/date-time/datetime-processor.service.mjs +4 -4
- package/esm2022/lib/common.service.mjs +157 -7
- package/esm2022/lib/confirm/confirm-box.component.mjs +159 -0
- package/esm2022/lib/confirm/confirm-box.module.mjs +62 -0
- package/esm2022/lib/consumer-service.mjs +780 -0
- package/esm2022/lib/currency-service.mjs +12 -0
- package/esm2022/lib/environment.service.mjs +23 -0
- package/esm2022/lib/error-message.module.mjs +23 -0
- package/esm2022/lib/file-service.mjs +25 -19
- package/esm2022/lib/form-message/field-error-display/field-error-display.component.mjs +21 -0
- package/esm2022/lib/form-message/form-message-display.module.mjs +35 -0
- package/esm2022/lib/form-message/form-message-display.service.mjs +44 -0
- package/esm2022/lib/form-message/form-success-display/form-success-display.component.mjs +18 -0
- package/esm2022/lib/group-storage.service.mjs +4 -4
- package/esm2022/lib/i8n.module.mjs +5 -5
- package/esm2022/lib/injector-resolver.mjs +28 -0
- package/esm2022/lib/local-storage.service.mjs +4 -4
- package/esm2022/lib/media-service.mjs +49 -0
- package/esm2022/lib/order.service.mjs +19 -4
- package/esm2022/lib/payment/modes/payment-modes.component.mjs +35 -0
- package/esm2022/lib/payment/modes/payment-modes.module.mjs +24 -0
- package/esm2022/lib/payment/payment.module.mjs +26 -0
- package/esm2022/lib/paytm.service.mjs +131 -0
- package/esm2022/lib/phone-input/phone-input.component.mjs +50 -46
- package/esm2022/lib/phone-input/phone-input.module.mjs +5 -5
- package/esm2022/lib/pipes/autolink/autolink.module.mjs +20 -0
- package/esm2022/lib/pipes/autolink/autolink.pipe.mjs +4 -4
- package/esm2022/lib/pipes/capitalize/capitalize.module.mjs +5 -5
- package/esm2022/lib/pipes/capitalize/capitalize.pipe.mjs +4 -4
- package/esm2022/lib/pipes/date-format/date-format.module.mjs +19 -0
- package/esm2022/lib/pipes/date-format/date-format.pipe.mjs +42 -0
- package/esm2022/lib/pipes/filter/filter.pipe.mjs +4 -4
- package/esm2022/lib/pipes/limit-to/limitTo.pipe.mjs +4 -4
- package/esm2022/lib/pipes/safe-html/safehtml.module.mjs +5 -5
- package/esm2022/lib/pipes/safe-html/safehtml.pipe.mjs +4 -4
- package/esm2022/lib/project-constants.mjs +310 -0
- package/esm2022/lib/questionaire/edit/questionnaire.component.mjs +53 -63
- package/esm2022/lib/questionaire/edit/questionnaire.module.mjs +16 -15
- package/esm2022/lib/questionaire/questionaire-service.mjs +4 -4
- package/esm2022/lib/razorpay.service.mjs +157 -0
- package/esm2022/lib/request-dialog/request-dialog.component.mjs +29 -0
- package/esm2022/lib/request-dialog/request-dialog.module.mjs +24 -0
- package/esm2022/lib/service-meta.mjs +4 -4
- package/esm2022/lib/session-storage.service.mjs +4 -4
- package/esm2022/lib/shared-account.guard.mjs +41 -0
- package/esm2022/lib/shared-account.resolver.mjs +22 -0
- package/esm2022/lib/shared.service.mjs +88 -13
- package/esm2022/lib/showuploadfile/showuploadfile.component.mjs +5 -5
- package/esm2022/lib/showuploadfile/showuploadfile.module.mjs +5 -5
- package/esm2022/lib/skeleton/skeleton-loading.component.mjs +4 -4
- package/esm2022/lib/skeleton/skeleton-loading.module.mjs +5 -5
- package/esm2022/lib/spinner/loading-spinner.component.mjs +4 -4
- package/esm2022/lib/spinner/loading-spinner.module.mjs +5 -5
- package/esm2022/lib/storage.service.mjs +4 -4
- package/esm2022/lib/subscription.service.mjs +4 -4
- package/esm2022/lib/theme.service.mjs +30 -0
- package/esm2022/lib/timezone-converter.mjs +49 -0
- package/esm2022/lib/toast.service.mjs +5 -5
- package/esm2022/lib/twilio-service.mjs +466 -0
- package/esm2022/lib/word-processor.service.mjs +4 -4
- package/esm2022/public-api.mjs +32 -1
- package/fesm2022/jconsumer-shared.mjs +3981 -541
- package/fesm2022/jconsumer-shared.mjs.map +1 -1
- package/jconsumer-shared-1.0.1.tgz +0 -0
- package/lib/account-service.d.ts +41 -2
- package/lib/auth-service.d.ts +1 -0
- package/lib/booking-service.d.ts +101 -0
- package/lib/common.service.d.ts +12 -1
- package/lib/confirm/confirm-box.component.d.ts +43 -0
- package/lib/confirm/confirm-box.module.d.ts +16 -0
- package/lib/consumer-service.d.ts +178 -0
- package/lib/currency-service.d.ts +4 -0
- package/lib/environment.service.d.ts +9 -0
- package/lib/error-message.module.d.ts +7 -0
- package/lib/file-service.d.ts +5 -2
- package/lib/form-message/field-error-display/field-error-display.component.d.ts +8 -0
- package/lib/form-message/form-message-display.module.d.ts +10 -0
- package/lib/form-message/form-message-display.service.d.ts +13 -0
- package/lib/form-message/form-success-display/form-success-display.component.d.ts +7 -0
- package/lib/injector-resolver.d.ts +2 -0
- package/lib/media-service.d.ts +9 -0
- package/lib/order.service.d.ts +4 -0
- package/lib/payment/modes/payment-modes.component.d.ts +15 -0
- package/lib/payment/modes/payment-modes.module.d.ts +9 -0
- package/lib/payment/payment.module.d.ts +7 -0
- package/lib/paytm.service.d.ts +13 -0
- package/lib/phone-input/phone-input.component.d.ts +5 -3
- package/lib/pipes/autolink/autolink.module.d.ts +8 -0
- package/lib/pipes/date-format/date-format.module.d.ts +8 -0
- package/lib/pipes/date-format/date-format.pipe.d.ts +12 -0
- package/lib/project-constants.d.ts +227 -0
- package/lib/questionaire/edit/questionnaire.component.d.ts +8 -9
- package/lib/questionaire/edit/questionnaire.module.d.ts +9 -8
- package/lib/razorpay.service.d.ts +26 -0
- package/lib/request-dialog/request-dialog.component.d.ts +11 -0
- package/lib/request-dialog/request-dialog.module.d.ts +9 -0
- package/lib/shared-account.guard.d.ts +11 -0
- package/lib/shared-account.resolver.d.ts +10 -0
- package/lib/shared.service.d.ts +31 -4
- package/lib/theme.service.d.ts +10 -0
- package/lib/timezone-converter.d.ts +8 -0
- package/lib/twilio-service.d.ts +60 -0
- package/package.json +1 -1
- package/public-api.d.ts +31 -0
- package/jconsumer-shared-0.0.3.tgz +0 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { ConfirmBoxComponent } from "./confirm/confirm-box.component";
|
|
3
|
+
import { of } from "rxjs";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./service-meta";
|
|
6
|
+
import * as i2 from "@angular/material/dialog";
|
|
7
|
+
export class BookingService {
|
|
8
|
+
serviceMeta;
|
|
9
|
+
dialog;
|
|
10
|
+
services = [];
|
|
11
|
+
activeServices = [];
|
|
12
|
+
selectedApptsTime;
|
|
13
|
+
bookingDate;
|
|
14
|
+
constructor(serviceMeta, dialog) {
|
|
15
|
+
this.serviceMeta = serviceMeta;
|
|
16
|
+
this.dialog = dialog;
|
|
17
|
+
}
|
|
18
|
+
getServices() {
|
|
19
|
+
return this.services;
|
|
20
|
+
}
|
|
21
|
+
setServices(services) {
|
|
22
|
+
let activeServices = services.filter(service => service.serviceAvailability);
|
|
23
|
+
this.services = activeServices;
|
|
24
|
+
this.activeServices = activeServices;
|
|
25
|
+
}
|
|
26
|
+
setActiveServices(services) {
|
|
27
|
+
this.activeServices = services;
|
|
28
|
+
}
|
|
29
|
+
getActiveServices() {
|
|
30
|
+
return this.activeServices;
|
|
31
|
+
}
|
|
32
|
+
setBookingDate(bookingDate) {
|
|
33
|
+
this.bookingDate = bookingDate;
|
|
34
|
+
}
|
|
35
|
+
getBookingDate() {
|
|
36
|
+
return this.bookingDate;
|
|
37
|
+
}
|
|
38
|
+
getTimings() {
|
|
39
|
+
return this.selectedApptsTime;
|
|
40
|
+
}
|
|
41
|
+
setTimings(selectedApptsTime) {
|
|
42
|
+
this.selectedApptsTime = selectedApptsTime;
|
|
43
|
+
}
|
|
44
|
+
doCancelWaitlist(waitlist, type, theme_data, cthis) {
|
|
45
|
+
let msg;
|
|
46
|
+
if (type === 'checkin') {
|
|
47
|
+
if (waitlist.token) {
|
|
48
|
+
msg = 'booking';
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
msg = 'booking';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (type === 'appointment') {
|
|
55
|
+
msg = 'booking';
|
|
56
|
+
}
|
|
57
|
+
else if (type === 'order') {
|
|
58
|
+
msg = 'Order';
|
|
59
|
+
}
|
|
60
|
+
const tdata = {};
|
|
61
|
+
tdata['theme'] = theme_data;
|
|
62
|
+
tdata['message'] = 'Cancellation and Refund policy';
|
|
63
|
+
tdata['heading'] = 'Confirm';
|
|
64
|
+
tdata['type'] = 'yes/no';
|
|
65
|
+
tdata['cancelPolicy'] = 'show';
|
|
66
|
+
tdata['book'] = msg;
|
|
67
|
+
tdata['wtlist'] = waitlist;
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
cthis.canceldialogRef = this.dialog.open(ConfirmBoxComponent, {
|
|
70
|
+
width: '50%',
|
|
71
|
+
panelClass: ['commonpopupmainclass', 'confirmationmainclass'],
|
|
72
|
+
disableClose: true,
|
|
73
|
+
data: tdata
|
|
74
|
+
});
|
|
75
|
+
cthis.canceldialogRef.afterClosed().subscribe(result => {
|
|
76
|
+
if (result && (result.cancelReason || result.rejectReason) || result) {
|
|
77
|
+
let id;
|
|
78
|
+
if (type === 'checkin') {
|
|
79
|
+
id = waitlist.ynwUuid;
|
|
80
|
+
}
|
|
81
|
+
else if (type === 'appointment') {
|
|
82
|
+
id = waitlist.uid;
|
|
83
|
+
}
|
|
84
|
+
else if (type === 'order') {
|
|
85
|
+
id = waitlist.uid;
|
|
86
|
+
}
|
|
87
|
+
this.cancelWaitlist(id, waitlist.providerAccount.id, type, result)
|
|
88
|
+
.then(data => {
|
|
89
|
+
resolve(data);
|
|
90
|
+
}, error => {
|
|
91
|
+
reject(error);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
resolve(null);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
cancelWaitlist(id, provider_id, type, result) {
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
const params = {
|
|
103
|
+
'account': provider_id
|
|
104
|
+
};
|
|
105
|
+
this.deleteWaitlist(id, params, type, result).subscribe(data => {
|
|
106
|
+
resolve('reloadlist');
|
|
107
|
+
}, error => {
|
|
108
|
+
reject(error);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
deleteWaitlist(id, params, type, result) {
|
|
113
|
+
if (type === 'checkin') {
|
|
114
|
+
return this.serviceMeta.httpPut('consumer/waitlist/cancel/' + id + '?account=' + params['account'], result);
|
|
115
|
+
}
|
|
116
|
+
else if (type === 'appointment') {
|
|
117
|
+
return this.serviceMeta.httpPut('consumer/appointment/cancel/' + id + '?account=' + params['account'], result);
|
|
118
|
+
}
|
|
119
|
+
else if (type === 'order') {
|
|
120
|
+
return this.serviceMeta.httpPut('consumer/orders/' + id + '?account=' + params['account']);
|
|
121
|
+
}
|
|
122
|
+
return of({});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Cancel a Booking (Waitlist/Appointment/Order)
|
|
126
|
+
* @param bookingId Booking Id
|
|
127
|
+
* @param params accountId
|
|
128
|
+
* @param type order/checkin/appointment
|
|
129
|
+
* @returns true if success
|
|
130
|
+
*/
|
|
131
|
+
cancelBookingAPI(bookingId, params, type) {
|
|
132
|
+
if (type === 'checkin') {
|
|
133
|
+
return this.serviceMeta.httpDelete('consumer/waitlist/' + bookingId + '?account=' + params['account']);
|
|
134
|
+
}
|
|
135
|
+
else if (type === 'appointment') {
|
|
136
|
+
return this.serviceMeta.httpPut('consumer/appointment/cancel/' + bookingId + '?account=' + params['account']);
|
|
137
|
+
}
|
|
138
|
+
else if (type === 'order') {
|
|
139
|
+
return this.serviceMeta.httpPut('consumer/orders/' + bookingId + '?account=' + params['account']);
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* To get all the checkin services of a particular location
|
|
145
|
+
* @param locationId location id
|
|
146
|
+
* @returns Promise of services
|
|
147
|
+
*/
|
|
148
|
+
getCheckinServices(locationId) {
|
|
149
|
+
const _this = this;
|
|
150
|
+
return new Promise(function (resolve) {
|
|
151
|
+
_this.getServicesByLocationId(locationId)
|
|
152
|
+
.subscribe((wlServices) => {
|
|
153
|
+
resolve(wlServices);
|
|
154
|
+
}, () => {
|
|
155
|
+
resolve([]);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* To get all the appointent services of a particular location
|
|
161
|
+
* @param locid location id
|
|
162
|
+
* @returns services
|
|
163
|
+
*/
|
|
164
|
+
getServicesforAppontmntByLocationId(locid) {
|
|
165
|
+
const url = 'consumer/appointment/service/' + locid;
|
|
166
|
+
return this.serviceMeta.httpGet(url);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* To get all the appointment services of a particular location
|
|
170
|
+
* @param locationId location id
|
|
171
|
+
* @returns Promise of services
|
|
172
|
+
*/
|
|
173
|
+
getAppointmentServices(locationId) {
|
|
174
|
+
const _this = this;
|
|
175
|
+
return new Promise(function (resolve) {
|
|
176
|
+
_this.getServicesforAppontmntByLocationId(locationId)
|
|
177
|
+
.subscribe((services) => {
|
|
178
|
+
resolve(services);
|
|
179
|
+
}, () => {
|
|
180
|
+
resolve([]);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
sortBookings(bookings) {
|
|
185
|
+
bookings.sort(function (message1, message2) {
|
|
186
|
+
if (message1.date < message2.date) {
|
|
187
|
+
return 11;
|
|
188
|
+
}
|
|
189
|
+
else if (message1.date > message2.date) {
|
|
190
|
+
return -1;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
getAppointmentRequests(accountId) {
|
|
198
|
+
return this.serviceMeta.httpGet('consumer/appointment/service/request?account-eq=' + accountId);
|
|
199
|
+
}
|
|
200
|
+
getWaitlist(params) {
|
|
201
|
+
return this.serviceMeta.httpGet('consumer/waitlist', null, params);
|
|
202
|
+
}
|
|
203
|
+
getFutureWaitlist(filter = {}) {
|
|
204
|
+
const url = 'consumer/waitlist/future';
|
|
205
|
+
return this.serviceMeta.httpGet(url, null, filter);
|
|
206
|
+
}
|
|
207
|
+
getAppointmentToday(params) {
|
|
208
|
+
return this.serviceMeta.httpGet('consumer/appointment/today', null, params);
|
|
209
|
+
}
|
|
210
|
+
getAppointmentFuture(params) {
|
|
211
|
+
return this.serviceMeta.httpGet('consumer/appointment/future', null, params);
|
|
212
|
+
}
|
|
213
|
+
getWaitlistHistory(params = {}) {
|
|
214
|
+
return this.serviceMeta.httpGet('consumer/waitlist/history', null, params);
|
|
215
|
+
}
|
|
216
|
+
getAppointmentHistory(params) {
|
|
217
|
+
return this.serviceMeta.httpGet('consumer/appointment/history', null, params);
|
|
218
|
+
}
|
|
219
|
+
getAppointmentHistoryCount() {
|
|
220
|
+
return this.serviceMeta.httpGet('consumer/appointment/history/count');
|
|
221
|
+
}
|
|
222
|
+
getAppointmentAttachmentsByUuid(uuid, accountid) {
|
|
223
|
+
const url = 'consumer/appointment/share/attachments/' + uuid + '?account=' + accountid;
|
|
224
|
+
return this.serviceMeta.httpGet(url);
|
|
225
|
+
}
|
|
226
|
+
getConsumerAppointmentAttachmentsByUuid(uuid, accountid) {
|
|
227
|
+
const url = 'consumer/appointment/attachment/' + uuid + '?account=' + accountid;
|
|
228
|
+
return this.serviceMeta.httpGet(url);
|
|
229
|
+
}
|
|
230
|
+
getWaitlistAttachmentsByUuid(uuid, accountid) {
|
|
231
|
+
const url = 'consumer/waitlist/share/attachments/' + uuid + '?account=' + accountid;
|
|
232
|
+
return this.serviceMeta.httpGet(url);
|
|
233
|
+
}
|
|
234
|
+
getConsumerWaitlistAttachmentsByUuid(uuid, accountid) {
|
|
235
|
+
const url = 'consumer/waitlist/attachment/' + uuid + '?account=' + accountid;
|
|
236
|
+
return this.serviceMeta.httpGet(url);
|
|
237
|
+
}
|
|
238
|
+
removeBooking(id, bookingType, accountID, data) {
|
|
239
|
+
return this.serviceMeta.httpPut('consumer/' + bookingType + '/cancel/' + id + '?account=' + accountID, data);
|
|
240
|
+
}
|
|
241
|
+
getVirtualServiceInput(selectedService, callingModes, commObj) {
|
|
242
|
+
let virtualServiceArray = {};
|
|
243
|
+
if (callingModes !== '') {
|
|
244
|
+
if (selectedService.virtualCallingModes[0].callingMode === 'GoogleMeet' || selectedService.virtualCallingModes[0].callingMode === 'Zoom') {
|
|
245
|
+
virtualServiceArray[selectedService.virtualCallingModes[0].callingMode] = selectedService.virtualCallingModes[0].value;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
virtualServiceArray[selectedService.virtualCallingModes[0].callingMode] = commObj['comWhatsappCountryCode'] + commObj['comWhatsappNo'];
|
|
249
|
+
;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
for (const i in virtualServiceArray) {
|
|
253
|
+
if (i === 'WhatsApp') {
|
|
254
|
+
return virtualServiceArray;
|
|
255
|
+
}
|
|
256
|
+
else if (i === 'GoogleMeet') {
|
|
257
|
+
return virtualServiceArray;
|
|
258
|
+
}
|
|
259
|
+
else if (i === 'Zoom') {
|
|
260
|
+
return virtualServiceArray;
|
|
261
|
+
}
|
|
262
|
+
else if (i === 'Phone') {
|
|
263
|
+
return virtualServiceArray;
|
|
264
|
+
}
|
|
265
|
+
else if (i === 'VideoCall') {
|
|
266
|
+
return { 'VideoCall': '' };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return '';
|
|
270
|
+
}
|
|
271
|
+
getServicesByDepartment(selectedDeptId) {
|
|
272
|
+
console.log("Whole Services getServicesByDepartment:", this.services);
|
|
273
|
+
let activeServices = this.services.filter(service => (service.department === selectedDeptId && service.serviceAvailability && !service.provider));
|
|
274
|
+
this.activeServices = activeServices;
|
|
275
|
+
return activeServices;
|
|
276
|
+
}
|
|
277
|
+
getServicesByUser(selectedUserId) {
|
|
278
|
+
console.log("Services getServicesByUser:", this.services);
|
|
279
|
+
console.log("User:", selectedUserId);
|
|
280
|
+
let activeServices = this.services.filter(service => (service.provider?.id === selectedUserId) && service.serviceAvailability);
|
|
281
|
+
this.activeServices = activeServices;
|
|
282
|
+
return activeServices;
|
|
283
|
+
}
|
|
284
|
+
getGlobalServices(deptId) {
|
|
285
|
+
console.log("Services getGlobalServices:", this.services);
|
|
286
|
+
let activeServices = [];
|
|
287
|
+
if (deptId) {
|
|
288
|
+
activeServices = this.services.filter(service => (!service.provider && service.department == deptId && service.serviceAvailability));
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
activeServices = this.services.filter(service => (!service.provider && service.serviceAvailability));
|
|
292
|
+
}
|
|
293
|
+
this.activeServices = activeServices;
|
|
294
|
+
return activeServices;
|
|
295
|
+
}
|
|
296
|
+
getAppointmentByConsumerUUID(uuid, accountid) {
|
|
297
|
+
const url = 'consumer/appointment/' + uuid + '?account=' + accountid;
|
|
298
|
+
return this.serviceMeta.httpGet(url);
|
|
299
|
+
}
|
|
300
|
+
getServicesByLocationId(locid) {
|
|
301
|
+
const url = 'consumer/waitlist/services/' + locid;
|
|
302
|
+
return this.serviceMeta.httpGet(url);
|
|
303
|
+
}
|
|
304
|
+
getLocationsByServiceId(serviceId) {
|
|
305
|
+
const url = 'consumer/service/' + serviceId + '/location';
|
|
306
|
+
return this.serviceMeta.httpGet(url);
|
|
307
|
+
}
|
|
308
|
+
getWaitlistServices(locationId) {
|
|
309
|
+
const _this = this;
|
|
310
|
+
return new Promise(function (resolve, reject) {
|
|
311
|
+
_this.getServicesByLocationId(locationId).subscribe((services) => {
|
|
312
|
+
resolve(services);
|
|
313
|
+
}), () => {
|
|
314
|
+
resolve([]);
|
|
315
|
+
};
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
getAvailableDatessByLocationService(locid, servid, accountid) {
|
|
319
|
+
const url = 'consumer/appointment/availability/location/' + locid + '/service/' + servid + '?account=' + accountid;
|
|
320
|
+
return this.serviceMeta.httpGet(url);
|
|
321
|
+
}
|
|
322
|
+
getServicebyLocationId(locationId) {
|
|
323
|
+
console.log("Location Id:", locationId);
|
|
324
|
+
const _this = this;
|
|
325
|
+
return new Promise(function (resolve, reject) {
|
|
326
|
+
if (_this.services && _this.services.length > 0) {
|
|
327
|
+
resolve(_this.services);
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
_this.getAppointmentServices(locationId).then((appointmentServices) => {
|
|
331
|
+
_this.getWaitlistServices(locationId).then((wlServices) => {
|
|
332
|
+
let services = [...appointmentServices, ...wlServices];
|
|
333
|
+
resolve(services);
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* returns Available dates for calendar
|
|
341
|
+
* @param locid location id
|
|
342
|
+
* @param servid service id
|
|
343
|
+
* @param accountid account id
|
|
344
|
+
*/
|
|
345
|
+
getSchedulesbyLocationandServiceIdavailability(locid, servid, accountid) {
|
|
346
|
+
const _this = this;
|
|
347
|
+
return new Promise(function (resolve) {
|
|
348
|
+
if (locid && servid && accountid) {
|
|
349
|
+
_this.getAvailableDatessByLocationService(locid, servid, accountid)
|
|
350
|
+
.subscribe((data) => {
|
|
351
|
+
const availables = data.filter(obj => obj.availableSlots);
|
|
352
|
+
const availDates = availables.map(function (a) { return a.date; });
|
|
353
|
+
let availableDates = availDates.filter(function (elem, index, self) {
|
|
354
|
+
return index === self.indexOf(elem);
|
|
355
|
+
});
|
|
356
|
+
resolve(availableDates);
|
|
357
|
+
}, () => {
|
|
358
|
+
resolve([]);
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
getQueuesbyLocationandServiceIdavailability(locid, servid, accountid) {
|
|
364
|
+
const _this = this;
|
|
365
|
+
let availableDates = [];
|
|
366
|
+
if (locid && servid && accountid) {
|
|
367
|
+
this.getQueuesbyLocationandServiceIdAvailableDates(locid, servid, accountid)
|
|
368
|
+
.subscribe((data) => {
|
|
369
|
+
const availables = data.filter(obj => obj.isAvailable);
|
|
370
|
+
const availDates = availables.map(function (a) { return a.date; });
|
|
371
|
+
availableDates = availDates.filter(function (elem, index, self) {
|
|
372
|
+
return index === self.indexOf(elem);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
return availableDates;
|
|
377
|
+
}
|
|
378
|
+
getQueuesbyLocationandServiceIdAvailableDates(locid, servid, accountid) {
|
|
379
|
+
const url = 'consumer/waitlist/queues/available/' + locid + '/' + servid + '?account=' + accountid;
|
|
380
|
+
return this.serviceMeta.httpGet(url);
|
|
381
|
+
}
|
|
382
|
+
validateVirtualCallInfo(callingModes, selectedService, commObj) {
|
|
383
|
+
let valid = true;
|
|
384
|
+
console.log("Calling Modes:", callingModes);
|
|
385
|
+
if (callingModes === '' || callingModes.length < 10) {
|
|
386
|
+
for (const i in selectedService.virtualCallingModes) {
|
|
387
|
+
if (selectedService.virtualCallingModes[i].callingMode === 'WhatsApp' || selectedService.virtualCallingModes[i].callingMode === 'Phone') {
|
|
388
|
+
if (!commObj['comWhatsappNo'] && selectedService.serviceBookingType !== 'request') {
|
|
389
|
+
valid = false;
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return valid;
|
|
396
|
+
}
|
|
397
|
+
getRescheduledInfo(bookingId, accountId, bookingMode) {
|
|
398
|
+
const _this = this;
|
|
399
|
+
return new Promise(function (resolve, reject) {
|
|
400
|
+
if (!bookingId) {
|
|
401
|
+
resolve(false);
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
if (bookingMode === 'Appointment') {
|
|
405
|
+
_this.getAppointmentByConsumerUUID(bookingId, accountId).subscribe((appointmentInfo) => {
|
|
406
|
+
resolve(appointmentInfo);
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
_this.getCheckinByConsumerUUID(bookingId, accountId).subscribe((waitlistInfo) => {
|
|
411
|
+
resolve(waitlistInfo);
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
addApptAdvancePayment(param, body) {
|
|
418
|
+
const url = 'consumer/appointment/advancePayment';
|
|
419
|
+
return this.serviceMeta.httpPut(url, body, null, param);
|
|
420
|
+
}
|
|
421
|
+
addWaitlistAdvancePayment(param, body) {
|
|
422
|
+
const url = 'consumer/waitlist/advancePayment';
|
|
423
|
+
return this.serviceMeta.httpPut(url, body, null, param);
|
|
424
|
+
}
|
|
425
|
+
getCheckinByConsumerUUID(uuid, accountid) {
|
|
426
|
+
console.log("UUID:", uuid);
|
|
427
|
+
const url = 'consumer/waitlist/' + uuid + '?account=' + accountid;
|
|
428
|
+
return this.serviceMeta.httpGet(url);
|
|
429
|
+
}
|
|
430
|
+
getSlotsByLocationServiceandDate(locid, servid, pdate, accountid) {
|
|
431
|
+
const url = 'consumer/appointment/schedule/date/' + pdate + '/location/' + locid + '/service/' + servid + '?account=' + accountid;
|
|
432
|
+
return this.serviceMeta.httpGet(url);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
*
|
|
436
|
+
* @param locid Location Id
|
|
437
|
+
* @returns services of location
|
|
438
|
+
*/
|
|
439
|
+
getQueuesbyLocationServiceAndDate(locid, servid, pdate, accountid) {
|
|
440
|
+
const _this = this;
|
|
441
|
+
return new Promise(function (resolve, reject) {
|
|
442
|
+
_this.getQueuesbyLocationandServiceId(locid, servid, pdate, accountid)
|
|
443
|
+
.subscribe((queues) => {
|
|
444
|
+
resolve(queues);
|
|
445
|
+
}, () => {
|
|
446
|
+
resolve([]);
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
getQueuesbyLocationandServiceId(locid, servid, pdate, accountid) {
|
|
451
|
+
const dd = (pdate !== undefined) ? '/' + pdate + '?account=' + accountid : '';
|
|
452
|
+
const url = 'consumer/waitlist/queues/' + locid + '/' + servid + dd;
|
|
453
|
+
return this.serviceMeta.httpGet(url);
|
|
454
|
+
}
|
|
455
|
+
getConvenientFeeOfProvider(provid, data) {
|
|
456
|
+
const url = 'consumer/payment/modes/convenienceFee/' + provid;
|
|
457
|
+
return this.serviceMeta.httpPut(url, data);
|
|
458
|
+
}
|
|
459
|
+
getApptCoupons(servId, locId) {
|
|
460
|
+
const url = 'consumer/appointment/service/' + servId + '/location/' + locId + '/coupons';
|
|
461
|
+
return this.serviceMeta.httpGet(url);
|
|
462
|
+
}
|
|
463
|
+
getCheckinCoupons(servId, locId) {
|
|
464
|
+
const url = 'consumer/waitlist/service/' + servId + '/location/' + locId + '/coupons';
|
|
465
|
+
return this.serviceMeta.httpGet(url);
|
|
466
|
+
}
|
|
467
|
+
getServiceById(serviceId, type) {
|
|
468
|
+
let service = this.services.filter(service => (service.id === serviceId && service.bType === type));
|
|
469
|
+
return service[0];
|
|
470
|
+
}
|
|
471
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookingService, deps: [{ token: i1.ServiceMeta }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
472
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookingService, providedIn: 'root' });
|
|
473
|
+
}
|
|
474
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookingService, decorators: [{
|
|
475
|
+
type: Injectable,
|
|
476
|
+
args: [{
|
|
477
|
+
providedIn: 'root'
|
|
478
|
+
}]
|
|
479
|
+
}], ctorParameters: () => [{ type: i1.ServiceMeta }, { type: i2.MatDialog }] });
|
|
480
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2luZy1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvamNvbnN1bWVyLXNoYXJlZC9zcmMvbGliL2Jvb2tpbmctc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFLMUIsTUFBTSxPQUFPLGNBQWM7SUFRZjtJQUNBO0lBUFYsUUFBUSxHQUFRLEVBQUUsQ0FBQztJQUNuQixjQUFjLEdBQVEsRUFBRSxDQUFDO0lBQ3pCLGlCQUFpQixDQUFNO0lBQ3ZCLFdBQVcsQ0FBTTtJQUVqQixZQUNVLFdBQXdCLEVBQ3hCLE1BQWlCO1FBRGpCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQVc7SUFBSSxDQUFDO0lBRWhDLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUNELFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsUUFBUTtRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFDRCxjQUFjLENBQUMsV0FBVztRQUN4QixJQUFJLENBQUMsV0FB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K0JBQStCLEdBQUcsTUFBTSxHQUFHLFlBQVksR0FBRyxLQUFLLEdBQUcsVUFBVSxDQUFDO1FBQ3pGLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELGlCQUFpQixDQUFDLE1BQU0sRUFBRSxLQUFLO1FBQzdCLE1BQU0sR0FBRyxHQUFHLDRCQUE0QixHQUFHLE1BQU0sR0FBRyxZQUFZLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQztRQUN0RixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUk7UUFDNUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO3dHQXZkVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTWV0YSB9IGZyb20gXCIuL3NlcnZpY2UtbWV0YVwiO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7IENvbmZpcm1Cb3hDb21wb25lbnQgfSBmcm9tIFwiLi9jb25maXJtL2NvbmZpcm0tYm94LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBvZiB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCb29raW5nU2VydmljZSB7XHJcblxyXG4gIHNlcnZpY2VzOiBhbnkgPSBbXTtcclxuICBhY3RpdmVTZXJ2aWNlczogYW55ID0gW107XHJcbiAgc2VsZWN0ZWRBcHB0c1RpbWU6IGFueTtcclxuICBib29raW5nRGF0ZTogYW55O1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlTWV0YTogU2VydmljZU1ldGEsXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nKSB7IH1cclxuXHJcbiAgZ2V0U2VydmljZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlcztcclxuICB9XHJcbiAgc2V0U2VydmljZXMoc2VydmljZXM6IGFueSkge1xyXG4gICAgbGV0IGFjdGl2ZVNlcnZpY2VzID0gc2VydmljZXMuZmlsdGVyKHNlcnZpY2UgPT4gc2VydmljZS5zZXJ2aWNlQXZhaWxhYmlsaXR5KTtcclxuICAgIHRoaXMuc2VydmljZXMgPSBhY3RpdmVTZXJ2aWNlcztcclxuICAgIHRoaXMuYWN0aXZlU2VydmljZXMgPSBhY3RpdmVTZXJ2aWNlcztcclxuICB9XHJcbiAgc2V0QWN0aXZlU2VydmljZXMoc2VydmljZXMpIHtcclxuICAgIHRoaXMuYWN0aXZlU2VydmljZXMgPSBzZXJ2aWNlcztcclxuICB9XHJcbiAgZ2V0QWN0aXZlU2VydmljZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVTZXJ2aWNlcztcclxuICB9XHJcbiAgc2V0Qm9va2luZ0RhdGUoYm9va2luZ0RhdGUpIHtcclxuICAgIHRoaXMuYm9va2luZ0RhdGUgPSBib29raW5nRGF0ZTtcclxuICB9XHJcbiAgZ2V0Qm9va2luZ0RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ib29raW5nRGF0ZTtcclxuICB9XHJcbiAgZ2V0VGltaW5ncygpIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQXBwdHNUaW1lO1xyXG4gIH1cclxuICBzZXRUaW1pbmdzKHNlbGVjdGVkQXBwdHNUaW1lOiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBcHB0c1RpbWUgPSBzZWxlY3RlZEFwcHRzVGltZTtcclxuICB9XHJcbiAgZG9DYW5jZWxXYWl0bGlzdCh3YWl0bGlzdCwgdHlwZSwgdGhlbWVfZGF0YSwgY3RoaXM/KSB7XHJcbiAgICBsZXQgbXNnO1xyXG4gICAgaWYgKHR5cGUgPT09ICdjaGVja2luJykge1xyXG4gICAgICBpZiAod2FpdGxpc3QudG9rZW4pIHtcclxuICAgICAgICBtc2cgPSAnYm9va2luZyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbXNnID0gJ2Jvb2tpbmcnO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcHBvaW50bWVudCcpIHtcclxuICAgICAgbXNnID0gJ2Jvb2tpbmcnO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3JkZXInKSB7XHJcbiAgICAgIG1zZyA9ICdPcmRlcic7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0ZGF0YSA9IHt9O1xyXG4gICAgdGRhdGFbJ3RoZW1lJ10gPSB0aGVtZV9kYXRhO1xyXG4gICAgdGRhdGFbJ21lc3NhZ2UnXSA9ICdDYW5jZWxsYXRpb24gYW5kIFJlZnVuZCBwb2xpY3knO1xyXG4gICAgdGRhdGFbJ2hlYWRpbmcnXSA9ICdDb25maXJtJztcclxuICAgIHRkYXRhWyd0eXBlJ10gPSAneWVzL25vJztcclxuICAgIHRkYXRhWydjYW5jZWxQb2xpY3knXSA9ICdzaG93JztcclxuICAgIHRkYXRhWydib29rJ10gPSBtc2c7XHJcbiAgICB0ZGF0YVsnd3RsaXN0J10gPSB3YWl0bGlzdDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGN0aGlzLmNhbmNlbGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybUJveENvbXBvbmVudCwge1xyXG4gICAgICAgIHdpZHRoOiAnNTAlJyxcclxuICAgICAgICBwYW5lbENsYXNzOiBbJ2NvbW1vbnBvcHVwbWFpbmNsYXNzJywgJ2NvbmZpcm1hdGlvbm1haW5jbGFzcyddLFxyXG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICBkYXRhOiB0ZGF0YVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGN0aGlzLmNhbmNlbGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQgJiYgKHJlc3VsdC5jYW5jZWxSZWFzb24gfHwgcmVzdWx0LnJlamVjdFJlYXNvbikgfHwgcmVzdWx0KSB7XHJcbiAgICAgICAgICBsZXQgaWQ7XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ2NoZWNraW4nKSB7XHJcbiAgICAgICAgICAgIGlkID0gd2FpdGxpc3QueW53VXVpZDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FwcG9pbnRtZW50Jykge1xyXG4gICAgICAgICAgICBpZCA9IHdhaXRsaXN0LnVpZDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29yZGVyJykge1xyXG4gICAgICAgICAgICBpZCA9IHdhaXRsaXN0LnVpZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2FuY2VsV2FpdGxpc3QoaWQsIHdhaXRsaXN0LnByb3ZpZGVyQWNjb3VudC5pZCwgdHlwZSwgcmVzdWx0KVxyXG4gICAgICAgICAgICAudGhlbihcclxuICAgICAgICAgICAgICBkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxXYWl0bGlzdChpZCwgcHJvdmlkZXJfaWQsIHR5cGUsIHJlc3VsdD8pIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAnYWNjb3VudCc6IHByb3ZpZGVyX2lkXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGVsZXRlV2FpdGxpc3QoaWQsIHBhcmFtcywgdHlwZSwgcmVzdWx0KS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSgncmVsb2FkbGlzdCcpO1xyXG4gICAgICB9LFxyXG4gICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGRlbGV0ZVdhaXRsaXN0KGlkLCBwYXJhbXMsIHR5cGUsIHJlc3VsdD8pIHtcclxuICAgIGlmICh0eXBlID09PSAnY2hlY2tpbicpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cFB1dCgnY29uc3VtZXIvd2FpdGxpc3QvY2FuY2VsLycgKyBpZCArICc/YWNjb3VudD0nICsgcGFyYW1zWydhY2NvdW50J10sIHJlc3VsdCk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcHBvaW50bWVudCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cFB1dCgnY29uc3VtZXIvYXBwb2ludG1lbnQvY2FuY2VsLycgKyBpZCArICc/YWNjb3VudD0nICsgcGFyYW1zWydhY2NvdW50J10sIHJlc3VsdCk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcmRlcicpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cFB1dCgnY29uc3VtZXIvb3JkZXJzLycgKyBpZCArICc/YWNjb3VudD0nICsgcGFyYW1zWydhY2NvdW50J10pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9mKHt9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbmNlbCBhIEJvb2tpbmcgKFdhaXRsaXN0L0FwcG9pbnRtZW50L09yZGVyKVxyXG4gICAqIEBwYXJhbSBib29raW5nSWQgQm9va2luZyBJZFxyXG4gICAqIEBwYXJhbSBwYXJhbXMgYWNjb3VudElkXHJcbiAgICogQHBhcmFtIHR5cGUgb3JkZXIvY2hlY2tpbi9hcHBvaW50bWVudFxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgc3VjY2Vzc1xyXG4gICAqL1xyXG4gIGNhbmNlbEJvb2tpbmdBUEkoYm9va2luZ0lkLCBwYXJhbXMsIHR5cGUpIHtcclxuICAgIGlmICh0eXBlID09PSAnY2hlY2tpbicpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cERlbGV0ZSgnY29uc3VtZXIvd2FpdGxpc3QvJyArIGJvb2tpbmdJZCArICc/YWNjb3VudD0nICsgcGFyYW1zWydhY2NvdW50J10pO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXBwb2ludG1lbnQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VNZXRhLmh0dHBQdXQoJ2NvbnN1bWVyL2FwcG9pbnRtZW50L2NhbmNlbC8nICsgYm9va2luZ0lkICsgJz9hY2NvdW50PScgKyBwYXJhbXNbJ2FjY291bnQnXSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcmRlcicpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cFB1dCgnY29uc3VtZXIvb3JkZXJzLycgKyBib29raW5nSWQgKyAnP2FjY291bnQ9JyArIHBhcmFtc1snYWNjb3VudCddKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFRvIGdldCBhbGwgdGhlIGNoZWNraW4gc2VydmljZXMgb2YgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uXHJcbiAgICogQHBhcmFtIGxvY2F0aW9uSWQgbG9jYXRpb24gaWRcclxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNlcnZpY2VzXHJcbiAgICovXHJcbiAgZ2V0Q2hlY2tpblNlcnZpY2VzKGxvY2F0aW9uSWQpIHtcclxuICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICBfdGhpcy5nZXRTZXJ2aWNlc0J5TG9jYXRpb25JZChsb2NhdGlvbklkKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHdsU2VydmljZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZSh3bFNlcnZpY2VzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogVG8gZ2V0IGFsbCB0aGUgYXBwb2ludGVudCBzZXJ2aWNlcyBvZiBhIHBhcnRpY3VsYXIgbG9jYXRpb25cclxuICogQHBhcmFtIGxvY2lkIGxvY2F0aW9uIGlkXHJcbiAqIEByZXR1cm5zIHNlcnZpY2VzXHJcbiAqL1xyXG4gIGdldFNlcnZpY2VzZm9yQXBwb250bW50QnlMb2NhdGlvbklkKGxvY2lkKSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvYXBwb2ludG1lbnQvc2VydmljZS8nICsgbG9jaWQ7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KHVybCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUbyBnZXQgYWxsIHRoZSBhcHBvaW50bWVudCBzZXJ2aWNlcyBvZiBhIHBhcnRpY3VsYXIgbG9jYXRpb25cclxuICAgKiBAcGFyYW0gbG9jYXRpb25JZCBsb2NhdGlvbiBpZFxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2VydmljZXNcclxuICAgKi9cclxuICBnZXRBcHBvaW50bWVudFNlcnZpY2VzKGxvY2F0aW9uSWQpIHtcclxuICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICBfdGhpcy5nZXRTZXJ2aWNlc2ZvckFwcG9udG1udEJ5TG9jYXRpb25JZChsb2NhdGlvbklkKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHNlcnZpY2VzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUoc2VydmljZXMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNvcnRCb29raW5ncyhib29raW5ncykge1xyXG4gICAgYm9va2luZ3Muc29ydChmdW5jdGlvbiAobWVzc2FnZTEsIG1lc3NhZ2UyKSB7XHJcbiAgICAgIGlmIChtZXNzYWdlMS5kYXRlIDwgbWVzc2FnZTIuZGF0ZSkge1xyXG4gICAgICAgIHJldHVybiAxMTtcclxuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlMS5kYXRlID4gbWVzc2FnZTIuZGF0ZSkge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRBcHBvaW50bWVudFJlcXVlc3RzKGFjY291bnRJZCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cEdldCgnY29uc3VtZXIvYXBwb2ludG1lbnQvc2VydmljZS9yZXF1ZXN0P2FjY291bnQtZXE9JyArIGFjY291bnRJZCk7XHJcbiAgfVxyXG4gIGdldFdhaXRsaXN0KHBhcmFtcykge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cEdldCgnY29uc3VtZXIvd2FpdGxpc3QnLCBudWxsLCBwYXJhbXMpO1xyXG4gIH1cclxuICBnZXRGdXR1cmVXYWl0bGlzdChmaWx0ZXIgPSB7fSkge1xyXG4gICAgY29uc3QgdXJsID0gJ2NvbnN1bWVyL3dhaXRsaXN0L2Z1dHVyZSc7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KHVybCwgbnVsbCwgZmlsdGVyKTtcclxuICB9XHJcbiAgZ2V0QXBwb2ludG1lbnRUb2RheShwYXJhbXM/KSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KCdjb25zdW1lci9hcHBvaW50bWVudC90b2RheScsIG51bGwsIHBhcmFtcyk7XHJcbiAgfVxyXG4gIGdldEFwcG9pbnRtZW50RnV0dXJlKHBhcmFtcz8pIHtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VNZXRhLmh0dHBHZXQoJ2NvbnN1bWVyL2FwcG9pbnRtZW50L2Z1dHVyZScsIG51bGwsIHBhcmFtcyk7XHJcbiAgfVxyXG4gIGdldFdhaXRsaXN0SGlzdG9yeShwYXJhbXMgPSB7fSkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cEdldCgnY29uc3VtZXIvd2FpdGxpc3QvaGlzdG9yeScsIG51bGwsIHBhcmFtcyk7XHJcbiAgfVxyXG4gIGdldEFwcG9pbnRtZW50SGlzdG9yeShwYXJhbXM/KSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KCdjb25zdW1lci9hcHBvaW50bWVudC9oaXN0b3J5JywgbnVsbCwgcGFyYW1zKTtcclxuICB9XHJcbiAgZ2V0QXBwb2ludG1lbnRIaXN0b3J5Q291bnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KCdjb25zdW1lci9hcHBvaW50bWVudC9oaXN0b3J5L2NvdW50Jyk7XHJcbiAgfVxyXG4gIGdldEFwcG9pbnRtZW50QXR0YWNobWVudHNCeVV1aWQodXVpZCwgYWNjb3VudGlkKSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvYXBwb2ludG1lbnQvc2hhcmUvYXR0YWNobWVudHMvJyArIHV1aWQgKyAnP2FjY291bnQ9JyArIGFjY291bnRpZDtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VNZXRhLmh0dHBHZXQodXJsKTtcclxuICB9XHJcbiAgZ2V0Q29uc3VtZXJBcHBvaW50bWVudEF0dGFjaG1lbnRzQnlVdWlkKHV1aWQsIGFjY291bnRpZCkge1xyXG4gICAgY29uc3QgdXJsID0gJ2NvbnN1bWVyL2FwcG9pbnRtZW50L2F0dGFjaG1lbnQvJyArIHV1aWQgKyAnP2FjY291bnQ9JyArIGFjY291bnRpZDtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VNZXRhLmh0dHBHZXQodXJsKTtcclxuICB9XHJcbiAgZ2V0V2FpdGxpc3RBdHRhY2htZW50c0J5VXVpZCh1dWlkLCBhY2NvdW50aWQpIHtcclxuICAgIGNvbnN0IHVybCA9ICdjb25zdW1lci93YWl0bGlzdC9zaGFyZS9hdHRhY2htZW50cy8nICsgdXVpZCArICc/YWNjb3VudD0nICsgYWNjb3VudGlkO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cEdldCh1cmwpO1xyXG4gIH1cclxuICBnZXRDb25zdW1lcldhaXRsaXN0QXR0YWNobWVudHNCeVV1aWQodXVpZCwgYWNjb3VudGlkKSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvd2FpdGxpc3QvYXR0YWNobWVudC8nICsgdXVpZCArICc/YWNjb3VudD0nICsgYWNjb3VudGlkO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cEdldCh1cmwpO1xyXG4gIH1cclxuICByZW1vdmVCb29raW5nKGlkOiBzdHJpbmcsIGJvb2tpbmdUeXBlOiBzdHJpbmcsIGFjY291bnRJRDogYW55LCBkYXRhOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VNZXRhLmh0dHBQdXQoJ2NvbnN1bWVyLycgKyBib29raW5nVHlwZSArICcvY2FuY2VsLycgKyBpZCArICc/YWNjb3VudD0nICsgYWNjb3VudElELCBkYXRhKTtcclxuICB9XHJcbiAgZ2V0VmlydHVhbFNlcnZpY2VJbnB1dChzZWxlY3RlZFNlcnZpY2UsIGNhbGxpbmdNb2RlcywgY29tbU9iaikge1xyXG4gICAgbGV0IHZpcnR1YWxTZXJ2aWNlQXJyYXkgPSB7fTtcclxuICAgIGlmIChjYWxsaW5nTW9kZXMgIT09ICcnKSB7XHJcbiAgICAgIGlmIChzZWxlY3RlZFNlcnZpY2UudmlydHVhbENhbGxpbmdNb2Rlc1swXS5jYWxsaW5nTW9kZSA9PT0gJ0dvb2dsZU1lZXQnIHx8IHNlbGVjdGVkU2VydmljZS52aXJ0dWFsQ2FsbGluZ01vZGVzWzBdLmNhbGxpbmdNb2RlID09PSAnWm9vbScpIHtcclxuICAgICAgICB2aXJ0dWFsU2VydmljZUFycmF5W3NlbGVjdGVkU2VydmljZS52aXJ0dWFsQ2FsbGluZ01vZGVzWzBdLmNhbGxpbmdNb2RlXSA9IHNlbGVjdGVkU2VydmljZS52aXJ0dWFsQ2FsbGluZ01vZGVzWzBdLnZhbHVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZpcnR1YWxTZXJ2aWNlQXJyYXlbc2VsZWN0ZWRTZXJ2aWNlLnZpcnR1YWxDYWxsaW5nTW9kZXNbMF0uY2FsbGluZ01vZGVdID0gY29tbU9ialsnY29tV2hhdHNhcHBDb3VudHJ5Q29kZSddICsgY29tbU9ialsnY29tV2hhdHNhcHBObyddOztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBpIGluIHZpcnR1YWxTZXJ2aWNlQXJyYXkpIHtcclxuICAgICAgaWYgKGkgPT09ICdXaGF0c0FwcCcpIHtcclxuICAgICAgICByZXR1cm4gdmlydHVhbFNlcnZpY2VBcnJheTtcclxuICAgICAgfSBlbHNlIGlmIChpID09PSAnR29vZ2xlTWVldCcpIHtcclxuICAgICAgICByZXR1cm4gdmlydHVhbFNlcnZpY2VBcnJheTtcclxuICAgICAgfSBlbHNlIGlmIChpID09PSAnWm9vbScpIHtcclxuICAgICAgICByZXR1cm4gdmlydHVhbFNlcnZpY2VBcnJheTtcclxuICAgICAgfSBlbHNlIGlmIChpID09PSAnUGhvbmUnKSB7XHJcbiAgICAgICAgcmV0dXJuIHZpcnR1YWxTZXJ2aWNlQXJyYXk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaSA9PT0gJ1ZpZGVvQ2FsbCcpIHtcclxuICAgICAgICByZXR1cm4geyAnVmlkZW9DYWxsJzogJycgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuICBnZXRTZXJ2aWNlc0J5RGVwYXJ0bWVudChzZWxlY3RlZERlcHRJZDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIldob2xlIFNlcnZpY2VzIGdldFNlcnZpY2VzQnlEZXBhcnRtZW50OlwiLCB0aGlzLnNlcnZpY2VzKTtcclxuICAgIGxldCBhY3RpdmVTZXJ2aWNlcyA9IHRoaXMuc2VydmljZXMuZmlsdGVyKHNlcnZpY2UgPT4gKHNlcnZpY2UuZGVwYXJ0bWVudCA9PT0gc2VsZWN0ZWREZXB0SWQgJiYgc2VydmljZS5zZXJ2aWNlQXZhaWxhYmlsaXR5ICYmICFzZXJ2aWNlLnByb3ZpZGVyKSk7XHJcbiAgICB0aGlzLmFjdGl2ZVNlcnZpY2VzID0gYWN0aXZlU2VydmljZXM7XHJcbiAgICByZXR1cm4gYWN0aXZlU2VydmljZXM7XHJcbiAgfVxyXG4gIGdldFNlcnZpY2VzQnlVc2VyKHNlbGVjdGVkVXNlcklkOiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiU2VydmljZXMgZ2V0U2VydmljZXNCeVVzZXI6XCIsIHRoaXMuc2VydmljZXMpO1xyXG4gICAgY29uc29sZS5sb2coXCJVc2VyOlwiLCBzZWxlY3RlZFVzZXJJZCk7XHJcbiAgICBsZXQgYWN0aXZlU2VydmljZXMgPSB0aGlzLnNlcnZpY2VzLmZpbHRlcihzZXJ2aWNlID0+IChzZXJ2aWNlLnByb3ZpZGVyPy5pZCA9PT0gc2VsZWN0ZWRVc2VySWQpICYmIHNlcnZpY2Uuc2VydmljZUF2YWlsYWJpbGl0eSk7XHJcbiAgICB0aGlzLmFjdGl2ZVNlcnZpY2VzID0gYWN0aXZlU2VydmljZXM7XHJcbiAgICByZXR1cm4gYWN0aXZlU2VydmljZXM7XHJcbiAgfVxyXG4gIGdldEdsb2JhbFNlcnZpY2VzKGRlcHRJZD8pIHtcclxuICAgIGNvbnNvbGUubG9nKFwiU2VydmljZXMgZ2V0R2xvYmFsU2VydmljZXM6XCIsIHRoaXMuc2VydmljZXMpO1xyXG4gICAgbGV0IGFjdGl2ZVNlcnZpY2VzID0gW107XHJcbiAgICBpZiAoZGVwdElkKSB7XHJcbiAgICAgIGFjdGl2ZVNlcnZpY2VzID0gdGhpcy5zZXJ2aWNlcy5maWx0ZXIoc2VydmljZSA9PiAoIXNlcnZpY2UucHJvdmlkZXIgJiYgc2VydmljZS5kZXBhcnRtZW50ID09IGRlcHRJZCAmJiBzZXJ2aWNlLnNlcnZpY2VBdmFpbGFiaWxpdHkpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFjdGl2ZVNlcnZpY2VzID0gdGhpcy5zZXJ2aWNlcy5maWx0ZXIoc2VydmljZSA9PiAoIXNlcnZpY2UucHJvdmlkZXIgJiYgc2VydmljZS5zZXJ2aWNlQXZhaWxhYmlsaXR5KSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2ZVNlcnZpY2VzID0gYWN0aXZlU2VydmljZXM7XHJcbiAgICByZXR1cm4gYWN0aXZlU2VydmljZXM7XHJcbiAgfVxyXG4gIGdldEFwcG9pbnRtZW50QnlDb25zdW1lclVVSUQodXVpZCwgYWNjb3VudGlkKSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvYXBwb2ludG1lbnQvJyArIHV1aWQgKyAnP2FjY291bnQ9JyArIGFjY291bnRpZDtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VNZXRhLmh0dHBHZXQodXJsKTtcclxuICB9XHJcblxyXG4gIGdldFNlcnZpY2VzQnlMb2NhdGlvbklkKGxvY2lkKSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvd2FpdGxpc3Qvc2VydmljZXMvJyArIGxvY2lkO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cEdldCh1cmwpO1xyXG4gIH1cclxuICBnZXRMb2NhdGlvbnNCeVNlcnZpY2VJZChzZXJ2aWNlSWQpIHtcclxuICAgIGNvbnN0IHVybCA9ICdjb25zdW1lci9zZXJ2aWNlLycgKyBzZXJ2aWNlSWQgKyAnL2xvY2F0aW9uJztcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VNZXRhLmh0dHBHZXQodXJsKTtcclxuICB9XHJcbiAgZ2V0V2FpdGxpc3RTZXJ2aWNlcyhsb2NhdGlvbklkKSB7XHJcbiAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBfdGhpcy5nZXRTZXJ2aWNlc0J5TG9jYXRpb25JZChsb2NhdGlvbklkKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHNlcnZpY2VzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUoc2VydmljZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgKSwgKCkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBnZXRBdmFpbGFibGVEYXRlc3NCeUxvY2F0aW9uU2VydmljZShsb2NpZCwgc2VydmlkLCBhY2NvdW50aWQ/KSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvYXBwb2ludG1lbnQvYXZhaWxhYmlsaXR5L2xvY2F0aW9uLycgKyBsb2NpZCArICcvc2VydmljZS8nICsgc2VydmlkICsgJz9hY2NvdW50PScgKyBhY2NvdW50aWQ7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KHVybCk7XHJcbiAgfVxyXG4gIGdldFNlcnZpY2VieUxvY2F0aW9uSWQobG9jYXRpb25JZCkge1xyXG4gICAgY29uc29sZS5sb2coXCJMb2NhdGlvbiBJZDpcIiwgbG9jYXRpb25JZCk7XHJcbiAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBpZiAoX3RoaXMuc2VydmljZXMgJiYgX3RoaXMuc2VydmljZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJlc29sdmUoX3RoaXMuc2VydmljZXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLmdldEFwcG9pbnRtZW50U2VydmljZXMobG9jYXRpb25JZCkudGhlbihcclxuICAgICAgICAgIChhcHBvaW50bWVudFNlcnZpY2VzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMuZ2V0V2FpdGxpc3RTZXJ2aWNlcyhsb2NhdGlvbklkKS50aGVuKFxyXG4gICAgICAgICAgICAgICh3bFNlcnZpY2VzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBzZXJ2aWNlcyA9IFsuLi5hcHBvaW50bWVudFNlcnZpY2VzLCAuLi53bFNlcnZpY2VzXTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoc2VydmljZXMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqICByZXR1cm5zIEF2YWlsYWJsZSBkYXRlcyBmb3IgY2FsZW5kYXJcclxuICAgKiBAcGFyYW0gbG9jaWQgbG9jYXRpb24gaWRcclxuICAgKiBAcGFyYW0gc2VydmlkIHNlcnZpY2UgaWRcclxuICAgKiBAcGFyYW0gYWNjb3VudGlkIGFjY291bnQgaWRcclxuICAgKi9cclxuICBnZXRTY2hlZHVsZXNieUxvY2F0aW9uYW5kU2VydmljZUlkYXZhaWxhYmlsaXR5KGxvY2lkLCBzZXJ2aWQsIGFjY291bnRpZCkge1xyXG4gICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XHJcbiAgICAgIGlmIChsb2NpZCAmJiBzZXJ2aWQgJiYgYWNjb3VudGlkKSB7XHJcbiAgICAgICAgX3RoaXMuZ2V0QXZhaWxhYmxlRGF0ZXNzQnlMb2NhdGlvblNlcnZpY2UobG9jaWQsIHNlcnZpZCwgYWNjb3VudGlkKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZXMgPSBkYXRhLmZpbHRlcihvYmogPT4gb2JqLmF2YWlsYWJsZVNsb3RzKTtcclxuICAgICAgICAgICAgY29uc3QgYXZhaWxEYXRlcyA9IGF2YWlsYWJsZXMubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLmRhdGU7IH0pO1xyXG4gICAgICAgICAgICBsZXQgYXZhaWxhYmxlRGF0ZXMgPSBhdmFpbERhdGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlbSwgaW5kZXgsIHNlbGYpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPT09IHNlbGYuaW5kZXhPZihlbGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoYXZhaWxhYmxlRGF0ZXMpO1xyXG4gICAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBnZXRRdWV1ZXNieUxvY2F0aW9uYW5kU2VydmljZUlkYXZhaWxhYmlsaXR5KGxvY2lkLCBzZXJ2aWQsIGFjY291bnRpZCkge1xyXG4gICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGF2YWlsYWJsZURhdGVzID0gW107XHJcbiAgICBpZiAobG9jaWQgJiYgc2VydmlkICYmIGFjY291bnRpZCkge1xyXG4gICAgICB0aGlzLmdldFF1ZXVlc2J5TG9jYXRpb25hbmRTZXJ2aWNlSWRBdmFpbGFibGVEYXRlcyhsb2NpZCwgc2VydmlkLCBhY2NvdW50aWQpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBhdmFpbGFibGVzID0gZGF0YS5maWx0ZXIob2JqID0+IG9iai5pc0F2YWlsYWJsZSk7XHJcbiAgICAgICAgICBjb25zdCBhdmFpbERhdGVzID0gYXZhaWxhYmxlcy5tYXAoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGEuZGF0ZTsgfSk7XHJcbiAgICAgICAgICBhdmFpbGFibGVEYXRlcyA9IGF2YWlsRGF0ZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtLCBpbmRleCwgc2VsZikge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXggPT09IHNlbGYuaW5kZXhPZihlbGVtKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF2YWlsYWJsZURhdGVzO1xyXG4gIH1cclxuICBnZXRRdWV1ZXNieUxvY2F0aW9uYW5kU2VydmljZUlkQXZhaWxhYmxlRGF0ZXMobG9jaWQsIHNlcnZpZCwgYWNjb3VudGlkKSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvd2FpdGxpc3QvcXVldWVzL2F2YWlsYWJsZS8nICsgbG9jaWQgKyAnLycgKyBzZXJ2aWQgKyAnP2FjY291bnQ9JyArIGFjY291bnRpZDtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VNZXRhLmh0dHBHZXQodXJsKTtcclxuICB9XHJcbiAgdmFsaWRhdGVWaXJ0dWFsQ2FsbEluZm8oY2FsbGluZ01vZGVzLCBzZWxlY3RlZFNlcnZpY2UsIGNvbW1PYmopIHtcclxuICAgIGxldCB2YWxpZCA9IHRydWU7XHJcbiAgICBjb25zb2xlLmxvZyhcIkNhbGxpbmcgTW9kZXM6XCIsIGNhbGxpbmdNb2Rlcyk7XHJcbiAgICBpZiAoY2FsbGluZ01vZGVzID09PSAnJyB8fCBjYWxsaW5nTW9kZXMubGVuZ3RoIDwgMTApIHtcclxuICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkU2VydmljZS52aXJ0dWFsQ2FsbGluZ01vZGVzKSB7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkU2VydmljZS52aXJ0dWFsQ2FsbGluZ01vZGVzW2ldLmNhbGxpbmdNb2RlID09PSAnV2hhdHNBcHAnIHx8IHNlbGVjdGVkU2VydmljZS52aXJ0dWFsQ2FsbGluZ01vZGVzW2ldLmNhbGxpbmdNb2RlID09PSAnUGhvbmUnKSB7XHJcbiAgICAgICAgICBpZiAoIWNvbW1PYmpbJ2NvbVdoYXRzYXBwTm8nXSAmJiBzZWxlY3RlZFNlcnZpY2Uuc2VydmljZUJvb2tpbmdUeXBlICE9PSAncmVxdWVzdCcpIHtcclxuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsaWQ7XHJcbiAgfVxyXG4gIGdldFJlc2NoZWR1bGVkSW5mbyhib29raW5nSWQsIGFjY291bnRJZCwgYm9va2luZ01vZGUpIHtcclxuICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIGlmICghYm9va2luZ0lkKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGJvb2tpbmdNb2RlID09PSAnQXBwb2ludG1lbnQnKSB7XHJcbiAgICAgICAgICBfdGhpcy5nZXRBcHBvaW50bWVudEJ5Q29uc3VtZXJVVUlEKGJvb2tpbmdJZCwgYWNjb3VudElkKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIChhcHBvaW50bWVudEluZm8pID0+IHtcclxuICAgICAgICAgICAgICByZXNvbHZlKGFwcG9pbnRtZW50SW5mbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgX3RoaXMuZ2V0Q2hlY2tpbkJ5Q29uc3VtZXJVVUlEKGJvb2tpbmdJZCwgYWNjb3VudElkKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICh3YWl0bGlzdEluZm8pID0+IHtcclxuICAgICAgICAgICAgICByZXNvbHZlKHdhaXRsaXN0SW5mbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBhZGRBcHB0QWR2YW5jZVBheW1lbnQocGFyYW0sIGJvZHkpIHtcclxuICAgIGNvbnN0IHVybCA9ICdjb25zdW1lci9hcHBvaW50bWVudC9hZHZhbmNlUGF5bWVudCc7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwUHV0KHVybCwgYm9keSwgbnVsbCwgcGFyYW0pO1xyXG4gIH1cclxuICBhZGRXYWl0bGlzdEFkdmFuY2VQYXltZW50KHBhcmFtLCBib2R5KSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvd2FpdGxpc3QvYWR2YW5jZVBheW1lbnQnO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cFB1dCh1cmwsIGJvZHksIG51bGwsIHBhcmFtKTtcclxuICB9XHJcbiAgZ2V0Q2hlY2tpbkJ5Q29uc3VtZXJVVUlEKHV1aWQsIGFjY291bnRpZCkge1xyXG4gICAgY29uc29sZS5sb2coXCJVVUlEOlwiLCB1dWlkKTtcclxuICAgIGNvbnN0IHVybCA9ICdjb25zdW1lci93YWl0bGlzdC8nICsgdXVpZCArICc/YWNjb3VudD0nICsgYWNjb3VudGlkO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZU1ldGEuaHR0cEdldCh1cmwpO1xyXG4gIH1cclxuICBnZXRTbG90c0J5TG9jYXRpb25TZXJ2aWNlYW5kRGF0ZShsb2NpZCwgc2VydmlkLCBwZGF0ZSwgYWNjb3VudGlkKSB7XHJcbiAgICBjb25zdCB1cmwgPSAnY29uc3VtZXIvYXBwb2ludG1lbnQvc2NoZWR1bGUvZGF0ZS8nICsgcGRhdGUgKyAnL2xvY2F0aW9uLycgKyBsb2NpZCArICcvc2VydmljZS8nICsgc2VydmlkICsgJz9hY2NvdW50PScgKyBhY2NvdW50aWQ7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KHVybCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gbG9jaWQgTG9jYXRpb24gSWRcclxuICAgICAqIEByZXR1cm5zIHNlcnZpY2VzIG9mIGxvY2F0aW9uXHJcbiAgICAgKi9cclxuICBnZXRRdWV1ZXNieUxvY2F0aW9uU2VydmljZUFuZERhdGUobG9jaWQsIHNlcnZpZCwgcGRhdGUsIGFjY291bnRpZCkge1xyXG4gICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgX3RoaXMuZ2V0UXVldWVzYnlMb2NhdGlvbmFuZFNlcnZpY2VJZChsb2NpZCwgc2VydmlkLCBwZGF0ZSwgYWNjb3VudGlkKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHF1ZXVlczogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKHF1ZXVlcyk7XHJcbiAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIGdldFF1ZXVlc2J5TG9jYXRpb25hbmRTZXJ2aWNlSWQobG9jaWQsIHNlcnZpZCwgcGRhdGU/LCBhY2NvdW50aWQ/KSB7XHJcbiAgICBjb25zdCBkZCA9IChwZGF0ZSAhPT0gdW5kZWZpbmVkKSA/ICcvJyArIHBkYXRlICsgJz9hY2NvdW50PScgKyBhY2NvdW50aWQgOiAnJztcclxuICAgIGNvbnN0IHVybCA9ICdjb25zdW1lci93YWl0bGlzdC9xdWV1ZXMvJyArIGxvY2lkICsgJy8nICsgc2VydmlkICsgZGQ7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KHVybCk7XHJcbiAgfVxyXG4gIGdldENvbnZlbmllbnRGZWVPZlByb3ZpZGVyKHByb3ZpZCwgZGF0YT8pIHtcclxuICAgIGNvbnN0IHVybCA9ICdjb25zdW1lci9wYXltZW50L21vZGVzL2NvbnZlbmllbmNlRmVlLycgKyBwcm92aWQ7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwUHV0KHVybCwgZGF0YSk7XHJcbiAgfVxyXG4gIGdldEFwcHRDb3Vwb25zKHNlcnZJZCwgbG9jSWQpIHtcclxuICAgIGNvbnN0IHVybCA9ICdjb25zdW1lci9hcHBvaW50bWVudC9zZXJ2aWNlLycgKyBzZXJ2SWQgKyAnL2xvY2F0aW9uLycgKyBsb2NJZCArICcvY291cG9ucyc7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KHVybCk7XHJcbiAgfVxyXG4gIGdldENoZWNraW5Db3Vwb25zKHNlcnZJZCwgbG9jSWQpIHtcclxuICAgIGNvbnN0IHVybCA9ICdjb25zdW1lci93YWl0bGlzdC9zZXJ2aWNlLycgKyBzZXJ2SWQgKyAnL2xvY2F0aW9uLycgKyBsb2NJZCArICcvY291cG9ucyc7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTWV0YS5odHRwR2V0KHVybCk7XHJcbiAgfVxyXG4gIGdldFNlcnZpY2VCeUlkKHNlcnZpY2VJZCwgdHlwZSkge1xyXG4gICAgbGV0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzLmZpbHRlcihzZXJ2aWNlID0+IChzZXJ2aWNlLmlkID09PSBzZXJ2aWNlSWQgJiYgc2VydmljZS5iVHlwZSA9PT0gdHlwZSkpO1xyXG4gICAgcmV0dXJuIHNlcnZpY2VbMF07XHJcbiAgfVxyXG59XHJcbiJdfQ==
|