@senior-gestao-empresarial/angular-components 6.9.3 → 6.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,15 +22,14 @@ export declare class WebsocketService {
22
22
  /** @private */
23
23
  private readonly primitiveManagers;
24
24
  /** @private */
25
- private connect$;
25
+ private readonly connected$;
26
26
  /** @private */
27
27
  private disconnect$;
28
28
  /** @private */
29
29
  private reconnect$;
30
30
  /** @private */
31
31
  private error$;
32
- private readonly subscribe$;
33
- constructor();
32
+ private readonly subscribed$;
34
33
  /**
35
34
  * Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida pela primeira vez.
36
35
  * @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida pela primeira vez.
@@ -3,7 +3,7 @@ import { __decorate } from "tslib";
3
3
  import { Injectable } from '@angular/core';
4
4
  import { Stomp } from '@stomp/stompjs';
5
5
  import * as Cookies from 'js-cookie';
6
- import { Subject, fromEvent, iif, of, race, timer } from 'rxjs';
6
+ import { BehaviorSubject, Subject, fromEvent, iif, of, race, timer } from 'rxjs';
7
7
  import { filter, finalize, first, map, switchMap, take } from 'rxjs/operators';
8
8
  import * as SockJS from 'sockjs-client';
9
9
  import * as i0 from "@angular/core";
@@ -18,25 +18,21 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
18
18
  /** @private */
19
19
  this.primitiveManagers = new Map();
20
20
  /** @private */
21
- this.connect$ = new Subject();
21
+ this.connected$ = new BehaviorSubject(false);
22
22
  /** @private */
23
23
  this.disconnect$ = new Subject();
24
24
  /** @private */
25
25
  this.reconnect$ = new Subject();
26
26
  /** @private */
27
27
  this.error$ = new Subject();
28
- this.subscribe$ = new Subject();
29
- this.connect();
28
+ this.subscribed$ = new Subject();
30
29
  }
31
30
  /**
32
31
  * Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida pela primeira vez.
33
32
  * @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida pela primeira vez.
34
33
  */
35
34
  onConnect() {
36
- if (this.isConnected || this.wasConnected) {
37
- return of(undefined).pipe(take(1));
38
- }
39
- return this.connect$.asObservable().pipe(take(1));
35
+ return this.connected$.asObservable().pipe(filter(Boolean), map(() => undefined), take(1));
40
36
  }
41
37
  /**
42
38
  * Observable responsável por emitir uma notificação quando a conexão é desconectada.
@@ -58,10 +54,14 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
58
54
  */
59
55
  onSubscribe({ domain, service, primitive }) {
60
56
  const key = this.getPrimitiveManagerKey(domain, service, primitive);
61
- return this.onConnect().pipe(switchMap(() => this.primitiveManagers.has(key) &&
62
- this.primitiveManagers.get(key).isSubscribed
63
- ? of(void 0).pipe(take(1))
64
- : this.subscribe$.pipe(filter((primitiveManager) => this.getPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive) === key), take(1), map(() => void 0))));
57
+ return this.onConnect().pipe(switchMap(() => {
58
+ if (this.primitiveManagers.has(key))
59
+ return this.primitiveManagers
60
+ .get(key)
61
+ .subscribed$.asObservable()
62
+ .pipe(map(() => undefined), take(1));
63
+ return this.subscribed$.asObservable().pipe(filter((primitiveManager) => this.getPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive) === key), map(() => undefined), take(1));
64
+ }));
65
65
  }
66
66
  /**
67
67
  * Observable responsável por emitir uma notificação quando ocorre algum erro.
@@ -79,6 +79,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
79
79
  * @return Um Observable<T> que emite notificações toda vez que o respectivo evento é publicado.
80
80
  */
81
81
  onEvent(options) {
82
+ this.connect();
82
83
  const { domain, service, primitive } = options;
83
84
  const key = this.getPrimitiveManagerKey(domain, service, primitive);
84
85
  if (this.primitiveManagers.has(key)) {
@@ -90,26 +91,17 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
90
91
  primitive: primitive,
91
92
  stompSubscriptions: [],
92
93
  event$: new Subject(),
93
- isSubscribed: false
94
+ subscribed$: new BehaviorSubject(false)
94
95
  };
95
96
  this.primitiveManagers.set(key, primitiveManager);
96
- if (this.isConnected) {
97
+ this.onConnect()
98
+ .pipe(take(1))
99
+ .subscribe(() => {
97
100
  this.createStompSubscriptions(primitiveManager);
98
- return primitiveManager.event$
99
- .asObservable()
100
- .pipe(finalize(() => this.disconnectPrimitiveOnFinalize(primitiveManager)));
101
- }
102
- else {
103
- if (!this.isConnecting) {
104
- this.connect();
105
- }
106
- this.connect$.pipe(first()).subscribe(() => {
107
- this.createStompSubscriptions(primitiveManager);
108
- });
109
- return primitiveManager.event$
110
- .asObservable()
111
- .pipe(finalize(() => this.disconnectPrimitiveOnFinalize(primitiveManager)));
112
- }
101
+ });
102
+ return primitiveManager.event$
103
+ .asObservable()
104
+ .pipe(finalize(() => this.disconnectPrimitiveOnFinalize(primitiveManager)));
113
105
  }
114
106
  /** @private */
115
107
  createStompSubscriptions(primitiveManager) {
@@ -121,11 +113,13 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
121
113
  stompSubscriptionWithToken,
122
114
  stompSubscriptionWithoutToken
123
115
  ];
124
- primitiveManager.isSubscribed = true;
125
- this.subscribe$.next(primitiveManager);
116
+ primitiveManager.subscribed$.next(true);
117
+ this.subscribed$.next(primitiveManager);
126
118
  }
127
119
  /** @private */
128
120
  connect() {
121
+ if (this.isConnected || this.isConnecting)
122
+ return;
129
123
  this.createStompClient();
130
124
  this.isConnecting = true;
131
125
  this._stompClient.connect({}, () => {
@@ -133,15 +127,16 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
133
127
  this.isConnected = true;
134
128
  if (this.wasConnected) {
135
129
  this.reconnectPrimitives();
136
- this.connect$.next();
130
+ this.connected$.next(true);
137
131
  this.reconnect$.next();
138
132
  }
139
133
  else {
140
134
  this.wasConnected = true;
141
- this.connect$.next();
135
+ this.connected$.next(true);
142
136
  }
143
137
  }, (error) => {
144
138
  this.isConnected = false;
139
+ this.connected$.next(false);
145
140
  this.error$.next(error);
146
141
  race(this.disconnect$.pipe(take(1), map(() => ({ wasDisconnected: true }))), timer(WebsocketService_1.RECONNECT_INTERVAL).pipe(take(1), switchMap(() => iif(() => document.hidden, fromEvent(document, 'visibilitychange').pipe(first()), of(void 0))), map(() => ({ wasDisconnected: false }))))
147
142
  .pipe(take(1))
@@ -173,6 +168,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
173
168
  this.isConnected = false;
174
169
  this.isConnecting = false;
175
170
  this.wasConnected = false;
171
+ this.connected$.next(false);
176
172
  this.disconnect$.next();
177
173
  }
178
174
  /** @private */
@@ -229,6 +225,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
229
225
  for (const stompSubscription of primitiveManager.stompSubscriptions) {
230
226
  stompSubscription.unsubscribe();
231
227
  }
228
+ primitiveManager.subscribed$.complete();
232
229
  const key = this.getPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive);
233
230
  this.primitiveManagers.delete(key);
234
231
  this.disconnect();
@@ -255,4 +252,4 @@ WebsocketService = WebsocketService_1 = __decorate([
255
252
  })
256
253
  ], WebsocketService);
