@pmcretail/mapper-library 0.0.45 → 0.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +24 -24
  2. package/bundles/pmcretail-mapper-library.umd.js +4375 -4104
  3. package/bundles/pmcretail-mapper-library.umd.js.map +1 -1
  4. package/esm2015/lib/RJ-mapper.class.js +877 -877
  5. package/esm2015/lib/TransactionDocumentBuilder.js +1244 -1244
  6. package/esm2015/lib/WebReturn-mapper.class.js +326 -326
  7. package/esm2015/lib/WebReturnMagento2RestV1.class.js +268 -0
  8. package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -409
  9. package/esm2015/lib/basket.service.js +527 -527
  10. package/esm2015/lib/mapper-library.component.js +26 -26
  11. package/esm2015/lib/mapper-library.model.js +41 -39
  12. package/esm2015/lib/mapper-library.module.js +21 -21
  13. package/esm2015/lib/number-util.service.js +42 -42
  14. package/esm2015/pmcretail-mapper-library.js +4 -4
  15. package/esm2015/public-api.js +10 -9
  16. package/fesm2015/pmcretail-mapper-library.js +3739 -3472
  17. package/fesm2015/pmcretail-mapper-library.js.map +1 -1
  18. package/lib/RJ-mapper.class.d.ts +80 -80
  19. package/lib/TransactionDocumentBuilder.d.ts +271 -271
  20. package/lib/WebReturn-mapper.class.d.ts +27 -27
  21. package/lib/WebReturnMagento2RestV1.class.d.ts +31 -0
  22. package/lib/WebReturnMagento2RestV1.class.d.ts.map +1 -0
  23. package/lib/WebReturnSalesforceMapper.class.d.ts +35 -35
  24. package/lib/basket.service.d.ts +105 -105
  25. package/lib/mapper-library.component.d.ts +8 -8
  26. package/lib/mapper-library.model.d.ts +701 -693
  27. package/lib/mapper-library.model.d.ts.map +1 -1
  28. package/lib/mapper-library.module.d.ts +7 -7
  29. package/lib/number-util.service.d.ts +13 -13
  30. package/package.json +2 -2
  31. package/pmcretail-mapper-library.d.ts +5 -5
  32. package/public-api.d.ts +6 -5
  33. package/public-api.d.ts.map +1 -1
