@pmcretail/mapper-library 0.0.49 → 0.0.52
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/README.md +24 -24
- package/bundles/pmcretail-mapper-library.umd.js +4379 -4373
- package/bundles/pmcretail-mapper-library.umd.js.map +1 -1
- package/esm2015/lib/RJ-mapper.class.js +877 -877
- package/esm2015/lib/TransactionDocumentBuilder.js +1244 -1244
- package/esm2015/lib/WebReturn-mapper.class.js +326 -326
- package/esm2015/lib/WebReturnMagento2RestV1.class.js +275 -269
- package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -409
- package/esm2015/lib/basket.service.js +527 -527
- package/esm2015/lib/mapper-library.component.js +26 -26
- package/esm2015/lib/mapper-library.model.js +41 -41
- package/esm2015/lib/mapper-library.module.js +21 -21
- package/esm2015/lib/number-util.service.js +42 -42
- package/esm2015/pmcretail-mapper-library.js +4 -4
- package/esm2015/public-api.js +10 -10
- package/fesm2015/pmcretail-mapper-library.js +3743 -3737
- package/fesm2015/pmcretail-mapper-library.js.map +1 -1
- package/lib/RJ-mapper.class.d.ts +80 -80
- package/lib/TransactionDocumentBuilder.d.ts +271 -271
- package/lib/WebReturn-mapper.class.d.ts +27 -27
- package/lib/WebReturnMagento2RestV1.class.d.ts +30 -30
- package/lib/WebReturnMagento2RestV1.class.d.ts.map +1 -1
- package/lib/WebReturnSalesforceMapper.class.d.ts +35 -35
- package/lib/basket.service.d.ts +105 -105
- package/lib/mapper-library.component.d.ts +8 -8
- package/lib/mapper-library.model.d.ts +702 -701
- package/lib/mapper-library.model.d.ts.map +1 -1
- package/lib/mapper-library.module.d.ts +7 -7
- package/lib/number-util.service.d.ts +13 -13
- package/package.json +2 -2
- package/pmcretail-mapper-library.d.ts +5 -5
- package/public-api.d.ts +6 -6
|
@@ -1,527 +1,527 @@
|
|
|
1
|
-
import { BehaviorSubject } from 'rxjs';
|
|
2
|
-
import { DELIVERY_METHODS } from './mapper-library.model';
|
|
3
|
-
import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
|
|
4
|
-
export class BasketService {
|
|
5
|
-
constructor(numberUtilService) {
|
|
6
|
-
this.numberUtilService = numberUtilService;
|
|
7
|
-
this.currentBasket = {
|
|
8
|
-
products: [],
|
|
9
|
-
transactionDiscount: [],
|
|
10
|
-
quantity: 0,
|
|
11
|
-
total: 0,
|
|
12
|
-
saleTotal: 0,
|
|
13
|
-
baseCurrency: ''
|
|
14
|
-
};
|
|
15
|
-
this.basketSource = new BehaviorSubject(null);
|
|
16
|
-
this.basket = this.basketSource.asObservable();
|
|
17
|
-
this.productSource = new BehaviorSubject(null);
|
|
18
|
-
this.product = this.productSource.asObservable();
|
|
19
|
-
this.peerSource = new BehaviorSubject(false);
|
|
20
|
-
this.peerSync = this.peerSource.asObservable();
|
|
21
|
-
this.scanSource = new BehaviorSubject(false);
|
|
22
|
-
this.scanner = this.scanSource.asObservable();
|
|
23
|
-
this.className = "BasketService";
|
|
24
|
-
}
|
|
25
|
-
get isMixedBasketSales() {
|
|
26
|
-
return this._isMixedBasketSales;
|
|
27
|
-
}
|
|
28
|
-
set isMixedBasketSales(v) {
|
|
29
|
-
this._isMixedBasketSales = v;
|
|
30
|
-
}
|
|
31
|
-
updateBasket(basket) {
|
|
32
|
-
this.currentBasket = basket;
|
|
33
|
-
this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;
|
|
34
|
-
this.basketSource.next(basket);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* calculates the total basket value and quantity
|
|
38
|
-
* @param null
|
|
39
|
-
* @returns void
|
|
40
|
-
*/
|
|
41
|
-
updateBasketTotal(basketDetails, basketState) {
|
|
42
|
-
basketDetails.quantity = 0;
|
|
43
|
-
basketDetails.total = 0;
|
|
44
|
-
for (const p of basketDetails.products) {
|
|
45
|
-
basketDetails.quantity = basketDetails.quantity + p.quantity;
|
|
46
|
-
basketDetails.total =
|
|
47
|
-
this.numberUtilService.trimTo2Decimal(basketDetails.total) +
|
|
48
|
-
this.numberUtilService.trimTo2Decimal(p.total);
|
|
49
|
-
}
|
|
50
|
-
AppLoggerService.logDebug(this.className, "updateBasketTotal", `basketDetails updated values for transaction id
|
|
51
|
-
${basketDetails.transactionId}, basketDetails
|
|
52
|
-
${JSON.stringify(basketDetails)}`);
|
|
53
|
-
basketDetails.basketTotal = basketDetails.total;
|
|
54
|
-
basketState.updateBasket(basketDetails);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* add Line promotion
|
|
58
|
-
* @param null
|
|
59
|
-
* @returns basketDetails
|
|
60
|
-
*/
|
|
61
|
-
addlinePromotion(promotionList, basketDetails) {
|
|
62
|
-
AppLoggerService.logDebug(this.className, "addlinePromotion", `promotionList ${JSON.stringify(promotionList)} and
|
|
63
|
-
basketDetails
|
|
64
|
-
${JSON.stringify(basketDetails)} for linePromotions`);
|
|
65
|
-
if (promotionList &&
|
|
66
|
-
promotionList.result &&
|
|
67
|
-
promotionList.result.linePromotions &&
|
|
68
|
-
promotionList.result.linePromotions.length > 0) {
|
|
69
|
-
for (var element of basketDetails.products) {
|
|
70
|
-
for (var promotionelement of promotionList.result.linePromotions) {
|
|
71
|
-
if (element.itemLineId.toString() ===
|
|
72
|
-
promotionelement.itemLineId.toString()) {
|
|
73
|
-
element.linePromotions = promotionelement;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return basketDetails;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* add Transaction promotion
|
|
82
|
-
* @param null
|
|
83
|
-
* @returns basketDetails
|
|
84
|
-
*/
|
|
85
|
-
addTransactionPromotion(promotionList, basketdetails) {
|
|
86
|
-
AppLoggerService.logDebug(this.className, "addTransactionPromotion", `promotionList ${JSON.stringify(promotionList)} and
|
|
87
|
-
basketDetails
|
|
88
|
-
${JSON.stringify(basketdetails)} for transactionPromotions ${JSON.stringify(basketdetails.transactionPromotion)}`);
|
|
89
|
-
if (promotionList &&
|
|
90
|
-
promotionList.result &&
|
|
91
|
-
promotionList.result.transactionPromotion &&
|
|
92
|
-
promotionList.result.transactionPromotion.length > 0) {
|
|
93
|
-
promotionList.result.transactionPromotion.forEach((tPromotion) => {
|
|
94
|
-
let transactionPromotionEntryUpdated = Object.assign({}, tPromotion);
|
|
95
|
-
transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map((product) => {
|
|
96
|
-
return product.itemLineId;
|
|
97
|
-
});
|
|
98
|
-
if (!basketdetails.transactionPromotion) {
|
|
99
|
-
basketdetails.transactionPromotion = [];
|
|
100
|
-
}
|
|
101
|
-
basketdetails.transactionPromotion.push(transactionPromotionEntryUpdated);
|
|
102
|
-
basketdetails = this.transactionPromotionProductPortionCalc(basketdetails, transactionPromotionEntryUpdated);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
AppLoggerService.logDebug(this.className, "addTransactionPromotion", "basket details in refund calculation file", basketdetails);
|
|
106
|
-
return basketdetails;
|
|
107
|
-
}
|
|
108
|
-
updateProductTotalForSummary(basketDetails) {
|
|
109
|
-
/*sale- product refundedQuantity = undefined
|
|
110
|
-
partial refund - product refundedQuantity is > 0
|
|
111
|
-
total refund - proudct refundedQuantity is > 0
|
|
112
|
-
exchange - exchange product refundedQuantity is > 0
|
|
113
|
-
new product refundedQuantity = undefined
|
|
114
|
-
old product without exchange refundedQuantity = 0
|
|
115
|
-
unreference refund-product refundedQuantity is > 0 */
|
|
116
|
-
basketDetails.total = 0;
|
|
117
|
-
basketDetails.quantity = 0;
|
|
118
|
-
for (var product of basketDetails.products) {
|
|
119
|
-
if (product.linePromotions) {
|
|
120
|
-
product.total = product.linePromotions.promotionLinePrice;
|
|
121
|
-
}
|
|
122
|
-
else if (product.lineDiscount && !product.linePromotions) {
|
|
123
|
-
product.total = product.lineDiscount.discountedLinePrice;
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
product.total = product.totalLinePrice;
|
|
127
|
-
}
|
|
128
|
-
product.total =
|
|
129
|
-
product.total -
|
|
130
|
-
Math.abs(product.refundedTotal ? product.refundedTotal : 0);
|
|
131
|
-
basketDetails.total += product.total;
|
|
132
|
-
basketDetails.quantity =
|
|
133
|
-
basketDetails.quantity +
|
|
134
|
-
(product.quantity -
|
|
135
|
-
(product.refundedQuantity ? product.refundedQuantity : 0));
|
|
136
|
-
AppLoggerService.logDebug(this.className, "updateProductTotalForSummary", "update basketdetails total :" +
|
|
137
|
-
basketDetails.total +
|
|
138
|
-
" Product line ID : " +
|
|
139
|
-
product.itemLineId +
|
|
140
|
-
" product total : " +
|
|
141
|
-
product.total, "quantity : " + basketDetails.quantity);
|
|
142
|
-
}
|
|
143
|
-
return this.updateBasketTotalForSummary(basketDetails);
|
|
144
|
-
}
|
|
145
|
-
updateBasketTotalForSummary(basketDetails) {
|
|
146
|
-
basketDetails.basketTotal = basketDetails.total;
|
|
147
|
-
AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionDiscount ", basketDetails.transactionDiscount);
|
|
148
|
-
AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionPromotion ", basketDetails.transactionPromotion);
|
|
149
|
-
basketDetails = this.updateTransactionPromotion(basketDetails);
|
|
150
|
-
basketDetails = this.updateTransactionDiscount(basketDetails);
|
|
151
|
-
basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));
|
|
152
|
-
AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total: basketTotal after promotion applied for basketTotal", basketDetails.basketTotal);
|
|
153
|
-
return basketDetails;
|
|
154
|
-
}
|
|
155
|
-
updateTransactionDiscount(basketDetails) {
|
|
156
|
-
if (basketDetails.transactionDiscount &&
|
|
157
|
-
basketDetails.transactionDiscount.length > 0) {
|
|
158
|
-
const discountTotal = basketDetails.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
|
|
159
|
-
AppLoggerService.logDebug(this.className, "updateTransactionDiscount", "discountTotal ", discountTotal);
|
|
160
|
-
basketDetails.basketTotal =
|
|
161
|
-
basketDetails.basketTotal - Math.abs(discountTotal);
|
|
162
|
-
}
|
|
163
|
-
return basketDetails;
|
|
164
|
-
}
|
|
165
|
-
updateTransactionPromotion(basketDetails) {
|
|
166
|
-
if (basketDetails.transactionPromotion &&
|
|
167
|
-
basketDetails.transactionPromotion.length > 0) {
|
|
168
|
-
const discountTotal = basketDetails.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
|
|
169
|
-
basketDetails.basketTotal =
|
|
170
|
-
basketDetails.basketTotal - Math.abs(discountTotal);
|
|
171
|
-
}
|
|
172
|
-
return basketDetails;
|
|
173
|
-
}
|
|
174
|
-
updateBasketTotalWithoutDiscount(basket) {
|
|
175
|
-
basket.total = 0;
|
|
176
|
-
basket.quantity = 0;
|
|
177
|
-
for (var product of basket.products) {
|
|
178
|
-
if (product.linePromotions) {
|
|
179
|
-
product.total = product.linePromotions.promotionLinePrice;
|
|
180
|
-
}
|
|
181
|
-
else if (product.lineDiscount && !product.linePromotions) {
|
|
182
|
-
product.total = product.lineDiscount.discountedLinePrice || 0;
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
product.total = product.totalLinePrice;
|
|
186
|
-
}
|
|
187
|
-
product.total =
|
|
188
|
-
product.total -
|
|
189
|
-
Math.abs(product.refundedTotal ? product.refundedTotal : 0);
|
|
190
|
-
basket.total += product.total;
|
|
191
|
-
basket.quantity =
|
|
192
|
-
basket.quantity +
|
|
193
|
-
(product.quantity -
|
|
194
|
-
(product.refundedQuantity ? product.refundedQuantity : 0));
|
|
195
|
-
AppLoggerService.logDebug(this.className, "updateBasketTotalWithoutDiscount", "e-basket:basket service:update basketdetails total :" +
|
|
196
|
-
JSON.stringify(basket) +
|
|
197
|
-
basket.total +
|
|
198
|
-
" Product line ID : " +
|
|
199
|
-
product.itemLineId +
|
|
200
|
-
" product total : " +
|
|
201
|
-
product.total);
|
|
202
|
-
}
|
|
203
|
-
basket.basketTotal = basket.total;
|
|
204
|
-
return basket;
|
|
205
|
-
}
|
|
206
|
-
updateBasketTotalWithDiscounts(basket) {
|
|
207
|
-
AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", `this.basketDetails new values ${basket},
|
|
208
|
-
${JSON.stringify(basket.basketTotal)}`);
|
|
209
|
-
if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
|
|
210
|
-
const discountTotal = basket.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
|
|
211
|
-
basket.basketTotal = basket.basketTotal - discountTotal;
|
|
212
|
-
}
|
|
213
|
-
if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
|
|
214
|
-
const discountTotal = basket.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
|
|
215
|
-
basket.basketTotal = basket.basketTotal - discountTotal;
|
|
216
|
-
}
|
|
217
|
-
AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", "basket new values", basket);
|
|
218
|
-
return basket;
|
|
219
|
-
}
|
|
220
|
-
transactionDiscountAndPromotionProductortionCalculation(basket) {
|
|
221
|
-
if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
|
|
222
|
-
basket.transactionDiscount.forEach((discount) => (basket = this.transactionDiscountProductPortionCalc(basket, discount)));
|
|
223
|
-
}
|
|
224
|
-
if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
|
|
225
|
-
basket.transactionPromotion.forEach((promotion) => {
|
|
226
|
-
basket = this.transactionPromotionProductPortionCalc(basket, promotion);
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
AppLoggerService.logDebug(this.className, "transactionDiscountAndPromotionProductortionCalculation", `basket item discount protion calculation ,
|
|
230
|
-
${basket},
|
|
231
|
-
${basket.products}`);
|
|
232
|
-
return basket;
|
|
233
|
-
}
|
|
234
|
-
transactionPromotionProductPortionCalc(basket, promotion) {
|
|
235
|
-
let total = 0;
|
|
236
|
-
let percentage = 0;
|
|
237
|
-
{
|
|
238
|
-
basket.products.forEach((p) => {
|
|
239
|
-
if (promotion.itemLineIds.includes(p.itemLineId)) {
|
|
240
|
-
p = this.validateProductItemDiscount(p);
|
|
241
|
-
const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
|
|
242
|
-
this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
|
|
243
|
-
this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
|
|
244
|
-
total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
|
|
245
|
-
}
|
|
246
|
-
});
|
|
247
|
-
AppLoggerService.logDebug(this.className, "transactionPromotionProductPortionCalc", `ebasket: trnsactionPromotion: ${JSON.stringify(promotion)}, selected products total: ${total}`);
|
|
248
|
-
basket.products.forEach((product) => {
|
|
249
|
-
product = this.validateProductItemDiscount(product);
|
|
250
|
-
const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
|
|
251
|
-
this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
|
|
252
|
-
this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
|
|
253
|
-
if (promotion.itemLineIds.includes(product.itemLineId)) {
|
|
254
|
-
percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
|
|
255
|
-
product.itemDiscounts.trnPromotionsPortion +=
|
|
256
|
-
(promotion.promotionAmount * percentage) / 100;
|
|
257
|
-
product.itemDiscounts.trnPromotionsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
return basket;
|
|
262
|
-
}
|
|
263
|
-
transactionDiscountProductPortionCalc(basket, discount) {
|
|
264
|
-
let total = 0;
|
|
265
|
-
let percentage = 0;
|
|
266
|
-
basket.products.forEach((p) => {
|
|
267
|
-
if (discount.itemLineIds.includes(p.itemLineId)) {
|
|
268
|
-
p = this.validateProductItemDiscount(p);
|
|
269
|
-
const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
|
|
270
|
-
this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
|
|
271
|
-
this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
|
|
272
|
-
total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", `ebasket: trnsactionDiscount: ${JSON.stringify(discount)}, selected products total: ${total}`);
|
|
276
|
-
basket.products.forEach((product) => {
|
|
277
|
-
product = this.validateProductItemDiscount(product);
|
|
278
|
-
AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", "discountable in basket service", product.discountable);
|
|
279
|
-
const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
|
|
280
|
-
this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
|
|
281
|
-
this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
|
|
282
|
-
if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {
|
|
283
|
-
percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
|
|
284
|
-
product.itemDiscounts.trnDiscountsPortion +=
|
|
285
|
-
(discount.discountAmount * percentage) / 100;
|
|
286
|
-
product.itemDiscounts.trnDiscountsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion);
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
return basket;
|
|
290
|
-
}
|
|
291
|
-
validateProductItemDiscount(product) {
|
|
292
|
-
if (!product.itemDiscounts) {
|
|
293
|
-
product.itemDiscounts = {
|
|
294
|
-
trnDiscountsPortion: 0,
|
|
295
|
-
trnPromotionsPortion: 0,
|
|
296
|
-
refundPortion: 0,
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
return product;
|
|
300
|
-
}
|
|
301
|
-
markProduct(product) {
|
|
302
|
-
this.productSource.next(product);
|
|
303
|
-
}
|
|
304
|
-
stopPeerSyncProcess(peerSync) {
|
|
305
|
-
this.peerSource.next(peerSync);
|
|
306
|
-
}
|
|
307
|
-
scanStart(isScanning) {
|
|
308
|
-
this.scanSource.next(isScanning);
|
|
309
|
-
}
|
|
310
|
-
promotionRemainingCalculation(promotion) {
|
|
311
|
-
var promotionValue = 0;
|
|
312
|
-
promotion.forEach((element) => {
|
|
313
|
-
promotionValue += element.promotionAmount;
|
|
314
|
-
});
|
|
315
|
-
return promotionValue;
|
|
316
|
-
}
|
|
317
|
-
discountRemainingCalculation(discount) {
|
|
318
|
-
var discountValue = 0;
|
|
319
|
-
discount.forEach((element) => {
|
|
320
|
-
discountValue += element.discountAmount;
|
|
321
|
-
});
|
|
322
|
-
return discountValue;
|
|
323
|
-
}
|
|
324
|
-
discountRefundedCalculation(discount) {
|
|
325
|
-
var discountValue = 0;
|
|
326
|
-
discount.forEach((element) => {
|
|
327
|
-
if (element.discountAmount < 0) {
|
|
328
|
-
discountValue += element.discountAmount;
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
return discountValue;
|
|
332
|
-
}
|
|
333
|
-
generateNewItemLineId(products) {
|
|
334
|
-
let largestNumber = 0;
|
|
335
|
-
if (products.length > 0) {
|
|
336
|
-
let itemLineIdArray = products.map((product) => {
|
|
337
|
-
return product.itemLineId;
|
|
338
|
-
});
|
|
339
|
-
largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
|
|
340
|
-
}
|
|
341
|
-
return largestNumber + 1;
|
|
342
|
-
}
|
|
343
|
-
updateBasketProductDataAsPerQuantity(product, quantity) {
|
|
344
|
-
AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
|
|
345
|
-
product.quantity = quantity;
|
|
346
|
-
if (product.hasOwnProperty("lineDiscount")) {
|
|
347
|
-
// && this.product.quantity !== this.productDetailForm.controls.quantity.value
|
|
348
|
-
product.lineDiscount.discountedLinePrice = Number(this.numberUtilService.getFlooredFixed(product.lineDiscount.unitPrice * quantity, 2));
|
|
349
|
-
product.lineDiscount.discountAmount =
|
|
350
|
-
product.totalLinePrice - product.lineDiscount.discountedLinePrice;
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
product.totalLinePrice =
|
|
354
|
-
quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);
|
|
355
|
-
}
|
|
356
|
-
if (product.lineDiscount) {
|
|
357
|
-
product.total = product.lineDiscount.discountedLinePrice;
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
product.total = product.totalLinePrice;
|
|
361
|
-
}
|
|
362
|
-
AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
|
|
363
|
-
return product;
|
|
364
|
-
}
|
|
365
|
-
filterProductListWithWebOrder(isWebOrder) {
|
|
366
|
-
AppLoggerService.logDebug(this.className, "filterProductListWithWebOrder", "filterProductListWithWebOrder hit", this.currentBasket.products);
|
|
367
|
-
if (isWebOrder)
|
|
368
|
-
return this.currentBasket.products.filter((x) => x.isWebOrder);
|
|
369
|
-
else {
|
|
370
|
-
return this.currentBasket.products.filter((x) => !x.isWebOrder);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
filterProductListWithDelivery() {
|
|
374
|
-
AppLoggerService.logDebug(this.className, "filterProductListWithDelivery", "filterProductListWithDelivery hit", this.currentBasket.products);
|
|
375
|
-
return this.currentBasket.products.filter((x) => x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString());
|
|
376
|
-
}
|
|
377
|
-
filterProductListWithDeliveryGroup(group, products) {
|
|
378
|
-
AppLoggerService.logDebug(this.className, "filterProductListWithDeliveryGroup", "filterProductListWithDeliveryGroup hit", products);
|
|
379
|
-
return products.filter((x) => x.deliveryGroup === group);
|
|
380
|
-
}
|
|
381
|
-
generateNewDeliveryGroupNumber(products) {
|
|
382
|
-
let largestNumber = 0;
|
|
383
|
-
if (products.length > 0) {
|
|
384
|
-
let deliveryGroupArr = products.map((product) => {
|
|
385
|
-
if (product.deliveryGroup) {
|
|
386
|
-
return parseInt(product.deliveryGroup);
|
|
387
|
-
}
|
|
388
|
-
return 0;
|
|
389
|
-
});
|
|
390
|
-
largestNumber = deliveryGroupArr.reduce((a, b) => Math.max(a, b));
|
|
391
|
-
}
|
|
392
|
-
return (largestNumber + 1).toString();
|
|
393
|
-
}
|
|
394
|
-
getDeliveryGroupNumbers(products) {
|
|
395
|
-
AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers initiating : ", products);
|
|
396
|
-
let uniqueAndsortedResult = [];
|
|
397
|
-
if (products.length > 0) {
|
|
398
|
-
let deliveryGroupArr = products.map((product) => {
|
|
399
|
-
if (product.deliveryGroup) {
|
|
400
|
-
return parseInt(product.deliveryGroup);
|
|
401
|
-
}
|
|
402
|
-
else if (product.deliveryMethod === "1") {
|
|
403
|
-
return 1;
|
|
404
|
-
}
|
|
405
|
-
return 0;
|
|
406
|
-
});
|
|
407
|
-
uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((a, b) => a - b);
|
|
408
|
-
AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers : uniqueAndsortedResult", uniqueAndsortedResult);
|
|
409
|
-
}
|
|
410
|
-
return uniqueAndsortedResult;
|
|
411
|
-
}
|
|
412
|
-
updateProductsWithNewDeliveryGroupNumber(products) {
|
|
413
|
-
AppLoggerService.logDebug(this.className, "updateProductsWithNewDeliveryGroupNumber", "initiating : ", products);
|
|
414
|
-
let newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);
|
|
415
|
-
if (products.length > 0) {
|
|
416
|
-
this.currentBasket.products.forEach(cBProducts => {
|
|
417
|
-
products.forEach(element => {
|
|
418
|
-
if (cBProducts.itemLineId === element.itemLineId) {
|
|
419
|
-
cBProducts.deliveryGroup = newGroupNumber;
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
this.updateBasket(this.currentBasket);
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
calculateEstimatedTime(products) {
|
|
428
|
-
try {
|
|
429
|
-
let time;
|
|
430
|
-
let estmatedTime = 0;
|
|
431
|
-
let estimatedDays = "Hours";
|
|
432
|
-
products.forEach((element) => {
|
|
433
|
-
if (element.leadTime.type.toLocaleLowerCase() === "weeks") {
|
|
434
|
-
time = Number(element.leadTime.value) * 24 * 7;
|
|
435
|
-
estmatedTime = Math.max(estmatedTime, time);
|
|
436
|
-
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
437
|
-
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `week ${estmatedTime} ${estimatedDays}`);
|
|
438
|
-
}
|
|
439
|
-
else if (element.leadTime.type.toLocaleLowerCase() === "days") {
|
|
440
|
-
time = Number(element.leadTime.value) * 24;
|
|
441
|
-
estmatedTime = Math.max(estmatedTime, time);
|
|
442
|
-
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
443
|
-
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `days ${estmatedTime} ${estimatedDays}`);
|
|
444
|
-
}
|
|
445
|
-
else if (element.leadTime.type.toLocaleLowerCase() === "months") {
|
|
446
|
-
time = Number(element.leadTime.value) * 24 * 30;
|
|
447
|
-
estmatedTime = Math.max(estmatedTime, time);
|
|
448
|
-
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
449
|
-
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `months ${estmatedTime} ${estimatedDays}`);
|
|
450
|
-
}
|
|
451
|
-
else if (element.leadTime.type.toLocaleLowerCase() === "years") {
|
|
452
|
-
time = Number(element.leadTime.value) * 24 * 365;
|
|
453
|
-
estmatedTime = Math.max(estmatedTime, time);
|
|
454
|
-
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
455
|
-
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `years ${estmatedTime} ${estimatedDays}`);
|
|
456
|
-
}
|
|
457
|
-
else {
|
|
458
|
-
time = Number(element.leadTime.value);
|
|
459
|
-
estmatedTime = Math.max(estmatedTime, time);
|
|
460
|
-
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
461
|
-
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `hours ${estmatedTime} ${estimatedDays}`);
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
if (estimatedDays.toLocaleLowerCase() === "days") {
|
|
465
|
-
estmatedTime = estmatedTime / 24;
|
|
466
|
-
}
|
|
467
|
-
else if (estimatedDays.toLocaleLowerCase() === "weeks") {
|
|
468
|
-
estmatedTime = estmatedTime / (24 * 7);
|
|
469
|
-
}
|
|
470
|
-
else if (estimatedDays.toLocaleLowerCase() === "months") {
|
|
471
|
-
estmatedTime = estmatedTime / (24 * 30);
|
|
472
|
-
}
|
|
473
|
-
else if (estimatedDays.toLocaleLowerCase() === "years") {
|
|
474
|
-
estmatedTime = estmatedTime / (24 * 365);
|
|
475
|
-
}
|
|
476
|
-
let estimate = {
|
|
477
|
-
value: estmatedTime.toString(),
|
|
478
|
-
type: estimatedDays
|
|
479
|
-
};
|
|
480
|
-
return estimate;
|
|
481
|
-
}
|
|
482
|
-
catch (error) {
|
|
483
|
-
AppLoggerService.logError(this.className, "calculateEstimatedTime", "error in calculateEstimatedTime", error);
|
|
484
|
-
}
|
|
485
|
-
return 0;
|
|
486
|
-
}
|
|
487
|
-
updateProductsWithDeliveryGroupNumber(oldGroup, newGroup) {
|
|
488
|
-
AppLoggerService.logDebug(this.className, "updateProductsWithDeliveryGroupNumber initiating");
|
|
489
|
-
this.currentBasket.products.forEach(cBProducts => {
|
|
490
|
-
if (cBProducts.deliveryGroup === oldGroup) {
|
|
491
|
-
cBProducts.deliveryGroup = newGroup;
|
|
492
|
-
}
|
|
493
|
-
});
|
|
494
|
-
this.updateBasket(this.currentBasket);
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
getDeliveryInfo() {
|
|
498
|
-
AppLoggerService.logDebug(this.className, "getDeliveryInfo", "getDeliveryGroupInfor initiating");
|
|
499
|
-
try {
|
|
500
|
-
let groupInfo = {
|
|
501
|
-
groups: []
|
|
502
|
-
};
|
|
503
|
-
this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((groupNumber) => {
|
|
504
|
-
let group = {
|
|
505
|
-
groupNumber: groupNumber,
|
|
506
|
-
items: [],
|
|
507
|
-
estimate: {
|
|
508
|
-
type: "Hours",
|
|
509
|
-
value: "0"
|
|
510
|
-
}
|
|
511
|
-
};
|
|
512
|
-
this.currentBasket.products.forEach(cBProducts => {
|
|
513
|
-
if (cBProducts.deliveryGroup === groupNumber.toString()) {
|
|
514
|
-
group.items.push(cBProducts);
|
|
515
|
-
}
|
|
516
|
-
});
|
|
517
|
-
group.estimate = this.calculateEstimatedTime(group.items);
|
|
518
|
-
groupInfo.groups.push(group);
|
|
519
|
-
});
|
|
520
|
-
return groupInfo;
|
|
521
|
-
}
|
|
522
|
-
catch (error) {
|
|
523
|
-
AppLoggerService.logError(this.className, "getDeliveryInfo", "error while getting delivery info", error);
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBwZXItbGlicmFyeS9zcmMvbGliL2Jhc2tldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFdEYsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBOUJ4RCxrQkFBYSxHQUFXO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLENBQUM7WUFDWixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO1FBRU0saUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUN0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDekQsWUFBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7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ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgREVMSVZFUllfTUVUSE9EUyB9IGZyb20gJy4vbWFwcGVyLWxpYnJhcnkubW9kZWwnO1xyXG5pbXBvcnQgeyBCYXNrZXQsIERlbGl2ZXJ5R3JvdXBJbmZvLCBEZWxpdmVyeUluZm8sIFByb2R1Y3QsIFRyYW5zYWN0aW9uUHJvbW90aW9uIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XHJcbmltcG9ydCB7IFRyYW5zYWN0aW9uRGlzY291bnQgfSBmcm9tICcuL21hcHBlci1saWJyYXJ5Lm1vZGVsJztcclxuaW1wb3J0IHsgTnVtYmVyVXRpbFNlcnZpY2UgfSBmcm9tICcuL251bWJlci11dGlsLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FwcExvZ2dlclNlcnZpY2V9IGZyb20gJ0BwbWNyZXRhaWwvY29tbW9uLXNlcnZpY2VzL2NvbW1vbi9hcHAtbG9nZ2VyLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2tldFNlcnZpY2Uge1xyXG4gIGN1cnJlbnRCYXNrZXQ6IEJhc2tldCA9IHtcclxuICAgIHByb2R1Y3RzOiBbXSxcclxuICAgIHRyYW5zYWN0aW9uRGlzY291bnQ6IFtdLFxyXG4gICAgcXVhbnRpdHk6IDAsXHJcbiAgICB0b3RhbDogMCxcclxuICAgIHNhbGVUb3RhbDogMCxcclxuICAgIGJhc2VDdXJyZW5jeTogJydcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGJhc2tldFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuICBiYXNrZXQgPSB0aGlzLmJhc2tldFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBwcm9kdWN0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG4gIHByb2R1Y3QgPSB0aGlzLnByb2R1Y3RTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgcGVlclNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHBlZXJTeW5jID0gdGhpcy5wZWVyU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIHNjYW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBzY2FubmVyID0gdGhpcy5zY2FuU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9pc01peGVkQmFza2V0U2FsZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGdldCBpc01peGVkQmFza2V0U2FsZXMoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl9pc01peGVkQmFza2V0U2FsZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgaXNNaXhlZEJhc2tldFNhbGVzKHY6IGFueSkge1xyXG4gICAgdGhpcy5faXNNaXhlZEJhc2tldFNhbGVzID0gdjtcclxuICB9XHJcbiAgY2xhc3NOYW1lID0gXCJCYXNrZXRTZXJ2aWNlXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlKSB7IH1cclxuXHJcbiAgdXBkYXRlQmFza2V0KGJhc2tldDogQmFza2V0KSB7XHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQgPSBiYXNrZXQ7XHJcbiAgICB0aGlzLmlzTWl4ZWRCYXNrZXRTYWxlcyA9IHRoaXMuZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIodHJ1ZSkubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuYmFza2V0U291cmNlLm5leHQoYmFza2V0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGJhc2tldCB2YWx1ZSBhbmQgcXVhbnRpdHlcclxuICAgKiBAcGFyYW0gIG51bGxcclxuICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICovXHJcbiAgdXBkYXRlQmFza2V0VG90YWwoYmFza2V0RGV0YWlsczogeyBxdWFudGl0eTogbnVtYmVyOyB0b3RhbDogbnVtYmVyOyBwcm9kdWN0czogYW55OyB0cmFuc2FjdGlvbklkOiBhbnk7IGJhc2tldFRvdGFsOiBhbnk7IH0sIGJhc2tldFN0YXRlOiB7IHVwZGF0ZUJhc2tldDogKGFyZzA6IGFueSkgPT4gdm9pZDsgfSkge1xyXG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XHJcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcclxuICAgIGZvciAoY29uc3QgcCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XHJcbiAgICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgPSBiYXNrZXREZXRhaWxzLnF1YW50aXR5ICsgcC5xdWFudGl0eTtcclxuICAgICAgYmFza2V0RGV0YWlscy50b3RhbCA9XHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChiYXNrZXREZXRhaWxzLnRvdGFsKSArXHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChwLnRvdGFsKTtcclxuICAgIH1cclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0VG90YWxcIixcclxuICAgICAgYGJhc2tldERldGFpbHMgdXBkYXRlZCB2YWx1ZXMgZm9yIHRyYW5zYWN0aW9uIGlkXHJcbiAgICAgICR7YmFza2V0RGV0YWlscy50cmFuc2FjdGlvbklkfSwgIGJhc2tldERldGFpbHNcclxuICAgICAgJHtKU09OLnN0cmluZ2lmeShiYXNrZXREZXRhaWxzKX1gXHJcbiAgICApO1xyXG4gICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9IGJhc2tldERldGFpbHMudG90YWw7XHJcbiAgICBiYXNrZXRTdGF0ZS51cGRhdGVCYXNrZXQoYmFza2V0RGV0YWlscyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBhZGQgTGluZSBwcm9tb3Rpb25cclxuICAgKiBAcGFyYW0gIG51bGxcclxuICAgKiBAcmV0dXJucyBiYXNrZXREZXRhaWxzXHJcbiAgICovXHJcbiAgYWRkbGluZVByb21vdGlvbihwcm9tb3Rpb25MaXN0OiB7IHJlc3VsdDogeyBsaW5lUHJvbW90aW9uczogc3RyaW5nIHwgYW55W107IH07IH0sIGJhc2tldERldGFpbHM6IHsgcHJvZHVjdHM6IGFueTsgfSkge1xyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJhZGRsaW5lUHJvbW90aW9uXCIsXHJcbiAgICAgIGBwcm9tb3Rpb25MaXN0ICR7SlNPTi5zdHJpbmdpZnkocHJvbW90aW9uTGlzdCl9IGFuZCBcclxuICAgICAgIGJhc2tldERldGFpbHNcclxuICAgICAgJHtKU09OLnN0cmluZ2lmeShiYXNrZXREZXRhaWxzKX0gZm9yIGxpbmVQcm9tb3Rpb25zYFxyXG4gICAgKTtcclxuICAgIGlmIChcclxuICAgICAgcHJvbW90aW9uTGlzdCAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdCAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucyAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgZm9yICh2YXIgZWxlbWVudCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcHJvbW90aW9uZWxlbWVudCBvZiBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucykge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSA9PT1cclxuICAgICAgICAgICAgcHJvbW90aW9uZWxlbWVudC5pdGVtTGluZUlkLnRvU3RyaW5nKClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmxpbmVQcm9tb3Rpb25zID0gcHJvbW90aW9uZWxlbWVudDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogYWRkIFRyYW5zYWN0aW9uIHByb21vdGlvblxyXG4gICAqIEBwYXJhbSAgbnVsbFxyXG4gICAqIEByZXR1cm5zIGJhc2tldERldGFpbHNcclxuICAgKi9cclxuXHJcbiAgYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb24ocHJvbW90aW9uTGlzdDogeyByZXN1bHQ6IHsgdHJhbnNhY3Rpb25Qcm9tb3Rpb246IGFueSB9OyB9LCBiYXNrZXRkZXRhaWxzOiBCYXNrZXQpIHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcclxuICAgICAgYHByb21vdGlvbkxpc3QgJHtKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KX0gYW5kIFxyXG4gICAgICAgYmFza2V0RGV0YWlsc1xyXG4gICAgICAke0pTT04uc3RyaW5naWZ5KGJhc2tldGRldGFpbHMpfSBmb3IgdHJhbnNhY3Rpb25Qcm9tb3Rpb25zICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbil9YFxyXG4gICAgKTtcclxuICAgIGlmIChcclxuICAgICAgcHJvbW90aW9uTGlzdCAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdCAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbiAmJlxyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQudHJhbnNhY3Rpb25Qcm9tb3Rpb24uZm9yRWFjaCgodFByb21vdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkOiBhbnkgPSBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAge30sXHJcbiAgICAgICAgICB0UHJvbW90aW9uXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb25FbnRyeVVwZGF0ZWQuaXRlbUxpbmVJZHMgPSBiYXNrZXRkZXRhaWxzLnByb2R1Y3RzLm1hcChcclxuICAgICAgICAgIChwcm9kdWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKCFiYXNrZXRkZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uKSB7XHJcbiAgICAgICAgICBiYXNrZXRkZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHVzaChcclxuICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgYmFza2V0ZGV0YWlscyA9IHRoaXMudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoXHJcbiAgICAgICAgICBiYXNrZXRkZXRhaWxzLFxyXG4gICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb25FbnRyeVVwZGF0ZWRcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcclxuICAgICAgXCJiYXNrZXQgZGV0YWlscyBpbiByZWZ1bmQgY2FsY3VsYXRpb24gZmlsZVwiLFxyXG4gICAgICBiYXNrZXRkZXRhaWxzXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGJhc2tldGRldGFpbHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0VG90YWxGb3JTdW1tYXJ5KGJhc2tldERldGFpbHM6IHsgdG90YWw6IHN0cmluZyB8IG51bWJlcjsgcXVhbnRpdHk6IHN0cmluZyB8IG51bWJlcjsgcHJvZHVjdHM6IGFueTsgfSkge1xyXG4gICAgLypzYWxlLSAgICAgICAgICAgIHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSA9IHVuZGVmaW5lZFxyXG4gICAgcGFydGlhbCByZWZ1bmQgLSAgIHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDBcclxuICAgIHRvdGFsIHJlZnVuZCAtICAgICBwcm91ZGN0IHJlZnVuZGVkUXVhbnRpdHkgaXMgPiAwXHJcbiAgICBleGNoYW5nZSAtICAgICAgICAgZXhjaGFuZ2UgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMCAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSA9IHVuZGVmaW5lZCAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgb2xkIHByb2R1Y3Qgd2l0aG91dCBleGNoYW5nZSByZWZ1bmRlZFF1YW50aXR5ID0gMFxyXG4gICAgdW5yZWZlcmVuY2UgcmVmdW5kLXByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDAgKi9cclxuXHJcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcclxuICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgPSAwO1xyXG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XHJcbiAgICAgIGlmIChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZVByb21vdGlvbnMucHJvbW90aW9uTGluZVByaWNlO1xyXG4gICAgICB9IGVsc2UgaWYgKHByb2R1Y3QubGluZURpc2NvdW50ICYmICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XHJcbiAgICAgIH1cclxuICAgICAgcHJvZHVjdC50b3RhbCA9XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCAtXHJcbiAgICAgICAgTWF0aC5hYnMocHJvZHVjdC5yZWZ1bmRlZFRvdGFsID8gcHJvZHVjdC5yZWZ1bmRlZFRvdGFsIDogMCk7XHJcblxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICs9IHByb2R1Y3QudG90YWw7XHJcbiAgICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgPVxyXG4gICAgICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgK1xyXG4gICAgICAgIChwcm9kdWN0LnF1YW50aXR5IC1cclxuICAgICAgICAgIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgPyBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgOiAwKSk7XHJcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdFRvdGFsRm9yU3VtbWFyeVwiLFxyXG4gICAgICAgIFwidXBkYXRlIGJhc2tldGRldGFpbHMgdG90YWwgOlwiICtcclxuICAgICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICtcclxuICAgICAgICBcIiBQcm9kdWN0IGxpbmUgSUQgOiBcIiArXHJcbiAgICAgICAgcHJvZHVjdC5pdGVtTGluZUlkICtcclxuICAgICAgICBcIiBwcm9kdWN0IHRvdGFsIDogXCIgK1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwsXHJcbiAgICAgICAgXCJxdWFudGl0eSAgOiBcIiArIGJhc2tldERldGFpbHMucXVhbnRpdHlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiBhbnkpIHtcclxuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBiYXNrZXREZXRhaWxzLnRvdGFsO1xyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dJbmZvKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeVwiLFxyXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uRGlzY291bnQgIFwiLFxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnRcclxuICAgICk7XHJcblxyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dJbmZvKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeVwiLFxyXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uUHJvbW90aW9uICBcIixcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvblxyXG4gICAgKTtcclxuXHJcbiAgICBiYXNrZXREZXRhaWxzID0gdGhpcy51cGRhdGVUcmFuc2FjdGlvblByb21vdGlvbihiYXNrZXREZXRhaWxzKTtcclxuICAgIGJhc2tldERldGFpbHMgPSB0aGlzLnVwZGF0ZVRyYW5zYWN0aW9uRGlzY291bnQoYmFza2V0RGV0YWlscyk7XHJcbiAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID0gTnVtYmVyKGJhc2tldERldGFpbHMuYmFza2V0VG90YWwudG9GaXhlZCgyKSk7XHJcblxyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dJbmZvKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeVwiLFxyXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWw6IGJhc2tldFRvdGFsIGFmdGVyIHByb21vdGlvbiBhcHBsaWVkICBmb3IgYmFza2V0VG90YWxcIixcclxuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbFxyXG4gICAgKTtcclxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVHJhbnNhY3Rpb25EaXNjb3VudChiYXNrZXREZXRhaWxzOiB7IHRyYW5zYWN0aW9uRGlzY291bnQ6IGFueVtdOyBiYXNrZXRUb3RhbDogbnVtYmVyOyB9KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudCAmJlxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQucmVkdWNlKFxyXG4gICAgICAgIChuOiBhbnksIHsgZGlzY291bnRBbW91bnQgfTogYW55KSA9PiBuICsgZGlzY291bnRBbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZVRyYW5zYWN0aW9uRGlzY291bnRcIiwgIFwiZGlzY291bnRUb3RhbCBcIiwgZGlzY291bnRUb3RhbCk7XHJcbiAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPVxyXG4gICAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgLSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVHJhbnNhY3Rpb25Qcm9tb3Rpb24oYmFza2V0RGV0YWlsczogeyB0cmFuc2FjdGlvblByb21vdGlvbjogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcclxuICAgIGlmIChcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbiAmJlxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5yZWR1Y2UoXHJcbiAgICAgICAgKG46IGFueSwgeyBwcm9tb3Rpb25BbW91bnQgfTogYW55KSA9PiBuICsgcHJvbW90aW9uQW1vdW50LFxyXG4gICAgICAgIDBcclxuICAgICAgKTtcclxuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9XHJcbiAgICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCAtIE1hdGguYWJzKGRpc2NvdW50VG90YWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVCYXNrZXRUb3RhbFdpdGhvdXREaXNjb3VudChiYXNrZXQ6IEJhc2tldCk6IEJhc2tldCB7XHJcbiAgICBiYXNrZXQudG90YWwgPSAwO1xyXG4gICAgYmFza2V0LnF1YW50aXR5ID0gMDtcclxuXHJcbiAgICBmb3IgKHZhciBwcm9kdWN0IG9mIGJhc2tldC5wcm9kdWN0cykge1xyXG4gICAgICBpZiAocHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcclxuICAgICAgfSBlbHNlIGlmIChwcm9kdWN0LmxpbmVEaXNjb3VudCAmJiAhcHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByb2R1Y3QudG90YWwgPVxyXG4gICAgICAgIHByb2R1Y3QudG90YWwgLVxyXG4gICAgICAgIE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IHByb2R1Y3QucmVmdW5kZWRUb3RhbCA6IDApO1xyXG4gICAgICBiYXNrZXQudG90YWwgKz0gcHJvZHVjdC50b3RhbDtcclxuICAgICAgYmFza2V0LnF1YW50aXR5ID1cclxuICAgICAgICBiYXNrZXQucXVhbnRpdHkgK1xyXG4gICAgICAgIChwcm9kdWN0LnF1YW50aXR5IC1cclxuICAgICAgICAgIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgPyBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgOiAwKSk7XHJcblxyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aG91dERpc2NvdW50XCIsXHJcbiAgICAgICAgXCJlLWJhc2tldDpiYXNrZXQgc2VydmljZTp1cGRhdGUgYmFza2V0ZGV0YWlscyB0b3RhbCA6XCIgK1xyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldCkgK1xyXG4gICAgICAgIGJhc2tldC50b3RhbCArXHJcbiAgICAgICAgXCIgUHJvZHVjdCBsaW5lIElEIDogXCIgK1xyXG4gICAgICAgIHByb2R1Y3QuaXRlbUxpbmVJZCArXHJcbiAgICAgICAgXCIgcHJvZHVjdCB0b3RhbCA6IFwiICtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYmFza2V0LmJhc2tldFRvdGFsID0gYmFza2V0LnRvdGFsO1xyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50cyhiYXNrZXQ6IGFueSk6IEJhc2tldCB7XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50c1wiLFxyXG4gICAgICBgdGhpcy5iYXNrZXREZXRhaWxzIG5ldyB2YWx1ZXMgICR7YmFza2V0fSwgXHJcbiAgICAgICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0LmJhc2tldFRvdGFsKX1gXHJcbiAgICApO1xyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IHByb21vdGlvbkFtb3VudCB9OiBhbnkpID0+IG4gKyBwcm9tb3Rpb25BbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSBkaXNjb3VudFRvdGFsO1xyXG4gICAgfVxyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IGRpc2NvdW50QW1vdW50IH06IGFueSkgPT4gbiArIGRpc2NvdW50QW1vdW50LFxyXG4gICAgICAgIDBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbCAtIGRpc2NvdW50VG90YWw7XHJcbiAgICB9XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50c1wiLFxyXG4gICAgICBcImJhc2tldCBuZXcgdmFsdWVzXCIsXHJcbiAgICAgIGJhc2tldFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gYmFza2V0O1xyXG4gIH1cclxuXHJcbiAgdHJhbnNhY3Rpb25EaXNjb3VudEFuZFByb21vdGlvblByb2R1Y3RvcnRpb25DYWxjdWxhdGlvbihiYXNrZXQ6IEJhc2tldCkge1xyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaChcclxuICAgICAgICAoZGlzY291bnQpID0+XHJcbiAgICAgICAgKGJhc2tldCA9IHRoaXMudHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcclxuICAgICAgICAgIGJhc2tldCxcclxuICAgICAgICAgIGRpc2NvdW50XHJcbiAgICAgICAgKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKChwcm9tb3Rpb24pID0+IHtcclxuICAgICAgICBiYXNrZXQgPSB0aGlzLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgcHJvbW90aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRBbmRQcm9tb3Rpb25Qcm9kdWN0b3J0aW9uQ2FsY3VsYXRpb25cIixcclxuICAgICAgYGJhc2tldCBpdGVtIGRpc2NvdW50IHByb3Rpb24gY2FsY3VsYXRpb24gLFxyXG4gICAgICAke2Jhc2tldH0sXHJcbiAgICAgICR7YmFza2V0LnByb2R1Y3RzfWBcclxuICAgICk7XHJcbiAgICByZXR1cm4gYmFza2V0O1xyXG4gIH1cclxuXHJcbiAgdHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoXHJcbiAgICBiYXNrZXQ6IGFueSxcclxuICAgIHByb21vdGlvbjogYW55XHJcbiAgKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xyXG4gICAge1xyXG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocDphbnkpID0+IHtcclxuICAgICAgICBpZiAocHJvbW90aW9uLml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcclxuICAgICAgICAgIHAgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwKTtcclxuICAgICAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cclxuICAgICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcclxuICAgICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXHJcbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uKTtcclxuICAgICAgICAgIHRvdGFsICs9IChwLnRvdGFsIC0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjXCIsXHJcbiAgICAgICAgYGViYXNrZXQ6IHRybnNhY3Rpb25Qcm9tb3Rpb246ICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBwcm9tb3Rpb25cclxuICAgICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxyXG4gICAgICApO1xyXG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG5cclxuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XHJcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbikgK1xyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXHJcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XHJcblxyXG4gICAgICAgIGlmIChwcm9tb3Rpb24uaXRlbUxpbmVJZHMuaW5jbHVkZXMocHJvZHVjdC5pdGVtTGluZUlkKSkge1xyXG4gICAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XHJcbiAgICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gKz1cclxuICAgICAgICAgICAgKHByb21vdGlvbi5wcm9tb3Rpb25BbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcclxuICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXQ7XHJcbiAgfVxyXG5cclxuICB0cmFuc2FjdGlvbkRpc2NvdW50UHJvZHVjdFBvcnRpb25DYWxjKFxyXG4gICAgYmFza2V0OiBhbnksXHJcbiAgICBkaXNjb3VudDogYW55XHJcbiAgKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xyXG5cclxuICAgIGJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcclxuICAgICAgICBwID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocCk7XHJcbiAgICAgICAgY29uc3QgcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwgPVxyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcclxuICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbikgLVxyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnJlZnVuZFBvcnRpb24pO1xyXG5cclxuXHJcbiAgICAgICAgdG90YWwgKz0gKHAudG90YWwgLSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRQcm9kdWN0UG9ydGlvbkNhbGNcIixcclxuICAgICAgYGViYXNrZXQ6IHRybnNhY3Rpb25EaXNjb3VudDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICBkaXNjb3VudFxyXG4gICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxyXG4gICAgKTtcclxuXHJcbiAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDphbnkpID0+IHtcclxuICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRQcm9kdWN0UG9ydGlvbkNhbGNcIiwgXCJkaXNjb3VudGFibGUgaW4gYmFza2V0IHNlcnZpY2VcIiwgcHJvZHVjdC5kaXNjb3VudGFibGUpO1xyXG5cclxuICAgICAgY29uc3QgcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwgPVxyXG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKSArXHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnJlZnVuZFBvcnRpb24pO1xyXG5cclxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHByb2R1Y3QuaXRlbUxpbmVJZCkgJiYgcHJvZHVjdC5kaXNjb3VudGFibGUgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHBlcmNlbnRhZ2UgPSAoKHByb2R1Y3QudG90YWwgLSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCkpIC8gdG90YWwpICogMTAwO1xyXG4gICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uICs9XHJcbiAgICAgICAgICAoZGlzY291bnQuZGlzY291bnRBbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcclxuICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBiYXNrZXQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIGlmICghcHJvZHVjdC5pdGVtRGlzY291bnRzKSB7XHJcbiAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cyA9IHtcclxuICAgICAgICB0cm5EaXNjb3VudHNQb3J0aW9uOiAwLFxyXG4gICAgICAgIHRyblByb21vdGlvbnNQb3J0aW9uOiAwLFxyXG4gICAgICAgIHJlZnVuZFBvcnRpb246IDAsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvZHVjdDtcclxuICB9XHJcblxyXG4gIG1hcmtQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIHRoaXMucHJvZHVjdFNvdXJjZS5uZXh0KHByb2R1Y3QpO1xyXG4gIH1cclxuICBzdG9wUGVlclN5bmNQcm9jZXNzKHBlZXJTeW5jOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnBlZXJTb3VyY2UubmV4dChwZWVyU3luYyk7XHJcbiAgfVxyXG5cclxuICBzY2FuU3RhcnQoaXNTY2FubmluZzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zY2FuU291cmNlLm5leHQoaXNTY2FubmluZyk7XHJcbiAgfVxyXG5cclxuICBwcm9tb3Rpb25SZW1haW5pbmdDYWxjdWxhdGlvbihwcm9tb3Rpb246IFRyYW5zYWN0aW9uUHJvbW90aW9uW10pIHtcclxuICAgIHZhciBwcm9tb3Rpb25WYWx1ZSA9IDA7XHJcbiAgICBwcm9tb3Rpb24uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBwcm9tb3Rpb25WYWx1ZSArPSBlbGVtZW50LnByb21vdGlvbkFtb3VudDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb21vdGlvblZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZGlzY291bnRSZW1haW5pbmdDYWxjdWxhdGlvbihkaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudFtdKSB7XHJcbiAgICB2YXIgZGlzY291bnRWYWx1ZSA9IDA7XHJcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIGRpc2NvdW50VmFsdWUgKz0gZWxlbWVudC5kaXNjb3VudEFtb3VudDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpc2NvdW50VmFsdWU7XHJcbiAgfVxyXG5cclxuICBkaXNjb3VudFJlZnVuZGVkQ2FsY3VsYXRpb24oZGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnRbXSkge1xyXG4gICAgdmFyIGRpc2NvdW50VmFsdWUgPSAwO1xyXG4gICAgZGlzY291bnQuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5kaXNjb3VudEFtb3VudCA8IDApIHtcclxuICAgICAgICBkaXNjb3VudFZhbHVlICs9IGVsZW1lbnQuZGlzY291bnRBbW91bnQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpc2NvdW50VmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZU5ld0l0ZW1MaW5lSWQocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xyXG4gICAgbGV0IGxhcmdlc3ROdW1iZXI6IGFueSA9IDA7XHJcblxyXG4gICAgaWYgKHByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGl0ZW1MaW5lSWRBcnJheSA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWQ7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbGFyZ2VzdE51bWJlciA9IGl0ZW1MaW5lSWRBcnJheS5yZWR1Y2UoKGEgOmFueSwgYjphbnkpID0+IE1hdGgubWF4KGEsIGIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGFyZ2VzdE51bWJlciArIDE7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHkoXHJcbiAgICBwcm9kdWN0OiBhbnksXHJcbiAgICBxdWFudGl0eTogbnVtYmVyXHJcbiAgKTogUHJvZHVjdCB7XHJcblxyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHlcIiwgYGViYXNrZXQ6IHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eSA6ICR7cXVhbnRpdHl9IHByb2R1Y3Q6ICR7SlNPTi5zdHJpbmdpZnkocHJvZHVjdCl9YCk7XHJcbiAgICBwcm9kdWN0LnF1YW50aXR5ID0gcXVhbnRpdHk7XHJcbiAgICBpZiAocHJvZHVjdC5oYXNPd25Qcm9wZXJ0eShcImxpbmVEaXNjb3VudFwiKSkge1xyXG4gICAgICAvLyAmJiB0aGlzLnByb2R1Y3QucXVhbnRpdHkgIT09IHRoaXMucHJvZHVjdERldGFpbEZvcm0uY29udHJvbHMucXVhbnRpdHkudmFsdWVcclxuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSA9IE51bWJlcihcclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLmdldEZsb29yZWRGaXhlZChcclxuICAgICAgICAgIHByb2R1Y3QubGluZURpc2NvdW50LnVuaXRQcmljZSAqIHF1YW50aXR5LFxyXG4gICAgICAgICAgMlxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRBbW91bnQgPVxyXG4gICAgICAgIHByb2R1Y3QudG90YWxMaW5lUHJpY2UgLSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHJvZHVjdC50b3RhbExpbmVQcmljZSA9XHJcbiAgICAgICAgcXVhbnRpdHkgKiB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsKHByb2R1Y3Quc2VsZWN0ZWRQcmljZSk7XHJcbiAgICB9XHJcbiAgICBpZiAocHJvZHVjdC5saW5lRGlzY291bnQpIHtcclxuICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcclxuICAgIH1cclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0UHJvZHVjdERhdGFBc1BlclF1YW50aXR5XCIsIGBlYmFza2V0OiB1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHkgOiAke3F1YW50aXR5fSBwcm9kdWN0OiAke0pTT04uc3RyaW5naWZ5KHByb2R1Y3QpfWApO1xyXG5cclxuICAgIHJldHVybiBwcm9kdWN0O1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIoaXNXZWJPcmRlcjogYm9vbGVhbik6IFByb2R1Y3RbXSB7XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aFdlYk9yZGVyXCIsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIgaGl0XCIsIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cyk7XHJcbiAgICBpZiAoaXNXZWJPcmRlcilcclxuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5maWx0ZXIoKHgpID0+IHguaXNXZWJPcmRlcik7XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5maWx0ZXIoKHgpID0+ICF4LmlzV2ViT3JkZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnkoKTogUHJvZHVjdFtdIHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlcIiwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhEZWxpdmVyeSBoaXRcIiwgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKTtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmRlbGl2ZXJ5TWV0aG9kID09PSBERUxJVkVSWV9NRVRIT0RTLkRFTElWRVJZLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cChncm91cDogc3RyaW5nLCBwcm9kdWN0czogUHJvZHVjdFtdKTogUHJvZHVjdFtdIHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cFwiLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5R3JvdXAgaGl0XCIsIHByb2R1Y3RzKTtcclxuICAgIHJldHVybiBwcm9kdWN0cy5maWx0ZXIoKHgpID0+IHguZGVsaXZlcnlHcm91cCA9PT0gZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVOZXdEZWxpdmVyeUdyb3VwTnVtYmVyKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcclxuICAgIGxldCBsYXJnZXN0TnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsYXJnZXN0TnVtYmVyID0gZGVsaXZlcnlHcm91cEFyci5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGxhcmdlc3ROdW1iZXIgKyAxKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xyXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJnZXREZWxpdmVyeUdyb3VwTnVtYmVyc1wiLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzIGluaXRpYXRpbmcgOiBcIixwcm9kdWN0cyk7XHJcblxyXG4gICAgbGV0IHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcm9kdWN0LmRlbGl2ZXJ5TWV0aG9kID09PSBcIjFcIikge1xyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdCA9IEFycmF5LmZyb20obmV3IFNldChkZWxpdmVyeUdyb3VwQXJyKSkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzXCIsIFwiZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMgOiB1bmlxdWVBbmRzb3J0ZWRSZXN1bHRcIiwgdW5pcXVlQW5kc29ydGVkUmVzdWx0KTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmlxdWVBbmRzb3J0ZWRSZXN1bHQ7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0c1dpdGhOZXdEZWxpdmVyeUdyb3VwTnVtYmVyKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdHNXaXRoTmV3RGVsaXZlcnlHcm91cE51bWJlclwiLCBcImluaXRpYXRpbmcgOiBcIiwgcHJvZHVjdHMpO1xyXG5cclxuICAgIGxldCBuZXdHcm91cE51bWJlciA9IHRoaXMuZ2VuZXJhdGVOZXdEZWxpdmVyeUdyb3VwTnVtYmVyKHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cyk7XHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZm9yRWFjaChjQlByb2R1Y3RzID0+IHtcclxuICAgICAgICBwcm9kdWN0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgaWYgKGNCUHJvZHVjdHMuaXRlbUxpbmVJZCA9PT0gZWxlbWVudC5pdGVtTGluZUlkKSB7XHJcbiAgICAgICAgICAgIGNCUHJvZHVjdHMuZGVsaXZlcnlHcm91cCA9IG5ld0dyb3VwTnVtYmVyO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlQmFza2V0KHRoaXMuY3VycmVudEJhc2tldCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lKHByb2R1Y3RzOiBhbnlbXSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHRpbWU7XHJcbiAgICAgIGxldCBlc3RtYXRlZFRpbWU6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBlc3RpbWF0ZWREYXlzOiBzdHJpbmcgPSBcIkhvdXJzXCI7XHJcbiAgICAgIHByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IHsgbGVhZFRpbWU6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55OyB9OyB9KSA9PiB7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ3ZWVrc1wiKSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiA3O1xyXG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcclxuICAgICAgICAgIGVzdGltYXRlZERheXMgPSAoZXN0bWF0ZWRUaW1lID09PSB0aW1lKSA/IGVsZW1lbnQubGVhZFRpbWUudHlwZSA6IGVzdGltYXRlZERheXNcclxuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgd2VlayAke2VzdG1hdGVkVGltZX0gJHtlc3RpbWF0ZWREYXlzfWApO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubGVhZFRpbWUudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcImRheXNcIikge1xyXG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0O1xyXG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcclxuICAgICAgICAgIGVzdGltYXRlZERheXMgPSAoZXN0bWF0ZWRUaW1lID09PSB0aW1lKSA/IGVsZW1lbnQubGVhZFRpbWUudHlwZSA6IGVzdGltYXRlZERheXNcclxuXHJcbiAgICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgYGRheXMgJHtlc3RtYXRlZFRpbWV9ICR7ZXN0aW1hdGVkRGF5c31gKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQubGVhZFRpbWUudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIm1vbnRoc1wiKSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiAzMDtcclxuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XHJcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzXHJcblxyXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGBtb250aHMgJHtlc3RtYXRlZFRpbWV9ICAke2VzdGltYXRlZERheXN9YCk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiAzNjU7XHJcbiAgICAgICAgICBlc3RtYXRlZFRpbWUgPSBNYXRoLm1heChlc3RtYXRlZFRpbWUsIHRpbWUpO1xyXG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xyXG5cclxuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgeWVhcnMgJHtlc3RtYXRlZFRpbWV9ICAke2VzdGltYXRlZERheXN9YCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpO1xyXG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcclxuICAgICAgICAgIGVzdGltYXRlZERheXMgPSAoZXN0bWF0ZWRUaW1lID09PSB0aW1lKSA/IGVsZW1lbnQubGVhZFRpbWUudHlwZSA6IGVzdGltYXRlZERheXM7XHJcbiAgICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgYGhvdXJzICAke2VzdG1hdGVkVGltZX0gICR7ZXN0aW1hdGVkRGF5c31gKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChlc3RpbWF0ZWREYXlzLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwiZGF5c1wiKSB7XHJcbiAgICAgICAgZXN0bWF0ZWRUaW1lID0gZXN0bWF0ZWRUaW1lIC8gMjQ7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiA3KTtcclxuICAgICAgfSBlbHNlIGlmIChlc3RpbWF0ZWREYXlzLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwibW9udGhzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcInllYXJzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzNjUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZXN0aW1hdGUgPSB7XHJcbiAgICAgICAgdmFsdWU6IGVzdG1hdGVkVGltZS50b1N0cmluZygpLFxyXG4gICAgICAgIHR5cGU6IGVzdGltYXRlZERheXNcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXN0aW1hdGU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0Vycm9yKHRoaXMuY2xhc3NOYW1lLCBcImNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgXCJlcnJvciBpbiBjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGVycm9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdHNXaXRoRGVsaXZlcnlHcm91cE51bWJlcihvbGRHcm91cDogc3RyaW5nLCBuZXdHcm91cDogc3RyaW5nKSB7XHJcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZVByb2R1Y3RzV2l0aERlbGl2ZXJ5R3JvdXBOdW1iZXIgaW5pdGlhdGluZ1wiKTtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZm9yRWFjaChjQlByb2R1Y3RzID0+IHtcclxuICAgICAgaWYgKGNCUHJvZHVjdHMuZGVsaXZlcnlHcm91cCA9PT0gb2xkR3JvdXApIHtcclxuICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cDtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudXBkYXRlQmFza2V0KHRoaXMuY3VycmVudEJhc2tldCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBnZXREZWxpdmVyeUluZm8oKTogYW55IHtcclxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZ2V0RGVsaXZlcnlJbmZvXCIsIFwiZ2V0RGVsaXZlcnlHcm91cEluZm9yIGluaXRpYXRpbmdcIik7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZ3JvdXBJbmZvOiBEZWxpdmVyeUluZm8gPSB7XHJcbiAgICAgICAgZ3JvdXBzOiBbXVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzKHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cykuZm9yRWFjaCgoZ3JvdXBOdW1iZXIpID0+IHtcclxuICAgICAgICBsZXQgZ3JvdXA6IGFueSA9IHtcclxuICAgICAgICAgIGdyb3VwTnVtYmVyOiBncm91cE51bWJlcixcclxuICAgICAgICAgIGl0ZW1zOiBbXSxcclxuICAgICAgICAgIGVzdGltYXRlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiSG91cnNcIixcclxuICAgICAgICAgICAgdmFsdWU6IFwiMFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKGNCUHJvZHVjdHMgPT4ge1xyXG4gICAgICAgICAgaWYgKGNCUHJvZHVjdHMuZGVsaXZlcnlHcm91cCA9PT0gZ3JvdXBOdW1iZXIudG9TdHJpbmcoKSkge1xyXG4gICAgICAgICAgICBncm91cC5pdGVtcy5wdXNoKGNCUHJvZHVjdHMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBncm91cC5lc3RpbWF0ZSA9IHRoaXMuY2FsY3VsYXRlRXN0aW1hdGVkVGltZShncm91cC5pdGVtcyk7XHJcblxyXG4gICAgICAgIGdyb3VwSW5mby5ncm91cHMucHVzaChncm91cCk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBncm91cEluZm87XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dFcnJvcih0aGlzLmNsYXNzTmFtZSwgXCJnZXREZWxpdmVyeUluZm9cIiwgXCJlcnJvciB3aGlsZSBnZXR0aW5nIGRlbGl2ZXJ5IGluZm9cIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
2
|
+
import { DELIVERY_METHODS } from './mapper-library.model';
|
|
3
|
+
import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
|
|
4
|
+
export class BasketService {
|
|
5
|
+
constructor(numberUtilService) {
|
|
6
|
+
this.numberUtilService = numberUtilService;
|
|
7
|
+
this.currentBasket = {
|
|
8
|
+
products: [],
|
|
9
|
+
transactionDiscount: [],
|
|
10
|
+
quantity: 0,
|
|
11
|
+
total: 0,
|
|
12
|
+
saleTotal: 0,
|
|
13
|
+
baseCurrency: ''
|
|
14
|
+
};
|
|
15
|
+
this.basketSource = new BehaviorSubject(null);
|
|
16
|
+
this.basket = this.basketSource.asObservable();
|
|
17
|
+
this.productSource = new BehaviorSubject(null);
|
|
18
|
+
this.product = this.productSource.asObservable();
|
|
19
|
+
this.peerSource = new BehaviorSubject(false);
|
|
20
|
+
this.peerSync = this.peerSource.asObservable();
|
|
21
|
+
this.scanSource = new BehaviorSubject(false);
|
|
22
|
+
this.scanner = this.scanSource.asObservable();
|
|
23
|
+
this.className = "BasketService";
|
|
24
|
+
}
|
|
25
|
+
get isMixedBasketSales() {
|
|
26
|
+
return this._isMixedBasketSales;
|
|
27
|
+
}
|
|
28
|
+
set isMixedBasketSales(v) {
|
|
29
|
+
this._isMixedBasketSales = v;
|
|
30
|
+
}
|
|
31
|
+
updateBasket(basket) {
|
|
32
|
+
this.currentBasket = basket;
|
|
33
|
+
this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;
|
|
34
|
+
this.basketSource.next(basket);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* calculates the total basket value and quantity
|
|
38
|
+
* @param null
|
|
39
|
+
* @returns void
|
|
40
|
+
*/
|
|
41
|
+
updateBasketTotal(basketDetails, basketState) {
|
|
42
|
+
basketDetails.quantity = 0;
|
|
43
|
+
basketDetails.total = 0;
|
|
44
|
+
for (const p of basketDetails.products) {
|
|
45
|
+
basketDetails.quantity = basketDetails.quantity + p.quantity;
|
|
46
|
+
basketDetails.total =
|
|
47
|
+
this.numberUtilService.trimTo2Decimal(basketDetails.total) +
|
|
48
|
+
this.numberUtilService.trimTo2Decimal(p.total);
|
|
49
|
+
}
|
|
50
|
+
AppLoggerService.logDebug(this.className, "updateBasketTotal", `basketDetails updated values for transaction id
|
|
51
|
+
${basketDetails.transactionId}, basketDetails
|
|
52
|
+
${JSON.stringify(basketDetails)}`);
|
|
53
|
+
basketDetails.basketTotal = basketDetails.total;
|
|
54
|
+
basketState.updateBasket(basketDetails);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* add Line promotion
|
|
58
|
+
* @param null
|
|
59
|
+
* @returns basketDetails
|
|
60
|
+
*/
|
|
61
|
+
addlinePromotion(promotionList, basketDetails) {
|
|
62
|
+
AppLoggerService.logDebug(this.className, "addlinePromotion", `promotionList ${JSON.stringify(promotionList)} and
|
|
63
|
+
basketDetails
|
|
64
|
+
${JSON.stringify(basketDetails)} for linePromotions`);
|
|
65
|
+
if (promotionList &&
|
|
66
|
+
promotionList.result &&
|
|
67
|
+
promotionList.result.linePromotions &&
|
|
68
|
+
promotionList.result.linePromotions.length > 0) {
|
|
69
|
+
for (var element of basketDetails.products) {
|
|
70
|
+
for (var promotionelement of promotionList.result.linePromotions) {
|
|
71
|
+
if (element.itemLineId.toString() ===
|
|
72
|
+
promotionelement.itemLineId.toString()) {
|
|
73
|
+
element.linePromotions = promotionelement;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return basketDetails;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* add Transaction promotion
|
|
82
|
+
* @param null
|
|
83
|
+
* @returns basketDetails
|
|
84
|
+
*/
|
|
85
|
+
addTransactionPromotion(promotionList, basketdetails) {
|
|
86
|
+
AppLoggerService.logDebug(this.className, "addTransactionPromotion", `promotionList ${JSON.stringify(promotionList)} and
|
|
87
|
+
basketDetails
|
|
88
|
+
${JSON.stringify(basketdetails)} for transactionPromotions ${JSON.stringify(basketdetails.transactionPromotion)}`);
|
|
89
|
+
if (promotionList &&
|
|
90
|
+
promotionList.result &&
|
|
91
|
+
promotionList.result.transactionPromotion &&
|
|
92
|
+
promotionList.result.transactionPromotion.length > 0) {
|
|
93
|
+
promotionList.result.transactionPromotion.forEach((tPromotion) => {
|
|
94
|
+
let transactionPromotionEntryUpdated = Object.assign({}, tPromotion);
|
|
95
|
+
transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map((product) => {
|
|
96
|
+
return product.itemLineId;
|
|
97
|
+
});
|
|
98
|
+
if (!basketdetails.transactionPromotion) {
|
|
99
|
+
basketdetails.transactionPromotion = [];
|
|
100
|
+
}
|
|
101
|
+
basketdetails.transactionPromotion.push(transactionPromotionEntryUpdated);
|
|
102
|
+
basketdetails = this.transactionPromotionProductPortionCalc(basketdetails, transactionPromotionEntryUpdated);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
AppLoggerService.logDebug(this.className, "addTransactionPromotion", "basket details in refund calculation file", basketdetails);
|
|
106
|
+
return basketdetails;
|
|
107
|
+
}
|
|
108
|
+
updateProductTotalForSummary(basketDetails) {
|
|
109
|
+
/*sale- product refundedQuantity = undefined
|
|
110
|
+
partial refund - product refundedQuantity is > 0
|
|
111
|
+
total refund - proudct refundedQuantity is > 0
|
|
112
|
+
exchange - exchange product refundedQuantity is > 0
|
|
113
|
+
new product refundedQuantity = undefined
|
|
114
|
+
old product without exchange refundedQuantity = 0
|
|
115
|
+
unreference refund-product refundedQuantity is > 0 */
|
|
116
|
+
basketDetails.total = 0;
|
|
117
|
+
basketDetails.quantity = 0;
|
|
118
|
+
for (var product of basketDetails.products) {
|
|
119
|
+
if (product.linePromotions) {
|
|
120
|
+
product.total = product.linePromotions.promotionLinePrice;
|
|
121
|
+
}
|
|
122
|
+
else if (product.lineDiscount && !product.linePromotions) {
|
|
123
|
+
product.total = product.lineDiscount.discountedLinePrice;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
product.total = product.totalLinePrice;
|
|
127
|
+
}
|
|
128
|
+
product.total =
|
|
129
|
+
product.total -
|
|
130
|
+
Math.abs(product.refundedTotal ? product.refundedTotal : 0);
|
|
131
|
+
basketDetails.total += product.total;
|
|
132
|
+
basketDetails.quantity =
|
|
133
|
+
basketDetails.quantity +
|
|
134
|
+
(product.quantity -
|
|
135
|
+
(product.refundedQuantity ? product.refundedQuantity : 0));
|
|
136
|
+
AppLoggerService.logDebug(this.className, "updateProductTotalForSummary", "update basketdetails total :" +
|
|
137
|
+
basketDetails.total +
|
|
138
|
+
" Product line ID : " +
|
|
139
|
+
product.itemLineId +
|
|
140
|
+
" product total : " +
|
|
141
|
+
product.total, "quantity : " + basketDetails.quantity);
|
|
142
|
+
}
|
|
143
|
+
return this.updateBasketTotalForSummary(basketDetails);
|
|
144
|
+
}
|
|
145
|
+
updateBasketTotalForSummary(basketDetails) {
|
|
146
|
+
basketDetails.basketTotal = basketDetails.total;
|
|
147
|
+
AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionDiscount ", basketDetails.transactionDiscount);
|
|
148
|
+
AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionPromotion ", basketDetails.transactionPromotion);
|
|
149
|
+
basketDetails = this.updateTransactionPromotion(basketDetails);
|
|
150
|
+
basketDetails = this.updateTransactionDiscount(basketDetails);
|
|
151
|
+
basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));
|
|
152
|
+
AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total: basketTotal after promotion applied for basketTotal", basketDetails.basketTotal);
|
|
153
|
+
return basketDetails;
|
|
154
|
+
}
|
|
155
|
+
updateTransactionDiscount(basketDetails) {
|
|
156
|
+
if (basketDetails.transactionDiscount &&
|
|
157
|
+
basketDetails.transactionDiscount.length > 0) {
|
|
158
|
+
const discountTotal = basketDetails.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
|
|
159
|
+
AppLoggerService.logDebug(this.className, "updateTransactionDiscount", "discountTotal ", discountTotal);
|
|
160
|
+
basketDetails.basketTotal =
|
|
161
|
+
basketDetails.basketTotal - Math.abs(discountTotal);
|
|
162
|
+
}
|
|
163
|
+
return basketDetails;
|
|
164
|
+
}
|
|
165
|
+
updateTransactionPromotion(basketDetails) {
|
|
166
|
+
if (basketDetails.transactionPromotion &&
|
|
167
|
+
basketDetails.transactionPromotion.length > 0) {
|
|
168
|
+
const discountTotal = basketDetails.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
|
|
169
|
+
basketDetails.basketTotal =
|
|
170
|
+
basketDetails.basketTotal - Math.abs(discountTotal);
|
|
171
|
+
}
|
|
172
|
+
return basketDetails;
|
|
173
|
+
}
|
|
174
|
+
updateBasketTotalWithoutDiscount(basket) {
|
|
175
|
+
basket.total = 0;
|
|
176
|
+
basket.quantity = 0;
|
|
177
|
+
for (var product of basket.products) {
|
|
178
|
+
if (product.linePromotions) {
|
|
179
|
+
product.total = product.linePromotions.promotionLinePrice;
|
|
180
|
+
}
|
|
181
|
+
else if (product.lineDiscount && !product.linePromotions) {
|
|
182
|
+
product.total = product.lineDiscount.discountedLinePrice || 0;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
product.total = product.totalLinePrice;
|
|
186
|
+
}
|
|
187
|
+
product.total =
|
|
188
|
+
product.total -
|
|
189
|
+
Math.abs(product.refundedTotal ? product.refundedTotal : 0);
|
|
190
|
+
basket.total += product.total;
|
|
191
|
+
basket.quantity =
|
|
192
|
+
basket.quantity +
|
|
193
|
+
(product.quantity -
|
|
194
|
+
(product.refundedQuantity ? product.refundedQuantity : 0));
|
|
195
|
+
AppLoggerService.logDebug(this.className, "updateBasketTotalWithoutDiscount", "e-basket:basket service:update basketdetails total :" +
|
|
196
|
+
JSON.stringify(basket) +
|
|
197
|
+
basket.total +
|
|
198
|
+
" Product line ID : " +
|
|
199
|
+
product.itemLineId +
|
|
200
|
+
" product total : " +
|
|
201
|
+
product.total);
|
|
202
|
+
}
|
|
203
|
+
basket.basketTotal = basket.total;
|
|
204
|
+
return basket;
|
|
205
|
+
}
|
|
206
|
+
updateBasketTotalWithDiscounts(basket) {
|
|
207
|
+
AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", `this.basketDetails new values ${basket},
|
|
208
|
+
${JSON.stringify(basket.basketTotal)}`);
|
|
209
|
+
if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
|
|
210
|
+
const discountTotal = basket.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
|
|
211
|
+
basket.basketTotal = basket.basketTotal - discountTotal;
|
|
212
|
+
}
|
|
213
|
+
if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
|
|
214
|
+
const discountTotal = basket.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
|
|
215
|
+
basket.basketTotal = basket.basketTotal - discountTotal;
|
|
216
|
+
}
|
|
217
|
+
AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", "basket new values", basket);
|
|
218
|
+
return basket;
|
|
219
|
+
}
|
|
220
|
+
transactionDiscountAndPromotionProductortionCalculation(basket) {
|
|
221
|
+
if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
|
|
222
|
+
basket.transactionDiscount.forEach((discount) => (basket = this.transactionDiscountProductPortionCalc(basket, discount)));
|
|
223
|
+
}
|
|
224
|
+
if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
|
|
225
|
+
basket.transactionPromotion.forEach((promotion) => {
|
|
226
|
+
basket = this.transactionPromotionProductPortionCalc(basket, promotion);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
AppLoggerService.logDebug(this.className, "transactionDiscountAndPromotionProductortionCalculation", `basket item discount protion calculation ,
|
|
230
|
+
${basket},
|
|
231
|
+
${basket.products}`);
|
|
232
|
+
return basket;
|
|
233
|
+
}
|
|
234
|
+
transactionPromotionProductPortionCalc(basket, promotion) {
|
|
235
|
+
let total = 0;
|
|
236
|
+
let percentage = 0;
|
|
237
|
+
{
|
|
238
|
+
basket.products.forEach((p) => {
|
|
239
|
+
if (promotion.itemLineIds.includes(p.itemLineId)) {
|
|
240
|
+
p = this.validateProductItemDiscount(p);
|
|
241
|
+
const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
|
|
242
|
+
this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
|
|
243
|
+
this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
|
|
244
|
+
total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
AppLoggerService.logDebug(this.className, "transactionPromotionProductPortionCalc", `ebasket: trnsactionPromotion: ${JSON.stringify(promotion)}, selected products total: ${total}`);
|
|
248
|
+
basket.products.forEach((product) => {
|
|
249
|
+
product = this.validateProductItemDiscount(product);
|
|
250
|
+
const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
|
|
251
|
+
this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
|
|
252
|
+
this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
|
|
253
|
+
if (promotion.itemLineIds.includes(product.itemLineId)) {
|
|
254
|
+
percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
|
|
255
|
+
product.itemDiscounts.trnPromotionsPortion +=
|
|
256
|
+
(promotion.promotionAmount * percentage) / 100;
|
|
257
|
+
product.itemDiscounts.trnPromotionsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return basket;
|
|
262
|
+
}
|
|
263
|
+
transactionDiscountProductPortionCalc(basket, discount) {
|
|
264
|
+
let total = 0;
|
|
265
|
+
let percentage = 0;
|
|
266
|
+
basket.products.forEach((p) => {
|
|
267
|
+
if (discount.itemLineIds.includes(p.itemLineId)) {
|
|
268
|
+
p = this.validateProductItemDiscount(p);
|
|
269
|
+
const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
|
|
270
|
+
this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
|
|
271
|
+
this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
|
|
272
|
+
total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", `ebasket: trnsactionDiscount: ${JSON.stringify(discount)}, selected products total: ${total}`);
|
|
276
|
+
basket.products.forEach((product) => {
|
|
277
|
+
product = this.validateProductItemDiscount(product);
|
|
278
|
+
AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", "discountable in basket service", product.discountable);
|
|
279
|
+
const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
|
|
280
|
+
this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
|
|
281
|
+
this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
|
|
282
|
+
if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {
|
|
283
|
+
percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
|
|
284
|
+
product.itemDiscounts.trnDiscountsPortion +=
|
|
285
|
+
(discount.discountAmount * percentage) / 100;
|
|
286
|
+
product.itemDiscounts.trnDiscountsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion);
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
return basket;
|
|
290
|
+
}
|
|
291
|
+
validateProductItemDiscount(product) {
|
|
292
|
+
if (!product.itemDiscounts) {
|
|
293
|
+
product.itemDiscounts = {
|
|
294
|
+
trnDiscountsPortion: 0,
|
|
295
|
+
trnPromotionsPortion: 0,
|
|
296
|
+
refundPortion: 0,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
return product;
|
|
300
|
+
}
|
|
301
|
+
markProduct(product) {
|
|
302
|
+
this.productSource.next(product);
|
|
303
|
+
}
|
|
304
|
+
stopPeerSyncProcess(peerSync) {
|
|
305
|
+
this.peerSource.next(peerSync);
|
|
306
|
+
}
|
|
307
|
+
scanStart(isScanning) {
|
|
308
|
+
this.scanSource.next(isScanning);
|
|
309
|
+
}
|
|
310
|
+
promotionRemainingCalculation(promotion) {
|
|
311
|
+
var promotionValue = 0;
|
|
312
|
+
promotion.forEach((element) => {
|
|
313
|
+
promotionValue += element.promotionAmount;
|
|
314
|
+
});
|
|
315
|
+
return promotionValue;
|
|
316
|
+
}
|
|
317
|
+
discountRemainingCalculation(discount) {
|
|
318
|
+
var discountValue = 0;
|
|
319
|
+
discount.forEach((element) => {
|
|
320
|
+
discountValue += element.discountAmount;
|
|
321
|
+
});
|
|
322
|
+
return discountValue;
|
|
323
|
+
}
|
|
324
|
+
discountRefundedCalculation(discount) {
|
|
325
|
+
var discountValue = 0;
|
|
326
|
+
discount.forEach((element) => {
|
|
327
|
+
if (element.discountAmount < 0) {
|
|
328
|
+
discountValue += element.discountAmount;
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
return discountValue;
|
|
332
|
+
}
|
|
333
|
+
generateNewItemLineId(products) {
|
|
334
|
+
let largestNumber = 0;
|
|
335
|
+
if (products.length > 0) {
|
|
336
|
+
let itemLineIdArray = products.map((product) => {
|
|
337
|
+
return product.itemLineId;
|
|
338
|
+
});
|
|
339
|
+
largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
|
|
340
|
+
}
|
|
341
|
+
return largestNumber + 1;
|
|
342
|
+
}
|
|
343
|
+
updateBasketProductDataAsPerQuantity(product, quantity) {
|
|
344
|
+
AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
|
|
345
|
+
product.quantity = quantity;
|
|
346
|
+
if (product.hasOwnProperty("lineDiscount")) {
|
|
347
|
+
// && this.product.quantity !== this.productDetailForm.controls.quantity.value
|
|
348
|
+
product.lineDiscount.discountedLinePrice = Number(this.numberUtilService.getFlooredFixed(product.lineDiscount.unitPrice * quantity, 2));
|
|
349
|
+
product.lineDiscount.discountAmount =
|
|
350
|
+
product.totalLinePrice - product.lineDiscount.discountedLinePrice;
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
product.totalLinePrice =
|
|
354
|
+
quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);
|
|
355
|
+
}
|
|
356
|
+
if (product.lineDiscount) {
|
|
357
|
+
product.total = product.lineDiscount.discountedLinePrice;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
product.total = product.totalLinePrice;
|
|
361
|
+
}
|
|
362
|
+
AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
|
|
363
|
+
return product;
|
|
364
|
+
}
|
|
365
|
+
filterProductListWithWebOrder(isWebOrder) {
|
|
366
|
+
AppLoggerService.logDebug(this.className, "filterProductListWithWebOrder", "filterProductListWithWebOrder hit", this.currentBasket.products);
|
|
367
|
+
if (isWebOrder)
|
|
368
|
+
return this.currentBasket.products.filter((x) => x.isWebOrder);
|
|
369
|
+
else {
|
|
370
|
+
return this.currentBasket.products.filter((x) => !x.isWebOrder);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
filterProductListWithDelivery() {
|
|
374
|
+
AppLoggerService.logDebug(this.className, "filterProductListWithDelivery", "filterProductListWithDelivery hit", this.currentBasket.products);
|
|
375
|
+
return this.currentBasket.products.filter((x) => x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString());
|
|
376
|
+
}
|
|
377
|
+
filterProductListWithDeliveryGroup(group, products) {
|
|
378
|
+
AppLoggerService.logDebug(this.className, "filterProductListWithDeliveryGroup", "filterProductListWithDeliveryGroup hit", products);
|
|
379
|
+
return products.filter((x) => x.deliveryGroup === group);
|
|
380
|
+
}
|
|
381
|
+
generateNewDeliveryGroupNumber(products) {
|
|
382
|
+
let largestNumber = 0;
|
|
383
|
+
if (products.length > 0) {
|
|
384
|
+
let deliveryGroupArr = products.map((product) => {
|
|
385
|
+
if (product.deliveryGroup) {
|
|
386
|
+
return parseInt(product.deliveryGroup);
|
|
387
|
+
}
|
|
388
|
+
return 0;
|
|
389
|
+
});
|
|
390
|
+
largestNumber = deliveryGroupArr.reduce((a, b) => Math.max(a, b));
|
|
391
|
+
}
|
|
392
|
+
return (largestNumber + 1).toString();
|
|
393
|
+
}
|
|
394
|
+
getDeliveryGroupNumbers(products) {
|
|
395
|
+
AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers initiating : ", products);
|
|
396
|
+
let uniqueAndsortedResult = [];
|
|
397
|
+
if (products.length > 0) {
|
|
398
|
+
let deliveryGroupArr = products.map((product) => {
|
|
399
|
+
if (product.deliveryGroup) {
|
|
400
|
+
return parseInt(product.deliveryGroup);
|
|
401
|
+
}
|
|
402
|
+
else if (product.deliveryMethod === "1") {
|
|
403
|
+
return 1;
|
|
404
|
+
}
|
|
405
|
+
return 0;
|
|
406
|
+
});
|
|
407
|
+
uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((a, b) => a - b);
|
|
408
|
+
AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers : uniqueAndsortedResult", uniqueAndsortedResult);
|
|
409
|
+
}
|
|
410
|
+
return uniqueAndsortedResult;
|
|
411
|
+
}
|
|
412
|
+
updateProductsWithNewDeliveryGroupNumber(products) {
|
|
413
|
+
AppLoggerService.logDebug(this.className, "updateProductsWithNewDeliveryGroupNumber", "initiating : ", products);
|
|
414
|
+
let newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);
|
|
415
|
+
if (products.length > 0) {
|
|
416
|
+
this.currentBasket.products.forEach(cBProducts => {
|
|
417
|
+
products.forEach(element => {
|
|
418
|
+
if (cBProducts.itemLineId === element.itemLineId) {
|
|
419
|
+
cBProducts.deliveryGroup = newGroupNumber;
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
this.updateBasket(this.currentBasket);
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
calculateEstimatedTime(products) {
|
|
428
|
+
try {
|
|
429
|
+
let time;
|
|
430
|
+
let estmatedTime = 0;
|
|
431
|
+
let estimatedDays = "Hours";
|
|
432
|
+
products.forEach((element) => {
|
|
433
|
+
if (element.leadTime.type.toLocaleLowerCase() === "weeks") {
|
|
434
|
+
time = Number(element.leadTime.value) * 24 * 7;
|
|
435
|
+
estmatedTime = Math.max(estmatedTime, time);
|
|
436
|
+
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
437
|
+
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `week ${estmatedTime} ${estimatedDays}`);
|
|
438
|
+
}
|
|
439
|
+
else if (element.leadTime.type.toLocaleLowerCase() === "days") {
|
|
440
|
+
time = Number(element.leadTime.value) * 24;
|
|
441
|
+
estmatedTime = Math.max(estmatedTime, time);
|
|
442
|
+
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
443
|
+
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `days ${estmatedTime} ${estimatedDays}`);
|
|
444
|
+
}
|
|
445
|
+
else if (element.leadTime.type.toLocaleLowerCase() === "months") {
|
|
446
|
+
time = Number(element.leadTime.value) * 24 * 30;
|
|
447
|
+
estmatedTime = Math.max(estmatedTime, time);
|
|
448
|
+
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
449
|
+
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `months ${estmatedTime} ${estimatedDays}`);
|
|
450
|
+
}
|
|
451
|
+
else if (element.leadTime.type.toLocaleLowerCase() === "years") {
|
|
452
|
+
time = Number(element.leadTime.value) * 24 * 365;
|
|
453
|
+
estmatedTime = Math.max(estmatedTime, time);
|
|
454
|
+
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
455
|
+
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `years ${estmatedTime} ${estimatedDays}`);
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
time = Number(element.leadTime.value);
|
|
459
|
+
estmatedTime = Math.max(estmatedTime, time);
|
|
460
|
+
estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
|
|
461
|
+
AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `hours ${estmatedTime} ${estimatedDays}`);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
if (estimatedDays.toLocaleLowerCase() === "days") {
|
|
465
|
+
estmatedTime = estmatedTime / 24;
|
|
466
|
+
}
|
|
467
|
+
else if (estimatedDays.toLocaleLowerCase() === "weeks") {
|
|
468
|
+
estmatedTime = estmatedTime / (24 * 7);
|
|
469
|
+
}
|
|
470
|
+
else if (estimatedDays.toLocaleLowerCase() === "months") {
|
|
471
|
+
estmatedTime = estmatedTime / (24 * 30);
|
|
472
|
+
}
|
|
473
|
+
else if (estimatedDays.toLocaleLowerCase() === "years") {
|
|
474
|
+
estmatedTime = estmatedTime / (24 * 365);
|
|
475
|
+
}
|
|
476
|
+
let estimate = {
|
|
477
|
+
value: estmatedTime.toString(),
|
|
478
|
+
type: estimatedDays
|
|
479
|
+
};
|
|
480
|
+
return estimate;
|
|
481
|
+
}
|
|
482
|
+
catch (error) {
|
|
483
|
+
AppLoggerService.logError(this.className, "calculateEstimatedTime", "error in calculateEstimatedTime", error);
|
|
484
|
+
}
|
|
485
|
+
return 0;
|
|
486
|
+
}
|
|
487
|
+
updateProductsWithDeliveryGroupNumber(oldGroup, newGroup) {
|
|
488
|
+
AppLoggerService.logDebug(this.className, "updateProductsWithDeliveryGroupNumber initiating");
|
|
489
|
+
this.currentBasket.products.forEach(cBProducts => {
|
|
490
|
+
if (cBProducts.deliveryGroup === oldGroup) {
|
|
491
|
+
cBProducts.deliveryGroup = newGroup;
|
|
492
|
+
}
|
|
493
|
+
});
|
|
494
|
+
this.updateBasket(this.currentBasket);
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
getDeliveryInfo() {
|
|
498
|
+
AppLoggerService.logDebug(this.className, "getDeliveryInfo", "getDeliveryGroupInfor initiating");
|
|
499
|
+
try {
|
|
500
|
+
let groupInfo = {
|
|
501
|
+
groups: []
|
|
502
|
+
};
|
|
503
|
+
this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((groupNumber) => {
|
|
504
|
+
let group = {
|
|
505
|
+
groupNumber: groupNumber,
|
|
506
|
+
items: [],
|
|
507
|
+
estimate: {
|
|
508
|
+
type: "Hours",
|
|
509
|
+
value: "0"
|
|
510
|
+
}
|
|
511
|
+
};
|
|
512
|
+
this.currentBasket.products.forEach(cBProducts => {
|
|
513
|
+
if (cBProducts.deliveryGroup === groupNumber.toString()) {
|
|
514
|
+
group.items.push(cBProducts);
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
group.estimate = this.calculateEstimatedTime(group.items);
|
|
518
|
+
groupInfo.groups.push(group);
|
|
519
|
+
});
|
|
520
|
+
return groupInfo;
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
AppLoggerService.logError(this.className, "getDeliveryInfo", "error while getting delivery info", error);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBwZXItbGlicmFyeS9zcmMvbGliL2Jhc2tldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFdEYsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBOUJ4RCxrQkFBYSxHQUFXO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLENBQUM7WUFDWixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO1FBRU0saUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUN0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDekQsWUFBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7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ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBERUxJVkVSWV9NRVRIT0RTIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBCYXNrZXQsIERlbGl2ZXJ5R3JvdXBJbmZvLCBEZWxpdmVyeUluZm8sIFByb2R1Y3QsIFRyYW5zYWN0aW9uUHJvbW90aW9uIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkRpc2NvdW50IH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gJy4vbnVtYmVyLXV0aWwuc2VydmljZSc7XG5pbXBvcnQge0FwcExvZ2dlclNlcnZpY2V9IGZyb20gJ0BwbWNyZXRhaWwvY29tbW9uLXNlcnZpY2VzL2NvbW1vbi9hcHAtbG9nZ2VyLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgQmFza2V0U2VydmljZSB7XG4gIGN1cnJlbnRCYXNrZXQ6IEJhc2tldCA9IHtcbiAgICBwcm9kdWN0czogW10sXG4gICAgdHJhbnNhY3Rpb25EaXNjb3VudDogW10sXG4gICAgcXVhbnRpdHk6IDAsXG4gICAgdG90YWw6IDAsXG4gICAgc2FsZVRvdGFsOiAwLFxuICAgIGJhc2VDdXJyZW5jeTogJydcbiAgfTtcblxuICBwcml2YXRlIGJhc2tldFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgYmFza2V0ID0gdGhpcy5iYXNrZXRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBwcm9kdWN0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICBwcm9kdWN0ID0gdGhpcy5wcm9kdWN0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgcGVlclNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwZWVyU3luYyA9IHRoaXMucGVlclNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHNjYW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgc2Nhbm5lciA9IHRoaXMuc2NhblNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIF9pc01peGVkQmFza2V0U2FsZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnZXQgaXNNaXhlZEJhc2tldFNhbGVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTWl4ZWRCYXNrZXRTYWxlcztcbiAgfVxuICBwdWJsaWMgc2V0IGlzTWl4ZWRCYXNrZXRTYWxlcyh2OiBhbnkpIHtcbiAgICB0aGlzLl9pc01peGVkQmFza2V0U2FsZXMgPSB2O1xuICB9XG4gIGNsYXNzTmFtZSA9IFwiQmFza2V0U2VydmljZVwiO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlKSB7IH1cblxuICB1cGRhdGVCYXNrZXQoYmFza2V0OiBCYXNrZXQpIHtcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQgPSBiYXNrZXQ7XG4gICAgdGhpcy5pc01peGVkQmFza2V0U2FsZXMgPSB0aGlzLmZpbHRlclByb2R1Y3RMaXN0V2l0aFdlYk9yZGVyKHRydWUpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5iYXNrZXRTb3VyY2UubmV4dChiYXNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGJhc2tldCB2YWx1ZSBhbmQgcXVhbnRpdHlcbiAgICogQHBhcmFtICBudWxsXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHVwZGF0ZUJhc2tldFRvdGFsKGJhc2tldERldGFpbHM6IHsgcXVhbnRpdHk6IG51bWJlcjsgdG90YWw6IG51bWJlcjsgcHJvZHVjdHM6IGFueTsgdHJhbnNhY3Rpb25JZDogYW55OyBiYXNrZXRUb3RhbDogYW55OyB9LCBiYXNrZXRTdGF0ZTogeyB1cGRhdGVCYXNrZXQ6IChhcmcwOiBhbnkpID0+IHZvaWQ7IH0pIHtcbiAgICBiYXNrZXREZXRhaWxzLnF1YW50aXR5ID0gMDtcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYmFza2V0RGV0YWlscy5wcm9kdWN0cykge1xuICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IGJhc2tldERldGFpbHMucXVhbnRpdHkgKyBwLnF1YW50aXR5O1xuICAgICAgYmFza2V0RGV0YWlscy50b3RhbCA9XG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwoYmFza2V0RGV0YWlscy50b3RhbCkgK1xuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsKHAudG90YWwpO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsXCIsXG4gICAgICBgYmFza2V0RGV0YWlscyB1cGRhdGVkIHZhbHVlcyBmb3IgdHJhbnNhY3Rpb24gaWRcbiAgICAgICR7YmFza2V0RGV0YWlscy50cmFuc2FjdGlvbklkfSwgIGJhc2tldERldGFpbHNcbiAgICAgICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscyl9YFxuICAgICk7XG4gICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9IGJhc2tldERldGFpbHMudG90YWw7XG4gICAgYmFza2V0U3RhdGUudXBkYXRlQmFza2V0KGJhc2tldERldGFpbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBMaW5lIHByb21vdGlvblxuICAgKiBAcGFyYW0gIG51bGxcbiAgICogQHJldHVybnMgYmFza2V0RGV0YWlsc1xuICAgKi9cbiAgYWRkbGluZVByb21vdGlvbihwcm9tb3Rpb25MaXN0OiB7IHJlc3VsdDogeyBsaW5lUHJvbW90aW9uczogc3RyaW5nIHwgYW55W107IH07IH0sIGJhc2tldERldGFpbHM6IHsgcHJvZHVjdHM6IGFueTsgfSkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkbGluZVByb21vdGlvblwiLFxuICAgICAgYHByb21vdGlvbkxpc3QgJHtKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KX0gYW5kIFxuICAgICAgIGJhc2tldERldGFpbHNcbiAgICAgICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscyl9IGZvciBsaW5lUHJvbW90aW9uc2BcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHByb21vdGlvbkxpc3QgJiZcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0ICYmXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucyAmJlxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgZm9yICh2YXIgZWxlbWVudCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XG4gICAgICAgIGZvciAodmFyIHByb21vdGlvbmVsZW1lbnQgb2YgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSA9PT1cbiAgICAgICAgICAgIHByb21vdGlvbmVsZW1lbnQuaXRlbUxpbmVJZC50b1N0cmluZygpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlbGVtZW50LmxpbmVQcm9tb3Rpb25zID0gcHJvbW90aW9uZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICAvKipcbiAgICogYWRkIFRyYW5zYWN0aW9uIHByb21vdGlvblxuICAgKiBAcGFyYW0gIG51bGxcbiAgICogQHJldHVybnMgYmFza2V0RGV0YWlsc1xuICAgKi9cblxuICBhZGRUcmFuc2FjdGlvblByb21vdGlvbihwcm9tb3Rpb25MaXN0OiB7IHJlc3VsdDogeyB0cmFuc2FjdGlvblByb21vdGlvbjogYW55IH07IH0sIGJhc2tldGRldGFpbHM6IEJhc2tldCkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcbiAgICAgIGBwcm9tb3Rpb25MaXN0ICR7SlNPTi5zdHJpbmdpZnkocHJvbW90aW9uTGlzdCl9IGFuZCBcbiAgICAgICBiYXNrZXREZXRhaWxzXG4gICAgICAke0pTT04uc3RyaW5naWZ5KGJhc2tldGRldGFpbHMpfSBmb3IgdHJhbnNhY3Rpb25Qcm9tb3Rpb25zICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbil9YFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcHJvbW90aW9uTGlzdCAmJlxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQgJiZcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0UHJvbW90aW9uOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkOiBhbnkgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIHRQcm9tb3Rpb25cbiAgICAgICAgKTtcblxuICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZC5pdGVtTGluZUlkcyA9IGJhc2tldGRldGFpbHMucHJvZHVjdHMubWFwKFxuICAgICAgICAgIChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvZHVjdC5pdGVtTGluZUlkO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pIHtcbiAgICAgICAgICBiYXNrZXRkZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5wdXNoKFxuICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkXG4gICAgICAgICk7XG5cbiAgICAgICAgYmFza2V0ZGV0YWlscyA9IHRoaXMudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoXG4gICAgICAgICAgYmFza2V0ZGV0YWlscyxcbiAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcbiAgICAgIFwiYmFza2V0IGRldGFpbHMgaW4gcmVmdW5kIGNhbGN1bGF0aW9uIGZpbGVcIixcbiAgICAgIGJhc2tldGRldGFpbHNcbiAgICApO1xuICAgIHJldHVybiBiYXNrZXRkZXRhaWxzO1xuICB9XG5cbiAgdXBkYXRlUHJvZHVjdFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiB7IHRvdGFsOiBzdHJpbmcgfCBudW1iZXI7IHF1YW50aXR5OiBzdHJpbmcgfCBudW1iZXI7IHByb2R1Y3RzOiBhbnk7IH0pIHtcbiAgICAvKnNhbGUtICAgICAgICAgICAgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5ID0gdW5kZWZpbmVkXG4gICAgcGFydGlhbCByZWZ1bmQgLSAgIHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDBcbiAgICB0b3RhbCByZWZ1bmQgLSAgICAgcHJvdWRjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMFxuICAgIGV4Y2hhbmdlIC0gICAgICAgICBleGNoYW5nZSBwcm9kdWN0IHJlZnVuZGVkUXVhbnRpdHkgaXMgPiAwICBcbiAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSA9IHVuZGVmaW5lZCAgXG4gICAgICAgICAgICAgICAgICAgICAgIG9sZCBwcm9kdWN0IHdpdGhvdXQgZXhjaGFuZ2UgcmVmdW5kZWRRdWFudGl0eSA9IDBcbiAgICB1bnJlZmVyZW5jZSByZWZ1bmQtcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMCAqL1xuXG4gICAgYmFza2V0RGV0YWlscy50b3RhbCA9IDA7XG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XG4gICAgICBpZiAocHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XG4gICAgICB9IGVsc2UgaWYgKHByb2R1Y3QubGluZURpc2NvdW50ICYmICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XG4gICAgICB9XG4gICAgICBwcm9kdWN0LnRvdGFsID1cbiAgICAgICAgcHJvZHVjdC50b3RhbCAtXG4gICAgICAgIE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IHByb2R1Y3QucmVmdW5kZWRUb3RhbCA6IDApO1xuXG4gICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICs9IHByb2R1Y3QudG90YWw7XG4gICAgICBiYXNrZXREZXRhaWxzLnF1YW50aXR5ID1cbiAgICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSArXG4gICAgICAgIChwcm9kdWN0LnF1YW50aXR5IC1cbiAgICAgICAgICAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID8gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5IDogMCkpO1xuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVQcm9kdWN0VG90YWxGb3JTdW1tYXJ5XCIsXG4gICAgICAgIFwidXBkYXRlIGJhc2tldGRldGFpbHMgdG90YWwgOlwiICtcbiAgICAgICAgYmFza2V0RGV0YWlscy50b3RhbCArXG4gICAgICAgIFwiIFByb2R1Y3QgbGluZSBJRCA6IFwiICtcbiAgICAgICAgcHJvZHVjdC5pdGVtTGluZUlkICtcbiAgICAgICAgXCIgcHJvZHVjdCB0b3RhbCA6IFwiICtcbiAgICAgICAgcHJvZHVjdC50b3RhbCxcbiAgICAgICAgXCJxdWFudGl0eSAgOiBcIiArIGJhc2tldERldGFpbHMucXVhbnRpdHlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzKTtcbiAgfVxuXG4gIHVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiBhbnkpIHtcbiAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID0gYmFza2V0RGV0YWlscy50b3RhbDtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0luZm8odGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0VG90YWxGb3JTdW1tYXJ5XCIsXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uRGlzY291bnQgIFwiLFxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50XG4gICAgKTtcblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbEZvclN1bW1hcnlcIixcbiAgICAgIFwidXBkYXRlIEJhc2tldCBUb3RhbCBmb3IgdHJhbnNhY3Rpb24gdHJhbnNhY3Rpb25Qcm9tb3Rpb24gIFwiLFxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvblxuICAgICk7XG5cbiAgICBiYXNrZXREZXRhaWxzID0gdGhpcy51cGRhdGVUcmFuc2FjdGlvblByb21vdGlvbihiYXNrZXREZXRhaWxzKTtcbiAgICBiYXNrZXREZXRhaWxzID0gdGhpcy51cGRhdGVUcmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHMpO1xuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBOdW1iZXIoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbC50b0ZpeGVkKDIpKTtcblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbEZvclN1bW1hcnlcIixcbiAgICAgIFwidXBkYXRlIEJhc2tldCBUb3RhbDogYmFza2V0VG90YWwgYWZ0ZXIgcHJvbW90aW9uIGFwcGxpZWQgIGZvciBiYXNrZXRUb3RhbFwiLFxuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbFxuICAgICk7XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICB1cGRhdGVUcmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IHsgdHJhbnNhY3Rpb25EaXNjb3VudDogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcbiAgICBpZiAoXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQgJiZcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50LnJlZHVjZShcbiAgICAgICAgKG46IGFueSwgeyBkaXNjb3VudEFtb3VudCB9OiBhbnkpID0+IG4gKyBkaXNjb3VudEFtb3VudCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlVHJhbnNhY3Rpb25EaXNjb3VudFwiLCAgXCJkaXNjb3VudFRvdGFsIFwiLCBkaXNjb3VudFRvdGFsKTtcbiAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPVxuICAgICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsIC0gTWF0aC5hYnMoZGlzY291bnRUb3RhbCk7XG4gICAgfVxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xuICB9XG5cbiAgdXBkYXRlVHJhbnNhY3Rpb25Qcm9tb3Rpb24oYmFza2V0RGV0YWlsczogeyB0cmFuc2FjdGlvblByb21vdGlvbjogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcbiAgICBpZiAoXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcbiAgICAgICAgKG46IGFueSwgeyBwcm9tb3Rpb25BbW91bnQgfTogYW55KSA9PiBuICsgcHJvbW90aW9uQW1vdW50LFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9XG4gICAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgLSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRUb3RhbFdpdGhvdXREaXNjb3VudChiYXNrZXQ6IEJhc2tldCk6IEJhc2tldCB7XG4gICAgYmFza2V0LnRvdGFsID0gMDtcbiAgICBiYXNrZXQucXVhbnRpdHkgPSAwO1xuXG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXQucHJvZHVjdHMpIHtcbiAgICAgIGlmIChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcbiAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5saW5lRGlzY291bnQgJiYgIXByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xuICAgICAgfVxuXG4gICAgICBwcm9kdWN0LnRvdGFsID1cbiAgICAgICAgcHJvZHVjdC50b3RhbCAtXG4gICAgICAgIE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IHByb2R1Y3QucmVmdW5kZWRUb3RhbCA6IDApO1xuICAgICAgYmFza2V0LnRvdGFsICs9IHByb2R1Y3QudG90YWw7XG4gICAgICBiYXNrZXQucXVhbnRpdHkgPVxuICAgICAgICBiYXNrZXQucXVhbnRpdHkgK1xuICAgICAgICAocHJvZHVjdC5xdWFudGl0eSAtXG4gICAgICAgICAgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA/IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA6IDApKTtcblxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbFdpdGhvdXREaXNjb3VudFwiLFxuICAgICAgICBcImUtYmFza2V0OmJhc2tldCBzZXJ2aWNlOnVwZGF0ZSBiYXNrZXRkZXRhaWxzIHRvdGFsIDpcIiArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldCkgK1xuICAgICAgICBiYXNrZXQudG90YWwgK1xuICAgICAgICBcIiBQcm9kdWN0IGxpbmUgSUQgOiBcIiArXG4gICAgICAgIHByb2R1Y3QuaXRlbUxpbmVJZCArXG4gICAgICAgIFwiIHByb2R1Y3QgdG90YWwgOiBcIiArXG4gICAgICAgIHByb2R1Y3QudG90YWxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYmFza2V0LmJhc2tldFRvdGFsID0gYmFza2V0LnRvdGFsO1xuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRUb3RhbFdpdGhEaXNjb3VudHMoYmFza2V0OiBhbnkpOiBCYXNrZXQge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0VG90YWxXaXRoRGlzY291bnRzXCIsXG4gICAgICBgdGhpcy5iYXNrZXREZXRhaWxzIG5ldyB2YWx1ZXMgICR7YmFza2V0fSwgXG4gICAgICAke0pTT04uc3RyaW5naWZ5KGJhc2tldC5iYXNrZXRUb3RhbCl9YFxuICAgICk7XG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5yZWR1Y2UoXG4gICAgICAgIChuOiBhbnksIHsgcHJvbW90aW9uQW1vdW50IH06IGFueSkgPT4gbiArIHByb21vdGlvbkFtb3VudCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbCAtIGRpc2NvdW50VG90YWw7XG4gICAgfVxuICAgIGlmIChiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCAmJiBiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQucmVkdWNlKFxuICAgICAgICAobjogYW55LCB7IGRpc2NvdW50QW1vdW50IH06IGFueSkgPT4gbiArIGRpc2NvdW50QW1vdW50LFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSBkaXNjb3VudFRvdGFsO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50c1wiLFxuICAgICAgXCJiYXNrZXQgbmV3IHZhbHVlc1wiLFxuICAgICAgYmFza2V0XG4gICAgKTtcblxuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRpc2NvdW50QW5kUHJvbW90aW9uUHJvZHVjdG9ydGlvbkNhbGN1bGF0aW9uKGJhc2tldDogQmFza2V0KSB7XG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goXG4gICAgICAgIChkaXNjb3VudCkgPT5cbiAgICAgICAgKGJhc2tldCA9IHRoaXMudHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICAgICAgICBiYXNrZXQsXG4gICAgICAgICAgZGlzY291bnRcbiAgICAgICAgKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKHByb21vdGlvbikgPT4ge1xuICAgICAgICBiYXNrZXQgPSB0aGlzLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgcHJvbW90aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRBbmRQcm9tb3Rpb25Qcm9kdWN0b3J0aW9uQ2FsY3VsYXRpb25cIixcbiAgICAgIGBiYXNrZXQgaXRlbSBkaXNjb3VudCBwcm90aW9uIGNhbGN1bGF0aW9uICxcbiAgICAgICR7YmFza2V0fSxcbiAgICAgICR7YmFza2V0LnByb2R1Y3RzfWBcbiAgICApO1xuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICBiYXNrZXQ6IGFueSxcbiAgICBwcm9tb3Rpb246IGFueVxuICApIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBwZXJjZW50YWdlID0gMDtcbiAgICB7XG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocDphbnkpID0+IHtcbiAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcyhwLml0ZW1MaW5lSWQpKSB7XG4gICAgICAgICAgcCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHApO1xuICAgICAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKSArXG4gICAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uKTtcbiAgICAgICAgICB0b3RhbCArPSAocC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsY1wiLFxuICAgICAgICBgZWJhc2tldDogdHJuc2FjdGlvblByb21vdGlvbjogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwcm9tb3Rpb25cbiAgICAgICAgKX0sIHNlbGVjdGVkIHByb2R1Y3RzIHRvdGFsOiAke3RvdGFsfWBcbiAgICAgICk7XG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XG4gICAgICAgIHByb2R1Y3QgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0KTtcblxuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XG5cbiAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcyhwcm9kdWN0Lml0ZW1MaW5lSWQpKSB7XG4gICAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XG4gICAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uICs9XG4gICAgICAgICAgICAocHJvbW90aW9uLnByb21vdGlvbkFtb3VudCAqIHBlcmNlbnRhZ2UpIC8gMTAwO1xuICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYmFza2V0O1xuICB9XG5cbiAgdHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICBiYXNrZXQ6IGFueSxcbiAgICBkaXNjb3VudDogYW55XG4gICkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xuXG4gICAgYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHA6IGFueSkgPT4ge1xuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcbiAgICAgICAgcCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHApO1xuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XG5cblxuICAgICAgICB0b3RhbCArPSAocC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRQcm9kdWN0UG9ydGlvbkNhbGNcIixcbiAgICAgIGBlYmFza2V0OiB0cm5zYWN0aW9uRGlzY291bnQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGRpc2NvdW50XG4gICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxuICAgICk7XG5cbiAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDphbnkpID0+IHtcbiAgICAgIHByb2R1Y3QgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0KTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsY1wiLCBcImRpc2NvdW50YWJsZSBpbiBiYXNrZXQgc2VydmljZVwiLCBwcm9kdWN0LmRpc2NvdW50YWJsZSk7XG5cbiAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uKTtcblxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHByb2R1Y3QuaXRlbUxpbmVJZCkgJiYgcHJvZHVjdC5kaXNjb3VudGFibGUgPT0gdHJ1ZSkge1xuICAgICAgICBwZXJjZW50YWdlID0gKChwcm9kdWN0LnRvdGFsIC0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwpKSAvIHRvdGFsKSAqIDEwMDtcbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gKz1cbiAgICAgICAgICAoZGlzY291bnQuZGlzY291bnRBbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbilcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYmFza2V0O1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0OiBQcm9kdWN0KSB7XG4gICAgaWYgKCFwcm9kdWN0Lml0ZW1EaXNjb3VudHMpIHtcbiAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cyA9IHtcbiAgICAgICAgdHJuRGlzY291bnRzUG9ydGlvbjogMCxcbiAgICAgICAgdHJuUHJvbW90aW9uc1BvcnRpb246IDAsXG4gICAgICAgIHJlZnVuZFBvcnRpb246IDAsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxuXG4gIG1hcmtQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcbiAgICB0aGlzLnByb2R1Y3RTb3VyY2UubmV4dChwcm9kdWN0KTtcbiAgfVxuICBzdG9wUGVlclN5bmNQcm9jZXNzKHBlZXJTeW5jOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZWVyU291cmNlLm5leHQocGVlclN5bmMpO1xuICB9XG5cbiAgc2NhblN0YXJ0KGlzU2Nhbm5pbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNjYW5Tb3VyY2UubmV4dChpc1NjYW5uaW5nKTtcbiAgfVxuXG4gIHByb21vdGlvblJlbWFpbmluZ0NhbGN1bGF0aW9uKHByb21vdGlvbjogVHJhbnNhY3Rpb25Qcm9tb3Rpb25bXSkge1xuICAgIHZhciBwcm9tb3Rpb25WYWx1ZSA9IDA7XG4gICAgcHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIHByb21vdGlvblZhbHVlICs9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9tb3Rpb25WYWx1ZTtcbiAgfVxuXG4gIGRpc2NvdW50UmVtYWluaW5nQ2FsY3VsYXRpb24oZGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnRbXSkge1xuICAgIHZhciBkaXNjb3VudFZhbHVlID0gMDtcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBkaXNjb3VudFZhbHVlICs9IGVsZW1lbnQuZGlzY291bnRBbW91bnQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpc2NvdW50VmFsdWU7XG4gIH1cblxuICBkaXNjb3VudFJlZnVuZGVkQ2FsY3VsYXRpb24oZGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnRbXSkge1xuICAgIHZhciBkaXNjb3VudFZhbHVlID0gMDtcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5kaXNjb3VudEFtb3VudCA8IDApIHtcbiAgICAgICAgZGlzY291bnRWYWx1ZSArPSBlbGVtZW50LmRpc2NvdW50QW1vdW50O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkaXNjb3VudFZhbHVlO1xuICB9XG5cbiAgZ2VuZXJhdGVOZXdJdGVtTGluZUlkKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICBsZXQgbGFyZ2VzdE51bWJlcjogYW55ID0gMDtcblxuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gcHJvZHVjdHMubWFwKChwcm9kdWN0KSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWQ7XG4gICAgICB9KTtcblxuICAgICAgbGFyZ2VzdE51bWJlciA9IGl0ZW1MaW5lSWRBcnJheS5yZWR1Y2UoKGEgOmFueSwgYjphbnkpID0+IE1hdGgubWF4KGEsIGIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFyZ2VzdE51bWJlciArIDE7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHkoXG4gICAgcHJvZHVjdDogYW55LFxuICAgIHF1YW50aXR5OiBudW1iZXJcbiAgKTogUHJvZHVjdCB7XG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eVwiLCBgZWJhc2tldDogdXBkYXRlQmFza2V0UHJvZHVjdERhdGFBc1BlclF1YW50aXR5IDogJHtxdWFudGl0eX0gcHJvZHVjdDogJHtKU09OLnN0cmluZ2lmeShwcm9kdWN0KX1gKTtcbiAgICBwcm9kdWN0LnF1YW50aXR5ID0gcXVhbnRpdHk7XG4gICAgaWYgKHByb2R1Y3QuaGFzT3duUHJvcGVydHkoXCJsaW5lRGlzY291bnRcIikpIHtcbiAgICAgIC8vICYmIHRoaXMucHJvZHVjdC5xdWFudGl0eSAhPT0gdGhpcy5wcm9kdWN0RGV0YWlsRm9ybS5jb250cm9scy5xdWFudGl0eS52YWx1ZVxuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSA9IE51bWJlcihcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS5nZXRGbG9vcmVkRml4ZWQoXG4gICAgICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQudW5pdFByaWNlICogcXVhbnRpdHksXG4gICAgICAgICAgMlxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRBbW91bnQgPVxuICAgICAgICBwcm9kdWN0LnRvdGFsTGluZVByaWNlIC0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZHVjdC50b3RhbExpbmVQcmljZSA9XG4gICAgICAgIHF1YW50aXR5ICogdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChwcm9kdWN0LnNlbGVjdGVkUHJpY2UpO1xuICAgIH1cbiAgICBpZiAocHJvZHVjdC5saW5lRGlzY291bnQpIHtcbiAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcbiAgICB9XG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHlcIiwgYGViYXNrZXQ6IHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eSA6ICR7cXVhbnRpdHl9IHByb2R1Y3Q6ICR7SlNPTi5zdHJpbmdpZnkocHJvZHVjdCl9YCk7XG5cbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxuXG4gIGZpbHRlclByb2R1Y3RMaXN0V2l0aFdlYk9yZGVyKGlzV2ViT3JkZXI6IGJvb2xlYW4pOiBQcm9kdWN0W10ge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXJcIiwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhXZWJPcmRlciBoaXRcIiwgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKTtcbiAgICBpZiAoaXNXZWJPcmRlcilcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmlzV2ViT3JkZXIpO1xuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5maWx0ZXIoKHgpID0+ICF4LmlzV2ViT3JkZXIpO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5KCk6IFByb2R1Y3RbXSB7XG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhEZWxpdmVyeVwiLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5IGhpdFwiLCB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmRlbGl2ZXJ5TWV0aG9kID09PSBERUxJVkVSWV9NRVRIT0RTLkRFTElWRVJZLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cChncm91cDogc3RyaW5nLCBwcm9kdWN0czogUHJvZHVjdFtdKTogUHJvZHVjdFtdIHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5R3JvdXBcIiwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhEZWxpdmVyeUdyb3VwIGhpdFwiLCBwcm9kdWN0cyk7XG4gICAgcmV0dXJuIHByb2R1Y3RzLmZpbHRlcigoeCkgPT4geC5kZWxpdmVyeUdyb3VwID09PSBncm91cCk7XG4gIH1cblxuICBnZW5lcmF0ZU5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIGxldCBsYXJnZXN0TnVtYmVyID0gMDtcblxuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xuICAgICAgICBpZiAocHJvZHVjdC5kZWxpdmVyeUdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHByb2R1Y3QuZGVsaXZlcnlHcm91cCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgbGFyZ2VzdE51bWJlciA9IGRlbGl2ZXJ5R3JvdXBBcnIucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChsYXJnZXN0TnVtYmVyICsgMSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzXCIsIFwiZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMgaW5pdGlhdGluZyA6IFwiLHByb2R1Y3RzKTtcblxuICAgIGxldCB1bmlxdWVBbmRzb3J0ZWRSZXN1bHQ6IG51bWJlcltdID0gW107XG5cbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGRlbGl2ZXJ5R3JvdXBBcnIgPSBwcm9kdWN0cy5tYXAoKHByb2R1Y3QpID0+IHtcbiAgICAgICAgaWYgKHByb2R1Y3QuZGVsaXZlcnlHcm91cCkge1xuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByb2R1Y3QuZGVsaXZlcnlNZXRob2QgPT09IFwiMVwiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgdW5pcXVlQW5kc29ydGVkUmVzdWx0ID0gQXJyYXkuZnJvbShuZXcgU2V0KGRlbGl2ZXJ5R3JvdXBBcnIpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzXCIsIFwiZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMgOiB1bmlxdWVBbmRzb3J0ZWRSZXN1bHRcIiwgdW5pcXVlQW5kc29ydGVkUmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDtcbiAgfVxuXG4gIHVwZGF0ZVByb2R1Y3RzV2l0aE5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdHNXaXRoTmV3RGVsaXZlcnlHcm91cE51bWJlclwiLCBcImluaXRpYXRpbmcgOiBcIiwgcHJvZHVjdHMpO1xuXG4gICAgbGV0IG5ld0dyb3VwTnVtYmVyID0gdGhpcy5nZW5lcmF0ZU5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIodGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKTtcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XG4gICAgICAgIHByb2R1Y3RzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgaWYgKGNCUHJvZHVjdHMuaXRlbUxpbmVJZCA9PT0gZWxlbWVudC5pdGVtTGluZUlkKSB7XG4gICAgICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cE51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQmFza2V0KHRoaXMuY3VycmVudEJhc2tldCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY2FsY3VsYXRlRXN0aW1hdGVkVGltZShwcm9kdWN0czogYW55W10pIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHRpbWU7XG4gICAgICBsZXQgZXN0bWF0ZWRUaW1lOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGVzdGltYXRlZERheXM6IHN0cmluZyA9IFwiSG91cnNcIjtcbiAgICAgIHByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IHsgbGVhZFRpbWU6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55OyB9OyB9KSA9PiB7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubGVhZFRpbWUudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiA3O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgd2VlayAke2VzdG1hdGVkVGltZX0gJHtlc3RpbWF0ZWREYXlzfWApO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sZWFkVGltZS50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwiZGF5c1wiKSB7XG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGBkYXlzICR7ZXN0bWF0ZWRUaW1lfSAke2VzdGltYXRlZERheXN9YCk7XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJtb250aHNcIikge1xuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSkgKiAyNCAqIDMwO1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGBtb250aHMgJHtlc3RtYXRlZFRpbWV9ICAke2VzdGltYXRlZERheXN9YCk7XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0ICogMzY1O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGB5ZWFycyAke2VzdG1hdGVkVGltZX0gICR7ZXN0aW1hdGVkRGF5c31gKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSk7XG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzO1xuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgaG91cnMgICR7ZXN0bWF0ZWRUaW1lfSAgJHtlc3RpbWF0ZWREYXlzfWApO1xuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcImRheXNcIikge1xuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAyNDtcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcbiAgICAgICAgZXN0bWF0ZWRUaW1lID0gZXN0bWF0ZWRUaW1lIC8gKDI0ICogNyk7XG4gICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZERheXMudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJtb250aHNcIikge1xuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzMCk7XG4gICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZERheXMudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XG4gICAgICAgIGVzdG1hdGVkVGltZSA9IGVzdG1hdGVkVGltZSAvICgyNCAqIDM2NSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBlc3RpbWF0ZSA9IHtcbiAgICAgICAgdmFsdWU6IGVzdG1hdGVkVGltZS50b1N0cmluZygpLFxuICAgICAgICB0eXBlOiBlc3RpbWF0ZWREYXlzXG4gICAgICB9XG4gICAgICByZXR1cm4gZXN0aW1hdGU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRXJyb3IodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBcImVycm9yIGluIGNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHVwZGF0ZVByb2R1Y3RzV2l0aERlbGl2ZXJ5R3JvdXBOdW1iZXIob2xkR3JvdXA6IHN0cmluZywgbmV3R3JvdXA6IHN0cmluZykge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdHNXaXRoRGVsaXZlcnlHcm91cE51bWJlciBpbml0aWF0aW5nXCIpO1xuXG4gICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XG4gICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBvbGRHcm91cCkge1xuICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cDtcbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVCYXNrZXQodGhpcy5jdXJyZW50QmFza2V0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXREZWxpdmVyeUluZm8oKTogYW55IHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5SW5mb1wiLCBcImdldERlbGl2ZXJ5R3JvdXBJbmZvciBpbml0aWF0aW5nXCIpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgZ3JvdXBJbmZvOiBEZWxpdmVyeUluZm8gPSB7XG4gICAgICAgIGdyb3VwczogW11cbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXREZWxpdmVyeUdyb3VwTnVtYmVycyh0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpLmZvckVhY2goKGdyb3VwTnVtYmVyKSA9PiB7XG4gICAgICAgIGxldCBncm91cDogYW55ID0ge1xuICAgICAgICAgIGdyb3VwTnVtYmVyOiBncm91cE51bWJlcixcbiAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgZXN0aW1hdGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiSG91cnNcIixcbiAgICAgICAgICAgIHZhbHVlOiBcIjBcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZm9yRWFjaChjQlByb2R1Y3RzID0+IHtcbiAgICAgICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBncm91cE51bWJlci50b1N0cmluZygpKSB7XG4gICAgICAgICAgICBncm91cC5pdGVtcy5wdXNoKGNCUHJvZHVjdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ3JvdXAuZXN0aW1hdGUgPSB0aGlzLmNhbGN1bGF0ZUVzdGltYXRlZFRpbWUoZ3JvdXAuaXRlbXMpO1xuXG4gICAgICAgIGdyb3VwSW5mby5ncm91cHMucHVzaChncm91cCk7XG5cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZ3JvdXBJbmZvO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRXJyb3IodGhpcy5jbGFzc05hbWUsIFwiZ2V0RGVsaXZlcnlJbmZvXCIsIFwiZXJyb3Igd2hpbGUgZ2V0dGluZyBkZWxpdmVyeSBpbmZvXCIsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|