@excent/excent-serv-positions 1.1.4 → 2.0.0
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/{esm2020 → esm2022}/lib/excent-serv-positions.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/excent-serv-positions.module.mjs +5 -5
- package/esm2022/lib/excent-serv-positions.service.mjs +311 -0
- package/{fesm2020 → fesm2022}/excent-excent-serv-positions.mjs +13 -13
- package/{fesm2020 → fesm2022}/excent-excent-serv-positions.mjs.map +1 -1
- package/package.json +10 -15
- package/esm2020/lib/excent-serv-positions.service.mjs +0 -311
- package/fesm2015/excent-excent-serv-positions.mjs +0 -368
- package/fesm2015/excent-excent-serv-positions.mjs.map +0 -1
- /package/{esm2020 → esm2022}/excent-excent-serv-positions.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/excent-serv-positions.enpoints.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@excent/excent-serv-positions",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@angular/common": "^
|
|
6
|
-
"@angular/core": "^
|
|
5
|
+
"@angular/common": "^17.0.0",
|
|
6
|
+
"@angular/core": "^17.0.0",
|
|
7
|
+
"@excent/excent-models": "^1.0.0",
|
|
8
|
+
"rxjs": "^7.8.0"
|
|
7
9
|
},
|
|
8
10
|
"dependencies": {
|
|
9
|
-
"
|
|
10
|
-
"tslib": "^2.3.0"
|
|
11
|
+
"tslib": "^2.6.2"
|
|
11
12
|
},
|
|
12
13
|
"sideEffects": false,
|
|
13
14
|
"description": "This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.2.0.",
|
|
@@ -18,11 +19,7 @@
|
|
|
18
19
|
},
|
|
19
20
|
"author": "Excent Capital",
|
|
20
21
|
"license": "ISC",
|
|
21
|
-
"module": "
|
|
22
|
-
"es2020": "fesm2020/excent-excent-serv-positions.mjs",
|
|
23
|
-
"esm2020": "esm2020/excent-excent-serv-positions.mjs",
|
|
24
|
-
"fesm2020": "fesm2020/excent-excent-serv-positions.mjs",
|
|
25
|
-
"fesm2015": "fesm2015/excent-excent-serv-positions.mjs",
|
|
22
|
+
"module": "fesm2022/excent-excent-serv-positions.mjs",
|
|
26
23
|
"typings": "index.d.ts",
|
|
27
24
|
"exports": {
|
|
28
25
|
"./package.json": {
|
|
@@ -30,11 +27,9 @@
|
|
|
30
27
|
},
|
|
31
28
|
".": {
|
|
32
29
|
"types": "./index.d.ts",
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"node": "./fesm2015/excent-excent-serv-positions.mjs",
|
|
37
|
-
"default": "./fesm2020/excent-excent-serv-positions.mjs"
|
|
30
|
+
"esm2022": "./esm2022/excent-excent-serv-positions.mjs",
|
|
31
|
+
"esm": "./esm2022/excent-excent-serv-positions.mjs",
|
|
32
|
+
"default": "./fesm2022/excent-excent-serv-positions.mjs"
|
|
38
33
|
}
|
|
39
34
|
}
|
|
40
35
|
}
|
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
import { HttpParams } from '@angular/common/http';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Symbol } from '@excent/excent-models';
|
|
4
|
-
import { BehaviorSubject, Subject, tap } from 'rxjs';
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import { endpoint } from './excent-serv-positions.enpoints';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/common/http";
|
|
9
|
-
export class ExcentServPositionsService {
|
|
10
|
-
constructor(httpClient) {
|
|
11
|
-
this.httpClient = httpClient;
|
|
12
|
-
this._refresh$ = new Subject();
|
|
13
|
-
this.position = new BehaviorSubject(null);
|
|
14
|
-
this.pendingOrders$ = new BehaviorSubject([]);
|
|
15
|
-
this.closePositions$ = new BehaviorSubject([]);
|
|
16
|
-
this.position$ = this.position.asObservable();
|
|
17
|
-
this.operationOrder = new BehaviorSubject({
|
|
18
|
-
type: '',
|
|
19
|
-
value: {
|
|
20
|
-
uuid: '',
|
|
21
|
-
id: '',
|
|
22
|
-
tradingAccount: '',
|
|
23
|
-
symbol: new Symbol().id,
|
|
24
|
-
idSymbol: 0,
|
|
25
|
-
orderType: 0,
|
|
26
|
-
orderStatus: 0,
|
|
27
|
-
volume: 0,
|
|
28
|
-
buy: false,
|
|
29
|
-
stopLoss: 0,
|
|
30
|
-
takeProfit: 0,
|
|
31
|
-
activationPrice: 0,
|
|
32
|
-
cancellationDate: new Date(),
|
|
33
|
-
creationDate: new Date(),
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
get refresh$() {
|
|
38
|
-
return this._refresh$;
|
|
39
|
-
}
|
|
40
|
-
reloadPositions(idUser) {
|
|
41
|
-
const params = new HttpParams().set('idAccount', idUser);
|
|
42
|
-
return this.httpClient.get(endpoint.open, { params });
|
|
43
|
-
}
|
|
44
|
-
getOpenCsv(headers, data) {
|
|
45
|
-
let params = new HttpParams();
|
|
46
|
-
if (data) {
|
|
47
|
-
for (let entry of data.entries()) {
|
|
48
|
-
params = params.append(entry[0], entry[1]);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return this.httpClient.get(endpoint.listOpen, {
|
|
52
|
-
params,
|
|
53
|
-
headers,
|
|
54
|
-
observe: 'body',
|
|
55
|
-
responseType: 'blob',
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
getOpen(uuid, data) {
|
|
59
|
-
let params = new HttpParams();
|
|
60
|
-
if (uuid)
|
|
61
|
-
params = params.append('tradingAccount', uuid);
|
|
62
|
-
if (data) {
|
|
63
|
-
for (let entry of data.entries()) {
|
|
64
|
-
params = params.append(entry[0], entry[1]);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return this.httpClient
|
|
68
|
-
.get(endpoint.listOpen, {
|
|
69
|
-
params,
|
|
70
|
-
})
|
|
71
|
-
.pipe(map((el) => {
|
|
72
|
-
if (el.results) {
|
|
73
|
-
let positions = el.results.map((position) => ({
|
|
74
|
-
...position,
|
|
75
|
-
symbolId: position.symbol,
|
|
76
|
-
symbol: new Symbol(),
|
|
77
|
-
}));
|
|
78
|
-
return { ...el, 'results': positions };
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
el = el.map((position) => ({
|
|
82
|
-
...position,
|
|
83
|
-
symbolId: position.symbol,
|
|
84
|
-
symbol: new Symbol(),
|
|
85
|
-
}));
|
|
86
|
-
return el;
|
|
87
|
-
}
|
|
88
|
-
}));
|
|
89
|
-
}
|
|
90
|
-
getCloseCsv(headers, data) {
|
|
91
|
-
let params = new HttpParams();
|
|
92
|
-
if (data) {
|
|
93
|
-
for (let entry of data.entries()) {
|
|
94
|
-
params = params.append(entry[0], entry[1]);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return this.httpClient.get(endpoint.closePosition, {
|
|
98
|
-
params,
|
|
99
|
-
headers,
|
|
100
|
-
observe: 'body',
|
|
101
|
-
responseType: 'blob',
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
getCloseCSVTrading(data, headers) {
|
|
105
|
-
let params = new HttpParams();
|
|
106
|
-
if (data) {
|
|
107
|
-
for (let entry of data.entries()) {
|
|
108
|
-
params = params.append(entry[0], entry[1]);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return this.httpClient.get(endpoint.closePosition, headers
|
|
112
|
-
? {
|
|
113
|
-
params,
|
|
114
|
-
headers,
|
|
115
|
-
observe: 'body',
|
|
116
|
-
responseType: 'blob',
|
|
117
|
-
}
|
|
118
|
-
: {
|
|
119
|
-
params,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
getClose(tradingAccountUuid, data) {
|
|
123
|
-
let params = new HttpParams();
|
|
124
|
-
if (tradingAccountUuid) {
|
|
125
|
-
params = params.append('tradingAccount', tradingAccountUuid);
|
|
126
|
-
}
|
|
127
|
-
if (data) {
|
|
128
|
-
for (let entry of data.entries()) {
|
|
129
|
-
params = params.append(entry[0], entry[1]);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return this.httpClient.get(endpoint.closePosition, {
|
|
133
|
-
params,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
getOrdersCsv(headers, data) {
|
|
137
|
-
let params = new HttpParams();
|
|
138
|
-
if (data) {
|
|
139
|
-
for (let entry of data.entries()) {
|
|
140
|
-
params = params.append(entry[0], entry[1]);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return this.httpClient.get(endpoint.orders, {
|
|
144
|
-
params,
|
|
145
|
-
headers,
|
|
146
|
-
observe: 'body',
|
|
147
|
-
responseType: 'blob',
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
getOrders(tradingAccountUuid, orderStatus, data) {
|
|
151
|
-
let params = new HttpParams();
|
|
152
|
-
if (tradingAccountUuid) {
|
|
153
|
-
params = params.set('tradingAccount', tradingAccountUuid);
|
|
154
|
-
}
|
|
155
|
-
if (orderStatus) {
|
|
156
|
-
params = params.append('orderStatus', orderStatus);
|
|
157
|
-
}
|
|
158
|
-
if (data) {
|
|
159
|
-
for (let entry of data.entries()) {
|
|
160
|
-
params = params.append(entry[0], entry[1]);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return this.httpClient.get(endpoint.orders, {
|
|
164
|
-
params,
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
create(value) {
|
|
168
|
-
return this.httpClient.post(endpoint.create, value).pipe(tap(() => {
|
|
169
|
-
this._refresh$.next();
|
|
170
|
-
}));
|
|
171
|
-
}
|
|
172
|
-
createOrder(value) {
|
|
173
|
-
return this.httpClient.post(endpoint.createOrder, value);
|
|
174
|
-
}
|
|
175
|
-
closePositions(volume, uuid) {
|
|
176
|
-
return this.httpClient
|
|
177
|
-
.post(`/positions/trading-positions/${uuid}/close/`, volume)
|
|
178
|
-
.pipe(tap(() => {
|
|
179
|
-
this.refresh$.next();
|
|
180
|
-
}));
|
|
181
|
-
}
|
|
182
|
-
closeWithHedge(uuid) {
|
|
183
|
-
return this.httpClient
|
|
184
|
-
.post(`${endpoint.closeOnHedge}${uuid}/close-on-hedge/`, null)
|
|
185
|
-
.pipe(tap(() => {
|
|
186
|
-
this.refresh$.next();
|
|
187
|
-
}));
|
|
188
|
-
}
|
|
189
|
-
setPosition(position) {
|
|
190
|
-
this.position.next(position);
|
|
191
|
-
}
|
|
192
|
-
cancellOrder(uuid) {
|
|
193
|
-
return this.httpClient.post(endpoint.cancellOrder1 + uuid + endpoint.cancellOrder2, {});
|
|
194
|
-
}
|
|
195
|
-
patchPosition(form, uuid) {
|
|
196
|
-
return this.httpClient.patch(endpoint.patchPosition + uuid + '/', form);
|
|
197
|
-
}
|
|
198
|
-
patchOrder(value, uuid) {
|
|
199
|
-
return this.httpClient.patch(endpoint.patchOrder + uuid + '/', value);
|
|
200
|
-
}
|
|
201
|
-
getPositionsTradeSummary(data) {
|
|
202
|
-
let params = new HttpParams();
|
|
203
|
-
if (data) {
|
|
204
|
-
for (let entry of data.entries()) {
|
|
205
|
-
params = params.append(entry[0], entry[1]);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return this.httpClient.get(endpoint.tradeSummary, {
|
|
209
|
-
params: params,
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
getPositionsSummaryDealing(data) {
|
|
213
|
-
let params = new HttpParams();
|
|
214
|
-
if (data) {
|
|
215
|
-
for (let entry of data.entries()) {
|
|
216
|
-
params = params.append(entry[0], entry[1]);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return this.httpClient.get(endpoint.positionSummaryDealing, {
|
|
220
|
-
params: params,
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
closeAllPositions(uuidAccountTrd) {
|
|
224
|
-
return this.httpClient.get(`/accounts/trading-accounts/${uuidAccountTrd}/close-all-positions/`);
|
|
225
|
-
}
|
|
226
|
-
get positionSelected() {
|
|
227
|
-
return this.position.getValue();
|
|
228
|
-
}
|
|
229
|
-
cancelAllOrders(uuidAccountTrd) {
|
|
230
|
-
return this.httpClient
|
|
231
|
-
.get(`/accounts/trading-accounts/${uuidAccountTrd}/cancel-all-orders/`)
|
|
232
|
-
.pipe(tap(() => {
|
|
233
|
-
this.refresh$.next();
|
|
234
|
-
}));
|
|
235
|
-
}
|
|
236
|
-
getTotalPositions(data) {
|
|
237
|
-
let params = new HttpParams();
|
|
238
|
-
if (data) {
|
|
239
|
-
for (let entry of data.entries()) {
|
|
240
|
-
params = params.append(entry[0], entry[1]);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return this.httpClient.get(endpoint.listOpen + 'totals/', { params });
|
|
244
|
-
}
|
|
245
|
-
getClosedPositionsTotals(data) {
|
|
246
|
-
let params = new HttpParams();
|
|
247
|
-
if (data) {
|
|
248
|
-
for (let entry of data.entries()) {
|
|
249
|
-
params = params.append(entry[0], entry[1]);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
return this.httpClient.get(endpoint.closePosition + 'totals/', { params });
|
|
253
|
-
}
|
|
254
|
-
getActiveOrdersTotals(data) {
|
|
255
|
-
let params = new HttpParams();
|
|
256
|
-
if (data) {
|
|
257
|
-
for (let entry of data.entries()) {
|
|
258
|
-
params = params.append(entry[0], entry[1]);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
return this.httpClient.get(endpoint.orders + 'totals/', { params });
|
|
262
|
-
}
|
|
263
|
-
setPendingOrders(orders) {
|
|
264
|
-
this.pendingOrders$.next(orders);
|
|
265
|
-
}
|
|
266
|
-
setClosePositions(closePositions) {
|
|
267
|
-
this.closePositions$.next(closePositions);
|
|
268
|
-
}
|
|
269
|
-
getListPositionsSlaves(id, data) {
|
|
270
|
-
let params = new HttpParams();
|
|
271
|
-
if (data) {
|
|
272
|
-
for (let entry of data.entries()) {
|
|
273
|
-
params = params.append(entry[0], entry[1]);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
return this.httpClient.get(`${endpoint.listOpen}${id}/slaves/`, { params });
|
|
277
|
-
}
|
|
278
|
-
closeMultiplePositions(payload) {
|
|
279
|
-
return this.httpClient.post(endpoint.closeMultiple, payload);
|
|
280
|
-
}
|
|
281
|
-
getListPositionsHistorySlaves(id, data, headers) {
|
|
282
|
-
let params = new HttpParams();
|
|
283
|
-
if (data) {
|
|
284
|
-
for (let entry of data.entries()) {
|
|
285
|
-
params = params.append(entry[0], entry[1]);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
return this.httpClient.get(`${endpoint.closePosition}${id}/slaves/`, headers
|
|
289
|
-
? {
|
|
290
|
-
params,
|
|
291
|
-
headers,
|
|
292
|
-
observe: 'body',
|
|
293
|
-
responseType: 'blob',
|
|
294
|
-
}
|
|
295
|
-
: {
|
|
296
|
-
params,
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
getPositionHistoryByUUID(uid) {
|
|
300
|
-
return this.httpClient.get(`${endpoint.closePosition}${uid}/`);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
ExcentServPositionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ExcentServPositionsService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
304
|
-
ExcentServPositionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ExcentServPositionsService, providedIn: 'root' });
|
|
305
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ExcentServPositionsService, decorators: [{
|
|
306
|
-
type: Injectable,
|
|
307
|
-
args: [{
|
|
308
|
-
providedIn: 'root',
|
|
309
|
-
}]
|
|
310
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZW50LXNlcnYtcG9zaXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9leGNlbnQtc2Vydi1wb3NpdGlvbnMvc3JjL2xpYi9leGNlbnQtc2Vydi1wb3NpdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTJCLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQVVMLE1BQU0sRUFDUCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7QUFNNUQsTUFBTSxPQUFPLDBCQUEwQjtJQTJCckMsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTFCbEMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsYUFBUSxHQUFHLElBQUksZUFBZSxDQUFtQixJQUFJLENBQUMsQ0FBQztRQUN4RCxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFnQixFQUFFLENBQUMsQ0FBQztRQUN4RCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUF3QixFQUFFLENBQUMsQ0FBQztRQUNqRSxjQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QyxtQkFBYyxHQUNuQixJQUFJLGVBQWUsQ0FBa0M7WUFDbkQsSUFBSSxFQUFFLEVBQUU7WUFDUixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sY0FBYyxFQUFFLEVBQUU7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QUFhLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVNLDZCQUE2QixDQUFJLEVBQVUsRUFBRSxJQUFzQixFQUFFLE9BQXFCO1FBQy9GLElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUE7UUFDN0IsSUFBSSxJQUFJLEVBQUU7WUFDUixLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzVDO1NBQ0Y7UUFHRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsR0FBRyxFQUFFLFVBQVUsRUFDbkUsT0FBTztZQUNOLENBQUMsQ0FBQztnQkFDRSxNQUFNO2dCQUNOLE9BQU87Z0JBQ1AsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsWUFBWSxFQUFFLE1BQWdCO2FBQy9CO1lBQ0gsQ0FBQyxDQUFDO2dCQUNFLE1BQU07YUFDUCxDQUNKLENBQUE7SUFDTCxDQUFDO0lBRU0sd0JBQXdCLENBQUksR0FBVztRQUM1QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBQ25FLENBQUM7O3VIQTdZVSwwQkFBMEI7MkhBQTFCLDBCQUEwQixjQUZ6QixNQUFNOzJGQUVQLDBCQUEwQjtrQkFIdEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIElDbG9zZVBvc2l0aW9uLFxuICBJT3JkZXIsXG4gIElQYXlsb2FkQ3JlYXRlUG9zaXRpb24sXG4gIElQb3NpdGlvbixcbiAgSVBvc2l0aW9uU3VtbWFyeURlYWxpbmcsXG4gIElSZXNwb25zZUNsb3NlLFxuICBJUmVzcG9uc2VPcmRlcixcbiAgSVRyYWRlU3VtbWFyeSxcbiAgUmVzcG9uc2VQYWdpbmF0b3IsXG4gIFN5bWJvbFxufSBmcm9tICdAZXhjZW50L2V4Y2VudC1tb2RlbHMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGVuZHBvaW50IH0gZnJvbSAnLi9leGNlbnQtc2Vydi1wb3NpdGlvbnMuZW5wb2ludHMnO1xuXG50eXBlIElQb3NpdGlvblJlc3BvbnNlID0gUGFydGlhbDxJUG9zaXRpb24+ICYgeyBjdXJyZW50UHJpY2U6IG51bWJlciB9O1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEV4Y2VudFNlcnZQb3NpdGlvbnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfcmVmcmVzaCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHBvc2l0aW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUG9zaXRpb24gfCBudWxsPihudWxsKTtcbiAgcHVibGljIHBlbmRpbmdPcmRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxJT3JkZXI+PihbXSk7XG4gIHB1YmxpYyBjbG9zZVBvc2l0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PElDbG9zZVBvc2l0aW9uPj4oW10pO1xuICBwdWJsaWMgcG9zaXRpb24kID0gdGhpcy5wb3NpdGlvbi5hc09ic2VydmFibGUoKTtcbiAgcHVibGljIG9wZXJhdGlvbk9yZGVyOiBCZWhhdmlvclN1YmplY3Q8eyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBJT3JkZXIgfT4gPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3Q8eyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBJT3JkZXIgfT4oe1xuICAgICAgdHlwZTogJycsXG4gICAgICB2YWx1ZToge1xuICAgICAgICB1dWlkOiAnJyxcbiAgICAgICAgaWQ6ICcnLFxuICAgICAgICB0cmFkaW5nQWNjb3VudDogJycsXG4gICAgICAgIHN5bWJvbDogbmV3IFN5bWJvbCgpLmlkLFxuICAgICAgICBpZFN5bWJvbDogMCxcbiAgICAgICAgb3JkZXJUeXBlOiAwLFxuICAgICAgICBvcmRlclN0YXR1czogMCxcbiAgICAgICAgdm9sdW1lOiAwLFxuICAgICAgICBidXk6IGZhbHNlLFxuICAgICAgICBzdG9wTG9zczogMCxcbiAgICAgICAgdGFrZVByb2ZpdDogMCxcbiAgICAgICAgYWN0aXZhdGlvblByaWNlOiAwLFxuICAgICAgICBjYW5jZWxsYXRpb25EYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICBjcmVhdGlvbkRhdGU6IG5ldyBEYXRlKCksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCkge31cblxuICBnZXQgcmVmcmVzaCQoKTogU3ViamVjdDx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZnJlc2gkO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZFBvc2l0aW9ucyhpZFVzZXI6IG51bWJlcik6IE9ic2VydmFibGU8SVBvc2l0aW9uW10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLnNldCgnaWRBY2NvdW50JywgaWRVc2VyKTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxJUG9zaXRpb25bXT4oZW5kcG9pbnQub3BlbiwgeyBwYXJhbXMgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0T3BlbkNzdjxUPihoZWFkZXJzOiBIdHRwSGVhZGVycywgZGF0YT86IE1hcDxzdHJpbmcsIGFueT4pIHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcblxuICAgIGlmIChkYXRhKSB7XG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiBkYXRhLmVudHJpZXMoKSkge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoZW5kcG9pbnQubGlzdE9wZW4sIHtcbiAgICAgIHBhcmFtcyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBvYnNlcnZlOiAnYm9keScsXG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJyBhcyAnanNvbicsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0T3BlbjxUPihcbiAgICB1dWlkPzogc3RyaW5nLFxuICAgIGRhdGE/OiBNYXA8c3RyaW5nLCBhbnk+XG4gICk6IE9ic2VydmFibGU8VD4ge1xuXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcbiAgICBpZiAodXVpZCkgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgndHJhZGluZ0FjY291bnQnLCB1dWlkKTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgZm9yIChsZXQgZW50cnkgb2YgZGF0YS5lbnRyaWVzKCkpIHtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcbiAgICAgIC5nZXQ8VD4oZW5kcG9pbnQubGlzdE9wZW4sIHtcbiAgICAgICAgcGFyYW1zLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICBpZihlbC5yZXN1bHRzKSB7XG4gICAgICAgICAgICBsZXQgcG9zaXRpb25zID0gKGVsIGFzIFJlc3BvbnNlUGFnaW5hdG9yPElQb3NpdGlvbj4pLnJlc3VsdHMubWFwKChwb3NpdGlvbjogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgICAgc3ltYm9sSWQ6IHBvc2l0aW9uLnN5bWJvbCxcbiAgICAgICAgICAgICAgc3ltYm9sOiBuZXcgU3ltYm9sKCksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gey4uLmVsLCAncmVzdWx0cyc6IHBvc2l0aW9ucyB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsID0gKGVsIGFzIEFycmF5PElQb3NpdGlvbj4pLm1hcCgocG9zaXRpb24pID0+ICh7XG4gICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgICBzeW1ib2xJZDogcG9zaXRpb24uc3ltYm9sLFxuICAgICAgICAgICAgICBzeW1ib2w6IG5ldyBTeW1ib2woKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldENsb3NlQ3N2PFQ+KGhlYWRlcnM6IEh0dHBIZWFkZXJzLCBkYXRhPzogTWFwPHN0cmluZywgYW55Pikge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoZW5kcG9pbnQuY2xvc2VQb3NpdGlvbiwge1xuICAgICAgcGFyYW1zLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG9ic2VydmU6ICdib2R5JyxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbG9zZUNTVlRyYWRpbmc8VD4oZGF0YT86IE1hcDxzdHJpbmcsIGFueT4sIGhlYWRlcnM/OiBIdHRwSGVhZGVycykge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxUPihcbiAgICAgIGVuZHBvaW50LmNsb3NlUG9zaXRpb24sXG4gICAgICBoZWFkZXJzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIG9ic2VydmU6ICdib2R5JyxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldENsb3NlPFQ+KFxuICAgIHRyYWRpbmdBY2NvdW50VXVpZD86IHN0cmluZyxcbiAgICBkYXRhPzogTWFwPHN0cmluZywgYW55PlxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuXG4gICAgaWYgKHRyYWRpbmdBY2NvdW50VXVpZCkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgndHJhZGluZ0FjY291bnQnLCB0cmFkaW5nQWNjb3VudFV1aWQpO1xuICAgIH1cblxuICAgIGlmIChkYXRhKSB7XG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiBkYXRhLmVudHJpZXMoKSkge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFQ+KGVuZHBvaW50LmNsb3NlUG9zaXRpb24sIHtcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPcmRlcnNDc3Y8VD4oaGVhZGVyczogSHR0cEhlYWRlcnMsIGRhdGE/OiBNYXA8c3RyaW5nLCBhbnk+KSB7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgZm9yIChsZXQgZW50cnkgb2YgZGF0YS5lbnRyaWVzKCkpIHtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGVuZHBvaW50Lm9yZGVycywge1xuICAgICAgcGFyYW1zLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG9ic2VydmU6ICdib2R5JyxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPcmRlcnM8VD4oXG4gICAgdHJhZGluZ0FjY291bnRVdWlkPzogc3RyaW5nLFxuICAgIG9yZGVyU3RhdHVzPzogbnVtYmVyLFxuICAgIGRhdGE/OiBNYXA8c3RyaW5nLCBhbnk+XG4gICk6IE9ic2VydmFibGU8VD4ge1xuXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcblxuICAgIGlmICh0cmFkaW5nQWNjb3VudFV1aWQpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3RyYWRpbmdBY2NvdW50JywgdHJhZGluZ0FjY291bnRVdWlkKTtcbiAgICB9XG5cbiAgICBpZiAob3JkZXJTdGF0dXMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ29yZGVyU3RhdHVzJywgb3JkZXJTdGF0dXMpO1xuICAgIH1cblxuICAgIGlmIChkYXRhKSB7XG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiBkYXRhLmVudHJpZXMoKSkge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFQ+KGVuZHBvaW50Lm9yZGVycywge1xuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZSh2YWx1ZTogSVBheWxvYWRDcmVhdGVQb3NpdGlvbik6IE9ic2VydmFibGU8SVBvc2l0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PElQb3NpdGlvbj4oZW5kcG9pbnQuY3JlYXRlLCB2YWx1ZSkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2gkLm5leHQoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVPcmRlcjxULCBVPih2YWx1ZTogVSkge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxUPihlbmRwb2ludC5jcmVhdGVPcmRlciwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlUG9zaXRpb25zKFxuICAgIHZvbHVtZTogeyB2b2x1bWU6IG51bWJlciB9LFxuICAgIHV1aWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPElDbG9zZVBvc2l0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3Q8SUNsb3NlUG9zaXRpb24+KFxuICAgICAgICBgL3Bvc2l0aW9ucy90cmFkaW5nLXBvc2l0aW9ucy8ke3V1aWR9L2Nsb3NlL2AsXG4gICAgICAgIHZvbHVtZVxuICAgICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoJC5uZXh0KCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGNsb3NlV2l0aEhlZGdlKHV1aWQ6IHN0cmluZyk6IE9ic2VydmFibGU8SVBvc2l0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3Q8SVBvc2l0aW9uPiggXG4gICAgICAgIGAke2VuZHBvaW50LmNsb3NlT25IZWRnZX0ke3V1aWR9L2Nsb3NlLW9uLWhlZGdlL2AsXG4gICAgICAgIG51bGxcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaCQubmV4dCgpO1xuICAgICAgICB9KVxuICAgICAgKVxuICB9XG5cbiAgcHVibGljIHNldFBvc2l0aW9uKHBvc2l0aW9uOiBJUG9zaXRpb24gfCBudWxsKSB7XG4gICAgdGhpcy5wb3NpdGlvbi5uZXh0KHBvc2l0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxsT3JkZXIodXVpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2VPcmRlcj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxJUmVzcG9uc2VPcmRlcj4oXG4gICAgICBlbmRwb2ludC5jYW5jZWxsT3JkZXIxICsgdXVpZCArIGVuZHBvaW50LmNhbmNlbGxPcmRlcjIsXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcGF0Y2hQb3NpdGlvbihcbiAgICBmb3JtOiB7IHN0b3BMb3NzPzogbnVtYmVyOyB0YWtlUHJvZml0PzogbnVtYmVyOyB2b2x1bWU/OiBudW1iZXIgfSxcbiAgICB1dWlkOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxJUG9zaXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBhdGNoPElQb3NpdGlvbj4oXG4gICAgICBlbmRwb2ludC5wYXRjaFBvc2l0aW9uICsgdXVpZCArICcvJyxcbiAgICAgIGZvcm1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHBhdGNoT3JkZXIodmFsdWU6IGFueSwgdXVpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2VPcmRlcj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucGF0Y2g8SVJlc3BvbnNlT3JkZXI+KFxuICAgICAgZW5kcG9pbnQucGF0Y2hPcmRlciArIHV1aWQgKyAnLycsXG4gICAgICB2YWx1ZVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UG9zaXRpb25zVHJhZGVTdW1tYXJ5KFxuICAgIGRhdGE/OiBNYXA8c3RyaW5nLCBhbnk+XG4gICk6IE9ic2VydmFibGU8SVRyYWRlU3VtbWFyeVtdPiB7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxJVHJhZGVTdW1tYXJ5W10+KGVuZHBvaW50LnRyYWRlU3VtbWFyeSwge1xuICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UG9zaXRpb25zU3VtbWFyeURlYWxpbmcoXG4gICAgZGF0YT86IE1hcDxzdHJpbmcsIGFueT5cbiAgKTogT2JzZXJ2YWJsZTxJUG9zaXRpb25TdW1tYXJ5RGVhbGluZ1tdPiB7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxJUG9zaXRpb25TdW1tYXJ5RGVhbGluZ1tdPihcbiAgICAgIGVuZHBvaW50LnBvc2l0aW9uU3VtbWFyeURlYWxpbmcsXG4gICAgICB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VBbGxQb3NpdGlvbnModXVpZEFjY291bnRUcmQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFycmF5PElSZXNwb25zZUNsb3NlPj4oXG4gICAgICBgL2FjY291bnRzL3RyYWRpbmctYWNjb3VudHMvJHt1dWlkQWNjb3VudFRyZH0vY2xvc2UtYWxsLXBvc2l0aW9ucy9gXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9zaXRpb25TZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbEFsbE9yZGVyczxUPih1dWlkQWNjb3VudFRyZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLmdldDxUPihgL2FjY291bnRzL3RyYWRpbmctYWNjb3VudHMvJHt1dWlkQWNjb3VudFRyZH0vY2FuY2VsLWFsbC1vcmRlcnMvYClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaCQubmV4dCgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb3RhbFBvc2l0aW9uczxUPihkYXRhPzogTWFwPHN0cmluZyxhbnk+KSB7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcbiAgICBpZiAoZGF0YSkge1xuICAgICAgZm9yIChsZXQgZW50cnkgb2YgZGF0YS5lbnRyaWVzKCkpIHtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxUPihlbmRwb2ludC5saXN0T3BlbiArICd0b3RhbHMvJywgeyBwYXJhbXMgfSlcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbG9zZWRQb3NpdGlvbnNUb3RhbHM8VD4oZGF0YT86IE1hcDxzdHJpbmcsYW55Pikge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8VD4oZW5kcG9pbnQuY2xvc2VQb3NpdGlvbiArICd0b3RhbHMvJywgeyBwYXJhbXMgfSlcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVPcmRlcnNUb3RhbHM8VD4oZGF0YT86IE1hcDxzdHJpbmcsYW55Pikge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8VD4oZW5kcG9pbnQub3JkZXJzICsgJ3RvdGFscy8nLCB7IHBhcmFtcyB9KVxuICB9XG5cbiAgcHVibGljIHNldFBlbmRpbmdPcmRlcnMob3JkZXJzOiBBcnJheTxJT3JkZXI+KSB7XG4gICAgdGhpcy5wZW5kaW5nT3JkZXJzJC5uZXh0KG9yZGVycylcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbG9zZVBvc2l0aW9ucyhjbG9zZVBvc2l0aW9uczogQXJyYXk8SUNsb3NlUG9zaXRpb24+KSB7XG4gICAgdGhpcy5jbG9zZVBvc2l0aW9ucyQubmV4dChjbG9zZVBvc2l0aW9ucylcbiAgfVxuXG4gIHB1YmxpYyBnZXRMaXN0UG9zaXRpb25zU2xhdmVzPFQ+KGlkOiBzdHJpbmcsIGRhdGE/OiBNYXA8c3RyaW5nLGFueT4pIHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgIGlmIChkYXRhKSB7XG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiBkYXRhLmVudHJpZXMoKSkge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8VD4oYCR7ZW5kcG9pbnQubGlzdE9wZW59JHtpZH0vc2xhdmVzL2AsIHsgcGFyYW1zIH0pXG4gIH1cblxuICBwdWJsaWMgY2xvc2VNdWx0aXBsZVBvc2l0aW9uczxGLFI+KHBheWxvYWQ6IEYpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8Uj4oZW5kcG9pbnQuY2xvc2VNdWx0aXBsZSwgcGF5bG9hZClcbiAgfVxuXG4gIHB1YmxpYyBnZXRMaXN0UG9zaXRpb25zSGlzdG9yeVNsYXZlczxUPihpZDogc3RyaW5nLCBkYXRhPzogTWFwPHN0cmluZyxhbnk+LCBoZWFkZXJzPzogSHR0cEhlYWRlcnMpIHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgIGlmIChkYXRhKSB7XG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiBkYXRhLmVudHJpZXMoKSkge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8VD4oYCR7ZW5kcG9pbnQuY2xvc2VQb3NpdGlvbn0ke2lkfS9zbGF2ZXMvYCwgXG4gICAgICAgaGVhZGVyc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBvYnNlcnZlOiAnYm9keScsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJyBhcyAnanNvbicsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICB9XG4gICAgICApXG4gIH1cblxuICBwdWJsaWMgZ2V0UG9zaXRpb25IaXN0b3J5QnlVVUlEPFQ+KHVpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8VD4oYCR7ZW5kcG9pbnQuY2xvc2VQb3NpdGlvbn0ke3VpZH0vYClcbiAgfVxufVxuIl19
|