@@ -0,0 +1,268 @@
1
+ import { INITIATING_MODULE, PROVIDERS } from "./mapper-library.model";
2
+ import { NumberUtilService } from "./number-util.service";
3
+ import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
+ export class WebReturnMagento2RestV1MapperBuilderClass {
5
+ constructor(orderDetails, currencyPipe) {
6
+ this.currencyPipe = currencyPipe;
7
+ this.className = "WebReturnMagento2RestV1MapperBuilderClass";
8
+ this.webReturnObject = {
9
+ id: '',
10
+ orgCode: "",
11
+ storeId: "",
12
+ storeNodeId: "",
13
+ storeNodeStructure: "",
14
+ deviceId: "",
15
+ terminalId: "",
16
+ initiatingModule: "",
17
+ export: false,
18
+ isInStoreOrder: false,
19
+ basket: {},
20
+ basketSummary: {},
21
+ baseCurrency: "",
22
+ customer: {
23
+ id: '',
24
+ email: '',
25
+ firstName: '',
26
+ lastName: '',
27
+ billingAddress: [],
28
+ shippingAddress: [],
29
+ shipmentDetails: [],
30
+ telephone: '',
31
+ postCode: '',
32
+ noCustomerSelected: false
33
+ },
34
+ currentTransactionDetails: {},
35
+ externalTransactionDetails: []
36
+ };
37
+ if (orderDetails) {
38
+ this.orderDetails = orderDetails;
39
+ }
40
+ this.numberUtilService = new NumberUtilService(currencyPipe);
41
+ }
42
+ webReturnCommonMapper() {
43
+ AppLoggerService.logDebug(this.className, "webReturnCommonMapper", "Mapping started...");
44
+ this.webReturnObject['datetime'] = this.getUTCDateTime(this.orderDetails.updated_at);
45
+ this.webReturnObject.baseCurrency = this.orderDetails.order_currency_code;
46
+ this.webReturnObject.subsidiaryId = '1';
47
+ this.webReturnObject.export = true;
48
+ this.webReturnObject.initiatingModule = INITIATING_MODULE.EBASKET;
49
+ this.webReturnObject.createdAt = this.getUTCDateTime(this.orderDetails.created_at);
50
+ this.webReturnObject.updatedAt = this.getUTCDateTime(this.orderDetails.updated_at);
51
+ this.webReturnObject.transCompletedAt = this.getUTCDateTime(this.orderDetails.updated_at);
52
+ this.webReturnObject['externalTransactionId'] = this.orderDetails.increment_id;
53
+ AppLoggerService.logDebug(this.className, "webReturnCommonMapper", "Mapping ended...");
54
+ return this;
55
+ }
56
+ product() {
57
+ var _a;
58
+ AppLoggerService.logDebug(this.className, "product", "Mapping started...");
59
+ this.webReturnObject.basket['products'] = ((_a = this.orderDetails.items) === null || _a === void 0 ? void 0 : _a.filter(product => product === null || product === void 0 ? void 0 : product.base_price).map((product, index) => {
60
+ var _a, _b;
61
+ return ({
62
+ description: product.name || '',
63
+ SKU: product.sku || '',
64
+ quantity: product.qty_ordered || 0,
65
+ refundedQuantity: product.qty_refunded || 0,
66
+ price: product.base_price || 0,
67
+ itemLineId: (index + 1).toString(),
68
+ externalItemLineId: product.item_id || (index + 1).toString(),
69
+ totalLinePrice: ((_a = product.qty_ordered) !== null && _a !== void 0 ? _a : 0) * ((_b = product.base_price) !== null && _b !== void 0 ? _b : 0),
70
+ refundedTotal: product.amount_refunded || 0
71
+ });
72
+ })) || [];
73
+ AppLoggerService.logDebug(this.className, "product", "Mapping ended...");
74
+ return this;
75
+ }
76
+ linePromotion() {
77
+ var _a;
78
+ AppLoggerService.logDebug(this.className, "linePromotion", "Mapping started...");
79
+ this.webReturnObject.basket['linePromotion'] = ((_a = this.orderDetails.items) === null || _a === void 0 ? void 0 : _a.filter(product => (product === null || product === void 0 ? void 0 : product.base_price) && product.discount_amount).map((product, index) => ({
80
+ trigger: [{
81
+ itemLineId: (index + 1).toString(),
82
+ quantity: product.qty_ordered || 0
83
+ }],
84
+ itemLineId: index + 1,
85
+ promotionId: '',
86
+ displayText: this.orderDetails.coupon_code || '',
87
+ promotionType: '',
88
+ promotionAmount: product.discount_amount || 0,
89
+ name: this.orderDetails.coupon_code || '',
90
+ promotionInfo: '',
91
+ promotionLinePrice: product.row_total || 0
92
+ }))) || [];
93
+ AppLoggerService.logDebug(this.className, "linePromotion", "Mapping ended...");
94
+ return this;
95
+ }
96
+ customer() {
97
+ var _a, _b, _c, _d;
98
+ AppLoggerService.logDebug(this.className, "customer", "Mapping started...");
99
+ const { orderDetails, webReturnObject } = this;
100
+ webReturnObject.customer = {
101
+ id: orderDetails.customer_id || '',
102
+ email: orderDetails.customer_email || '',
103
+ firstName: orderDetails.customer_firstname || '',
104
+ lastName: orderDetails.customer_lastname || '',
105
+ shippingAddress: [],
106
+ billingAddress: []
107
+ };
108
+ const shippingAssignments = ((_a = orderDetails.extension_attributes) === null || _a === void 0 ? void 0 : _a.shipping_assignments) || [];
109
+ webReturnObject.customer.shippingAddress = shippingAssignments
110
+ .filter(shipment => { var _a; return (_a = shipment === null || shipment === void 0 ? void 0 : shipment.shipping) === null || _a === void 0 ? void 0 : _a.address; })
111
+ .map(shipment => {
112
+ var _a, _b, _c;
113
+ const address = shipment.shipping.address;
114
+ return {
115
+ id: address.customer_address_id || '',
116
+ countryCode: address.country_id || '',
117
+ address1: ((_a = address.street) === null || _a === void 0 ? void 0 : _a[0]) || '',
118
+ address2: ((_b = address.street) === null || _b === void 0 ? void 0 : _b[1]) || '',
119
+ address3: ((_c = address.street) === null || _c === void 0 ? void 0 : _c[2]) || '',
120
+ city: address.city || '',
121
+ country: '',
122
+ postCode: address.postcode || ''
123
+ };
124
+ });
125
+ const billingAddress = orderDetails.billing_address;
126
+ if (billingAddress) {
127
+ webReturnObject.customer.billingAddress.push({
128
+ id: billingAddress.customer_address_id || '',
129
+ countryCode: billingAddress.country_id || '',
130
+ address1: ((_b = billingAddress.street) === null || _b === void 0 ? void 0 : _b[0]) || '',
131
+ address2: ((_c = billingAddress.street) === null || _c === void 0 ? void 0 : _c[1]) || '',
132
+ address3: ((_d = billingAddress.street) === null || _d === void 0 ? void 0 : _d[2]) || '',
133
+ city: billingAddress.city || '',
134
+ country: '',
135
+ postCode: billingAddress.postcode || ''
136
+ });
137
+ }
138
+ AppLoggerService.logDebug(this.className, "customer", "Mpping ended...");
139
+ return this;
140
+ }
141
+ isInStoreOrder() {
142
+ AppLoggerService.logDebug(this.className, "isInStoreOrder", "Mapping started...");
143
+ this.webReturnObject.isInStoreOrder = false;
144
+ AppLoggerService.logDebug(this.className, "isInStoreOrder", "Mapping ended...");
145
+ return this;
146
+ }
147
+ externalTransactionDetails(invoiceId) {
148
+ AppLoggerService.logDebug(this.className, "externalTransactionDetails", "Mapping started...");
149
+ const coupon = this.orderDetails.coupon_code
150
+ ? { name: this.orderDetails.coupon_code, id: this.orderDetails.coupon_code }
151
+ : null;
152
+ const externalTransactionDetailsObj = {
153
+ uniqueId: this.orderDetails.increment_id || '',
154
+ providerType: PROVIDERS.MAGENTO2,
155
+ transactionInfo: { invoiceId: (invoiceId === null || invoiceId === void 0 ? void 0 : invoiceId.toString()) || '' },
156
+ coupons: coupon ? [coupon] : []
157
+ };
158
+ this.webReturnObject.externalTransactionDetails.push(externalTransactionDetailsObj);
159
+ AppLoggerService.logDebug(this.className, "externalTransactionDetails", "Mapping ended...");
160
+ return this;
161
+ }
162
+ basketSummary() {
163
+ var _a;
164
+ AppLoggerService.logDebug(this.className, "basketSummary", "Mapping started...");
165
+ const { orderDetails, webReturnObject } = this;
166
+ const basketSummary = {
167
+ discountTotal: orderDetails.discount_amount || 0,
168
+ VATTotal: orderDetails.tax_amount || 0,
169
+ saleTotal: orderDetails.subtotal || 0,
170
+ basketTotal: (orderDetails.subtotal || 0) - (orderDetails.total_online_refunded || 0),
171
+ totalItems: (_a = orderDetails.total_qty_ordered) !== null && _a !== void 0 ? _a : 0,
172
+ refundTotal: orderDetails.total_online_refunded || 0,
173
+ shippingTotal: orderDetails.shipping_incl_tax || 0,
174
+ basketTotalWithShippingTotal: orderDetails.total_invoiced || 0,
175
+ webOrder: {
176
+ shippingTotal: orderDetails.shipping_incl_tax || 0,
177
+ basketTotalWithShippingTotal: orderDetails.total_invoiced || 0
178
+ }
179
+ };
180
+ webReturnObject.basketSummary = basketSummary;
181
+ AppLoggerService.logDebug(this.className, "basketSummary", "Mapping ended...");
182
+ return this;
183
+ }
184
+ refundRequest() {
185
+ var _a;
186
+ AppLoggerService.logDebug(this.className, "refundRequest", "Mapping started...");
187
+ this.webReturnObject.refundRequest = ((_a = this.orderDetails.items) === null || _a === void 0 ? void 0 : _a.filter(product => (product === null || product === void 0 ? void 0 : product.base_price) && (product.qty_refunded || 0) > 0).map((product, index) => ({
188
+ itemLineId: index + 1,
189
+ refundedQuantity: product.qty_refunded || 0,
190
+ refundWithPromotion: true,
191
+ quantity: product.qty_ordered || 0
192
+ }))) || [];
193
+ AppLoggerService.logDebug(this.className, "refundRequest", `Mapped ${this.webReturnObject.refundRequest.length} refund items.`);
194
+ AppLoggerService.logDebug(this.className, "refundRequest", "Mapping ended...");
195
+ return this;
196
+ }
197
+ updateTaxBreakdown() {
198
+ var _a;
199
+ AppLoggerService.logDebug(this.className, "updateTaxBreakdown", "Mapping started...");
200
+ const taxLines = ((_a = this.orderDetails.items) === null || _a === void 0 ? void 0 : _a.filter(product => product === null || product === void 0 ? void 0 : product.base_price).map((product, index) => {
201
+ const taxableAmount = product.row_total_incl_tax || 0;
202
+ const VAT = product.tax_percent || 0;
203
+ const preTax = this.numberUtilService.trimTo2Decimal2((taxableAmount * 100) / (100 + VAT));
204
+ const taxLineTotal = this.numberUtilService.trimTo2Decimal2(taxableAmount - preTax);
205
+ return {
206
+ itemLineId: index + 1,
207
+ VAT,
208
+ VATCode: '',
209
+ taxableAmount,
210
+ PreTax: preTax,
211
+ taxLineTotal
212
+ };
213
+ })) || [];
214
+ this.webReturnObject.basket["taxBreakdown"] = {
215
+ taxLines,
216
+ totalTaxableAmount: this.orderDetails.tax_amount || 0
217
+ };
218
+ AppLoggerService.logDebug(this.className, "updateTaxBreakdown", `Mapped ${taxLines.length} tax lines.`);
219
+ AppLoggerService.logDebug(this.className, "updateTaxBreakdown", "Mapping ended...");
220
+ return this;
221
+ }
222
+ deviceId(deviceId) {
223
+ this.webReturnObject.deviceId = deviceId;
224
+ return this;
225
+ }
226
+ terminalId(terminalId) {
227
+ this.webReturnObject.terminalId = terminalId;
228
+ return this;
229
+ }
230
+ orgCode(orgCode) {
231
+ this.webReturnObject.orgCode = orgCode;
232
+ return this;
233
+ }
234
+ storeId() {
235
+ this.webReturnObject.storeId = this.orderDetails.store_id;
236
+ return this;
237
+ }
238
+ storeNodeId(storeNodeId) {
239
+ this.webReturnObject.storeNodeId = storeNodeId;
240
+ return this;
241
+ }
242
+ storeNodeStructure(storeNodeStructure) {
243
+ this.webReturnObject.storeNodeStructure = storeNodeStructure;
244
+ return this;
245
+ }
246
+ docId(docId) {
247
+ this.webReturnObject.id = docId;
248
+ return this;
249
+ }
250
+ updateUserID(userID) {
251
+ this.webReturnObject.userId = userID;
252
+ return this;
253
+ }
254
+ updateUserName(name) {
255
+ this.webReturnObject.userName = name;
256
+ return this;
257
+ }
258
+ build() {
259
+ AppLoggerService.logDebug(this.className, "build", "Mapping done...");
260
+ return this.webReturnObject;
261
+ }
262
+ getUTCDateTime(date) {
263
+ if (date) {
264
+ return new Date(date).toISOString();
265
+ }
266
+ }
267
+ }
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViUmV0dXJuTWFnZW50bzJSZXN0VjEuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBwZXItbGlicmFyeS9zcmMvbGliL1dlYlJldHVybk1hZ2VudG8yUmVzdFYxLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBd0ksaUJBQWlCLEVBQWdDLFNBQVMsRUFBNEwsTUFBTSx3QkFBd0IsQ0FBQztBQUNwYSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUV4RixNQUFNLE9BQU8seUNBQXlDO0lBbUNsRCxZQUFZLFlBQWlCLEVBQ2pCLFlBQTJCO1FBQTNCLGlCQUFZLEdBQVosWUFBWSxDQUFlO1FBbEN2QyxjQUFTLEdBQUcsMkNBQTJDLENBQUM7UUFFaEQsb0JBQWUsR0FBd0I7WUFDM0MsRUFBRSxFQUFFLEVBQUU7WUFDTixPQUFPLEVBQUUsRUFBRTtZQUNYLE9BQU8sRUFBRSxFQUFFO1lBQ1gsV0FBVyxFQUFFLEVBQUU7WUFDZixrQkFBa0IsRUFBRSxFQUFFO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLEVBQUU7WUFDZCxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3BCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsY0FBYyxFQUFFLEtBQUs7WUFDckIsTUFBTSxFQUFFLEVBQUU7WUFDVixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsRUFBRTtZQUNoQixRQUFRLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osY0FBYyxFQUFFLEVBQUU7Z0JBQ2xCLGVBQWUsRUFBRSxFQUFFO2dCQUNuQixlQUFlLEVBQUUsRUFBRTtnQkFDbkIs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LEdBQUcsTUFBTSxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBSTtRQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSztRQUNELGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQUk7UUFDZixJQUFJLElBQUksRUFBRTtZQUNOLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdkM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IEFkZHJlc3MsIEJhc2tldFN1bW1hcnksIEJhc2tldFN1bW1hcnlEZXRhaWxzLCBDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLCBDdXN0b21lciwgREVMSVZFUllfTUVUSE9EUywgUFJPTU9USU9OX0xFVkVMLCBQUk9NT1RJT05fVFlQRSwgSU5JVElBVElOR19NT0RVTEUsIExpbmVQcm9tb3Rpb25zLCBPcmRlckRldGFpbHMsIFBST1ZJREVSUywgU2hpcG1lbnREZXRhaWxzLCBUUkFOU0FDVElPTl9UWVBFLCBUcmFuc2FjdGlvbkRvY3VtZW50LCBUcmFuc2FjdGlvbkluZm8sIFRyYW5zYWN0aW9uUHJvbW90aW9uLCBUcmlnZ2VyLCBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlscywgVFByb2R1Y3QsIFJlZnVuZFByb2R1Y3RDaGFuZ2UsIENvdXBvbnMsIFRheEJyZWFrZG93biB9IGZyb20gXCIuL21hcHBlci1saWJyYXJ5Lm1vZGVsXCI7XHJcbmltcG9ydCB7IE51bWJlclV0aWxTZXJ2aWNlIH0gZnJvbSBcIi4vbnVtYmVyLXV0aWwuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBcHBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnQHBtY3JldGFpbC9jb21tb24tc2VydmljZXMvY29tbW9uL2FwcC1sb2dnZXIuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgV2ViUmV0dXJuTWFnZW50bzJSZXN0VjFNYXBwZXJCdWlsZGVyQ2xhc3Mge1xyXG5cclxuICAgIGNsYXNzTmFtZSA9IFwiV2ViUmV0dXJuTWFnZW50bzJSZXN0VjFNYXBwZXJCdWlsZGVyQ2xhc3NcIjtcclxuICAgIHByaXZhdGUgb3JkZXJEZXRhaWxzOiBhbnk7XHJcbiAgICBwcml2YXRlIHdlYlJldHVybk9iamVjdDogVHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcclxuICAgICAgICBpZDogJycsXHJcbiAgICAgICAgb3JnQ29kZTogXCJcIixcclxuICAgICAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcclxuICAgICAgICBkZXZpY2VJZDogXCJcIixcclxuICAgICAgICB0ZXJtaW5hbElkOiBcIlwiLFxyXG4gICAgICAgIGluaXRpYXRpbmdNb2R1bGU6IFwiXCIsXHJcbiAgICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgICBpc0luU3RvcmVPcmRlcjogZmFsc2UsXHJcbiAgICAgICAgYmFza2V0OiB7fSxcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5OiB7fSxcclxuICAgICAgICBiYXNlQ3VycmVuY3k6IFwiXCIsXHJcbiAgICAgICAgY3VzdG9tZXI6IHtcclxuICAgICAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgYmlsbGluZ0FkZHJlc3M6IFtdLFxyXG4gICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IFtdLFxyXG4gICAgICAgICAgICBzaGlwbWVudERldGFpbHM6IFtdLFxyXG4gICAgICAgICAgICB0ZWxlcGhvbmU6ICcnLFxyXG4gICAgICAgICAgICBwb3N0Q29kZTogJycsXHJcbiAgICAgICAgICAgIG5vQ3VzdG9tZXJTZWxlY3RlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHM6IHt9IGFzIEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMsXHJcbiAgICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHM6IFtdIGFzIGV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzW11cclxuICAgIH1cclxuICAgIG51bWJlclV0aWxTZXJ2aWNlOiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3JkZXJEZXRhaWxzOiBhbnksXHJcbiAgICAgICAgcHJpdmF0ZSBjdXJyZW5jeVBpcGU/OiBDdXJyZW5jeVBpcGVcclxuICAgICAgICApIHtcclxuICAgICAgICBpZiAob3JkZXJEZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJEZXRhaWxzID0gb3JkZXJEZXRhaWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlID0gbmV3IE51bWJlclV0aWxTZXJ2aWNlKGN1cnJlbmN5UGlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2ViUmV0dXJuQ29tbW9uTWFwcGVyKCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyXCIsIFwiTWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydkYXRldGltZSddID0gdGhpcy5nZXRVVENEYXRlVGltZSh0aGlzLm9yZGVyRGV0YWlscy51cGRhdGVkX2F0KTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNlQ3VycmVuY3kgPSB0aGlzLm9yZGVyRGV0YWlscy5vcmRlcl9jdXJyZW5jeV9jb2RlO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN1YnNpZGlhcnlJZCA9ICcxJztcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5leHBvcnQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmluaXRpYXRpbmdNb2R1bGUgPSBJTklUSUFUSU5HX01PRFVMRS5FQkFTS0VUO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmNyZWF0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5vcmRlckRldGFpbHMuY3JlYXRlZF9hdCk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudXBkYXRlZEF0ID0gdGhpcy5nZXRVVENEYXRlVGltZSh0aGlzLm9yZGVyRGV0YWlscy51cGRhdGVkX2F0KTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC50cmFuc0NvbXBsZXRlZEF0ID0gdGhpcy5nZXRVVENEYXRlVGltZSh0aGlzLm9yZGVyRGV0YWlscy51cGRhdGVkX2F0KTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnZXh0ZXJuYWxUcmFuc2FjdGlvbklkJ10gPSB0aGlzLm9yZGVyRGV0YWlscy5pbmNyZW1lbnRfaWQ7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ3ZWJSZXR1cm5Db21tb25NYXBwZXJcIiwgXCJNYXBwaW5nIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2R1Y3QoKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJwcm9kdWN0XCIsIFwiTWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXSA9IHRoaXMub3JkZXJEZXRhaWxzLml0ZW1zXHJcbiAgICAgICAgICAgID8uZmlsdGVyKHByb2R1Y3QgPT4gcHJvZHVjdD8uYmFzZV9wcmljZSlcclxuICAgICAgICAgICAgLm1hcCgocHJvZHVjdCwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5uYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgU0tVOiBwcm9kdWN0LnNrdSB8fCAnJyxcclxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBwcm9kdWN0LnF0eV9vcmRlcmVkIHx8IDAsXHJcbiAgICAgICAgICAgICAgICByZWZ1bmRlZFF1YW50aXR5OiBwcm9kdWN0LnF0eV9yZWZ1bmRlZCB8fCAwLFxyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHByb2R1Y3QuYmFzZV9wcmljZSB8fCAwLFxyXG4gICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogKGluZGV4ICsgMSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGV4dGVybmFsSXRlbUxpbmVJZDogcHJvZHVjdC5pdGVtX2lkIHx8IChpbmRleCArIDEpLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICB0b3RhbExpbmVQcmljZTogKHByb2R1Y3QucXR5X29yZGVyZWQgPz8gMCkgKiAocHJvZHVjdC5iYXNlX3ByaWNlID8/IDApLFxyXG4gICAgICAgICAgICAgICAgcmVmdW5kZWRUb3RhbDogcHJvZHVjdC5hbW91bnRfcmVmdW5kZWQgfHwgMFxyXG4gICAgICAgICAgICB9KSkgfHwgW107XHJcbiAgICBcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInByb2R1Y3RcIiwgXCJNYXBwaW5nIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGxpbmVQcm9tb3Rpb24oKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJsaW5lUHJvbW90aW9uXCIsIFwiTWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgXHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10gPSB0aGlzLm9yZGVyRGV0YWlscy5pdGVtc1xyXG4gICAgICAgICAgICA/LmZpbHRlcihwcm9kdWN0ID0+IHByb2R1Y3Q/LmJhc2VfcHJpY2UgJiYgcHJvZHVjdC5kaXNjb3VudF9hbW91bnQpXHJcbiAgICAgICAgICAgIC5tYXAoKHByb2R1Y3QsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlcjogW3sgXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogKGluZGV4ICsgMSkudG9TdHJpbmcoKSwgXHJcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IHByb2R1Y3QucXR5X29yZGVyZWQgfHwgMCBcclxuICAgICAgICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogaW5kZXggKyAxLFxyXG4gICAgICAgICAgICAgICAgcHJvbW90aW9uSWQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheVRleHQ6IHRoaXMub3JkZXJEZXRhaWxzLmNvdXBvbl9jb2RlIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgcHJvbW90aW9uVHlwZTogJycsXHJcbiAgICAgICAgICAgICAgICBwcm9tb3Rpb25BbW91bnQ6IHByb2R1Y3QuZGlzY291bnRfYW1vdW50IHx8IDAsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm9yZGVyRGV0YWlscy5jb3Vwb25fY29kZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgIHByb21vdGlvbkluZm86ICcnLFxyXG4gICAgICAgICAgICAgICAgcHJvbW90aW9uTGluZVByaWNlOiBwcm9kdWN0LnJvd190b3RhbCB8fCAwXHJcbiAgICAgICAgICAgIH0pKSB8fCBbXTtcclxuICAgIFxyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwibGluZVByb21vdGlvblwiLCBcIk1hcHBpbmcgZW5kZWQuLi5cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9ICAgIFxyXG4gICAgICBcclxuICAgIGN1c3RvbWVyKCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY3VzdG9tZXJcIiwgXCJNYXBwaW5nIHN0YXJ0ZWQuLi5cIik7XHJcbiAgICBcclxuICAgICAgICBjb25zdCB7IG9yZGVyRGV0YWlscywgd2ViUmV0dXJuT2JqZWN0IH0gPSB0aGlzO1xyXG4gICAgXHJcbiAgICAgICAgd2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyID0ge1xyXG4gICAgICAgICAgICBpZDogb3JkZXJEZXRhaWxzLmN1c3RvbWVyX2lkIHx8ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogb3JkZXJEZXRhaWxzLmN1c3RvbWVyX2VtYWlsIHx8ICcnLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IG9yZGVyRGV0YWlscy5jdXN0b21lcl9maXJzdG5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiBvcmRlckRldGFpbHMuY3VzdG9tZXJfbGFzdG5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczogW10sXHJcbiAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzOiBbXVxyXG4gICAgICAgIH0gYXMgYW55O1xyXG4gICAgXHJcbiAgICAgICAgY29uc3Qgc2hpcHBpbmdBc3NpZ25tZW50cyA9IG9yZGVyRGV0YWlscy5leHRlbnNpb25fYXR0cmlidXRlcz8uc2hpcHBpbmdfYXNzaWdubWVudHMgfHwgW107XHJcbiAgICBcclxuICAgICAgICB3ZWJSZXR1cm5PYmplY3QuY3VzdG9tZXIuc2hpcHBpbmdBZGRyZXNzID0gc2hpcHBpbmdBc3NpZ25tZW50c1xyXG4gICAgICAgICAgICAuZmlsdGVyKHNoaXBtZW50ID0+IHNoaXBtZW50Py5zaGlwcGluZz8uYWRkcmVzcylcclxuICAgICAgICAgICAgLm1hcChzaGlwbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gc2hpcG1lbnQuc2hpcHBpbmcuYWRkcmVzcztcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGFkZHJlc3MuY3VzdG9tZXJfYWRkcmVzc19pZCB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogYWRkcmVzcy5jb3VudHJ5X2lkIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MxOiBhZGRyZXNzLnN0cmVldD8uWzBdIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MyOiBhZGRyZXNzLnN0cmVldD8uWzFdIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MzOiBhZGRyZXNzLnN0cmVldD8uWzJdIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNpdHk6IGFkZHJlc3MuY2l0eSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBjb3VudHJ5OiAnJyxcclxuICAgICAgICAgICAgICAgICAgICBwb3N0Q29kZTogYWRkcmVzcy5wb3N0Y29kZSB8fCAnJ1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICBcclxuICAgICAgICBjb25zdCBiaWxsaW5nQWRkcmVzcyA9IG9yZGVyRGV0YWlscy5iaWxsaW5nX2FkZHJlc3M7XHJcbiAgICAgICAgaWYgKGJpbGxpbmdBZGRyZXNzKSB7XHJcbiAgICAgICAgICAgIHdlYlJldHVybk9iamVjdC5jdXN0b21lci5iaWxsaW5nQWRkcmVzcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGlkOiBiaWxsaW5nQWRkcmVzcy5jdXN0b21lcl9hZGRyZXNzX2lkIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgY291bnRyeUNvZGU6IGJpbGxpbmdBZGRyZXNzLmNvdW50cnlfaWQgfHwgJycsXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzMTogYmlsbGluZ0FkZHJlc3Muc3RyZWV0Py5bMF0gfHwgJycsXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzMjogYmlsbGluZ0FkZHJlc3Muc3RyZWV0Py5bMV0gfHwgJycsXHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzMzogYmlsbGluZ0FkZHJlc3Muc3RyZWV0Py5bMl0gfHwgJycsXHJcbiAgICAgICAgICAgICAgICBjaXR5OiBiaWxsaW5nQWRkcmVzcy5jaXR5IHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgY291bnRyeTogJycsXHJcbiAgICAgICAgICAgICAgICBwb3N0Q29kZTogYmlsbGluZ0FkZHJlc3MucG9zdGNvZGUgfHwgJydcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjdXN0b21lclwiLCBcIk1wcGluZyBlbmRlZC4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0gICAgXHJcblxyXG4gICAgaXNJblN0b3JlT3JkZXIoKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJpc0luU3RvcmVPcmRlclwiLCBcIk1hcHBpbmcgc3RhcnRlZC4uLlwiKTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pc0luU3RvcmVPcmRlciA9IGZhbHNlO1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiaXNJblN0b3JlT3JkZXJcIiwgXCJNYXBwaW5nIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzKGludm9pY2VJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc1wiLCBcIk1hcHBpbmcgc3RhcnRlZC4uLlwiKTtcclxuICAgIFxyXG4gICAgICAgIGNvbnN0IGNvdXBvbiA9IHRoaXMub3JkZXJEZXRhaWxzLmNvdXBvbl9jb2RlXHJcbiAgICAgICAgICAgID8geyBuYW1lOiB0aGlzLm9yZGVyRGV0YWlscy5jb3Vwb25fY29kZSwgaWQ6IHRoaXMub3JkZXJEZXRhaWxzLmNvdXBvbl9jb2RlIH1cclxuICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgXHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHNPYmogPSB7XHJcbiAgICAgICAgICAgIHVuaXF1ZUlkOiB0aGlzLm9yZGVyRGV0YWlscy5pbmNyZW1lbnRfaWQgfHwgJycsXHJcbiAgICAgICAgICAgIHByb3ZpZGVyVHlwZTogUFJPVklERVJTLk1BR0VOVE8yLFxyXG4gICAgICAgICAgICB0cmFuc2FjdGlvbkluZm86IHsgaW52b2ljZUlkOiBpbnZvaWNlSWQ/LnRvU3RyaW5nKCkgfHwgJycgfSxcclxuICAgICAgICAgICAgY291cG9uczogY291cG9uID8gW2NvdXBvbl0gOiBbXVxyXG4gICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5leHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlscy5wdXNoKGV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzT2JqKTtcclxuICAgIFxyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHNcIiwgXCJNYXBwaW5nIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGJhc2tldFN1bW1hcnkoKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJiYXNrZXRTdW1tYXJ5XCIsIFwiTWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgXHJcbiAgICAgICAgY29uc3QgeyBvcmRlckRldGFpbHMsIHdlYlJldHVybk9iamVjdCB9ID0gdGhpcztcclxuXHJcbiAgICAgICAgY29uc3QgYmFza2V0U3VtbWFyeTogQmFza2V0U3VtbWFyeSA9IHtcclxuICAgICAgICAgICAgZGlzY291bnRUb3RhbDogb3JkZXJEZXRhaWxzLmRpc2NvdW50X2Ftb3VudCB8fCAwLFxyXG4gICAgICAgICAgICBWQVRUb3RhbDogb3JkZXJEZXRhaWxzLnRheF9hbW91bnQgfHwgMCxcclxuICAgICAgICAgICAgc2FsZVRvdGFsOiBvcmRlckRldGFpbHMuc3VidG90YWwgfHwgMCxcclxuICAgICAgICAgICAgYmFza2V0VG90YWw6IChvcmRlckRldGFpbHMuc3VidG90YWwgfHwgMCkgLSAob3JkZXJEZXRhaWxzLnRvdGFsX29ubGluZV9yZWZ1bmRlZCB8fCAwKSxcclxuICAgICAgICAgICAgdG90YWxJdGVtczogb3JkZXJEZXRhaWxzLnRvdGFsX3F0eV9vcmRlcmVkID8/IDAsXHJcbiAgICAgICAgICAgIHJlZnVuZFRvdGFsOiBvcmRlckRldGFpbHMudG90YWxfb25saW5lX3JlZnVuZGVkIHx8IDAsXHJcbiAgICAgICAgICAgIHNoaXBwaW5nVG90YWw6IG9yZGVyRGV0YWlscy5zaGlwcGluZ19pbmNsX3RheCB8fCAwLFxyXG4gICAgICAgICAgICBiYXNrZXRUb3RhbFdpdGhTaGlwcGluZ1RvdGFsOiBvcmRlckRldGFpbHMudG90YWxfaW52b2ljZWQgfHwgMCxcclxuICAgICAgICAgICAgd2ViT3JkZXI6IHtcclxuICAgICAgICAgICAgICAgIHNoaXBwaW5nVG90YWw6IG9yZGVyRGV0YWlscy5zaGlwcGluZ19pbmNsX3RheCB8fCAwLFxyXG4gICAgICAgICAgICAgICAgYmFza2V0VG90YWxXaXRoU2hpcHBpbmdUb3RhbDogb3JkZXJEZXRhaWxzLnRvdGFsX2ludm9pY2VkIHx8IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICB3ZWJSZXR1cm5PYmplY3QuYmFza2V0U3VtbWFyeSA9IGJhc2tldFN1bW1hcnk7XHJcbiAgICBcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImJhc2tldFN1bW1hcnlcIiwgXCJNYXBwaW5nIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICByZWZ1bmRSZXF1ZXN0KCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwicmVmdW5kUmVxdWVzdFwiLCBcIk1hcHBpbmcgc3RhcnRlZC4uLlwiKTtcclxuICAgIFxyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnJlZnVuZFJlcXVlc3QgPSB0aGlzLm9yZGVyRGV0YWlscy5pdGVtc1xyXG4gICAgICAgICAgICA/LmZpbHRlcihwcm9kdWN0ID0+IHByb2R1Y3Q/LmJhc2VfcHJpY2UgJiYgKHByb2R1Y3QucXR5X3JlZnVuZGVkIHx8IDApID4gMClcclxuICAgICAgICAgICAgLm1hcCgocHJvZHVjdCwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgICAgICAgICBpdGVtTGluZUlkOiBpbmRleCArIDEsXHJcbiAgICAgICAgICAgICAgICByZWZ1bmRlZFF1YW50aXR5OiBwcm9kdWN0LnF0eV9yZWZ1bmRlZCB8fCAwLFxyXG4gICAgICAgICAgICAgICAgcmVmdW5kV2l0aFByb21vdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBwcm9kdWN0LnF0eV9vcmRlcmVkIHx8IDBcclxuICAgICAgICAgICAgfSkpIHx8IFtdO1xyXG4gICAgXHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJyZWZ1bmRSZXF1ZXN0XCIsIGBNYXBwZWQgJHt0aGlzLndlYlJldHVybk9iamVjdC5yZWZ1bmRSZXF1ZXN0Lmxlbmd0aH0gcmVmdW5kIGl0ZW1zLmApO1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwicmVmdW5kUmVxdWVzdFwiLCBcIk1hcHBpbmcgZW5kZWQuLi5cIik7XHJcbiAgICBcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVUYXhCcmVha2Rvd24oKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVUYXhCcmVha2Rvd25cIiwgXCJNYXBwaW5nIHN0YXJ0ZWQuLi5cIik7XHJcbiAgICBcclxuICAgICAgICBjb25zdCB0YXhMaW5lcyA9IHRoaXMub3JkZXJEZXRhaWxzLml0ZW1zXHJcbiAgICAgICAgICAgID8uZmlsdGVyKHByb2R1Y3QgPT4gcHJvZHVjdD8uYmFzZV9wcmljZSlcclxuICAgICAgICAgICAgLm1hcCgocHJvZHVjdCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRheGFibGVBbW91bnQgPSBwcm9kdWN0LnJvd190b3RhbF9pbmNsX3RheCB8fCAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgVkFUID0gcHJvZHVjdC50YXhfcGVyY2VudCB8fCAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJlVGF4ID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIoKHRheGFibGVBbW91bnQgKiAxMDApIC8gKDEwMCArIFZBVCkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGF4TGluZVRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGF4YWJsZUFtb3VudCAtIHByZVRheCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogaW5kZXggKyAxLFxyXG4gICAgICAgICAgICAgICAgICAgIFZBVCxcclxuICAgICAgICAgICAgICAgICAgICBWQVRDb2RlOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICB0YXhhYmxlQW1vdW50LFxyXG4gICAgICAgICAgICAgICAgICAgIFByZVRheDogcHJlVGF4LFxyXG4gICAgICAgICAgICAgICAgICAgIHRheExpbmVUb3RhbFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSkgfHwgW107XHJcbiAgICBcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbXCJ0YXhCcmVha2Rvd25cIl0gPSB7XHJcbiAgICAgICAgICAgIHRheExpbmVzLFxyXG4gICAgICAgICAgICB0b3RhbFRheGFibGVBbW91bnQ6IHRoaXMub3JkZXJEZXRhaWxzLnRheF9hbW91bnQgfHwgMFxyXG4gICAgICAgIH0gYXMgVGF4QnJlYWtkb3duO1xyXG4gICAgXHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVUYXhCcmVha2Rvd25cIiwgYE1hcHBlZCAke3RheExpbmVzLmxlbmd0aH0gdGF4IGxpbmVzLmApO1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlVGF4QnJlYWtkb3duXCIsIFwiTWFwcGluZyBlbmRlZC4uLlwiKTtcclxuICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGRldmljZUlkKGRldmljZUlkKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuZGV2aWNlSWQgPSBkZXZpY2VJZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICB0ZXJtaW5hbElkKHRlcm1pbmFsSWQpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC50ZXJtaW5hbElkID0gdGVybWluYWxJZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBvcmdDb2RlKG9yZ0NvZGUpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5vcmdDb2RlID0gb3JnQ29kZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdG9yZUlkKCkge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN0b3JlSWQgPSB0aGlzLm9yZGVyRGV0YWlscy5zdG9yZV9pZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdG9yZU5vZGVJZChzdG9yZU5vZGVJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVOb2RlSWQgPSBzdG9yZU5vZGVJZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdG9yZU5vZGVTdHJ1Y3R1cmUoc3RvcmVOb2RlU3RydWN0dXJlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5zdG9yZU5vZGVTdHJ1Y3R1cmUgPSBzdG9yZU5vZGVTdHJ1Y3R1cmU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZG9jSWQoZG9jSWQpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pZCA9IGRvY0lkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVVzZXJJRCh1c2VySUQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnVzZXJJZCA9IHVzZXJJRDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVVc2VyTmFtZShuYW1lKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudXNlck5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkKCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYnVpbGRcIiwgXCJNYXBwaW5nIGRvbmUuLi5cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2ViUmV0dXJuT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVUQ0RhdGVUaW1lKGRhdGUpIHtcclxuICAgICAgICBpZiAoZGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19