@pmcretail/mapper-library 0.0.44 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/bundles/pmcretail-mapper-library.umd.js +4373 -4105
- package/bundles/pmcretail-mapper-library.umd.js.map +1 -1
- package/esm2015/lib/RJ-mapper.class.js +877 -875
- package/esm2015/lib/TransactionDocumentBuilder.js +1244 -1240
- package/esm2015/lib/WebReturn-mapper.class.js +326 -324
- package/esm2015/lib/WebReturnMagentoV2Rest.class.js +262 -0
- package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -410
- package/esm2015/lib/basket.service.js +527 -516
- package/esm2015/lib/mapper-library.component.js +26 -26
- package/esm2015/lib/mapper-library.model.js +40 -39
- package/esm2015/lib/mapper-library.module.js +21 -21
- package/esm2015/lib/number-util.service.js +42 -40
- package/esm2015/pmcretail-mapper-library.js +4 -4
- package/esm2015/public-api.js +10 -9
- package/fesm2015/pmcretail-mapper-library.js +3733 -3458
- package/fesm2015/pmcretail-mapper-library.js.map +1 -1
- package/lib/RJ-mapper.class.d.ts +80 -79
- package/lib/RJ-mapper.class.d.ts.map +1 -1
- package/lib/TransactionDocumentBuilder.d.ts +271 -270
- package/lib/TransactionDocumentBuilder.d.ts.map +1 -1
- package/lib/WebReturn-mapper.class.d.ts +27 -26
- package/lib/WebReturn-mapper.class.d.ts.map +1 -1
- package/lib/WebReturnMagentoV2Rest.class.d.ts +29 -0
- package/lib/WebReturnMagentoV2Rest.class.d.ts.map +1 -0
- package/lib/WebReturnSalesforceMapper.class.d.ts +35 -34
- package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -1
- package/lib/basket.service.d.ts +105 -104
- package/lib/basket.service.d.ts.map +1 -1
- package/lib/mapper-library.component.d.ts +8 -8
- package/lib/mapper-library.model.d.ts +694 -693
- package/lib/mapper-library.model.d.ts.map +1 -1
- package/lib/mapper-library.module.d.ts +7 -7
- package/lib/number-util.service.d.ts +13 -12
- package/lib/number-util.service.d.ts.map +1 -1
- package/package.json +2 -2
- package/pmcretail-mapper-library.d.ts +5 -5
- package/public-api.d.ts +6 -5
- package/public-api.d.ts.map +1 -1
|
@@ -0,0 +1,262 @@
|
|
|
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 WebReturnMagentoV2RestMapperBuilderClass {
|
|
5
|
+
constructor(orderDetails, currencyPipe) {
|
|
6
|
+
this.currencyPipe = currencyPipe;
|
|
7
|
+
this.className = "WebReturnMagentoV2RestMapperBuilderClass";
|
|
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
|
+
};
|
|
36
|
+
if (orderDetails) {
|
|
37
|
+
this.orderDetails = orderDetails;
|
|
38
|
+
}
|
|
39
|
+
this.numberUtilService = new NumberUtilService(currencyPipe);
|
|
40
|
+
}
|
|
41
|
+
webReturnCommonMapper() {
|
|
42
|
+
AppLoggerService.logDebug(this.className, "webReturnCommonMapper", "webReturnCommonMapper started...");
|
|
43
|
+
// this.webReturnObject['type'] = TRANSACTION_TYPE.WEB_RETURNS; // TODO
|
|
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", "webReturnCommonMapper ended...");
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
// getDeliveryMethod() {
|
|
57
|
+
// if(this.orderDetails.shipments && this.orderDetails.shipments.length > 0) {
|
|
58
|
+
// const shipToStoreShipment = this.orderDetails.shipments.find(shipment => shipment.c_fromStoreId);
|
|
59
|
+
// if(shipToStoreShipment) return DELIVERY_METHODS.SHIP_TO_STORE;
|
|
60
|
+
// else return DELIVERY_METHODS.DELIVERY;
|
|
61
|
+
// } else {
|
|
62
|
+
// return '';
|
|
63
|
+
// }
|
|
64
|
+
// }
|
|
65
|
+
product() {
|
|
66
|
+
AppLoggerService.logDebug(this.className, "product", "product mapping started...");
|
|
67
|
+
this.webReturnObject.basket['products'] = [];
|
|
68
|
+
if (this.orderDetails.items && this.orderDetails.items.length > 0) {
|
|
69
|
+
let index = 0;
|
|
70
|
+
this.orderDetails.items.forEach((product) => {
|
|
71
|
+
if (product && product.base_price) {
|
|
72
|
+
const productObj = {
|
|
73
|
+
description: product.name ? product.name : '',
|
|
74
|
+
SKU: product.sku ? product.sku : '',
|
|
75
|
+
quantity: product.qty_ordered ? product.qty_ordered : 0,
|
|
76
|
+
refundedQuantity: product.qty_refunded ? product.qty_refunded : 0,
|
|
77
|
+
price: product.base_price ? product.base_price : 0,
|
|
78
|
+
itemLineId: (index + 1).toString(),
|
|
79
|
+
externalItemLineId: product.item_id ? product.item_id : (index + 1).toString(),
|
|
80
|
+
// deliveryMethod: this.getDeliveryMethod().toString(),
|
|
81
|
+
totalLinePrice: (product.qty_ordered && product.base_price) ? (product.qty_ordered * product.base_price) : 0
|
|
82
|
+
};
|
|
83
|
+
this.webReturnObject.basket['products'].push(productObj);
|
|
84
|
+
index++;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
AppLoggerService.logDebug(this.className, "product", "product mapping ended...");
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
linePromotion() {
|
|
92
|
+
AppLoggerService.logDebug(this.className, "linePromotion", "linePromotion mapping started...");
|
|
93
|
+
this.webReturnObject.basket['linePromotion'] = [];
|
|
94
|
+
if (this.orderDetails.items && this.orderDetails.items.length > 0) {
|
|
95
|
+
let index = 0;
|
|
96
|
+
this.orderDetails.items.forEach((product) => {
|
|
97
|
+
if (product && product.base_price) {
|
|
98
|
+
let linePromotionObj = {};
|
|
99
|
+
let trigger = {};
|
|
100
|
+
trigger.itemLineId = (index + 1).toString();
|
|
101
|
+
trigger.quantity = product.qty_ordered ? product.qty_ordered : 0;
|
|
102
|
+
linePromotionObj.trigger = [];
|
|
103
|
+
linePromotionObj.trigger.push(trigger);
|
|
104
|
+
linePromotionObj.itemLineId = index + 1;
|
|
105
|
+
linePromotionObj.promotionId = '';
|
|
106
|
+
linePromotionObj.displayText = this.orderDetails.coupon_code ? this.orderDetails.coupon_code : '';
|
|
107
|
+
linePromotionObj.promotionType = '';
|
|
108
|
+
linePromotionObj.promotionAmount = product.discount_amount ? product.discount_amount : 0;
|
|
109
|
+
linePromotionObj.name = this.orderDetails.coupon_code ? this.orderDetails.coupon_code : '';
|
|
110
|
+
;
|
|
111
|
+
linePromotionObj.promotionInfo = '';
|
|
112
|
+
linePromotionObj.promotionLinePrice = product.row_total ? product.row_total : 0;
|
|
113
|
+
this.webReturnObject.basket.linePromotion.push(linePromotionObj);
|
|
114
|
+
index++;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
AppLoggerService.logDebug(this.className, "linePromotion", "linePromotion mapping ended...");
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
customer() {
|
|
122
|
+
AppLoggerService.logDebug(this.className, "customer", "customer mapping started...");
|
|
123
|
+
this.webReturnObject.customer.id = this.orderDetails.customer_id ? this.orderDetails.customer_id : '';
|
|
124
|
+
this.webReturnObject.customer.email = this.orderDetails.customer_email ? this.orderDetails.customer_email : '';
|
|
125
|
+
this.webReturnObject.customer.firstName = this.orderDetails.customer_firstname ? this.orderDetails.customer_firstname : '';
|
|
126
|
+
this.webReturnObject.customer.lastName = this.orderDetails.customer_lastname ? this.orderDetails.customer_lastname : '';
|
|
127
|
+
const isShipping = this.orderDetails.extension_attributes &&
|
|
128
|
+
Object.values(this.orderDetails.extension_attributes).length > 0 && this.orderDetails.extension_attributes.shipping_assignments &&
|
|
129
|
+
this.orderDetails.extension_attributes.shipping_assignments.length > 0;
|
|
130
|
+
if (isShipping) {
|
|
131
|
+
this.orderDetails.extension_attributes.shipping_assignments.forEach(shipment => {
|
|
132
|
+
if (shipment.shipping && Object.values(shipment.shipping) && shipment.shipping.address && Object.values(shipment.shipping.address)) {
|
|
133
|
+
const address = shipment.shipping.address;
|
|
134
|
+
let shippingAddressObj = {};
|
|
135
|
+
shippingAddressObj.id = address.customer_address_id ? address.customer_address_id : '';
|
|
136
|
+
shippingAddressObj.countryCode = address.country_id ? address.country_id : '';
|
|
137
|
+
if (address.street && address.street.length > 0) {
|
|
138
|
+
shippingAddressObj.address1 = address.street[0] ? address.street[0] : '';
|
|
139
|
+
shippingAddressObj.address2 = address.street[1] ? address.street[1] : '';
|
|
140
|
+
shippingAddressObj.address3 = address.street[2] ? address.street[2] : '';
|
|
141
|
+
}
|
|
142
|
+
shippingAddressObj.city = address.city ? address.city : '';
|
|
143
|
+
shippingAddressObj.country = '';
|
|
144
|
+
shippingAddressObj.postCode = address.postcode ? address.postcode : '';
|
|
145
|
+
this.webReturnObject.customer.shippingAddress.push(shippingAddressObj);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (this.orderDetails.billing_address && Object.values(this.orderDetails.billing_address).length > 0) {
|
|
150
|
+
const address = this.orderDetails.billing_address;
|
|
151
|
+
let billingAddressObj = {};
|
|
152
|
+
billingAddressObj.id = address.customer_address_id ? address.customer_address_id : '';
|
|
153
|
+
billingAddressObj.countryCode = address.country_id ? address.country_id : '';
|
|
154
|
+
if (address.street && address.street.length > 0) {
|
|
155
|
+
billingAddressObj.address1 = address.street[0] ? address.street[0] : '';
|
|
156
|
+
billingAddressObj.address2 = address.street[1] ? address.street[1] : '';
|
|
157
|
+
billingAddressObj.address3 = address.street[2] ? address.street[2] : '';
|
|
158
|
+
}
|
|
159
|
+
billingAddressObj.city = address.city ? address.city : '';
|
|
160
|
+
billingAddressObj.country = '';
|
|
161
|
+
billingAddressObj.postCode = address.postcode ? address.postcode : '';
|
|
162
|
+
this.webReturnObject.customer.shippingAddress.push(billingAddressObj);
|
|
163
|
+
}
|
|
164
|
+
// let shipmentDetails = [] as ShipmentDetails[];
|
|
165
|
+
// this.orderDetails.shipments.forEach(
|
|
166
|
+
// shipment => {
|
|
167
|
+
// let shipmentDetailsObj = {} as ShipmentDetails;
|
|
168
|
+
// shipmentDetailsObj.id = shipment.shipment_id ? shipment.shipment_id : '';
|
|
169
|
+
// shipmentDetailsObj.deliveryGroup = shipment.shipment_id ? shipment.shipment_id : '';
|
|
170
|
+
// shipmentDetails.push(shipmentDetailsObj);
|
|
171
|
+
// }
|
|
172
|
+
// );
|
|
173
|
+
// customerObj.shipmentDetails = shipmentDetails;
|
|
174
|
+
// this.webReturnObject.customer = customerObj;
|
|
175
|
+
AppLoggerService.logDebug(this.className, "customer", "customer mapping ended...");
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
178
|
+
isInStoreOrder() {
|
|
179
|
+
AppLoggerService.logDebug(this.className, "isInStoreOrder", "isInStoreOrder mapping started...");
|
|
180
|
+
this.webReturnObject.isInStoreOrder = false;
|
|
181
|
+
AppLoggerService.logDebug(this.className, "isInStoreOrder", "isInStoreOrder mapping ended...");
|
|
182
|
+
return this;
|
|
183
|
+
}
|
|
184
|
+
externalTransactionDetails() {
|
|
185
|
+
AppLoggerService.logDebug(this.className, "externalTransactionDetails", "externalTransactionDetails mapping started...");
|
|
186
|
+
let externalTransactionDetails = [];
|
|
187
|
+
let externalTransactionDetailsObj = {};
|
|
188
|
+
let transactionInfo = {};
|
|
189
|
+
externalTransactionDetailsObj.uniqueId = this.orderDetails.increment_id ? this.orderDetails.increment_id : '';
|
|
190
|
+
externalTransactionDetailsObj.providerType = PROVIDERS.MAGENTO;
|
|
191
|
+
externalTransactionDetails.push(externalTransactionDetailsObj);
|
|
192
|
+
this.webReturnObject.externalTransactionDetails = externalTransactionDetails;
|
|
193
|
+
AppLoggerService.logDebug(this.className, "externalTransactionDetails", "externalTransactionDetails mapping ended...");
|
|
194
|
+
return this;
|
|
195
|
+
}
|
|
196
|
+
basketSummary() {
|
|
197
|
+
AppLoggerService.logDebug(this.className, "basketSummary", "basketSummary mapping started...");
|
|
198
|
+
let basketSummary = {};
|
|
199
|
+
let basketSummaryWebOrder = {};
|
|
200
|
+
const linePromotionTotal = this.webReturnObject.basket.linePromotion.map(linePromotion => linePromotion.promotionAmount).reduce((accumulator, currentValue) => accumulator + currentValue, 0);
|
|
201
|
+
const transactionPromotionTotal = 0;
|
|
202
|
+
basketSummary.discountTotal = linePromotionTotal + transactionPromotionTotal;
|
|
203
|
+
basketSummary.VATTotal = this.orderDetails.tax_amount ? this.orderDetails.tax_amount : 0;
|
|
204
|
+
basketSummary.saleTotal = this.orderDetails.subtotal ? this.orderDetails.subtotal : 0;
|
|
205
|
+
basketSummary.basketTotal = (this.orderDetails.subtotal && this.orderDetails.total_online_refunded) ? (this.orderDetails.subtotal - this.orderDetails.total_online_refunded) : 0;
|
|
206
|
+
basketSummary.totalItems = this.orderDetails.total_qty_ordered ? this.orderDetails.total_qty_ordered.length : 0;
|
|
207
|
+
basketSummary.shippingTotal = this.orderDetails.shipping_incl_tax ? this.orderDetails.shipping_incl_tax : 0;
|
|
208
|
+
basketSummary.basketTotalWithShippingTotal = this.orderDetails.total_invoiced ? this.orderDetails.total_invoiced : 0;
|
|
209
|
+
basketSummaryWebOrder.shippingTotal = this.orderDetails.shipping_incl_tax ? this.orderDetails.shipping_incl_tax : 0;
|
|
210
|
+
basketSummaryWebOrder.basketTotalWithShippingTotal = this.orderDetails.total_invoiced ? this.orderDetails.total_invoiced : 0;
|
|
211
|
+
basketSummary.webOrder = basketSummaryWebOrder;
|
|
212
|
+
this.webReturnObject.basketSummary = basketSummary;
|
|
213
|
+
AppLoggerService.logDebug(this.className, "basketSummary", "basketSummary mapping ended...");
|
|
214
|
+
return this;
|
|
215
|
+
}
|
|
216
|
+
deviceId(deviceId) {
|
|
217
|
+
this.webReturnObject.deviceId = deviceId;
|
|
218
|
+
return this;
|
|
219
|
+
}
|
|
220
|
+
terminalId(terminalId) {
|
|
221
|
+
this.webReturnObject.terminalId = terminalId;
|
|
222
|
+
return this;
|
|
223
|
+
}
|
|
224
|
+
orgCode(orgCode) {
|
|
225
|
+
this.webReturnObject.orgCode = orgCode;
|
|
226
|
+
return this;
|
|
227
|
+
}
|
|
228
|
+
storeId() {
|
|
229
|
+
this.webReturnObject.storeId = this.orderDetails.store_id;
|
|
230
|
+
return this;
|
|
231
|
+
}
|
|
232
|
+
storeNodeId(storeNodeId) {
|
|
233
|
+
this.webReturnObject.storeNodeId = storeNodeId;
|
|
234
|
+
return this;
|
|
235
|
+
}
|
|
236
|
+
storeNodeStructure(storeNodeStructure) {
|
|
237
|
+
this.webReturnObject.storeNodeStructure = storeNodeStructure;
|
|
238
|
+
return this;
|
|
239
|
+
}
|
|
240
|
+
docId(docId) {
|
|
241
|
+
this.webReturnObject.id = docId;
|
|
242
|
+
return this;
|
|
243
|
+
}
|
|
244
|
+
updateUserID(userID) {
|
|
245
|
+
this.webReturnObject.userId = userID;
|
|
246
|
+
return this;
|
|
247
|
+
}
|
|
248
|
+
updateUserName(name) {
|
|
249
|
+
this.webReturnObject.userName = name;
|
|
250
|
+
return this;
|
|
251
|
+
}
|
|
252
|
+
build() {
|
|
253
|
+
AppLoggerService.logDebug(this.className, "build", "mapping done...");
|
|
254
|
+
return this.webReturnObject;
|
|
255
|
+
}
|
|
256
|
+
getUTCDateTime(date) {
|
|
257
|
+
if (date) {
|
|
258
|
+
return new Date(date).toISOString();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViUmV0dXJuTWFnZW50b1YyUmVzdC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hcHBlci1saWJyYXJ5L3NyYy9saWIvV2ViUmV0dXJuTWFnZW50b1YyUmVzdC5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXdJLGlCQUFpQixFQUFnQyxTQUFTLEVBQXFLLE1BQU0sd0JBQXdCLENBQUM7QUFDN1ksT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFFeEYsTUFBTSxPQUFPLHdDQUF3QztJQWtDakQsWUFBWSxZQUFpQixFQUNqQixZQUEyQjtRQUEzQixpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQWpDdkMsY0FBUyxHQUFHLDBDQUEwQyxDQUFDO1FBRS9DLG9CQUFlLEdBQXdCO1lBQzNDLEVBQUUsRUFBRSxFQUFFO1lBQ04sT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPLEVBQUUsRUFBRTtZQUNYLFdBQVcsRUFBRSxFQUFFO1lBQ2Ysa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixNQUFNLEVBQUUsS0FBSztZQUNiLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsUUFBUSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxFQUFFO2dCQUNiLFFBQVEsRUFBRSxFQUFFO2dCQUNaLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixlQUFlLEVBQUUsRUFBRTtnQkFDbkIsZUFBZSxFQUFFLEVBQUU7Z0JBQ25CLFNB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TyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdkYsa0JBQWtCLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFFOUUsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDN0Msa0JBQWtCLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDekUsa0JBQWtCLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDekUsa0JBQWtCLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQkFDNUU7b0JBRUQsa0JBQWtCLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDM0Qsa0JBQWtCLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDaEMsa0JBQWtCLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdkUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxR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QWUsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUM3RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFjO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELEtBQUs7UUFDRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN0RSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFJO1FBQ2YsSUFBSSxJQUFJLEVBQUU7WUFDTixPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3ZDO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBBZGRyZXNzLCBCYXNrZXRTdW1tYXJ5LCBCYXNrZXRTdW1tYXJ5RGV0YWlscywgQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlscywgQ3VzdG9tZXIsIERFTElWRVJZX01FVEhPRFMsIFBST01PVElPTl9MRVZFTCwgUFJPTU9USU9OX1RZUEUsIElOSVRJQVRJTkdfTU9EVUxFLCBMaW5lUHJvbW90aW9ucywgT3JkZXJEZXRhaWxzLCBQUk9WSURFUlMsIFNoaXBtZW50RGV0YWlscywgVFJBTlNBQ1RJT05fVFlQRSwgVHJhbnNhY3Rpb25Eb2N1bWVudCwgVHJhbnNhY3Rpb25JbmZvLCBUcmFuc2FjdGlvblByb21vdGlvbiwgVHJpZ2dlciwgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMsIFRQcm9kdWN0LCBSZWZ1bmRQcm9kdWN0Q2hhbmdlIH0gZnJvbSBcIi4vbWFwcGVyLWxpYnJhcnkubW9kZWxcIjtcclxuaW1wb3J0IHsgTnVtYmVyVXRpbFNlcnZpY2UgfSBmcm9tIFwiLi9udW1iZXItdXRpbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFwcExvZ2dlclNlcnZpY2UgfSBmcm9tICdAcG1jcmV0YWlsL2NvbW1vbi1zZXJ2aWNlcy9jb21tb24vYXBwLWxvZ2dlci5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBXZWJSZXR1cm5NYWdlbnRvVjJSZXN0TWFwcGVyQnVpbGRlckNsYXNzIHtcclxuXHJcbiAgICBjbGFzc05hbWUgPSBcIldlYlJldHVybk1hZ2VudG9WMlJlc3RNYXBwZXJCdWlsZGVyQ2xhc3NcIjtcclxuICAgIHByaXZhdGUgb3JkZXJEZXRhaWxzOiBhbnk7XHJcbiAgICBwcml2YXRlIHdlYlJldHVybk9iamVjdDogVHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcclxuICAgICAgICBpZDogJycsXHJcbiAgICAgICAgb3JnQ29kZTogXCJcIixcclxuICAgICAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcclxuICAgICAgICBkZXZpY2VJZDogXCJcIixcclxuICAgICAgICB0ZXJtaW5hbElkOiBcIlwiLFxyXG4gICAgICAgIGluaXRpYXRpbmdNb2R1bGU6IFwiXCIsXHJcbiAgICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgICBpc0luU3RvcmVPcmRlcjogZmFsc2UsXHJcbiAgICAgICAgYmFza2V0OiB7fSxcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5OiB7fSxcclxuICAgICAgICBiYXNlQ3VycmVuY3k6IFwiXCIsXHJcbiAgICAgICAgY3VzdG9tZXI6IHtcclxuICAgICAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgYmlsbGluZ0FkZHJlc3M6IFtdLFxyXG4gICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IFtdLFxyXG4gICAgICAgICAgICBzaGlwbWVudERldGFpbHM6IFtdLFxyXG4gICAgICAgICAgICB0ZWxlcGhvbmU6ICcnLFxyXG4gICAgICAgICAgICBwb3N0Q29kZTogJycsXHJcbiAgICAgICAgICAgIG5vQ3VzdG9tZXJTZWxlY3RlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHM6IHt9IGFzIEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNcclxuICAgIH1cclxuICAgIG51bWJlclV0aWxTZXJ2aWNlOiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3JkZXJEZXRhaWxzOiBhbnksXHJcbiAgICAgICAgcHJpdmF0ZSBjdXJyZW5jeVBpcGU/OiBDdXJyZW5jeVBpcGVcclxuICAgICAgICApIHtcclxuICAgICAgICBpZiAob3JkZXJEZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJEZXRhaWxzID0gb3JkZXJEZXRhaWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlID0gbmV3IE51bWJlclV0aWxTZXJ2aWNlKGN1cnJlbmN5UGlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2ViUmV0dXJuQ29tbW9uTWFwcGVyKCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyXCIsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyIHN0YXJ0ZWQuLi5cIik7XHJcbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3RbJ3R5cGUnXSA9IFRSQU5TQUNUSU9OX1RZUEUuV0VCX1JFVFVSTlM7IC8vIFRPRE9cclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnZGF0ZXRpbWUnXSA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5vcmRlckRldGFpbHMudXBkYXRlZF9hdCk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFzZUN1cnJlbmN5ID0gdGhpcy5vcmRlckRldGFpbHMub3JkZXJfY3VycmVuY3lfY29kZTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5zdWJzaWRpYXJ5SWQgPSAnMSc7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuZXhwb3J0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pbml0aWF0aW5nTW9kdWxlID0gSU5JVElBVElOR19NT0RVTEUuRUJBU0tFVDtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5jcmVhdGVkQXQgPSB0aGlzLmdldFVUQ0RhdGVUaW1lKHRoaXMub3JkZXJEZXRhaWxzLmNyZWF0ZWRfYXQpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnVwZGF0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5vcmRlckRldGFpbHMudXBkYXRlZF9hdCk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudHJhbnNDb21wbGV0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5vcmRlckRldGFpbHMudXBkYXRlZF9hdCk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2V4dGVybmFsVHJhbnNhY3Rpb25JZCddID0gdGhpcy5vcmRlckRldGFpbHMuaW5jcmVtZW50X2lkO1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyXCIsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldERlbGl2ZXJ5TWV0aG9kKCkge1xyXG4gICAgLy8gICAgIGlmKHRoaXMub3JkZXJEZXRhaWxzLnNoaXBtZW50cyAmJiB0aGlzLm9yZGVyRGV0YWlscy5zaGlwbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBzaGlwVG9TdG9yZVNoaXBtZW50ID0gdGhpcy5vcmRlckRldGFpbHMuc2hpcG1lbnRzLmZpbmQoc2hpcG1lbnQgPT4gc2hpcG1lbnQuY19mcm9tU3RvcmVJZCk7XHJcbiAgICAvLyAgICAgICAgIGlmKHNoaXBUb1N0b3JlU2hpcG1lbnQpIHJldHVybiBERUxJVkVSWV9NRVRIT0RTLlNISVBfVE9fU1RPUkU7XHJcbiAgICAvLyAgICAgICAgIGVsc2UgcmV0dXJuIERFTElWRVJZX01FVEhPRFMuREVMSVZFUlk7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwcm9kdWN0KCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwicHJvZHVjdFwiLCBcInByb2R1Y3QgbWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXSA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLm9yZGVyRGV0YWlscy5pdGVtcyAmJiB0aGlzLm9yZGVyRGV0YWlscy5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJEZXRhaWxzLml0ZW1zLmZvckVhY2goXHJcbiAgICAgICAgICAgICAgICAocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHByb2R1Y3QgJiYgcHJvZHVjdC5iYXNlX3ByaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RPYmogPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5uYW1lID8gcHJvZHVjdC5uYW1lIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS1U6IHByb2R1Y3Quc2t1ID8gcHJvZHVjdC5za3UgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiBwcm9kdWN0LnF0eV9vcmRlcmVkID8gcHJvZHVjdC5xdHlfb3JkZXJlZCA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZ1bmRlZFF1YW50aXR5OiBwcm9kdWN0LnF0eV9yZWZ1bmRlZCA/IHByb2R1Y3QucXR5X3JlZnVuZGVkIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBwcm9kdWN0LmJhc2VfcHJpY2UgPyBwcm9kdWN0LmJhc2VfcHJpY2UgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogKGluZGV4ICsgMSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsSXRlbUxpbmVJZDogcHJvZHVjdC5pdGVtX2lkID8gcHJvZHVjdC5pdGVtX2lkIDogKGluZGV4ICsgMSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5TWV0aG9kOiB0aGlzLmdldERlbGl2ZXJ5TWV0aG9kKCkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTGluZVByaWNlOiAocHJvZHVjdC5xdHlfb3JkZXJlZCAmJiBwcm9kdWN0LmJhc2VfcHJpY2UpID8gKHByb2R1Y3QucXR5X29yZGVyZWQgKiBwcm9kdWN0LmJhc2VfcHJpY2UpIDogMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXS5wdXNoKHByb2R1Y3RPYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJwcm9kdWN0XCIsIFwicHJvZHVjdCBtYXBwaW5nIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGxpbmVQcm9tb3Rpb24oKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJsaW5lUHJvbW90aW9uXCIsIFwibGluZVByb21vdGlvbiBtYXBwaW5nIHN0YXJ0ZWQuLi5cIik7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10gPSBbXSBhcyBMaW5lUHJvbW90aW9uc1tdO1xyXG4gICAgICAgIGlmICh0aGlzLm9yZGVyRGV0YWlscy5pdGVtcyAmJiB0aGlzLm9yZGVyRGV0YWlscy5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJEZXRhaWxzLml0ZW1zLmZvckVhY2goXHJcbiAgICAgICAgICAgICAgICAocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0ICYmIHByb2R1Y3QuYmFzZV9wcmljZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZVByb21vdGlvbk9iaiA9IHt9IGFzIExpbmVQcm9tb3Rpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJpZ2dlciA9IHt9IGFzIFRyaWdnZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuaXRlbUxpbmVJZCA9IChpbmRleCArIDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucXVhbnRpdHkgPSBwcm9kdWN0LnF0eV9vcmRlcmVkID8gcHJvZHVjdC5xdHlfb3JkZXJlZCA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoudHJpZ2dlciA9IFtdIGFzIFRyaWdnZXJbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVByb21vdGlvbk9iai50cmlnZ2VyLnB1c2godHJpZ2dlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUHJvbW90aW9uT2JqLml0ZW1MaW5lSWQgPSBpbmRleCArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoucHJvbW90aW9uSWQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVByb21vdGlvbk9iai5kaXNwbGF5VGV4dCA9IHRoaXMub3JkZXJEZXRhaWxzLmNvdXBvbl9jb2RlID8gdGhpcy5vcmRlckRldGFpbHMuY291cG9uX2NvZGUgOiAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVByb21vdGlvbk9iai5wcm9tb3Rpb25UeXBlID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoucHJvbW90aW9uQW1vdW50ID0gcHJvZHVjdC5kaXNjb3VudF9hbW91bnQgPyBwcm9kdWN0LmRpc2NvdW50X2Ftb3VudCA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoubmFtZSA9IHRoaXMub3JkZXJEZXRhaWxzLmNvdXBvbl9jb2RlID8gdGhpcy5vcmRlckRldGFpbHMuY291cG9uX2NvZGUgOiAnJzs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoucHJvbW90aW9uSW5mbyA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUHJvbW90aW9uT2JqLnByb21vdGlvbkxpbmVQcmljZSA9IHByb2R1Y3Qucm93X3RvdGFsID8gcHJvZHVjdC5yb3dfdG90YWwgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXQubGluZVByb21vdGlvbi5wdXNoKGxpbmVQcm9tb3Rpb25PYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwibGluZVByb21vdGlvblwiLCBcImxpbmVQcm9tb3Rpb24gbWFwcGluZyBlbmRlZC4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgICAgXHJcbiAgICBjdXN0b21lcigpIHtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImN1c3RvbWVyXCIsIFwiY3VzdG9tZXIgbWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLmlkID0gdGhpcy5vcmRlckRldGFpbHMuY3VzdG9tZXJfaWQgPyB0aGlzLm9yZGVyRGV0YWlscy5jdXN0b21lcl9pZCA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLmVtYWlsID0gdGhpcy5vcmRlckRldGFpbHMuY3VzdG9tZXJfZW1haWwgPyB0aGlzLm9yZGVyRGV0YWlscy5jdXN0b21lcl9lbWFpbCA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLmZpcnN0TmFtZSA9IHRoaXMub3JkZXJEZXRhaWxzLmN1c3RvbWVyX2ZpcnN0bmFtZSA/IHRoaXMub3JkZXJEZXRhaWxzLmN1c3RvbWVyX2ZpcnN0bmFtZSA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLmxhc3ROYW1lID0gdGhpcy5vcmRlckRldGFpbHMuY3VzdG9tZXJfbGFzdG5hbWUgPyB0aGlzLm9yZGVyRGV0YWlscy5jdXN0b21lcl9sYXN0bmFtZSA6ICcnO1xyXG5cclxuICAgICAgICBjb25zdCBpc1NoaXBwaW5nID0gdGhpcy5vcmRlckRldGFpbHMuZXh0ZW5zaW9uX2F0dHJpYnV0ZXMgJiYgXHJcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5vcmRlckRldGFpbHMuZXh0ZW5zaW9uX2F0dHJpYnV0ZXMpLmxlbmd0aCA+IDAgJiYgdGhpcy5vcmRlckRldGFpbHMuZXh0ZW5zaW9uX2F0dHJpYnV0ZXMuc2hpcHBpbmdfYXNzaWdubWVudHMgJiZcclxuICAgICAgICAgICAgdGhpcy5vcmRlckRldGFpbHMuZXh0ZW5zaW9uX2F0dHJpYnV0ZXMuc2hpcHBpbmdfYXNzaWdubWVudHMubGVuZ3RoID4gMDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoaXNTaGlwcGluZykge1xyXG4gICAgICAgICAgICB0aGlzLm9yZGVyRGV0YWlscy5leHRlbnNpb25fYXR0cmlidXRlcy5zaGlwcGluZ19hc3NpZ25tZW50cy5mb3JFYWNoKFxyXG4gICAgICAgICAgICAgICAgc2hpcG1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHNoaXBtZW50LnNoaXBwaW5nICYmIE9iamVjdC52YWx1ZXMoc2hpcG1lbnQuc2hpcHBpbmcpICYmIHNoaXBtZW50LnNoaXBwaW5nLmFkZHJlc3MgJiYgT2JqZWN0LnZhbHVlcyhzaGlwbWVudC5zaGlwcGluZy5hZGRyZXNzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gc2hpcG1lbnQuc2hpcHBpbmcuYWRkcmVzcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNoaXBwaW5nQWRkcmVzc09iaiA9IHt9IGFzIEFkZHJlc3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc09iai5pZCA9IGFkZHJlc3MuY3VzdG9tZXJfYWRkcmVzc19pZCA/IGFkZHJlc3MuY3VzdG9tZXJfYWRkcmVzc19pZCA6ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3NPYmouY291bnRyeUNvZGUgPSBhZGRyZXNzLmNvdW50cnlfaWQgPyBhZGRyZXNzLmNvdW50cnlfaWQgOiAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLnN0cmVldCAmJiBhZGRyZXNzLnN0cmVldC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3NPYmouYWRkcmVzczEgPSBhZGRyZXNzLnN0cmVldFswXSA/IGFkZHJlc3Muc3RyZWV0WzBdIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3NPYmouYWRkcmVzczIgPSBhZGRyZXNzLnN0cmVldFsxXSA/IGFkZHJlc3Muc3RyZWV0WzFdIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3NPYmouYWRkcmVzczMgPSBhZGRyZXNzLnN0cmVldFsyXSA/IGFkZHJlc3Muc3RyZWV0WzJdIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc09iai5jaXR5ID0gYWRkcmVzcy5jaXR5ID8gYWRkcmVzcy5jaXR5IDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc09iai5jb3VudHJ5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc09iai5wb3N0Q29kZSA9IGFkZHJlc3MucG9zdGNvZGUgPyBhZGRyZXNzLnBvc3Rjb2RlIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLnNoaXBwaW5nQWRkcmVzcy5wdXNoKHNoaXBwaW5nQWRkcmVzc09iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vcmRlckRldGFpbHMuYmlsbGluZ19hZGRyZXNzICYmIE9iamVjdC52YWx1ZXModGhpcy5vcmRlckRldGFpbHMuYmlsbGluZ19hZGRyZXNzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLm9yZGVyRGV0YWlscy5iaWxsaW5nX2FkZHJlc3M7XHJcbiAgICAgICAgICAgIGxldCBiaWxsaW5nQWRkcmVzc09iaiA9IHt9IGFzIEFkZHJlc3M7XHJcbiAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzT2JqLmlkID0gYWRkcmVzcy5jdXN0b21lcl9hZGRyZXNzX2lkID8gYWRkcmVzcy5jdXN0b21lcl9hZGRyZXNzX2lkIDogJyc7XHJcbiAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzT2JqLmNvdW50cnlDb2RlID0gYWRkcmVzcy5jb3VudHJ5X2lkID8gYWRkcmVzcy5jb3VudHJ5X2lkIDogJyc7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWRkcmVzcy5zdHJlZXQgJiYgYWRkcmVzcy5zdHJlZXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYmlsbGluZ0FkZHJlc3NPYmouYWRkcmVzczEgPSBhZGRyZXNzLnN0cmVldFswXSA/IGFkZHJlc3Muc3RyZWV0WzBdIDogJyc7XHJcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc09iai5hZGRyZXNzMiA9IGFkZHJlc3Muc3RyZWV0WzFdID8gYWRkcmVzcy5zdHJlZXRbMV0gOiAnJztcclxuICAgICAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzT2JqLmFkZHJlc3MzID0gYWRkcmVzcy5zdHJlZXRbMl0gPyBhZGRyZXNzLnN0cmVldFsyXSA6ICcnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBiaWxsaW5nQWRkcmVzc09iai5jaXR5ID0gYWRkcmVzcy5jaXR5ID8gYWRkcmVzcy5jaXR5IDogJyc7XHJcbiAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzT2JqLmNvdW50cnkgPSAnJztcclxuICAgICAgICAgICAgYmlsbGluZ0FkZHJlc3NPYmoucG9zdENvZGUgPSBhZGRyZXNzLnBvc3Rjb2RlID8gYWRkcmVzcy5wb3N0Y29kZSA6ICcnO1xyXG4gICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5jdXN0b21lci5zaGlwcGluZ0FkZHJlc3MucHVzaChiaWxsaW5nQWRkcmVzc09iaik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsZXQgc2hpcG1lbnREZXRhaWxzID0gW10gYXMgU2hpcG1lbnREZXRhaWxzW107XHJcbiAgICAgICAgLy8gdGhpcy5vcmRlckRldGFpbHMuc2hpcG1lbnRzLmZvckVhY2goXHJcbiAgICAgICAgLy8gICAgIHNoaXBtZW50ID0+IHtcclxuICAgICAgICAvLyAgICAgICAgIGxldCBzaGlwbWVudERldGFpbHNPYmogPSB7fSBhcyBTaGlwbWVudERldGFpbHM7XHJcbiAgICAgICAgLy8gICAgICAgICBzaGlwbWVudERldGFpbHNPYmouaWQgPSBzaGlwbWVudC5zaGlwbWVudF9pZCA/IHNoaXBtZW50LnNoaXBtZW50X2lkIDogJyc7XHJcbiAgICAgICAgLy8gICAgICAgICBzaGlwbWVudERldGFpbHNPYmouZGVsaXZlcnlHcm91cCA9IHNoaXBtZW50LnNoaXBtZW50X2lkID8gc2hpcG1lbnQuc2hpcG1lbnRfaWQgOiAnJztcclxuICAgICAgICAvLyAgICAgICAgIHNoaXBtZW50RGV0YWlscy5wdXNoKHNoaXBtZW50RGV0YWlsc09iaik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyApO1xyXG4gICAgICAgIC8vIGN1c3RvbWVyT2JqLnNoaXBtZW50RGV0YWlscyA9IHNoaXBtZW50RGV0YWlscztcclxuXHJcbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3QuY3VzdG9tZXIgPSBjdXN0b21lck9iajtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImN1c3RvbWVyXCIsIFwiY3VzdG9tZXIgbWFwcGluZyBlbmRlZC4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBpc0luU3RvcmVPcmRlcigpIHtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImlzSW5TdG9yZU9yZGVyXCIsIFwiaXNJblN0b3JlT3JkZXIgbWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmlzSW5TdG9yZU9yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJpc0luU3RvcmVPcmRlclwiLCBcImlzSW5TdG9yZU9yZGVyIG1hcHBpbmcgZW5kZWQuLi5cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMoKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc1wiLCBcImV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzIG1hcHBpbmcgc3RhcnRlZC4uLlwiKTtcclxuICAgICAgICBsZXQgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMgPSBbXSBhcyBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc1tdO1xyXG4gICAgICAgIGxldCBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc09iaiA9IHt9IGFzIGV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzO1xyXG4gICAgICAgIGxldCB0cmFuc2FjdGlvbkluZm8gPSB7fSBhcyBUcmFuc2FjdGlvbkluZm87XHJcbiAgICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHNPYmoudW5pcXVlSWQgPSB0aGlzLm9yZGVyRGV0YWlscy5pbmNyZW1lbnRfaWQgPyB0aGlzLm9yZGVyRGV0YWlscy5pbmNyZW1lbnRfaWQgOiAnJztcclxuICAgICAgICBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc09iai5wcm92aWRlclR5cGUgPSBQUk9WSURFUlMuTUFHRU5UTztcclxuXHJcbiAgICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMucHVzaChleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc09iaik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMgPSBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlscztcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzXCIsIFwiZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMgbWFwcGluZyBlbmRlZC4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBiYXNrZXRTdW1tYXJ5KCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYmFza2V0U3VtbWFyeVwiLCBcImJhc2tldFN1bW1hcnkgbWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIGxldCBiYXNrZXRTdW1tYXJ5ID0ge30gYXMgQmFza2V0U3VtbWFyeTtcclxuICAgICAgICBsZXQgYmFza2V0U3VtbWFyeVdlYk9yZGVyID0ge30gYXMgQmFza2V0U3VtbWFyeURldGFpbHM7XHJcbiAgICAgICAgY29uc3QgbGluZVByb21vdGlvblRvdGFsID0gdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LmxpbmVQcm9tb3Rpb24ubWFwKGxpbmVQcm9tb3Rpb24gPT4gbGluZVByb21vdGlvbi5wcm9tb3Rpb25BbW91bnQpLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4gYWNjdW11bGF0b3IgKyBjdXJyZW50VmFsdWUsIDApO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uUHJvbW90aW9uVG90YWwgPSAwO1xyXG4gICAgICAgIGJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCA9IGxpbmVQcm9tb3Rpb25Ub3RhbCArIHRyYW5zYWN0aW9uUHJvbW90aW9uVG90YWw7XHJcbiAgICAgICAgYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IHRoaXMub3JkZXJEZXRhaWxzLnRheF9hbW91bnQgPyB0aGlzLm9yZGVyRGV0YWlscy50YXhfYW1vdW50IDogMDtcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCA9IHRoaXMub3JkZXJEZXRhaWxzLnN1YnRvdGFsID8gdGhpcy5vcmRlckRldGFpbHMuc3VidG90YWwgOiAwO1xyXG4gICAgICAgIGJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPSAodGhpcy5vcmRlckRldGFpbHMuc3VidG90YWwgJiYgdGhpcy5vcmRlckRldGFpbHMudG90YWxfb25saW5lX3JlZnVuZGVkKSA/ICh0aGlzLm9yZGVyRGV0YWlscy5zdWJ0b3RhbCAtIHRoaXMub3JkZXJEZXRhaWxzLnRvdGFsX29ubGluZV9yZWZ1bmRlZCkgOiAwO1xyXG4gICAgICAgIGJhc2tldFN1bW1hcnkudG90YWxJdGVtcyA9IHRoaXMub3JkZXJEZXRhaWxzLnRvdGFsX3F0eV9vcmRlcmVkID8gdGhpcy5vcmRlckRldGFpbHMudG90YWxfcXR5X29yZGVyZWQubGVuZ3RoIDogMDtcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5LnNoaXBwaW5nVG90YWwgPSB0aGlzLm9yZGVyRGV0YWlscy5zaGlwcGluZ19pbmNsX3RheCA/IHRoaXMub3JkZXJEZXRhaWxzLnNoaXBwaW5nX2luY2xfdGF4IDogMDtcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsV2l0aFNoaXBwaW5nVG90YWwgPSB0aGlzLm9yZGVyRGV0YWlscy50b3RhbF9pbnZvaWNlZCA/IHRoaXMub3JkZXJEZXRhaWxzLnRvdGFsX2ludm9pY2VkIDogMDtcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5V2ViT3JkZXIuc2hpcHBpbmdUb3RhbCA9IHRoaXMub3JkZXJEZXRhaWxzLnNoaXBwaW5nX2luY2xfdGF4ID8gdGhpcy5vcmRlckRldGFpbHMuc2hpcHBpbmdfaW5jbF90YXggOiAwO1xyXG4gICAgICAgIGJhc2tldFN1bW1hcnlXZWJPcmRlci5iYXNrZXRUb3RhbFdpdGhTaGlwcGluZ1RvdGFsID0gdGhpcy5vcmRlckRldGFpbHMudG90YWxfaW52b2ljZWQgPyB0aGlzLm9yZGVyRGV0YWlscy50b3RhbF9pbnZvaWNlZCA6IDA7XHJcbiAgICAgICAgYmFza2V0U3VtbWFyeS53ZWJPcmRlciA9IGJhc2tldFN1bW1hcnlXZWJPcmRlcjtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5ID0gYmFza2V0U3VtbWFyeTtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImJhc2tldFN1bW1hcnlcIiwgXCJiYXNrZXRTdW1tYXJ5IG1hcHBpbmcgZW5kZWQuLi5cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZGV2aWNlSWQoZGV2aWNlSWQpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5kZXZpY2VJZCA9IGRldmljZUlkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRlcm1pbmFsSWQodGVybWluYWxJZCkge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnRlcm1pbmFsSWQgPSB0ZXJtaW5hbElkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIG9yZ0NvZGUob3JnQ29kZSkge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0Lm9yZ0NvZGUgPSBvcmdDb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlSWQoKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVJZCA9IHRoaXMub3JkZXJEZXRhaWxzLnN0b3JlX2lkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlTm9kZUlkKHN0b3JlTm9kZUlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5zdG9yZU5vZGVJZCA9IHN0b3JlTm9kZUlkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlTm9kZVN0cnVjdHVyZShzdG9yZU5vZGVTdHJ1Y3R1cmU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN0b3JlTm9kZVN0cnVjdHVyZSA9IHN0b3JlTm9kZVN0cnVjdHVyZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBkb2NJZChkb2NJZCkge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmlkID0gZG9jSWQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVXNlcklEKHVzZXJJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudXNlcklkID0gdXNlcklEO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVVzZXJOYW1lKG5hbWUpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC51c2VyTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGQoKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJidWlsZFwiLCBcIm1hcHBpbmcgZG9uZS4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy53ZWJSZXR1cm5PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VVRDRGF0ZVRpbWUoZGF0ZSkge1xyXG4gICAgICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|