@senior-gestao-empresarial/angular-components 4.22.0 → 4.22.2-7c0b6b2c-1273-4faf-bd8a-91d677cec9bd

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,105 +2,103 @@ 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;
35
31
  setTimeout(function () {
36
32
  if (_this.isConnected()) {
37
- _this.publishOnConnect();
33
+ _this.connect$.next();
38
34
  }
39
35
  }, 0);
40
- return this.connect$.asObservable();
36
+ return this.connect$.pipe(first());
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,21 +168,24 @@ 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.connect$.next();
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
- WebsocketService.prototype.publishOnConnect = function () {
180
- this.connect$.next();
181
- this.connect$.observers = [];
182
- };
183
189
  WebsocketService.prototype.onFocus = function () {
184
190
  this.focused = true;
185
191
  };
@@ -187,46 +193,55 @@ var WebsocketService = /** @class */ (function () {
187
193
  this.focused = false;
188
194
  };
189
195
  WebsocketService.prototype.disconnect = function () {
190
- var e_3, _a, e_4, _b;
191
- var observersCount = 0;
196
+ var e_3, _a, e_4, _b, e_5, _c;
197
+ var observersCount = this.getObserversCount();
198
+ if (observersCount > 0)
199
+ return;
192
200
  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;
201
+ for (var _d = __values(this.primitiveManagers.values()), _e = _d.next(); !_e.done; _e = _d.next()) {
202
+ var primitiveManager = _e.value;
203
+ try {
204
+ for (var _f = (e_4 = void 0, __values(primitiveManager.stompSubscriptions)), _g = _f.next(); !_g.done; _g = _f.next()) {
205
+ var stompSubscription = _g.value;
206
+ stompSubscription.unsubscribe();
207
+ }
208
+ }
209
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
210
+ finally {
211
+ try {
212
+ if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
213
+ }
214
+ finally { if (e_4) throw e_4.error; }
215
+ }
196
216
  }
197
217
  }
198
218
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
199
219
  finally {
200
220
  try {
201
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
221
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
202
222
  }
203
223
  finally { if (e_3) throw e_3.error; }
204
224
  }
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
- }
225
+ try {
226
+ for (var _h = __values(this.primitiveManagers.values()), _j = _h.next(); !_j.done; _j = _h.next()) {
227
+ var primitiveManager = _j.value;
228
+ primitiveManager.subject.complete();
214
229
  }
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; }
230
+ }
231
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
232
+ finally {
233
+ try {
234
+ if (_j && !_j.done && (_c = _h.return)) _c.call(_h);
221
235
  }
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();
236
+ finally { if (e_5) throw e_5.error; }
229
237
  }
238
+ this.primitiveManagers.clear();
239
+ this._stompClient.disconnect();
240
+ this._stompClient.deactivate();
241
+ this.setConnected(false);
242
+ this.isConnecting = false;
243
+ this.wasConnected = false;
244
+ this.disconnect$.next();
230
245
  };
