@pmcretail/mapper-library 0.0.39 → 0.0.43
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/esm2022/lib/RJ-mapper.class.mjs +875 -0
- package/esm2022/lib/TransactionDocumentBuilder.mjs +1240 -0
- package/esm2022/lib/WebReturn-mapper.class.mjs +324 -0
- package/esm2022/lib/WebReturnSalesforceMapper.class.mjs +410 -0
- package/esm2022/lib/basket.service.mjs +516 -0
- package/esm2022/lib/mapper-library.component.mjs +22 -0
- package/esm2022/lib/mapper-library.model.mjs +39 -0
- package/esm2022/lib/mapper-library.module.mjs +21 -0
- package/esm2022/lib/number-util.service.mjs +40 -0
- package/esm2022/pmcretail-mapper-library.mjs +5 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/pmcretail-mapper-library.mjs +3482 -0
- package/fesm2022/pmcretail-mapper-library.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/RJ-mapper.class.d.ts +80 -79
- package/lib/RJ-mapper.class.d.ts.map +1 -0
- package/lib/TransactionDocumentBuilder.d.ts +271 -270
- package/lib/TransactionDocumentBuilder.d.ts.map +1 -0
- package/lib/WebReturn-mapper.class.d.ts +27 -26
- package/lib/WebReturn-mapper.class.d.ts.map +1 -0
- package/lib/WebReturnSalesforceMapper.class.d.ts +35 -34
- package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -0
- package/lib/basket.service.d.ts +105 -103
- package/lib/basket.service.d.ts.map +1 -0
- package/lib/mapper-library.component.d.ts +9 -5
- package/lib/mapper-library.component.d.ts.map +1 -0
- package/lib/mapper-library.model.d.ts +694 -693
- package/lib/mapper-library.model.d.ts.map +1 -0
- package/lib/mapper-library.module.d.ts +8 -2
- package/lib/mapper-library.module.d.ts.map +1 -0
- package/lib/number-util.service.d.ts +13 -9
- package/lib/number-util.service.d.ts.map +1 -0
- package/package.json +21 -17
- package/pmcretail-mapper-library.d.ts.map +1 -0
- package/public-api.d.ts +6 -5
- package/public-api.d.ts.map +1 -0
- package/bundles/pmcretail-mapper-library.umd.js +0 -8542
- package/bundles/pmcretail-mapper-library.umd.js.map +0 -1
- package/bundles/pmcretail-mapper-library.umd.min.js +0 -16
- package/bundles/pmcretail-mapper-library.umd.min.js.map +0 -1
- package/esm2015/lib/RJ-mapper.class.js +0 -1464
- package/esm2015/lib/TransactionDocumentBuilder.js +0 -1535
- package/esm2015/lib/WebReturn-mapper.class.js +0 -501
- package/esm2015/lib/WebReturnSalesforceMapper.class.js +0 -683
- package/esm2015/lib/basket.service.js +0 -851
- package/esm2015/lib/mapper-library.component.js +0 -27
- package/esm2015/lib/mapper-library.model.js +0 -1442
- package/esm2015/lib/mapper-library.module.js +0 -21
- package/esm2015/lib/number-util.service.js +0 -78
- package/esm2015/pmcretail-mapper-library.js +0 -10
- package/esm2015/public-api.js +0 -14
- package/esm5/lib/RJ-mapper.class.js +0 -1762
- package/esm5/lib/TransactionDocumentBuilder.js +0 -2469
- package/esm5/lib/WebReturn-mapper.class.js +0 -592
- package/esm5/lib/WebReturnSalesforceMapper.class.js +0 -857
- package/esm5/lib/basket.service.js +0 -1076
- package/esm5/lib/mapper-library.component.js +0 -29
- package/esm5/lib/mapper-library.model.js +0 -1442
- package/esm5/lib/mapper-library.module.js +0 -25
- package/esm5/lib/number-util.service.js +0 -95
- package/esm5/pmcretail-mapper-library.js +0 -10
- package/esm5/public-api.js +0 -14
- package/fesm2015/pmcretail-mapper-library.js +0 -6594
- package/fesm2015/pmcretail-mapper-library.js.map +0 -1
- package/fesm5/pmcretail-mapper-library.js +0 -8326
- package/fesm5/pmcretail-mapper-library.js.map +0 -1
- package/pmcretail-mapper-library.d.ts +0 -5
- package/pmcretail-mapper-library.metadata.json +0 -1
|
@@ -1,1464 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: lib/RJ-mapper.class.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import { DISCOUNTTYPE, TRANSACTION_TYPE } from "./mapper-library.model";
|
|
7
|
-
import { TransactionDocumentBuilder } from "./TransactionDocumentBuilder";
|
|
8
|
-
export class RJMapperBuilderClass {
|
|
9
|
-
/**
|
|
10
|
-
* @param {?=} transactionDoc
|
|
11
|
-
*/
|
|
12
|
-
constructor(transactionDoc) {
|
|
13
|
-
this.itemCount = 0;
|
|
14
|
-
this.largestNumber = 0;
|
|
15
|
-
this.rjObject = {};
|
|
16
|
-
if (transactionDoc) {
|
|
17
|
-
this.transactionDocument = transactionDoc;
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
this.transactionDocument = {
|
|
21
|
-
transactionId: "",
|
|
22
|
-
offlineTransactionId: "",
|
|
23
|
-
transactionRef: "",
|
|
24
|
-
dateTime: "",
|
|
25
|
-
orgCode: "",
|
|
26
|
-
storeId: "",
|
|
27
|
-
storeNodeId: "",
|
|
28
|
-
storeNodeStructure: "",
|
|
29
|
-
deviceId: "",
|
|
30
|
-
terminalId: "",
|
|
31
|
-
userId: "",
|
|
32
|
-
initiatingModule: "eBasket",
|
|
33
|
-
export: false,
|
|
34
|
-
basket: (/** @type {?} */ ({})),
|
|
35
|
-
basketSummary: (/** @type {?} */ ({})),
|
|
36
|
-
baseCurrency: "",
|
|
37
|
-
type: "",
|
|
38
|
-
operationStatus: "",
|
|
39
|
-
createdAt: "",
|
|
40
|
-
updatedAt: "",
|
|
41
|
-
id: "",
|
|
42
|
-
currentTransactionDetails: (/** @type {?} */ ({})),
|
|
43
|
-
saleTotal: 0,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
this.initilizeItemCount();
|
|
47
|
-
this.setLineNumberForProducts();
|
|
48
|
-
this.createdAt = this.getDate(this.transactionDocument.createdAt);
|
|
49
|
-
this.updatedAt = this.getDate(this.transactionDocument.updatedAt);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* @template THIS
|
|
53
|
-
* @this {THIS}
|
|
54
|
-
* @return {THIS}
|
|
55
|
-
*/
|
|
56
|
-
getPosbasketInfo() {
|
|
57
|
-
(/** @type {?} */ (this)).rjObject['Keyword'] = (/** @type {?} */ (this)).generateKeyword();
|
|
58
|
-
(/** @type {?} */ (this)).rjObject['ID'] = (/** @type {?} */ (this)).generateId((/** @type {?} */ (this)).createdAt);
|
|
59
|
-
(/** @type {?} */ (this)).rjObject['XMLSchemaVersion'] = '2';
|
|
60
|
-
(/** @type {?} */ (this)).rjObject['LastUpdated'] = (/** @type {?} */ (this)).updatedAt;
|
|
61
|
-
(/** @type {?} */ (this)).rjObject['MajorVersion'] = (/** @type {?} */ (this)).majorVersion;
|
|
62
|
-
(/** @type {?} */ (this)).rjObject['MinorVersion'] = (/** @type {?} */ (this)).minorVersion;
|
|
63
|
-
(/** @type {?} */ (this)).rjObject['ManifestVersion'] = (/** @type {?} */ (this)).manifestVersion;
|
|
64
|
-
(/** @type {?} */ (this)).rjObject['DatabaseSchemaVersion'] = (/** @type {?} */ (this)).databaseSchemaVersion;
|
|
65
|
-
(/** @type {?} */ (this)).rjObject['BasketType'] = (/** @type {?} */ (this)).basketType;
|
|
66
|
-
(/** @type {?} */ (this)).rjObject['State'] = (/** @type {?} */ (this)).getState();
|
|
67
|
-
(/** @type {?} */ (this)).rjObject['ExternalState'] = (/** @type {?} */ (this)).externalState;
|
|
68
|
-
return (/** @type {?} */ (this));
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* @template THIS
|
|
72
|
-
* @this {THIS}
|
|
73
|
-
* @return {THIS}
|
|
74
|
-
*/
|
|
75
|
-
getheaderInfo() {
|
|
76
|
-
(/** @type {?} */ (this)).rjObject['Header'] = {};
|
|
77
|
-
(/** @type {?} */ (this)).rjObject['Header'].TimeZoneOffset = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).generateTimezoneoffset((/** @type {?} */ (this)).transactionDocument.createdAt));
|
|
78
|
-
(/** @type {?} */ (this)).rjObject['Header'].DateTimeCreated = (/** @type {?} */ (this)).createdAt;
|
|
79
|
-
(/** @type {?} */ (this)).rjObject['Header'].OriginatedBy = {};
|
|
80
|
-
(/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.DeviceID = (/** @type {?} */ (this)).deviceId;
|
|
81
|
-
(/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.CashierID = (/** @type {?} */ (this)).cashierId;
|
|
82
|
-
(/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.CompanyID = (/** @type {?} */ (this)).companyId;
|
|
83
|
-
(/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.StoreID = (/** @type {?} */ (this)).transactionDocument.storeId;
|
|
84
|
-
(/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.BranchID = (/** @type {?} */ (this)).branchId;
|
|
85
|
-
(/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.TerminalNumber = (/** @type {?} */ (this)).terminalNumber;
|
|
86
|
-
(/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.TransactionNumber = (/** @type {?} */ (this)).transactionNumber;
|
|
87
|
-
(/** @type {?} */ (this)).rjObject['Header'].TaxMethodID = (/** @type {?} */ (this)).taxMethodId;
|
|
88
|
-
(/** @type {?} */ (this)).rjObject['Header'].DynamicStockLookup = (/** @type {?} */ (this)).generateDynamicStockLookUp();
|
|
89
|
-
(/** @type {?} */ (this)).rjObject['Header'].BasketLanguageID = (/** @type {?} */ (this)).basketLanguageId; //todo
|
|
90
|
-
(/** @type {?} */ (this)).rjObject['Header'].BasketCountryID = (/** @type {?} */ (this)).basketCountryId; //todo
|
|
91
|
-
(/** @type {?} */ (this)).rjObject['Header'].BasketCurrencyID = (/** @type {?} */ (this)).transactionDocument.baseCurrency;
|
|
92
|
-
(/** @type {?} */ (this)).rjObject['Header'].TradingRegionID = (/** @type {?} */ (this)).tradingRegionId;
|
|
93
|
-
(/** @type {?} */ (this)).rjObject['Header'].Eurozone = " "; //unknown
|
|
94
|
-
(/** @type {?} */ (this)).rjObject['Header'].EuroBaseExchangeRate = ""; //unknown
|
|
95
|
-
(/** @type {?} */ (this)).rjObject['Header'].PrintableName = (/** @type {?} */ (this)).transactionDocument.userName; //unknown
|
|
96
|
-
return (/** @type {?} */ (this));
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* @template THIS
|
|
100
|
-
* @this {THIS}
|
|
101
|
-
* @return {THIS}
|
|
102
|
-
*/
|
|
103
|
-
rjMapper() {
|
|
104
|
-
/** @type {?} */
|
|
105
|
-
var transactionDiscount = [];
|
|
106
|
-
if ((/** @type {?} */ (this)).transactionDocument.basket.transactionDiscount && (/** @type {?} */ (this)).transactionDocument.basket.transactionDiscount.length > 0) {
|
|
107
|
-
transactionDiscount = (/** @type {?} */ (this)).transactionDocument.basket.transactionDiscount;
|
|
108
|
-
}
|
|
109
|
-
if ((/** @type {?} */ (this)).transactionDocument.type === TRANSACTION_TYPE.SALE) {
|
|
110
|
-
(/** @type {?} */ (this)).rjObject['ProductSale'] = [];
|
|
111
|
-
(/** @type {?} */ (this)).rjObject['ModifierItem'] = [];
|
|
112
|
-
(/** @type {?} */ (this)).transactionDocument.basket.products.forEach((/**
|
|
113
|
-
* @param {?} element
|
|
114
|
-
* @return {?}
|
|
115
|
-
*/
|
|
116
|
-
(element) => {
|
|
117
|
-
/** @type {?} */
|
|
118
|
-
let lineDiscount = [];
|
|
119
|
-
if ((/** @type {?} */ (this)).transactionDocument.basket.lineDiscount && (/** @type {?} */ (this)).transactionDocument.basket.lineDiscount.length > 0) {
|
|
120
|
-
lineDiscount = (/** @type {?} */ (this)).transactionDocument.basket.lineDiscount.filter((/**
|
|
121
|
-
* @param {?} x
|
|
122
|
-
* @return {?}
|
|
123
|
-
*/
|
|
124
|
-
(x) => x.itemLineId === element.itemLineId));
|
|
125
|
-
if (lineDiscount.length > 0) {
|
|
126
|
-
/** @type {?} */
|
|
127
|
-
const index = (/** @type {?} */ (this)).transactionDocument.basket.lineDiscount.indexOf(lineDiscount[0]);
|
|
128
|
-
if (index > -1) {
|
|
129
|
-
(/** @type {?} */ (this)).transactionDocument.basket.lineDiscount.splice(index, 1);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/** @type {?} */
|
|
134
|
-
let data = (/** @type {?} */ (this)).addProduct(element, (lineDiscount.length > 0 ? lineDiscount[0] : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
135
|
-
(/** @type {?} */ (this)).rjObject['ProductSale'].push(data);
|
|
136
|
-
(/** @type {?} */ (this)).getModifierItem(lineDiscount.length > 0 ? lineDiscount[0] : null, element.itemLineId);
|
|
137
|
-
}));
|
|
138
|
-
/** @type {?} */
|
|
139
|
-
let transactionPromotion = [];
|
|
140
|
-
if ((/** @type {?} */ (this)).transactionDocument.basket.transactionPromotion && (/** @type {?} */ (this)).transactionDocument.basket.transactionPromotion.length > 0) {
|
|
141
|
-
transactionPromotion = (/** @type {?} */ (this)).transactionDocument.basket.transactionPromotion;
|
|
142
|
-
(/** @type {?} */ (this)).getTransactionPromotion(transactionPromotion);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
else if ((/** @type {?} */ (this)).transactionDocument.type === TRANSACTION_TYPE.REFUND) {
|
|
146
|
-
(/** @type {?} */ (this)).rjObject['ProductReturn'] = [];
|
|
147
|
-
(/** @type {?} */ (this)).rjObject['ModifierItem'] = [];
|
|
148
|
-
(/** @type {?} */ (this)).transactionDocument.basket.products.forEach((/**
|
|
149
|
-
* @param {?} element
|
|
150
|
-
* @return {?}
|
|
151
|
-
*/
|
|
152
|
-
(element) => {
|
|
153
|
-
/** @type {?} */
|
|
154
|
-
let data = (/** @type {?} */ (this)).returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
155
|
-
(/** @type {?} */ (this)).rjObject['ProductReturn'].push(data);
|
|
156
|
-
(/** @type {?} */ (this)).getModifierItem(element.lineDiscount, element.itemLineId);
|
|
157
|
-
}));
|
|
158
|
-
}
|
|
159
|
-
else if ((/** @type {?} */ (this)).transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
|
|
160
|
-
(/** @type {?} */ (this)).rjObject['ProductReturn'] = [];
|
|
161
|
-
(/** @type {?} */ (this)).rjObject['ModifierItem'] = [];
|
|
162
|
-
/** @type {?} */
|
|
163
|
-
let transactionDoc = new TransactionDocumentBuilder().basket((/** @type {?} */ (this)).transactionDocument.currentTransactionDetails).build();
|
|
164
|
-
transactionDoc.basket.products.forEach((/**
|
|
165
|
-
* @param {?} element
|
|
166
|
-
* @return {?}
|
|
167
|
-
*/
|
|
168
|
-
(element) => {
|
|
169
|
-
/** @type {?} */
|
|
170
|
-
let data = (/** @type {?} */ (this)).returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
171
|
-
/** @type {?} */
|
|
172
|
-
let obj = {
|
|
173
|
-
"OriginalReceiptSupplied": 0,
|
|
174
|
-
"OriginalBranchID": 0,
|
|
175
|
-
"OriginalTerminalNumber": 0,
|
|
176
|
-
"OriginalTransactionNumber": 0,
|
|
177
|
-
"OriginalCashierNumber": 0
|
|
178
|
-
};
|
|
179
|
-
data['Return'] = Object.assign({}, data['Return'], obj);
|
|
180
|
-
(/** @type {?} */ (this)).rjObject['ProductReturn'].push(data);
|
|
181
|
-
(/** @type {?} */ (this)).getModifierItem(element.lineDiscount, element.itemLineId);
|
|
182
|
-
}));
|
|
183
|
-
}
|
|
184
|
-
else if ((/** @type {?} */ (this)).transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
|
|
185
|
-
(/** @type {?} */ (this)).rjObject['ProductReturn'] = [];
|
|
186
|
-
(/** @type {?} */ (this)).rjObject['ProductSale'] = [];
|
|
187
|
-
(/** @type {?} */ (this)).rjObject['ModifierItem'] = [];
|
|
188
|
-
/** @type {?} */
|
|
189
|
-
let transactionDoc = new TransactionDocumentBuilder().basket((/** @type {?} */ (this)).transactionDocument.currentTransactionDetails).build();
|
|
190
|
-
transactionDoc.basket.products.forEach((/**
|
|
191
|
-
* @param {?} element
|
|
192
|
-
* @return {?}
|
|
193
|
-
*/
|
|
194
|
-
(element) => {
|
|
195
|
-
if (element.refundedQuantity > 0) {
|
|
196
|
-
/** @type {?} */
|
|
197
|
-
let returnProduct = (/** @type {?} */ (this)).returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
198
|
-
/** @type {?} */
|
|
199
|
-
let obj = {
|
|
200
|
-
"OriginalReceiptSupplied": 0,
|
|
201
|
-
"OriginalBranchID": 0,
|
|
202
|
-
"OriginalTerminalNumber": 0,
|
|
203
|
-
"OriginalTransactionNumber": 0,
|
|
204
|
-
"OriginalCashierNumber": 0
|
|
205
|
-
};
|
|
206
|
-
returnProduct['Return'] = Object.assign({}, returnProduct['Return'], obj);
|
|
207
|
-
(/** @type {?} */ (this)).rjObject['ProductReturn'].push(returnProduct);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
/** @type {?} */
|
|
211
|
-
let addProduct = (/** @type {?} */ (this)).addProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
212
|
-
(/** @type {?} */ (this)).rjObject['ProductSale'].push(addProduct);
|
|
213
|
-
}
|
|
214
|
-
(/** @type {?} */ (this)).getModifierItem(element.lineDiscount, element.itemLineId);
|
|
215
|
-
}));
|
|
216
|
-
}
|
|
217
|
-
return (/** @type {?} */ (this));
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* @template THIS
|
|
221
|
-
* @this {THIS}
|
|
222
|
-
* @return {THIS}
|
|
223
|
-
*/
|
|
224
|
-
getBasketDiscount() {
|
|
225
|
-
if (!(/** @type {?} */ (this)).transactionDocument.basket.transactionDiscount)
|
|
226
|
-
return (/** @type {?} */ (this));
|
|
227
|
-
(/** @type {?} */ (this)).rjObject['BasketDiscount'] = [];
|
|
228
|
-
(/** @type {?} */ (this)).transactionDocument.basket.transactionDiscount.forEach((/**
|
|
229
|
-
* @param {?} element
|
|
230
|
-
* @return {?}
|
|
231
|
-
*/
|
|
232
|
-
(element) => {
|
|
233
|
-
/** @type {?} */
|
|
234
|
-
let obj = {};
|
|
235
|
-
obj['XMLSchemaVersion'] = (/** @type {?} */ (this)).xmlSchemaVersion;
|
|
236
|
-
obj['DeviceID'] = (/** @type {?} */ (this)).deviceId;
|
|
237
|
-
obj['DateTimeCreated'] = (/** @type {?} */ (this)).updatedAt;
|
|
238
|
-
obj['NetValue'] = (/** @type {?} */ (this)).convertToString(element.discountAmount * -1);
|
|
239
|
-
obj['EffectiveNetValue'] = (/** @type {?} */ (this)).convertToString(element.discountAmount * -1);
|
|
240
|
-
obj['Description'] = element.reasonDisplayText;
|
|
241
|
-
obj['UserID'] = (/** @type {?} */ (this)).transactionDocument.userName;
|
|
242
|
-
obj['ReasonCodeID'] = element.reasonCode;
|
|
243
|
-
obj['DiscountType'] = (/** @type {?} */ (this)).convertToString(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase() ? 0 : 1);
|
|
244
|
-
obj['RoundingRule'] = (/** @type {?} */ (this)).convertToString(2);
|
|
245
|
-
obj['ModifiedLineNumber'] = element.itemLineIds;
|
|
246
|
-
obj['LineNumber'] = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).generateLineNumber());
|
|
247
|
-
obj['DiscountedValue'] = (/** @type {?} */ (this)).transactionDocument.basketSummary.basketTotal + (/** @type {?} */ (this)).transactionDocument.basketSummary.discountTotal;
|
|
248
|
-
if (element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase()) {
|
|
249
|
-
obj['DiscountPercentage'] = (/** @type {?} */ (this)).convertToString((element.discountAmount / (/** @type {?} */ (this)).transactionDocument.basketSummary.basketTotal).toFixed(1));
|
|
250
|
-
}
|
|
251
|
-
if ((/** @type {?} */ (this)).transactionDocument.type === 'REFUND') {
|
|
252
|
-
obj['NetValue'] = (/** @type {?} */ (this)).convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
|
|
253
|
-
obj['EffectiveNetValue'] = (/** @type {?} */ (this)).convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
|
|
254
|
-
}
|
|
255
|
-
(/** @type {?} */ (this)).rjObject['BasketDiscount'].push(obj);
|
|
256
|
-
}));
|
|
257
|
-
return (/** @type {?} */ (this));
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* @param {?} data
|
|
261
|
-
* @param {?} lineNo
|
|
262
|
-
* @return {?}
|
|
263
|
-
*/
|
|
264
|
-
getModifierItem(data, lineNo) {
|
|
265
|
-
if (data && lineNo) {
|
|
266
|
-
/** @type {?} */
|
|
267
|
-
let obj = {};
|
|
268
|
-
obj.XMLSchemaVersion = 1;
|
|
269
|
-
obj.LineNumber = this.generateLineNumber();
|
|
270
|
-
obj.NetValue = 0;
|
|
271
|
-
obj.EffectiveNetValue = 0;
|
|
272
|
-
obj.Description = data.percentageDiscountReasonName ? data.percentageDiscountReasonName : data.priceOverrideReasonName;
|
|
273
|
-
obj.DeviceID = this.deviceId;
|
|
274
|
-
obj.UserID = this.transactionDocument.userName;
|
|
275
|
-
obj.DateTimeCreated = this.updatedAt;
|
|
276
|
-
obj.AuthorisingUserID = this.transactionDocument.userName;
|
|
277
|
-
obj.ReasonCodeID = data.percentageDiscountReasonCode ? data.percentageDiscountReasonCode : data.priceOverrideReasonCode;
|
|
278
|
-
obj.ModifiedLineNumber = lineNo;
|
|
279
|
-
obj.ModifiedIndex = 1;
|
|
280
|
-
this.rjObject['ModifierItem'].push(obj);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* @template THIS
|
|
285
|
-
* @this {THIS}
|
|
286
|
-
* @return {THIS}
|
|
287
|
-
*/
|
|
288
|
-
getTrailerInfo() {
|
|
289
|
-
(/** @type {?} */ (this)).rjObject['Trailer'] = {};
|
|
290
|
-
(/** @type {?} */ (this)).rjObject.Trailer.DateTimeCompleted = (/** @type {?} */ (this)).updatedAt;
|
|
291
|
-
(/** @type {?} */ (this)).rjObject.Trailer.CompletedBy = {};
|
|
292
|
-
(/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.DeviceID = (/** @type {?} */ (this)).deviceId;
|
|
293
|
-
(/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.CashierID = (/** @type {?} */ (this)).cashierId;
|
|
294
|
-
(/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.StoreID = (/** @type {?} */ (this)).transactionDocument.storeId;
|
|
295
|
-
(/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.BranchID = (/** @type {?} */ (this)).branchId;
|
|
296
|
-
(/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.TerminalNumber = (/** @type {?} */ (this)).terminalNumber;
|
|
297
|
-
(/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.TransactionNumber = (/** @type {?} */ (this)).transactionNumber;
|
|
298
|
-
(/** @type {?} */ (this)).rjObject.Trailer.Total = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).transactionDocument.basketSummary.basketTotal * 100);
|
|
299
|
-
(/** @type {?} */ (this)).rjObject.Trailer.ItemCount = (/** @type {?} */ (this)).itemCount; //gives total count for product
|
|
300
|
-
(/** @type {?} */ (this)).rjObject.Trailer.ItemQuantity = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).transactionDocument.basketSummary.totalItems);
|
|
301
|
-
(/** @type {?} */ (this)).rjObject.Trailer.NetItemQuantity = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).transactionDocument.basketSummary.totalItems);
|
|
302
|
-
(/** @type {?} */ (this)).rjObject.Trailer.TaxTotal = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).removeDecimal((/** @type {?} */ (this)).transactionDocument.basketSummary.VATTotal));
|
|
303
|
-
(/** @type {?} */ (this)).rjObject.Trailer.SequenceDeviceID = (/** @type {?} */ (this)).deviceId;
|
|
304
|
-
(/** @type {?} */ (this)).rjObject.Trailer.SequenceNumber = 'snsn'; //static for now
|
|
305
|
-
(/** @type {?} */ (this)).rjObject['Trailer']['TaxItem'] = [];
|
|
306
|
-
(/** @type {?} */ (this)).transactionDocument.basket.taxBreakdown.taxLines.forEach((/**
|
|
307
|
-
* @param {?} element
|
|
308
|
-
* @return {?}
|
|
309
|
-
*/
|
|
310
|
-
(element) => {
|
|
311
|
-
/** @type {?} */
|
|
312
|
-
let obj = {};
|
|
313
|
-
obj['XMLSchemaVersion'] = (/** @type {?} */ (this)).xmlSchemaVersion;
|
|
314
|
-
obj['TaxRate'] = (/** @type {?} */ (this)).convertToString(element.VATCode);
|
|
315
|
-
obj['TaxableTotal'] = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).removeDecimal(element.taxableAmount));
|
|
316
|
-
obj['TaxTotal'] = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).removeDecimal((/** @type {?} */ (this)).removeDecimal(element.taxLineTotal)));
|
|
317
|
-
obj['TaxDescription'] = (/** @type {?} */ (this)).convertToString(element.VATCode);
|
|
318
|
-
obj['TaxIncluded'] = '1';
|
|
319
|
-
obj['TaxPercentage'] = (/** @type {?} */ (this)).addDecimal(element.VAT.toFixed(2)).toFixed(2);
|
|
320
|
-
(/** @type {?} */ (this)).rjObject['Trailer']['TaxItem'].push(obj);
|
|
321
|
-
}));
|
|
322
|
-
if ((/** @type {?} */ (this)).transactionDocument.basket.linePromotion.length > 0 || (/** @type {?} */ (this)).transactionDocument.basket.linePromotion.length > 0) {
|
|
323
|
-
(/** @type {?} */ (this)).rjObject['Trailer']['PromotionItem'] = [];
|
|
324
|
-
if ((/** @type {?} */ (this)).transactionDocument.basket.linePromotion.length > 0) {
|
|
325
|
-
(/** @type {?} */ (this)).transactionDocument.basket.linePromotion.forEach((/**
|
|
326
|
-
* @param {?} element
|
|
327
|
-
* @return {?}
|
|
328
|
-
*/
|
|
329
|
-
(element) => {
|
|
330
|
-
/** @type {?} */
|
|
331
|
-
let obj = {};
|
|
332
|
-
obj['PromotionID'] = element.promotionId;
|
|
333
|
-
obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
|
|
334
|
-
obj['PromotionQuantity'] = "1";
|
|
335
|
-
obj['PromotionDescription'] = element.displayText;
|
|
336
|
-
obj['PromotionHit'] = {};
|
|
337
|
-
obj['PromotionHit']['XMLSchemaVersion'] = (/** @type {?} */ (this)).xmlSchemaVersion;
|
|
338
|
-
obj['PromotionHit']['HitNumber'] = "1";
|
|
339
|
-
obj['PromotionHit']['HitQuantity'] = "1";
|
|
340
|
-
obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
|
|
341
|
-
obj['PromotionHit']['PromotionTrigger'] = {};
|
|
342
|
-
/** @type {?} */
|
|
343
|
-
let product = (/** @type {?} */ (this)).transactionDocument.basket.products.find((/**
|
|
344
|
-
* @param {?} item
|
|
345
|
-
* @return {?}
|
|
346
|
-
*/
|
|
347
|
-
(item) => item.itemLineId == element.itemLineId));
|
|
348
|
-
obj['PromotionHit']['PromotionTrigger']['XMLSchemaVersion'] = (/** @type {?} */ (this)).xmlSchemaVersion;
|
|
349
|
-
obj['PromotionHit']['PromotionTrigger']['ProductID'] = product.SKU;
|
|
350
|
-
obj['PromotionHit']['PromotionTrigger']['UnitValue'] = (/** @type {?} */ (this)).convertToString(element.promotionLinePrice / product.quantity);
|
|
351
|
-
obj['PromotionHit']['PromotionTrigger']['LineNumber'] = (/** @type {?} */ (this)).getNumber(product.SKU);
|
|
352
|
-
obj['PromotionHit']['PromotionTrigger']['Quantity'] = (/** @type {?} */ (this)).convertToString(product.quantity.toFixed(1));
|
|
353
|
-
obj['PromotionHit']['PromotionTrigger']['TaxCode'] = (/** @type {?} */ (this)).transactionDocument.basket.taxBreakdown.taxLines.find((/**
|
|
354
|
-
* @param {?} item
|
|
355
|
-
* @return {?}
|
|
356
|
-
*/
|
|
357
|
-
(item) => item.itemLineId == element.itemLineId)).VATCode;
|
|
358
|
-
(/** @type {?} */ (this)).rjObject['Trailer']['PromotionItem'].push(obj);
|
|
359
|
-
}));
|
|
360
|
-
}
|
|
361
|
-
if ((/** @type {?} */ (this)).transactionDocument.basket.transactionPromotion.length > 0) {
|
|
362
|
-
(/** @type {?} */ (this)).transactionDocument.basket.transactionPromotion.forEach((/**
|
|
363
|
-
* @param {?} element
|
|
364
|
-
* @return {?}
|
|
365
|
-
*/
|
|
366
|
-
(element) => {
|
|
367
|
-
/** @type {?} */
|
|
368
|
-
let obj = {};
|
|
369
|
-
obj['PromotionID'] = element.promotionId;
|
|
370
|
-
obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
|
|
371
|
-
obj['PromotionQuantity'] = "1";
|
|
372
|
-
obj['PromotionDescription'] = element.displayText;
|
|
373
|
-
obj['PromotionHit'] = {};
|
|
374
|
-
obj['PromotionHit']['XMLSchemaVersion'] = (/** @type {?} */ (this)).xmlSchemaVersion;
|
|
375
|
-
obj['PromotionHit']['HitNumber'] = "1";
|
|
376
|
-
obj['PromotionHit']['HitQuantity'] = "1";
|
|
377
|
-
obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
|
|
378
|
-
obj['PromotionHit']['PromotionTrigger'] = [];
|
|
379
|
-
(/** @type {?} */ (this)).transactionDocument.basket.products.forEach((/**
|
|
380
|
-
* @param {?} product
|
|
381
|
-
* @return {?}
|
|
382
|
-
*/
|
|
383
|
-
(product) => {
|
|
384
|
-
/** @type {?} */
|
|
385
|
-
let promotionTrigger = {};
|
|
386
|
-
element.itemLineIds.forEach((/**
|
|
387
|
-
* @param {?} itemLineId
|
|
388
|
-
* @return {?}
|
|
389
|
-
*/
|
|
390
|
-
(itemLineId) => {
|
|
391
|
-
if (JSON.stringify(itemLineId) === product.itemLineId) {
|
|
392
|
-
promotionTrigger['XMLSchemaVersion'] = (/** @type {?} */ (this)).xmlSchemaVersion;
|
|
393
|
-
promotionTrigger['ProductID'] = product.SKU;
|
|
394
|
-
promotionTrigger['UnitValue'] = (/** @type {?} */ (this)).convertToString(element.promotionLinePrice / product.quantity);
|
|
395
|
-
promotionTrigger['LineNumber'] = (/** @type {?} */ (this)).getNumber(product.SKU);
|
|
396
|
-
promotionTrigger['Quantity'] = (/** @type {?} */ (this)).convertToString(product.quantity);
|
|
397
|
-
promotionTrigger['TaxCode'] = (/** @type {?} */ (this)).transactionDocument.basket.taxBreakdown.taxLines.find((/**
|
|
398
|
-
* @param {?} item
|
|
399
|
-
* @return {?}
|
|
400
|
-
*/
|
|
401
|
-
(item) => item.itemLineId == product.itemLineId)).VATCode;
|
|
402
|
-
obj['PromotionHit']['PromotionTrigger'].push(promotionTrigger);
|
|
403
|
-
}
|
|
404
|
-
}));
|
|
405
|
-
}));
|
|
406
|
-
(/** @type {?} */ (this)).rjObject['Trailer']['PromotionItem'].push(obj);
|
|
407
|
-
}));
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
return (/** @type {?} */ (this));
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* @template THIS
|
|
414
|
-
* @this {THIS}
|
|
415
|
-
* @return {THIS}
|
|
416
|
-
*/
|
|
417
|
-
getTenderInfo() {
|
|
418
|
-
if ((/** @type {?} */ (this)).transactionDocument.paymentDetails && (/** @type {?} */ (this)).transactionDocument.paymentDetails.length > 0) {
|
|
419
|
-
(/** @type {?} */ (this)).transactionDocument.paymentDetails.forEach((/**
|
|
420
|
-
* @param {?} element
|
|
421
|
-
* @return {?}
|
|
422
|
-
*/
|
|
423
|
-
(element) => {
|
|
424
|
-
if (element.externalTenderKey) {
|
|
425
|
-
(/** @type {?} */ (this)).rjObject[element.externalTenderKey] = [];
|
|
426
|
-
if (element.paymentType.toUpperCase() === 'GIFT CARD') {
|
|
427
|
-
/** @type {?} */
|
|
428
|
-
let obj = {
|
|
429
|
-
XMLSchemaVersion: (/** @type {?} */ (this)).xmlSchemaVersion,
|
|
430
|
-
LineNumber: (/** @type {?} */ (this)).generateLineNumber(),
|
|
431
|
-
NetValue: (/** @type {?} */ (this)).convertToString(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
432
|
-
EffectiveNetValue: (/** @type {?} */ (this)).convertToString(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
433
|
-
Description: (/** @type {?} */ (this)).getDescription(element),
|
|
434
|
-
DeviceID: (/** @type {?} */ (this)).deviceId,
|
|
435
|
-
UserID: (/** @type {?} */ (this)).transactionDocument.userName,
|
|
436
|
-
DateTimeCreated: (/** @type {?} */ (this)).updatedAt,
|
|
437
|
-
TenderType: element.externalTenderType ? element.externalTenderType : '',
|
|
438
|
-
TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
|
|
439
|
-
TenderAmount: (/** @type {?} */ (this)).convertToString(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
440
|
-
CurrencyID: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
|
|
441
|
-
CurrencyDescription: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
|
|
442
|
-
GiftVoucherSalesAllowed: '',
|
|
443
|
-
//todo
|
|
444
|
-
AllowRechargeableVoucherSales: '',
|
|
445
|
-
//todo
|
|
446
|
-
GiftVoucherID: ''
|
|
447
|
-
};
|
|
448
|
-
(/** @type {?} */ (this)).rjObject[element.externalTenderKey].push(obj);
|
|
449
|
-
}
|
|
450
|
-
else {
|
|
451
|
-
/** @type {?} */
|
|
452
|
-
let obj1 = {
|
|
453
|
-
XMLSchemaVersion: "1",
|
|
454
|
-
LineNumber: (/** @type {?} */ (this)).generateLineNumber(),
|
|
455
|
-
//todo
|
|
456
|
-
NetValue: (/** @type {?} */ (this)).convertToString(-1 * (/** @type {?} */ (this)).removeDecimal(Math.round(element.amount))),
|
|
457
|
-
EffectiveNetValue: (/** @type {?} */ (this)).convertToString(-1 * (/** @type {?} */ (this)).removeDecimal(Math.round(element.amount))),
|
|
458
|
-
Description: (/** @type {?} */ (this)).getDescription(element),
|
|
459
|
-
DeviceID: (/** @type {?} */ (this)).deviceId,
|
|
460
|
-
UserID: (/** @type {?} */ (this)).transactionDocument.userName,
|
|
461
|
-
DateTimeCreated: (/** @type {?} */ (this)).updatedAt,
|
|
462
|
-
TenderType: element.externalTenderType ? element.externalTenderType : '',
|
|
463
|
-
TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
|
|
464
|
-
TenderAmount: (/** @type {?} */ (this)).convertToString(-1 * (/** @type {?} */ (this)).removeDecimal(Math.round(element.amount))),
|
|
465
|
-
CurrencyID: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
|
|
466
|
-
CurrencyDescription: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
|
|
467
|
-
IncludeInTransactionTotalCheck: "1",
|
|
468
|
-
AllowRechargeableVoucherSales: "1",
|
|
469
|
-
OpenDrawerAtEnd: "1"
|
|
470
|
-
};
|
|
471
|
-
(/** @type {?} */ (this)).rjObject[element.externalTenderKey].push(obj1);
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
else {
|
|
475
|
-
(/** @type {?} */ (this)).rjObject['CashTender'] = [];
|
|
476
|
-
if (element.paymentType.toUpperCase() === 'GIFT CARD') {
|
|
477
|
-
/** @type {?} */
|
|
478
|
-
let obj = {
|
|
479
|
-
XMLSchemaVersion: (/** @type {?} */ (this)).xmlSchemaVersion,
|
|
480
|
-
LineNumber: (/** @type {?} */ (this)).generateLineNumber(),
|
|
481
|
-
NetValue: JSON.stringify(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
482
|
-
EffectiveNetValue: JSON.stringify(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
483
|
-
Description: (/** @type {?} */ (this)).getDescription(element),
|
|
484
|
-
DeviceID: (/** @type {?} */ (this)).deviceId,
|
|
485
|
-
UserID: (/** @type {?} */ (this)).transactionDocument.userName,
|
|
486
|
-
DateTimeCreated: (/** @type {?} */ (this)).updatedAt,
|
|
487
|
-
TenderType: element.externalTenderType ? element.externalTenderType : '',
|
|
488
|
-
TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
|
|
489
|
-
TenderAmount: JSON.stringify(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
490
|
-
CurrencyID: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
|
|
491
|
-
CurrencyDescription: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
|
|
492
|
-
GiftVoucherSalesAllowed: '',
|
|
493
|
-
//todo
|
|
494
|
-
AllowRechargeableVoucherSales: '',
|
|
495
|
-
//todo
|
|
496
|
-
GiftVoucherID: ''
|
|
497
|
-
};
|
|
498
|
-
(/** @type {?} */ (this)).rjObject['CashTender'].push(obj);
|
|
499
|
-
}
|
|
500
|
-
else {
|
|
501
|
-
/** @type {?} */
|
|
502
|
-
let obj1 = {
|
|
503
|
-
XMLSchemaVersion: "1",
|
|
504
|
-
LineNumber: (/** @type {?} */ (this)).generateLineNumber(),
|
|
505
|
-
NetValue: JSON.stringify(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
506
|
-
EffectiveNetValue: JSON.stringify(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
507
|
-
Description: (/** @type {?} */ (this)).getDescription(element),
|
|
508
|
-
DeviceID: (/** @type {?} */ (this)).deviceId,
|
|
509
|
-
UserID: (/** @type {?} */ (this)).transactionDocument.userName,
|
|
510
|
-
DateTimeCreated: (/** @type {?} */ (this)).updatedAt,
|
|
511
|
-
TenderType: element.externalTenderType ? element.externalTenderType : '',
|
|
512
|
-
TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
|
|
513
|
-
TenderAmount: JSON.stringify(-1 * (/** @type {?} */ (this)).removeDecimal((Math.round(element.amount)))),
|
|
514
|
-
CurrencyID: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
|
|
515
|
-
CurrencyDescription: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
|
|
516
|
-
IncludeInTransactionTotalCheck: "1",
|
|
517
|
-
AllowRechargeableVoucherSales: "1",
|
|
518
|
-
OpenDrawerAtEnd: "1"
|
|
519
|
-
};
|
|
520
|
-
(/** @type {?} */ (this)).rjObject['CashTender'].push(obj1);
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
}));
|
|
524
|
-
}
|
|
525
|
-
return (/** @type {?} */ (this));
|
|
526
|
-
}
|
|
527
|
-
/**
|
|
528
|
-
* @param {?} productId
|
|
529
|
-
* @return {?}
|
|
530
|
-
*/
|
|
531
|
-
getNumber(productId) {
|
|
532
|
-
/** @type {?} */
|
|
533
|
-
let lineNumber;
|
|
534
|
-
for (let i = 0; i < this.rjObject['ProductSale'].length; i++) {
|
|
535
|
-
/** @type {?} */
|
|
536
|
-
const element = this.rjObject['ProductSale'][i];
|
|
537
|
-
if (JSON.stringify(productId) === JSON.stringify(element.ProductID)) {
|
|
538
|
-
lineNumber = element.LineNumber;
|
|
539
|
-
break;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
return lineNumber;
|
|
543
|
-
}
|
|
544
|
-
/**
|
|
545
|
-
* @return {?}
|
|
546
|
-
*/
|
|
547
|
-
setLineNumberForProducts() {
|
|
548
|
-
/** @type {?} */
|
|
549
|
-
let itemLineIdArray = [];
|
|
550
|
-
itemLineIdArray = this.transactionDocument.basket.products.map((/**
|
|
551
|
-
* @param {?} product
|
|
552
|
-
* @return {?}
|
|
553
|
-
*/
|
|
554
|
-
(product) => {
|
|
555
|
-
return parseInt(product.itemLineId);
|
|
556
|
-
}));
|
|
557
|
-
this.largestNumber = itemLineIdArray.reduce((/**
|
|
558
|
-
* @param {?} a
|
|
559
|
-
* @param {?} b
|
|
560
|
-
* @return {?}
|
|
561
|
-
*/
|
|
562
|
-
(a, b) => Math.max(a, b)));
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* @return {?}
|
|
566
|
-
*/
|
|
567
|
-
generateLineNumber() {
|
|
568
|
-
this.largestNumber += 1;
|
|
569
|
-
this.itemCount += 1;
|
|
570
|
-
return this.largestNumber;
|
|
571
|
-
}
|
|
572
|
-
/**
|
|
573
|
-
* @return {?}
|
|
574
|
-
*/
|
|
575
|
-
initilizeItemCount() {
|
|
576
|
-
this.itemCount = this.transactionDocument.basket.products.length;
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* @return {?}
|
|
580
|
-
*/
|
|
581
|
-
build() {
|
|
582
|
-
return this.rjObject;
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* @param {?} element
|
|
586
|
-
* @return {?}
|
|
587
|
-
*/
|
|
588
|
-
getDescription(element) {
|
|
589
|
-
if (element.paymentType.toUpperCase() === 'CARD') {
|
|
590
|
-
return element.cardType;
|
|
591
|
-
}
|
|
592
|
-
else {
|
|
593
|
-
return element.paymentType;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
/**
|
|
597
|
-
* @param {?} attributes
|
|
598
|
-
* @return {?}
|
|
599
|
-
*/
|
|
600
|
-
getMMGROUPID(attributes) {
|
|
601
|
-
if (attributes && attributes.length > 0) {
|
|
602
|
-
/** @type {?} */
|
|
603
|
-
let filterValue = attributes.filter((/**
|
|
604
|
-
* @param {?} attribute
|
|
605
|
-
* @return {?}
|
|
606
|
-
*/
|
|
607
|
-
(attribute) => attribute.name === "MMGROUPID"));
|
|
608
|
-
if (filterValue && filterValue.length > 0) {
|
|
609
|
-
return filterValue[0].value;
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
/**
|
|
614
|
-
* @template THIS
|
|
615
|
-
* @this {THIS}
|
|
616
|
-
* @param {?} id
|
|
617
|
-
* @return {THIS}
|
|
618
|
-
*/
|
|
619
|
-
setDeviceInfo(id) {
|
|
620
|
-
(/** @type {?} */ (this)).deviceId = id;
|
|
621
|
-
return (/** @type {?} */ (this));
|
|
622
|
-
}
|
|
623
|
-
/**
|
|
624
|
-
* @param {?} value
|
|
625
|
-
* @return {?}
|
|
626
|
-
*/
|
|
627
|
-
removeDecimal(value) {
|
|
628
|
-
return value * 100;
|
|
629
|
-
}
|
|
630
|
-
/**
|
|
631
|
-
* @param {?} value
|
|
632
|
-
* @return {?}
|
|
633
|
-
*/
|
|
634
|
-
addDecimal(value) {
|
|
635
|
-
return value / 100;
|
|
636
|
-
}
|
|
637
|
-
/**
|
|
638
|
-
* @template THIS
|
|
639
|
-
* @this {THIS}
|
|
640
|
-
* @param {?} value
|
|
641
|
-
* @return {THIS}
|
|
642
|
-
*/
|
|
643
|
-
setTransactionNumber(value) {
|
|
644
|
-
(/** @type {?} */ (this)).transactionNumber = value;
|
|
645
|
-
return (/** @type {?} */ (this));
|
|
646
|
-
}
|
|
647
|
-
/**
|
|
648
|
-
* @template THIS
|
|
649
|
-
* @this {THIS}
|
|
650
|
-
* @param {?} value
|
|
651
|
-
* @return {THIS}
|
|
652
|
-
*/
|
|
653
|
-
setManifestVersion(value) {
|
|
654
|
-
(/** @type {?} */ (this)).manifestVersion = value;
|
|
655
|
-
return (/** @type {?} */ (this));
|
|
656
|
-
}
|
|
657
|
-
/**
|
|
658
|
-
* @template THIS
|
|
659
|
-
* @this {THIS}
|
|
660
|
-
* @param {?} value
|
|
661
|
-
* @return {THIS}
|
|
662
|
-
*/
|
|
663
|
-
setDatabaseSchemaVersion(value) {
|
|
664
|
-
(/** @type {?} */ (this)).databaseSchemaVersion = value;
|
|
665
|
-
return (/** @type {?} */ (this));
|
|
666
|
-
}
|
|
667
|
-
/**
|
|
668
|
-
* @template THIS
|
|
669
|
-
* @this {THIS}
|
|
670
|
-
* @param {?} value
|
|
671
|
-
* @return {THIS}
|
|
672
|
-
*/
|
|
673
|
-
setBasketType(value) {
|
|
674
|
-
(/** @type {?} */ (this)).basketType = value;
|
|
675
|
-
return (/** @type {?} */ (this));
|
|
676
|
-
}
|
|
677
|
-
/**
|
|
678
|
-
* @template THIS
|
|
679
|
-
* @this {THIS}
|
|
680
|
-
* @param {?} value
|
|
681
|
-
* @return {THIS}
|
|
682
|
-
*/
|
|
683
|
-
setTradingRegionID(value) {
|
|
684
|
-
(/** @type {?} */ (this)).tradingRegionId = value;
|
|
685
|
-
return (/** @type {?} */ (this));
|
|
686
|
-
}
|
|
687
|
-
/**
|
|
688
|
-
* @template THIS
|
|
689
|
-
* @this {THIS}
|
|
690
|
-
* @param {?} value
|
|
691
|
-
* @return {THIS}
|
|
692
|
-
*/
|
|
693
|
-
setCompanyID(value) {
|
|
694
|
-
(/** @type {?} */ (this)).companyId = value;
|
|
695
|
-
return (/** @type {?} */ (this));
|
|
696
|
-
}
|
|
697
|
-
/**
|
|
698
|
-
* @template THIS
|
|
699
|
-
* @this {THIS}
|
|
700
|
-
* @param {?} value
|
|
701
|
-
* @return {THIS}
|
|
702
|
-
*/
|
|
703
|
-
setTaxMethodID(value) {
|
|
704
|
-
(/** @type {?} */ (this)).taxMethodId = value;
|
|
705
|
-
return (/** @type {?} */ (this));
|
|
706
|
-
}
|
|
707
|
-
/**
|
|
708
|
-
* @template THIS
|
|
709
|
-
* @this {THIS}
|
|
710
|
-
* @param {?} value
|
|
711
|
-
* @return {THIS}
|
|
712
|
-
*/
|
|
713
|
-
setMajorVersion(value) {
|
|
714
|
-
(/** @type {?} */ (this)).majorVersion = value;
|
|
715
|
-
return (/** @type {?} */ (this));
|
|
716
|
-
}
|
|
717
|
-
/**
|
|
718
|
-
* @template THIS
|
|
719
|
-
* @this {THIS}
|
|
720
|
-
* @param {?} value
|
|
721
|
-
* @return {THIS}
|
|
722
|
-
*/
|
|
723
|
-
setMinorVersion(value) {
|
|
724
|
-
(/** @type {?} */ (this)).minorVersion = value;
|
|
725
|
-
return (/** @type {?} */ (this));
|
|
726
|
-
}
|
|
727
|
-
/**
|
|
728
|
-
* @template THIS
|
|
729
|
-
* @this {THIS}
|
|
730
|
-
* @param {?} value
|
|
731
|
-
* @return {THIS}
|
|
732
|
-
*/
|
|
733
|
-
setXMLSchemaVersion(value) {
|
|
734
|
-
(/** @type {?} */ (this)).xmlSchemaVersion = value;
|
|
735
|
-
return (/** @type {?} */ (this));
|
|
736
|
-
}
|
|
737
|
-
/**
|
|
738
|
-
* @template THIS
|
|
739
|
-
* @this {THIS}
|
|
740
|
-
* @param {?} value
|
|
741
|
-
* @return {THIS}
|
|
742
|
-
*/
|
|
743
|
-
setExternalState(value) {
|
|
744
|
-
(/** @type {?} */ (this)).externalState = value;
|
|
745
|
-
return (/** @type {?} */ (this));
|
|
746
|
-
}
|
|
747
|
-
/**
|
|
748
|
-
* @template THIS
|
|
749
|
-
* @this {THIS}
|
|
750
|
-
* @return {THIS}
|
|
751
|
-
*/
|
|
752
|
-
setCashierID() {
|
|
753
|
-
(/** @type {?} */ (this)).cashierId = ((/** @type {?} */ (this)).transactionDocument && (/** @type {?} */ (this)).transactionDocument.userName) ? (/** @type {?} */ (this)).transactionDocument.userName : '';
|
|
754
|
-
return (/** @type {?} */ (this));
|
|
755
|
-
}
|
|
756
|
-
/**
|
|
757
|
-
* @template THIS
|
|
758
|
-
* @this {THIS}
|
|
759
|
-
* @param {?} value
|
|
760
|
-
* @return {THIS}
|
|
761
|
-
*/
|
|
762
|
-
setTerminalNumber(value) {
|
|
763
|
-
(/** @type {?} */ (this)).terminalNumber = value;
|
|
764
|
-
return (/** @type {?} */ (this));
|
|
765
|
-
}
|
|
766
|
-
/**
|
|
767
|
-
* @template THIS
|
|
768
|
-
* @this {THIS}
|
|
769
|
-
* @param {?} value
|
|
770
|
-
* @return {THIS}
|
|
771
|
-
*/
|
|
772
|
-
setBasketLanguageID(value) {
|
|
773
|
-
(/** @type {?} */ (this)).basketLanguageId = value;
|
|
774
|
-
return (/** @type {?} */ (this));
|
|
775
|
-
}
|
|
776
|
-
/**
|
|
777
|
-
* @template THIS
|
|
778
|
-
* @this {THIS}
|
|
779
|
-
* @param {?} value
|
|
780
|
-
* @return {THIS}
|
|
781
|
-
*/
|
|
782
|
-
setBasketCountryID(value) {
|
|
783
|
-
(/** @type {?} */ (this)).basketCountryId = value;
|
|
784
|
-
return (/** @type {?} */ (this));
|
|
785
|
-
}
|
|
786
|
-
/**
|
|
787
|
-
* @template THIS
|
|
788
|
-
* @this {THIS}
|
|
789
|
-
* @param {?} value
|
|
790
|
-
* @return {THIS}
|
|
791
|
-
*/
|
|
792
|
-
setBasketCurrencyID(value) {
|
|
793
|
-
(/** @type {?} */ (this)).basketCurrencyId = value;
|
|
794
|
-
return (/** @type {?} */ (this));
|
|
795
|
-
}
|
|
796
|
-
/**
|
|
797
|
-
* @template THIS
|
|
798
|
-
* @this {THIS}
|
|
799
|
-
* @param {?} value
|
|
800
|
-
* @return {THIS}
|
|
801
|
-
*/
|
|
802
|
-
setBranchID(value) {
|
|
803
|
-
(/** @type {?} */ (this)).branchId = value;
|
|
804
|
-
return (/** @type {?} */ (this));
|
|
805
|
-
}
|
|
806
|
-
/**
|
|
807
|
-
* @template THIS
|
|
808
|
-
* @this {THIS}
|
|
809
|
-
* @param {?} value
|
|
810
|
-
* @return {THIS}
|
|
811
|
-
*/
|
|
812
|
-
setSalesPersonName(value) {
|
|
813
|
-
(/** @type {?} */ (this)).salesPersonName = value;
|
|
814
|
-
return (/** @type {?} */ (this));
|
|
815
|
-
}
|
|
816
|
-
/**
|
|
817
|
-
* @param {?} date
|
|
818
|
-
* @return {?}
|
|
819
|
-
*/
|
|
820
|
-
generateId(date) {
|
|
821
|
-
/** @type {?} */
|
|
822
|
-
let newDateTime = date.replace(/[^0-9]/g, '');
|
|
823
|
-
/** @type {?} */
|
|
824
|
-
let id = (this.deviceId + '|' + newDateTime + '|' + this.transactionNumber).toString();
|
|
825
|
-
return id;
|
|
826
|
-
}
|
|
827
|
-
/**
|
|
828
|
-
* @param {?} date
|
|
829
|
-
* @return {?}
|
|
830
|
-
*/
|
|
831
|
-
generateTimezoneoffset(date) {
|
|
832
|
-
/** @type {?} */
|
|
833
|
-
let x = date ? date : '';
|
|
834
|
-
return new Date(x).getTimezoneOffset();
|
|
835
|
-
}
|
|
836
|
-
/**
|
|
837
|
-
* @return {?}
|
|
838
|
-
*/
|
|
839
|
-
generateKeyword() {
|
|
840
|
-
/** @type {?} */
|
|
841
|
-
let x = (this.companyId + '|' + this.transactionDocument.storeId + '|' + this.terminalNumber + '|' + this.transactionNumber).toString();
|
|
842
|
-
return x;
|
|
843
|
-
}
|
|
844
|
-
/**
|
|
845
|
-
* @return {?}
|
|
846
|
-
*/
|
|
847
|
-
getState() {
|
|
848
|
-
if (this.transactionDocument.operationStatus === 'PAY_SUCCESS') {
|
|
849
|
-
return 'Completed';
|
|
850
|
-
}
|
|
851
|
-
else {
|
|
852
|
-
return 'Cancelled';
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
/**
|
|
856
|
-
* @param {?} element
|
|
857
|
-
* @param {?} lineDiscount
|
|
858
|
-
* @param {?} transactionDiscount
|
|
859
|
-
* @return {?}
|
|
860
|
-
*/
|
|
861
|
-
returnProduct(element, lineDiscount, transactionDiscount) {
|
|
862
|
-
/** @type {?} */
|
|
863
|
-
let obj = {};
|
|
864
|
-
/** @type {?} */
|
|
865
|
-
let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((/**
|
|
866
|
-
* @param {?} item
|
|
867
|
-
* @return {?}
|
|
868
|
-
*/
|
|
869
|
-
(item) => item.itemLineId == element['itemLineId']));
|
|
870
|
-
obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
871
|
-
obj['LineNumber'] = element['itemLineId'];
|
|
872
|
-
obj['NetValue'] = this.removeDecimal(element['refundedTotal']);
|
|
873
|
-
obj['EffectiveNetValue'] = this.removeDecimal(element['refundedTotal']);
|
|
874
|
-
obj['Description'] = element['description'];
|
|
875
|
-
obj['DeviceID'] = this.transactionDocument['terminalId'];
|
|
876
|
-
obj['UserID'] = this.transactionDocument.userName;
|
|
877
|
-
obj['DateTimeCreated'] = this.createdAt;
|
|
878
|
-
obj['ExtendedValue'] = this.removeDecimal(element['totalLinePrice'] * -1);
|
|
879
|
-
obj['UnitPrice'] = this.removeDecimal(element['price']);
|
|
880
|
-
obj['Quantity'] = this.getQuantity(element);
|
|
881
|
-
obj['OriginalTaxAmountSet'] = 1;
|
|
882
|
-
obj['ProductID'] = element['SKU'];
|
|
883
|
-
obj['HandKeyed'] = 1;
|
|
884
|
-
obj['LongDescription'] = element['description'];
|
|
885
|
-
obj['Return'] = {};
|
|
886
|
-
obj['Return']['ReturnReasonID'] = element['refundedReason'];
|
|
887
|
-
obj['Return']['ReturnDescription'] = element['refundedReasonDescription'];
|
|
888
|
-
obj['Return']['ReturnToStock'] = this.getQuantity(element);
|
|
889
|
-
obj['TaxCode'] = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((/**
|
|
890
|
-
* @param {?} item
|
|
891
|
-
* @return {?}
|
|
892
|
-
*/
|
|
893
|
-
(item) => item.itemLineId == element['itemLineId'])).VATCode;
|
|
894
|
-
obj['DisplayTaxCode'] = ''; // todo
|
|
895
|
-
obj['ProductAttributes'] = ''; //todo - not required
|
|
896
|
-
obj['Perishable'] = this.getMMGROUPID(element.attributes);
|
|
897
|
-
//obj['MMGroupID'] = this.getCaregories(element);
|
|
898
|
-
obj['MMGroupID'] = this.getMMGROUPID(element.attributes);
|
|
899
|
-
obj['CustomerDetails'] = ""; // todo - blank
|
|
900
|
-
obj['TotalPromotionSaving'] = element['promotionAmount'] || -1; // TODO
|
|
901
|
-
obj['OriginalTaxAmount'] = this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT) * -1)).toFixed(2));
|
|
902
|
-
obj['taxAmount'] = this.removeDecimal(taxTotal.taxLineTotal < 0 ? (taxTotal.taxLineTotal) : (-taxTotal.taxLineTotal));
|
|
903
|
-
if (lineDiscount) {
|
|
904
|
-
if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
|
|
905
|
-
// line discount
|
|
906
|
-
obj['Discount'] = {};
|
|
907
|
-
obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
|
|
908
|
-
obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
|
|
909
|
-
obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
|
|
910
|
-
obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
|
|
911
|
-
obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
|
|
912
|
-
obj['Discount'].DiscountType = lineDiscount.discountType;
|
|
913
|
-
obj['Discount'].XMLSchemaVersion = 1;
|
|
914
|
-
obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
|
|
915
|
-
obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
|
|
916
|
-
obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
|
|
917
|
-
obj['Discount'].RoundingRule = 2;
|
|
918
|
-
}
|
|
919
|
-
if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
|
|
920
|
-
//price override
|
|
921
|
-
obj['PriceOverride'] = {};
|
|
922
|
-
obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
|
|
923
|
-
obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
|
|
924
|
-
obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
|
|
925
|
-
obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
|
|
926
|
-
obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
|
|
927
|
-
obj['PriceOverride'].XMLSchemaVersion = 1;
|
|
928
|
-
obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
|
|
929
|
-
obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
|
|
930
|
-
}
|
|
931
|
-
//update the product price
|
|
932
|
-
obj.NetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
|
|
933
|
-
obj.EffectiveNetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
|
|
934
|
-
obj.ExtendedValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
|
|
935
|
-
obj.UnitPrice = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
|
|
936
|
-
}
|
|
937
|
-
if (transactionDiscount) {
|
|
938
|
-
obj['BasketDiscountModifier'] = [];
|
|
939
|
-
this.transactionDocument.basket.transactionDiscount.forEach((/**
|
|
940
|
-
* @param {?} e
|
|
941
|
-
* @return {?}
|
|
942
|
-
*/
|
|
943
|
-
(e) => {
|
|
944
|
-
/** @type {?} */
|
|
945
|
-
let discountObj = {};
|
|
946
|
-
e.itemLineIds.forEach((/**
|
|
947
|
-
* @param {?} x
|
|
948
|
-
* @return {?}
|
|
949
|
-
*/
|
|
950
|
-
(x) => {
|
|
951
|
-
if (x == element.itemLineId) {
|
|
952
|
-
/** @type {?} */
|
|
953
|
-
var discountAmount = this.convertToString(e.discountAmount * -1);
|
|
954
|
-
discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
|
|
955
|
-
discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
|
|
956
|
-
discountObj.DiscountedValue = this.getDiscountedValue(element.totalLinePrice, e.discountAmount);
|
|
957
|
-
obj['BasketDiscountModifier'].push(discountObj);
|
|
958
|
-
}
|
|
959
|
-
}));
|
|
960
|
-
}));
|
|
961
|
-
/** @type {?} */
|
|
962
|
-
var totaltransactionDiscount = 0;
|
|
963
|
-
obj['BasketDiscountModifier'].forEach((/**
|
|
964
|
-
* @param {?} value
|
|
965
|
-
* @return {?}
|
|
966
|
-
*/
|
|
967
|
-
(value) => {
|
|
968
|
-
totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
|
|
969
|
-
}));
|
|
970
|
-
//update the product price
|
|
971
|
-
obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
|
|
972
|
-
}
|
|
973
|
-
if (this.transactionDocument.basket.transactionPromotion.length > 0) {
|
|
974
|
-
obj['PromotionSaving'] = [];
|
|
975
|
-
this.transactionDocument.basket.transactionPromotion.forEach((/**
|
|
976
|
-
* @param {?} transactionPromo
|
|
977
|
-
* @return {?}
|
|
978
|
-
*/
|
|
979
|
-
(transactionPromo) => {
|
|
980
|
-
/** @type {?} */
|
|
981
|
-
let promotionObj = {};
|
|
982
|
-
transactionPromo.itemLineIds.forEach((/**
|
|
983
|
-
* @param {?} itemLineId
|
|
984
|
-
* @return {?}
|
|
985
|
-
*/
|
|
986
|
-
(itemLineId) => {
|
|
987
|
-
if (itemLineId == element.itemLineId) {
|
|
988
|
-
promotionObj.ModifierValue = transactionPromo.promotionAmount;
|
|
989
|
-
promotionObj.ModifierDateTime = this.transactionDocument.createdAt;
|
|
990
|
-
promotionObj.ModifierDescription = transactionPromo.displayText;
|
|
991
|
-
promotionObj.XMLSchemaVersion = this.xmlSchemaVersion;
|
|
992
|
-
promotionObj.PromotionID = transactionPromo.promotionId;
|
|
993
|
-
promotionObj.PromotionDescription = transactionPromo.displayText;
|
|
994
|
-
promotionObj.HitNumber = '1';
|
|
995
|
-
promotionObj.PromotionHitProductQuantity = this.getQuantity(element);
|
|
996
|
-
promotionObj.PromotionHitQuantity = this.getQuantity(element) * -1;
|
|
997
|
-
obj['PromotionSaving'].push(promotionObj);
|
|
998
|
-
}
|
|
999
|
-
}));
|
|
1000
|
-
}));
|
|
1001
|
-
}
|
|
1002
|
-
return obj;
|
|
1003
|
-
}
|
|
1004
|
-
/**
|
|
1005
|
-
* @param {?} element
|
|
1006
|
-
* @param {?} lineDiscount
|
|
1007
|
-
* @param {?} transactionDiscount
|
|
1008
|
-
* @return {?}
|
|
1009
|
-
*/
|
|
1010
|
-
addProduct(element, lineDiscount, transactionDiscount) {
|
|
1011
|
-
/** @type {?} */
|
|
1012
|
-
let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((/**
|
|
1013
|
-
* @param {?} item
|
|
1014
|
-
* @return {?}
|
|
1015
|
-
*/
|
|
1016
|
-
(item) => item.itemLineId == element['itemLineId']));
|
|
1017
|
-
/** @type {?} */
|
|
1018
|
-
let obj = {
|
|
1019
|
-
XMLSchemaVersion: this.xmlSchemaVersion,
|
|
1020
|
-
LineNumber: element.itemLineId,
|
|
1021
|
-
NetValue: this.removeDecimal(element.totalLinePrice),
|
|
1022
|
-
EffectiveNetValue: this.removeDecimal(element.totalLinePrice),
|
|
1023
|
-
Description: element.description,
|
|
1024
|
-
DeviceID: this.deviceId,
|
|
1025
|
-
UserID: this.transactionDocument.userName,
|
|
1026
|
-
DateTimeCreated: this.createdAt,
|
|
1027
|
-
ExtendedValue: this.removeDecimal(element.price),
|
|
1028
|
-
UnitPrice: this.removeDecimal(element.price),
|
|
1029
|
-
//MMGroupID: this.getCaregories(element),
|
|
1030
|
-
Quantity: element.quantity,
|
|
1031
|
-
SalespersonID: this.transactionDocument.userName,
|
|
1032
|
-
SalespersonName: this.salesPersonName,
|
|
1033
|
-
TaxCode: this.transactionDocument.basket['taxBreakdown']['taxLines'].find((/**
|
|
1034
|
-
* @param {?} item
|
|
1035
|
-
* @return {?}
|
|
1036
|
-
*/
|
|
1037
|
-
(item) => item.itemLineId == element['itemLineId'])).VATCode,
|
|
1038
|
-
TaxModifiable: "1",
|
|
1039
|
-
//todo
|
|
1040
|
-
OriginalTaxAmount: this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT)).toFixed(2))),
|
|
1041
|
-
TaxAmount: this.convertToString(this.removeDecimal(taxTotal.taxLineTotal)),
|
|
1042
|
-
OriginalTaxAmountSet: "1",
|
|
1043
|
-
//todo
|
|
1044
|
-
ProductID: element.SKU,
|
|
1045
|
-
HandKeyed: "1",
|
|
1046
|
-
//todo
|
|
1047
|
-
CustomerDetails: "",
|
|
1048
|
-
Perishable: this.getMMGROUPID(element.attributes),
|
|
1049
|
-
MMGroupID: this.getMMGROUPID(element.attributes)
|
|
1050
|
-
};
|
|
1051
|
-
if (lineDiscount) {
|
|
1052
|
-
if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
|
|
1053
|
-
// line discount
|
|
1054
|
-
obj['Discount'] = {};
|
|
1055
|
-
obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
|
|
1056
|
-
obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
|
|
1057
|
-
obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
|
|
1058
|
-
obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
|
|
1059
|
-
obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
|
|
1060
|
-
obj['Discount'].DiscountType = lineDiscount.discountType;
|
|
1061
|
-
obj['Discount'].XMLSchemaVersion = 1;
|
|
1062
|
-
obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
|
|
1063
|
-
obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
|
|
1064
|
-
obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
|
|
1065
|
-
obj['Discount'].RoundingRule = 2;
|
|
1066
|
-
}
|
|
1067
|
-
if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
|
|
1068
|
-
//price override
|
|
1069
|
-
obj['PriceOverride'] = {};
|
|
1070
|
-
obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
|
|
1071
|
-
obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
|
|
1072
|
-
obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
|
|
1073
|
-
obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
|
|
1074
|
-
obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
|
|
1075
|
-
obj['PriceOverride'].XMLSchemaVersion = this.xmlSchemaVersion;
|
|
1076
|
-
obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
|
|
1077
|
-
obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
|
|
1078
|
-
}
|
|
1079
|
-
//update the product price
|
|
1080
|
-
obj['NetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
|
|
1081
|
-
obj['EffectiveNetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
|
|
1082
|
-
obj['ExtendedValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
|
|
1083
|
-
obj['UnitPrice'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
|
|
1084
|
-
}
|
|
1085
|
-
if (transactionDiscount) {
|
|
1086
|
-
obj['BasketDiscountModifier'] = [];
|
|
1087
|
-
this.transactionDocument.basket.transactionDiscount.forEach((/**
|
|
1088
|
-
* @param {?} e
|
|
1089
|
-
* @return {?}
|
|
1090
|
-
*/
|
|
1091
|
-
(e) => {
|
|
1092
|
-
/** @type {?} */
|
|
1093
|
-
let discountObj = {};
|
|
1094
|
-
e.itemLineIds.forEach((/**
|
|
1095
|
-
* @param {?} itemLineId
|
|
1096
|
-
* @return {?}
|
|
1097
|
-
*/
|
|
1098
|
-
(itemLineId) => {
|
|
1099
|
-
if (itemLineId == element.itemLineId) {
|
|
1100
|
-
/** @type {?} */
|
|
1101
|
-
let discountAmount = this.convertToString(e.discountAmount * -1);
|
|
1102
|
-
discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
|
|
1103
|
-
discountObj.DiscountedValue = -(this.getDiscountedValue(element.totalLinePrice, e.discountAmount));
|
|
1104
|
-
discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
|
|
1105
|
-
obj['BasketDiscountModifier'].push(discountObj);
|
|
1106
|
-
}
|
|
1107
|
-
}));
|
|
1108
|
-
}));
|
|
1109
|
-
/** @type {?} */
|
|
1110
|
-
let totaltransactionDiscount = 0;
|
|
1111
|
-
obj['BasketDiscountModifier'].forEach((/**
|
|
1112
|
-
* @param {?} value
|
|
1113
|
-
* @return {?}
|
|
1114
|
-
*/
|
|
1115
|
-
(value) => {
|
|
1116
|
-
totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
|
|
1117
|
-
}));
|
|
1118
|
-
//update the product price
|
|
1119
|
-
obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
|
|
1120
|
-
}
|
|
1121
|
-
if (this.transactionDocument.basket.transactionPromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
|
|
1122
|
-
obj['DistributedPromotionSaving'] = [];
|
|
1123
|
-
if (this.transactionDocument.basket.transactionPromotion.length > 0) {
|
|
1124
|
-
this.transactionDocument.basket.transactionPromotion.forEach((/**
|
|
1125
|
-
* @param {?} e
|
|
1126
|
-
* @return {?}
|
|
1127
|
-
*/
|
|
1128
|
-
(e) => {
|
|
1129
|
-
/** @type {?} */
|
|
1130
|
-
let promotionObj = {};
|
|
1131
|
-
e.itemLineIds.forEach((/**
|
|
1132
|
-
* @param {?} itemLineId
|
|
1133
|
-
* @return {?}
|
|
1134
|
-
*/
|
|
1135
|
-
(itemLineId) => {
|
|
1136
|
-
if (itemLineId == element.itemLineId) {
|
|
1137
|
-
promotionObj.PromotionID = e.promotionId;
|
|
1138
|
-
promotionObj.Hit = '1';
|
|
1139
|
-
promotionObj.Saving = this.getSaving(element.totalLinePrice, e.promotionAmount);
|
|
1140
|
-
promotionObj.ISaving = this.getSaving(element.totalLinePrice, e.promotionAmount);
|
|
1141
|
-
obj['DistributedPromotionSaving'].push(promotionObj);
|
|
1142
|
-
}
|
|
1143
|
-
}));
|
|
1144
|
-
}));
|
|
1145
|
-
}
|
|
1146
|
-
if (this.transactionDocument.basket.linePromotion.length > 0) {
|
|
1147
|
-
this.transactionDocument.basket.linePromotion.forEach((/**
|
|
1148
|
-
* @param {?} linePromotion
|
|
1149
|
-
* @return {?}
|
|
1150
|
-
*/
|
|
1151
|
-
(linePromotion) => {
|
|
1152
|
-
/** @type {?} */
|
|
1153
|
-
let promotionObj = {};
|
|
1154
|
-
if (element.itemLineId == linePromotion.itemLineId) {
|
|
1155
|
-
promotionObj.PromotionID = linePromotion.promotionId;
|
|
1156
|
-
promotionObj.Hit = "1";
|
|
1157
|
-
promotionObj.Saving = linePromotion.promotionLinePrice;
|
|
1158
|
-
promotionObj.ISaving = linePromotion.promotionLinePrice;
|
|
1159
|
-
obj['DistributedPromotionSaving'].push(promotionObj);
|
|
1160
|
-
}
|
|
1161
|
-
}));
|
|
1162
|
-
}
|
|
1163
|
-
/** @type {?} */
|
|
1164
|
-
let transactionPromotion = 0;
|
|
1165
|
-
obj['DistributedPromotionSaving'].forEach((/**
|
|
1166
|
-
* @param {?} value
|
|
1167
|
-
* @return {?}
|
|
1168
|
-
*/
|
|
1169
|
-
(value) => {
|
|
1170
|
-
transactionPromotion = transactionPromotion + value.Saving;
|
|
1171
|
-
}));
|
|
1172
|
-
obj['EffectiveNetValue'] = obj.EffectiveNetValue + transactionPromotion;
|
|
1173
|
-
}
|
|
1174
|
-
return obj;
|
|
1175
|
-
}
|
|
1176
|
-
/**
|
|
1177
|
-
* @param {?} price
|
|
1178
|
-
* @param {?} promotionAmount
|
|
1179
|
-
* @return {?}
|
|
1180
|
-
*/
|
|
1181
|
-
getSaving(price, promotionAmount) {
|
|
1182
|
-
/** @type {?} */
|
|
1183
|
-
let Saving = (price * promotionAmount) / this.transactionDocument.basketSummary.saleTotal;
|
|
1184
|
-
return Saving;
|
|
1185
|
-
}
|
|
1186
|
-
/**
|
|
1187
|
-
* @param {?} value
|
|
1188
|
-
* @param {?} discountAmount
|
|
1189
|
-
* @return {?}
|
|
1190
|
-
*/
|
|
1191
|
-
getLineNumber(value, discountAmount) {
|
|
1192
|
-
/** @type {?} */
|
|
1193
|
-
let lineNumber;
|
|
1194
|
-
for (let i = 0; i < this.rjObject['BasketDiscount'].length; i++) {
|
|
1195
|
-
/** @type {?} */
|
|
1196
|
-
const element = this.rjObject['BasketDiscount'][i];
|
|
1197
|
-
if (value.reasonCode === element.ReasonCodeID && discountAmount === element.NetValue) {
|
|
1198
|
-
lineNumber = element.LineNumber;
|
|
1199
|
-
break;
|
|
1200
|
-
}
|
|
1201
|
-
}
|
|
1202
|
-
return lineNumber;
|
|
1203
|
-
}
|
|
1204
|
-
/**
|
|
1205
|
-
* @param {?} price
|
|
1206
|
-
* @param {?} discountAmount
|
|
1207
|
-
* @return {?}
|
|
1208
|
-
*/
|
|
1209
|
-
getDiscountedValue(price, discountAmount) {
|
|
1210
|
-
/** @type {?} */
|
|
1211
|
-
let DiscountedValue = ((price * discountAmount) / this.transactionDocument.basketSummary.saleTotal) * 100;
|
|
1212
|
-
return DiscountedValue;
|
|
1213
|
-
}
|
|
1214
|
-
/**
|
|
1215
|
-
* @param {?} element
|
|
1216
|
-
* @param {?} VAT
|
|
1217
|
-
* @return {?}
|
|
1218
|
-
*/
|
|
1219
|
-
getOriginalTax(element, VAT) {
|
|
1220
|
-
/** @type {?} */
|
|
1221
|
-
let pricebeforetax = (element.price * 100) / (100 + VAT);
|
|
1222
|
-
/** @type {?} */
|
|
1223
|
-
let originaltax = element.price - pricebeforetax;
|
|
1224
|
-
return originaltax;
|
|
1225
|
-
}
|
|
1226
|
-
/**
|
|
1227
|
-
* @param {?} value
|
|
1228
|
-
* @return {?}
|
|
1229
|
-
*/
|
|
1230
|
-
convertToString(value) {
|
|
1231
|
-
try {
|
|
1232
|
-
value = JSON.stringify(value);
|
|
1233
|
-
return value;
|
|
1234
|
-
}
|
|
1235
|
-
catch (e) {
|
|
1236
|
-
console.log(value, 'can not be converted in string', e);
|
|
1237
|
-
}
|
|
1238
|
-
}
|
|
1239
|
-
/**
|
|
1240
|
-
* @return {?}
|
|
1241
|
-
*/
|
|
1242
|
-
generateDynamicStockLookUp() {
|
|
1243
|
-
/** @type {?} */
|
|
1244
|
-
let x = '0';
|
|
1245
|
-
this.transactionDocument.basket.products.forEach((/**
|
|
1246
|
-
* @param {?} element
|
|
1247
|
-
* @return {?}
|
|
1248
|
-
*/
|
|
1249
|
-
(element) => {
|
|
1250
|
-
if (element.deliveryMethod === '1' || element.deliveryMethod === '2') {
|
|
1251
|
-
x = '1';
|
|
1252
|
-
}
|
|
1253
|
-
}));
|
|
1254
|
-
return x;
|
|
1255
|
-
}
|
|
1256
|
-
// getAttributes(){
|
|
1257
|
-
// let name: string | any[] = []
|
|
1258
|
-
// this.transactionDocument.basket.products.forEach((element: any) => {
|
|
1259
|
-
// if (element && element.attributes && element.attributes.length > 0) {
|
|
1260
|
-
// name = element.attributes.filter((x: any) => x.name.toUpperCase() === element.name.toUpperCase());
|
|
1261
|
-
// }
|
|
1262
|
-
// });
|
|
1263
|
-
// if (name.length > 0) {
|
|
1264
|
-
// return name[0].value
|
|
1265
|
-
// }
|
|
1266
|
-
// else{
|
|
1267
|
-
// return ""
|
|
1268
|
-
// }
|
|
1269
|
-
// }
|
|
1270
|
-
// getCaregories(element) {
|
|
1271
|
-
// let MMGroupId = " ";
|
|
1272
|
-
// if (element.categories && element.categories.length > 0) {
|
|
1273
|
-
// let categories = element.categories.filter((x) => x.parentId != '');
|
|
1274
|
-
// let value = categories.filter((x) => x.id != x.parentId);
|
|
1275
|
-
// MMGroupId = value[0].name;
|
|
1276
|
-
// }
|
|
1277
|
-
// return MMGroupId;
|
|
1278
|
-
// }
|
|
1279
|
-
/**
|
|
1280
|
-
* @param {?} date
|
|
1281
|
-
* @return {?}
|
|
1282
|
-
*/
|
|
1283
|
-
getDate(date) {
|
|
1284
|
-
/** @type {?} */
|
|
1285
|
-
let offset = this.generateTimezoneoffset(date) * -1;
|
|
1286
|
-
/** @type {?} */
|
|
1287
|
-
let offsetHours = Math.abs(Math.floor(offset / 60));
|
|
1288
|
-
/** @type {?} */
|
|
1289
|
-
let offsetMinutes = Math.abs(offset) - offsetHours * 60;
|
|
1290
|
-
/** @type {?} */
|
|
1291
|
-
let offsetSign = '+';
|
|
1292
|
-
if (offset < 0) {
|
|
1293
|
-
offsetSign = '-';
|
|
1294
|
-
}
|
|
1295
|
-
/** @type {?} */
|
|
1296
|
-
let newdate = date.substring(0, 19);
|
|
1297
|
-
/** @type {?} */
|
|
1298
|
-
const x = (newdate + offsetSign + String(offsetHours).padStart(2, '0') + ':' + String(offsetMinutes).padStart(2, '0')).toString();
|
|
1299
|
-
return x;
|
|
1300
|
-
}
|
|
1301
|
-
/**
|
|
1302
|
-
* @param {?} transactionPromotion
|
|
1303
|
-
* @return {?}
|
|
1304
|
-
*/
|
|
1305
|
-
getTransactionPromotion(transactionPromotion) {
|
|
1306
|
-
if (transactionPromotion && transactionPromotion.length > 0) {
|
|
1307
|
-
this.rjObject['PromoVoucherItem'] = {};
|
|
1308
|
-
this.rjObject['PromoVoucherItem']['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
1309
|
-
this.rjObject['PromoVoucherItem']['LineNumber'] = this.generateLineNumber();
|
|
1310
|
-
this.rjObject['PromoVoucherItem']['NetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
|
|
1311
|
-
this.rjObject['PromoVoucherItem']['EffectiveNetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
|
|
1312
|
-
this.rjObject['PromoVoucherItem']['Description'] = transactionPromotion[0].promotionInfo;
|
|
1313
|
-
this.rjObject['PromoVoucherItem']['DeviceID'] = this.deviceId;
|
|
1314
|
-
this.rjObject['PromoVoucherItem']['UserID'] = this.transactionDocument.userName;
|
|
1315
|
-
this.rjObject['PromoVoucherItem']['DateTimeCreated'] = this.createdAt;
|
|
1316
|
-
this.rjObject['PromoVoucherItem']['ProductId'] = ""; //todo
|
|
1317
|
-
this.rjObject['PromoVoucherItem']['SerialNumber'] = ""; //todo
|
|
1318
|
-
this.rjObject['PromoVoucherItem']['MMGroupId'] = "";
|
|
1319
|
-
}
|
|
1320
|
-
}
|
|
1321
|
-
/**
|
|
1322
|
-
* @param {?} element
|
|
1323
|
-
* @return {?}
|
|
1324
|
-
*/
|
|
1325
|
-
getQuantity(element) {
|
|
1326
|
-
/** @type {?} */
|
|
1327
|
-
let quantity;
|
|
1328
|
-
if (this.transactionDocument.unreferencedRefund) {
|
|
1329
|
-
quantity = element['quantity'] < 0 ? element['quantity'] : (-element['quantity']);
|
|
1330
|
-
}
|
|
1331
|
-
else {
|
|
1332
|
-
quantity = element['refundedQuantity'] < 0 ? element['refundedQuantity'] : (-element['refundedQuantity']);
|
|
1333
|
-
}
|
|
1334
|
-
return quantity;
|
|
1335
|
-
}
|
|
1336
|
-
}
|
|
1337
|
-
if (false) {
|
|
1338
|
-
/**
|
|
1339
|
-
* @type {?}
|
|
1340
|
-
* @private
|
|
1341
|
-
*/
|
|
1342
|
-
RJMapperBuilderClass.prototype.transactionDocument;
|
|
1343
|
-
/**
|
|
1344
|
-
* @type {?}
|
|
1345
|
-
* @private
|
|
1346
|
-
*/
|
|
1347
|
-
RJMapperBuilderClass.prototype.deviceId;
|
|
1348
|
-
/**
|
|
1349
|
-
* @type {?}
|
|
1350
|
-
* @private
|
|
1351
|
-
*/
|
|
1352
|
-
RJMapperBuilderClass.prototype.transactionNumber;
|
|
1353
|
-
/**
|
|
1354
|
-
* @type {?}
|
|
1355
|
-
* @private
|
|
1356
|
-
*/
|
|
1357
|
-
RJMapperBuilderClass.prototype.manifestVersion;
|
|
1358
|
-
/**
|
|
1359
|
-
* @type {?}
|
|
1360
|
-
* @private
|
|
1361
|
-
*/
|
|
1362
|
-
RJMapperBuilderClass.prototype.databaseSchemaVersion;
|
|
1363
|
-
/**
|
|
1364
|
-
* @type {?}
|
|
1365
|
-
* @private
|
|
1366
|
-
*/
|
|
1367
|
-
RJMapperBuilderClass.prototype.basketType;
|
|
1368
|
-
/**
|
|
1369
|
-
* @type {?}
|
|
1370
|
-
* @private
|
|
1371
|
-
*/
|
|
1372
|
-
RJMapperBuilderClass.prototype.xmlSchemaVersion;
|
|
1373
|
-
/**
|
|
1374
|
-
* @type {?}
|
|
1375
|
-
* @private
|
|
1376
|
-
*/
|
|
1377
|
-
RJMapperBuilderClass.prototype.majorVersion;
|
|
1378
|
-
/**
|
|
1379
|
-
* @type {?}
|
|
1380
|
-
* @private
|
|
1381
|
-
*/
|
|
1382
|
-
RJMapperBuilderClass.prototype.minorVersion;
|
|
1383
|
-
/**
|
|
1384
|
-
* @type {?}
|
|
1385
|
-
* @private
|
|
1386
|
-
*/
|
|
1387
|
-
RJMapperBuilderClass.prototype.externalState;
|
|
1388
|
-
/**
|
|
1389
|
-
* @type {?}
|
|
1390
|
-
* @private
|
|
1391
|
-
*/
|
|
1392
|
-
RJMapperBuilderClass.prototype.cashierId;
|
|
1393
|
-
/**
|
|
1394
|
-
* @type {?}
|
|
1395
|
-
* @private
|
|
1396
|
-
*/
|
|
1397
|
-
RJMapperBuilderClass.prototype.companyId;
|
|
1398
|
-
/**
|
|
1399
|
-
* @type {?}
|
|
1400
|
-
* @private
|
|
1401
|
-
*/
|
|
1402
|
-
RJMapperBuilderClass.prototype.terminalNumber;
|
|
1403
|
-
/**
|
|
1404
|
-
* @type {?}
|
|
1405
|
-
* @private
|
|
1406
|
-
*/
|
|
1407
|
-
RJMapperBuilderClass.prototype.taxMethodId;
|
|
1408
|
-
/**
|
|
1409
|
-
* @type {?}
|
|
1410
|
-
* @private
|
|
1411
|
-
*/
|
|
1412
|
-
RJMapperBuilderClass.prototype.tradingRegionId;
|
|
1413
|
-
/**
|
|
1414
|
-
* @type {?}
|
|
1415
|
-
* @private
|
|
1416
|
-
*/
|
|
1417
|
-
RJMapperBuilderClass.prototype.basketCurrencyId;
|
|
1418
|
-
/**
|
|
1419
|
-
* @type {?}
|
|
1420
|
-
* @private
|
|
1421
|
-
*/
|
|
1422
|
-
RJMapperBuilderClass.prototype.basketCountryId;
|
|
1423
|
-
/**
|
|
1424
|
-
* @type {?}
|
|
1425
|
-
* @private
|
|
1426
|
-
*/
|
|
1427
|
-
RJMapperBuilderClass.prototype.basketLanguageId;
|
|
1428
|
-
/**
|
|
1429
|
-
* @type {?}
|
|
1430
|
-
* @private
|
|
1431
|
-
*/
|
|
1432
|
-
RJMapperBuilderClass.prototype.itemCount;
|
|
1433
|
-
/**
|
|
1434
|
-
* @type {?}
|
|
1435
|
-
* @private
|
|
1436
|
-
*/
|
|
1437
|
-
RJMapperBuilderClass.prototype.largestNumber;
|
|
1438
|
-
/**
|
|
1439
|
-
* @type {?}
|
|
1440
|
-
* @private
|
|
1441
|
-
*/
|
|
1442
|
-
RJMapperBuilderClass.prototype.branchId;
|
|
1443
|
-
/**
|
|
1444
|
-
* @type {?}
|
|
1445
|
-
* @private
|
|
1446
|
-
*/
|
|
1447
|
-
RJMapperBuilderClass.prototype.createdAt;
|
|
1448
|
-
/**
|
|
1449
|
-
* @type {?}
|
|
1450
|
-
* @private
|
|
1451
|
-
*/
|
|
1452
|
-
RJMapperBuilderClass.prototype.updatedAt;
|
|
1453
|
-
/**
|
|
1454
|
-
* @type {?}
|
|
1455
|
-
* @private
|
|
1456
|
-
*/
|
|
1457
|
-
RJMapperBuilderClass.prototype.salesPersonName;
|
|
1458
|
-
/**
|
|
1459
|
-
* @type {?}
|
|
1460
|
-
* @private
|
|
1461
|
-
*/
|
|
1462
|
-
RJMapperBuilderClass.prototype.rjObject;
|
|
1463
|
-
}
|
|
1464
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkotbWFwcGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHBtY3JldGFpbC9tYXBwZXItbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9SSi1tYXBwZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFvRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3pJLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE1BQU0sT0FBTyxvQkFBb0I7Ozs7SUE0QjdCLFlBQVksY0FBb0M7UUFSeEMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBS2xCLGFBQVEsR0FBUSxFQUFFLENBQUE7UUFHdEIsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztTQUM3QzthQUFNO1lBQ0gsSUFBSSxDQUFDLG1CQUFtQixHQUFHO2dCQUN2QixhQUFhLEVBQUUsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsRUFBRTtnQkFDeEIsY0FBYyxFQUFFLEVBQUU7Z0JBQ2xCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLE9BQU8sRUFBRSxFQUFFO2dCQUNYLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFdBQVcsRUFBRSxFQUFFO2dCQUNmLGtCQUFrQixFQUFFLEVBQUU7Z0JBQ3RCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFVBQVUsRUFBRSxFQUFFO2dCQUNkLE1BQU0sRUFBRSxFQUFFO2dCQUNWLGdCQUFnQixFQUFFLFNBQVM7Z0JBQzNCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxtQkFBQSxFQUFFLEVBQU87Z0JBQ2pCLGFBQWEsRUFBRSxtQkFBQSxFQUFFLEVBQU87Z0JBQ3hCLFlBQVksRUFBRSxFQUFFO2dCQUNoQixJQUFJLEVBQUUsRUFBRTtnQkFDUixlQUFlLEVBQUUsRUFBRTtnQkFDbkIsU0FBUyxF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Ozs7SUFDakQsd0NBQXNCOzs7OztJQUN0QixpREFBK0I7Ozs7O0lBQy9CLCtDQUE2Qjs7Ozs7SUFDN0IscURBQW1DOzs7OztJQUNuQywwQ0FBd0I7Ozs7O0lBQ3hCLGdEQUE4Qjs7Ozs7SUFDOUIsNENBQTBCOzs7OztJQUMxQiw0Q0FBMEI7Ozs7O0lBQzFCLDZDQUEyQjs7Ozs7SUFDM0IseUNBQXVCOzs7OztJQUN2Qix5Q0FBdUI7Ozs7O0lBQ3ZCLDhDQUE0Qjs7Ozs7SUFDNUIsMkNBQXlCOzs7OztJQUN6QiwrQ0FBNkI7Ozs7O0lBQzdCLGdEQUE4Qjs7Ozs7SUFDOUIsK0NBQTZCOzs7OztJQUM3QixnREFBOEI7Ozs7O0lBQzlCLHlDQUFzQjs7Ozs7SUFDdEIsNkNBQTBCOzs7OztJQUMxQix3Q0FBc0I7Ozs7O0lBQ3RCLHlDQUF1Qjs7Ozs7SUFDdkIseUNBQXVCOzs7OztJQUN2QiwrQ0FBNkI7Ozs7O0lBQzdCLHdDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERJU0NPVU5UVFlQRSwgTGluZURpc2NvdW50LCBUUHJvZHVjdCwgVHJhbnNhY3Rpb25EaXNjb3VudCwgVHJhbnNhY3Rpb25Eb2N1bWVudCwgVFJBTlNBQ1RJT05fVFlQRSB9IGZyb20gXCIuL21hcHBlci1saWJyYXJ5Lm1vZGVsXCJcclxuaW1wb3J0IHsgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgfSBmcm9tIFwiLi9UcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlclwiO1xyXG5leHBvcnQgY2xhc3MgUkpNYXBwZXJCdWlsZGVyQ2xhc3Mge1xyXG5cclxuICAgIHByaXZhdGUgdHJhbnNhY3Rpb25Eb2N1bWVudDogVHJhbnNhY3Rpb25Eb2N1bWVudDtcclxuICAgIHByaXZhdGUgZGV2aWNlSWQ6IGFueTtcclxuICAgIHByaXZhdGUgdHJhbnNhY3Rpb25OdW1iZXI6IGFueTtcclxuICAgIHByaXZhdGUgbWFuaWZlc3RWZXJzaW9uOiBhbnk7XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlU2NoZW1hVmVyc2lvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBiYXNrZXRUeXBlOiBhbnk7XHJcbiAgICBwcml2YXRlIHhtbFNjaGVtYVZlcnNpb246IGFueTtcclxuICAgIHByaXZhdGUgbWFqb3JWZXJzaW9uOiBhbnk7XHJcbiAgICBwcml2YXRlIG1pbm9yVmVyc2lvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBleHRlcm5hbFN0YXRlOiBhbnk7XHJcbiAgICBwcml2YXRlIGNhc2hpZXJJZDogYW55O1xyXG4gICAgcHJpdmF0ZSBjb21wYW55SWQ6IGFueTtcclxuICAgIHByaXZhdGUgdGVybWluYWxOdW1iZXI6IGFueTtcclxuICAgIHByaXZhdGUgdGF4TWV0aG9kSWQ6IGFueTtcclxuICAgIHByaXZhdGUgdHJhZGluZ1JlZ2lvbklkOiBhbnk7XHJcbiAgICBwcml2YXRlIGJhc2tldEN1cnJlbmN5SWQ6IGFueTtcclxuICAgIHByaXZhdGUgYmFza2V0Q291bnRyeUlkOiBhbnk7XHJcbiAgICBwcml2YXRlIGJhc2tldExhbmd1YWdlSWQ6IGFueTtcclxuICAgIHByaXZhdGUgaXRlbUNvdW50ID0gMDtcclxuICAgIHByaXZhdGUgbGFyZ2VzdE51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGJyYW5jaElkOiBhbnk7XHJcbiAgICBwcml2YXRlIGNyZWF0ZWRBdDogYW55O1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVkQXQgOmFueTtcclxuICAgIHByaXZhdGUgc2FsZXNQZXJzb25OYW1lOiBhbnk7XHJcbiAgICBwcml2YXRlIHJqT2JqZWN0OiBhbnkgPSB7fVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHRyYW5zYWN0aW9uRG9jPzogVHJhbnNhY3Rpb25Eb2N1bWVudCkge1xyXG4gICAgICAgIGlmICh0cmFuc2FjdGlvbkRvYykge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgPSB0cmFuc2FjdGlvbkRvYztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgPSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgb2ZmbGluZVRyYW5zYWN0aW9uSWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblJlZjogXCJcIixcclxuICAgICAgICAgICAgICAgIGRhdGVUaW1lOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgb3JnQ29kZTogXCJcIixcclxuICAgICAgICAgICAgICAgIHN0b3JlSWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBzdG9yZU5vZGVJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcclxuICAgICAgICAgICAgICAgIGRldmljZUlkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgdGVybWluYWxJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIHVzZXJJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIGluaXRpYXRpbmdNb2R1bGU6IFwiZUJhc2tldFwiLFxyXG4gICAgICAgICAgICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGJhc2tldDoge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgYmFza2V0U3VtbWFyeToge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgYmFzZUN1cnJlbmN5OiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJcIixcclxuICAgICAgICAgICAgICAgIG9wZXJhdGlvblN0YXR1czogXCJcIixcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogXCJcIixcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogXCJcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsczoge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgc2FsZVRvdGFsOiAwLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRpbGl6ZUl0ZW1Db3VudCgpO1xyXG4gICAgICAgIHRoaXMuc2V0TGluZU51bWJlckZvclByb2R1Y3RzKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSB0aGlzLmdldERhdGUodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXQgPSB0aGlzLmdldERhdGUodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVwZGF0ZWRBdCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UG9zYmFza2V0SW5mbygpIHtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydLZXl3b3JkJ10gPSB0aGlzLmdlbmVyYXRlS2V5d29yZCgpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0lEJ10gPSB0aGlzLmdlbmVyYXRlSWQodGhpcy5jcmVhdGVkQXQpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ1hNTFNjaGVtYVZlcnNpb24nXSA9ICcyJztcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydMYXN0VXBkYXRlZCddID0gdGhpcy51cGRhdGVkQXQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWFqb3JWZXJzaW9uJ10gPSB0aGlzLm1ham9yVmVyc2lvbjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydNaW5vclZlcnNpb24nXSA9IHRoaXMubWlub3JWZXJzaW9uO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ01hbmlmZXN0VmVyc2lvbiddID0gdGhpcy5tYW5pZmVzdFZlcnNpb247XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnRGF0YWJhc2VTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLmRhdGFiYXNlU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydCYXNrZXRUeXBlJ10gPSB0aGlzLmJhc2tldFR5cGU7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnU3RhdGUnXSA9IHRoaXMuZ2V0U3RhdGUoKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydFeHRlcm5hbFN0YXRlJ10gPSB0aGlzLmV4dGVybmFsU3RhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXRoZWFkZXJJbmZvKCkge1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddID0ge307XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uVGltZVpvbmVPZmZzZXQgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLmdlbmVyYXRlVGltZXpvbmVvZmZzZXQodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmNyZWF0ZWRBdCkpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkRhdGVUaW1lQ3JlYXRlZCA9IHRoaXMuY3JlYXRlZEF0O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeSA9IHt9O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5EZXZpY2VJRCA9IHRoaXMuZGV2aWNlSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkNhc2hpZXJJRCA9IHRoaXMuY2FzaGllcklkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5Db21wYW55SUQgPSB0aGlzLmNvbXBhbnlJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuU3RvcmVJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5CcmFuY2hJRCA9IHRoaXMuYnJhbmNoSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LlRlcm1pbmFsTnVtYmVyID0gdGhpcy50ZXJtaW5hbE51bWJlcjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuVHJhbnNhY3Rpb25OdW1iZXIgPSB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlRheE1ldGhvZElEID0gdGhpcy50YXhNZXRob2RJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5EeW5hbWljU3RvY2tMb29rdXAgPSB0aGlzLmdlbmVyYXRlRHluYW1pY1N0b2NrTG9va1VwKCk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uQmFza2V0TGFuZ3VhZ2VJRCA9IHRoaXMuYmFza2V0TGFuZ3VhZ2VJZDsgLy90b2RvXHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uQmFza2V0Q291bnRyeUlEID0gdGhpcy5iYXNrZXRDb3VudHJ5SWQ7IC8vdG9kb1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkJhc2tldEN1cnJlbmN5SUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlRyYWRpbmdSZWdpb25JRCA9IHRoaXMudHJhZGluZ1JlZ2lvbklkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkV1cm96b25lID0gXCIgXCI7Ly91bmtub3duXHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uRXVyb0Jhc2VFeGNoYW5nZVJhdGUgPSBcIlwiOyAvL3Vua25vd25cclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5QcmludGFibGVOYW1lID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lOyAvL3Vua25vd25cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcmpNYXBwZXIoKSB7XHJcbiAgICAgICAgdmFyIHRyYW5zYWN0aW9uRGlzY291bnQ6YW55ID0gW10gO1xyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgIHRyYW5zYWN0aW9uRGlzY291bnQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEUpIHtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBsaW5lRGlzY291bnQgPSBbXTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGluZURpc2NvdW50ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQuZmlsdGVyKCh4OiBhbnkpID0+IHguaXRlbUxpbmVJZCA9PT0gZWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGluZURpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5pbmRleE9mKGxpbmVEaXNjb3VudFswXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmFkZFByb2R1Y3QoZWxlbWVudCwgKGxpbmVEaXNjb3VudC5sZW5ndGggPiAwID8gbGluZURpc2NvdW50WzBdIDogbnVsbCksKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1vZGlmaWVySXRlbShsaW5lRGlzY291bnQubGVuZ3RoID4gMCA/IGxpbmVEaXNjb3VudFswXSA6IG51bGwsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSBbXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRyYW5zYWN0aW9uUHJvbW90aW9uKHRyYW5zYWN0aW9uUHJvbW90aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuUkVGVU5EKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXSA9IFtdOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnJldHVyblByb2R1Y3QoZWxlbWVudCwgKGVsZW1lbnQuaGFzT3duUHJvcGVydHkoJ2xpbmVEaXNjb3VudCcpID8gZWxlbWVudC5saW5lRGlzY291bnQgOiBudWxsKSwodHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwID8gdHJhbnNhY3Rpb25EaXNjb3VudCA6IG51bGwpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXS5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNb2RpZmllckl0ZW0oZWxlbWVudC5saW5lRGlzY291bnQsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9SRUZVTkQpIHtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25Eb2M6IGFueSA9IG5ldyBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcigpLmJhc2tldCh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscykuYnVpbGQoKTtcclxuICAgICAgICAgICAgdHJhbnNhY3Rpb25Eb2MuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnJldHVyblByb2R1Y3QoZWxlbWVudCwgKGVsZW1lbnQuaGFzT3duUHJvcGVydHkoJ2xpbmVEaXNjb3VudCcpID8gZWxlbWVudC5saW5lRGlzY291bnQgOiBudWxsKSwodHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwID8gdHJhbnNhY3Rpb25EaXNjb3VudCA6IG51bGwpKTtcclxuICAgICAgICAgICAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbFJlY2VpcHRTdXBwbGllZFwiOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxCcmFuY2hJRFwiOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxUZXJtaW5hbE51bWJlclwiOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxUcmFuc2FjdGlvbk51bWJlclwiOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxDYXNoaWVyTnVtYmVyXCI6IDBcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBkYXRhWydSZXR1cm4nXSA9IHsuLi5kYXRhWydSZXR1cm4nXSwgLi4ub2JqfTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXS5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNb2RpZmllckl0ZW0oZWxlbWVudC5saW5lRGlzY291bnQsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX0VYQ0hBTkdFKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25Eb2M6IGFueSA9IG5ldyBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcigpLmJhc2tldCh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscykuYnVpbGQoKTtcclxuICAgICAgICAgICAgdHJhbnNhY3Rpb25Eb2MuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucmVmdW5kZWRRdWFudGl0eSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dXJuUHJvZHVjdCA9IHRoaXMucmV0dXJuUHJvZHVjdChlbGVtZW50LCAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgnbGluZURpc2NvdW50JykgPyBlbGVtZW50LmxpbmVEaXNjb3VudCA6IG51bGwpLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxSZWNlaXB0U3VwcGxpZWRcIjogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbEJyYW5jaElEXCI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxUZXJtaW5hbE51bWJlclwiOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsVHJhbnNhY3Rpb25OdW1iZXJcIjogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbENhc2hpZXJOdW1iZXJcIjogMFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuUHJvZHVjdFsnUmV0dXJuJ10gPSB7Li4ucmV0dXJuUHJvZHVjdFsnUmV0dXJuJ10sIC4uLm9ian07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddLnB1c2gocmV0dXJuUHJvZHVjdCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGRQcm9kdWN0ID0gdGhpcy5hZGRQcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCkgLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ10ucHVzaChhZGRQcm9kdWN0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGVsZW1lbnQubGluZURpc2NvdW50LCBlbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QmFza2V0RGlzY291bnQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQpIHJldHVybiB0aGlzO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10gPSBbXTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9XHJcbiAgICAgICAgICAgIG9ialsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICBvYmpbJ0RldmljZUlEJ109dGhpcy5kZXZpY2VJZDtcclxuICAgICAgICAgICAgb2JqWydEYXRlVGltZUNyZWF0ZWQnXT10aGlzLnVwZGF0ZWRBdDtcclxuICAgICAgICAgICAgb2JqWydOZXRWYWx1ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5kaXNjb3VudEFtb3VudCAqIC0xKTtcclxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID10aGlzLmNvbnZlcnRUb1N0cmluZyggZWxlbWVudC5kaXNjb3VudEFtb3VudCAqIC0xKTtcclxuICAgICAgICAgICAgb2JqWydEZXNjcmlwdGlvbiddID0gZWxlbWVudC5yZWFzb25EaXNwbGF5VGV4dDtcclxuICAgICAgICAgICAgb2JqWydVc2VySUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICAgICAgb2JqWydSZWFzb25Db2RlSUQnXSA9IGVsZW1lbnQucmVhc29uQ29kZTtcclxuICAgICAgICAgICAgb2JqWydEaXNjb3VudFR5cGUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQuZGlzY291bnRUeXBlLnRvVXBwZXJDYXNlKCkgPT0gRElTQ09VTlRUWVBFLlBFUkNFTlQudG9VcHBlckNhc2UoKSA/IDAgOiAxKTsgXHJcbiAgICAgICAgICAgIG9ialsnUm91bmRpbmdSdWxlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZygyKTtcclxuICAgICAgICAgICAgb2JqWydNb2RpZmllZExpbmVOdW1iZXInXSA9IGVsZW1lbnQuaXRlbUxpbmVJZHM7ICAgICAgICAgICBcclxuICAgICAgICAgICAgb2JqWydMaW5lTnVtYmVyJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpKTsgXHJcbiAgICAgICAgICAgIG9ialsnRGlzY291bnRlZFZhbHVlJ10gPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgKyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsO1xyXG4gICAgICAgICAgICBpZihlbGVtZW50LmRpc2NvdW50VHlwZS50b1VwcGVyQ2FzZSgpID09IERJU0NPVU5UVFlQRS5QRVJDRU5ULnRvVXBwZXJDYXNlKCkpe1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudFBlcmNlbnRhZ2UnXSA9ICB0aGlzLmNvbnZlcnRUb1N0cmluZygoZWxlbWVudC5kaXNjb3VudEFtb3VudCAvIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsKS50b0ZpeGVkKDEpKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSAnUkVGVU5EJyl7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LmRpc2NvdW50QW1vdW50IDwgMCA/IC1lbGVtZW50LmRpc2NvdW50QW1vdW50IDogZWxlbWVudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPXRoaXMuY29udmVydFRvU3RyaW5nKCBlbGVtZW50LmRpc2NvdW50QW1vdW50IDwgMCA/IC1lbGVtZW50LmRpc2NvdW50QW1vdW50IDogZWxlbWVudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10ucHVzaChvYmopO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1vZGlmaWVySXRlbShkYXRhOiBhbnksIGxpbmVObzogYW55KSB7XHJcbiAgICAgICAgaWYgKGRhdGEgJiYgbGluZU5vKSB7XHJcbiAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBvYmouWE1MU2NoZW1hVmVyc2lvbiA9IDE7XHJcbiAgICAgICAgICAgIG9iai5MaW5lTnVtYmVyID0gdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKTtcclxuICAgICAgICAgICAgb2JqLk5ldFZhbHVlID0gMDtcclxuICAgICAgICAgICAgb2JqLkVmZmVjdGl2ZU5ldFZhbHVlID0gMDtcclxuICAgICAgICAgICAgb2JqLkRlc2NyaXB0aW9uID0gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lID8gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lIDogZGF0YS5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcclxuICAgICAgICAgICAgb2JqLkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcclxuICAgICAgICAgICAgb2JqLlVzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICAgICAgb2JqLkRhdGVUaW1lQ3JlYXRlZCA9IHRoaXMudXBkYXRlZEF0O1xyXG4gICAgICAgICAgICBvYmouQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgICAgIG9iai5SZWFzb25Db2RlSUQgPSBkYXRhLnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGUgPyBkYXRhLnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGUgOiBkYXRhLnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlO1xyXG4gICAgICAgICAgICBvYmouTW9kaWZpZWRMaW5lTnVtYmVyID0gbGluZU5vO1xyXG4gICAgICAgICAgICBvYmouTW9kaWZpZWRJbmRleCA9IDE7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXS5wdXNoKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFRyYWlsZXJJbmZvKCkge1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXSA9IHt9O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5EYXRlVGltZUNvbXBsZXRlZCA9IHRoaXMudXBkYXRlZEF0O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeSA9IHt9O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeS5EZXZpY2VJRCA9IHRoaXMuZGV2aWNlSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkNhc2hpZXJJRCA9IHRoaXMuY2FzaGllcklkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeS5TdG9yZUlEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkJyYW5jaElEID0gdGhpcy5icmFuY2hJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuVGVybWluYWxOdW1iZXIgPSB0aGlzLnRlcm1pbmFsTnVtYmVyO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeS5UcmFuc2FjdGlvbk51bWJlciA9IHRoaXMudHJhbnNhY3Rpb25OdW1iZXI7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlRvdGFsID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgKiAxMDApO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5JdGVtQ291bnQgPSB0aGlzLml0ZW1Db3VudDsgLy9naXZlcyB0b3RhbCBjb3VudCBmb3IgcHJvZHVjdFxyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5JdGVtUXVhbnRpdHkgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuTmV0SXRlbVF1YW50aXR5ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlRheFRvdGFsID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5yZW1vdmVEZWNpbWFsKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsKSk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlNlcXVlbmNlRGV2aWNlSUQgPSB0aGlzLmRldmljZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5TZXF1ZW5jZU51bWJlciA9ICdzbnNuJyAvL3N0YXRpYyBmb3Igbm93XHJcblxyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnVGF4SXRlbSddID0gW107XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgb2JqWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgIG9ialsnVGF4UmF0ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5WQVRDb2RlKTtcclxuICAgICAgICAgICAgb2JqWydUYXhhYmxlVG90YWwnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnRheGFibGVBbW91bnQpKTtcclxuICAgICAgICAgICAgb2JqWydUYXhUb3RhbCddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5yZW1vdmVEZWNpbWFsKHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnRheExpbmVUb3RhbCkpKTtcclxuICAgICAgICAgICAgb2JqWydUYXhEZXNjcmlwdGlvbiddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5WQVRDb2RlKTtcclxuICAgICAgICAgICAgb2JqWydUYXhJbmNsdWRlZCddID0gJzEnO1xyXG4gICAgICAgICAgICBvYmpbJ1RheFBlcmNlbnRhZ2UnXSA9IHRoaXMuYWRkRGVjaW1hbChlbGVtZW50LlZBVC50b0ZpeGVkKDIpKS50b0ZpeGVkKDIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddWydUYXhJdGVtJ10ucHVzaChvYmopXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwIHx8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnUHJvbW90aW9uSXRlbSddID0gW107XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbklEJ10gPSBlbGVtZW50LnByb21vdGlvbklkO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uU2F2aW5nJ10gPSBlbGVtZW50LnByb21vdGlvbkFtb3VudCA8IDAgPyBlbGVtZW50LnByb21vdGlvbkFtb3VudCA6IC1lbGVtZW50LnByb21vdGlvbkFtb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblF1YW50aXR5J10gPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkRlc2NyaXB0aW9uJ10gPSBlbGVtZW50LmRpc3BsYXlUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J10gPSB7fVxyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXROdW1iZXInXSA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ0hpdFF1YW50aXR5J10gPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXRTYXZpbmcnXSA9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDwgMCA/IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDogLWVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnUHJvZHVjdElEJ10gPSBwcm9kdWN0LlNLVTtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1VuaXRWYWx1ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5wcm9tb3Rpb25MaW5lUHJpY2UgLyBwcm9kdWN0LnF1YW50aXR5KTtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ0xpbmVOdW1iZXInXSA9IHRoaXMuZ2V0TnVtYmVyKHByb2R1Y3QuU0tVKTtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1F1YW50aXR5J10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhwcm9kdWN0LnF1YW50aXR5LnRvRml4ZWQoMSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnVGF4Q29kZSddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudC5pdGVtTGluZUlkKS5WQVRDb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnUHJvbW90aW9uSXRlbSddLnB1c2gob2JqKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbklEJ10gPSBlbGVtZW50LnByb21vdGlvbklkO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uU2F2aW5nJ10gPSBlbGVtZW50LnByb21vdGlvbkFtb3VudCA8IDAgPyBlbGVtZW50LnByb21vdGlvbkFtb3VudCA6IC1lbGVtZW50LnByb21vdGlvbkFtb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblF1YW50aXR5J10gPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkRlc2NyaXB0aW9uJ10gPSBlbGVtZW50LmRpc3BsYXlUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J10gPSB7fVxyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXROdW1iZXInXSA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ0hpdFF1YW50aXR5J10gPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXRTYXZpbmcnXSA9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDwgMCA/IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDogLWVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25UcmlnZ2VyID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaXRlbUxpbmVJZHMuZm9yRWFjaCgoaXRlbUxpbmVJZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaXRlbUxpbmVJZCkgPT09IHByb2R1Y3QuaXRlbUxpbmVJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25UcmlnZ2VyWydQcm9kdWN0SUQnXSA9IHByb2R1Y3QuU0tVO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1VuaXRWYWx1ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5wcm9tb3Rpb25MaW5lUHJpY2UgLyBwcm9kdWN0LnF1YW50aXR5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25UcmlnZ2VyWydMaW5lTnVtYmVyJ10gPSB0aGlzLmdldE51bWJlcihwcm9kdWN0LlNLVSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnUXVhbnRpdHknXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHByb2R1Y3QucXVhbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1RheENvZGUnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IHByb2R1Y3QuaXRlbUxpbmVJZCkuVkFUQ29kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ10ucHVzaChwcm9tb3Rpb25UcmlnZ2VyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddWydQcm9tb3Rpb25JdGVtJ10ucHVzaChvYmopO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGVuZGVySW5mbygpIHtcclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5wYXltZW50RGV0YWlscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5wYXltZW50RGV0YWlscy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYoZWxlbWVudC5leHRlcm5hbFRlbmRlcktleSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXltZW50VHlwZS50b1VwcGVyQ2FzZSgpID09PSAnR0lGVCBDQVJEJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IHRoaXMueG1sU2NoZW1hVmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgTGluZU51bWJlcjogdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgTmV0VmFsdWU6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUlEOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnVwZGF0ZWRBdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyVHlwZTogZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgPyBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJTdWJUeXBlOiBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlckFtb3VudDogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeUlEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBHaWZ0Vm91Y2hlclNhbGVzQWxsb3dlZDogJycsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93UmVjaGFyZ2VhYmxlVm91Y2hlclNhbGVzOiAnJywvL3RvZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJJRDogJydcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFtlbGVtZW50LmV4dGVybmFsVGVuZGVyS2V5XS5wdXNoKG9iailcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmoxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiBcIjFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgTGluZU51bWJlcjogdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKSwvL3RvZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgTmV0VmFsdWU6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdGl2ZU5ldFZhbHVlOiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogdGhpcy5nZXREZXNjcmlwdGlvbihlbGVtZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUNyZWF0ZWQ6IHRoaXMudXBkYXRlZEF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJUeXBlOiBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclN1YlR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyQW1vdW50OiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeUlEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlSW5UcmFuc2FjdGlvblRvdGFsQ2hlY2s6IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBbGxvd1JlY2hhcmdlYWJsZVZvdWNoZXJTYWxlczogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5EcmF3ZXJBdEVuZDogXCIxXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFtlbGVtZW50LmV4dGVybmFsVGVuZGVyS2V5XS5wdXNoKG9iajEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Nhc2hUZW5kZXInXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0dJRlQgQ0FSRCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiB0aGlzLnhtbFNjaGVtYVZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ldFZhbHVlOiBKU09OLnN0cmluZ2lmeSgtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdGl2ZU5ldFZhbHVlOiBKU09OLnN0cmluZ2lmeSgtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy51cGRhdGVkQXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyU3ViVHlwZTogZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgPyBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJBbW91bnQ6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lEZXNjcmlwdGlvbjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJTYWxlc0FsbG93ZWQ6ICcnLC8vdG9kb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBBbGxvd1JlY2hhcmdlYWJsZVZvdWNoZXJTYWxlczogJycsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEdpZnRWb3VjaGVySUQ6ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Nhc2hUZW5kZXInXS5wdXNoKG9iailcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmoxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiBcIjFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgTGluZU51bWJlcjogdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgTmV0VmFsdWU6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUlEOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnVwZGF0ZWRBdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyVHlwZTogZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgPyBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJTdWJUeXBlOiBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlckFtb3VudDogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeUlEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlSW5UcmFuc2FjdGlvblRvdGFsQ2hlY2s6IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBbGxvd1JlY2hhcmdlYWJsZVZvdWNoZXJTYWxlczogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5EcmF3ZXJBdEVuZDogXCIxXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnQ2FzaFRlbmRlciddLnB1c2gob2JqMSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TnVtYmVyKHByb2R1Y3RJZCkge1xyXG4gICAgICAgIGxldCBsaW5lTnVtYmVyOyBcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ10ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ11baV07XHJcbiAgICAgICAgICAgIGlmKEpTT04uc3RyaW5naWZ5KHByb2R1Y3RJZCkgPT09IEpTT04uc3RyaW5naWZ5KGVsZW1lbnQuUHJvZHVjdElEKSl7XHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gZWxlbWVudC5MaW5lTnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGluZU51bWJlckZvclByb2R1Y3RzKCkge1xyXG4gICAgICAgIGxldCBpdGVtTGluZUlkQXJyYXkgPSBbXTtcclxuICAgICAgICBpdGVtTGluZUlkQXJyYXkgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLm1hcCgocHJvZHVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5sYXJnZXN0TnVtYmVyID0gaXRlbUxpbmVJZEFycmF5LnJlZHVjZSgoYTogYW55LCBiOiBhbnkpID0+IE1hdGgubWF4KGEsIGIpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUxpbmVOdW1iZXIoKSB7XHJcbiAgICAgICAgdGhpcy5sYXJnZXN0TnVtYmVyICs9IDE7XHJcbiAgICAgICAgdGhpcy5pdGVtQ291bnQgKz0gMTtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYXJnZXN0TnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpbGl6ZUl0ZW1Db3VudCgpIHtcclxuICAgICAgICB0aGlzLml0ZW1Db3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJqT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldERlc2NyaXB0aW9uKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnBheW1lbnRUeXBlLnRvVXBwZXJDYXNlKCkgPT09ICdDQVJEJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jYXJkVHlwZVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucGF5bWVudFR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldE1NR1JPVVBJRChhdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGF0dHJpYnV0ZXMuZmlsdGVyKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5uYW1lID09PSBcIk1NR1JPVVBJRFwiKTtcclxuICAgICAgICAgICAgaWYoZmlsdGVyVmFsdWUgJiYgZmlsdGVyVmFsdWUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJWYWx1ZVswXS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXREZXZpY2VJbmZvKGlkOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmRldmljZUlkID0gaWRcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZURlY2ltYWwodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSAqIDEwMDtcclxuICAgIH1cclxuXHJcbiAgICBhZGREZWNpbWFsKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgLzEwMDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUcmFuc2FjdGlvbk51bWJlcih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbk51bWJlciA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWFuaWZlc3RWZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm1hbmlmZXN0VmVyc2lvbiA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGF0YWJhc2VTY2hlbWFWZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlU2NoZW1hVmVyc2lvbiA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0QmFza2V0VHlwZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRUeXBlID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRUcmFkaW5nUmVnaW9uSUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMudHJhZGluZ1JlZ2lvbklkID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldENvbXBhbnlJRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jb21wYW55SWQgPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGF4TWV0aG9kSUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMudGF4TWV0aG9kSWQgPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWFqb3JWZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm1ham9yVmVyc2lvbiA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRNaW5vclZlcnNpb24odmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMubWlub3JWZXJzaW9uID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldFhNTFNjaGVtYVZlcnNpb24odmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMueG1sU2NoZW1hVmVyc2lvbiA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRFeHRlcm5hbFN0YXRlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmV4dGVybmFsU3RhdGUgPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q2FzaGllcklEKCkge1xyXG4gICAgICAgIHRoaXMuY2FzaGllcklkID0gKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUpID8gIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSA6ICcnO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGVybWluYWxOdW1iZXIodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMudGVybWluYWxOdW1iZXIgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzZXRCYXNrZXRMYW5ndWFnZUlEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmJhc2tldExhbmd1YWdlSWQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHNldEJhc2tldENvdW50cnlJRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRDb3VudHJ5SWQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzZXRCYXNrZXRDdXJyZW5jeUlEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmJhc2tldEN1cnJlbmN5SWQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzZXRCcmFuY2hJRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5icmFuY2hJZCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNhbGVzUGVyc29uTmFtZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5zYWxlc1BlcnNvbk5hbWUgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUlkKGRhdGU6IGFueSkge1xyXG4gICAgICAgIGxldCBuZXdEYXRlVGltZSA9IGRhdGUucmVwbGFjZSgvW14wLTldL2csICcnKVxyXG4gICAgICAgIGxldCBpZCA9ICh0aGlzLmRldmljZUlkICsgJ3wnICsgbmV3RGF0ZVRpbWUgKyAnfCcgKyB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyKS50b1N0cmluZygpO1xyXG4gICAgICAgIHJldHVybiBpZDtcclxuICAgIH0gXHJcblxyXG4gICAgZ2VuZXJhdGVUaW1lem9uZW9mZnNldChkYXRlOiBhbnkpIHtcclxuICAgICAgICBsZXQgeCA9IGRhdGUgPyBkYXRlIDogJyc7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVLZXl3b3JkKCkge1xyXG4gICAgICAgIGxldCB4ID0gKHRoaXMuY29tcGFueUlkICsgJ3wnICsgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQgKyAnfCcgKyB0aGlzLnRlcm1pbmFsTnVtYmVyICsgJ3wnICsgdGhpcy50cmFuc2FjdGlvbk51bWJlcikudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4geDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9wZXJhdGlvblN0YXR1cyA9PT0gJ1BBWV9TVUNDRVNTJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ0NvbXBsZXRlZCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ0NhbmNlbGxlZCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVyblByb2R1Y3QoZWxlbWVudDogYW55LCBsaW5lRGlzY291bnQ6IExpbmVEaXNjb3VudCAsIHRyYW5zYWN0aW9uRGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnQpIHtcclxuICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcclxuICAgICAgICBsZXQgdGF4VG90YWwgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pO1xyXG4gICAgICAgIG9ialsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgIG9ialsnTGluZU51bWJlciddID0gZWxlbWVudFsnaXRlbUxpbmVJZCddO1xyXG4gICAgICAgIG9ialsnTmV0VmFsdWUnXSA9IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50WydyZWZ1bmRlZFRvdGFsJ10pO1xyXG4gICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50WydyZWZ1bmRlZFRvdGFsJ10pO1xyXG4gICAgICAgIG9ialsnRGVzY3JpcHRpb24nXSA9IGVsZW1lbnRbJ2Rlc2NyaXB0aW9uJ107XHJcbiAgICAgICAgb2JqWydEZXZpY2VJRCddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Wyd0ZXJtaW5hbElkJ107XHJcbiAgICAgICAgb2JqWydVc2VySUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICBvYmpbJ0RhdGVUaW1lQ3JlYXRlZCddID0gdGhpcy5jcmVhdGVkQXQ7XHJcbiAgICAgICAgb2JqWydFeHRlbmRlZFZhbHVlJ10gPSB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudFsndG90YWxMaW5lUHJpY2UnXSotMSk7XHJcbiAgICAgICAgb2JqWydVbml0UHJpY2UnXSA9IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50WydwcmljZSddKTtcclxuICAgICAgICBvYmpbJ1F1YW50aXR5J10gPSB0aGlzLmdldFF1YW50aXR5KGVsZW1lbnQpO1xyXG4gICAgICAgIG9ialsnT3JpZ2luYWxUYXhBbW91bnRTZXQnXSA9IDE7XHJcbiAgICAgICAgb2JqWydQcm9kdWN0SUQnXSA9IGVsZW1lbnRbJ1NLVSddO1xyXG4gICAgICAgIG9ialsnSGFuZEtleWVkJ10gPSAxO1xyXG4gICAgICAgIG9ialsnTG9uZ0Rlc2NyaXB0aW9uJ10gPSBlbGVtZW50WydkZXNjcmlwdGlvbiddO1xyXG4gICAgICAgIG9ialsnUmV0dXJuJ10gPSB7fTtcclxuICAgICAgICBvYmpbJ1JldHVybiddWydSZXR1cm5SZWFzb25JRCddID0gZWxlbWVudFsncmVmdW5kZWRSZWFzb24nXTtcclxuICAgICAgICBvYmpbJ1JldHVybiddWydSZXR1cm5EZXNjcmlwdGlvbiddID0gZWxlbWVudFsncmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbiddO1xyXG4gICAgICAgIG9ialsnUmV0dXJuJ11bJ1JldHVyblRvU3RvY2snXSA9IHRoaXMuZ2V0UXVhbnRpdHkoZWxlbWVudCk7XHJcbiAgICAgICAgb2JqWydUYXhDb2RlJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pLlZBVENvZGU7XHJcblxyXG4gICAgICAgIG9ialsnRGlzcGxheVRheENvZGUnXSA9ICcnOyAvLyB0b2RvXHJcbiAgICAgICAgb2JqWydQcm9kdWN0QXR0cmlidXRlcyddID0gJyc7IC8vdG9kbyAtIG5vdCByZXF1aXJlZFxyXG4gICAgICAgIG9ialsnUGVyaXNoYWJsZSddID0gdGhpcy5nZXRNTUdST1VQSUQoZWxlbWVudC5hdHRyaWJ1dGVzKTtcclxuICAgICAgICAvL29ialsnTU1Hcm91cElEJ10gPSB0aGlzLmdldENhcmVnb3JpZXMoZWxlbWVudCk7XHJcbiAgICAgICAgb2JqWydNTUdyb3VwSUQnXSA9IHRoaXMuZ2V0TU1HUk9VUElEKGVsZW1lbnQuYXR0cmlidXRlcyk7XHJcbiAgICAgICAgb2JqWydDdXN0b21lckRldGFpbHMnXSA9IFwiXCI7IC8vIHRvZG8gLSBibGFua1xyXG4gICAgICAgIG9ialsnVG90YWxQcm9tb3Rpb25TYXZpbmcnXSA9IGVsZW1lbnRbJ3Byb21vdGlvbkFtb3VudCddIHx8IC0xOyAvLyBUT0RPXHJcbiAgICAgICAgb2JqWydPcmlnaW5hbFRheEFtb3VudCddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoKHRoaXMucmVtb3ZlRGVjaW1hbCh0aGlzLmdldE9yaWdpbmFsVGF4KGVsZW1lbnQsdGF4VG90YWwuVkFUKSAqIC0xKSkudG9GaXhlZCgyKSk7XHJcbiAgICAgICAgb2JqWyd0YXhBbW91bnQnXSA9IHRoaXMucmVtb3ZlRGVjaW1hbCh0YXhUb3RhbC50YXhMaW5lVG90YWwgPCAwID8odGF4VG90YWwudGF4TGluZVRvdGFsKSA6ICgtdGF4VG90YWwudGF4TGluZVRvdGFsKSk7XHJcblxyXG4gICAgICAgIGlmIChsaW5lRGlzY291bnQpIHtcclxuICAgICAgICAgICAgaWYgKGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lICYmIGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25Db2RlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsaW5lIGRpc2NvdW50XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10gPSB7fTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclZhbHVlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllckRhdGVUaW1lID0gb2JqLkRhdGVUaW1lQ3JlYXRlZDtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJEZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50VHlwZSA9IGxpbmVEaXNjb3VudC5kaXNjb3VudFR5cGU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uWE1MU2NoZW1hVmVyc2lvbiA9IDE7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uT3JpZ2luYWxQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQgKyAobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50ZWRWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5EaXNjb3VudFBlcmNlbnRhZ2UgPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50VmFsdWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uUm91bmRpbmdSdWxlID0gMjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uQ29kZSAmJiBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbk5hbWUpIHtcclxuICAgICAgICAgICAgICAgIC8vcHJpY2Ugb3ZlcnJpZGVcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddID0ge307XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllclZhbHVlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25JRCA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uQ29kZTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uRGVzY3JpcHRpb24gPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbk5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTmV3UHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LnVuaXRQcmljZSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDAgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxyXG4gICAgICAgICAgICBvYmouTmV0VmFsdWUgPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICBvYmouRWZmZWN0aXZlTmV0VmFsdWUgPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICBvYmouRXh0ZW5kZWRWYWx1ZSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgICAgIG9iai5Vbml0UHJpY2UgPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodHJhbnNhY3Rpb25EaXNjb3VudCkge1xyXG4gICAgICAgICAgICBvYmpbJ0Jhc2tldERpc2NvdW50TW9kaWZpZXInXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZTogYW55KSA9PiB7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBkaXNjb3VudE9iajogYW55ID17fVxyXG4gICAgICAgICAgICAgICAgIGUuaXRlbUxpbmVJZHMuZm9yRWFjaCgoeDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gZWxlbWVudC5pdGVtTGluZUlkKSB7ICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpc2NvdW50QW1vdW50ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZS5kaXNjb3VudEFtb3VudCAqIC0xKTsgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5CYXNrZXREaXNjb3VudExpbmVOdW1iZXIgPSB0aGlzLmdldExpbmVOdW1iZXIoZSxkaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLlhNTFNjaGVtYVZlcnNpb24gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLkRpc2NvdW50ZWRWYWx1ZSA9IHRoaXMuZ2V0RGlzY291bnRlZFZhbHVlKGVsZW1lbnQudG90YWxMaW5lUHJpY2UsIGUuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ0Jhc2tldERpc2NvdW50TW9kaWZpZXInXS5wdXNoKGRpc2NvdW50T2JqKTtcclxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ID0gMDtcclxuICAgICAgICAgICAgb2JqWydCYXNrZXREaXNjb3VudE1vZGlmaWVyJ10uZm9yRWFjaCgodmFsdWU6YW55KT0+e1xyXG4gICAgICAgICAgICAgICAgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ID0gdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ICsgdmFsdWUuRGlzY291bnRlZFZhbHVlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy91cGRhdGUgdGhlIHByb2R1Y3QgcHJpY2VcclxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gb2JqLkVmZmVjdGl2ZU5ldFZhbHVlICsgIHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKHRyYW5zYWN0aW9uUHJvbW86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21vdGlvbk9iajogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vLml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouTW9kaWZpZXJWYWx1ZSA9IHRyYW5zYWN0aW9uUHJvbW8ucHJvbW90aW9uQW1vdW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouTW9kaWZpZXJEYXRlVGltZSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jcmVhdGVkQXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Nb2RpZmllckRlc2NyaXB0aW9uID0gdHJhbnNhY3Rpb25Qcm9tby5kaXNwbGF5VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlhNTFNjaGVtYVZlcnNpb24gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25JRCA9IHRyYW5zYWN0aW9uUHJvbW8ucHJvbW90aW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25EZXNjcmlwdGlvbiA9IHRyYW5zYWN0aW9uUHJvbW8uZGlzcGxheVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5IaXROdW1iZXIgPSAnMSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25IaXRQcm9kdWN0UXVhbnRpdHkgPSB0aGlzLmdldFF1YW50aXR5KGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouUHJvbW90aW9uSGl0UXVhbnRpdHkgPSB0aGlzLmdldFF1YW50aXR5KGVsZW1lbnQpICogLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uU2F2aW5nJ10ucHVzaChwcm9tb3Rpb25PYmopO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkUHJvZHVjdChlbGVtZW50OiBUUHJvZHVjdCwgbGluZURpc2NvdW50OiBMaW5lRGlzY291bnQsIHRyYW5zYWN0aW9uRGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnQpIHtcclxuICAgICAgICBsZXQgdGF4VG90YWwgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pO1xyXG4gICAgICAgIGxldCBvYmo6IGFueSA9IHtcclxuICAgICAgICAgICAgWE1MU2NoZW1hVmVyc2lvbjogdGhpcy54bWxTY2hlbWFWZXJzaW9uLFxyXG4gICAgICAgICAgICBMaW5lTnVtYmVyOiBlbGVtZW50Lml0ZW1MaW5lSWQsXHJcbiAgICAgICAgICAgIE5ldFZhbHVlOiB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC50b3RhbExpbmVQcmljZSksXHJcbiAgICAgICAgICAgIEVmZmVjdGl2ZU5ldFZhbHVlOiB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC50b3RhbExpbmVQcmljZSksXHJcbiAgICAgICAgICAgIERlc2NyaXB0aW9uOiBlbGVtZW50LmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgVXNlcklEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUsXHJcbiAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy5jcmVhdGVkQXQsXHJcbiAgICAgICAgICAgIEV4dGVuZGVkVmFsdWU6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnByaWNlKSxcclxuICAgICAgICAgICAgVW5pdFByaWNlOiB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC5wcmljZSksXHJcbiAgICAgICAgICAgIC8vTU1Hcm91cElEOiB0aGlzLmdldENhcmVnb3JpZXMoZWxlbWVudCksXHJcbiAgICAgICAgICAgIFF1YW50aXR5OiBlbGVtZW50LnF1YW50aXR5LFxyXG4gICAgICAgICAgICBTYWxlc3BlcnNvbklEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUsXHJcbiAgICAgICAgICAgIFNhbGVzcGVyc29uTmFtZTogdGhpcy5zYWxlc1BlcnNvbk5hbWUsXHJcbiAgICAgICAgICAgIFRheENvZGU6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRbJ3RheEJyZWFrZG93biddWyd0YXhMaW5lcyddLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnRbJ2l0ZW1MaW5lSWQnXSkuVkFUQ29kZSxcclxuICAgICAgICAgICAgVGF4TW9kaWZpYWJsZTogXCIxXCIsIC8vdG9kb1xyXG4gICAgICAgICAgICBPcmlnaW5hbFRheEFtb3VudCA6IHRoaXMuY29udmVydFRvU3RyaW5nKCh0aGlzLnJlbW92ZURlY2ltYWwodGhpcy5nZXRPcmlnaW5hbFRheChlbGVtZW50LHRheFRvdGFsLlZBVCkpLnRvRml4ZWQoMikpKSxcclxuICAgICAgICAgICAgVGF4QW1vdW50IDogdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5yZW1vdmVEZWNpbWFsKHRheFRvdGFsLnRheExpbmVUb3RhbCkpLFxyXG4gICAgICAgICAgICBPcmlnaW5hbFRheEFtb3VudFNldDogXCIxXCIsLy90b2RvXHJcbiAgICAgICAgICAgIFByb2R1Y3RJRDogZWxlbWVudC5TS1UsXHJcbiAgICAgICAgICAgIEhhbmRLZXllZDogXCIxXCIsLy90b2RvXHJcbiAgICAgICAgICAgIEN1c3RvbWVyRGV0YWlsczogXCJcIixcclxuICAgICAgICAgICAgUGVyaXNoYWJsZTogdGhpcy5nZXRNTUdST1VQSUQoZWxlbWVudC5hdHRyaWJ1dGVzKSxcclxuICAgICAgICAgICAgTU1Hcm91cElEOiB0aGlzLmdldE1NR1JPVVBJRChlbGVtZW50LmF0dHJpYnV0ZXMpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaW5lRGlzY291bnQpIHtcclxuICAgICAgICAgICAgaWYgKGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lICYmIGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25Db2RlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsaW5lIGRpc2NvdW50XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10gPSB7fTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclZhbHVlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllckRhdGVUaW1lID0gb2JqLkRhdGVUaW1lQ3JlYXRlZDtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJEZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50VHlwZSA9IGxpbmVEaXNjb3VudC5kaXNjb3VudFR5cGU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uWE1MU2NoZW1hVmVyc2lvbiA9IDE7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uT3JpZ2luYWxQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQgKyAobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50ZWRWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5EaXNjb3VudFBlcmNlbnRhZ2UgPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50VmFsdWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uUm91bmRpbmdSdWxlID0gMjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uQ29kZSAmJiBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbk5hbWUpIHtcclxuICAgICAgICAgICAgICAgIC8vcHJpY2Ugb3ZlcnJpZGVcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddID0ge307XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllclZhbHVlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25JRCA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uQ29kZTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uRGVzY3JpcHRpb24gPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbk5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLlhNTFNjaGVtYVZlcnNpb24gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5OZXdQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk9yaWdpbmFsUHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9kdWN0IHByaWNlXHJcbiAgICAgICAgICAgIG9ialsnTmV0VmFsdWUnXSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgb2JqWydFeHRlbmRlZFZhbHVlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgb2JqWydVbml0UHJpY2UnXSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodHJhbnNhY3Rpb25EaXNjb3VudCkge1xyXG4gICAgICAgICAgICBvYmpbJ0Jhc2tldERpc2NvdW50TW9kaWZpZXInXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZTphbnkpID0+IHsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgZGlzY291bnRPYmo6IGFueSA9e307XHJcbiAgICAgICAgICAgICAgICAgZS5pdGVtTGluZUlkcy5mb3JFYWNoKChpdGVtTGluZUlkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXNjb3VudEFtb3VudCA9IHRoaXMuY29udmVydFRvU3RyaW5nKGUuZGlzY291bnRBbW91bnQgKiAtMSk7ICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRPYmouWE1MU2NoZW1hVmVyc2lvbiA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRPYmouRGlzY291bnRlZFZhbHVlID0gLSh0aGlzLmdldERpc2NvdW50ZWRWYWx1ZShlbGVtZW50LnRvdGFsTGluZVByaWNlLCBlLmRpc2NvdW50QW1vdW50KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLkJhc2tldERpc2NvdW50TGluZU51bWJlciA9IHRoaXMuZ2V0TGluZU51bWJlcihlLGRpc2NvdW50QW1vdW50KSA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddLnB1c2goZGlzY291bnRPYmopOyBcclxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbGV0IHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudCA9IDA7XHJcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddLmZvckVhY2goKHZhbHVlOmFueSk9PntcclxuICAgICAgICAgICAgICAgIHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudCA9IHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudCArIHZhbHVlLkRpc2NvdW50ZWRWYWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9kdWN0IHByaWNlXHJcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9IG9iai5FZmZlY3RpdmVOZXRWYWx1ZSArICB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQ7ICAgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCB8fCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvYmpbJ0Rpc3RyaWJ1dGVkUHJvbW90aW9uU2F2aW5nJ10gPSBbXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKChlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uT2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBlLml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25JRCA9IGUucHJvbW90aW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouSGl0ID0gJzEnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlNhdmluZyA9IHRoaXMuZ2V0U2F2aW5nKGVsZW1lbnQudG90YWxMaW5lUHJpY2UsIGUucHJvbW90aW9uQW1vdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5JU2F2aW5nID0gdGhpcy5nZXRTYXZpbmcoZWxlbWVudC50b3RhbExpbmVQcmljZSwgZS5wcm9tb3Rpb25BbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydEaXN0cmlidXRlZFByb21vdGlvblNhdmluZyddLnB1c2gocHJvbW90aW9uT2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGxpbmVQcm9tb3Rpb246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25PYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lml0ZW1MaW5lSWQgPT0gbGluZVByb21vdGlvbi5pdGVtTGluZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25JRCA9IGxpbmVQcm9tb3Rpb24ucHJvbW90aW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5IaXQgPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlNhdmluZyA9IGxpbmVQcm9tb3Rpb24ucHJvbW90aW9uTGluZVByaWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouSVNhdmluZyA9IGxpbmVQcm9tb3Rpb24ucHJvbW90aW9uTGluZVByaWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ0Rpc3RyaWJ1dGVkUHJvbW90aW9uU2F2aW5nJ10ucHVzaChwcm9tb3Rpb25PYmopO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvblByb21vdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIG9ialsnRGlzdHJpYnV0ZWRQcm9tb3Rpb25TYXZpbmcnXS5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbiA9IHRyYW5zYWN0aW9uUHJvbW90aW9uICsgdmFsdWUuU2F2aW5nO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gb2JqLkVmZmVjdGl2ZU5ldFZhbHVlICsgdHJhbnNhY3Rpb25Qcm9tb3Rpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2F2aW5nKHByaWNlLHByb21vdGlvbkFtb3VudCk6IGFueSB7XHJcbiAgICAgICAgbGV0IFNhdmluZyA9IChwcmljZSpwcm9tb3Rpb25BbW91bnQpL3RoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbDtcclxuICAgICAgICByZXR1cm4gU2F2aW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGdldExpbmVOdW1iZXIodmFsdWU6IGFueSxkaXNjb3VudEFtb3VudDpzdHJpbmcgKXtcclxuICAgICAgICBsZXQgbGluZU51bWJlcjtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J11baV07XHJcbiAgICAgICAgICAgIGlmKCB2YWx1ZS5yZWFzb25Db2RlID09PSBlbGVtZW50LlJlYXNvbkNvZGVJRCAmJiBkaXNjb3VudEFtb3VudCA9PT0gZWxlbWVudC5OZXRWYWx1ZSl7XHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gZWxlbWVudC5MaW5lTnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7ICAgICAgICBcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0RGlzY291bnRlZFZhbHVlKHByaWNlOmFueSAsZGlzY291bnRBbW91bnQ6YW55ICkge1xyXG4gICAgICAgIGxldCBEaXNjb3VudGVkVmFsdWUgPSgocHJpY2UgKiBkaXNjb3VudEFtb3VudCkvdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsKSoxMDAgO1xyXG4gICAgICAgIHJldHVybiBEaXNjb3VudGVkVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T3JpZ2luYWxUYXgoZWxlbWVudDogVFByb2R1Y3QsIFZBVCkge1xyXG4gICAgICAgIGxldCBwcmljZWJlZm9yZXRheCA9IChlbGVtZW50LnByaWNlICogMTAwKS8oMTAwICsgVkFUIClcclxuICAgICAgICBsZXQgb3JpZ2luYWx0YXg9IGVsZW1lbnQucHJpY2UgLSBwcmljZWJlZm9yZXRheFxyXG4gICAgICAgIHJldHVybiBvcmlnaW5hbHRheDtcclxuICAgIH1cclxuXHJcbiAgICBjb252ZXJ0VG9TdHJpbmcodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHZhbHVlLCAnY2FuIG5vdCBiZSBjb252ZXJ0ZWQgaW4gc3RyaW5nJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlRHluYW1pY1N0b2NrTG9va1VwKCkge1xyXG4gICAgICAgIGxldCB4ID0gJzAnO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRlbGl2ZXJ5TWV0aG9kID09PSAnMScgfHwgZWxlbWVudC5kZWxpdmVyeU1ldGhvZCA9PT0gJzInKSB7XHJcbiAgICAgICAgICAgICAgICB4ID0gJzEnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0QXR0cmlidXRlcygpe1xyXG4gICAgLy8gICAgIGxldCBuYW1lOiBzdHJpbmcgfCBhbnlbXSA9IFtdXHJcbiAgICAvLyAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgIC8vICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5hdHRyaWJ1dGVzICYmIGVsZW1lbnQuYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuYW1lID0gZWxlbWVudC5hdHRyaWJ1dGVzLmZpbHRlcigoeDogYW55KSA9PiB4Lm5hbWUudG9VcHBlckNhc2UoKSA9PT0gZWxlbWVudC5uYW1lLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgICAgaWYgKG5hbWUubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gbmFtZVswXS52YWx1ZVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBlbHNle1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gXCJcIlxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBnZXRDYXJlZ29yaWVzKGVsZW1lbnQpIHtcclxuICAgIC8vICAgICBsZXQgTU1Hcm91cElkID0gXCIgXCI7XHJcbiAgICAvLyAgICAgaWYgKGVsZW1lbnQuY2F0ZWdvcmllcyAmJiBlbGVtZW50LmNhdGVnb3JpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IGVsZW1lbnQuY2F0ZWdvcmllcy5maWx0ZXIoKHgpID0+IHgucGFyZW50SWQgIT0gJycpO1xyXG4gICAgLy8gICAgICAgICBsZXQgdmFsdWUgPSBjYXRlZ29yaWVzLmZpbHRlcigoeCkgPT4geC5pZCAhPSB4LnBhcmVudElkKTtcclxuICAgIC8vICAgICAgICAgTU1Hcm91cElkID0gdmFsdWVbMF0ubmFtZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgcmV0dXJuIE1NR3JvdXBJZDtcclxuICAgIC8vIH1cclxuXHJcbiAgICBnZXREYXRlKGRhdGU6c3RyaW5nKXtcclxuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5nZW5lcmF0ZVRpbWV6b25lb2Zmc2V0KGRhdGUpICogLTE7XHJcbiAgICAgICAgbGV0IG9mZnNldEhvdXJzID0gTWF0aC5hYnMoTWF0aC5mbG9vcihvZmZzZXQgLyA2MCkpOyAgICAgICAgXHJcblx0ICAgIGxldCBvZmZzZXRNaW51dGVzID0gTWF0aC5hYnMob2Zmc2V0KSAtIG9mZnNldEhvdXJzICogNjA7XHJcblxyXG4gICAgICAgIGxldCBvZmZzZXRTaWduID0gJysnO1xyXG4gICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XHJcbiAgICAgICAgICAgIG9mZnNldFNpZ24gPSAnLSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbmV3ZGF0ZSA9IGRhdGUuc3Vic3RyaW5nKDAsMTkpO1xyXG4gICAgICAgIGNvbnN0IHggPSAobmV3ZGF0ZSsgb2Zmc2V0U2lnbiArU3RyaW5nKG9mZnNldEhvdXJzKS5wYWRTdGFydCgyLCAnMCcpKyc6JytTdHJpbmcob2Zmc2V0TWludXRlcykucGFkU3RhcnQoMiwgJzAnKSkudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4geDsgICAgICAgIFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRUcmFuc2FjdGlvblByb21vdGlvbih0cmFuc2FjdGlvblByb21vdGlvbil7XHJcbiAgICAgICAgaWYodHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiYgdHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXSA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydMaW5lTnVtYmVyJ10gPSB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ05ldFZhbHVlJ10gPSAgdGhpcy5yZW1vdmVEZWNpbWFsKHRyYW5zYWN0aW9uUHJvbW90aW9uWzBdLnByb21vdGlvbkxpbmVQcmljZSkgKiAtMTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKHRyYW5zYWN0aW9uUHJvbW90aW9uWzBdLnByb21vdGlvbkxpbmVQcmljZSkgKiAtMTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydEZXNjcmlwdGlvbiddID0gdHJhbnNhY3Rpb25Qcm9tb3Rpb25bMF0ucHJvbW90aW9uSW5mbztcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydEZXZpY2VJRCddID0gdGhpcy5kZXZpY2VJZDtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydVc2VySUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydEYXRlVGltZUNyZWF0ZWQnXSA9IHRoaXMuY3JlYXRlZEF0O1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ1Byb2R1Y3RJZCddID0gXCJcIjsgLy90b2RvXHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnU2VyaWFsTnVtYmVyJ10gPSBcIlwiIDsgLy90b2RvXHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnTU1Hcm91cElkJ10gPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0UXVhbnRpdHkoZWxlbWVudDogYW55KSB7XHJcbiAgICAgICAgbGV0IHF1YW50aXR5XHJcbiAgICAgICAgaWYodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVucmVmZXJlbmNlZFJlZnVuZCl7XHJcbiAgICAgICAgICAgIHF1YW50aXR5ID0gZWxlbWVudFsncXVhbnRpdHknXSA8IDAgPyBlbGVtZW50WydxdWFudGl0eSddIDogKC1lbGVtZW50WydxdWFudGl0eSddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgcXVhbnRpdHkgPSBlbGVtZW50WydyZWZ1bmRlZFF1YW50aXR5J10gPCAwID8gZWxlbWVudFsncmVmdW5kZWRRdWFudGl0eSddIDogKC1lbGVtZW50WydyZWZ1bmRlZFF1YW50aXR5J10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcXVhbnRpdHk7XHJcbiAgICB9XHJcbn1cclxuIl19
|