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.
Files changed (108) hide show
  1. package/esm2022/lib/account-service.mjs +158 -9
  2. package/esm2022/lib/auth-service.mjs +12 -4
  3. package/esm2022/lib/booking-service.mjs +480 -0
  4. package/esm2022/lib/calendar/date-time/datetime-processor.service.mjs +4 -4
  5. package/esm2022/lib/common.service.mjs +157 -7
  6. package/esm2022/lib/confirm/confirm-box.component.mjs +159 -0
  7. package/esm2022/lib/confirm/confirm-box.module.mjs +62 -0
  8. package/esm2022/lib/consumer-service.mjs +780 -0
  9. package/esm2022/lib/currency-service.mjs +12 -0
  10. package/esm2022/lib/environment.service.mjs +23 -0
  11. package/esm2022/lib/error-message.module.mjs +23 -0
  12. package/esm2022/lib/file-service.mjs +25 -19
  13. package/esm2022/lib/form-message/field-error-display/field-error-display.component.mjs +21 -0
  14. package/esm2022/lib/form-message/form-message-display.module.mjs +35 -0
  15. package/esm2022/lib/form-message/form-message-display.service.mjs +44 -0
  16. package/esm2022/lib/form-message/form-success-display/form-success-display.component.mjs +18 -0
  17. package/esm2022/lib/group-storage.service.mjs +4 -4
  18. package/esm2022/lib/i8n.module.mjs +5 -5
  19. package/esm2022/lib/injector-resolver.mjs +28 -0
  20. package/esm2022/lib/local-storage.service.mjs +4 -4
  21. package/esm2022/lib/media-service.mjs +49 -0
  22. package/esm2022/lib/order.service.mjs +19 -4
  23. package/esm2022/lib/payment/modes/payment-modes.component.mjs +35 -0
  24. package/esm2022/lib/payment/modes/payment-modes.module.mjs +24 -0
  25. package/esm2022/lib/payment/payment.module.mjs +26 -0
  26. package/esm2022/lib/paytm.service.mjs +131 -0
  27. package/esm2022/lib/phone-input/phone-input.component.mjs +50 -46
  28. package/esm2022/lib/phone-input/phone-input.module.mjs +5 -5
  29. package/esm2022/lib/pipes/autolink/autolink.module.mjs +20 -0
  30. package/esm2022/lib/pipes/autolink/autolink.pipe.mjs +4 -4
  31. package/esm2022/lib/pipes/capitalize/capitalize.module.mjs +5 -5
  32. package/esm2022/lib/pipes/capitalize/capitalize.pipe.mjs +4 -4
  33. package/esm2022/lib/pipes/date-format/date-format.module.mjs +19 -0
  34. package/esm2022/lib/pipes/date-format/date-format.pipe.mjs +42 -0
  35. package/esm2022/lib/pipes/filter/filter.pipe.mjs +4 -4
  36. package/esm2022/lib/pipes/limit-to/limitTo.pipe.mjs +4 -4
  37. package/esm2022/lib/pipes/safe-html/safehtml.module.mjs +5 -5
  38. package/esm2022/lib/pipes/safe-html/safehtml.pipe.mjs +4 -4
  39. package/esm2022/lib/project-constants.mjs +310 -0
  40. package/esm2022/lib/questionaire/edit/questionnaire.component.mjs +53 -63
  41. package/esm2022/lib/questionaire/edit/questionnaire.module.mjs +16 -15
  42. package/esm2022/lib/questionaire/questionaire-service.mjs +4 -4
  43. package/esm2022/lib/razorpay.service.mjs +157 -0
  44. package/esm2022/lib/request-dialog/request-dialog.component.mjs +29 -0
  45. package/esm2022/lib/request-dialog/request-dialog.module.mjs +24 -0
  46. package/esm2022/lib/service-meta.mjs +4 -4
  47. package/esm2022/lib/session-storage.service.mjs +4 -4
  48. package/esm2022/lib/shared-account.guard.mjs +41 -0
  49. package/esm2022/lib/shared-account.resolver.mjs +22 -0
  50. package/esm2022/lib/shared.service.mjs +88 -13
  51. package/esm2022/lib/showuploadfile/showuploadfile.component.mjs +5 -5
  52. package/esm2022/lib/showuploadfile/showuploadfile.module.mjs +5 -5
  53. package/esm2022/lib/skeleton/skeleton-loading.component.mjs +4 -4
  54. package/esm2022/lib/skeleton/skeleton-loading.module.mjs +5 -5
  55. package/esm2022/lib/spinner/loading-spinner.component.mjs +4 -4
  56. package/esm2022/lib/spinner/loading-spinner.module.mjs +5 -5
  57. package/esm2022/lib/storage.service.mjs +4 -4
  58. package/esm2022/lib/subscription.service.mjs +4 -4
  59. package/esm2022/lib/theme.service.mjs +30 -0
  60. package/esm2022/lib/timezone-converter.mjs +49 -0
  61. package/esm2022/lib/toast.service.mjs +5 -5
  62. package/esm2022/lib/twilio-service.mjs +466 -0
  63. package/esm2022/lib/word-processor.service.mjs +4 -4
  64. package/esm2022/public-api.mjs +32 -1
  65. package/fesm2022/jconsumer-shared.mjs +3981 -541
  66. package/fesm2022/jconsumer-shared.mjs.map +1 -1
  67. package/jconsumer-shared-1.0.1.tgz +0 -0
  68. package/lib/account-service.d.ts +41 -2
  69. package/lib/auth-service.d.ts +1 -0
  70. package/lib/booking-service.d.ts +101 -0
  71. package/lib/common.service.d.ts +12 -1
  72. package/lib/confirm/confirm-box.component.d.ts +43 -0
  73. package/lib/confirm/confirm-box.module.d.ts +16 -0
  74. package/lib/consumer-service.d.ts +178 -0
  75. package/lib/currency-service.d.ts +4 -0
  76. package/lib/environment.service.d.ts +9 -0
  77. package/lib/error-message.module.d.ts +7 -0
  78. package/lib/file-service.d.ts +5 -2
  79. package/lib/form-message/field-error-display/field-error-display.component.d.ts +8 -0
  80. package/lib/form-message/form-message-display.module.d.ts +10 -0
  81. package/lib/form-message/form-message-display.service.d.ts +13 -0
  82. package/lib/form-message/form-success-display/form-success-display.component.d.ts +7 -0
  83. package/lib/injector-resolver.d.ts +2 -0
  84. package/lib/media-service.d.ts +9 -0
  85. package/lib/order.service.d.ts +4 -0
  86. package/lib/payment/modes/payment-modes.component.d.ts +15 -0
  87. package/lib/payment/modes/payment-modes.module.d.ts +9 -0
  88. package/lib/payment/payment.module.d.ts +7 -0
  89. package/lib/paytm.service.d.ts +13 -0
  90. package/lib/phone-input/phone-input.component.d.ts +5 -3
  91. package/lib/pipes/autolink/autolink.module.d.ts +8 -0
  92. package/lib/pipes/date-format/date-format.module.d.ts +8 -0
  93. package/lib/pipes/date-format/date-format.pipe.d.ts +12 -0
  94. package/lib/project-constants.d.ts +227 -0
  95. package/lib/questionaire/edit/questionnaire.component.d.ts +8 -9
  96. package/lib/questionaire/edit/questionnaire.module.d.ts +9 -8
  97. package/lib/razorpay.service.d.ts +26 -0
  98. package/lib/request-dialog/request-dialog.component.d.ts +11 -0
  99. package/lib/request-dialog/request-dialog.module.d.ts +9 -0
  100. package/lib/shared-account.guard.d.ts +11 -0
  101. package/lib/shared-account.resolver.d.ts +10 -0
  102. package/lib/shared.service.d.ts +31 -4
  103. package/lib/theme.service.d.ts +10 -0
  104. package/lib/timezone-converter.d.ts +8 -0
  105. package/lib/twilio-service.d.ts +60 -0
  106. package/package.json +1 -1
  107. package/public-api.d.ts +31 -0
  108. 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==