231
246
  WebsocketService.prototype.isConnected = function () {
232
247
  return this.connected;
@@ -234,56 +249,124 @@ var WebsocketService = /** @class */ (function () {
234
249
  WebsocketService.prototype.setConnected = function (connected) {
235
250
  this.connected = connected;
236
251
  };
237
- WebsocketService.prototype.getSubscriptionUserUrl = function (domain, service, primitive) {
252
+ WebsocketService.prototype.getSubscriptionUrlWithToken = function (domain, service, primitive) {
238
253
  var tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
239
254
  var token = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.access_token : null;
240
255
  return "/topic/" + tenant + "/" + token + "/" + domain + "/" + service + "/" + primitive;
241
256
  };
257
+ WebsocketService.prototype.getSubscriptionUrlWithoutToken = function (domain, service, primitive) {
258
+ var tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
259
+ return "/topic/" + tenant + "/" + domain + "/" + service + "/" + primitive;
260
+ };
261
+ WebsocketService.prototype.createStompSubscription = function (destination, primitiveManager) {
262
+ var _this = this;
263
+ return this._stompClient.subscribe(destination, function (message) {
264
+ var event = JSON.parse(message.body || "{}");
265
+ _this.addPublishedEvent(primitiveManager, event);
266
+ primitiveManager.subject.next(event);
267
+ });
268
+ };
242
269
  WebsocketService.prototype.createStompClient = function () {
243
270
  var ws = new SockJS(WebsocketService_1.WEBSOCKET_URL + "subscription", null, { timeout: WebsocketService_1.CONNECTION_TIMEOUT });
244
271
  this._stompClient = Stomp.over(ws);
272
+ // this._stompClient.debug = (str) => console.log(new Date().toISOString(), str);
245
273
  this._stompClient.debug = function () { }; // Para remover os logs.
246
274
  };
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 () {
275
+ WebsocketService.prototype.reconnect = function () {
255
276
  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
- }
277
+ if (this.connected)
278
+ this._stompClient.disconnect();
267
279
  setTimeout(function () {
280
+ if (_this.getObserversCount() === 0)
281
+ return;
268
282
  if (_this.focused) {
269
283
  _this.connect();
270
284
  }
271
285
  else {
272
- _this.reconnectWebSocket();
286
+ _this.reconnect();
273
287
  }
274
288
  }, WebsocketService_1.RECONNECT_TIMER);
275
289
  };
290
+ WebsocketService.prototype.reconnectPrimitives = function () {
291
+ var e_6, _a, e_7, _b;
292
+ try {
293
+ for (var _c = __values(this.primitiveManagers.values()), _d = _c.next(); !_d.done; _d = _c.next()) {
294
+ var primitiveManager = _d.value;
295
+ try {
296
+ for (var _e = (e_7 = void 0, __values(primitiveManager.stompSubscriptions)), _f = _e.next(); !_f.done; _f = _e.next()) {
297
+ var stompSubscription = _f.value;
298
+ stompSubscription.unsubscribe();
299
+ }
300
+ }
301
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
302
+ finally {
303
+ try {
304
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
305
+ }
306
+ finally { if (e_7) throw e_7.error; }
307
+ }
308
+ this.createStompSubscriptions(primitiveManager);
309
+ }
310
+ }
311
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
312
+ finally {
313
+ try {
314
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
315
+ }
316
+ finally { if (e_6) throw e_6.error; }
317
+ }
318
+ };
319
+ WebsocketService.prototype.getObserversCount = function () {
320
+ var e_8, _a;
321
+ var observersCount = 0;
322
+ try {
323
+ for (var _b = __values(this.primitiveManagers.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
324
+ var primitiveManager = _c.value;
325
+ observersCount += primitiveManager.subject.observers.length;
326
+ }
327
+ }
328
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
329
+ finally {
330
+ try {
331
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
332
+ }
333
+ finally { if (e_8) throw e_8.error; }
334
+ }
335
+ return observersCount;
336
+ };
337
+ WebsocketService.prototype.disconnectPrimitiveOnFinalize = function (primitive) {
338
+ var e_9, _a;
339
+ var primitiveManager = this.primitiveManagers.get(primitive);
340
+ if (!primitiveManager)
341
+ return;
342
+ // @IMPORTANT: Replace .observers.length with .observed in rxjs 7.0+
343
+ var hasObservers = !(primitiveManager.subject.observers.length === 1);
344
+ if (hasObservers)
345
+ return;
346
+ try {
347
+ for (var _b = __values(primitiveManager.stompSubscriptions), _c = _b.next(); !_c.done; _c = _b.next()) {
348
+ var stompSubscription = _c.value;
349
+ stompSubscription.unsubscribe();
350
+ }
351
+ }
352
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
353
+ finally {
354
+ try {
355
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
356
+ }
357
+ finally { if (e_9) throw e_9.error; }
358
+ }
359
+ this.primitiveManagers.delete(primitive);
360
+ this.disconnect();
361
+ };
276
362
  var WebsocketService_1;
277
363
  WebsocketService.RECONNECT_TIMER = 3000;
278
- WebsocketService.CONNECTION_TIMEOUT = 30000;
364
+ WebsocketService.CONNECTION_TIMEOUT = 15000;
279
365
  WebsocketService.BASE_URL_COOKIE = "com.senior.base.url";
280
366
  WebsocketService.TOKEN_COOKIE = "com.senior.token";
281
367
  WebsocketService.TOKEN = JSON.parse(Cookies.get(WebsocketService_1.TOKEN_COOKIE) || "{}");
282
368
  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" });
369
+ WebsocketService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WebsocketService_Factory() { return new WebsocketService(); }, token: WebsocketService, providedIn: "root" });
287
370
  WebsocketService = WebsocketService_1 = __decorate([
288
371
  Injectable({
289
372
  providedIn: "root",
@@ -292,4 +375,4 @@ var WebsocketService = /** @class */ (function () {
292
375
  return WebsocketService;
293
376
  }());
294
377
  export { WebsocketService };
295
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7OztBQVd4QztJQXlCSSwwQkFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqQnhDLFlBQU8sR0FBVyxJQUFJLENBQUM7UUFDdkIsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR2YsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQix1QkFBa0IsR0FBbUMsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFFbEcsMEZBQTBGO1FBQ2xGLHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUV2RixzQkFBaUIsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUV2RCxhQUFRLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFHbEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUU1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQzt5QkE5QlEsZ0JBQWdCO0lBZ0N6Qjs7O09BR0c7SUFDSSxvQ0FBUyxHQUFoQjtRQUFBLGlCQVFDO1FBUEcsVUFBVSxDQUFDO1lBQ1AsSUFBSSxLQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ3BCLEtBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2FBQzNCO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRU4sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSx1Q0FBWSxHQUFuQjtRQUNJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLGtDQUFPLEdBQWQsVUFBa0IsTUFBYyxFQUFFLE9BQWUsRUFBRSxTQUFpQixFQUFFLGNBQXNCO1FBQTVGLGlCQXNEQztRQXJERyxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUNsQixPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNsRDtRQUVELGdCQUFnQixHQUFHO1lBQ2YsT0FBTyxFQUFFLElBQUksT0FBTyxFQUFFO1lBQ3RCLGNBQWMsRUFBRSxjQUFjO1lBQzlCLGVBQWUsRUFBRSxFQUFFO1NBQ3RCLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNwQixJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVwRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXhELElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQUMsT0FBWTtnQkFDcEUsSUFBTSxLQUFLLEdBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUVsRCxLQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRWhELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRTFELE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ2xEO2FBQU07WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2xCO1lBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRTtpQkFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLFNBQVMsQ0FBQztnQkFDUCxJQUFNLEdBQUcsR0FBRyxLQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFcEUsS0FBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFFeEQsSUFBTSxpQkFBaUIsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBQyxPQUFZO29CQUNwRSxJQUFNLEtBQUssR0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7b0JBRWxELEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFFaEQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztZQUVQLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ2xEO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDZDQUFrQixHQUF6QixVQUE2QixTQUFpQixFQUFFLFdBQXFCOztRQUFyRSxpQkFnQkM7UUFmRyxJQUFNLGVBQWUsR0FBUSxFQUFFLENBQUM7UUFFaEMsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dDQUVwRCxVQUFVO1lBQ2pCLElBQU0sT0FBSyxHQUFHLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQy9DLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQTlFLENBQThFLENBQ3RGLENBQUM7WUFFRixJQUFJLE9BQUssRUFBRTtnQkFDUCxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQUssQ0FBQyxDQUFDO2FBQy9COzs7WUFQTCxLQUF5QixJQUFBLGdCQUFBLFNBQUEsV0FBVyxDQUFBLHdDQUFBO2dCQUEvQixJQUFNLFVBQVUsd0JBQUE7d0JBQVYsVUFBVTthQVFwQjs7Ozs7Ozs7O1FBRUQsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQztJQUVPLDRDQUFpQixHQUF6QixVQUEwQixnQkFBa0MsRUFBRSxLQUFVO1FBQXhFLGlCQWFDO1FBWkcsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2RixJQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUN6RCxVQUFBLENBQUM7WUFDRyxPQUFBLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLEtBQUssVUFBVTtRQUE5RSxDQUE4RSxDQUNyRixDQUFDO1FBRUYsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkIsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyx5QkFBUSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUssS0FBSyxDQUFFLENBQUM7U0FDaEg7YUFBTTtZQUNILGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEQ7SUFDTCxDQUFDO0lBRU8saURBQXNCLEdBQTlCLFVBQStCLGNBQXNCLEVBQUUsS0FBVTs7UUFDN0QsSUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU3QyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7O1lBRXZCLEtBQXVCLElBQUEsZUFBQSxTQUFBLFVBQVUsQ0FBQSxzQ0FBQSw4REFBRTtnQkFBOUIsSUFBTSxRQUFRLHVCQUFBO2dCQUNmLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDckM7Ozs7Ozs7OztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxrQ0FBTyxHQUFmO1FBQUEsaUJBcUJDO1FBcEJHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXpCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUNyQixFQUFFLEVBQ0Y7WUFDSSxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLDJDQUEyQztZQUUzQyxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixpREFBaUQ7WUFFakQsS0FBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxFQUNEO1lBQ0ksS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6Qiw2QkFBNkI7UUFDakMsQ0FBQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBRU8sMkNBQWdCLEdBQXhCO1FBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLGtDQUFPLEdBQWY7UUFDSSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRU8saUNBQU0sR0FBZDtRQUNJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFTSxxQ0FBVSxHQUFqQjs7UUFDSSxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7O1lBRXZCLEtBQStCLElBQUEsS0FBQSxTQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQSxnQkFBQSw0QkFBRTtnQkFBM0QsSUFBTSxnQkFBZ0IsV0FBQTtnQkFDdkIsY0FBYyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2FBQy9EOzs7Ozs7Ozs7UUFFRCxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxVQUFBLGlCQUFpQjtnQkFDN0MsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7O2dCQUVILEtBQStCLElBQUEsS0FBQSxTQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQSxnQkFBQSw0QkFBRTtvQkFBM0QsSUFBTSxnQkFBZ0IsV0FBQTtvQkFDdkIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUN2Qzs7Ozs7Ozs7O1lBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUvQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUUxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDakM7SUFDTCxDQUFDO0lBRU8sc0NBQVcsR0FBbkI7UUFDSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVPLHVDQUFZLEdBQXBCLFVBQXFCLFNBQWtCO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFTyxpREFBc0IsR0FBOUIsVUFBK0IsTUFBYyxFQUFFLE9BQWUsRUFBRSxTQUFpQjtRQUM3RSxJQUFNLE1BQU0sR0FBRyxrQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDN0YsSUFBTSxLQUFLLEdBQUcsa0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBZ0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFbEYsT0FBTyxZQUFVLE1BQU0sU0FBSSxLQUFLLFNBQUksTUFBTSxTQUFJLE9BQU8sU0FBSSxTQUFXLENBQUM7SUFDekUsQ0FBQztJQUVPLDRDQUFpQixHQUF6QjtRQUNJLElBQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUFJLGtCQUFnQixDQUFDLGFBQWEsaUJBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsa0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQy9ILElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxjQUFPLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtJQUNoRSxDQUFDO0lBRU8scUNBQVUsR0FBbEI7UUFDSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLHNDQUFXLEdBQW5CO1FBQ0ksSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN6RCxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMvQyxDQUFDO0lBRU8sNkNBQWtCLEdBQTFCO1FBQUEsaUJBdUJDO1FBdEJHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEQsK0ZBQStGO1lBQy9GLE9BQU87U0FDVjtRQUVELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JELGlHQUFpRztZQUNqRyxPQUFPO1NBQ1Y7UUFFRCxVQUFVLENBQUM7WUFDUCxJQUFJLEtBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2QsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2xCO2lCQUFNO2dCQUNILEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzdCO1FBQ0wsQ0FBQyxFQUFFLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0lBaFNjLGdDQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLG1DQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixnQ0FBZSxHQUFHLHFCQUFxQixDQUFDO0lBQ3hDLDZCQUFZLEdBQUcsa0JBQWtCLENBQUM7SUFDbEMsc0JBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDdkUsOEJBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs7Z0JBbUIxRCxhQUFhOzs7SUF6QnZDLGdCQUFnQjtRQUg1QixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csZ0JBQWdCLENBa1M1QjsyQkFuVEQ7Q0FtVEMsQUFsU0QsSUFrU0M7U0FsU1ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbXBhdENsaWVudCwgU3RvbXAsIFN0b21wU3Vic2NyaXB0aW9uIH0gZnJvbSBcIkBzdG9tcC9zdG9tcGpzXCI7XHJcbmltcG9ydCAqIGFzIENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWUtc2VydmljZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSBcInNvY2tqcy1jbGllbnRcIjtcclxuXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDMwMDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgZm9jdXNlZCA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3RvbXBTdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBTdG9tcFN1YnNjcmlwdGlvbj4gPSBuZXcgTWFwPHN0cmluZywgU3RvbXBTdWJzY3JpcHRpb24+KCk7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBwcmltaXRpdmVTdWJqZWN0czogTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBTdWJqZWN0PGFueT4+KCk7XHJcbiAgICBwcml2YXRlIHByaW1pdGl2ZU1hbmFnZXJzOiBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPiA9IG5ldyBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPigpO1xyXG5cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdFN1YmplY3Q6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29va2llU2VydmljZTogQ29va2llU2VydmljZSkge1xyXG4gICAgICAgIHdpbmRvdy5vbmZvY3VzID0gdGhpcy5vbkZvY3VzO1xyXG4gICAgICAgIHdpbmRvdy5vbmJsdXIgPSB0aGlzLm9uQmx1cjtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3Bvc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYS5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhIG91IGrDoSBlc3TDoSBlbSBhbmRhbWVudG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb3PDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGZpbmFsaXphZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZmluYWxpemFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIHVtIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gb2JqZXRvIHF1ZSBvIHJldG9ybm8gZG8gYG9ic2VydmFibGVgIHZhaSBkZXZvbHZlci5cclxuICAgICAqIEBwYXJhbSBkb21haW4gRG9taW5pbyBkYSBwcmltaXR2YS5cclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHByaW1pdGl2ZSBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIgcGVsbyBjbGllbnQuXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclBhdGggQ2FtaW5obyBhdMOpIGEgcHJvcHJpZWRhZGUgY29uc2lkZXJhZGEgbyBpbmRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBsZXQgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmIChwcmltaXRpdmVNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyID0ge1xyXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyUGF0aDogaWRlbnRpZmllclBhdGgsXHJcbiAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50czogW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uID0gdGhpcy5fc3RvbXBDbGllbnQuc3Vic2NyaWJlKHVybCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5uZXh0KGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdCgpXHJcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25Vc2VyVXJsKGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gPSB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUodXJsLCAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBUID0gSlNPTi5wYXJzZShtZXNzYWdlLmJvZHkgfHwgXCJ7fVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm5leHQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0b2RvcyBvcyBldmVudG9zIG91dmlkb3MgcGFyYSBhIHJlc3BlY3RpdmEgcHJpbWl0aXZhLlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIGV2ZW50byByZXRvcm5hZG8gcGVsYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0gcHJpbWl0aXZlIFByaW1pdGl2YSBxdWUgc2Vyw6EgXCJvYnNlcnZhZGFcIiBwZWxvIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVycyBBcnJheSBjb20gb3MgaW5kZW50aWZpY2Fkb3JlcyBpbnRlcmVzc2Fkb3MuXHJcbiAgICAgKiBAcmV0dXJuIEFycmF5IGNvbnRlbmRvIG8gw7psdGltbyBldmVudG8gcmVjZWJpZG8gZGUgY2FkYSBpZGVudGlmaWNhZG9yIGZvcm5lY2lkby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFB1Ymxpc2hlZEV2ZW50czxUPihwcmltaXRpdmU6IHN0cmluZywgaWRlbnRpZmllcnM6IHN0cmluZ1tdKTogVFtdIHtcclxuICAgICAgICBjb25zdCBwdWJsaXNoZWRFdmVudHM6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBwcmltaXRpdmVNYW5hZ2VyID0gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQocHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZChcclxuICAgICAgICAgICAgICAgIHggPT4gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlZEV2ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFB1Ymxpc2hlZEV2ZW50KHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIsIGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgeCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzW2V2ZW50SW5kZXhdID0geyAuLi5wcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSwgLi4uZXZlbnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJZGVudGlmaWVyRnJvbUV2ZW50KGlkZW50aWZpZXJQYXRoOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBpZGVudGlmaWVyUGF0aC5zcGxpdChcIi5cIik7XHJcblxyXG4gICAgICAgIGxldCBpZGVudGlmaWVyID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xyXG4gICAgICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllcltwcm9wZXJ0eV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9tcENsaWVudCgpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXRvdSBmYWxzZSBpc0Nvbm5lY3RpbmcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Nvbm5lY3RvdSBkZW50cm8gZG8gY29ubmVjdCBjYicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnJlY29ubmVjdFdlYlNvY2tldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHB1Ymxpc2hPbkNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5vYnNlcnZlcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmx1cigpIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvYnNlcnZlcnNDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN0b21wU3Vic2NyaXB0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdFN1YmplY3QubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENvbm5lY3RlZChjb25uZWN0ZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdChcIkBcIilbMV0gOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4uYWNjZXNzX3Rva2VuIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7dG9rZW59LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llU2VydmljZS5nZXQoXCJjb20uc2VuaW9yLmJhc2UudXJsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiY29tLnNlbmlvci50b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gdG9rZW4gJiYgSlNPTi5wYXJzZSh0b2tlbikudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RXZWJTb2NrZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPT0gbnVsbCAmJiBiYXNlVXJsICE9IHRoaXMuYmFzZVVybCkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IGJhc2UgdXJsIGNoYW5nZWQnLCB0aGlzLmJhc2VVcmwsICcgLT4gJywgYmFzZVVybCB8fCAnbnVsbCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlck5hbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgIT09IG51bGwgJiYgdXNlcm5hbWUgIT0gdGhpcy51c2VybmFtZSkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IHVzZXJuYW1lIGNoYW5nZWQnLCB0aGlzLnVzZXJuYW1lLCAnIC0+ICcsIHVzZXJuYW1lIHx8ICdudWxsJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0V2ViU29ja2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBXZWJzb2NrZXRTZXJ2aWNlLlJFQ09OTkVDVF9USU1FUik7XHJcbiAgICB9XHJcbn1cclxuIl19
378
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQTJCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7O0FBZXhDO0lBNEJJO1FBcEJRLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFJZixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUV2RixhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUUvQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFbEMsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFakMsV0FBTSxHQUFHLElBQUksT0FBTyxFQUFhLENBQUM7UUFHdEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUU1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQzt5QkFqQ1EsZ0JBQWdCO0lBbUN6Qjs7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O1NBMVZZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDb21wYXRDbGllbnQsIEZyYW1lSW1wbCwgU3RvbXAsIFN0b21wU3Vic2NyaXB0aW9uIH0gZnJvbSBcIkBzdG9tcC9zdG9tcGpzXCI7XHJcbmltcG9ydCAqIGFzIENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgZmlyc3QsIGZpbmFsaXplIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCAqIGFzIFNvY2tKUyBmcm9tIFwic29ja2pzLWNsaWVudFwiO1xyXG5cclxuaW50ZXJmYWNlIFByaW1pdGl2ZU1hbmFnZXIge1xyXG4gICAgZG9tYWluOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgICBwcmltaXRpdmU6IHN0cmluZztcclxuICAgIHN0b21wU3Vic2NyaXB0aW9uczogU3RvbXBTdWJzY3JpcHRpb25bXTtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDE1MDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c2VkID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgd2FzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgcHJpbWl0aXZlTWFuYWdlcnM6IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI+ID0gbmV3IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBwcml2YXRlIGVycm9yJCA9IG5ldyBTdWJqZWN0PEZyYW1lSW1wbD4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB3aW5kb3cub25mb2N1cyA9IHRoaXMub25Gb2N1cztcclxuICAgICAgICB3aW5kb3cub25ibHVyID0gdGhpcy5vbkJsdXI7XHJcblxyXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCQubmV4dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QkLnBpcGUoZmlyc3QoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGRlc2NvbmVjdGFkYS5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyDDqSBkZXNjb25lY3RhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRpc2Nvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY29ubmVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIHJlY29uZWN0YWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIHJlY29uZWN0YWRhLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25SZWNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjb25uZWN0JC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTxGcmFtZUltcGw+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25FcnJvcigpOiBPYnNlcnZhYmxlPEZyYW1lSW1wbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIHVtIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gb2JqZXRvIHF1ZSBvIHJldG9ybm8gZG8gYG9ic2VydmFibGVgIHZhaSBkZXZvbHZlci5cclxuICAgICAqIEBwYXJhbSBkb21haW4gRG9taW5pbyBkYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0gc2VydmljZSBTZXJ2aWNlIGRhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSBwcmltaXRpdmUgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiIHBlbG8gY2xpZW50LlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXJQYXRoIENhbWluaG8gYXTDqSBhIHByb3ByaWVkYWRlIGNvbnNpZGVyYWRhIG8gaWRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBpZiAodGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5oYXMocHJpbWl0aXZlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQocHJpbWl0aXZlKS5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlciA9IHtcclxuICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXHJcbiAgICAgICAgICAgIHNlcnZpY2U6IHNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbnM6IFtdLFxyXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdDxUPigpLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyUGF0aDogaWRlbnRpZmllclBhdGgsXHJcbiAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50czogW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmRpc2Nvbm5lY3RQcmltaXRpdmVPbkZpbmFsaXplKHByaW1pdGl2ZSkpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5kaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmUpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0b2RvcyBvcyBldmVudG9zIG91dmlkb3MgcGVsYSBwcmltaXRpdmEgY29tIG9zIHJlc3BlY3Rpdm9zIGlkZW50aWZpY2Fkb3Jlcy5cclxuICAgICAqIEB0eXBlUGFyYW0gYDxUPmAgVGlwbyBkbyBldmVudG8gcmV0b3JuYWRvIHBlbGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHByaW1pdGl2ZSBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIgcGVsbyBjbGllbnQuXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllcnMgQXJyYXkgY29tIG9zIGlkZW50aWZpY2Fkb3JlcyBpbnRlcmVzc2Fkb3MuXHJcbiAgICAgKiBAcmV0dXJuIEFycmF5IGNvbnRlbmRvIG8gw7psdGltbyBldmVudG8gcmVjZWJpZG8gZGUgY2FkYSBpZGVudGlmaWNhZG9yIGZvcm5lY2lkby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFB1Ymxpc2hlZEV2ZW50czxUPihwcmltaXRpdmU6IHN0cmluZywgaWRlbnRpZmllcnM6IHN0cmluZ1tdKTogVFtdIHtcclxuICAgICAgICBjb25zdCBwdWJsaXNoZWRFdmVudHM6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBwcmltaXRpdmVNYW5hZ2VyID0gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQocHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZChcclxuICAgICAgICAgICAgICAgIHggPT4gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlZEV2ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFB1Ymxpc2hlZEV2ZW50KHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIsIGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgeCA9PiB0aGlzLmdldElkZW50aWZpZXJGcm9tRXZlbnQocHJpbWl0aXZlTWFuYWdlci5pZGVudGlmaWVyUGF0aCwgeCkgPT09IGlkZW50aWZpZXJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnRJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHNbZXZlbnRJbmRleF0gPSB7IC4uLnByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzW2V2ZW50SW5kZXhdLCAuLi5ldmVudCB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgd2l0aFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4gPSB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKHdpdGhUb2tlblVybCwgcHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHdpdGhvdXRUb2tlblVybCA9IHRoaXMuZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuID0gdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbih3aXRob3V0VG9rZW5VcmwsIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucyA9IFtzdG9tcFN1YnNjcmlwdGlvbldpdGhUb2tlbiwgc3RvbXBTdWJzY3JpcHRpb25XaXRob3V0VG9rZW5dO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SWRlbnRpZmllckZyb21FdmVudChpZGVudGlmaWVyUGF0aDogc3RyaW5nLCBldmVudDogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gaWRlbnRpZmllclBhdGguc3BsaXQoXCIuXCIpO1xyXG5cclxuICAgICAgICBsZXQgaWRlbnRpZmllciA9IGV2ZW50O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXJbcHJvcGVydHldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvbXBDbGllbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5hY3RpdmF0ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5jb25uZWN0KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53YXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFByaW1pdGl2ZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QkLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53YXNDb25uZWN0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QkLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycm9yOiBGcmFtZUltcGwpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdGVkKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yJC5uZXh0KGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmx1cigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBvYnNlcnZlcnNDb3VudCA9IHRoaXMuZ2V0T2JzZXJ2ZXJzQ291bnQoKTtcclxuXHJcbiAgICAgICAgaWYgKG9ic2VydmVyc0NvdW50ID4gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uIG9mIHByaW1pdGl2ZU1hbmFnZXIuc3RvbXBTdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy53YXNDb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0JC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDb25uZWN0ZWQoY29ubmVjdGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBjb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4gPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLnVzZXJuYW1lLnNwbGl0KFwiQFwiKVsxXSA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi5hY2Nlc3NfdG9rZW4gOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHt0b2tlbn0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhvdXRUb2tlbihkb21haW46IHN0cmluZywgc2VydmljZTogc3RyaW5nLCBwcmltaXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoXCJAXCIpWzFdIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihkZXN0aW5hdGlvbjogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRQdWJsaXNoZWRFdmVudChwcmltaXRpdmVNYW5hZ2VyLCBldmVudCk7XHJcblxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QubmV4dChldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICAvLyB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9IChzdHIpID0+IGNvbnNvbGUubG9nKG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgc3RyKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpIHRoaXMuX3N0b21wQ2xpZW50LmRpc2Nvbm5lY3QoKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9ic2VydmVyc0NvdW50KCkgPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIFdlYnNvY2tldFNlcnZpY2UuUkVDT05ORUNUX1RJTUVSKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlY29ubmVjdFByaW1pdGl2ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0T2JzZXJ2ZXJzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvYnNlcnZlcnNDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RQcmltaXRpdmVPbkZpbmFsaXplKHByaW1pdGl2ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmICghcHJpbWl0aXZlTWFuYWdlcikgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBASU1QT1JUQU5UOiBSZXBsYWNlIC5vYnNlcnZlcnMubGVuZ3RoIHdpdGggLm9ic2VydmVkIGluIHJ4anMgNy4wK1xyXG4gICAgICAgIGNvbnN0IGhhc09ic2VydmVycyA9ICEocHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm9ic2VydmVycy5sZW5ndGggPT09IDEpO1xyXG5cclxuICAgICAgICBpZiAoaGFzT2JzZXJ2ZXJzKSByZXR1cm47XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gb2YgcHJpbWl0aXZlTWFuYWdlci5zdG9tcFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZGVsZXRlKHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==