@senior-gestao-empresarial/angular-components 4.22.0 → 4.22.2-7ecfc706-3270-4664-9d10-a6918ef49acd

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.
@@ -2,33 +2,29 @@ import { __assign, __decorate, __values } from "tslib";
2
2
  import { Injectable } from "@angular/core";
3
3
  import { Stomp } from "@stomp/stompjs";
4
4
  import * as Cookies from "js-cookie";
5
- import { CookieService } from "ngx-cookie-service";
6
5
  import { Subject } from "rxjs";
7
- import { take } from "rxjs/operators";
6
+ import { first, finalize } from "rxjs/operators";
8
7
  import * as SockJS from "sockjs-client";
9
8
  import * as i0 from "@angular/core";
10
- import * as i1 from "ngx-cookie-service";
11
9
  var WebsocketService = /** @class */ (function () {
12
- function WebsocketService(cookieService) {
13
- this.cookieService = cookieService;
14
- this.baseUrl = null;
15
- this.username = null;
10
+ function WebsocketService() {
16
11
  this.focused = true;
12
+ this.wasConnected = false;
17
13
  this.connected = false;
18
14
  this.isConnecting = false;
19
- this.stompSubscriptions = new Map();
20
- // private primitiveSubjects: Map<string, Subject<any>> = new Map<string, Subject<any>>();
21
15
  this.primitiveManagers = new Map();
22
- this.disconnectSubject = new Subject();
23
16
  this.connect$ = new Subject();
17
+ this.disconnect$ = new Subject();
18
+ this.reconnect$ = new Subject();
19
+ this.error$ = new Subject();
24
20
  window.onfocus = this.onFocus;
25
21
  window.onblur = this.onBlur;
26
22
  this.connect();
27
23
  }
28
24
  WebsocketService_1 = WebsocketService;
29
25
  /**
30
- * Observable resposável por emitir uma notificação quando a conexão websocket é estabelecida.
31
- * @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida ou já está em andamento.
26
+ * Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida.
27
+ * @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida.
32
28
  */
33
29
  WebsocketService.prototype.onConnect = function () {
34
30
  var _this = this;
@@ -40,67 +36,69 @@ var WebsocketService = /** @class */ (function () {
40
36
  return this.connect$.asObservable();
41
37
  };
42
38
  /**
43
- * Observable resposável por emitir uma notificação quando a conexão é finalizada.
44
- * @return Um `Observable<void>` que emite uma notificação quando a conexão é finalizada.
39
+ * Observable responsável por emitir uma notificação quando a conexão é desconectada.
40
+ * @return Um `Observable<void>` que emite uma notificação quando a conexão é desconectada.
45
41
  */
46
42
  WebsocketService.prototype.onDisconnect = function () {
47
- return this.disconnectSubject.asObservable();
43
+ return this.disconnect$.asObservable();
44
+ };
45
+ /**
46
+ * Observable responsável por emitir uma notificação quando a conexão é reconectada.
47
+ * @return Um `Observable<void>` que emite uma notificação quando a conexão é reconectada.
48
+ */
49
+ WebsocketService.prototype.onReconnect = function () {
50
+ return this.reconnect$.asObservable();
51
+ };
52
+ /**
53
+ * Observable responsável por emitir uma notificação quando ocorre algum erro.
54
+ * @return Um `Observable<FrameImpl>` que emite uma notificação quando ocorre algum erro.
55
+ */
56
+ WebsocketService.prototype.onError = function () {
57
+ return this.error$.asObservable();
48
58
  };
49
59
  /**
50
60
  * Observable responsável por emitir uma notificação quando um evento é publicado.
51
61
  * @typeParam `<T>` Tipo do objeto que o retorno do `observable` vai devolver.
52
- * @param domain Dominio da primitva.
62
+ * @param domain Dominio da primitiva.
53
63
  * @param service Service da primitiva.
54
64
  * @param primitive Primitiva que será "observada" pelo client.
55
- * @param identifierPath Caminho até a propriedade considerada o indentificador do registro.
65
+ * @param identifierPath Caminho até a propriedade considerada o identificador do registro.
56
66
  * @return Um `observable` que emite notificações toda vez que o respectivo evento é publicado no sistema.
57
67
  */
58
68
  WebsocketService.prototype.onEvent = function (domain, service, primitive, identifierPath) {
59
69
  var _this = this;
60
- var primitiveManager = this.primitiveManagers.get(primitive);
61
- if (primitiveManager) {
62
- return primitiveManager.subject.asObservable();
70
+ if (this.primitiveManagers.has(primitive)) {
71
+ return this.primitiveManagers.get(primitive).subject.asObservable();
63
72
  }
64
- primitiveManager = {
73
+ var primitiveManager = {
74
+ domain: domain,
75
+ service: service,
76
+ primitive: primitive,
77
+ stompSubscriptions: [],
65
78
  subject: new Subject(),
66
79
  identifierPath: identifierPath,
67
80
  publishedEvents: [],
68
81
  };
82
+ this.primitiveManagers.set(primitive, primitiveManager);
69
83
  if (this.isConnected()) {
70
- var url = this.getSubscriptionUserUrl(domain, service, primitive);
71
- this.primitiveManagers.set(primitive, primitiveManager);
72
- var stompSubscription = this._stompClient.subscribe(url, function (message) {
73
- var event = JSON.parse(message.body || "{}");
74
- _this.addPublishedEvent(primitiveManager, event);
75
- primitiveManager.subject.next(event);
76
- });
77
- this.stompSubscriptions.set(primitive, stompSubscription);
78
- return primitiveManager.subject.asObservable();
84
+ this.createStompSubscriptions(primitiveManager);
85
+ return primitiveManager.subject.pipe(finalize(function () { return _this.disconnectPrimitiveOnFinalize(primitive); }));
79
86
  }
80
87
  else {
81
88
  if (!this.isConnecting) {
82
89
  this.connect();
83
90
  }
84
- this.onConnect()
85
- .pipe(take(1))
86
- .subscribe(function () {
87
- var url = _this.getSubscriptionUserUrl(domain, service, primitive);
88
- _this.primitiveManagers.set(primitive, primitiveManager);
89
- var stompSubscription = _this._stompClient.subscribe(url, function (message) {
90
- var event = JSON.parse(message.body || "{}");
91
- _this.addPublishedEvent(primitiveManager, event);
92
- primitiveManager.subject.next(event);
93
- });
94
- _this.stompSubscriptions.set(primitive, stompSubscription);
91
+ this.connect$.pipe(first()).subscribe(function () {
92
+ _this.createStompSubscriptions(primitiveManager);
95
93
  });
96
- return primitiveManager.subject.asObservable();
94
+ return primitiveManager.subject.pipe(finalize(function () { return _this.disconnectPrimitiveOnFinalize(primitive); }));
97
95
  }
98
96
  };
99
97
  /**
100
- * Retorna todos os eventos ouvidos para a respectiva primitiva.
98
+ * Retorna todos os eventos ouvidos pela primitiva com os respectivos identificadores.
101
99
  * @typeParam `<T>` Tipo do evento retornado pela primitiva.
102
100
  * @param primitive Primitiva que será "observada" pelo client.
103
- * @param identifiers Array com os indentificadores interessados.
101
+ * @param identifiers Array com os identificadores interessados.
104
102
  * @return Array contendo o último evento recebido de cada identificador fornecido.
105
103
  */
106
104
  WebsocketService.prototype.getPublishedEvents = function (primitive, identifiers) {
@@ -132,9 +130,7 @@ var WebsocketService = /** @class */ (function () {
132
130
  WebsocketService.prototype.addPublishedEvent = function (primitiveManager, event) {
133
131
  var _this = this;
134
132
  var identifier = this.getIdentifierFromEvent(primitiveManager.identifierPath, event);
135
- var eventIndex = primitiveManager.publishedEvents.findIndex(function (x) {
136
- return _this.getIdentifierFromEvent(primitiveManager.identifierPath, x) === identifier;
137
- });
133
+ var eventIndex = primitiveManager.publishedEvents.findIndex(function (x) { return _this.getIdentifierFromEvent(primitiveManager.identifierPath, x) === identifier; });
138
134
  if (eventIndex !== -1) {
139
135
  primitiveManager.publishedEvents[eventIndex] = __assign(__assign({}, primitiveManager.publishedEvents[eventIndex]), event);
140
136
  }
@@ -142,6 +138,13 @@ var WebsocketService = /** @class */ (function () {
142
138
  primitiveManager.publishedEvents.push(event);
143
139
  }
144
140
  };
141
+ WebsocketService.prototype.createStompSubscriptions = function (primitiveManager) {
142
+ var withTokenUrl = this.getSubscriptionUrlWithToken(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive);
143
+ var stompSubscriptionWithToken = this.createStompSubscription(withTokenUrl, primitiveManager);
144
+ var withoutTokenUrl = this.getSubscriptionUrlWithoutToken(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive);
145
+ var stompSubscriptionWithoutToken = this.createStompSubscription(withoutTokenUrl, primitiveManager);
146
+ primitiveManager.stompSubscriptions = [stompSubscriptionWithToken, stompSubscriptionWithoutToken];
147
+ };
145
148
  WebsocketService.prototype.getIdentifierFromEvent = function (identifierPath, event) {
146
149
  var e_2, _a;
147
150
  var properties = identifierPath.split(".");
@@ -165,15 +168,22 @@ var WebsocketService = /** @class */ (function () {
165
168
  var _this = this;
166
169
  this.createStompClient();
167
170
  this.isConnecting = true;
171
+ this._stompClient.activate();
168
172
  this._stompClient.connect({}, function () {
169
- _this.setConnected(true);
170
- // console.log('setou false isConnecting');
171
173
  _this.isConnecting = false;
172
- // console.log('connectou dentro do connect cb');
173
- _this.publishOnConnect();
174
- }, function () {
174
+ _this.setConnected(true);
175
+ if (_this.wasConnected) {
176
+ _this.reconnectPrimitives();
177
+ _this.reconnect$.next();
178
+ }
179
+ else {
180
+ _this.wasConnected = true;
181
+ _this.publishOnConnect();
182
+ }
183
+ }, function (error) {
175
184
  _this.setConnected(false);
176
- // this.reconnectWebSocket();
185
+ _this.error$.next(error);
186
+ _this.reconnect();
177
187
  });
178
188
  };
179
189
  WebsocketService.prototype.publishOnConnect = function () {
@@ -187,46 +197,54 @@ var WebsocketService = /** @class */ (function () {
187
197
  this.focused = false;
188
198
  };
189
199
  WebsocketService.prototype.disconnect = function () {
190
- var e_3, _a, e_4, _b;
191
- var observersCount = 0;
200
+ var e_3, _a, e_4, _b, e_5, _c;
201
+ var observersCount = this.getObserversCount();
202
+ if (observersCount > 0)
203
+ return;
192
204
  try {
193
- for (var _c = __values(this.primitiveManagers.values()), _d = _c.next(); !_d.done; _d = _c.next()) {
194
- var primitiveManager = _d.value;
195
- observersCount += primitiveManager.subject.observers.length;
205
+ for (var _d = __values(this.primitiveManagers.values()), _e = _d.next(); !_e.done; _e = _d.next()) {
206
+ var primitiveManager = _e.value;
207
+ try {
208
+ for (var _f = (e_4 = void 0, __values(primitiveManager.stompSubscriptions)), _g = _f.next(); !_g.done; _g = _f.next()) {
209
+ var stompSubscription = _g.value;
210
+ stompSubscription.unsubscribe();
211
+ }
212
+ }
213
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
214
+ finally {
215
+ try {
216
+ if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
217
+ }
218
+ finally { if (e_4) throw e_4.error; }
219
+ }
196
220
  }
197
221
  }
198
222
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
199
223
  finally {
200
224
  try {
201
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
225
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
202
226
  }
203
227
  finally { if (e_3) throw e_3.error; }
204
228
  }
205
- if (observersCount === 0) {
206
- this.stompSubscriptions.forEach(function (stompSubscription) {
207
- stompSubscription.unsubscribe();
208
- });
209
- try {
210
- for (var _e = __values(this.primitiveManagers.values()), _f = _e.next(); !_f.done; _f = _e.next()) {
211
- var primitiveManager = _f.value;
212
- primitiveManager.subject.complete();
213
- }
229
+ try {
230
+ for (var _h = __values(this.primitiveManagers.values()), _j = _h.next(); !_j.done; _j = _h.next()) {
231
+ var primitiveManager = _j.value;
232
+ primitiveManager.subject.complete();
214
233
  }
215
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
216
- finally {
217
- try {
218
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
219
- }
220
- finally { if (e_4) throw e_4.error; }
234
+ }
235
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
236
+ finally {
237
+ try {
238
+ if (_j && !_j.done && (_c = _h.return)) _c.call(_h);
221
239
  }
222
- this.stompSubscriptions.clear();
223
- this.primitiveManagers.clear();
224
- this._stompClient.disconnect();
225
- this._stompClient.deactivate();
226
- this.setConnected(false);
227
- this.isConnecting = false;
228
- this.disconnectSubject.next();
240
+ finally { if (e_5) throw e_5.error; }
229
241
  }
242
+ this.primitiveManagers.clear();
243
+ this._stompClient.disconnect();
244
+ this._stompClient.deactivate();
245
+ this.setConnected(false);
246
+ this.isConnecting = false;
247
+ this.disconnect$.next();
230
248
  };
231
249
  WebsocketService.prototype.isConnected = function () {
232
250
  return this.connected;
@@ -234,56 +252,124 @@ var WebsocketService = /** @class */ (function () {
234
252
  WebsocketService.prototype.setConnected = function (connected) {
235
253
  this.connected = connected;
236
254
  };
237
- WebsocketService.prototype.getSubscriptionUserUrl = function (domain, service, primitive) {
255
+ WebsocketService.prototype.getSubscriptionUrlWithToken = function (domain, service, primitive) {
238
256
  var tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
239
257
  var token = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.access_token : null;
240
258
  return "/topic/" + tenant + "/" + token + "/" + domain + "/" + service + "/" + primitive;
241
259
  };
260
+ WebsocketService.prototype.getSubscriptionUrlWithoutToken = function (domain, service, primitive) {
261
+ var tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
262
+ return "/topic/" + tenant + "/" + domain + "/" + service + "/" + primitive;
263
+ };
264
+ WebsocketService.prototype.createStompSubscription = function (destination, primitiveManager) {
265
+ var _this = this;
266
+ return this._stompClient.subscribe(destination, function (message) {
267
+ var event = JSON.parse(message.body || "{}");
268
+ _this.addPublishedEvent(primitiveManager, event);
269
+ primitiveManager.subject.next(event);
270
+ });
271
+ };
242
272
  WebsocketService.prototype.createStompClient = function () {
243
273
  var ws = new SockJS(WebsocketService_1.WEBSOCKET_URL + "subscription", null, { timeout: WebsocketService_1.CONNECTION_TIMEOUT });
244
274
  this._stompClient = Stomp.over(ws);
275
+ // this._stompClient.debug = (str) => console.log(new Date().toISOString(), str);
245
276
  this._stompClient.debug = function () { }; // Para remover os logs.
246
277
  };
247
- WebsocketService.prototype.getBaseUrl = function () {
248
- return this.cookieService.get("com.senior.base.url");
249
- };
250
- WebsocketService.prototype.getUserName = function () {
251
- var token = this.cookieService.get("com.senior.token");
252
- return token && JSON.parse(token).username;
253
- };
254
- WebsocketService.prototype.reconnectWebSocket = function () {
278
+ WebsocketService.prototype.reconnect = function () {
255
279
  var _this = this;
256
- this._stompClient.disconnect();
257
- var baseUrl = this.getBaseUrl();
258
- if (this.baseUrl !== null && baseUrl != this.baseUrl) {
259
- // //console.log('ws disconnected: base url changed', this.baseUrl, ' -> ', baseUrl || 'null');
260
- return;
261
- }
262
- var username = this.getUserName();
263
- if (this.username !== null && username != this.username) {
264
- // //console.log('ws disconnected: username changed', this.username, ' -> ', username || 'null');
265
- return;
266
- }
280
+ if (this.connected)
281
+ this._stompClient.disconnect();
267
282
  setTimeout(function () {
283
+ if (_this.getObserversCount() === 0)
284
+ return;
268
285
  if (_this.focused) {
269
286
  _this.connect();
270
287
  }
271
288
  else {
272
- _this.reconnectWebSocket();
289
+ _this.reconnect();
273
290
  }
274
291
  }, WebsocketService_1.RECONNECT_TIMER);
275
292
  };
293
+ WebsocketService.prototype.reconnectPrimitives = function () {
294
+ var e_6, _a, e_7, _b;
295
+ try {
296
+ for (var _c = __values(this.primitiveManagers.values()), _d = _c.next(); !_d.done; _d = _c.next()) {
297
+ var primitiveManager = _d.value;
298
+ try {
299
+ for (var _e = (e_7 = void 0, __values(primitiveManager.stompSubscriptions)), _f = _e.next(); !_f.done; _f = _e.next()) {
300
+ var stompSubscription = _f.value;
301
+ stompSubscription.unsubscribe();
302
+ }
303
+ }
304
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
305
+ finally {
306
+ try {
307
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
308
+ }
309
+ finally { if (e_7) throw e_7.error; }
310
+ }
311
+ this.createStompSubscriptions(primitiveManager);
312
+ }
313
+ }
314
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
315
+ finally {
316
+ try {
317
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
318
+ }
319
+ finally { if (e_6) throw e_6.error; }
320
+ }
321
+ };
322
+ WebsocketService.prototype.getObserversCount = function () {
323
+ var e_8, _a;
324
+ var observersCount = 0;
325
+ try {
326
+ for (var _b = __values(this.primitiveManagers.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
327
+ var primitiveManager = _c.value;
328
+ observersCount += primitiveManager.subject.observers.length;
329
+ }
330
+ }
331
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
332
+ finally {
333
+ try {
334
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
335
+ }
336
+ finally { if (e_8) throw e_8.error; }
337
+ }
338
+ return observersCount;
339
+ };
340
+ WebsocketService.prototype.disconnectPrimitiveOnFinalize = function (primitive) {
341
+ var e_9, _a;
342
+ var primitiveManager = this.primitiveManagers.get(primitive);
343
+ if (!primitiveManager)
344
+ return;
345
+ // @IMPORTANT: Replace .observers.length with .observed in rxjs 7.0+
346
+ var hasObservers = !(primitiveManager.subject.observers.length === 1);
347
+ if (hasObservers)
348
+ return;
349
+ try {
350
+ for (var _b = __values(primitiveManager.stompSubscriptions), _c = _b.next(); !_c.done; _c = _b.next()) {
351
+ var stompSubscription = _c.value;
352
+ stompSubscription.unsubscribe();
353
+ }
354
+ }
355
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
356
+ finally {
357
+ try {
358
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
359
+ }
360
+ finally { if (e_9) throw e_9.error; }
361
+ }
362
+ this.primitiveManagers.delete(primitive);
363
+ this.disconnect();
364
+ };
276
365
  var WebsocketService_1;
277
366
  WebsocketService.RECONNECT_TIMER = 3000;
278
- WebsocketService.CONNECTION_TIMEOUT = 30000;
367
+ WebsocketService.CONNECTION_TIMEOUT = 15000;
279
368
  WebsocketService.BASE_URL_COOKIE = "com.senior.base.url";
280
369
  WebsocketService.TOKEN_COOKIE = "com.senior.token";
281
370
  WebsocketService.TOKEN = JSON.parse(Cookies.get(WebsocketService_1.TOKEN_COOKIE) || "{}");
282
371
  WebsocketService.WEBSOCKET_URL = Cookies.get(WebsocketService_1.BASE_URL_COOKIE) + "/websocket/";
283
- WebsocketService.ctorParameters = function () { return [
284
- { type: CookieService }
285
- ]; };
286
- WebsocketService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WebsocketService_Factory() { return new WebsocketService(i0.ɵɵinject(i1.CookieService)); }, token: WebsocketService, providedIn: "root" });
372
+ WebsocketService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WebsocketService_Factory() { return new WebsocketService(); }, token: WebsocketService, providedIn: "root" });
287
373
  WebsocketService = WebsocketService_1 = __decorate([
288
374
  Injectable({
289
375
  providedIn: "root",
@@ -292,4 +378,4 @@ var WebsocketService = /** @class */ (function () {
292
378
  return WebsocketService;
293
379
  }());
294
380
  export { WebsocketService };
295
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7OztBQVd4QztJQXlCSSwwQkFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqQnhDLFlBQU8sR0FBVyxJQUFJLENBQUM7UUFDdkIsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR2YsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQix1QkFBa0IsR0FBbUMsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFFbEcsMEZBQTBGO1FBQ2xGLHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUV2RixzQkFBaUIsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUV2RCxhQUFRLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFHbEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcs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RSxDQUFDO2FBQzdCO1FBQ0wsQ0FBQyxFQUFFLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0lBaFNjLGdDQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLG1DQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixnQ0FBZSxHQUFHLHFCQUFxQixDQUFDO0lBQ3hDLDZCQUFZLEdBQUcsa0JBQWtCLENBQUM7SUFDbEMsc0JBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDdkUsOEJBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs7Z0JBbUIxRCxhQUFhOzs7SUF6QnZDLGdCQUFnQjtRQUg1QixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csZ0JBQWdCLENBa1M1QjsyQkFuVEQ7Q0FtVEMsQUFsU0QsSUFrU0M7U0FsU1ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbXBhdENsaWVudCwgU3RvbXAsIFN0b21wU3Vic2NyaXB0aW9uIH0gZnJvbSBcIkBzdG9tcC9zdG9tcGpzXCI7XHJcbmltcG9ydCAqIGFzIENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWUtc2VydmljZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSBcInNvY2tqcy1jbGllbnRcIjtcclxuXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDMwMDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgZm9jdXNlZCA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3RvbXBTdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBTdG9tcFN1YnNjcmlwdGlvbj4gPSBuZXcgTWFwPHN0cmluZywgU3RvbXBTdWJzY3JpcHRpb24+KCk7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBwcmltaXRpdmVTdWJqZWN0czogTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBTdWJqZWN0PGFueT4+KCk7XHJcbiAgICBwcml2YXRlIHByaW1pdGl2ZU1hbmFnZXJzOiBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPiA9IG5ldyBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPigpO1xyXG5cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdFN1YmplY3Q6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29va2llU2VydmljZTogQ29va2llU2VydmljZSkge1xyXG4gICAgICAgIHdpbmRvdy5vbmZvY3VzID0gdGhpcy5vbkZvY3VzO1xyXG4gICAgICAgIHdpbmRvdy5vbmJsdXIgPSB0aGlzLm9uQmx1cjtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3Bvc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYS5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhIG91IGrDoSBlc3TDoSBlbSBhbmRhbWVudG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb3PDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGZpbmFsaXphZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZmluYWxpemFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIHVtIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gb2JqZXRvIHF1ZSBvIHJldG9ybm8gZG8gYG9ic2VydmFibGVgIHZhaSBkZXZvbHZlci5cclxuICAgICAqIEBwYXJhbSBkb21haW4gRG9taW5pbyBkYSBwcmltaXR2YS5cclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHByaW1pdGl2ZSBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIgcGVsbyBjbGllbnQuXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclBhdGggQ2FtaW5obyBhdMOpIGEgcHJvcHJpZWRhZGUgY29uc2lkZXJhZGEgbyBpbmRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBsZXQgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmIChwcmltaXRpdmVNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyID0ge1xyXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyUGF0aDogaWRlbnRpZmllclBhdGgsXHJcbiAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50czogW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uID0gdGhpcy5fc3RvbXBDbGllbnQuc3Vic2NyaWJlKHVybCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5uZXh0KGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdCgpXHJcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25Vc2VyVXJsKGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gPSB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUodXJsLCAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBUID0gSlNPTi5wYXJzZShtZXNzYWdlLmJvZHkgfHwgXCJ7fVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm5leHQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0b2RvcyBvcyBldmVudG9zIG91dmlkb3MgcGFyYSBhIHJlc3BlY3RpdmEgcHJpbWl0aXZhLlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIGV2ZW50byByZXRvcm5hZG8gcGVsYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0gcHJpbWl0aXZlIFByaW1pdGl2YSBxdWUgc2Vyw6EgXCJvYnNlcnZhZGFcIiBwZWxvIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVycyBBcnJheSBjb20gb3MgaW5kZW50aWZpY2Fkb3JlcyBpbnRlcmVzc2Fkb3MuXHJcbiAgICAgKiBAcmV0dXJuIEFycmF5IGNvbnRlbmRvIG8gw7psdGltbyBldmVudG8gcmVjZWJpZG8gZGUgY2FkYSBpZGVudGlmaWNhZG9yIGZvcm5lY2lkby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFB1Ymxpc2hlZEV2ZW50czxUPihwcmltaXRpdmU6IHN0cmluZywgaWRlbnRpZmllcnM6IHN0cmluZ1tdKTogVFtdIHtcclxuICAgICAgICBjb25zdCBwdWJsaXNoZWRFdmVudHM6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBwcmltaXRpdmVNYW5hZ2VyID0gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQocHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZChcclxuICAgICAgICAgICAgICAgIHggPT4gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlZEV2ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFB1Ymxpc2hlZEV2ZW50KHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIsIGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgeCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzW2V2ZW50SW5kZXhdID0geyAuLi5wcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSwgLi4uZXZlbnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJZGVudGlmaWVyRnJvbUV2ZW50KGlkZW50aWZpZXJQYXRoOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBpZGVudGlmaWVyUGF0aC5zcGxpdChcIi5cIik7XHJcblxyXG4gICAgICAgIGxldCBpZGVudGlmaWVyID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xyXG4gICAgICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllcltwcm9wZXJ0eV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9tcENsaWVudCgpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXRvdSBmYWxzZSBpc0Nvbm5lY3RpbmcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Nvbm5lY3RvdSBkZW50cm8gZG8gY29ubmVjdCBjYicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnJlY29ubmVjdFdlYlNvY2tldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHB1Ymxpc2hPbkNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5vYnNlcnZlcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmx1cigpIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvYnNlcnZlcnNDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN0b21wU3Vic2NyaXB0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdFN1YmplY3QubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENvbm5lY3RlZChjb25uZWN0ZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdChcIkBcIilbMV0gOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4uYWNjZXNzX3Rva2VuIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7dG9rZW59LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llU2VydmljZS5nZXQoXCJjb20uc2VuaW9yLmJhc2UudXJsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiY29tLnNlbmlvci50b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gdG9rZW4gJiYgSlNPTi5wYXJzZSh0b2tlbikudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RXZWJTb2NrZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPT0gbnVsbCAmJiBiYXNlVXJsICE9IHRoaXMuYmFzZVVybCkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IGJhc2UgdXJsIGNoYW5nZWQnLCB0aGlzLmJhc2VVcmwsICcgLT4gJywgYmFzZVVybCB8fCAnbnVsbCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlck5hbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgIT09IG51bGwgJiYgdXNlcm5hbWUgIT0gdGhpcy51c2VybmFtZSkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IHVzZXJuYW1lIGNoYW5nZWQnLCB0aGlzLnVzZXJuYW1lLCAnIC0+ICcsIHVzZXJuYW1lIHx8ICdudWxsJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0V2ViU29ja2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBXZWJzb2NrZXRTZXJ2aWNlLlJFQ09OTkVDVF9USU1FUik7XHJcbiAgICB9XHJcbn1cclxuIl19
381
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQTJCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7O0FBZXhDO0lBNEJJO1FBcEJRLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFJZixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUV2RixhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUUvQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFbEMsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFakMsV0FBTSxHQUFHLElBQUksT0FBTyxFQUFhLENBQUM7UUFHdEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUU1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQzt5QkFqQ1EsZ0JBQWdCO0lBbUN6Qjs7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Q0FBQztPQUNXLGdCQUFnQixDQTZWNUI7MkJBalhEO0NBaVhDLEFBN1ZELElBNlZDO1NBN1ZZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDb21wYXRDbGllbnQsIEZyYW1lSW1wbCwgU3RvbXAsIFN0b21wU3Vic2NyaXB0aW9uIH0gZnJvbSBcIkBzdG9tcC9zdG9tcGpzXCI7XHJcbmltcG9ydCAqIGFzIENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgZmlyc3QsIGZpbmFsaXplIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCAqIGFzIFNvY2tKUyBmcm9tIFwic29ja2pzLWNsaWVudFwiO1xyXG5cclxuaW50ZXJmYWNlIFByaW1pdGl2ZU1hbmFnZXIge1xyXG4gICAgZG9tYWluOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgICBwcmltaXRpdmU6IHN0cmluZztcclxuICAgIHN0b21wU3Vic2NyaXB0aW9uczogU3RvbXBTdWJzY3JpcHRpb25bXTtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDE1MDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c2VkID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgd2FzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgcHJpbWl0aXZlTWFuYWdlcnM6IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI+ID0gbmV3IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBwcml2YXRlIGVycm9yJCA9IG5ldyBTdWJqZWN0PEZyYW1lSW1wbD4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB3aW5kb3cub25mb2N1cyA9IHRoaXMub25Gb2N1cztcclxuICAgICAgICB3aW5kb3cub25ibHVyID0gdGhpcy5vbkJsdXI7XHJcblxyXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyDDqSBkZXNjb25lY3RhZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZGVzY29uZWN0YWRhLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25EaXNjb25uZWN0KCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRpc2Nvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyDDqSByZWNvbmVjdGFkYS5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyDDqSByZWNvbmVjdGFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uUmVjb25uZWN0KCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlY29ubmVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBvY29ycmUgYWxndW0gZXJyby5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8RnJhbWVJbXBsPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBvY29ycmUgYWxndW0gZXJyby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXJyb3IoKTogT2JzZXJ2YWJsZTxGcmFtZUltcGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvciQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyB1bSBldmVudG8gw6kgcHVibGljYWRvLlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIG9iamV0byBxdWUgbyByZXRvcm5vIGRvIGBvYnNlcnZhYmxlYCB2YWkgZGV2b2x2ZXIuXHJcbiAgICAgKiBAcGFyYW0gZG9tYWluIERvbWluaW8gZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHNlcnZpY2UgU2VydmljZSBkYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0gcHJpbWl0aXZlIFByaW1pdGl2YSBxdWUgc2Vyw6EgXCJvYnNlcnZhZGFcIiBwZWxvIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyUGF0aCBDYW1pbmhvIGF0w6kgYSBwcm9wcmllZGFkZSBjb25zaWRlcmFkYSBvIGlkZW50aWZpY2Fkb3IgZG8gcmVnaXN0cm8uXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBvYnNlcnZhYmxlYCBxdWUgZW1pdGUgbm90aWZpY2HDp8O1ZXMgdG9kYSB2ZXogcXVlIG8gcmVzcGVjdGl2byBldmVudG8gw6kgcHVibGljYWRvIG5vIHNpc3RlbWEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkV2ZW50PFQ+KGRvbWFpbjogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcsIHByaW1pdGl2ZTogc3RyaW5nLCBpZGVudGlmaWVyUGF0aDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKHByaW1pdGl2ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSkuc3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIgPSB7XHJcbiAgICAgICAgICAgIGRvbWFpbjogZG9tYWluLFxyXG4gICAgICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmU6IHByaW1pdGl2ZSxcclxuICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb25zOiBbXSxcclxuICAgICAgICAgICAgc3ViamVjdDogbmV3IFN1YmplY3Q8VD4oKSxcclxuICAgICAgICAgICAgaWRlbnRpZmllclBhdGg6IGlkZW50aWZpZXJQYXRoLFxyXG4gICAgICAgICAgICBwdWJsaXNoZWRFdmVudHM6IFtdLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuc2V0KHByaW1pdGl2ZSwgcHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5kaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmUpKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGluZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdCQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMuZGlzY29ubmVjdFByaW1pdGl2ZU9uRmluYWxpemUocHJpbWl0aXZlKSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgdG9kb3Mgb3MgZXZlbnRvcyBvdXZpZG9zIHBlbGEgcHJpbWl0aXZhIGNvbSBvcyByZXNwZWN0aXZvcyBpZGVudGlmaWNhZG9yZXMuXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gZXZlbnRvIHJldG9ybmFkbyBwZWxhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSBwcmltaXRpdmUgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiIHBlbG8gY2xpZW50LlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXJzIEFycmF5IGNvbSBvcyBpZGVudGlmaWNhZG9yZXMgaW50ZXJlc3NhZG9zLlxyXG4gICAgICogQHJldHVybiBBcnJheSBjb250ZW5kbyBvIMO6bHRpbW8gZXZlbnRvIHJlY2ViaWRvIGRlIGNhZGEgaWRlbnRpZmljYWRvciBmb3JuZWNpZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQdWJsaXNoZWRFdmVudHM8VD4ocHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJzOiBzdHJpbmdbXSk6IFRbXSB7XHJcbiAgICAgICAgY29uc3QgcHVibGlzaGVkRXZlbnRzOiBUW10gPSBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiBpZGVudGlmaWVycykge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICB4ID0+IHRoaXMuZ2V0SWRlbnRpZmllckZyb21FdmVudChwcmltaXRpdmVNYW5hZ2VyLmlkZW50aWZpZXJQYXRoLCB4KSA9PT0gaWRlbnRpZmllclxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBwdWJsaXNoZWRFdmVudHMucHVzaChldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwdWJsaXNoZWRFdmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRQdWJsaXNoZWRFdmVudChwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyLCBldmVudDogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0SWRlbnRpZmllckZyb21FdmVudChwcmltaXRpdmVNYW5hZ2VyLmlkZW50aWZpZXJQYXRoLCBldmVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgIHggPT4gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzW2V2ZW50SW5kZXhdID0geyAuLi5wcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSwgLi4uZXZlbnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdpdGhUb2tlblVybCA9IHRoaXMuZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuID0gdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbih3aXRoVG9rZW5VcmwsIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB3aXRob3V0VG9rZW5VcmwgPSB0aGlzLmdldFN1YnNjcmlwdGlvblVybFdpdGhvdXRUb2tlbihcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5kb21haW4sXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc2VydmljZSxcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24od2l0aG91dFRva2VuVXJsLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdG9tcFN1YnNjcmlwdGlvbnMgPSBbc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4sIHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldElkZW50aWZpZXJGcm9tRXZlbnQoaWRlbnRpZmllclBhdGg6IHN0cmluZywgZXZlbnQ6IGFueSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGlkZW50aWZpZXJQYXRoLnNwbGl0KFwiLlwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlkZW50aWZpZXIgPSBldmVudDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyW3Byb3BlcnR5XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpZGVudGlmaWVyO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVN0b21wQ2xpZW50KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuY29ubmVjdChcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2FzQ29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RQcmltaXRpdmVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FzQ29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hPbkNvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycm9yOiBGcmFtZUltcGwpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdGVkKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yJC5uZXh0KGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHB1Ymxpc2hPbkNvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5vYnNlcnZlcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmx1cigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBvYnNlcnZlcnNDb3VudCA9IHRoaXMuZ2V0T2JzZXJ2ZXJzQ291bnQoKTtcclxuXHJcbiAgICAgICAgaWYgKG9ic2VydmVyc0NvdW50ID4gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uIG9mIHByaW1pdGl2ZU1hbmFnZXIuc3RvbXBTdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q29ubmVjdGVkKGNvbm5lY3RlZDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gY29ubmVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKGRvbWFpbjogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcsIHByaW1pdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdChcIkBcIilbMV0gOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4uYWNjZXNzX3Rva2VuIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7dG9rZW59LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4gPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLnVzZXJuYW1lLnNwbGl0KFwiQFwiKVsxXSA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBgL3RvcGljLyR7dGVuYW50fS8ke2RvbWFpbn0vJHtzZXJ2aWNlfS8ke3ByaW1pdGl2ZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24oZGVzdGluYXRpb246IHN0cmluZywgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcik6IFN0b21wU3Vic2NyaXB0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RvbXBDbGllbnQuc3Vic2NyaWJlKGRlc3RpbmF0aW9uLCAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShtZXNzYWdlLmJvZHkgfHwgXCJ7fVwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm5leHQoZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBDbGllbnQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgd3MgPSBuZXcgU29ja0pTKGAke1dlYnNvY2tldFNlcnZpY2UuV0VCU09DS0VUX1VSTH1zdWJzY3JpcHRpb25gLCBudWxsLCB7IHRpbWVvdXQ6IFdlYnNvY2tldFNlcnZpY2UuQ09OTkVDVElPTl9USU1FT1VUIH0pO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50ID0gU3RvbXAub3Zlcih3cyk7XHJcbiAgICAgICAgLy8gdGhpcy5fc3RvbXBDbGllbnQuZGVidWcgPSAoc3RyKSA9PiBjb25zb2xlLmxvZyhuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIHN0cik7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGVidWcgPSAoKSA9PiB7fTsgLy8gUGFyYSByZW1vdmVyIG9zIGxvZ3MuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPYnNlcnZlcnNDb3VudCgpID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBXZWJzb2NrZXRTZXJ2aWNlLlJFQ09OTkVDVF9USU1FUik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RQcmltaXRpdmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gb2YgcHJpbWl0aXZlTWFuYWdlci5zdG9tcFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE9ic2VydmVyc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IG9ic2VydmVyc0NvdW50ID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXJzQ291bnQgKz0gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm9ic2VydmVycy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2JzZXJ2ZXJzQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgPSB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBpZiAoIXByaW1pdGl2ZU1hbmFnZXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gQElNUE9SVEFOVDogUmVwbGFjZSAub2JzZXJ2ZXJzLmxlbmd0aCB3aXRoIC5vYnNlcnZlZCBpbiByeGpzIDcuMCtcclxuICAgICAgICBjb25zdCBoYXNPYnNlcnZlcnMgPSAhKHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5vYnNlcnZlcnMubGVuZ3RoID09PSAxKTtcclxuXHJcbiAgICAgICAgaWYgKGhhc09ic2VydmVycykgcmV0dXJuO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uIG9mIHByaW1pdGl2ZU1hbmFnZXIuc3RvbXBTdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmRlbGV0ZShwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxufVxyXG4iXX0=