@colijnit/transaction 1.9.31 → 12.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/component/common/icon/icon.component.d.ts +1 -2
- package/bundles/colijnit-transaction.umd.js +950 -983
- package/bundles/colijnit-transaction.umd.js.map +1 -1
- package/colijnit-transaction.d.ts +14 -14
- package/colijnit-transaction.metadata.json +1 -1
- package/esm2015/app/component/checkout/checkout/checkout.component.js +22 -26
- package/esm2015/app/component/checkout/checkout-login/checkout-login.component.js +18 -27
- package/esm2015/app/component/checkout/checkout-overview/checkout-overview.component.js +26 -49
- package/esm2015/app/component/checkout/checkout-overview-block/checkout-overview-block.component.js +17 -24
- package/esm2015/app/component/checkout/checkout-overview-delivery-address/checkout-overview-delivery-address.component.js +18 -24
- package/esm2015/app/component/checkout/checkout-overview-delivery-edit/checkout-overview-delivery-edit.component.js +27 -42
- package/esm2015/app/component/checkout/checkout-overview-relation-address/checkout-overview-relation-address.component.js +19 -22
- package/esm2015/app/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.js +25 -36
- package/esm2015/app/component/checkout/checkout-relation-suggestions-list/checkout-relation-suggestions-list.component.js +18 -24
- package/esm2015/app/component/checkout/checkout-relation-suggestions-list-item/checkout-relation-suggestions-list-item.component.js +16 -21
- package/esm2015/app/component/checkout/ione-checkout.component.js +27 -34
- package/esm2015/app/component/checkout/ione-checkout.module.js +55 -58
- package/esm2015/app/component/checkout/retail-transaction-checkout/retail-transaction-checkout.component.js +16 -18
- package/esm2015/app/component/common/icon/icon.component.js +14 -18
- package/esm2015/app/component/common/image-display/image-display.component.js +19 -36
- package/esm2015/app/component/common/no-image-display/no-image-display.component.js +14 -20
- package/esm2015/app/component/core/core.module.js +32 -34
- package/esm2015/app/component/shopping-cart/characteristic-answer/characteristic-answer.component.js +20 -27
- package/esm2015/app/component/shopping-cart/ione-shopping-cart.component.js +31 -48
- package/esm2015/app/component/shopping-cart/ione-shopping-cart.module.js +51 -52
- package/esm2015/app/component/shopping-cart/shopping-cart/shopping-cart.component.js +29 -49
- package/esm2015/app/component/shopping-cart/shopping-cart-line/shopping-cart-line.component.js +25 -38
- package/esm2015/app/component/shopping-cart/shopping-cart-manager/shopping-cart-manager.component.js +27 -38
- package/esm2015/app/component/shopping-cart/stock-status-indicator/stock-status-indicator.component.js +13 -17
- package/esm2015/app/enum/checkout-steps.enum.js +1 -1
- package/esm2015/app/enum/content-view-mode.enum.js +1 -1
- package/esm2015/app/enum/direction.enum.js +1 -1
- package/esm2015/app/enum/language-code.enum.js +1 -1
- package/esm2015/app/enum/order-discount-type.enum.js +1 -1
- package/esm2015/app/enum/time-size.type.js +1 -1
- package/esm2015/app/model/business-object.js +6 -6
- package/esm2015/app/model/text-value-container.js +1 -1
- package/esm2015/app/pipe/append.pipe.js +6 -8
- package/esm2015/app/pipe/co-currency.pipe.js +8 -11
- package/esm2015/app/pipe/date-duration.pipe.js +6 -8
- package/esm2015/app/pipe/delivery-time.pipe.js +6 -8
- package/esm2015/app/pipe/localize.pipe.js +9 -13
- package/esm2015/app/pipe/safe-style-pipe.js +9 -11
- package/esm2015/app/service/dictionary.service.js +10 -10
- package/esm2015/app/service/ione-connector-adapter.service.js +8 -8
- package/esm2015/app/service/options.service.js +8 -8
- package/esm2015/app/service/transaction-event.service.js +6 -8
- package/esm2015/app/service/transaction.service.js +11 -12
- package/esm2015/app/utils/string-utils.js +1 -1
- package/esm2015/assets/dictionary/text.properties.js +1 -1
- package/esm2015/colijnit-transaction.js +15 -15
- package/esm2015/factory/business-object-factory.js +1 -1
- package/esm2015/factory/decorators/boolean.decorator.js +1 -1
- package/esm2015/factory/decorators/complex-array.decorator.js +1 -1
- package/esm2015/factory/decorators/complex-field.decorator.js +2 -2
- package/esm2015/factory/decorators/date-field.decorator.js +1 -1
- package/esm2015/factory/decorators/string-number.decorator.js +1 -1
- package/esm2015/public_api.js +1 -1
- package/esm2015/utils/array-utils.js +1 -1
- package/esm2015/utils/is-nill.function.js +1 -1
- package/fesm2015/colijnit-transaction.js +640 -799
- package/fesm2015/colijnit-transaction.js.map +1 -1
- package/package.json +33 -23
- package/bundles/colijnit-transaction.umd.min.js +0 -16
- package/bundles/colijnit-transaction.umd.min.js.map +0 -1
- package/enum/icon.enum.d.ts +0 -281
- package/esm2015/enum/icon.enum.js +0 -283
- package/esm5/app/component/checkout/checkout/checkout.component.js +0 -196
- package/esm5/app/component/checkout/checkout-login/checkout-login.component.js +0 -62
- package/esm5/app/component/checkout/checkout-overview/checkout-overview.component.js +0 -183
- package/esm5/app/component/checkout/checkout-overview-block/checkout-overview-block.component.js +0 -48
- package/esm5/app/component/checkout/checkout-overview-delivery-address/checkout-overview-delivery-address.component.js +0 -34
- package/esm5/app/component/checkout/checkout-overview-delivery-edit/checkout-overview-delivery-edit.component.js +0 -298
- package/esm5/app/component/checkout/checkout-overview-relation-address/checkout-overview-relation-address.component.js +0 -98
- package/esm5/app/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.js +0 -303
- package/esm5/app/component/checkout/checkout-relation-suggestions-list/checkout-relation-suggestions-list.component.js +0 -33
- package/esm5/app/component/checkout/checkout-relation-suggestions-list-item/checkout-relation-suggestions-list-item.component.js +0 -48
- package/esm5/app/component/checkout/ione-checkout.component.js +0 -163
- package/esm5/app/component/checkout/ione-checkout.module.js +0 -82
- package/esm5/app/component/checkout/retail-transaction-checkout/retail-transaction-checkout.component.js +0 -62
- package/esm5/app/component/common/icon/icon.component.js +0 -40
- package/esm5/app/component/common/image-display/image-display.component.js +0 -57
- package/esm5/app/component/common/no-image-display/no-image-display.component.js +0 -29
- package/esm5/app/component/core/core.module.js +0 -48
- package/esm5/app/component/shopping-cart/characteristic-answer/characteristic-answer.component.js +0 -66
- package/esm5/app/component/shopping-cart/ione-shopping-cart.component.js +0 -169
- package/esm5/app/component/shopping-cart/ione-shopping-cart.module.js +0 -70
- package/esm5/app/component/shopping-cart/shopping-cart/shopping-cart.component.js +0 -179
- package/esm5/app/component/shopping-cart/shopping-cart-line/shopping-cart-line.component.js +0 -208
- package/esm5/app/component/shopping-cart/shopping-cart-manager/shopping-cart-manager.component.js +0 -563
- package/esm5/app/component/shopping-cart/stock-status-indicator/stock-status-indicator.component.js +0 -28
- package/esm5/app/enum/checkout-steps.enum.js +0 -10
- package/esm5/app/enum/content-view-mode.enum.js +0 -10
- package/esm5/app/enum/direction.enum.js +0 -9
- package/esm5/app/enum/language-code.enum.js +0 -8
- package/esm5/app/enum/order-discount-type.enum.js +0 -7
- package/esm5/app/enum/time-size.type.js +0 -10
- package/esm5/app/model/business-object.js +0 -85
- package/esm5/app/model/text-value-container.js +0 -7
- package/esm5/app/pipe/append.pipe.js +0 -22
- package/esm5/app/pipe/co-currency.pipe.js +0 -55
- package/esm5/app/pipe/date-duration.pipe.js +0 -61
- package/esm5/app/pipe/delivery-time.pipe.js +0 -38
- package/esm5/app/pipe/localize.pipe.js +0 -34
- package/esm5/app/pipe/safe-style-pipe.js +0 -22
- package/esm5/app/service/dictionary.service.js +0 -83
- package/esm5/app/service/ione-connector-adapter.service.js +0 -549
- package/esm5/app/service/options.service.js +0 -108
- package/esm5/app/service/transaction-event.service.js +0 -21
- package/esm5/app/service/transaction.service.js +0 -690
- package/esm5/app/utils/string-utils.js +0 -73
- package/esm5/assets/dictionary/text.properties.js +0 -282
- package/esm5/colijnit-transaction.js +0 -36
- package/esm5/enum/icon.enum.js +0 -283
- package/esm5/factory/business-object-factory.js +0 -122
- package/esm5/factory/decorators/boolean.decorator.js +0 -106
- package/esm5/factory/decorators/complex-array.decorator.js +0 -59
- package/esm5/factory/decorators/complex-field.decorator.js +0 -61
- package/esm5/factory/decorators/date-field.decorator.js +0 -40
- package/esm5/factory/decorators/string-number.decorator.js +0 -47
- package/esm5/public_api.js +0 -8
- package/esm5/utils/array-utils.js +0 -188
- package/esm5/utils/is-nill.function.js +0 -5
- package/fesm5/colijnit-transaction.js +0 -5620
- package/fesm5/colijnit-transaction.js.map +0 -1
package/esm5/app/component/shopping-cart/shopping-cart-manager/shopping-cart-manager.component.js
DELETED
|
@@ -1,563 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __decorate, __generator } from "tslib";
|
|
2
|
-
import { Component, EventEmitter, Output, ViewChild } from "@angular/core";
|
|
3
|
-
import { TransactionService } from "../../../service/transaction.service";
|
|
4
|
-
import { NumberUtils } from "@colijnit/transactionapi/build/utils/number-utils";
|
|
5
|
-
import { throwError } from "rxjs";
|
|
6
|
-
import { TransactionEventService } from "../../../service/transaction-event.service";
|
|
7
|
-
import { ResolvePendingLineReasonRequest } from "@colijnit/transactionapi/build/model/resolve-pending-reason-request.bo";
|
|
8
|
-
import { TransactionLineType } from "@colijnit/transactionapi/build/enum/transaction-line-type.enum";
|
|
9
|
-
import { CoDialogComponent, CoGridComponent, PromptService } from "@colijnit/corecomponents_v9";
|
|
10
|
-
import { PendingReasonType } from "@colijnit/transactionapi/build/enum/pending-reason-type.enum";
|
|
11
|
-
import { DictionaryService } from "../../../service/dictionary.service";
|
|
12
|
-
var ShoppingCartManagerComponent = /** @class */ (function () {
|
|
13
|
-
function ShoppingCartManagerComponent(service, transactionEvents, promptService, _dictionaryService) {
|
|
14
|
-
var _this = this;
|
|
15
|
-
this.service = service;
|
|
16
|
-
this.transactionEvents = transactionEvents;
|
|
17
|
-
this.promptService = promptService;
|
|
18
|
-
this._dictionaryService = _dictionaryService;
|
|
19
|
-
this.linesChanged = new EventEmitter();
|
|
20
|
-
this.openCart = new EventEmitter();
|
|
21
|
-
this.articleAdded = new EventEmitter();
|
|
22
|
-
this.isReturn = false;
|
|
23
|
-
this.waitForLinesChangedToOpenCart = false;
|
|
24
|
-
this.message = "CHECK_WAREHOUSE_AND_COMMISSIONCODE";
|
|
25
|
-
this.commissionCodes = [];
|
|
26
|
-
this.commissionFields = { text: "description", value: "code" };
|
|
27
|
-
this.transactionArticleWarehouses = [];
|
|
28
|
-
this.transactionArticleWarehouseFields = { text: "warehouseDesc", value: "warehouseNr" };
|
|
29
|
-
this.columns = [];
|
|
30
|
-
this.dialogPromptHeader = "";
|
|
31
|
-
this.rootElement = null;
|
|
32
|
-
this._subscriptions = [];
|
|
33
|
-
this._inOutCollection = [];
|
|
34
|
-
this._okOrCancelClick = false;
|
|
35
|
-
this._showCharacteristic = false;
|
|
36
|
-
this._subscriptions.push(this.service.transactionUpdated.subscribe(function () {
|
|
37
|
-
_this.linesChanged.emit(_this.waitForLinesChangedToOpenCart);
|
|
38
|
-
_this.waitForLinesChangedToOpenCart = false;
|
|
39
|
-
}), this.transactionEvents.addToCartBySku.subscribe(function (params) {
|
|
40
|
-
_this.waitForLinesChangedToOpenCart = params.popCart;
|
|
41
|
-
_this.addToCart(params.sku, params.amount).then();
|
|
42
|
-
}), this.transactionEvents.addToCartBySelectorResult.subscribe(function (params) {
|
|
43
|
-
_this.waitForLinesChangedToOpenCart = params.popCart;
|
|
44
|
-
_this.addToCartBySelectorResult(params.selectorResult).then();
|
|
45
|
-
}), this.transactionEvents.openShoppingCartModule.subscribe(function () {
|
|
46
|
-
_this.openCart.emit(false);
|
|
47
|
-
}), this.transactionEvents.addUserRelationShoppingCartModule.subscribe(function (login) {
|
|
48
|
-
_this.addUserRelationToTransactionAndLogin(login.user, login.pw);
|
|
49
|
-
}), this.transactionEvents.addNewUserToShoppingCartModule.subscribe(function (emailAddress) {
|
|
50
|
-
_this.addEmailAddressToTransaction(emailAddress);
|
|
51
|
-
}));
|
|
52
|
-
this.columns.push({ field: "warehouseNr", headerText: this._dictionaryService.get("WAREHOUSE"), allowFiltering: false }, { field: "warehouseDesc", headerText: this._dictionaryService.get("DESCRIPTION") }, { field: "stockAmount", headerText: this._dictionaryService.get("STOCK") });
|
|
53
|
-
}
|
|
54
|
-
Object.defineProperty(ShoppingCartManagerComponent.prototype, "amountOfLines", {
|
|
55
|
-
get: function () {
|
|
56
|
-
return NumberUtils.NrOrDefault(this.service.articleAmount, 0);
|
|
57
|
-
},
|
|
58
|
-
enumerable: true,
|
|
59
|
-
configurable: true
|
|
60
|
-
});
|
|
61
|
-
Object.defineProperty(ShoppingCartManagerComponent.prototype, "showCharacteristicDialog", {
|
|
62
|
-
get: function () {
|
|
63
|
-
return this._showCharacteristic;
|
|
64
|
-
},
|
|
65
|
-
set: function (value) {
|
|
66
|
-
this._showCharacteristic = value;
|
|
67
|
-
},
|
|
68
|
-
enumerable: true,
|
|
69
|
-
configurable: true
|
|
70
|
-
});
|
|
71
|
-
ShoppingCartManagerComponent.prototype.ngOnInit = function () {
|
|
72
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
73
|
-
var _a;
|
|
74
|
-
return __generator(this, function (_b) {
|
|
75
|
-
switch (_b.label) {
|
|
76
|
-
case 0:
|
|
77
|
-
_a = this;
|
|
78
|
-
return [4 /*yield*/, this.service.getCommissionCodes("NL")];
|
|
79
|
-
case 1:
|
|
80
|
-
_a.commissionCodes = _b.sent();
|
|
81
|
-
this.linesChanged.emit(this.waitForLinesChangedToOpenCart);
|
|
82
|
-
this.waitForLinesChangedToOpenCart = false;
|
|
83
|
-
return [2 /*return*/];
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
};
|
|
88
|
-
ShoppingCartManagerComponent.prototype.ngOnDestroy = function () {
|
|
89
|
-
this._subscriptions.forEach(function (sub) { return sub.unsubscribe(); });
|
|
90
|
-
this.warehouseDialog.close();
|
|
91
|
-
};
|
|
92
|
-
ShoppingCartManagerComponent.prototype.addToCart = function (sku, amount) {
|
|
93
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
94
|
-
var goodId;
|
|
95
|
-
return __generator(this, function (_a) {
|
|
96
|
-
switch (_a.label) {
|
|
97
|
-
case 0: return [4 /*yield*/, this.service.getGoodIdFromArticleNr(sku)];
|
|
98
|
-
case 1:
|
|
99
|
-
goodId = _a.sent();
|
|
100
|
-
return [4 /*yield*/, this._loadArticle(goodId)];
|
|
101
|
-
case 2:
|
|
102
|
-
_a.sent();
|
|
103
|
-
return [4 /*yield*/, this._createTransaction()];
|
|
104
|
-
case 3:
|
|
105
|
-
_a.sent();
|
|
106
|
-
return [4 /*yield*/, this._handleAddArticle(amount)];
|
|
107
|
-
case 4:
|
|
108
|
-
_a.sent();
|
|
109
|
-
this.articleAdded.emit();
|
|
110
|
-
return [2 /*return*/];
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
};
|
|
115
|
-
ShoppingCartManagerComponent.prototype.addToCartBySelectorResult = function (result) {
|
|
116
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
117
|
-
return __generator(this, function (_a) {
|
|
118
|
-
switch (_a.label) {
|
|
119
|
-
case 0: return [4 /*yield*/, this._loadArticle(result.goodId)];
|
|
120
|
-
case 1:
|
|
121
|
-
_a.sent();
|
|
122
|
-
return [4 /*yield*/, this._createTransaction()];
|
|
123
|
-
case 2:
|
|
124
|
-
_a.sent();
|
|
125
|
-
return [4 /*yield*/, this._handleAddArticle(result.quantity)];
|
|
126
|
-
case 3:
|
|
127
|
-
_a.sent();
|
|
128
|
-
this.articleAdded.emit();
|
|
129
|
-
return [2 /*return*/];
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
};
|
|
134
|
-
// TODO public user logs in.... how reconnect the Connector?
|
|
135
|
-
ShoppingCartManagerComponent.prototype.addUserRelationToTransactionAndLogin = function (userName, password) {
|
|
136
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
137
|
-
var success;
|
|
138
|
-
return __generator(this, function (_a) {
|
|
139
|
-
switch (_a.label) {
|
|
140
|
-
case 0: return [4 /*yield*/, this.service.setRelationByUser(userName, password)];
|
|
141
|
-
case 1:
|
|
142
|
-
success = _a.sent();
|
|
143
|
-
if (success) {
|
|
144
|
-
this.transactionEvents.loggedIn.next();
|
|
145
|
-
}
|
|
146
|
-
return [2 /*return*/];
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
};
|
|
151
|
-
ShoppingCartManagerComponent.prototype.showStockManager = function (line) {
|
|
152
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
153
|
-
return __generator(this, function (_a) {
|
|
154
|
-
this.selectedWarehouseNr = line.warehouseNumber;
|
|
155
|
-
this.amount = line.amount;
|
|
156
|
-
this.commissionCode = line.commissionCode;
|
|
157
|
-
this.show(line.articleNumber);
|
|
158
|
-
return [2 /*return*/];
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
};
|
|
162
|
-
ShoppingCartManagerComponent.prototype.hide = function () {
|
|
163
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
164
|
-
return __generator(this, function (_a) {
|
|
165
|
-
switch (_a.label) {
|
|
166
|
-
case 0:
|
|
167
|
-
if (this._okOrCancelClick) {
|
|
168
|
-
this._okOrCancelClick = false;
|
|
169
|
-
return [2 /*return*/];
|
|
170
|
-
}
|
|
171
|
-
return [4 /*yield*/, this.onStockManagerCancelClick()];
|
|
172
|
-
case 1:
|
|
173
|
-
_a.sent();
|
|
174
|
-
return [2 /*return*/];
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
};
|
|
179
|
-
ShoppingCartManagerComponent.prototype.show = function (articleNr) {
|
|
180
|
-
this._reloadDataCollections(articleNr).then();
|
|
181
|
-
this.message = this.currentOperationStatus.pendingReason;
|
|
182
|
-
this.warehouseGrid.selectRow(this.selectedWarehouseNr);
|
|
183
|
-
this.warehouseDialog.targetElement = null;
|
|
184
|
-
this.warehouseDialog.open();
|
|
185
|
-
};
|
|
186
|
-
ShoppingCartManagerComponent.prototype.onStockManagerCancelClick = function () {
|
|
187
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
188
|
-
return __generator(this, function (_a) {
|
|
189
|
-
switch (_a.label) {
|
|
190
|
-
case 0:
|
|
191
|
-
this._okOrCancelClick = true;
|
|
192
|
-
this.warehouseDialog.close();
|
|
193
|
-
if (!this.currentReason) return [3 /*break*/, 2];
|
|
194
|
-
return [4 /*yield*/, this.service.cancelAddTransactionLine(this.currentReason.lineUuid)];
|
|
195
|
-
case 1:
|
|
196
|
-
_a.sent();
|
|
197
|
-
_a.label = 2;
|
|
198
|
-
case 2:
|
|
199
|
-
this.editingLine = undefined;
|
|
200
|
-
return [2 /*return*/];
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
};
|
|
205
|
-
ShoppingCartManagerComponent.prototype.onStockManagerOkClick = function () {
|
|
206
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
207
|
-
var _this = this;
|
|
208
|
-
return __generator(this, function (_a) {
|
|
209
|
-
switch (_a.label) {
|
|
210
|
-
case 0:
|
|
211
|
-
this._okOrCancelClick = true;
|
|
212
|
-
this.warehouseDialog.close();
|
|
213
|
-
if (this.commissionCode !== undefined) {
|
|
214
|
-
this.currentReason.commissionCode = this.commissionCode.valueOf();
|
|
215
|
-
}
|
|
216
|
-
if (this.amount !== undefined) {
|
|
217
|
-
this.currentReason.quantity = this.amount.valueOf();
|
|
218
|
-
}
|
|
219
|
-
if (this.selectedWarehouseNr !== undefined) {
|
|
220
|
-
this.currentReason.warehouseNr = this.selectedWarehouseNr;
|
|
221
|
-
}
|
|
222
|
-
if (!this.currentReason) return [3 /*break*/, 2];
|
|
223
|
-
return [4 /*yield*/, this.service.resolvePendingLineReason(this.currentReason)
|
|
224
|
-
.then(function (value) {
|
|
225
|
-
_this._handleLineOperationStatus();
|
|
226
|
-
})];
|
|
227
|
-
case 1:
|
|
228
|
-
_a.sent();
|
|
229
|
-
return [3 /*break*/, 6];
|
|
230
|
-
case 2:
|
|
231
|
-
if (!(this.editingLine === undefined)) return [3 /*break*/, 4];
|
|
232
|
-
return [4 /*yield*/, this.service.addTransactionLine(TransactionLineType.ArticleLine, this.newArticleNr, this.amount, this.selectedWarehouseNr, this.commissionCode, this.isReturn)
|
|
233
|
-
.then(function (value) {
|
|
234
|
-
_this._handleLineOperationStatus();
|
|
235
|
-
})];
|
|
236
|
-
case 3:
|
|
237
|
-
_a.sent();
|
|
238
|
-
return [3 /*break*/, 6];
|
|
239
|
-
case 4: return [4 /*yield*/, this.service.changeTransactionLineQuantity(this.editingLine.uuid, this.amount)
|
|
240
|
-
.then(function (value) {
|
|
241
|
-
_this._handleLineOperationStatus();
|
|
242
|
-
})];
|
|
243
|
-
case 5:
|
|
244
|
-
_a.sent();
|
|
245
|
-
_a.label = 6;
|
|
246
|
-
case 6:
|
|
247
|
-
this.editingLine = undefined;
|
|
248
|
-
return [2 /*return*/];
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
});
|
|
252
|
-
};
|
|
253
|
-
ShoppingCartManagerComponent.prototype.handleRowsSelected = function (rows) {
|
|
254
|
-
this.selectedWarehouseNr = (rows.find(function (x) { return x !== undefined; })).warehouseNr;
|
|
255
|
-
};
|
|
256
|
-
ShoppingCartManagerComponent.prototype.handleCharacteristicAnswerOkClick = function (answer) {
|
|
257
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
258
|
-
var _this = this;
|
|
259
|
-
return __generator(this, function (_a) {
|
|
260
|
-
switch (_a.label) {
|
|
261
|
-
case 0:
|
|
262
|
-
this.currentReason = new ResolvePendingLineReasonRequest(this.currentOperationStatus.uuid, this.currentOperationStatus.pendingReason, this.currentOperationStatus.pendingReasonType);
|
|
263
|
-
this.currentReason.textualUserInput = answer;
|
|
264
|
-
return [4 /*yield*/, this.service.resolvePendingLineReason(this.currentReason)
|
|
265
|
-
.then(function (value) {
|
|
266
|
-
_this._handleLineOperationStatus();
|
|
267
|
-
})];
|
|
268
|
-
case 1:
|
|
269
|
-
_a.sent();
|
|
270
|
-
return [2 /*return*/];
|
|
271
|
-
}
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
};
|
|
275
|
-
ShoppingCartManagerComponent.prototype._reloadDataCollections = function (articleNr) {
|
|
276
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
277
|
-
var goodId, _a;
|
|
278
|
-
return __generator(this, function (_b) {
|
|
279
|
-
switch (_b.label) {
|
|
280
|
-
case 0: return [4 /*yield*/, this.service.getGoodIdFromArticleNr(articleNr)];
|
|
281
|
-
case 1:
|
|
282
|
-
goodId = _b.sent();
|
|
283
|
-
_a = this;
|
|
284
|
-
return [4 /*yield*/, this.service.getTransactionArticleWarehouses(goodId)];
|
|
285
|
-
case 2:
|
|
286
|
-
_a.transactionArticleWarehouses = _b.sent();
|
|
287
|
-
return [2 /*return*/];
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
};
|
|
292
|
-
ShoppingCartManagerComponent.prototype._handleAddArticle = function (amount) {
|
|
293
|
-
if (amount === void 0) { amount = 1; }
|
|
294
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
295
|
-
var _this = this;
|
|
296
|
-
return __generator(this, function (_a) {
|
|
297
|
-
switch (_a.label) {
|
|
298
|
-
case 0: return [4 /*yield*/, this.service.addTransactionLine(TransactionLineType.ArticleLine, this.newArticleNr, amount, this.newArticle.standardWareHouse, this.newArticle.commissionCode)
|
|
299
|
-
.then(function (value) {
|
|
300
|
-
_this._handleLineOperationStatus();
|
|
301
|
-
}, function (error) { return _this.promptService.showError(error); })];
|
|
302
|
-
case 1:
|
|
303
|
-
_a.sent();
|
|
304
|
-
return [2 /*return*/];
|
|
305
|
-
}
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
};
|
|
309
|
-
ShoppingCartManagerComponent.prototype._getWareHouseNoFromArticle = function () {
|
|
310
|
-
if (this.newArticle !== undefined && this.newArticle.stockLocations !== undefined && this.newArticle.stockLocations.length) {
|
|
311
|
-
return this.newArticle.stockLocations[0].warehouseNr;
|
|
312
|
-
}
|
|
313
|
-
return 0;
|
|
314
|
-
};
|
|
315
|
-
ShoppingCartManagerComponent.prototype._isLineOperationStatus = function () {
|
|
316
|
-
this.currentOperationStatus = this.service.currentLineOperationStatus;
|
|
317
|
-
if (this.currentOperationStatus !== undefined) {
|
|
318
|
-
return true;
|
|
319
|
-
}
|
|
320
|
-
return false;
|
|
321
|
-
};
|
|
322
|
-
ShoppingCartManagerComponent.prototype._checkIfShoppingCartNeedsToDisplay = function () {
|
|
323
|
-
if (this.service.currentTransaction && this.service.currentTransaction.transactionNr) {
|
|
324
|
-
this.linesChanged.emit(this.waitForLinesChangedToOpenCart);
|
|
325
|
-
this.waitForLinesChangedToOpenCart = false;
|
|
326
|
-
}
|
|
327
|
-
};
|
|
328
|
-
ShoppingCartManagerComponent.prototype._confirmAction = function () {
|
|
329
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
330
|
-
var pendingReasonText, _a;
|
|
331
|
-
var _this = this;
|
|
332
|
-
return __generator(this, function (_b) {
|
|
333
|
-
switch (_b.label) {
|
|
334
|
-
case 0:
|
|
335
|
-
this.currentReason = new ResolvePendingLineReasonRequest(this.currentOperationStatus.uuid, this.currentOperationStatus.pendingReason, this.currentOperationStatus.pendingReasonType);
|
|
336
|
-
return [4 /*yield*/, this._getPendingReasonText(this.currentOperationStatus.pendingReason)];
|
|
337
|
-
case 1:
|
|
338
|
-
pendingReasonText = _b.sent();
|
|
339
|
-
_a = this.currentReason;
|
|
340
|
-
return [4 /*yield*/, this.promptService.showYesNo(pendingReasonText, " ")];
|
|
341
|
-
case 2:
|
|
342
|
-
_a.confirmation = _b.sent();
|
|
343
|
-
return [4 /*yield*/, this.service.resolvePendingLineReason(this.currentReason)
|
|
344
|
-
.then(function (value) {
|
|
345
|
-
_this._handleLineOperationStatus();
|
|
346
|
-
})];
|
|
347
|
-
case 3:
|
|
348
|
-
_b.sent();
|
|
349
|
-
return [2 /*return*/];
|
|
350
|
-
}
|
|
351
|
-
});
|
|
352
|
-
});
|
|
353
|
-
};
|
|
354
|
-
ShoppingCartManagerComponent.prototype._showInformation = function () {
|
|
355
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
356
|
-
var pendingReasonText;
|
|
357
|
-
var _this = this;
|
|
358
|
-
return __generator(this, function (_a) {
|
|
359
|
-
switch (_a.label) {
|
|
360
|
-
case 0:
|
|
361
|
-
this.currentReason = new ResolvePendingLineReasonRequest(this.currentOperationStatus.uuid, this.currentOperationStatus.pendingReason, this.currentOperationStatus.pendingReasonType);
|
|
362
|
-
return [4 /*yield*/, this._getPendingReasonText(this.currentOperationStatus.pendingReason)];
|
|
363
|
-
case 1:
|
|
364
|
-
pendingReasonText = _a.sent();
|
|
365
|
-
return [4 /*yield*/, this.promptService.showOkModal(pendingReasonText, " ")];
|
|
366
|
-
case 2:
|
|
367
|
-
_a.sent();
|
|
368
|
-
return [4 /*yield*/, this.service.resolvePendingLineReason(this.currentReason)
|
|
369
|
-
.then(function (value) {
|
|
370
|
-
_this._handleLineOperationStatus();
|
|
371
|
-
})];
|
|
372
|
-
case 3:
|
|
373
|
-
_a.sent();
|
|
374
|
-
return [2 /*return*/];
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
});
|
|
378
|
-
};
|
|
379
|
-
ShoppingCartManagerComponent.prototype._getPendingReasonText = function (pendingReason) {
|
|
380
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
381
|
-
var _a, _b, _c;
|
|
382
|
-
return __generator(this, function (_d) {
|
|
383
|
-
switch (_d.label) {
|
|
384
|
-
case 0:
|
|
385
|
-
if (!(pendingReason === "ARTICLE_IS_DISCONTINUED_DO_YOU_WANT_TO_CONTINUE_PLEASE_CONFIRM")) return [3 /*break*/, 2];
|
|
386
|
-
_b = (_a = this._dictionaryService.get("ARTICLE_IN_OUT_COLLECTION")).replace;
|
|
387
|
-
_c = ["|~"];
|
|
388
|
-
return [4 /*yield*/, this.getInOutCollectionOfArticle()];
|
|
389
|
-
case 1: return [2 /*return*/, _b.apply(_a, _c.concat([_d.sent()]))];
|
|
390
|
-
case 2: return [2 /*return*/, this._dictionaryService.get(pendingReason)];
|
|
391
|
-
}
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
};
|
|
395
|
-
ShoppingCartManagerComponent.prototype.getInOutCollectionOfArticle = function () {
|
|
396
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
397
|
-
var _a, domainValue;
|
|
398
|
-
var _this = this;
|
|
399
|
-
return __generator(this, function (_b) {
|
|
400
|
-
switch (_b.label) {
|
|
401
|
-
case 0:
|
|
402
|
-
if (!!this._inOutCollection.length) return [3 /*break*/, 2];
|
|
403
|
-
_a = this;
|
|
404
|
-
return [4 /*yield*/, this.service.getInOutCollection("NL")];
|
|
405
|
-
case 1:
|
|
406
|
-
_a._inOutCollection = _b.sent();
|
|
407
|
-
_b.label = 2;
|
|
408
|
-
case 2:
|
|
409
|
-
domainValue = this._inOutCollection.find(function (element) { return element.code === _this.newArticle.inOutCollection; });
|
|
410
|
-
if (domainValue) {
|
|
411
|
-
return [2 /*return*/, domainValue.description];
|
|
412
|
-
}
|
|
413
|
-
return [2 /*return*/, ""];
|
|
414
|
-
}
|
|
415
|
-
});
|
|
416
|
-
});
|
|
417
|
-
};
|
|
418
|
-
ShoppingCartManagerComponent.prototype._handleLineOperationStatus = function () {
|
|
419
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
420
|
-
return __generator(this, function (_a) {
|
|
421
|
-
switch (_a.label) {
|
|
422
|
-
case 0:
|
|
423
|
-
if (!this._isLineOperationStatus()) return [3 /*break*/, 2];
|
|
424
|
-
return [4 /*yield*/, this._handlePendingLine(this.currentOperationStatus.uuid).then()];
|
|
425
|
-
case 1:
|
|
426
|
-
_a.sent();
|
|
427
|
-
return [3 /*break*/, 3];
|
|
428
|
-
case 2:
|
|
429
|
-
this._checkIfShoppingCartNeedsToDisplay();
|
|
430
|
-
_a.label = 3;
|
|
431
|
-
case 3: return [2 /*return*/];
|
|
432
|
-
}
|
|
433
|
-
});
|
|
434
|
-
});
|
|
435
|
-
};
|
|
436
|
-
ShoppingCartManagerComponent.prototype._handlePendingLine = function (lineUuid) {
|
|
437
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
438
|
-
var _a;
|
|
439
|
-
return __generator(this, function (_b) {
|
|
440
|
-
switch (_b.label) {
|
|
441
|
-
case 0:
|
|
442
|
-
this.currentReason = new ResolvePendingLineReasonRequest(this.currentOperationStatus.uuid, this.currentOperationStatus.pendingReason, this.currentOperationStatus.pendingReasonType);
|
|
443
|
-
this.currentPendingLine = this.service.currentLines.find(function (l) { return l.uuid === lineUuid; });
|
|
444
|
-
_a = this.currentOperationStatus.pendingReasonType;
|
|
445
|
-
switch (_a) {
|
|
446
|
-
case PendingReasonType.ABORTED: return [3 /*break*/, 1];
|
|
447
|
-
case PendingReasonType.CANCELLED: return [3 /*break*/, 1];
|
|
448
|
-
case PendingReasonType.CONFIRMATION_NEEDED: return [3 /*break*/, 2];
|
|
449
|
-
case PendingReasonType.INVALID_LOGISTICS: return [3 /*break*/, 4];
|
|
450
|
-
case PendingReasonType.NON_CRITICAL_DISCONTINUATION: return [3 /*break*/, 6];
|
|
451
|
-
case PendingReasonType.CHARACTERISTICS_ANSWER_NEEDED: return [3 /*break*/, 8];
|
|
452
|
-
case PendingReasonType.NONE: return [3 /*break*/, 9];
|
|
453
|
-
}
|
|
454
|
-
return [3 /*break*/, 9];
|
|
455
|
-
case 1:
|
|
456
|
-
this.service.cancelAddTransactionLine(this.currentPendingLine.uuid).then();
|
|
457
|
-
return [3 /*break*/, 10];
|
|
458
|
-
case 2: return [4 /*yield*/, this._confirmAction()];
|
|
459
|
-
case 3:
|
|
460
|
-
_b.sent();
|
|
461
|
-
return [3 /*break*/, 10];
|
|
462
|
-
case 4: return [4 /*yield*/, this.showStockManager(this.currentPendingLine)];
|
|
463
|
-
case 5:
|
|
464
|
-
_b.sent();
|
|
465
|
-
return [3 /*break*/, 10];
|
|
466
|
-
case 6: return [4 /*yield*/, this._showInformation()];
|
|
467
|
-
case 7:
|
|
468
|
-
_b.sent();
|
|
469
|
-
return [3 /*break*/, 10];
|
|
470
|
-
case 8:
|
|
471
|
-
this.CharacteristicsAnswerNeeded();
|
|
472
|
-
return [3 /*break*/, 10];
|
|
473
|
-
case 9:
|
|
474
|
-
this.currentReason = undefined;
|
|
475
|
-
this.currentPendingLine = undefined;
|
|
476
|
-
return [3 /*break*/, 10];
|
|
477
|
-
case 10: return [2 /*return*/];
|
|
478
|
-
}
|
|
479
|
-
});
|
|
480
|
-
});
|
|
481
|
-
};
|
|
482
|
-
ShoppingCartManagerComponent.prototype._createTransaction = function () {
|
|
483
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
484
|
-
return __generator(this, function (_a) {
|
|
485
|
-
switch (_a.label) {
|
|
486
|
-
case 0:
|
|
487
|
-
if (!!this.service.currentTransaction.transactionNr) return [3 /*break*/, 2];
|
|
488
|
-
return [4 /*yield*/, this.service.createTransaction()];
|
|
489
|
-
case 1:
|
|
490
|
-
if (!(_a.sent())) {
|
|
491
|
-
throwError("Failed to create transaction");
|
|
492
|
-
}
|
|
493
|
-
_a.label = 2;
|
|
494
|
-
case 2: return [2 /*return*/];
|
|
495
|
-
}
|
|
496
|
-
});
|
|
497
|
-
});
|
|
498
|
-
};
|
|
499
|
-
ShoppingCartManagerComponent.prototype._loadArticle = function (goodId) {
|
|
500
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
501
|
-
var _a;
|
|
502
|
-
return __generator(this, function (_b) {
|
|
503
|
-
switch (_b.label) {
|
|
504
|
-
case 0:
|
|
505
|
-
_a = this;
|
|
506
|
-
return [4 /*yield*/, this.service.getArticleFullObject(goodId)];
|
|
507
|
-
case 1:
|
|
508
|
-
_a.newArticle = _b.sent();
|
|
509
|
-
this.newArticleNr = this.newArticle.articleNr;
|
|
510
|
-
return [2 /*return*/];
|
|
511
|
-
}
|
|
512
|
-
});
|
|
513
|
-
});
|
|
514
|
-
};
|
|
515
|
-
ShoppingCartManagerComponent.prototype.addEmailAddressToTransaction = function (emailAddress) {
|
|
516
|
-
this.service.emailAddress = emailAddress;
|
|
517
|
-
};
|
|
518
|
-
ShoppingCartManagerComponent.prototype.CharacteristicsAnswerNeeded = function () {
|
|
519
|
-
var _this = this;
|
|
520
|
-
this.characteristicAnswer.question = this.currentOperationStatus.characteristic.question;
|
|
521
|
-
this.characteristicAnswer.title = this.newArticle.description;
|
|
522
|
-
this.characteristicAnswer.value = this.currentOperationStatus.characteristic.value;
|
|
523
|
-
this.characteristicAnswer.characteristics = this.currentOperationStatus.characteristic.transactionLineCharacteristicChoices;
|
|
524
|
-
setTimeout(function () {
|
|
525
|
-
_this.characteristicAnswer.open();
|
|
526
|
-
// tslint:disable-next-line:no-magic-numbers
|
|
527
|
-
}, 1000);
|
|
528
|
-
};
|
|
529
|
-
ShoppingCartManagerComponent.ctorParameters = function () { return [
|
|
530
|
-
{ type: TransactionService },
|
|
531
|
-
{ type: TransactionEventService },
|
|
532
|
-
{ type: PromptService },
|
|
533
|
-
{ type: DictionaryService }
|
|
534
|
-
]; };
|
|
535
|
-
__decorate([
|
|
536
|
-
ViewChild("warehouseDialog")
|
|
537
|
-
], ShoppingCartManagerComponent.prototype, "warehouseDialog", void 0);
|
|
538
|
-
__decorate([
|
|
539
|
-
ViewChild("warehouseGrid")
|
|
540
|
-
], ShoppingCartManagerComponent.prototype, "warehouseGrid", void 0);
|
|
541
|
-
__decorate([
|
|
542
|
-
ViewChild("characteristicAnswer")
|
|
543
|
-
], ShoppingCartManagerComponent.prototype, "characteristicAnswer", void 0);
|
|
544
|
-
__decorate([
|
|
545
|
-
Output()
|
|
546
|
-
], ShoppingCartManagerComponent.prototype, "linesChanged", void 0);
|
|
547
|
-
__decorate([
|
|
548
|
-
Output()
|
|
549
|
-
], ShoppingCartManagerComponent.prototype, "openCart", void 0);
|
|
550
|
-
__decorate([
|
|
551
|
-
Output()
|
|
552
|
-
], ShoppingCartManagerComponent.prototype, "articleAdded", void 0);
|
|
553
|
-
ShoppingCartManagerComponent = __decorate([
|
|
554
|
-
Component({
|
|
555
|
-
selector: "shopping-cart-manager",
|
|
556
|
-
template: "\n <co-dialog #warehouseDialog\n (closeClick)=\"hide()\"\n (overlayClick)=\"onStockManagerCancelClick()\"\n >\n <ng-container header>{{ 'STOCK_NOTIFICATION' | localize }}</ng-container>\n\n <ng-container content>\n <co-form>\n <div class=\"form-content\">\n <span *ngIf=\"message\" class=\"message-field\" [textContent]=\"message | localize\"></span>\n <div class=\"commission-fields\" fxLayout=\"row\">\n <co-input-number-picker class=\"horizontal\" [(model)]=\"amount\" [min]=\"0\" decimals=\"3\"></co-input-number-picker>\n <co-input-combo-box [(model)]=\"commissionCode\"\n [source]=\"commissionCodes\"\n [fields]=\"commissionFields\"\n [placeholder]=\"'COMMISSION_CODE' | localize\"\n [required]=\"true\"\n ></co-input-combo-box>\n </div>\n <div>\n <co-grid #warehouseGrid\n [data]=\"transactionArticleWarehouses\"\n [columns]=\"columns\"\n [pagingEnabled]=\"'true'\"\n [maxNumberOfRows]=\"'20'\"\n (rowsSelected)=\"handleRowsSelected($event)\"\n ></co-grid>\n </div>\n </div>\n </co-form>\n </ng-container>\n\n <ng-container footer>\n <div class=\"flex-center\">\n <co-button [label]=\"'OK' | localize\" (click)=\"onStockManagerOkClick()\"></co-button>\n <co-button [label]=\"'CANCEL' | localize\" (click)=\"onStockManagerCancelClick()\"></co-button>\n </div>\n </ng-container>\n </co-dialog>\n\n <characteristic-answer\n #characteristicAnswer\n (okClick)=\"handleCharacteristicAnswerOkClick($event)\"\n ></characteristic-answer>\n ",
|
|
557
|
-
styles: ["body,html{height:100%}body{margin:0;font-family:Roboto,\"Helvetica Neue\",sans-serif}.flex-center,.warehouse-line-container{display:flex;flex-direction:row}.commission-fields,::ng-deep #warehouseDialog ::ng-deep .form-content .message-field{margin-left:11px}.triangle{border-radius:3px}.full-width{width:100%}.flex-center{align-items:center!important;justify-content:center!important;margin:10px 0}::ng-deep #warehouseDialog{align-items:center;max-height:100%}::ng-deep #warehouseDialog ::ng-deep co-form{height:100%;width:500px}::ng-deep #warehouseDialog ::ng-deep .form-content{height:calc(100% - 80px);width:100%}::ng-deep #warehouseDialog ::ng-deep .form-content .message-field{height:20px;word-wrap:break-word;white-space:normal}co-button:not(:last-child){margin-right:10px}.commission-fields{justify-content:space-between;margin:10px 0}.warehouse-description-item{width:15rem}.warehouse-nr-item{width:5rem}co-input-number-picker co-button{max-width:20px}"]
|
|
558
|
-
})
|
|
559
|
-
], ShoppingCartManagerComponent);
|
|
560
|
-
return ShoppingCartManagerComponent;
|
|
561
|
-
}());
|
|
562
|
-
export { ShoppingCartManagerComponent };
|
|
563
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcHBpbmctY2FydC1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC90cmFuc2FjdGlvbi8iLCJzb3VyY2VzIjpbImFwcC9jb21wb25lbnQvc2hvcHBpbmctY2FydC9zaG9wcGluZy1jYXJ0LW1hbmFnZXIvc2hvcHBpbmctY2FydC1tYW5hZ2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQTZCLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1EQUFtRCxDQUFDO0FBQzlFLE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFHbkYsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDdkgsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFJbkcsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4REFBOEQsQ0FBQztBQUUvRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQXNEdEU7SUErREUsc0NBQ1MsT0FBMkIsRUFDM0IsaUJBQTBDLEVBQzFDLGFBQTRCLEVBQzVCLGtCQUFxQztRQUo5QyxpQkEwQ0M7UUF6Q1EsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF5QjtRQUMxQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix1QkFBa0IsR0FBbEIsa0JBQWtC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QUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQyw0Q0FBNEM7UUFDOUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRVgsQ0FBQzs7Z0JBbFRpQixrQkFBa0I7Z0JBQ1IsdUJBQXVCO2dCQUMzQixhQUFhO2dCQUNSLGlCQUFpQjs7SUFqRTlDO1FBREMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO3lFQUNhO0lBRzFDO1FBREMsU0FBUyxDQUFDLGVBQWUsQ0FBQzt1RUFDZ0I7SUFHM0M7UUFEQyxTQUFTLENBQUMsc0JBQXNCLENBQUM7OEVBQ3lCO0lBRzNEO1FBREMsTUFBTSxFQUFFO3NFQUN5RTtJQUdsRjtRQURDLE1BQU0sRUFBRTtrRUFDcUU7SUFHOUU7UUFEQyxNQUFNLEVBQUU7c0VBQ3lFO0lBakJ2RSw0QkFBNEI7UUFsRHhDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSx1QkFBdUI7WUFDakMsUUFBUSxFQUFFLDQ2REE2Q1Q7O1NBRUYsQ0FBQztPQUNXLDRCQUE0QixDQW1YeEM7SUFBRCxtQ0FBQztDQUFBLEFBblhELElBbVhDO1NBblhZLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtUcmFuc2FjdGlvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlL3RyYW5zYWN0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7TnVtYmVyVXRpbHN9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvdXRpbHMvbnVtYmVyLXV0aWxzXCI7XG5pbXBvcnQge1N1YnNjcmlwdGlvbiwgdGhyb3dFcnJvcn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25FdmVudFNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlL3RyYW5zYWN0aW9uLWV2ZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7Q29tbWlzc2lvbkNvZGVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vcmVmY29kZS9jb21taXNzaW9uLWNvZGUtdHlwZS5lbnVtXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uTGluZUluZm99IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24tbGluZS1pbmZvLmJvXCI7XG5pbXBvcnQge1Jlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVzb2x2ZS1wZW5kaW5nLXJlYXNvbi1yZXF1ZXN0LmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uTGluZVR5cGV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvZW51bS90cmFuc2FjdGlvbi1saW5lLXR5cGUuZW51bVwiO1xuaW1wb3J0IHtDb0RvbWFpblZhbHVlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2NvLWRvbWFpbi12YWx1ZS5ib1wiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2V9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24tYXJ0aWNsZS13YXJlaG91c2UuYm9cIjtcbmltcG9ydCB7TGluZU9wZXJhdGlvblN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9saW5lLW9wZXJhdGlvbi1zdGF0dXMuYm9cIjtcbmltcG9ydCB7Q29EaWFsb2dDb21wb25lbnQsIENvR3JpZENvbXBvbmVudCwgUHJvbXB0U2VydmljZX0gZnJvbSBcIkBjb2xpam5pdC9jb3JlY29tcG9uZW50c192OVwiO1xuaW1wb3J0IHtQZW5kaW5nUmVhc29uVHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3BlbmRpbmctcmVhc29uLXR5cGUuZW51bVwiO1xuaW1wb3J0IHtBcnRpY2xlRnVsbE9iamVjdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlLWZ1bGwtb2JqZWN0XCI7XG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZS9kaWN0aW9uYXJ5LnNlcnZpY2VcIjtcbmltcG9ydCB7TGluZU9wZXJhdGlvblJlc3BvbnNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2xpbmUtb3BlcmF0aW9uLXJlc3BvbnNlLmJvXCI7XG5pbXBvcnQge0NoYXJhY3RlcmlzdGljQW5zd2VyQ29tcG9uZW50fSBmcm9tIFwiLi4vY2hhcmFjdGVyaXN0aWMtYW5zd2VyL2NoYXJhY3RlcmlzdGljLWFuc3dlci5jb21wb25lbnRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInNob3BwaW5nLWNhcnQtbWFuYWdlclwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxjby1kaWFsb2cgI3dhcmVob3VzZURpYWxvZ1xuICAgICAgICAgICAgICAgKGNsb3NlQ2xpY2spPVwiaGlkZSgpXCJcbiAgICAgICAgICAgICAgIChvdmVybGF5Q2xpY2spPVwib25TdG9ja01hbmFnZXJDYW5jZWxDbGljaygpXCJcbiAgICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgaGVhZGVyPnt7ICdTVE9DS19OT1RJRklDQVRJT04nIHwgbG9jYWxpemUgfX08L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBjb250ZW50PlxuICAgICAgICA8Y28tZm9ybT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250ZW50XCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1lc3NhZ2VcIiBjbGFzcz1cIm1lc3NhZ2UtZmllbGRcIiBbdGV4dENvbnRlbnRdPVwibWVzc2FnZSB8IGxvY2FsaXplXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tbWlzc2lvbi1maWVsZHNcIiBmeExheW91dD1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxjby1pbnB1dC1udW1iZXItcGlja2VyIGNsYXNzPVwiaG9yaXpvbnRhbFwiIFsobW9kZWwpXT1cImFtb3VudFwiIFttaW5dPVwiMFwiIGRlY2ltYWxzPVwiM1wiPjwvY28taW5wdXQtbnVtYmVyLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8Y28taW5wdXQtY29tYm8tYm94IFsobW9kZWwpXT1cImNvbW1pc3Npb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvdXJjZV09XCJjb21taXNzaW9uQ29kZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cImNvbW1pc3Npb25GaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0NPTU1JU1NJT05fQ09ERScgfCBsb2NhbGl6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9jby1pbnB1dC1jb21iby1ib3g+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxjby1ncmlkICN3YXJlaG91c2VHcmlkXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJ0cmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzXCJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgW3BhZ2luZ0VuYWJsZWRdPVwiJ3RydWUnXCJcbiAgICAgICAgICAgICAgICAgIFttYXhOdW1iZXJPZlJvd3NdPVwiJzIwJ1wiXG4gICAgICAgICAgICAgICAgICAocm93c1NlbGVjdGVkKT1cImhhbmRsZVJvd3NTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9jby1ncmlkPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jby1mb3JtPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgZm9vdGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNlbnRlclwiPlxuICAgICAgICAgICAgPGNvLWJ1dHRvbiBbbGFiZWxdPVwiJ09LJyB8IGxvY2FsaXplXCIgKGNsaWNrKT1cIm9uU3RvY2tNYW5hZ2VyT2tDbGljaygpXCI+PC9jby1idXR0b24+XG4gICAgICAgICAgICA8Y28tYnV0dG9uIFtsYWJlbF09XCInQ0FOQ0VMJyB8IGxvY2FsaXplXCIgKGNsaWNrKT1cIm9uU3RvY2tNYW5hZ2VyQ2FuY2VsQ2xpY2soKVwiPjwvY28tYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jby1kaWFsb2c+XG5cbiAgICA8Y2hhcmFjdGVyaXN0aWMtYW5zd2VyXG4gICAgICAjY2hhcmFjdGVyaXN0aWNBbnN3ZXJcbiAgICAgIChva0NsaWNrKT1cImhhbmRsZUNoYXJhY3RlcmlzdGljQW5zd2VyT2tDbGljaygkZXZlbnQpXCJcbiAgICA+PC9jaGFyYWN0ZXJpc3RpYy1hbnN3ZXI+XG4gIGAsXG4gIHN0eWxlVXJsczogW1wiLi9zaG9wcGluZy1jYXJ0LW1hbmFnZXIuY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgU2hvcHBpbmdDYXJ0TWFuYWdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChcIndhcmVob3VzZURpYWxvZ1wiKVxuICBwdWJsaWMgd2FyZWhvdXNlRGlhbG9nOiBDb0RpYWxvZ0NvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKFwid2FyZWhvdXNlR3JpZFwiKVxuICBwdWJsaWMgd2FyZWhvdXNlR3JpZDogQ29HcmlkQ29tcG9uZW50PGFueT47XG5cbiAgQFZpZXdDaGlsZChcImNoYXJhY3RlcmlzdGljQW5zd2VyXCIpXG4gIHB1YmxpYyBjaGFyYWN0ZXJpc3RpY0Fuc3dlcjogQ2hhcmFjdGVyaXN0aWNBbnN3ZXJDb21wb25lbnQ7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBsaW5lc0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IG9wZW5DYXJ0OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBhcnRpY2xlQWRkZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwdWJsaWMgZ2V0IGFtb3VudE9mTGluZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTnVtYmVyVXRpbHMuTnJPckRlZmF1bHQodGhpcy5zZXJ2aWNlLmFydGljbGVBbW91bnQsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBzaG93Q2hhcmFjdGVyaXN0aWNEaWFsb2coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dDaGFyYWN0ZXJpc3RpYztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd0NoYXJhY3RlcmlzdGljRGlhbG9nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd0NoYXJhY3RlcmlzdGljID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgYnJhbmNoTnI6IHN0cmluZztcbiAgcHVibGljIG5ld0FydGljbGVOcjogc3RyaW5nO1xuICBwdWJsaWMgbmV3QXJ0aWNsZTogQXJ0aWNsZUZ1bGxPYmplY3Q7XG4gIHB1YmxpYyBzZWxlY3RlZFdhcmVob3VzZU5yOiBudW1iZXI7XG4gIHB1YmxpYyBhbW91bnQ6IG51bWJlcjtcbiAgcHVibGljIGlzUmV0dXJuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIHdhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcgPSBcIkNIRUNLX1dBUkVIT1VTRV9BTkRfQ09NTUlTU0lPTkNPREVcIjtcblxuICBwdWJsaWMgY29tbWlzc2lvbkNvZGU6IENvbW1pc3Npb25Db2RlVHlwZTtcbiAgcHVibGljIGNvbW1pc3Npb25Db2RlczogQ29Eb21haW5WYWx1ZVtdID0gW107XG4gIHB1YmxpYyBjb21taXNzaW9uRmllbGRzOiBPYmplY3QgPSB7IHRleHQ6IFwiZGVzY3JpcHRpb25cIiwgdmFsdWU6IFwiY29kZVwiIH07XG5cbiAgcHVibGljIHRyYW5zYWN0aW9uQXJ0aWNsZVdhcmVob3VzZXM6IFRyYW5zYWN0aW9uQXJ0aWNsZVdhcmVob3VzZVtdID0gW107XG4gIHB1YmxpYyB0cmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VGaWVsZHM6IE9iamVjdCA9IHsgdGV4dDogXCJ3YXJlaG91c2VEZXNjXCIsIHZhbHVlOiBcIndhcmVob3VzZU5yXCIgfTtcbiAgcHVibGljIGNvbHVtbnM6IGFueVtdID0gW107XG5cbiAgcHVibGljIGN1cnJlbnRQZW5kaW5nTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbztcbiAgcHVibGljIGN1cnJlbnRSZWFzb246IFJlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3Q7XG4gIHB1YmxpYyBlZGl0aW5nTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbztcblxuICBwdWJsaWMgZGlhbG9nUHJvbXB0SGVhZGVyOiBzdHJpbmcgPSBcIlwiO1xuXG4gIHB1YmxpYyByb290RWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xuXG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgY3VycmVudE9wZXJhdGlvblN0YXR1czogTGluZU9wZXJhdGlvblN0YXR1cztcbiAgcHJpdmF0ZSBfaW5PdXRDb2xsZWN0aW9uOiBDb0RvbWFpblZhbHVlW10gPSBbXTtcbiAgcHJpdmF0ZSBfb2tPckNhbmNlbENsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Nob3dDaGFyYWN0ZXJpc3RpYzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzZXJ2aWNlOiBUcmFuc2FjdGlvblNlcnZpY2UsXG4gICAgcHVibGljIHRyYW5zYWN0aW9uRXZlbnRzOiBUcmFuc2FjdGlvbkV2ZW50U2VydmljZSxcbiAgICBwdWJsaWMgcHJvbXB0U2VydmljZTogUHJvbXB0U2VydmljZSxcbiAgICBwdWJsaWMgX2RpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZXJ2aWNlLnRyYW5zYWN0aW9uVXBkYXRlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxpbmVzQ2hhbmdlZC5lbWl0KHRoaXMud2FpdEZvckxpbmVzQ2hhbmdlZFRvT3BlbkNhcnQpO1xuICAgICAgICB0aGlzLndhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0ID0gZmFsc2U7XG4gICAgICB9KSxcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50cy5hZGRUb0NhcnRCeVNrdS5zdWJzY3JpYmUoKHBhcmFtczoge3NrdTogc3RyaW5nLCBhbW91bnQ6IG51bWJlciwgcG9wQ2FydDogYm9vbGVhbn0pID0+IHtcbiAgICAgICAgICB0aGlzLndhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0ID0gcGFyYW1zLnBvcENhcnQ7XG4gICAgICAgICAgdGhpcy5hZGRUb0NhcnQocGFyYW1zLnNrdSwgcGFyYW1zLmFtb3VudCkudGhlbigpO1xuICAgICAgICB9KSxcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50cy5hZGRUb0NhcnRCeVNlbGVjdG9yUmVzdWx0LnN1YnNjcmliZShcbiAgICAgICAgKHBhcmFtczoge3NlbGVjdG9yUmVzdWx0OiB7Z29vZElkOiBudW1iZXIsIGJhc2VHb29kSWQ6IG51bWJlciwgc2VsZWN0b3JEYXRhOiBhbnksIHF1YW50aXR5OiBudW1iZXJ9LCBwb3BDYXJ0OiBib29sZWFufSkgPT4ge1xuICAgICAgICAgIHRoaXMud2FpdEZvckxpbmVzQ2hhbmdlZFRvT3BlbkNhcnQgPSBwYXJhbXMucG9wQ2FydDtcbiAgICAgICAgICB0aGlzLmFkZFRvQ2FydEJ5U2VsZWN0b3JSZXN1bHQocGFyYW1zLnNlbGVjdG9yUmVzdWx0KS50aGVuKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRzLm9wZW5TaG9wcGluZ0NhcnRNb2R1bGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vcGVuQ2FydC5lbWl0KGZhbHNlKTtcbiAgICAgIH0pLFxuXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRzLmFkZFVzZXJSZWxhdGlvblNob3BwaW5nQ2FydE1vZHVsZS5zdWJzY3JpYmUoKGxvZ2luOiB7dXNlcjogc3RyaW5nLCBwdzogc3RyaW5nfSkgPT4ge1xuICAgICAgICB0aGlzLmFkZFVzZXJSZWxhdGlvblRvVHJhbnNhY3Rpb25BbmRMb2dpbihsb2dpbi51c2VyLCBsb2dpbi5wdyk7XG4gICAgICB9KSxcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50cy5hZGROZXdVc2VyVG9TaG9wcGluZ0NhcnRNb2R1bGUuc3Vic2NyaWJlKChlbWFpbEFkZHJlc3MpID0+IHtcbiAgICAgICAgdGhpcy5hZGRFbWFpbEFkZHJlc3NUb1RyYW5zYWN0aW9uKGVtYWlsQWRkcmVzcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmNvbHVtbnMucHVzaChcbiAgICAgIHtmaWVsZDogXCJ3YXJlaG91c2VOclwiLCBoZWFkZXJUZXh0OiB0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQoXCJXQVJFSE9VU0VcIiksIGFsbG93RmlsdGVyaW5nOiBmYWxzZX0sXG4gICAgICB7ZmllbGQ6IFwid2FyZWhvdXNlRGVzY1wiLCBoZWFkZXJUZXh0OiB0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQoXCJERVNDUklQVElPTlwiKX0sXG4gICAgICB7ZmllbGQ6IFwic3RvY2tBbW91bnRcIiwgaGVhZGVyVGV4dDogdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KFwiU1RPQ0tcIil9XG4gICAgKTtcblxuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jb21taXNzaW9uQ29kZXMgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0Q29tbWlzc2lvbkNvZGVzKFwiTkxcIik7XG4gICAgdGhpcy5saW5lc0NoYW5nZWQuZW1pdCh0aGlzLndhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0KTtcbiAgICB0aGlzLndhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0ID0gZmFsc2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLndhcmVob3VzZURpYWxvZy5jbG9zZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFRvQ2FydChza3U6IHN0cmluZywgYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnb29kSWQ6IG51bWJlciAgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0R29vZElkRnJvbUFydGljbGVOcihza3UpO1xuICAgIGF3YWl0IHRoaXMuX2xvYWRBcnRpY2xlKGdvb2RJZCk7XG4gICAgYXdhaXQgdGhpcy5fY3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCB0aGlzLl9oYW5kbGVBZGRBcnRpY2xlKGFtb3VudCk7XG4gICAgdGhpcy5hcnRpY2xlQWRkZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFRvQ2FydEJ5U2VsZWN0b3JSZXN1bHQocmVzdWx0OiB7Z29vZElkOiBudW1iZXIsIGJhc2VHb29kSWQ6IG51bWJlciwgc2VsZWN0b3JEYXRhOiBhbnksIHF1YW50aXR5OiBudW1iZXJ9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5fbG9hZEFydGljbGUocmVzdWx0Lmdvb2RJZCk7XG4gICAgYXdhaXQgdGhpcy5fY3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCB0aGlzLl9oYW5kbGVBZGRBcnRpY2xlKHJlc3VsdC5xdWFudGl0eSk7XG4gICAgdGhpcy5hcnRpY2xlQWRkZWQuZW1pdCgpO1xuICB9XG5cbiAgLy8gVE9ETyBwdWJsaWMgdXNlciBsb2dzIGluLi4uLiBob3cgcmVjb25uZWN0IHRoZSBDb25uZWN0b3I/XG4gIHB1YmxpYyBhc3luYyBhZGRVc2VyUmVsYXRpb25Ub1RyYW5zYWN0aW9uQW5kTG9naW4odXNlck5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UmVsYXRpb25CeVVzZXIodXNlck5hbWUsIHBhc3N3b3JkKTtcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRzLmxvZ2dlZEluLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2hvd1N0b2NrTWFuYWdlcihsaW5lOiBUcmFuc2FjdGlvbkxpbmVJbmZvKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZWxlY3RlZFdhcmVob3VzZU5yID0gbGluZS53YXJlaG91c2VOdW1iZXI7XG4gICAgdGhpcy5hbW91bnQgPSBsaW5lLmFtb3VudDtcbiAgICB0aGlzLmNvbW1pc3Npb25Db2RlID0gbGluZS5jb21taXNzaW9uQ29kZTtcbiAgICB0aGlzLnNob3cobGluZS5hcnRpY2xlTnVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9va09yQ2FuY2VsQ2xpY2spIHtcbiAgICAgIHRoaXMuX29rT3JDYW5jZWxDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLm9uU3RvY2tNYW5hZ2VyQ2FuY2VsQ2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93KGFydGljbGVOcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcmVsb2FkRGF0YUNvbGxlY3Rpb25zKGFydGljbGVOcikudGhlbigpO1xuXG4gICAgdGhpcy5tZXNzYWdlID0gdGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb247XG4gICAgdGhpcy53YXJlaG91c2VHcmlkLnNlbGVjdFJvdyh0aGlzLnNlbGVjdGVkV2FyZWhvdXNlTnIpO1xuICAgIHRoaXMud2FyZWhvdXNlRGlhbG9nLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMud2FyZWhvdXNlRGlhbG9nLm9wZW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBvblN0b2NrTWFuYWdlckNhbmNlbENsaWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX29rT3JDYW5jZWxDbGljayA9IHRydWU7XG4gICAgdGhpcy53YXJlaG91c2VEaWFsb2cuY2xvc2UoKTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRSZWFzb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VydmljZS5jYW5jZWxBZGRUcmFuc2FjdGlvbkxpbmUodGhpcy5jdXJyZW50UmVhc29uLmxpbmVVdWlkKTtcbiAgICB9XG5cbiAgICB0aGlzLmVkaXRpbmdMaW5lID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG9uU3RvY2tNYW5hZ2VyT2tDbGljaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9va09yQ2FuY2VsQ2xpY2sgPSB0cnVlO1xuICAgIHRoaXMud2FyZWhvdXNlRGlhbG9nLmNsb3NlKCk7XG5cbiAgICBpZiAodGhpcy5jb21taXNzaW9uQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRSZWFzb24uY29tbWlzc2lvbkNvZGUgPSB0aGlzLmNvbW1pc3Npb25Db2RlLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbW91bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXJyZW50UmVhc29uLnF1YW50aXR5ID0gdGhpcy5hbW91bnQudmFsdWVPZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGVkV2FyZWhvdXNlTnIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXJyZW50UmVhc29uLndhcmVob3VzZU5yID0gdGhpcy5zZWxlY3RlZFdhcmVob3VzZU5yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRSZWFzb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VydmljZS5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24odGhpcy5jdXJyZW50UmVhc29uKVxuICAgICAgICAudGhlbigodmFsdWU6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXMoKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmVkaXRpbmdMaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmFkZFRyYW5zYWN0aW9uTGluZShUcmFuc2FjdGlvbkxpbmVUeXBlLkFydGljbGVMaW5lLCB0aGlzLm5ld0FydGljbGVOciwgdGhpcy5hbW91bnQsIHRoaXMuc2VsZWN0ZWRXYXJlaG91c2VOciwgdGhpcy5jb21taXNzaW9uQ29kZSwgdGhpcy5pc1JldHVybilcbiAgICAgICAgICAudGhlbigodmFsdWU6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cygpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmNoYW5nZVRyYW5zYWN0aW9uTGluZVF1YW50aXR5KHRoaXMuZWRpdGluZ0xpbmUudXVpZCwgdGhpcy5hbW91bnQpXG4gICAgICAgICAgLnRoZW4oKHZhbHVlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVkaXRpbmdMaW5lID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVJvd3NTZWxlY3RlZChyb3dzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkV2FyZWhvdXNlTnIgPSAocm93cy5maW5kKHggPT4geCAhPT0gdW5kZWZpbmVkKSkud2FyZWhvdXNlTnI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlQ2hhcmFjdGVyaXN0aWNBbnN3ZXJPa0NsaWNrKGFuc3dlcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50UmVhc29uID0gbmV3IFJlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3QodGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnV1aWQsIHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uLCB0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpO1xuICAgIHRoaXMuY3VycmVudFJlYXNvbi50ZXh0dWFsVXNlcklucHV0ID0gYW5zd2VyO1xuICAgIGF3YWl0IHRoaXMuc2VydmljZS5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24odGhpcy5jdXJyZW50UmVhc29uKVxuICAgICAgLnRoZW4oKHZhbHVlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZWxvYWREYXRhQ29sbGVjdGlvbnMoYXJ0aWNsZU5yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnb29kSWQ6IG51bWJlciAgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0R29vZElkRnJvbUFydGljbGVOcihhcnRpY2xlTnIpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25BcnRpY2xlV2FyZWhvdXNlcyA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzKGdvb2RJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVBZGRBcnRpY2xlKGFtb3VudDogbnVtYmVyID0gMSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VydmljZS5hZGRUcmFuc2FjdGlvbkxpbmUoVHJhbnNhY3Rpb25MaW5lVHlwZS5BcnRpY2xlTGluZSxcbiAgICAgIHRoaXMubmV3QXJ0aWNsZU5yLFxuICAgICAgYW1vdW50LFxuICAgICAgdGhpcy5uZXdBcnRpY2xlLnN0YW5kYXJkV2FyZUhvdXNlLFxuICAgICAgdGhpcy5uZXdBcnRpY2xlLmNvbW1pc3Npb25Db2RlKVxuICAgICAgLnRoZW4oKHZhbHVlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cygpO1xuICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB0aGlzLnByb21wdFNlcnZpY2Uuc2hvd0Vycm9yKGVycm9yKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRXYXJlSG91c2VOb0Zyb21BcnRpY2xlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubmV3QXJ0aWNsZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMubmV3QXJ0aWNsZS5zdG9ja0xvY2F0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHRoaXMubmV3QXJ0aWNsZS5zdG9ja0xvY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5ld0FydGljbGUuc3RvY2tMb2NhdGlvbnNbMF0ud2FyZWhvdXNlTnI7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNMaW5lT3BlcmF0aW9uU3RhdHVzKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cyA9IHRoaXMuc2VydmljZS5jdXJyZW50TGluZU9wZXJhdGlvblN0YXR1cztcbiAgICBpZiAodGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9jaGVja0lmU2hvcHBpbmdDYXJ0TmVlZHNUb0Rpc3BsYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb24gJiYgdGhpcy5zZXJ2aWNlLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbk5yKSB7XG4gICAgICB0aGlzLmxpbmVzQ2hhbmdlZC5lbWl0KHRoaXMud2FpdEZvckxpbmVzQ2hhbmdlZFRvT3BlbkNhcnQpO1xuICAgICAgdGhpcy53YWl0Rm9yTGluZXNDaGFuZ2VkVG9PcGVuQ2FydCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2NvbmZpcm1BY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50UmVhc29uID0gbmV3IFJlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3QodGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnV1aWQsIHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uLCB0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpO1xuICAgIGNvbnN0IHBlbmRpbmdSZWFzb25UZXh0OiBzdHJpbmcgPSBhd2FpdCB0aGlzLl9nZXRQZW5kaW5nUmVhc29uVGV4dCh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbik7XG4gICAgdGhpcy5jdXJyZW50UmVhc29uLmNvbmZpcm1hdGlvbiAgPSBhd2FpdCB0aGlzLnByb21wdFNlcnZpY2Uuc2hvd1llc05vKHBlbmRpbmdSZWFzb25UZXh0LCBcIiBcIik7XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnJlc29sdmVQZW5kaW5nTGluZVJlYXNvbih0aGlzLmN1cnJlbnRSZWFzb24pXG4gICAgICAudGhlbigodmFsdWU6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLl9oYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3Nob3dJbmZvcm1hdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmN1cnJlbnRSZWFzb24gPSBuZXcgUmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uUmVxdWVzdCh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMudXVpZCwgdGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24sIHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uVHlwZSk7XG4gICAgY29uc3QgcGVuZGluZ1JlYXNvblRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuX2dldFBlbmRpbmdSZWFzb25UZXh0KHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uKTtcbiAgICBhd2FpdCB0aGlzLnByb21wdFNlcnZpY2Uuc2hvd09rTW9kYWwocGVuZGluZ1JlYXNvblRleHQsIFwiIFwiKTtcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UucmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHRoaXMuY3VycmVudFJlYXNvbilcbiAgICAgIC50aGVuKCh2YWx1ZTogTGluZU9wZXJhdGlvblJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0UGVuZGluZ1JlYXNvblRleHQocGVuZGluZ1JlYXNvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocGVuZGluZ1JlYXNvbiA9PT0gXCJBUlRJQ0xFX0lTX0RJU0NPTlRJTlVFRF9ET19ZT1VfV0FOVF9UT19DT05USU5VRV9QTEVBU0VfQ09ORklSTVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KFwiQVJUSUNMRV9JTl9PVVRfQ09MTEVDVElPTlwiKS5yZXBsYWNlKFwifH5cIiwgYXdhaXQgdGhpcy5nZXRJbk91dENvbGxlY3Rpb25PZkFydGljbGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQocGVuZGluZ1JlYXNvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEluT3V0Q29sbGVjdGlvbk9mQXJ0aWNsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5faW5PdXRDb2xsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgdGhpcy5faW5PdXRDb2xsZWN0aW9uID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmdldEluT3V0Q29sbGVjdGlvbihcIk5MXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGRvbWFpblZhbHVlOiBDb0RvbWFpblZhbHVlID0gdGhpcy5faW5PdXRDb2xsZWN0aW9uLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmNvZGUgPT09IHRoaXMubmV3QXJ0aWNsZS5pbk91dENvbGxlY3Rpb24pO1xuICAgIGlmIChkb21haW5WYWx1ZSkge1xuICAgICAgcmV0dXJuIGRvbWFpblZhbHVlLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2lzTGluZU9wZXJhdGlvblN0YXR1cygpKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVQZW5kaW5nTGluZSh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMudXVpZCkudGhlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jaGVja0lmU2hvcHBpbmdDYXJ0TmVlZHNUb0Rpc3BsYXkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlICBhc3luYyBfaGFuZGxlUGVuZGluZ0xpbmUobGluZVV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY3VycmVudFJlYXNvbiA9IG5ldyBSZXNvbHZlUGVuZGluZ0xpbmVSZWFzb25SZXF1ZXN0KHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy51dWlkLCB0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbiwgdGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb25UeXBlKTtcbiAgICB0aGlzLmN1cnJlbnRQZW5kaW5nTGluZSA9IHRoaXMuc2VydmljZS5jdXJyZW50TGluZXMuZmluZChsID0+IGwudXVpZCA9PT0gbGluZVV1aWQpO1xuXG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpIHtcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuQUJPUlRFRDpcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuQ0FOQ0VMTEVEOlxuICAgICAgICB0aGlzLnNlcnZpY2UuY2FuY2VsQWRkVHJhbnNhY3Rpb25MaW5lKHRoaXMuY3VycmVudFBlbmRpbmdMaW5lLnV1aWQpLnRoZW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLkNPTkZJUk1BVElPTl9ORUVERUQ6XG4gICAgICAgIGF3YWl0IHRoaXMuX2NvbmZpcm1BY3Rpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLklOVkFMSURfTE9HSVNUSUNTOlxuICAgICAgICBhd2FpdCB0aGlzLnNob3dTdG9ja01hbmFnZXIodGhpcy5jdXJyZW50UGVuZGluZ0xpbmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuTk9OX0NSSVRJQ0FMX0RJU0NPTlRJTlVBVElPTjpcbiAgICAgICAgYXdhaXQgdGhpcy5fc2hvd0luZm9ybWF0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5DSEFSQUNURVJJU1RJQ1NfQU5TV0VSX05FRURFRDpcbiAgICAgICAgdGhpcy5DaGFyYWN0ZXJpc3RpY3NBbnN3ZXJOZWVkZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLk5PTkU6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmN1cnJlbnRSZWFzb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY3VycmVudFBlbmRpbmdMaW5lID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVUcmFuc2FjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuc2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25Ocikge1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLnNlcnZpY2UuY3JlYXRlVHJhbnNhY3Rpb24oKSkge1xuICAgICAgICB0aHJvd0Vycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSB0cmFuc2FjdGlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9sb2FkQXJ0aWNsZShnb29kSWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubmV3QXJ0aWNsZSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRBcnRpY2xlRnVsbE9iamVjdChnb29kSWQpO1xuICAgIHRoaXMubmV3QXJ0aWNsZU5yID0gdGhpcy5uZXdBcnRpY2xlLmFydGljbGVOcjtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRW1haWxBZGRyZXNzVG9UcmFuc2FjdGlvbihlbWFpbEFkZHJlc3M6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5lbWFpbEFkZHJlc3MgPSBlbWFpbEFkZHJlc3M7XG4gIH1cblxuICBwcml2YXRlIENoYXJhY3RlcmlzdGljc0Fuc3dlck5lZWRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJhY3RlcmlzdGljQW5zd2VyLnF1ZXN0aW9uID0gdGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLmNoYXJhY3RlcmlzdGljLnF1ZXN0aW9uO1xuICAgIHRoaXMuY2hhcmFjdGVyaXN0aWNBbnN3ZXIudGl0bGUgPSB0aGlzLm5ld0FydGljbGUuZGVzY3JpcHRpb247XG4gICAgdGhpcy5jaGFyYWN0ZXJpc3RpY0Fuc3dlci52YWx1ZSA9IHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5jaGFyYWN0ZXJpc3RpYy52YWx1ZTtcbiAgICB0aGlzLmNoYXJhY3RlcmlzdGljQW5zd2VyLmNoYXJhY3RlcmlzdGljcyA9IHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5jaGFyYWN0ZXJpc3RpYy50cmFuc2FjdGlvbkxpbmVDaGFyYWN0ZXJpc3RpY0Nob2ljZXM7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2hhcmFjdGVyaXN0aWNBbnN3ZXIub3BlbigpO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW1hZ2ljLW51bWJlcnNcbiAgICB9LCAxMDAwKTtcblxuICB9XG59XG4iXX0=
|