257
254
  export { WebsocketService };
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUdILEtBQUssRUFFUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sS0FBSyxPQUFPLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFFSCxPQUFPLEVBQ1AsU0FBUyxFQUNULEdBQUcsRUFDSCxFQUFFLEVBQ0YsSUFBSSxFQUNKLEtBQUssRUFDUixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFDOztBQWV4QyxJQUFhLGdCQUFnQix3QkFBN0IsTUFBYSxnQkFBZ0I7SUFvRHpCO1FBN0JBLGVBQWU7UUFDUCxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUU3QixlQUFlO1FBQ1AsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFNUIsZUFBZTtRQUNQLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQWU7UUFDRSxzQkFBaUIsR0FBa0MsSUFBSSxHQUFHLEVBR3hFLENBQUM7UUFFSixlQUFlO1FBQ1AsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFdkMsZUFBZTtRQUNQLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUUxQyxlQUFlO1FBQ1AsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFekMsZUFBZTtRQUNQLFdBQU0sR0FBRyxJ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QUFHLElBQUksQ0FBQztBQUVuQyxtQ0FBa0IsR0FBRyxLQUFLLENBQUM7QUFFbEMsZUFBZTtBQUNBLGdDQUFlLEdBQUcscUJBQXFCLENBQUM7QUFFdkQsZUFBZTtBQUNBLDZCQUFZLEdBQUcsa0JBQWtCLENBQUM7QUFFakQsZUFBZTtBQUNBLHNCQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQ3JELENBQUM7QUFFRixlQUFlO0FBQ0EsOEJBQWEsR0FDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBZ0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxhQUFhLENBQUM7O0FBbEJ6RCxnQkFBZ0I7SUFINUIsVUFBVSxDQUFDO1FBQ1IsVUFBVSxFQUFFLE1BQU07S0FDckIsQ0FBQztHQUNXLGdCQUFnQixDQWdhNUI7U0FoYVksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgQ29tcGF0Q2xpZW50LFxyXG4gICAgRnJhbWVJbXBsLFxyXG4gICAgU3RvbXAsXHJcbiAgICBTdG9tcFN1YnNjcmlwdGlvblxyXG59IGZyb20gJ0BzdG9tcC9zdG9tcGpzJztcclxuaW1wb3J0ICogYXMgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xyXG5pbXBvcnQge1xyXG4gICAgT2JzZXJ2YWJsZSxcclxuICAgIFN1YmplY3QsXHJcbiAgICBmcm9tRXZlbnQsXHJcbiAgICBpaWYsXHJcbiAgICBvZixcclxuICAgIHJhY2UsXHJcbiAgICB0aW1lclxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGZpbmFsaXplLCBmaXJzdCwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCAqIGFzIFNvY2tKUyBmcm9tICdzb2NranMtY2xpZW50JztcclxuXHJcbi8qKiBAcHJpdmF0ZSAqL1xyXG5pbnRlcmZhY2UgUHJpbWl0aXZlTWFuYWdlciB7XHJcbiAgICBkb21haW46IHN0cmluZztcclxuICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgIHByaW1pdGl2ZTogc3RyaW5nO1xyXG4gICAgc3RvbXBTdWJzY3JpcHRpb25zOiBTdG9tcFN1YnNjcmlwdGlvbltdO1xyXG4gICAgZXZlbnQkOiBTdWJqZWN0PGFueT47XHJcbiAgICBpc1N1YnNjcmliZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0U2VydmljZSB7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgUkVDT05ORUNUX0lOVEVSVkFMID0gMzAwMDtcclxuXHJcbiAgICBzdGF0aWMgQ09OTkVDVElPTl9USU1FT1VUID0gMTUwMDA7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBCQVNFX1VSTF9DT09LSUUgPSAnY29tLnNlbmlvci5iYXNlLnVybCc7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSAnY29tLnNlbmlvci50b2tlbic7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTiA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgQ29va2llcy5nZXQoV2Vic29ja2V0U2VydmljZS5UT0tFTl9DT09LSUUpIHx8ICd7fSdcclxuICAgICk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBXRUJTT0NLRVRfVVJMID1cclxuICAgICAgICBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyAnL3dlYnNvY2tldC8nO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfc3RvbXBDbGllbnQ6IENvbXBhdENsaWVudDtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgd2FzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmltaXRpdmVNYW5hZ2VyczogTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4gPSBuZXcgTWFwPFxyXG4gICAgICAgIHN0cmluZyxcclxuICAgICAgICBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICA+KCk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZXJyb3IkID0gbmV3IFN1YmplY3Q8RnJhbWVJbXBsPigpO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PFByaW1pdGl2ZU1hbmFnZXI+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEgcGVsYSBwcmltZWlyYSB2ZXouXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYSBwZWxhIHByaW1laXJhIHZlei5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCB0aGlzLndhc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKS5waXBlKHRha2UoMSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdCQuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZGVzY29uZWN0YWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGRlc2NvbmVjdGFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0JC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJlY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBhcMOzcyBvIHN1YnNjcmliZSBkbyBldmVudG8gcGVsYSBwcmltZWlyYSB2ZXouXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gYXDDs3MgbyBzdWJzY3JpYmUgZG8gZXZlbnRvIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TdWJzY3JpYmUoe1xyXG4gICAgICAgIGRvbWFpbixcclxuICAgICAgICBzZXJ2aWNlLFxyXG4gICAgICAgIHByaW1pdGl2ZVxyXG4gICAgfToge1xyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nO1xyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZztcclxuICAgIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5vbkNvbm5lY3QoKS5waXBlKFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoXHJcbiAgICAgICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKGtleSkgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChrZXkpLmlzU3Vic2NyaWJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9mKHZvaWQgMCkucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3Vic2NyaWJlJC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpbWl0aXZlTWFuYWdlcikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9PT0ga2V5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB2b2lkIDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTxGcmFtZUltcGw+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25FcnJvcigpOiBPYnNlcnZhYmxlPEZyYW1lSW1wbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlUGFyYW0gYDxUPmAgVGlwbyBkbyBvYmpldG8gcXVlIG8gcmV0b3JubyBkbyBgb2JzZXJ2YWJsZWAgdmFpIGRldm9sdmVyLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT2JqZXRvIGRlIGNvbmZpZ3VyYcOnw6NvIGRvIGV2ZW50by5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmRvbWFpbiBEb23DrW5pbyBkYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXJ2aWNlIFNlcnZpw6dvIGRhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnByaW1pdGl2ZSAgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiLlxyXG4gICAgICogQHJldHVybiBVbSBPYnNlcnZhYmxlPFQ+IHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkV2ZW50PFQ+KG9wdGlvbnM6IHtcclxuICAgICAgICBkb21haW46IHN0cmluZztcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmc7XHJcbiAgICB9KTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgY29uc3QgeyBkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSB9ID0gb3B0aW9ucztcclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KGtleSkuZXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlciA9IHtcclxuICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXHJcbiAgICAgICAgICAgIHNlcnZpY2U6IHNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbnM6IFtdLFxyXG4gICAgICAgICAgICBldmVudCQ6IG5ldyBTdWJqZWN0PFQ+KCksXHJcbiAgICAgICAgICAgIGlzU3Vic2NyaWJlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnNldChrZXksIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JFxyXG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RQcmltaXRpdmVPbkZpbmFsaXplKHByaW1pdGl2ZU1hbmFnZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5ldmVudCRcclxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmVNYW5hZ2VyKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdpdGhUb2tlblVybCA9IHRoaXMuZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuID0gdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihcclxuICAgICAgICAgICAgd2l0aFRva2VuVXJsLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2l0aG91dFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb25XaXRob3V0VG9rZW4gPSB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKFxyXG4gICAgICAgICAgICB3aXRob3V0VG9rZW5VcmwsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucyA9IFtcclxuICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4sXHJcbiAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5pc1N1YnNjcmliZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlJC5uZXh0KHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvbXBDbGllbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5jb25uZWN0KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53YXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFByaW1pdGl2ZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QkLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53YXNDb25uZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCQubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoZXJyb3I6IEZyYW1lSW1wbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IkLm5leHQoZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJhY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0JC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gKHsgd2FzRGlzY29ubmVjdGVkOiB0cnVlIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZXIoV2Vic29ja2V0U2VydmljZS5SRUNPTk5FQ1RfSU5URVJWQUwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlmKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGRvY3VtZW50LmhpZGRlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICd2aXNpYmlsaXR5Y2hhbmdlJykucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Yodm9pZCAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gKHsgd2FzRGlzY29ubmVjdGVkOiBmYWxzZSB9KSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHsgd2FzRGlzY29ubmVjdGVkIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhd2FzRGlzY29ubmVjdGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISh0aGlzLmlzQ29ubmVjdGVkIHx8IHRoaXMuaXNDb25uZWN0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0T2JzZXJ2ZXJzQ291bnQoKSA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy53YXNDb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0JC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhUb2tlbihcclxuICAgICAgICBkb21haW46IHN0cmluZyxcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmdcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTlxyXG4gICAgICAgICAgICA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoJ0AnKVsxXVxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi5hY2Nlc3NfdG9rZW5cclxuICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHt0b2tlbn0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuKFxyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdCgnQCcpWzFdXHJcbiAgICAgICAgICAgIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKFxyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlclxyXG4gICAgKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCAne30nKTtcclxuXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZXZlbnQkLm5leHQoZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoXHJcbiAgICAgICAgICAgIGAke1dlYnNvY2tldFNlcnZpY2UuV0VCU09DS0VUX1VSTH1zdWJzY3JpcHRpb25gLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICB7IHRpbWVvdXQ6IFdlYnNvY2tldFNlcnZpY2UuQ09OTkVDVElPTl9USU1FT1VUIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50ID0gU3RvbXAub3Zlcih3cyk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGVidWcgPSAoKSA9PiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RQcmltaXRpdmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0T2JzZXJ2ZXJzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JC5vYnNlcnZlcnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyc0NvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShcclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICAvLyBASU1QT1JUQU5UOiBSZXBsYWNlIC5vYnNlcnZlcnMubGVuZ3RoID09PSAxIHdpdGggLm9ic2VydmVkIGluIHJ4anMgNy4wK1xyXG4gICAgICAgIGNvbnN0IGhhc09ic2VydmVycyA9ICEocHJpbWl0aXZlTWFuYWdlci5ldmVudCQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMSk7XHJcblxyXG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnMpIHJldHVybjtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQuY29tcGxldGUoKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZGVsZXRlKGtleSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcmltaXRpdmVNYW5hZ2VyS2V5KFxyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYCR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcbn1cclxuIl19
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUdILEtBQUssRUFFUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sS0FBSyxPQUFPLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFDSCxlQUFlLEVBRWYsT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEVBQ0gsRUFBRSxFQUNGLElBQUksRUFDSixLQUFLLEVBQ1IsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQzs7QUFleEMsSUFBYSxnQkFBZ0Isd0JBQTdCLE1BQWEsZ0JBQWdCO0lBQTdCO1FBdUJJLGVBQWU7UUFDUCxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUU3QixlQUFlO1FBQ1AsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFNUIsZUFBZTtRQUNQLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQWU7UUFDRSxzQkFBaUIsR0FBa0MsSUFBSSxHQUFHLEVBR3hFLENBQUM7UUFFSixlQUFlO1FBQ0UsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRWxFLGVBQWU7UUFDUCxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFMUMsZUFBZTtRQUNQLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXpDLGVB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R0FBRyxLQUFLLENBQUM7QUFFbEMsZUFBZTtBQUNBLGdDQUFlLEdBQUcscUJBQXFCLENBQUM7QUFFdkQsZUFBZTtBQUNBLDZCQUFZLEdBQUcsa0JBQWtCLENBQUM7QUFFakQsZUFBZTtBQUNBLHNCQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQ3JELENBQUM7QUFFRixlQUFlO0FBQ0EsOEJBQWEsR0FDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBZ0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxhQUFhLENBQUM7O0FBbEJ6RCxnQkFBZ0I7SUFINUIsVUFBVSxDQUFDO1FBQ1IsVUFBVSxFQUFFLE1BQU07S0FDckIsQ0FBQztHQUNXLGdCQUFnQixDQXVaNUI7U0F2WlksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgQ29tcGF0Q2xpZW50LFxyXG4gICAgRnJhbWVJbXBsLFxyXG4gICAgU3RvbXAsXHJcbiAgICBTdG9tcFN1YnNjcmlwdGlvblxyXG59IGZyb20gJ0BzdG9tcC9zdG9tcGpzJztcclxuaW1wb3J0ICogYXMgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xyXG5pbXBvcnQge1xyXG4gICAgQmVoYXZpb3JTdWJqZWN0LFxyXG4gICAgT2JzZXJ2YWJsZSxcclxuICAgIFN1YmplY3QsXHJcbiAgICBmcm9tRXZlbnQsXHJcbiAgICBpaWYsXHJcbiAgICBvZixcclxuICAgIHJhY2UsXHJcbiAgICB0aW1lclxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGZpbmFsaXplLCBmaXJzdCwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCAqIGFzIFNvY2tKUyBmcm9tICdzb2NranMtY2xpZW50JztcclxuXHJcbi8qKiBAcHJpdmF0ZSAqL1xyXG5pbnRlcmZhY2UgUHJpbWl0aXZlTWFuYWdlciB7XHJcbiAgICBkb21haW46IHN0cmluZztcclxuICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgIHByaW1pdGl2ZTogc3RyaW5nO1xyXG4gICAgc3RvbXBTdWJzY3JpcHRpb25zOiBTdG9tcFN1YnNjcmlwdGlvbltdO1xyXG4gICAgZXZlbnQkOiBTdWJqZWN0PGFueT47XHJcbiAgICBzdWJzY3JpYmVkJDogQmVoYXZpb3JTdWJqZWN0PEJvb2xlYW4+O1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgc3RhdGljIHJlYWRvbmx5IFJFQ09OTkVDVF9JTlRFUlZBTCA9IDMwMDA7XHJcblxyXG4gICAgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDE1MDAwO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gJ2NvbS5zZW5pb3IuYmFzZS51cmwnO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgVE9LRU5fQ09PS0lFID0gJ2NvbS5zZW5pb3IudG9rZW4nO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgVE9LRU4gPSBKU09OLnBhcnNlKFxyXG4gICAgICAgIENvb2tpZXMuZ2V0KFdlYnNvY2tldFNlcnZpY2UuVE9LRU5fQ09PS0lFKSB8fCAne30nXHJcbiAgICApO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgV0VCU09DS0VUX1VSTCA9XHJcbiAgICAgICAgQ29va2llcy5nZXQoV2Vic29ja2V0U2VydmljZS5CQVNFX1VSTF9DT09LSUUpICsgJy93ZWJzb2NrZXQvJztcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgX3N0b21wQ2xpZW50OiBDb21wYXRDbGllbnQ7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHdhc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBpc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBpc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbWl0aXZlTWFuYWdlcnM6IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI+ID0gbmV3IE1hcDxcclxuICAgICAgICBzdHJpbmcsXHJcbiAgICAgICAgUHJpbWl0aXZlTWFuYWdlclxyXG4gICAgPigpO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCb29sZWFuPihmYWxzZSk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgcmVjb25uZWN0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGVycm9yJCA9IG5ldyBTdWJqZWN0PEZyYW1lSW1wbD4oKTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmliZWQkID0gbmV3IFN1YmplY3Q8UHJpbWl0aXZlTWFuYWdlcj4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYSBwZWxhIHByaW1laXJhIHZlei5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Db25uZWN0KCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZCQuYXNPYnNlcnZhYmxlKCkucGlwZShcclxuICAgICAgICAgICAgZmlsdGVyKEJvb2xlYW4pLFxyXG4gICAgICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcclxuICAgICAgICAgICAgdGFrZSgxKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGRlc2NvbmVjdGFkYS5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyDDqSBkZXNjb25lY3RhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRpc2Nvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY29ubmVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIHJlY29uZWN0YWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIHJlY29uZWN0YWRhLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25SZWNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjb25uZWN0JC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gYXDDs3MgbyBzdWJzY3JpYmUgZG8gZXZlbnRvIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIGFww7NzIG8gc3Vic2NyaWJlIGRvIGV2ZW50byBwZWxhIHByaW1laXJhIHZlei5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uU3Vic2NyaWJlKHtcclxuICAgICAgICBkb21haW4sXHJcbiAgICAgICAgc2VydmljZSxcclxuICAgICAgICBwcmltaXRpdmVcclxuICAgIH06IHtcclxuICAgICAgICBkb21haW46IHN0cmluZztcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmc7XHJcbiAgICB9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMub25Db25uZWN0KCkucGlwZShcclxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmhhcyhrZXkpKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoa2V5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlZCQuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmVkJC5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHByaW1pdGl2ZU1hbmFnZXIpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5kb21haW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApID09PSBrZXlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2UoMSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTxGcmFtZUltcGw+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25FcnJvcigpOiBPYnNlcnZhYmxlPEZyYW1lSW1wbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlUGFyYW0gYDxUPmAgVGlwbyBkbyBvYmpldG8gcXVlIG8gcmV0b3JubyBkbyBgb2JzZXJ2YWJsZWAgdmFpIGRldm9sdmVyLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT2JqZXRvIGRlIGNvbmZpZ3VyYcOnw6NvIGRvIGV2ZW50by5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmRvbWFpbiBEb23DrW5pbyBkYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXJ2aWNlIFNlcnZpw6dvIGRhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnByaW1pdGl2ZSAgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiLlxyXG4gICAgICogQHJldHVybiBVbSBPYnNlcnZhYmxlPFQ+IHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkV2ZW50PFQ+KG9wdGlvbnM6IHtcclxuICAgICAgICBkb21haW46IHN0cmluZztcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmc7XHJcbiAgICB9KTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUgfSA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0UHJpbWl0aXZlTWFuYWdlcktleShkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChrZXkpLmV2ZW50JC5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIgPSB7XHJcbiAgICAgICAgICAgIGRvbWFpbjogZG9tYWluLFxyXG4gICAgICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmU6IHByaW1pdGl2ZSxcclxuICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb25zOiBbXSxcclxuICAgICAgICAgICAgZXZlbnQkOiBuZXcgU3ViamVjdDxUPigpLFxyXG4gICAgICAgICAgICBzdWJzY3JpYmVkJDogbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnNldChrZXksIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICB0aGlzLm9uQ29ubmVjdCgpXHJcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5ldmVudCRcclxuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMuZGlzY29ubmVjdFByaW1pdGl2ZU9uRmluYWxpemUocHJpbWl0aXZlTWFuYWdlcikpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB3aXRoVG9rZW5VcmwgPSB0aGlzLmdldFN1YnNjcmlwdGlvblVybFdpdGhUb2tlbihcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5kb21haW4sXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc2VydmljZSxcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24oXHJcbiAgICAgICAgICAgIHdpdGhUb2tlblVybCxcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlclxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHdpdGhvdXRUb2tlblVybCA9IHRoaXMuZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuID0gdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihcclxuICAgICAgICAgICAgd2l0aG91dFRva2VuVXJsLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdG9tcFN1YnNjcmlwdGlvbnMgPSBbXHJcbiAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuLFxyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlblxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3Vic2NyaWJlZCQubmV4dCh0cnVlKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZWQkLm5leHQocHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgfHwgdGhpcy5pc0Nvbm5lY3RpbmcpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9tcENsaWVudCgpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLndhc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0UHJpbWl0aXZlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZCQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdCQubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndhc0Nvbm5lY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChlcnJvcjogRnJhbWVJbXBsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZCQubmV4dChmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciQubmV4dChlcnJvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgcmFjZShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QkLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiAoeyB3YXNEaXNjb25uZWN0ZWQ6IHRydWUgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lcihXZWJzb2NrZXRTZXJ2aWNlLlJFQ09OTkVDVF9JTlRFUlZBTCkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWYoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gZG9jdW1lbnQuaGlkZGVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ3Zpc2liaWxpdHljaGFuZ2UnKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZih2b2lkIDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiAoeyB3YXNEaXNjb25uZWN0ZWQ6IGZhbHNlIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiAoeyB3YXNEaXNjb25uZWN0ZWQgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3YXNEaXNjb25uZWN0ZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKHRoaXMuaXNDb25uZWN0ZWQgfHwgdGhpcy5pc0Nvbm5lY3RpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5nZXRPYnNlcnZlcnNDb3VudCgpID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uIG9mIHByaW1pdGl2ZU1hbmFnZXIuc3RvbXBTdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JC5jb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5jbGVhcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGVhY3RpdmF0ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLndhc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmNvbm5lY3RlZCQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0JC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhUb2tlbihcclxuICAgICAgICBkb21haW46IHN0cmluZyxcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmdcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTlxyXG4gICAgICAgICAgICA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoJ0AnKVsxXVxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi5hY2Nlc3NfdG9rZW5cclxuICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHt0b2tlbn0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuKFxyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdCgnQCcpWzFdXHJcbiAgICAgICAgICAgIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKFxyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlclxyXG4gICAgKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCAne30nKTtcclxuXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZXZlbnQkLm5leHQoZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoXHJcbiAgICAgICAgICAgIGAke1dlYnNvY2tldFNlcnZpY2UuV0VCU09DS0VUX1VSTH1zdWJzY3JpcHRpb25gLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICB7IHRpbWVvdXQ6IFdlYnNvY2tldFNlcnZpY2UuQ09OTkVDVElPTl9USU1FT1VUIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50ID0gU3RvbXAub3Zlcih3cyk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGVidWcgPSAoKSA9PiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RQcmltaXRpdmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0T2JzZXJ2ZXJzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JC5vYnNlcnZlcnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyc0NvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShcclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICAvLyBASU1QT1JUQU5UOiBSZXBsYWNlIC5vYnNlcnZlcnMubGVuZ3RoID09PSAxIHdpdGggLm9ic2VydmVkIGluIHJ4anMgNy4wK1xyXG4gICAgICAgIGNvbnN0IGhhc09ic2VydmVycyA9ICEocHJpbWl0aXZlTWFuYWdlci5ldmVudCQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMSk7XHJcblxyXG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnMpIHJldHVybjtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQuY29tcGxldGUoKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJzY3JpYmVkJC5jb21wbGV0ZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5kZWxldGUoa2V5KTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGdldFByaW1pdGl2ZU1hbmFnZXJLZXkoXHJcbiAgICAgICAgZG9tYWluOiBzdHJpbmcsXHJcbiAgICAgICAgc2VydmljZTogc3RyaW5nLFxyXG4gICAgICAgIHByaW1pdGl2ZTogc3RyaW5nXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBgJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -2,7 +2,7 @@ import { __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 { Subject, fromEvent, iif, of, race, timer } from 'rxjs';
5
+ import { BehaviorSubject, Subject, fromEvent, iif, of, race, timer } from 'rxjs';
6
6
  import { filter, finalize, first, map, switchMap, take } from 'rxjs/operators';
7
7
  import * as SockJS from 'sockjs-client';
8
8
  import * as i0 from "@angular/core";
@@ -17,15 +17,14 @@ var WebsocketService = /** @class */ (function () {
17
17
  /** @private */
18
18
  this.primitiveManagers = new Map();
19
19
  /** @private */
20
- this.connect$ = new Subject();
20
+ this.connected$ = new BehaviorSubject(false);
21
21
  /** @private */
22
22
  this.disconnect$ = new Subject();
23
23
  /** @private */
24
24
  this.reconnect$ = new Subject();
25
25
  /** @private */
26
26
  this.error$ = new Subject();
27
- this.subscribe$ = new Subject();
28
- this.connect();
27
+ this.subscribed$ = new Subject();
29
28
  }
30
29
  WebsocketService_1 = WebsocketService;
31
30
  /**
@@ -33,10 +32,7 @@ var WebsocketService = /** @class */ (function () {
33
32
  * @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida pela primeira vez.
34
33
  */
35
34
  WebsocketService.prototype.onConnect = function () {
36
- if (this.isConnected || this.wasConnected) {
37
- return of(undefined).pipe(take(1));
38
- }
39
- return this.connect$.asObservable().pipe(take(1));
35
+ return this.connected$.asObservable().pipe(filter(Boolean), map(function () { return undefined; }), take(1));
40
36
  };
41
37
  /**
42
38
  * Observable responsável por emitir uma notificação quando a conexão é desconectada.
@@ -61,12 +57,14 @@ var WebsocketService = /** @class */ (function () {
61
57
  var domain = _a.domain, service = _a.service, primitive = _a.primitive;
62
58
  var key = this.getPrimitiveManagerKey(domain, service, primitive);
63
59
  return this.onConnect().pipe(switchMap(function () {
64
- return _this.primitiveManagers.has(key) &&
65
- _this.primitiveManagers.get(key).isSubscribed
66
- ? of(void 0).pipe(take(1))
67
- : _this.subscribe$.pipe(filter(function (primitiveManager) {
68
- return _this.getPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive) === key;
69
- }), take(1), map(function () { return void 0; }));
60
+ if (_this.primitiveManagers.has(key))
61
+ return _this.primitiveManagers
62
+ .get(key)
63
+ .subscribed$.asObservable()
64
+ .pipe(map(function () { return undefined; }), take(1));
65
+ return _this.subscribed$.asObservable().pipe(filter(function (primitiveManager) {
66
+ return _this.getPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive) === key;
67
+ }), map(function () { return undefined; }), take(1));
70
68
  }));
71
69
  };
72
70
  /**
@@ -86,6 +84,7 @@ var WebsocketService = /** @class */ (function () {
86
84
  */
87
85
  WebsocketService.prototype.onEvent = function (options) {
88
86
  var _this = this;
87
+ this.connect();
89
88
  var domain = options.domain, service = options.service, primitive = options.primitive;
90
89
  var key = this.getPrimitiveManagerKey(domain, service, primitive);
91
90
  if (this.primitiveManagers.has(key)) {
@@ -97,30 +96,17 @@ var WebsocketService = /** @class */ (function () {
97
96
  primitive: primitive,
98
97
  stompSubscriptions: [],
99
98
  event$: new Subject(),
100
- isSubscribed: false
99
+ subscribed$: new BehaviorSubject(false)
101
100
  };
102
101
  this.primitiveManagers.set(key, primitiveManager);
103
- if (this.isConnected) {
104
- this.createStompSubscriptions(primitiveManager);
105
- return primitiveManager.event$
106
- .asObservable()
107
- .pipe(finalize(function () {
108
- return _this.disconnectPrimitiveOnFinalize(primitiveManager);
109
- }));
110
- }
111
- else {
112
- if (!this.isConnecting) {
113
- this.connect();
114
- }
115
- this.connect$.pipe(first()).subscribe(function () {
116
- _this.createStompSubscriptions(primitiveManager);
117
- });
118
- return primitiveManager.event$
119
- .asObservable()
120
- .pipe(finalize(function () {
121
- return _this.disconnectPrimitiveOnFinalize(primitiveManager);
122
- }));
123
- }
102
+ this.onConnect()
103
+ .pipe(take(1))
104
+ .subscribe(function () {
105
+ _this.createStompSubscriptions(primitiveManager);
106
+ });
107
+ return primitiveManager.event$
108
+ .asObservable()
109
+ .pipe(finalize(function () { return _this.disconnectPrimitiveOnFinalize(primitiveManager); }));
124
110
  };
125
111
  /** @private */
126
112
  WebsocketService.prototype.createStompSubscriptions = function (primitiveManager) {
@@ -132,12 +118,14 @@ var WebsocketService = /** @class */ (function () {
132
118
  stompSubscriptionWithToken,
133
119
  stompSubscriptionWithoutToken
134
120
  ];
135
- primitiveManager.isSubscribed = true;
136
- this.subscribe$.next(primitiveManager);
121
+ primitiveManager.subscribed$.next(true);
122
+ this.subscribed$.next(primitiveManager);
137
123
  };
138
124
  /** @private */
139
125
  WebsocketService.prototype.connect = function () {
140
126
  var _this = this;
127
+ if (this.isConnected || this.isConnecting)
128
+ return;
141
129
  this.createStompClient();
142
130
  this.isConnecting = true;
143
131
  this._stompClient.connect({}, function () {
@@ -145,15 +133,16 @@ var WebsocketService = /** @class */ (function () {
145
133
  _this.isConnected = true;
146
134
  if (_this.wasConnected) {
147
135
  _this.reconnectPrimitives();
148
- _this.connect$.next();
136
+ _this.connected$.next(true);
149
137
  _this.reconnect$.next();
150
138
  }
151
139
  else {
152
140
  _this.wasConnected = true;
153
- _this.connect$.next();
141
+ _this.connected$.next(true);
154
142
  }
155
143
  }, function (error) {
156
144
  _this.isConnected = false;
145
+ _this.connected$.next(false);
157
146
  _this.error$.next(error);
158
147
  race(_this.disconnect$.pipe(take(1), map(function () { return ({ wasDisconnected: true }); })), timer(WebsocketService_1.RECONNECT_INTERVAL).pipe(take(1), switchMap(function () {
159
148
  return iif(function () { return document.hidden; }, fromEvent(document, 'visibilitychange').pipe(first()), of(void 0));
@@ -219,6 +208,7 @@ var WebsocketService = /** @class */ (function () {
219
208
  this.isConnected = false;
220
209
  this.isConnecting = false;
221
210
  this.wasConnected = false;
211
+ this.connected$.next(false);
222
212
  this.disconnect$.next();
223
213
  };
224
214
  /** @private */
@@ -308,6 +298,7 @@ var WebsocketService = /** @class */ (function () {
308
298
  }
309
299
  finally { if (e_6) throw e_6.error; }
310
300
  }
301
+ primitiveManager.subscribed$.complete();
311
302
  var key = this.getPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive);
312
303
  this.primitiveManagers.delete(key);
313
304
  this.disconnect();
@@ -336,4 +327,4 @@ var WebsocketService = /** @class */ (function () {
336
327
  return WebsocketService;
337
328
  }());
338
329
  export { WebsocketService };
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0gsS0FBSyxFQUVSLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUVILE9BQU8sRUFDUCxTQUFTLEVBQ1QsR0FBRyxFQUNILEVBQUUsRUFDRixJQUFJLEVBQ0osS0FBSyxFQUNSLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7O0FBZXhDO0lBb0RJO1FBN0JBLGVBQWU7UUFDUCxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUU3QixlQUFlO1FBQ1AsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFNUIsZUFBZTtRQUNQLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQWU7UUFDRSxzQkFBaUIsR0FBa0MsSUFBSSxHQUFHLEVBR3hFLENBQUM7UUFFSixlQUFlO1FBQ1AsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFdkMsZUFBZTtRQUNQLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUUxQyxlQUFlO1FBQ1AsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFekMsZUFBZTtRQUNQLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO1FBRXpCLGVBQVUsR0FB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aUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNuQzs7Ozs7Ozs7O1FBRUQsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUNuQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQ3ZCLGdCQUFnQixDQUFDLE9BQU8sRUFDeEIsZ0JBQWdCLENBQUMsU0FBUyxDQUM3QixDQUFDO1FBRUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGVBQWU7SUFDUCxpREFBc0IsR0FBOUIsVUFDSSxNQUFjLEVBQ2QsT0FBZSxFQUNmLFNBQWlCO1FBRWpCLE9BQVUsTUFBTSxTQUFJLE9BQU8sU0FBSSxTQUFXLENBQUM7SUFDL0MsQ0FBQzs7SUE5WmUsbUNBQWtCLEdBQUcsSUFBSSxDQUFDO0lBRW5DLG1DQUFrQixHQUFHLEtBQUssQ0FBQztJQUVsQyxlQUFlO0lBQ0EsZ0NBQWUsR0FBRyxxQkFBcUIsQ0FBQztJQUV2RCxlQUFlO0lBQ0EsNkJBQVksR0FBRyxrQkFBa0IsQ0FBQztJQUVqRCxlQUFlO0lBQ0Esc0JBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FDckQsQ0FBQztJQUVGLGVBQWU7SUFDQSw4QkFBYSxHQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs7SUFsQnpELGdCQUFnQjtRQUg1QixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csZ0JBQWdCLENBZ2E1QjsyQkFqY0Q7Q0FpY0MsQUFoYUQsSUFnYUM7U0FoYVksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgQ29tcGF0Q2xpZW50LFxyXG4gICAgRnJhbWVJbXBsLFxyXG4gICAgU3RvbXAsXHJcbiAgICBTdG9tcFN1YnNjcmlwdGlvblxyXG59IGZyb20gJ0BzdG9tcC9zdG9tcGpzJztcclxuaW1wb3J0ICogYXMgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xyXG5pbXBvcnQge1xyXG4gICAgT2JzZXJ2YWJsZSxcclxuICAgIFN1YmplY3QsXHJcbiAgICBmcm9tRXZlbnQsXHJcbiAgICBpaWYsXHJcbiAgICBvZixcclxuICAgIHJhY2UsXHJcbiAgICB0aW1lclxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGZpbmFsaXplLCBmaXJzdCwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCAqIGFzIFNvY2tKUyBmcm9tICdzb2NranMtY2xpZW50JztcclxuXHJcbi8qKiBAcHJpdmF0ZSAqL1xyXG5pbnRlcmZhY2UgUHJpbWl0aXZlTWFuYWdlciB7XHJcbiAgICBkb21haW46IHN0cmluZztcclxuICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgIHByaW1pdGl2ZTogc3RyaW5nO1xyXG4gICAgc3RvbXBTdWJzY3JpcHRpb25zOiBTdG9tcFN1YnNjcmlwdGlvbltdO1xyXG4gICAgZXZlbnQkOiBTdWJqZWN0PGFueT47XHJcbiAgICBpc1N1YnNjcmliZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0U2VydmljZSB7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgUkVDT05ORUNUX0lOVEVSVkFMID0gMzAwMDtcclxuXHJcbiAgICBzdGF0aWMgQ09OTkVDVElPTl9USU1FT1VUID0gMTUwMDA7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBCQVNFX1VSTF9DT09LSUUgPSAnY29tLnNlbmlvci5iYXNlLnVybCc7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSAnY29tLnNlbmlvci50b2tlbic7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTiA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgQ29va2llcy5nZXQoV2Vic29ja2V0U2VydmljZS5UT0tFTl9DT09LSUUpIHx8ICd7fSdcclxuICAgICk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBXRUJTT0NLRVRfVVJMID1cclxuICAgICAgICBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyAnL3dlYnNvY2tldC8nO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfc3RvbXBDbGllbnQ6IENvbXBhdENsaWVudDtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgd2FzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmltaXRpdmVNYW5hZ2VyczogTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4gPSBuZXcgTWFwPFxyXG4gICAgICAgIHN0cmluZyxcclxuICAgICAgICBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICA+KCk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZXJyb3IkID0gbmV3IFN1YmplY3Q8RnJhbWVJbXBsPigpO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PFByaW1pdGl2ZU1hbmFnZXI+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEgcGVsYSBwcmltZWlyYSB2ZXouXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYSBwZWxhIHByaW1laXJhIHZlei5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCB0aGlzLndhc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKS5waXBlKHRha2UoMSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdCQuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZGVzY29uZWN0YWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGRlc2NvbmVjdGFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0JC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJlY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBhcMOzcyBvIHN1YnNjcmliZSBkbyBldmVudG8gcGVsYSBwcmltZWlyYSB2ZXouXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gYXDDs3MgbyBzdWJzY3JpYmUgZG8gZXZlbnRvIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TdWJzY3JpYmUoe1xyXG4gICAgICAgIGRvbWFpbixcclxuICAgICAgICBzZXJ2aWNlLFxyXG4gICAgICAgIHByaW1pdGl2ZVxyXG4gICAgfToge1xyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nO1xyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZztcclxuICAgIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5vbkNvbm5lY3QoKS5waXBlKFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoXHJcbiAgICAgICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKGtleSkgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChrZXkpLmlzU3Vic2NyaWJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9mKHZvaWQgMCkucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3Vic2NyaWJlJC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpbWl0aXZlTWFuYWdlcikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9PT0ga2V5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB2b2lkIDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTxGcmFtZUltcGw+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25FcnJvcigpOiBPYnNlcnZhYmxlPEZyYW1lSW1wbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlUGFyYW0gYDxUPmAgVGlwbyBkbyBvYmpldG8gcXVlIG8gcmV0b3JubyBkbyBgb2JzZXJ2YWJsZWAgdmFpIGRldm9sdmVyLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT2JqZXRvIGRlIGNvbmZpZ3VyYcOnw6NvIGRvIGV2ZW50by5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmRvbWFpbiBEb23DrW5pbyBkYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXJ2aWNlIFNlcnZpw6dvIGRhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnByaW1pdGl2ZSAgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiLlxyXG4gICAgICogQHJldHVybiBVbSBPYnNlcnZhYmxlPFQ+IHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkV2ZW50PFQ+KG9wdGlvbnM6IHtcclxuICAgICAgICBkb21haW46IHN0cmluZztcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmc7XHJcbiAgICB9KTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgY29uc3QgeyBkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSB9ID0gb3B0aW9ucztcclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KGtleSkuZXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlciA9IHtcclxuICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXHJcbiAgICAgICAgICAgIHNlcnZpY2U6IHNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbnM6IFtdLFxyXG4gICAgICAgICAgICBldmVudCQ6IG5ldyBTdWJqZWN0PFQ+KCksXHJcbiAgICAgICAgICAgIGlzU3Vic2NyaWJlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnNldChrZXksIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JFxyXG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RQcmltaXRpdmVPbkZpbmFsaXplKHByaW1pdGl2ZU1hbmFnZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5ldmVudCRcclxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmVNYW5hZ2VyKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdpdGhUb2tlblVybCA9IHRoaXMuZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuID0gdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihcclxuICAgICAgICAgICAgd2l0aFRva2VuVXJsLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2l0aG91dFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb25XaXRob3V0VG9rZW4gPSB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKFxyXG4gICAgICAgICAgICB3aXRob3V0VG9rZW5VcmwsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucyA9IFtcclxuICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4sXHJcbiAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5pc1N1YnNjcmliZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlJC5uZXh0KHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvbXBDbGllbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5jb25uZWN0KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53YXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFByaW1pdGl2ZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QkLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53YXNDb25uZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCQubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoZXJyb3I6IEZyYW1lSW1wbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IkLm5leHQoZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJhY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0JC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gKHsgd2FzRGlzY29ubmVjdGVkOiB0cnVlIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZXIoV2Vic29ja2V0U2VydmljZS5SRUNPTk5FQ1RfSU5URVJWQUwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlmKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGRvY3VtZW50LmhpZGRlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICd2aXNpYmlsaXR5Y2hhbmdlJykucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Yodm9pZCAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gKHsgd2FzRGlzY29ubmVjdGVkOiBmYWxzZSB9KSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHsgd2FzRGlzY29ubmVjdGVkIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhd2FzRGlzY29ubmVjdGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISh0aGlzLmlzQ29ubmVjdGVkIHx8IHRoaXMuaXNDb25uZWN0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0T2JzZXJ2ZXJzQ291bnQoKSA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy53YXNDb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0JC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhUb2tlbihcclxuICAgICAgICBkb21haW46IHN0cmluZyxcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmdcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTlxyXG4gICAgICAgICAgICA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoJ0AnKVsxXVxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi5hY2Nlc3NfdG9rZW5cclxuICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHt0b2tlbn0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuKFxyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdCgnQCcpWzFdXHJcbiAgICAgICAgICAgIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKFxyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlclxyXG4gICAgKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCAne30nKTtcclxuXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZXZlbnQkLm5leHQoZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoXHJcbiAgICAgICAgICAgIGAke1dlYnNvY2tldFNlcnZpY2UuV0VCU09DS0VUX1VSTH1zdWJzY3JpcHRpb25gLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICB7IHRpbWVvdXQ6IFdlYnNvY2tldFNlcnZpY2UuQ09OTkVDVElPTl9USU1FT1VUIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50ID0gU3RvbXAub3Zlcih3cyk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGVidWcgPSAoKSA9PiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RQcmltaXRpdmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0T2JzZXJ2ZXJzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JC5vYnNlcnZlcnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyc0NvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShcclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICAvLyBASU1QT1JUQU5UOiBSZXBsYWNlIC5vYnNlcnZlcnMubGVuZ3RoID09PSAxIHdpdGggLm9ic2VydmVkIGluIHJ4anMgNy4wK1xyXG4gICAgICAgIGNvbnN0IGhhc09ic2VydmVycyA9ICEocHJpbWl0aXZlTWFuYWdlci5ldmVudCQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMSk7XHJcblxyXG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnMpIHJldHVybjtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQuY29tcGxldGUoKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZGVsZXRlKGtleSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcmltaXRpdmVNYW5hZ2VyS2V5KFxyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYCR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcbn1cclxuIl19
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0gsS0FBSyxFQUVSLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUNILGVBQWUsRUFFZixPQUFPLEVBQ1AsU0FBUyxFQUNULEdBQUcsRUFDSCxFQUFFLEVBQ0YsSUFBSSxFQUNKLEtBQUssRUFDUixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFDOztBQWV4QztJQUFBO1FBdUJJLGVBQWU7UUFDUCxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUU3QixlQUFlO1FBQ1AsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFNUIsZUFBZTtRQUNQLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQWU7UUFDRSxzQkFBaUIsR0FBa0MsSUFBSSxHQUFHLEVBR3hFLENBQUM7UUFFSixlQUFlO1FBQ0UsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRWxFLGVBQWU7UUFDUCxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFMUMsZUFBZTtRQUNQLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXpDLGVBQWU7UUFDUCxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWEs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LEdBQUcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ25DLGdCQUFnQixDQUFDLE1BQU0sRUFDdkIsZ0JBQWdCLENBQUMsT0FBTyxFQUN4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQzdCLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZUFBZTtJQUNQLGlEQUFzQixHQUE5QixVQUNJLE1BQWMsRUFDZCxPQUFlLEVBQ2YsU0FBaUI7UUFFakIsT0FBVSxNQUFNLFNBQUksT0FBTyxTQUFJLFNBQVcsQ0FBQztJQUMvQyxDQUFDOztJQXJaZSxtQ0FBa0IsR0FBRyxJQUFJLENBQUM7SUFFbkMsbUNBQWtCLEdBQUcsS0FBSyxDQUFDO0lBRWxDLGVBQWU7SUFDQSxnQ0FBZSxHQUFHLHFCQUFxQixDQUFDO0lBRXZELGVBQWU7SUFDQSw2QkFBWSxHQUFHLGtCQUFrQixDQUFDO0lBRWpELGVBQWU7SUFDQSxzQkFBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUNyRCxDQUFDO0lBRUYsZUFBZTtJQUNBLDhCQUFhLEdBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDOztJQWxCekQsZ0JBQWdCO1FBSDVCLFVBQVUsQ0FBQztZQUNSLFVBQVUsRUFBRSxNQUFNO1NBQ3JCLENBQUM7T0FDVyxnQkFBZ0IsQ0F1WjVCOzJCQXpiRDtDQXliQyxBQXZaRCxJQXVaQztTQXZaWSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBDb21wYXRDbGllbnQsXHJcbiAgICBGcmFtZUltcGwsXHJcbiAgICBTdG9tcCxcclxuICAgIFN0b21wU3Vic2NyaXB0aW9uXHJcbn0gZnJvbSAnQHN0b21wL3N0b21wanMnO1xyXG5pbXBvcnQgKiBhcyBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XHJcbmltcG9ydCB7XHJcbiAgICBCZWhhdmlvclN1YmplY3QsXHJcbiAgICBPYnNlcnZhYmxlLFxyXG4gICAgU3ViamVjdCxcclxuICAgIGZyb21FdmVudCxcclxuICAgIGlpZixcclxuICAgIG9mLFxyXG4gICAgcmFjZSxcclxuICAgIHRpbWVyXHJcbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgZmluYWxpemUsIGZpcnN0LCBtYXAsIHN3aXRjaE1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0ICogYXMgU29ja0pTIGZyb20gJ3NvY2tqcy1jbGllbnQnO1xyXG5cclxuLyoqIEBwcml2YXRlICovXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIGRvbWFpbjogc3RyaW5nO1xyXG4gICAgc2VydmljZTogc3RyaW5nO1xyXG4gICAgcHJpbWl0aXZlOiBzdHJpbmc7XHJcbiAgICBzdG9tcFN1YnNjcmlwdGlvbnM6IFN0b21wU3Vic2NyaXB0aW9uW107XHJcbiAgICBldmVudCQ6IFN1YmplY3Q8YW55PjtcclxuICAgIHN1YnNjcmliZWQkOiBCZWhhdmlvclN1YmplY3Q8Qm9vbGVhbj47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0U2VydmljZSB7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgUkVDT05ORUNUX0lOVEVSVkFMID0gMzAwMDtcclxuXHJcbiAgICBzdGF0aWMgQ09OTkVDVElPTl9USU1FT1VUID0gMTUwMDA7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBCQVNFX1VSTF9DT09LSUUgPSAnY29tLnNlbmlvci5iYXNlLnVybCc7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSAnY29tLnNlbmlvci50b2tlbic7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTiA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgQ29va2llcy5nZXQoV2Vic29ja2V0U2VydmljZS5UT0tFTl9DT09LSUUpIHx8ICd7fSdcclxuICAgICk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBXRUJTT0NLRVRfVVJMID1cclxuICAgICAgICBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyAnL3dlYnNvY2tldC8nO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfc3RvbXBDbGllbnQ6IENvbXBhdENsaWVudDtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgd2FzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmltaXRpdmVNYW5hZ2VyczogTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4gPSBuZXcgTWFwPFxyXG4gICAgICAgIHN0cmluZyxcclxuICAgICAgICBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICA+KCk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3RlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZXJyb3IkID0gbmV3IFN1YmplY3Q8RnJhbWVJbXBsPigpO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlZCQgPSBuZXcgU3ViamVjdDxQcmltaXRpdmVNYW5hZ2VyPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEgcGVsYSBwcmltZWlyYSB2ZXouXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkJC5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgICAgICAgICBmaWx0ZXIoQm9vbGVhbiksXHJcbiAgICAgICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxyXG4gICAgICAgICAgICB0YWtlKDEpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZGVzY29uZWN0YWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGRlc2NvbmVjdGFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0JC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJlY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBhcMOzcyBvIHN1YnNjcmliZSBkbyBldmVudG8gcGVsYSBwcmltZWlyYSB2ZXouXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gYXDDs3MgbyBzdWJzY3JpYmUgZG8gZXZlbnRvIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TdWJzY3JpYmUoe1xyXG4gICAgICAgIGRvbWFpbixcclxuICAgICAgICBzZXJ2aWNlLFxyXG4gICAgICAgIHByaW1pdGl2ZVxyXG4gICAgfToge1xyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nO1xyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZztcclxuICAgIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5vbkNvbm5lY3QoKS5waXBlKFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKGtleSkpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpbWl0aXZlTWFuYWdlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldChrZXkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmVkJC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmliZWQkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAocHJpbWl0aXZlTWFuYWdlcikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJpbWl0aXZlTWFuYWdlcktleShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT09IGtleVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gb2NvcnJlIGFsZ3VtIGVycm8uXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPEZyYW1lSW1wbD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gb2NvcnJlIGFsZ3VtIGVycm8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkVycm9yKCk6IE9ic2VydmFibGU8RnJhbWVJbXBsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIG9iamV0byBxdWUgbyByZXRvcm5vIGRvIGBvYnNlcnZhYmxlYCB2YWkgZGV2b2x2ZXIuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPYmpldG8gZGUgY29uZmlndXJhw6fDo28gZG8gZXZlbnRvLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZG9tYWluIERvbcOtbmlvIGRhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnNlcnZpY2UgU2VydmnDp28gZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucHJpbWl0aXZlICBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIuXHJcbiAgICAgKiBAcmV0dXJuIFVtIE9ic2VydmFibGU8VD4gcXVlIGVtaXRlIG5vdGlmaWNhw6fDtWVzIHRvZGEgdmV6IHF1ZSBvIHJlc3BlY3Rpdm8gZXZlbnRvIMOpIHB1YmxpY2Fkby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4ob3B0aW9uczoge1xyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nO1xyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZztcclxuICAgIH0pOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSB9ID0gb3B0aW9ucztcclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KGtleSkuZXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlciA9IHtcclxuICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXHJcbiAgICAgICAgICAgIHNlcnZpY2U6IHNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbnM6IFtdLFxyXG4gICAgICAgICAgICBldmVudCQ6IG5ldyBTdWJqZWN0PFQ+KCksXHJcbiAgICAgICAgICAgIHN1YnNjcmliZWQkOiBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuc2V0KGtleSwgcHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgIHRoaXMub25Db25uZWN0KClcclxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JFxyXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5kaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmVNYW5hZ2VyKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdpdGhUb2tlblVybCA9IHRoaXMuZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuID0gdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihcclxuICAgICAgICAgICAgd2l0aFRva2VuVXJsLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2l0aG91dFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb25XaXRob3V0VG9rZW4gPSB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKFxyXG4gICAgICAgICAgICB3aXRob3V0VG9rZW5VcmwsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucyA9IFtcclxuICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4sXHJcbiAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJzY3JpYmVkJC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZCQubmV4dChwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCB0aGlzLmlzQ29ubmVjdGluZykgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZVN0b21wQ2xpZW50KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuY29ubmVjdChcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2FzQ29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RQcmltaXRpdmVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkJC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FzQ29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZCQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycm9yOiBGcmFtZUltcGwpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkJC5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yJC5uZXh0KGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICByYWNlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCQucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+ICh7IHdhc0Rpc2Nvbm5lY3RlZDogdHJ1ZSB9KSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVyKFdlYnNvY2tldFNlcnZpY2UuUkVDT05ORUNUX0lOVEVSVkFMKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBkb2N1bWVudC5oaWRkZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAndmlzaWJpbGl0eWNoYW5nZScpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mKHZvaWQgMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+ICh7IHdhc0Rpc2Nvbm5lY3RlZDogZmFsc2UgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6ICh7IHdhc0Rpc2Nvbm5lY3RlZCB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXdhc0Rpc2Nvbm5lY3RlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEodGhpcy5pc0Nvbm5lY3RlZCB8fCB0aGlzLmlzQ29ubmVjdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdldE9ic2VydmVyc0NvdW50KCkgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gb2YgcHJpbWl0aXZlTWFuYWdlci5zdG9tcFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZXZlbnQkLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmNsZWFyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWFjdGl2YXRlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMud2FzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuY29ubmVjdGVkJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKFxyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdCgnQCcpWzFdXHJcbiAgICAgICAgICAgIDogbnVsbDtcclxuICAgICAgICBjb25zdCB0b2tlbiA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU5cclxuICAgICAgICAgICAgPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLmFjY2Vzc190b2tlblxyXG4gICAgICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBgL3RvcGljLyR7dGVuYW50fS8ke3Rva2VufS8ke2RvbWFpbn0vJHtzZXJ2aWNlfS8ke3ByaW1pdGl2ZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oXHJcbiAgICAgICAgZG9tYWluOiBzdHJpbmcsXHJcbiAgICAgICAgc2VydmljZTogc3RyaW5nLFxyXG4gICAgICAgIHByaW1pdGl2ZTogc3RyaW5nXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU5cclxuICAgICAgICAgICAgPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLnVzZXJuYW1lLnNwbGl0KCdAJylbMV1cclxuICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24oXHJcbiAgICAgICAgZGVzdGluYXRpb246IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICApOiBTdG9tcFN1YnNjcmlwdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b21wQ2xpZW50LnN1YnNjcmliZShkZXN0aW5hdGlvbiwgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UobWVzc2FnZS5ib2R5IHx8ICd7fScpO1xyXG5cclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQubmV4dChldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN0b21wQ2xpZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdzID0gbmV3IFNvY2tKUyhcclxuICAgICAgICAgICAgYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHJlY29ubmVjdFByaW1pdGl2ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYnNlcnZlcnNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBvYnNlcnZlcnNDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyc0NvdW50ICs9IHByaW1pdGl2ZU1hbmFnZXIuZXZlbnQkLm9ic2VydmVycy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2JzZXJ2ZXJzQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RQcmltaXRpdmVPbkZpbmFsaXplKFxyXG4gICAgICAgIHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXJcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIC8vIEBJTVBPUlRBTlQ6IFJlcGxhY2UgLm9ic2VydmVycy5sZW5ndGggPT09IDEgd2l0aCAub2JzZXJ2ZWQgaW4gcnhqcyA3LjArXHJcbiAgICAgICAgY29uc3QgaGFzT2JzZXJ2ZXJzID0gIShwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JC5vYnNlcnZlcnMubGVuZ3RoID09PSAxKTtcclxuXHJcbiAgICAgICAgaWYgKGhhc09ic2VydmVycykgcmV0dXJuO1xyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JC5jb21wbGV0ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uIG9mIHByaW1pdGl2ZU1hbmFnZXIuc3RvbXBTdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YnNjcmliZWQkLmNvbXBsZXRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0UHJpbWl0aXZlTWFuYWdlcktleShcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5kb21haW4sXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc2VydmljZSxcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmRlbGV0ZShrZXkpO1xyXG5cclxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0UHJpbWl0aXZlTWFuYWdlcktleShcclxuICAgICAgICBkb21haW46IHN0cmluZyxcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmdcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGAke2RvbWFpbn0vJHtzZXJ2aWNlfS8ke3ByaW1pdGl2ZX1gO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==