@rongcloud/plugin-call 5.2.3 → 5.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,9 +1,9 @@
1
- var ce = Object.defineProperty;
2
- var _e = (s, e, t) => e in s ? ce(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
3
- var f = (s, e, t) => (_e(s, typeof e != "symbol" ? e + "" : e, t), t);
4
- import { EventEmitter as se, ConversationType as D, ErrorCode as J, RTCJoinType as ie, LogL as B, VersionManage as z } from "@rongcloud/engine";
5
- import { RCResolution as he, RCRTCCode as O, RCKickReason as Z } from "@rongcloud/plugin-rtc";
6
- const ue = (s) => {
1
+ var _e = Object.defineProperty;
2
+ var he = (s, e, t) => e in s ? _e(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
3
+ var f = (s, e, t) => (he(s, typeof e != "symbol" ? e + "" : e, t), t);
4
+ import { EventEmitter as ie, ConversationType as D, ErrorCode as W, isUndefined as ge, isBoolean as de, isString as Y, RTCJoinType as ne, LogL as K, VersionManage as q } from "@rongcloud/engine";
5
+ import { RCResolution as ue, RCRTCCode as p, RCKickReason as Q } from "@rongcloud/plugin-rtc";
6
+ const fe = (s) => {
7
7
  const e = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""), t = e.length + 1;
8
8
  let i = +s;
9
9
  const n = [];
@@ -12,91 +12,46 @@ const ue = (s) => {
12
12
  i = (i - o) / t, n.unshift(e[o]);
13
13
  } while (i);
14
14
  return n.join("");
15
- }, ge = () => "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (s) => {
15
+ }, Ie = () => "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (s) => {
16
16
  const e = Math.random() * 16 | 0;
17
17
  return (s === "x" ? e : e & 3 | 8).toString(16);
18
- }), ne = () => {
19
- let s = ge();
20
- return s = `${s.replace(/-/g, "")}0`, s = parseInt(s, 16), s = ue(s), s.length > 22 && (s = s.slice(0, 22)), s;
21
- }, Q = () => {
18
+ }), oe = () => {
19
+ let s = Ie();
20
+ return s = `${s.replace(/-/g, "")}0`, s = parseInt(s, 16), s = fe(s), s.length > 22 && (s = s.slice(0, 22)), s;
21
+ }, ee = () => {
22
22
  const s = Math.floor(Math.random() * 1e3);
23
- let e = ne();
23
+ let e = oe();
24
24
  return e = e.replace(/\//g, "0"), [e, Date.now(), s].join("_");
25
- }, de = (s, e) => setTimeout(s, e), oe = new se(), X = (s) => {
25
+ }, Re = (s, e) => setTimeout(s, e), re = new ie(), Z = (s) => {
26
26
  const e = "RCCallDeviceId";
27
27
  let t = s.sessionStorage.getItem(e);
28
- return t || (t = ne(), s.sessionStorage.setItem(e, t)), t;
28
+ return t || (t = oe(), s.sessionStorage.setItem(e, t)), t;
29
29
  };
30
- var b = /* @__PURE__ */ ((s) => (s[s.OUTGOING = 1] = "OUTGOING", s[s.INCOMING = 2] = "INCOMING", s[s.RINGING = 3] = "RINGING", s[s.CONNECTED = 4] = "CONNECTED", s[s.IDLE = 5] = "IDLE", s[s.ACCEPTED = 6] = "ACCEPTED", s))(b || {}), h = /* @__PURE__ */ ((s) => (s[s.SUCCESS = 1e4] = "SUCCESS", s[s.STATE_MACHINE_EXIT = 53200] = "STATE_MACHINE_EXIT", s[s.SEND_MSG_ERROR = 53201] = "SEND_MSG_ERROR", s[s.REJECTED_BY_BLACKLIST = 53202] = "REJECTED_BY_BLACKLIST", s[s.NOT_IN_GROUP = 53203] = "NOT_IN_GROUP", s[s.GET_LOCAL_AUDIO_TRACK_ERROR = 53301] = "GET_LOCAL_AUDIO_TRACK_ERROR", s[s.GET_LOCAL_VIDEO_TRACK_ERROR = 53302] = "GET_LOCAL_VIDEO_TRACK_ERROR", s[s.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR = 53303] = "GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR", s[s.JOIN_ROOM_ERROR = 53304] = "JOIN_ROOM_ERROR", s[s.AUDIO_PUBLISH_ERROR = 53305] = "AUDIO_PUBLISH_ERROR", s[s.VIDEO_PUBLISH_ERROR = 53306] = "VIDEO_PUBLISH_ERROR", s[s.AUDIO_AND_VIDEO_PUBLISH_ERROR = 53307] = "AUDIO_AND_VIDEO_PUBLISH_ERROR", s[s.QUERY_JOINED_USER_INFO_ERROR = 53308] = "QUERY_JOINED_USER_INFO_ERROR", s[s.MISSING_VIDEO_TRACK_ERROR = 53309] = "MISSING_VIDEO_TRACK_ERROR", s[s.UNPUBLISH_VIDEO_ERROR = 53310] = "UNPUBLISH_VIDEO_ERROR", s[s.CONVERSATION_NOT_GROUP_ERROR = 53311] = "CONVERSATION_NOT_GROUP_ERROR", s[s.NOT_IN_ROOM_ERROR = 53312] = "NOT_IN_ROOM_ERROR", s))(h || {}), g = /* @__PURE__ */ ((s) => (s[s.CANCEL = 1] = "CANCEL", s[s.REJECT = 2] = "REJECT", s[s.HANGUP = 3] = "HANGUP", s[s.BUSY_LINE = 4] = "BUSY_LINE", s[s.NO_RESPONSE = 5] = "NO_RESPONSE", s[s.ENGINE_UNSUPPORTED = 6] = "ENGINE_UNSUPPORTED", s[s.NETWORK_ERROR = 7] = "NETWORK_ERROR", s[s.GET_MEDIA_RESOURCES_ERROR = 8] = "GET_MEDIA_RESOURCES_ERROR", s[s.PUBLISH_ERROR = 9] = "PUBLISH_ERROR", s[s.SUBSCRIBE_ERROR = 10] = "SUBSCRIBE_ERROR", s[s.REMOTE_CANCEL = 11] = "REMOTE_CANCEL", s[s.REMOTE_REJECT = 12] = "REMOTE_REJECT", s[s.REMOTE_HANGUP = 13] = "REMOTE_HANGUP", s[s.REMOTE_BUSY_LINE = 14] = "REMOTE_BUSY_LINE", s[s.REMOTE_NO_RESPONSE = 15] = "REMOTE_NO_RESPONSE", s[s.REMOTE_ENGINE_UNSUPPORTED = 16] = "REMOTE_ENGINE_UNSUPPORTED", s[s.REMOTE_NETWORK_ERROR = 17] = "REMOTE_NETWORK_ERROR", s[s.REMOTE_GET_MEDIA_RESOURCE_ERROR = 18] = "REMOTE_GET_MEDIA_RESOURCE_ERROR", s[s.REMOTE_PUBLISH_ERROR = 19] = "REMOTE_PUBLISH_ERROR", s[s.REMOTE_SUBSCRIBE_ERROR = 20] = "REMOTE_SUBSCRIBE_ERROR", s[s.OTHER_CLIENT_JOINED_CALL = 21] = "OTHER_CLIENT_JOINED_CALL", s[s.OTHER_CLIENT_IN_CALL = 22] = "OTHER_CLIENT_IN_CALL", s[s.KICKED_BY_SERVER = 23] = "KICKED_BY_SERVER", s[s.ACCEPT_SYSTEM_CALL = 24] = "ACCEPT_SYSTEM_CALL", s[s.REMOTE_OTHER_CLIENT_JOINED_CALL = 31] = "REMOTE_OTHER_CLIENT_JOINED_CALL", s[s.REMOTE_OTHER_CLIENT_IN_CALL = 32] = "REMOTE_OTHER_CLIENT_IN_CALL", s[s.REMOTE_KICKED_BY_SERVER = 33] = "REMOTE_KICKED_BY_SERVER", s[s.REMOTE_ACCEPT_SYSTEM_CALL = 34] = "REMOTE_ACCEPT_SYSTEM_CALL", s[s.ACCEPT_BY_OTHER_CLIENT = 101] = "ACCEPT_BY_OTHER_CLIENT", s[s.HANGUP_BY_OTHER_CLIENT = 102] = "HANGUP_BY_OTHER_CLIENT", s[s.ADDED_TO_BLACKLIST = 103] = "ADDED_TO_BLACKLIST", s[s.SERVICE_NOT_OPENED = 104] = "SERVICE_NOT_OPENED", s))(g || {});
31
- const H = {
32
- [
33
- 1
34
- /* CANCEL */
35
- ]: 11,
36
- [
37
- 2
38
- /* REJECT */
39
- ]: 12,
40
- [
41
- 3
42
- /* HANGUP */
43
- ]: 13,
44
- [
45
- 4
46
- /* BUSY_LINE */
47
- ]: 14,
48
- [
49
- 5
50
- /* NO_RESPONSE */
51
- ]: 15,
52
- [
53
- 6
54
- /* ENGINE_UNSUPPORTED */
55
- ]: 16,
56
- [
57
- 7
58
- /* NETWORK_ERROR */
59
- ]: 17,
60
- [
61
- 8
62
- /* GET_MEDIA_RESOURCES_ERROR */
63
- ]: 18,
64
- [
65
- 9
66
- /* PUBLISH_ERROR */
67
- ]: 19,
68
- [
69
- 10
70
- /* SUBSCRIBE_ERROR */
71
- ]: 20,
72
- [
73
- 21
74
- /* OTHER_CLIENT_JOINED_CALL */
75
- ]: 31,
76
- [
77
- 22
78
- /* OTHER_CLIENT_IN_CALL */
79
- ]: 32,
80
- [
81
- 23
82
- /* KICKED_BY_SERVER */
83
- ]: 33,
84
- [
85
- 15
86
- /* REMOTE_NO_RESPONSE */
87
- ]: 5,
88
- [
89
- 24
90
- /* ACCEPT_SYSTEM_CALL */
91
- ]: 34
30
+ var b = /* @__PURE__ */ ((s) => (s[s.OUTGOING = 1] = "OUTGOING", s[s.INCOMING = 2] = "INCOMING", s[s.RINGING = 3] = "RINGING", s[s.CONNECTED = 4] = "CONNECTED", s[s.IDLE = 5] = "IDLE", s[s.ACCEPTED = 6] = "ACCEPTED", s))(b || {}), l = /* @__PURE__ */ ((s) => (s[s.SUCCESS = 1e4] = "SUCCESS", s[s.STATE_MACHINE_EXIT = 53200] = "STATE_MACHINE_EXIT", s[s.SEND_MSG_ERROR = 53201] = "SEND_MSG_ERROR", s[s.REJECTED_BY_BLACKLIST = 53202] = "REJECTED_BY_BLACKLIST", s[s.NOT_IN_GROUP = 53203] = "NOT_IN_GROUP", s[s.GET_LOCAL_AUDIO_TRACK_ERROR = 53301] = "GET_LOCAL_AUDIO_TRACK_ERROR", s[s.GET_LOCAL_VIDEO_TRACK_ERROR = 53302] = "GET_LOCAL_VIDEO_TRACK_ERROR", s[s.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR = 53303] = "GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR", s[s.JOIN_ROOM_ERROR = 53304] = "JOIN_ROOM_ERROR", s[s.AUDIO_PUBLISH_ERROR = 53305] = "AUDIO_PUBLISH_ERROR", s[s.VIDEO_PUBLISH_ERROR = 53306] = "VIDEO_PUBLISH_ERROR", s[s.AUDIO_AND_VIDEO_PUBLISH_ERROR = 53307] = "AUDIO_AND_VIDEO_PUBLISH_ERROR", s[s.QUERY_JOINED_USER_INFO_ERROR = 53308] = "QUERY_JOINED_USER_INFO_ERROR", s[s.MISSING_VIDEO_TRACK_ERROR = 53309] = "MISSING_VIDEO_TRACK_ERROR", s[s.UNPUBLISH_VIDEO_ERROR = 53310] = "UNPUBLISH_VIDEO_ERROR", s[s.CONVERSATION_NOT_GROUP_ERROR = 53311] = "CONVERSATION_NOT_GROUP_ERROR", s[s.NOT_IN_ROOM_ERROR = 53312] = "NOT_IN_ROOM_ERROR", s[s.PARAM_ERROR = 53313] = "PARAM_ERROR", s))(l || {}), d = /* @__PURE__ */ ((s) => (s[s.CANCEL = 1] = "CANCEL", s[s.REJECT = 2] = "REJECT", s[s.HANGUP = 3] = "HANGUP", s[s.BUSY_LINE = 4] = "BUSY_LINE", s[s.NO_RESPONSE = 5] = "NO_RESPONSE", s[s.ENGINE_UNSUPPORTED = 6] = "ENGINE_UNSUPPORTED", s[s.NETWORK_ERROR = 7] = "NETWORK_ERROR", s[s.GET_MEDIA_RESOURCES_ERROR = 8] = "GET_MEDIA_RESOURCES_ERROR", s[s.PUBLISH_ERROR = 9] = "PUBLISH_ERROR", s[s.SUBSCRIBE_ERROR = 10] = "SUBSCRIBE_ERROR", s[s.REMOTE_CANCEL = 11] = "REMOTE_CANCEL", s[s.REMOTE_REJECT = 12] = "REMOTE_REJECT", s[s.REMOTE_HANGUP = 13] = "REMOTE_HANGUP", s[s.REMOTE_BUSY_LINE = 14] = "REMOTE_BUSY_LINE", s[s.REMOTE_NO_RESPONSE = 15] = "REMOTE_NO_RESPONSE", s[s.REMOTE_ENGINE_UNSUPPORTED = 16] = "REMOTE_ENGINE_UNSUPPORTED", s[s.REMOTE_NETWORK_ERROR = 17] = "REMOTE_NETWORK_ERROR", s[s.REMOTE_GET_MEDIA_RESOURCE_ERROR = 18] = "REMOTE_GET_MEDIA_RESOURCE_ERROR", s[s.REMOTE_PUBLISH_ERROR = 19] = "REMOTE_PUBLISH_ERROR", s[s.REMOTE_SUBSCRIBE_ERROR = 20] = "REMOTE_SUBSCRIBE_ERROR", s[s.OTHER_CLIENT_JOINED_CALL = 21] = "OTHER_CLIENT_JOINED_CALL", s[s.OTHER_CLIENT_IN_CALL = 22] = "OTHER_CLIENT_IN_CALL", s[s.KICKED_BY_SERVER = 23] = "KICKED_BY_SERVER", s[s.ACCEPT_SYSTEM_CALL = 24] = "ACCEPT_SYSTEM_CALL", s[s.REMOTE_OTHER_CLIENT_JOINED_CALL = 31] = "REMOTE_OTHER_CLIENT_JOINED_CALL", s[s.REMOTE_OTHER_CLIENT_IN_CALL = 32] = "REMOTE_OTHER_CLIENT_IN_CALL", s[s.REMOTE_KICKED_BY_SERVER = 33] = "REMOTE_KICKED_BY_SERVER", s[s.REMOTE_ACCEPT_SYSTEM_CALL = 34] = "REMOTE_ACCEPT_SYSTEM_CALL", s[s.ACCEPT_BY_OTHER_CLIENT = 101] = "ACCEPT_BY_OTHER_CLIENT", s[s.HANGUP_BY_OTHER_CLIENT = 102] = "HANGUP_BY_OTHER_CLIENT", s[s.ADDED_TO_BLACKLIST = 103] = "ADDED_TO_BLACKLIST", s[s.SERVICE_NOT_OPENED = 104] = "SERVICE_NOT_OPENED", s))(d || {});
31
+ const G = {
32
+ 1: 11,
33
+ 2: 12,
34
+ 3: 13,
35
+ 4: 14,
36
+ 5: 15,
37
+ 6: 16,
38
+ 7: 17,
39
+ 8: 18,
40
+ 9: 19,
41
+ 10: 20,
42
+ 21: 31,
43
+ 22: 32,
44
+ 23: 33,
45
+ 15: 5,
46
+ 24: 34
92
47
  /* REMOTE_ACCEPT_SYSTEM_CALL */
93
48
  };
94
- var R = /* @__PURE__ */ ((s) => (s.VCInvite = "RC:VCInvite", s.VCRinging = "RC:VCRinging", s.VCAccept = "RC:VCAccept", s.VCHangup = "RC:VCHangup", s.VCModifyMem = "RC:VCModifyMem", s.VCModifyMedia = "RC:VCModifyMedia", s))(R || {}), m = /* @__PURE__ */ ((s) => (s[s.WAITING = 0] = "WAITING", s[s.KEEPING = 1] = "KEEPING", s[s.END = 2] = "END", s))(m || {}), T = /* @__PURE__ */ ((s) => (s[s.NONE = 0] = "NONE", s[s.WAITING = 1] = "WAITING", s[s.KEEPING = 2] = "KEEPING", s))(T || {}), G = /* @__PURE__ */ ((s) => (s[s.RCCallRoomTypeNormalCall = 0] = "RCCallRoomTypeNormalCall", s[s.RCCallRoomTypeAcrossCall = 7] = "RCCallRoomTypeAcrossCall", s))(G || {});
49
+ var R = /* @__PURE__ */ ((s) => (s.VCInvite = "RC:VCInvite", s.VCRinging = "RC:VCRinging", s.VCAccept = "RC:VCAccept", s.VCHangup = "RC:VCHangup", s.VCModifyMem = "RC:VCModifyMem", s.VCModifyMedia = "RC:VCModifyMedia", s))(R || {}), T = /* @__PURE__ */ ((s) => (s[s.WAITING = 0] = "WAITING", s[s.KEEPING = 1] = "KEEPING", s[s.END = 2] = "END", s))(T || {}), m = /* @__PURE__ */ ((s) => (s[s.NONE = 0] = "NONE", s[s.WAITING = 1] = "WAITING", s[s.KEEPING = 2] = "KEEPING", s))(m || {}), $ = /* @__PURE__ */ ((s) => (s[s.RCCallRoomTypeNormalCall = 0] = "RCCallRoomTypeNormalCall", s[s.RCCallRoomTypeAcrossCall = 7] = "RCCallRoomTypeAcrossCall", s))($ || {});
95
50
  let V = class {
96
51
  constructor(e, t) {
97
52
  f(this, "_timerId", 0);
98
53
  f(this, "_startTime", 0);
99
- e && (this._timerId = de(() => {
54
+ e && (this._timerId = Re(() => {
100
55
  e();
101
56
  }, t)), this._startTime = Date.now();
102
57
  }
@@ -114,8 +69,8 @@ let V = class {
114
69
  this._startTime = 0;
115
70
  }
116
71
  };
117
- class Y {
118
- constructor(e, t, i, n, o, r, a, c, l) {
72
+ class F {
73
+ constructor(e, t, i, n, o, r, a, h, c) {
119
74
  /**
120
75
  * 房间状态
121
76
  */
@@ -164,9 +119,8 @@ class Y {
164
119
  * 是否是跨 appkey
165
120
  */
166
121
  f(this, "_isCrossAppkey", !1);
167
- f(this, "_hungupPushTitle", "");
168
- f(this, "_hungupPushContent", "");
169
- this._context = e, this._runtime = t, this._logger = i, this._callMsgHandler = n, this._channelId = o, this._conversationType = r, this._targetId = a, this._mediaType = c, this._callId = l, this._callMsgHandler.registerStateMachineEvent(this._callId, "onRinging", this._onRinging.bind(this)), this._callMsgHandler.registerStateMachineEvent(this._callId, "onAccept", this._onAccept.bind(this)), this._callMsgHandler.registerStateMachineEvent(this._callId, "onMediaModify", this._onMediaModify.bind(this)), this._callMsgHandler.registerStateMachineEvent(this._callId, "onHungup", this._onHungup.bind(this));
122
+ f(this, "_hungupPushConfig");
123
+ this._context = e, this._runtime = t, this._logger = i, this._callMsgHandler = n, this._channelId = o, this._conversationType = r, this._targetId = a, this._mediaType = h, this._callId = c, this._callMsgHandler.registerStateMachineEvent(this._callId, "onRinging", this._onRinging.bind(this)), this._callMsgHandler.registerStateMachineEvent(this._callId, "onAccept", this._onAccept.bind(this)), this._callMsgHandler.registerStateMachineEvent(this._callId, "onMediaModify", this._onMediaModify.bind(this)), this._callMsgHandler.registerStateMachineEvent(this._callId, "onHungup", this._onHungup.bind(this));
170
124
  }
171
125
  /**
172
126
  * 获取校正后超时时间
@@ -188,7 +142,7 @@ class Y {
188
142
  this._logger.warn("_", `[RCCallStateMachine] notifyStateChange -> info: ${JSON.stringify({
189
143
  state: e,
190
144
  reason: t
191
- })}`), this._endReason = t || null, this._sessionState !== e && (this._sessionState = e, (i = this._watchers) == null || i.onStateChange({ state: e, reason: t })), e === m.END && (oe.emit("onStateMachineClose", this._callId), this._callMsgHandler.unregisterStateMachineEvent(this._callId));
145
+ })}`), this._endReason = t || null, this._sessionState !== e && (this._sessionState = e, (i = this._watchers) == null || i.onStateChange({ state: e, reason: t })), e === T.END && (re.emit("onStateMachineClose", this._callId), this._callMsgHandler.unregisterStateMachineEvent(this._callId));
192
146
  }
193
147
  /**
194
148
  * 通知 call 层人员状态变更及原因
@@ -204,20 +158,20 @@ class Y {
204
158
  const { senderUserId: t, content: { user: i, reason: n }, messageType: o } = e;
205
159
  this._userInfo[t] = {
206
160
  userId: t,
207
- state: T.NONE,
161
+ state: m.NONE,
208
162
  isCaller: !1,
209
163
  isRemote: !1
210
164
  };
211
165
  for (const a in this._userTimers)
212
166
  this._clearTimerById(a);
213
- let r = g.ACCEPT_BY_OTHER_CLIENT;
214
- o === R.VCHangup && (n === g.BUSY_LINE ? r = g.OTHER_CLIENT_IN_CALL : n === g.NO_RESPONSE ? r = g.NO_RESPONSE : r = g.HANGUP_BY_OTHER_CLIENT), Object.assign(this._userInfo[t], i), this._notifyUserStateChange(this._userInfo[t], r), this._notifyStateChange(m.END, r);
167
+ let r = d.ACCEPT_BY_OTHER_CLIENT;
168
+ o === R.VCHangup && (n === d.BUSY_LINE ? r = d.OTHER_CLIENT_IN_CALL : n === d.NO_RESPONSE ? r = d.NO_RESPONSE : r = d.HANGUP_BY_OTHER_CLIENT), Object.assign(this._userInfo[t], i), this._notifyUserStateChange(this._userInfo[t], r), this._notifyStateChange(T.END, r);
215
169
  }
216
170
  /**
217
171
  * 正在通话中,且不是当前已接通用户设备(deviceId)发来的消息
218
172
  */
219
173
  _isRemoteInvalidMsg(e, t) {
220
- return !this._userInfo[e] || !this._userInfo[e].deviceId || !t ? !1 : this._userInfo[e].state === T.KEEPING && this._userInfo[e].deviceId !== t;
174
+ return !this._userInfo[e] || !this._userInfo[e].deviceId || !t ? !1 : this._userInfo[e].state === m.KEEPING && this._userInfo[e].deviceId !== t;
221
175
  }
222
176
  _onRinging(e) {
223
177
  const { senderUserId: t, content: { user: i, deviceId: n } } = e, o = this._isCrossAppkey ? t.split("_")[1] : t;
@@ -237,16 +191,16 @@ class Y {
237
191
  this._otherClientHandle(e);
238
192
  return;
239
193
  }
240
- this._userTimers[r] && this._clearTimerById(r), (this._conversationType === D.PRIVATE ? [a, r] : [r]).forEach((l) => {
241
- const _ = l === a;
242
- this._userInfo[l] = {
243
- userId: l,
244
- state: T.KEEPING,
194
+ this._userTimers[r] && this._clearTimerById(r), (this._conversationType === D.PRIVATE ? [a, r] : [r]).forEach((c) => {
195
+ const _ = c === a;
196
+ this._userInfo[c] = {
197
+ userId: c,
198
+ state: m.KEEPING,
245
199
  isCaller: _,
246
200
  isRemote: _,
247
- deviceId: _ ? X(this._runtime) : n
248
- }, _ || (this._beginTimestamp = Date.now(), Object.assign(this._userInfo[r], i)), this._notifyUserStateChange(this._userInfo[l]);
249
- }), this.getCallerId() === a && this._notifyStateChange(m.KEEPING), this._watchers.onAccept({ userId: r });
201
+ deviceId: _ ? Z(this._runtime) : n
202
+ }, _ || (this._beginTimestamp = Date.now(), Object.assign(this._userInfo[r], i)), this._notifyUserStateChange(this._userInfo[c]);
203
+ }), this.getCallerId() === a && this._notifyStateChange(T.KEEPING), this._watchers.onAccept({ userId: r });
250
204
  }
251
205
  _onMediaModify(e) {
252
206
  const { senderUserId: t, content: { mediaType: i, user: n, deviceId: o } } = e;
@@ -260,22 +214,22 @@ class Y {
260
214
  }));
261
215
  }
262
216
  _onHungup(e) {
263
- const { senderUserId: t, content: i } = e, n = this._isCrossAppkey ? t.split("_")[1] : t, { reason: o, user: r, deviceId: a } = i, c = this._context.getCurrentId();
217
+ const { senderUserId: t, content: i } = e, n = this._isCrossAppkey ? t.split("_")[1] : t, { reason: o, user: r, deviceId: a } = i, h = this._context.getCurrentId();
264
218
  if (this._isRemoteInvalidMsg(n, a)) {
265
219
  this._logger.debug("_", "[RCCallStateMachine] _onHungup -> not the remote device that is currently talking");
266
220
  return;
267
221
  }
268
- if (c === n) {
222
+ if (h === n) {
269
223
  this._otherClientHandle(e);
270
224
  return;
271
225
  }
272
- if (this._sessionState === m.END) {
226
+ if (this._sessionState === T.END) {
273
227
  this._logger.info("_", `[RCCallStateMachine] Invalid hang up message, current room status has ended -> sessionState: ${this._sessionState}`);
274
228
  return;
275
229
  }
276
- this._userInfo[n] && (this._userInfo[n].state = T.NONE, this._endTimestamp = Date.now(), Object.assign(this._userInfo[n], r), this._notifyUserStateChange(this._userInfo[n], H[o]), delete this._userInfo[n]), H[o] === g.REMOTE_CANCEL ? this.getRemoteUserIds().length < 1 && this._clearTimerById(c) : this.getInviterId() === c ? this._clearTimerById(n) : this.getRemoteUserIds().length < 1 && this._clearTimerById(c);
277
- const l = Object.keys(this._userInfo).length < 2, _ = this._inviterId === n, d = Object.values(this._userInfo).every((I) => I.state !== T.KEEPING);
278
- (l || _ && d) && this._notifyStateChange(m.END, H[o]), this._watchers.onHungup({ userId: n, ...r }, H[o]);
230
+ this._userInfo[n] && (this._userInfo[n].state = m.NONE, this._endTimestamp = Date.now(), Object.assign(this._userInfo[n], r), this._notifyUserStateChange(this._userInfo[n], G[o]), delete this._userInfo[n]), G[o] === d.REMOTE_CANCEL ? this.getRemoteUserIds().length < 1 && this._clearTimerById(h) : this.getInviterId() === h ? this._clearTimerById(n) : this.getRemoteUserIds().length < 1 && this._clearTimerById(h);
231
+ const c = Object.keys(this._userInfo).length < 2, _ = this._inviterId === n, u = Object.values(this._userInfo).every((S) => S.state !== m.KEEPING);
232
+ (c || _ && u) && this._notifyStateChange(T.END, G[o]), this._watchers.onHungup({ userId: n, ...r }, G[o]);
279
233
  }
280
234
  /**
281
235
  * 注册事件监听
@@ -293,38 +247,38 @@ class Y {
293
247
  inviteUserIds: o,
294
248
  user: r,
295
249
  deviceId: a,
296
- roomType: c
250
+ roomType: h
297
251
  } = i;
298
- let l;
299
- c === G.RCCallRoomTypeAcrossCall ? ([, l] = t.split("_"), this._watchers.crossAppkey(!0), this._isCrossAppkey = !0) : l = t;
252
+ let c;
253
+ h === $.RCCallRoomTypeAcrossCall ? ([, c] = t.split("_"), this._watchers.crossAppkey(!0), this._isCrossAppkey = !0) : c = t;
300
254
  const _ = this._context.getCurrentId();
301
- if (this._isRemoteInvalidMsg(l, a)) {
255
+ if (this._isRemoteInvalidMsg(c, a)) {
302
256
  this._logger.debug("_", "[RCCallStateMachine] __onInvite -> not the remote device that is currently talking");
303
257
  return;
304
258
  }
305
- if (_ === l)
259
+ if (_ === c)
306
260
  return;
307
- this._callerId = this._inviterId = l;
308
- const d = [t, ...o];
261
+ this._callerId = this._inviterId = c;
262
+ const u = [t, ...o];
309
263
  this._callMsgHandler.sendRinging({
310
264
  conversationType: this._conversationType,
311
265
  targetId: this._targetId,
312
266
  channelId: this._channelId,
313
267
  callId: this._callId,
314
- userIds: d.filter((u) => this._isCrossAppkey ? u.split("_")[1] !== _ : u !== _)
268
+ userIds: u.filter((g) => this._isCrossAppkey ? g.split("_")[1] !== _ : g !== _)
315
269
  });
316
- const I = this._isCrossAppkey ? [o[0].split("_")[1]] : o;
317
- [l, ...I].forEach((u) => {
318
- this._userInfo[u] = {
319
- userId: u,
320
- state: T.WAITING,
321
- isCaller: u === l,
322
- isRemote: u !== _
323
- }, u === l && Object.assign(this._userInfo[u], r, { deviceId: a }), this._notifyUserStateChange(this._userInfo[u]), u !== l && (this._userTimers[u] = new V(() => {
324
- const N = u === _ ? g.NO_RESPONSE : g.REMOTE_NO_RESPONSE;
325
- u === _ ? this._hungupHandle(N) : (this._userInfo[u] && (this._userInfo[u].state = T.NONE), this._notifyUserStateChange(this._userInfo[u]), this._watchers.onHungup(this._userInfo[u], N), delete this._userInfo[u]);
270
+ const S = this._isCrossAppkey ? [o[0].split("_")[1]] : o;
271
+ [c, ...S].forEach((g) => {
272
+ this._userInfo[g] = {
273
+ userId: g,
274
+ state: m.WAITING,
275
+ isCaller: g === c,
276
+ isRemote: g !== _
277
+ }, g === c && Object.assign(this._userInfo[g], r, { deviceId: a }), this._notifyUserStateChange(this._userInfo[g]), g !== c && (this._userTimers[g] = new V(() => {
278
+ const y = g === _ ? d.NO_RESPONSE : d.REMOTE_NO_RESPONSE;
279
+ g === _ ? this._hungupHandle(y, !1) : (this._userInfo[g] && (this._userInfo[g].state = m.NONE), this._notifyUserStateChange(this._userInfo[g]), this._watchers.onHungup(this._userInfo[g], y), delete this._userInfo[g]), this._clearTimerById(g);
326
280
  }, this._getTimeout(n)));
327
- }), this._notifyStateChange(m.WAITING);
281
+ }), this._notifyStateChange(T.WAITING);
328
282
  }
329
283
  /**
330
284
  * 收到 memberModify 消息时状态机更新(CallEngine 内部调用)
@@ -335,54 +289,54 @@ class Y {
335
289
  user: o,
336
290
  existedUserPofiles: r,
337
291
  caller: a,
338
- deviceId: c,
339
- inviteUserIds: l,
292
+ deviceId: h,
293
+ inviteUserIds: c,
340
294
  mediaType: _
341
- } = i, d = this._context.getCurrentId();
342
- if (this._isRemoteInvalidMsg(t, c)) {
295
+ } = i, u = this._context.getCurrentId();
296
+ if (this._isRemoteInvalidMsg(t, h)) {
343
297
  this._logger.debug("_", "[RCCallStateMachine] __onMemberModify -> not the remote device that is currently talking");
344
298
  return;
345
299
  }
346
- if (d === t)
300
+ if (u === t)
347
301
  return;
348
- if (this._callerId = a, this._inviterId = t, l.forEach((E) => {
349
- r.push({ userId: E, mediaType: _, callStatus: b.INCOMING });
350
- }), l.includes(d)) {
351
- const E = [];
352
- r.forEach((u) => {
353
- u.userId !== d && E.push(u.userId);
302
+ if (this._callerId = a, this._inviterId = t, c.forEach((C) => {
303
+ r.push({ userId: C, mediaType: _, callStatus: b.INCOMING });
304
+ }), c.includes(u)) {
305
+ const C = [];
306
+ r.forEach((g) => {
307
+ g.userId !== u && C.push(g.userId);
354
308
  }), this._callMsgHandler.sendRinging({
355
309
  conversationType: this._conversationType,
356
310
  targetId: this._targetId,
357
311
  channelId: this._channelId,
358
312
  callId: this._callId,
359
- userIds: E
360
- }), this._notifyStateChange(m.WAITING);
313
+ userIds: C
314
+ }), this._notifyStateChange(T.WAITING);
361
315
  } else
362
316
  this._watchers.onMemberModify({
363
317
  sender: { userId: t, ...o },
364
- invitedUsers: l.map((E) => ({ userId: E }))
318
+ invitedUsers: c.map((C) => ({ userId: C }))
365
319
  });
366
- r.forEach((E) => {
367
- const { userId: u, callStatus: N } = E;
368
- if (N !== b.IDLE && (this._userInfo[u] = {
369
- userId: u,
370
- state: N !== b.CONNECTED ? T.WAITING : T.KEEPING,
371
- isCaller: t === u,
372
- isRemote: d !== u
373
- }, u === t && Object.assign(this._userInfo[u], o, { deviceId: c }), this._notifyUserStateChange(this._userInfo[u]), N !== b.CONNECTED && !this._userTimers[u])) {
374
- if (!l.includes(u))
320
+ r.forEach((C) => {
321
+ const { userId: g, callStatus: y } = C;
322
+ if (y !== b.IDLE && (this._userInfo[g] = {
323
+ userId: g,
324
+ state: y !== b.CONNECTED ? m.WAITING : m.KEEPING,
325
+ isCaller: t === g,
326
+ isRemote: u !== g
327
+ }, g === t && Object.assign(this._userInfo[g], o, { deviceId: h }), this._notifyUserStateChange(this._userInfo[g]), y !== b.CONNECTED && !this._userTimers[g])) {
328
+ if (!c.includes(g))
375
329
  return;
376
- this._userTimers[u] = new V(() => {
377
- this._userInfo[u] && (this._userInfo[u].state = T.NONE);
378
- const M = u === d ? g.NO_RESPONSE : g.REMOTE_NO_RESPONSE;
379
- this._notifyUserStateChange(this._userInfo[u], M);
330
+ this._userTimers[g] = new V(() => {
331
+ this._userInfo[g] && (this._userInfo[g].state = m.NONE);
332
+ const U = g === u ? d.NO_RESPONSE : d.REMOTE_NO_RESPONSE;
333
+ this._notifyUserStateChange(this._userInfo[g], U);
380
334
  try {
381
- this._watchers.onHungup(this._userInfo[u], M);
382
- } catch (p) {
383
- this._logger.error("_", `[RCCallStateMachine] call onhungup error -> ${p == null ? void 0 : p.stack}`);
335
+ this._watchers.onHungup(this._userInfo[g], U);
336
+ } catch (E) {
337
+ this._logger.error("_", `[RCCallStateMachine] call onhungup error -> ${E == null ? void 0 : E.stack}`);
384
338
  }
385
- delete this._userInfo[u], (Object.keys(this._userInfo).length < 2 || u === d) && this._notifyStateChange(m.END, M);
339
+ delete this._userInfo[g], (Object.keys(this._userInfo).length < 2 || g === u) && this._notifyStateChange(T.END, U), this._clearTimerById(g);
386
340
  }, this._getTimeout(n));
387
341
  }
388
342
  });
@@ -393,13 +347,13 @@ class Y {
393
347
  __handleInviteInSession() {
394
348
  this._logger.info("_", "StateMachine -> __handleInviteInSession");
395
349
  for (const e in this._userInfo)
396
- this._userInfo[e].state && (this._userInfo[e].state = T.NONE), this._notifyUserStateChange(this._userInfo[e]), this._clearTimerById(e);
397
- this._notifyStateChange(m.END, g.BUSY_LINE), this._callMsgHandler.sendHungup({
350
+ this._userInfo[e].state && (this._userInfo[e].state = m.NONE), this._notifyUserStateChange(this._userInfo[e]), this._clearTimerById(e);
351
+ this._notifyStateChange(T.END, d.BUSY_LINE), this._callMsgHandler.sendHungup({
398
352
  channelId: this._channelId,
399
353
  conversationType: this._conversationType,
400
354
  targetId: this._targetId,
401
355
  callId: this._callId,
402
- reason: g.BUSY_LINE,
356
+ reason: d.BUSY_LINE,
403
357
  userIds: this.getRemoteUserIds()
404
358
  });
405
359
  }
@@ -407,41 +361,39 @@ class Y {
407
361
  * 主动呼叫 (CallEngine 内部调用)
408
362
  * @param userIds 被邀请用户 ID 列表
409
363
  * @param extra 消息的扩展信息
410
- * @param pushTitle 通知的标题
411
- * @param pushContent 通知的内容
364
+ * @param pushConfig 移动端推送配置
412
365
  */
413
- async __call(e, t = "", i = "", n = "", o = !1) {
366
+ async __call(e, t = "", i, n = !1) {
414
367
  this._logger.debug("_", `[RCCallStateMachine] invite -> userIds: ${JSON.stringify(e)}`);
415
- const r = this._callerId = this._inviterId = this._context.getCurrentId(), { code: a, message: c } = await this._callMsgHandler.sendInvite({
416
- roomType: o ? G.RCCallRoomTypeAcrossCall : G.RCCallRoomTypeNormalCall,
368
+ const o = this._callerId = this._inviterId = this._context.getCurrentId(), { code: r, message: a } = await this._callMsgHandler.sendInvite({
369
+ roomType: n ? $.RCCallRoomTypeAcrossCall : $.RCCallRoomTypeNormalCall,
417
370
  channelId: this._channelId,
418
371
  conversationType: this._conversationType,
419
372
  targetId: this._targetId,
420
373
  callId: this._callId,
421
374
  extra: t,
422
- pushTitle: i,
423
- pushContent: n,
375
+ pushConfig: i,
424
376
  mediaType: this._mediaType,
425
- inviteUserIds: e.filter((l) => l !== r)
377
+ inviteUserIds: e.filter((h) => h !== o)
426
378
  });
427
- if (this._isCrossAppkey = o, a === h.SUCCESS) {
428
- const { sentTime: l } = c;
429
- (o ? [r, e[0].split("_")[1]] : [r, ...e]).forEach((d) => {
430
- const I = d === r;
431
- this._userInfo[d] = {
432
- userId: d,
433
- state: T.WAITING,
434
- isCaller: I,
435
- isRemote: !I
436
- }, this._notifyUserStateChange(this._userInfo[d]), I || (this._userTimers[d] = new V(() => {
437
- this._userInfo[d] && (this._userInfo[d].state = T.NONE), this._notifyUserStateChange(this._userInfo[d], g.REMOTE_NO_RESPONSE), this._watchers.onHungup(this._userInfo[d], g.REMOTE_NO_RESPONSE), delete this._userInfo[d], Object.keys(this._userInfo).length < 2 && this._notifyStateChange(m.END, g.REMOTE_NO_RESPONSE), this.getRemoteUserIds().length === 0 && this._userInfo[r].state !== T.KEEPING && this._hungupHandle(g.REMOTE_NO_RESPONSE);
438
- }, this._getTimeout(l)));
439
- }), this._notifyStateChange(m.WAITING);
379
+ if (this._isCrossAppkey = n, r === l.SUCCESS) {
380
+ const { sentTime: h } = a;
381
+ (n ? [o, e[0].split("_")[1]] : [o, ...e]).forEach((_) => {
382
+ const u = _ === o;
383
+ this._userInfo[_] = {
384
+ userId: _,
385
+ state: m.WAITING,
386
+ isCaller: u,
387
+ isRemote: !u
388
+ }, this._notifyUserStateChange(this._userInfo[_]), u || (this._userTimers[_] = new V(() => {
389
+ this._userInfo[_] && (this._userInfo[_].state = m.NONE), this._notifyUserStateChange(this._userInfo[_], d.REMOTE_NO_RESPONSE), this._watchers.onHungup(this._userInfo[_], d.REMOTE_NO_RESPONSE), delete this._userInfo[_], Object.keys(this._userInfo).length < 2 && this._notifyStateChange(T.END, d.REMOTE_NO_RESPONSE), this.getRemoteUserIds().length === 0 && this._userInfo[o].state !== m.KEEPING && this._hungupHandle(d.REMOTE_NO_RESPONSE);
390
+ }, this._getTimeout(h)));
391
+ }), this._notifyStateChange(T.WAITING);
440
392
  } else {
441
- const l = a === h.REJECTED_BY_BLACKLIST ? g.ADDED_TO_BLACKLIST : g.NETWORK_ERROR;
442
- this._notifyStateChange(m.END, l);
393
+ const h = r === l.REJECTED_BY_BLACKLIST ? d.ADDED_TO_BLACKLIST : d.NETWORK_ERROR;
394
+ this._notifyStateChange(T.END, h);
443
395
  }
444
- return { code: a };
396
+ return { code: r };
445
397
  }
446
398
  /**
447
399
  * 接听
@@ -456,12 +408,12 @@ class Y {
456
408
  mediaType: this._mediaType,
457
409
  userIds: this.getRemoteUserIds()
458
410
  });
459
- if (this._clearTimerById(e), t === h.SUCCESS)
460
- this._userInfo[e] && (this._userInfo[e].state = T.KEEPING), this._beginTimestamp = Date.now(), this._notifyUserStateChange(this._userInfo[e]), this._notifyStateChange(m.KEEPING);
411
+ if (this._clearTimerById(e), t === l.SUCCESS)
412
+ this._userInfo[e] && (this._userInfo[e].state = m.KEEPING), this._beginTimestamp = Date.now(), this._notifyUserStateChange(this._userInfo[e]), this._notifyStateChange(T.KEEPING);
461
413
  else {
462
- this._userInfo[e] && (this._userInfo[e].state = T.NONE), this._notifyUserStateChange(this._userInfo[e]);
463
- const n = t === h.REJECTED_BY_BLACKLIST ? g.ADDED_TO_BLACKLIST : g.NETWORK_ERROR;
464
- this._notifyStateChange(m.END, n);
414
+ this._userInfo[e] && (this._userInfo[e].state = m.NONE), this._notifyUserStateChange(this._userInfo[e]);
415
+ const n = t === l.REJECTED_BY_BLACKLIST ? d.ADDED_TO_BLACKLIST : d.NETWORK_ERROR;
416
+ this._notifyStateChange(T.END, n);
465
417
  }
466
418
  return { code: t };
467
419
  }
@@ -471,91 +423,91 @@ class Y {
471
423
  */
472
424
  async invite(e, t = {}) {
473
425
  if (this._conversationType !== D.GROUP)
474
- return { code: h.CONVERSATION_NOT_GROUP_ERROR };
426
+ return { code: l.CONVERSATION_NOT_GROUP_ERROR };
475
427
  this._logger.debug("_", `[RCCallStateMachine] invite -> userIds: ${JSON.stringify(e)}`);
476
- const i = this._context.getCurrentId(), n = Object.keys(this._userInfo), o = n.map((d) => {
477
- let I = b.CONNECTED;
478
- return (e.includes(d) || this._userInfo[d].state === T.WAITING) && (I = b.RINGING), {
479
- userId: d,
428
+ const i = this._context.getCurrentId(), n = Object.keys(this._userInfo), o = n.map((_) => {
429
+ let u = b.CONNECTED;
430
+ return (e.includes(_) || this._userInfo[_].state === m.WAITING) && (u = b.RINGING), {
431
+ userId: _,
480
432
  mediaType: this._mediaType,
481
- callStatus: I,
482
- mediaId: d
433
+ callStatus: u,
434
+ mediaId: _
483
435
  };
484
- }), r = t.extra || "", a = t.pushTitle || "", c = t.pushContent || "", { code: l, message: _ } = await this._callMsgHandler.sendMemeberModify({
436
+ }), { extra: r = "", pushConfig: a } = t, { code: h, message: c } = await this._callMsgHandler.sendMemeberModify({
485
437
  channelId: this._channelId,
486
438
  conversationType: this._conversationType,
487
439
  targetId: this._targetId,
488
440
  callId: this._callId,
489
441
  extra: r,
490
- pushTitle: a,
491
- pushContent: c,
442
+ pushConfig: a,
492
443
  mediaType: this._mediaType,
493
444
  // 除自己,其他所有人均需收到 modify 消息,以此更新状态
494
- inviteUserIds: e.filter((d) => d !== i),
445
+ inviteUserIds: e.filter((_) => _ !== i),
495
446
  callerId: this.getCallerId(),
496
447
  existedUserPofiles: o,
497
- directionalUserIdList: [...n, ...e].filter((d) => d !== i)
448
+ directionalUserIdList: [...n, ...e].filter((_) => _ !== i)
498
449
  });
499
- if (l === h.SUCCESS) {
500
- const { sentTime: d } = _;
501
- e.forEach((I) => {
502
- this._userInfo[I] = {
503
- userId: I,
504
- state: T.WAITING,
450
+ if (h === l.SUCCESS) {
451
+ const { sentTime: _ } = c;
452
+ e.forEach((u) => {
453
+ this._userInfo[u] = {
454
+ userId: u,
455
+ state: m.WAITING,
505
456
  isCaller: !1,
506
457
  isRemote: !0
507
- }, this._notifyUserStateChange(this._userInfo[I]), this._userTimers[I] = new V(() => {
508
- this._userInfo[I] && (this._userInfo[I].state = T.NONE), this._notifyUserStateChange(this._userInfo[I], g.REMOTE_NO_RESPONSE), this._watchers.onHungup(this._userInfo[I], g.REMOTE_NO_RESPONSE), delete this._userInfo[I], Object.keys(this._userInfo).length < 2 && this._notifyStateChange(m.END, g.REMOTE_NO_RESPONSE);
509
- }, this._getTimeout(d));
458
+ }, this._notifyUserStateChange(this._userInfo[u]), this._userTimers[u] = new V(() => {
459
+ this._userInfo[u] && (this._userInfo[u].state = m.NONE), this._notifyUserStateChange(this._userInfo[u], d.REMOTE_NO_RESPONSE), this._watchers.onHungup(this._userInfo[u], d.REMOTE_NO_RESPONSE), delete this._userInfo[u], Object.keys(this._userInfo).length < 2 && this._notifyStateChange(T.END, d.REMOTE_NO_RESPONSE);
460
+ }, this._getTimeout(_));
510
461
  });
511
462
  } else
512
- e.forEach((d) => {
513
- this._userInfo[d] = {
514
- userId: d,
515
- state: T.NONE,
463
+ e.forEach((_) => {
464
+ this._userInfo[_] = {
465
+ userId: _,
466
+ state: m.NONE,
516
467
  isCaller: !1,
517
468
  isRemote: !0
518
469
  };
519
- const I = l === h.REJECTED_BY_BLACKLIST ? g.ADDED_TO_BLACKLIST : g.NETWORK_ERROR;
520
- this._notifyUserStateChange(this._userInfo[d], I);
470
+ const u = h === l.REJECTED_BY_BLACKLIST ? d.ADDED_TO_BLACKLIST : d.NETWORK_ERROR;
471
+ this._notifyUserStateChange(this._userInfo[_], u);
521
472
  });
522
- return { code: l };
473
+ return { code: h };
523
474
  }
524
- async _hungupHandle(e) {
525
- const t = this._context.getCurrentId();
526
- let i = h.SUCCESS;
527
- const n = {
528
- channelId: this._channelId,
529
- conversationType: this._conversationType,
530
- targetId: this._targetId,
531
- callId: this._callId,
532
- reason: e,
533
- userIds: this.getRemoteUserIds(),
534
- pushTitle: this._hungupPushTitle,
535
- pushContent: this._hungupPushContent
536
- };
537
- if (e === g.OTHER_CLIENT_JOINED_CALL)
538
- this._callMsgHandler.sendHungup(n);
539
- else {
540
- const { code: o } = await this._callMsgHandler.sendHungup(n);
541
- i = o;
475
+ async _hungupHandle(e, t = !0) {
476
+ const i = this._context.getCurrentId();
477
+ let n = l.SUCCESS;
478
+ if (t) {
479
+ const o = {
480
+ channelId: this._channelId,
481
+ conversationType: this._conversationType,
482
+ targetId: this._targetId,
483
+ callId: this._callId,
484
+ reason: e,
485
+ userIds: this.getRemoteUserIds(),
486
+ pushConfig: this._hungupPushConfig
487
+ };
488
+ if (e === d.OTHER_CLIENT_JOINED_CALL)
489
+ this._callMsgHandler.sendHungup(o);
490
+ else {
491
+ const { code: r } = await this._callMsgHandler.sendHungup(o);
492
+ n = r;
493
+ }
542
494
  }
543
495
  this._endTimestamp = Date.now();
544
496
  for (const o in this._userInfo)
545
- this._userInfo[o].state = T.NONE, o === t ? this._notifyUserStateChange(this._userInfo[o], e) : this._notifyUserStateChange(this._userInfo[o]), delete this._userInfo[o];
546
- return Object.keys(this._userInfo).length < 2 && this._notifyStateChange(m.END, e), { code: i };
497
+ this._userInfo[o].state = m.NONE, o === i ? this._notifyUserStateChange(this._userInfo[o], e) : this._notifyUserStateChange(this._userInfo[o]), delete this._userInfo[o];
498
+ return Object.keys(this._userInfo).length < 2 && this._notifyStateChange(T.END, e), { code: n };
547
499
  }
548
500
  /**
549
501
  * 挂断
550
502
  */
551
- async hungup(e = "", t = "") {
503
+ async hungup() {
552
504
  this._logger.debug("_", "[RCCallStateMachine] hungup");
553
- const i = this._context.getCurrentId();
554
- let n = g.HANGUP;
555
- Object.keys(this._userTimers).length > 0 && (this._userInfo[i].isCaller ? n = g.CANCEL : this._userInfo[i].state === T.WAITING && (n = g.REJECT));
556
- for (const o in this._userTimers)
557
- this._clearTimerById(o);
558
- return this._hungupHandle(n);
505
+ const e = this._context.getCurrentId();
506
+ let t = d.HANGUP;
507
+ Object.keys(this._userTimers).length > 0 && (this._userInfo[e].isCaller ? t = d.CANCEL : this._userInfo[e].state === m.WAITING && (t = d.REJECT));
508
+ for (const i in this._userTimers)
509
+ this._clearTimerById(i);
510
+ return this._hungupHandle(t);
559
511
  }
560
512
  /**
561
513
  * 修改通话媒体类型
@@ -571,7 +523,7 @@ class Y {
571
523
  mediaType: e,
572
524
  userIds: this.getRemoteUserIds()
573
525
  });
574
- return t === h.SUCCESS && (this._mediaType = e), { code: t };
526
+ return t === l.SUCCESS && (this._mediaType = e), { code: t };
575
527
  }
576
528
  /**
577
529
  * 用户加入通话补偿机制(rtc userJoin 事件触发)
@@ -581,7 +533,7 @@ class Y {
581
533
  this._logger.debug("_", `[RCCallStateMachine] userJoin -> userIds: ${JSON.stringify(e)}`), setTimeout(() => {
582
534
  e.forEach((t) => {
583
535
  const i = this._userInfo[t];
584
- i && i.state !== T.KEEPING && (i.state = T.KEEPING, this._notifyUserStateChange(i)), this._sessionState !== m.KEEPING && this._notifyStateChange(m.KEEPING), this._clearTimerById(t);
536
+ i && i.state !== m.KEEPING && (i.state = m.KEEPING, this._notifyUserStateChange(i)), this._sessionState !== T.KEEPING && this._notifyStateChange(T.KEEPING), this._clearTimerById(t);
585
537
  });
586
538
  }, 300);
587
539
  }
@@ -593,10 +545,10 @@ class Y {
593
545
  this._logger.debug("_", `[RCCallStateMachine] userLeave -> userIds: ${JSON.stringify(e)}`), setTimeout(() => {
594
546
  e.forEach((t) => {
595
547
  const i = this._userInfo[t];
596
- i && i.state !== T.NONE && (i.state = T.NONE, this._notifyUserStateChange(i, g.REMOTE_HANGUP), this._watchers.onHungup(i, g.REMOTE_HANGUP), delete this._userInfo[t]), new V(() => {
548
+ i && i.state !== m.NONE && (i.state = m.NONE, this._notifyUserStateChange(i, d.REMOTE_HANGUP), this._watchers.onHungup(i, d.REMOTE_HANGUP), delete this._userInfo[t]), new V(() => {
597
549
  const n = this.getRemoteUsers();
598
- n.length === 1 && n[0].state === 1 && this._hungupHandle(g.REMOTE_NETWORK_ERROR);
599
- }, 6e4), Object.keys(this._userInfo).length < 2 && this._sessionState !== m.END && (this._endTimestamp = Date.now(), this._notifyStateChange(m.END, g.REMOTE_HANGUP));
550
+ n.length === 1 && n[0].state === 1 && this._hungupHandle(d.REMOTE_NETWORK_ERROR);
551
+ }, 6e4), Object.keys(this._userInfo).length < 2 && this._sessionState !== T.END && (this._endTimestamp = Date.now(), this._notifyStateChange(T.END, d.REMOTE_HANGUP));
600
552
  });
601
553
  }, 300);
602
554
  }
@@ -607,8 +559,8 @@ class Y {
607
559
  close(e) {
608
560
  this._hungupHandle(e);
609
561
  }
610
- setHungupPushConfig(e = "", t = "") {
611
- this._hungupPushTitle = e, this._hungupPushContent = t;
562
+ setHungupPushConfig(e) {
563
+ this._hungupPushConfig = e;
612
564
  }
613
565
  /**
614
566
  * 通话唯一标识
@@ -655,7 +607,7 @@ class Y {
655
607
  * 获取房间状态
656
608
  */
657
609
  getState() {
658
- return this._sessionState === null ? m.END : this._sessionState;
610
+ return this._sessionState === null ? T.END : this._sessionState;
659
611
  }
660
612
  /**
661
613
  * 获取人员状态
@@ -702,8 +654,8 @@ class Y {
702
654
  return this._logger.debug("_", `[RCCallStateMachine] getSummary -> summary: ${JSON.stringify(n)}`), n;
703
655
  }
704
656
  }
705
- var y = /* @__PURE__ */ ((s) => (s[s.AUDIO = 1] = "AUDIO", s[s.AUDIO_VIDEO = 2] = "AUDIO_VIDEO", s))(y || {}), re = /* @__PURE__ */ ((s) => (s[s.ADD = 1] = "ADD", s[s.REMOVE = 2] = "REMOVE", s))(re || {}), w = /* @__PURE__ */ ((s) => (s.WEB = "Web", s.IOS = "iOS", s.ANDROID = "Android", s))(w || {});
706
- class fe {
657
+ var O = /* @__PURE__ */ ((s) => (s[s.AUDIO = 1] = "AUDIO", s[s.AUDIO_VIDEO = 2] = "AUDIO_VIDEO", s))(O || {}), ae = /* @__PURE__ */ ((s) => (s[s.ADD = 1] = "ADD", s[s.REMOVE = 2] = "REMOVE", s))(ae || {}), w = /* @__PURE__ */ ((s) => (s.WEB = "Web", s.IOS = "iOS", s.ANDROID = "Android", s))(w || {});
658
+ class Ce {
707
659
  constructor(e, t, i) {
708
660
  f(this, "_messages", []);
709
661
  f(this, "_channelId");
@@ -729,10 +681,10 @@ class fe {
729
681
  targetId: o,
730
682
  senderUserId: r,
731
683
  content: a
732
- } = e, { callId: c, mediaType: l } = a;
733
- this._channelId = i, this._conversationType = n, this._targetId = o, this._callId = c, this._mediaType = l;
684
+ } = e, { callId: h, mediaType: c } = a;
685
+ this._channelId = i, this._conversationType = n, this._targetId = o, this._callId = h, this._mediaType = c;
734
686
  const _ = r === t;
735
- this._inviterId = r, this._endReason = g.REMOTE_NO_RESPONSE, this._canGenRecord();
687
+ this._inviterId = r, this._endReason = d.REMOTE_NO_RESPONSE, this._canGenRecord();
736
688
  }
737
689
  /**
738
690
  * 到 invite | memberModify 结束
@@ -752,7 +704,7 @@ class fe {
752
704
  * 原因默认己方正常挂断
753
705
  */
754
706
  _doAccept(e) {
755
- this._endReason = g.HANGUP, this._beginTimestamp = e.sentTime, this._canGenRecord();
707
+ this._endReason = d.HANGUP, this._beginTimestamp = e.sentTime, this._canGenRecord();
756
708
  }
757
709
  /**
758
710
  * 到 hungup 说明为正常挂断
@@ -760,7 +712,7 @@ class fe {
760
712
  */
761
713
  _doHungup(e) {
762
714
  const { content: t, sentTime: i, senderUserId: n } = e, { reason: o } = t, r = this._context.getCurrentId(), a = n === r;
763
- this._endReason = a ? o : H[o], this._endTimestamp = i, this._canGenRecord();
715
+ this._endReason = a ? o : G[o], this._endTimestamp = i, this._canGenRecord();
764
716
  }
765
717
  /**
766
718
  * 只修改通话类型
@@ -773,14 +725,14 @@ class fe {
773
725
  if (this._messages.length === 0) {
774
726
  let e = 0;
775
727
  [
776
- g.HANGUP,
777
- g.REMOTE_HANGUP,
778
- g.OTHER_CLIENT_JOINED_CALL,
779
- g.REMOTE_OTHER_CLIENT_JOINED_CALL,
780
- g.KICKED_BY_SERVER,
781
- g.REMOTE_KICKED_BY_SERVER,
782
- g.ACCEPT_SYSTEM_CALL,
783
- g.REMOTE_ACCEPT_SYSTEM_CALL
728
+ d.HANGUP,
729
+ d.REMOTE_HANGUP,
730
+ d.OTHER_CLIENT_JOINED_CALL,
731
+ d.REMOTE_OTHER_CLIENT_JOINED_CALL,
732
+ d.KICKED_BY_SERVER,
733
+ d.REMOTE_KICKED_BY_SERVER,
734
+ d.ACCEPT_SYSTEM_CALL,
735
+ d.REMOTE_ACCEPT_SYSTEM_CALL
784
736
  ].includes(this._endReason) && (e = this._endTimestamp - this._beginTimestamp), this._onRecord({
785
737
  channelId: this._channelId,
786
738
  conversationType: this._conversationType,
@@ -825,11 +777,11 @@ class fe {
825
777
  } while (this._messages.length > 0);
826
778
  }
827
779
  }
828
- const Ie = ["RC:VCAccept", "RC:VCRinging", "RC:VCSummary", "RC:VCHangup", "RC:VCInvite", "RC:VCModifyMedia", "RC:VCModifyMem"], Ce = {
829
- [J.REJECTED_BY_BLACKLIST]: h.REJECTED_BY_BLACKLIST,
830
- [J.NOT_IN_GROUP]: h.NOT_IN_GROUP
780
+ const Ee = ["RC:VCAccept", "RC:VCRinging", "RC:VCSummary", "RC:VCHangup", "RC:VCInvite", "RC:VCModifyMedia", "RC:VCModifyMem"], me = {
781
+ [W.REJECTED_BY_BLACKLIST]: l.REJECTED_BY_BLACKLIST,
782
+ [W.NOT_IN_GROUP]: l.NOT_IN_GROUP
831
783
  };
832
- class Re extends se {
784
+ class Te extends ie {
833
785
  constructor(t, i, n, o = 60 * 1e3, r) {
834
786
  super();
835
787
  f(this, "_watchers", {});
@@ -838,18 +790,18 @@ class Re extends se {
838
790
  f(this, "_hadHandleMsgTimer", !1);
839
791
  f(this, "_offlineRecorder");
840
792
  f(this, "_deviceId", "");
841
- this._context = t, this._runtime = i, this._logger = n, this._offlineMsgItv = o, this._getStateMachine = r, this._deviceId = X(i), this._context.onmessage = this._onMessage.bind(this), this._offlineRecorder = new fe(this._context, this._logger, (a) => {
793
+ this._context = t, this._runtime = i, this._logger = n, this._offlineMsgItv = o, this._getStateMachine = r, this._deviceId = Z(i), this._context.onmessage = this._onMessage.bind(this), this._offlineRecorder = new Ce(this._context, this._logger, (a) => {
842
794
  this._logger.info("_", `[CallMessageHandler] offlineRecorder -> ${JSON.stringify(a)}`), this._watchers.onOfflineRecord && this._watchers.onOfflineRecord(a);
843
795
  });
844
796
  }
845
797
  _onMessage(t) {
846
- if (Ie.includes(t.messageType)) {
798
+ if (Ee.includes(t.messageType)) {
847
799
  this._logger.debug("_", `[CallMessageHandler] _onMessage -> call message: ${JSON.stringify(t)}`);
848
800
  try {
849
801
  const n = Date.now(), { sentTime: o } = t;
850
802
  let r = 0;
851
- this._msgBufferList.forEach(({ msg: { sentTime: a } }, c) => {
852
- o >= a && (r = c + 1);
803
+ this._msgBufferList.forEach(({ msg: { sentTime: a } }, h) => {
804
+ o >= a && (r = h + 1);
853
805
  }), this._msgBufferList.splice(r, 0, {
854
806
  markTime: n,
855
807
  msg: t
@@ -915,44 +867,44 @@ class Re extends se {
915
867
  conversationType: o,
916
868
  messageType: r,
917
869
  sentTime: a,
918
- senderUserId: c,
919
- content: { callId: l, inviteUserIds: _ }
920
- } = n[0].msg, d = [R.VCInvite, R.VCModifyMem].includes(r), I = this._context.getServerTime() - a, E = I < this._offlineMsgItv;
921
- if (E || this._logger.warn("_", `offline msg delayTime: ${I}ms`), d) {
922
- const u = [];
923
- for (let p = 0; p < n.length; p++) {
924
- const A = n[p].msg, { content: { callId: S } } = A;
925
- if (l === S)
926
- u.push(A);
870
+ senderUserId: h,
871
+ content: { callId: c, inviteUserIds: _ }
872
+ } = n[0].msg, u = [R.VCInvite, R.VCModifyMem].includes(r), S = this._context.getServerTime() - a, C = S < this._offlineMsgItv;
873
+ if (C || this._logger.warn("_", `offline msg delayTime: ${S}ms`), u) {
874
+ const g = [];
875
+ for (let E = 0; E < n.length; E++) {
876
+ const M = n[E].msg, { content: { callId: N } } = M;
877
+ if (c === N)
878
+ g.push(M);
927
879
  else
928
880
  break;
929
881
  }
930
- if (this._logger.warn("_", `taskMsgList length: ${u.length}`), u.length > 0) {
931
- const p = this._msgBufferList.findIndex((S) => S.msg.messageUId === u[u.length - 1].messageUId);
932
- this._msgBufferList = this._msgBufferList.slice(p + 1);
933
- const A = n.findIndex((S) => S.msg.messageUId === u[u.length - 1].messageUId);
934
- n = n.slice(A + 1);
882
+ if (this._logger.warn("_", `taskMsgList length: ${g.length}`), g.length > 0) {
883
+ const E = this._msgBufferList.findIndex((N) => N.msg.messageUId === g[g.length - 1].messageUId);
884
+ this._msgBufferList = this._msgBufferList.slice(E + 1);
885
+ const M = n.findIndex((N) => N.msg.messageUId === g[g.length - 1].messageUId);
886
+ n = n.slice(M + 1);
935
887
  }
936
- const N = (() => {
888
+ const y = (() => {
937
889
  if (o !== D.PRIVATE)
938
890
  return !1;
939
- const p = u.length === 1, A = u.every((S) => [R.VCInvite, R.VCModifyMedia, R.VCRinging].includes(S.messageType));
940
- return p || A;
941
- })(), M = (() => {
891
+ const E = g.length === 1, M = g.every((N) => [R.VCInvite, R.VCModifyMedia, R.VCRinging].includes(N.messageType));
892
+ return E || M;
893
+ })(), U = (() => {
942
894
  if (o !== D.GROUP)
943
895
  return !1;
944
- let p = !1, A = !0, S = [c, ..._], L = !1;
945
- for (let C = 0; C < u.length; C++) {
946
- const { senderUserId: U, messageType: v } = u[C];
947
- if (v === R.VCHangup && U === this._context.getCurrentId())
896
+ let E = !1, M = !0, N = [h, ..._], A = !1;
897
+ for (let v = 0; v < g.length; v++) {
898
+ const { senderUserId: I, messageType: L } = g[v];
899
+ if (L === R.VCHangup && I === this._context.getCurrentId())
948
900
  break;
949
- v === R.VCHangup && (L = c === U, S = S.filter((k) => U !== k)), v === R.VCAccept && (A = !1);
901
+ L === R.VCHangup && (A = h === I, N = N.filter((k) => I !== k)), L === R.VCAccept && (M = !1);
950
902
  }
951
- return !(A && L) && S.length > 1 && (p = !0), p;
903
+ return !(M && A) && N.length > 1 && (E = !0), E;
952
904
  })();
953
- E && (N || M) && u.forEach(this._onRecvOnlineCallMsg, this), this._offlineRecorder.onRecvOfflineMsgs(u);
905
+ C && (y || U) && g.forEach(this._onRecvOnlineCallMsg, this), this._offlineRecorder.onRecvOfflineMsgs(g);
954
906
  } else
955
- E && this._getStateMachine(l) ? this._onRecvOnlineCallMsg(n[0].msg) : this._logger.debug("_", `[CallMessageHandler] unexcepted offline msg -> ${JSON.stringify(n[0].msg)}`), n.shift(), this._msgBufferList.shift();
907
+ C && this._getStateMachine(c) ? this._onRecvOnlineCallMsg(n[0].msg) : this._logger.debug("_", `[CallMessageHandler] unexcepted offline msg -> ${JSON.stringify(n[0].msg)}`), n.shift(), this._msgBufferList.shift();
956
908
  } while (n.length > 0);
957
909
  } else {
958
910
  i.forEach(({ msg: o }) => {
@@ -991,38 +943,27 @@ class Re extends se {
991
943
  targetId: o,
992
944
  content: r,
993
945
  messageType: a,
994
- directionalUserIdList: c,
995
- pushTitle: l,
996
- pushData: _,
997
- pushContent: d
998
- } = t, I = {
946
+ directionalUserIdList: h,
947
+ pushConfig: c
948
+ } = t, _ = {
999
949
  channelId: i,
1000
950
  messageType: a,
1001
951
  content: r,
1002
- directionalUserIdList: c
952
+ directionalUserIdList: h
1003
953
  };
1004
954
  if ([R.VCInvite, R.VCModifyMem, R.VCHangup].includes(a)) {
1005
- const N = {
1006
- pushTitle: l || "",
1007
- pushContent: d || "",
1008
- pushData: _ || "",
1009
- androidConfig: {
1010
- categoryHW: "VOIP",
1011
- categoryVivo: "IM"
1012
- },
1013
- iOSConfig: {
1014
- apnsCollapseId: r.callId
1015
- },
1016
- disablePushTitle: !1,
1017
- forceShowDetailContent: !1,
1018
- templateId: ""
1019
- };
1020
- I.pushConfig = N;
955
+ const C = c || { pushTitle: "", pushContent: "", pushData: "" };
956
+ C.androidConfig = Object.assign((c == null ? void 0 : c.androidConfig) || {}, {
957
+ categoryHW: "VOIP",
958
+ categoryVivo: "IM"
959
+ }), C.iOSConfig = Object.assign(C.iOSConfig || {}, {
960
+ apnsCollapseId: r.callId
961
+ }), C.disablePushTitle = !1, C.forceShowDetailContent = !1, _.pushConfig = C;
1021
962
  }
1022
- const { code: E, data: u } = await this._context.sendMessage(n, o, I);
1023
- return E !== J.SUCCESS ? (this._logger.error("_", `CallMessageHandler] sendCallMesage error -> code: ${E}`), {
1024
- code: Ce[E] || h.SEND_MSG_ERROR
1025
- }) : { code: h.SUCCESS, message: u };
963
+ const { code: u, data: S } = await this._context.sendMessage(n, o, _);
964
+ return u !== W.SUCCESS ? (this._logger.error("_", `CallMessageHandler] sendCallMesage error -> code: ${u}`), {
965
+ code: me[u] || l.SEND_MSG_ERROR
966
+ }) : { code: l.SUCCESS, message: S };
1026
967
  }
1027
968
  /**
1028
969
  * 发送邀请消息
@@ -1034,14 +975,13 @@ class Re extends se {
1034
975
  conversationType: o,
1035
976
  targetId: r,
1036
977
  callId: a,
1037
- mediaType: c,
1038
- inviteUserIds: l,
978
+ mediaType: h,
979
+ inviteUserIds: c,
1039
980
  extra: _,
1040
- pushTitle: d,
1041
- pushContent: I
981
+ pushConfig: u
1042
982
  } = t;
1043
983
  this._logger.warn("_", "CallMessageHandler] sendCallMesage sendInvite", JSON.stringify(t)), this._watchers.sendAccept && this._watchers.sendAccept({ callId: a });
1044
- const E = {
984
+ const S = {
1045
985
  platform: w.WEB,
1046
986
  deviceId: this._deviceId,
1047
987
  callId: a,
@@ -1049,25 +989,23 @@ class Re extends se {
1049
989
  extra: _,
1050
990
  engineType: 4,
1051
991
  channelInfo: { Id: a, Key: "" },
1052
- mediaType: c,
1053
- inviteUserIds: l,
992
+ mediaType: h,
993
+ inviteUserIds: c,
1054
994
  observerUserIds: [],
1055
995
  user: this._userInfo
1056
996
  };
1057
- return this._sendCallMessage({
997
+ return u && (u.pushData = JSON.stringify({
998
+ mediaType: h,
999
+ userIdList: c,
1000
+ callId: a
1001
+ })), this._sendCallMessage({
1058
1002
  channelId: n,
1059
1003
  conversationType: o,
1060
1004
  targetId: r,
1061
- content: E,
1005
+ content: S,
1062
1006
  messageType: R.VCInvite,
1063
- directionalUserIdList: o === D.GROUP ? l : [r],
1064
- pushTitle: d,
1065
- pushContent: I,
1066
- pushData: JSON.stringify({
1067
- mediaType: c,
1068
- userIdList: l,
1069
- callId: a
1070
- })
1007
+ directionalUserIdList: o === D.GROUP ? c : [r],
1008
+ pushConfig: u
1071
1009
  });
1072
1010
  }
1073
1011
  /**
@@ -1080,43 +1018,40 @@ class Re extends se {
1080
1018
  targetId: o,
1081
1019
  callId: r,
1082
1020
  mediaType: a,
1083
- inviteUserIds: c,
1084
- callerId: l,
1021
+ inviteUserIds: h,
1022
+ callerId: c,
1085
1023
  existedUserPofiles: _,
1086
- directionalUserIdList: d,
1087
- extra: I,
1088
- pushTitle: E,
1089
- pushContent: u
1090
- } = t, N = {
1024
+ directionalUserIdList: u,
1025
+ extra: S,
1026
+ pushConfig: C
1027
+ } = t, g = {
1091
1028
  platform: w.WEB,
1092
1029
  // TODO 与 IM 一致
1093
1030
  deviceId: this._deviceId,
1094
1031
  callId: r,
1095
- extra: I,
1032
+ extra: S,
1096
1033
  engineType: 4,
1097
1034
  channelInfo: { Id: r, Key: "" },
1098
1035
  mediaType: a,
1099
- inviteUserIds: c,
1036
+ inviteUserIds: h,
1100
1037
  observerUserIds: [],
1101
1038
  user: this._userInfo,
1102
- caller: l,
1103
- modifyMemType: re.ADD,
1039
+ caller: c,
1040
+ modifyMemType: ae.ADD,
1104
1041
  existedUserPofiles: _
1105
1042
  };
1106
- return this._sendCallMessage({
1043
+ return C && (C.pushData = JSON.stringify({
1044
+ mediaType: a,
1045
+ userIdList: h,
1046
+ callId: r
1047
+ })), this._sendCallMessage({
1107
1048
  channelId: i,
1108
1049
  conversationType: n,
1109
1050
  targetId: o,
1110
- content: N,
1051
+ content: g,
1111
1052
  messageType: R.VCModifyMem,
1112
- directionalUserIdList: d,
1113
- pushTitle: E,
1114
- pushContent: u,
1115
- pushData: JSON.stringify({
1116
- mediaType: a,
1117
- userIdList: c,
1118
- callId: r
1119
- })
1053
+ directionalUserIdList: u,
1054
+ pushConfig: C
1120
1055
  });
1121
1056
  }
1122
1057
  /**
@@ -1129,7 +1064,7 @@ class Re extends se {
1129
1064
  targetId: o,
1130
1065
  callId: r,
1131
1066
  userIds: a
1132
- } = t, c = {
1067
+ } = t, h = {
1133
1068
  platform: w.WEB,
1134
1069
  deviceId: this._deviceId,
1135
1070
  callId: r,
@@ -1139,7 +1074,7 @@ class Re extends se {
1139
1074
  channelId: i,
1140
1075
  conversationType: n,
1141
1076
  targetId: o,
1142
- content: c,
1077
+ content: h,
1143
1078
  messageType: R.VCRinging,
1144
1079
  directionalUserIdList: a
1145
1080
  });
@@ -1154,8 +1089,8 @@ class Re extends se {
1154
1089
  targetId: o,
1155
1090
  callId: r,
1156
1091
  mediaType: a,
1157
- userIds: c
1158
- } = t, l = {
1092
+ userIds: h
1093
+ } = t, c = {
1159
1094
  platform: w.WEB,
1160
1095
  deviceId: this._deviceId,
1161
1096
  callId: r,
@@ -1166,9 +1101,9 @@ class Re extends se {
1166
1101
  channelId: i,
1167
1102
  conversationType: n,
1168
1103
  targetId: o,
1169
- content: l,
1104
+ content: c,
1170
1105
  messageType: R.VCAccept,
1171
- directionalUserIdList: c
1106
+ directionalUserIdList: h
1172
1107
  });
1173
1108
  }
1174
1109
  /**
@@ -1181,29 +1116,26 @@ class Re extends se {
1181
1116
  targetId: o,
1182
1117
  callId: r,
1183
1118
  reason: a,
1184
- userIds: c,
1185
- pushTitle: l,
1186
- pushContent: _
1187
- } = t, d = {
1119
+ userIds: h,
1120
+ pushConfig: c
1121
+ } = t, _ = {
1188
1122
  platform: w.WEB,
1189
1123
  deviceId: this._deviceId,
1190
1124
  callId: r,
1191
1125
  reason: a,
1192
1126
  user: this._userInfo
1193
1127
  };
1194
- return this._sendCallMessage({
1128
+ return c && (c.pushData = JSON.stringify({
1129
+ callId: r,
1130
+ reason: a
1131
+ })), this._sendCallMessage({
1195
1132
  channelId: i,
1196
1133
  conversationType: n,
1197
1134
  targetId: o,
1198
- content: d,
1135
+ content: _,
1199
1136
  messageType: R.VCHangup,
1200
- pushTitle: l,
1201
- pushContent: _,
1202
- pushData: JSON.stringify({
1203
- callId: r,
1204
- reason: a
1205
- }),
1206
- directionalUserIdList: c
1137
+ pushConfig: c,
1138
+ directionalUserIdList: h
1207
1139
  });
1208
1140
  }
1209
1141
  /**
@@ -1216,8 +1148,8 @@ class Re extends se {
1216
1148
  targetId: o,
1217
1149
  callId: r,
1218
1150
  mediaType: a,
1219
- userIds: c
1220
- } = t, l = {
1151
+ userIds: h
1152
+ } = t, c = {
1221
1153
  platform: w.WEB,
1222
1154
  deviceId: this._deviceId,
1223
1155
  callId: r,
@@ -1228,47 +1160,47 @@ class Re extends se {
1228
1160
  channelId: i,
1229
1161
  conversationType: n,
1230
1162
  targetId: o,
1231
- content: l,
1163
+ content: c,
1232
1164
  messageType: R.VCModifyMedia,
1233
- directionalUserIdList: c
1165
+ directionalUserIdList: h
1234
1166
  });
1235
1167
  }
1236
1168
  }
1237
1169
  var P = /* @__PURE__ */ ((s) => (s.ZH = "zh", s.EN = "en", s))(P || {});
1238
- const Ee = {
1170
+ const Se = {
1239
1171
  PushTitle: {
1240
1172
  AUDIO: "You have a voice call",
1241
1173
  VIDEO: "You have a video call"
1242
1174
  }
1243
- }, Te = {
1175
+ }, pe = {
1244
1176
  PushTitle: {
1245
1177
  AUDIO: "您有一条音频通话",
1246
1178
  VIDEO: "您有一条视频通话"
1247
1179
  }
1248
1180
  };
1249
- class ae {
1181
+ class ce {
1250
1182
  static set(e) {
1251
1183
  this._lang = e;
1252
1184
  }
1253
1185
  static get() {
1254
- return this._lang === P.EN ? Ee : Te;
1186
+ return this._lang === P.EN ? Se : pe;
1255
1187
  }
1256
1188
  }
1257
- f(ae, "_lang", P.ZH);
1258
- class me {
1189
+ f(ce, "_lang", P.ZH);
1190
+ class Oe {
1259
1191
  /**
1260
1192
  * 初始化
1261
1193
  */
1262
1194
  constructor(e, t, i, n, o) {
1263
1195
  f(this, "_stateMachine", {});
1264
1196
  f(this, "_callMsgHandler");
1265
- this._context = e, this._runtime = t, this._logger = i, this._watchers = n, this._options = o, this._logger.warn("_", "RCCallEngine Version: 5.2.3 CommitId: e27050187c1e74221d5e1bacd782866037c4c265"), X(t), this._callMsgHandler = new Re(this._context, this._runtime, this._logger, this._options.offlineMsgItv, this._getStateMachine.bind(this)), this._callMsgHandler.registerEventListener({
1197
+ this._context = e, this._runtime = t, this._logger = i, this._watchers = n, this._options = o, this._logger.warn("_", "RCCallEngine Version: 5.2.5 CommitId: 3580977730beafd1c85aff0653e30f8c75cff0cf"), Z(t), this._callMsgHandler = new Te(this._context, this._runtime, this._logger, this._options.offlineMsgItv, this._getStateMachine.bind(this)), this._callMsgHandler.registerEventListener({
1266
1198
  onInvite: this._onInvite.bind(this),
1267
1199
  sendAccept: this._handleSendAccept.bind(this),
1268
1200
  onOfflineRecord: this._watchers.onOfflineRecord
1269
- }), oe.on("onStateMachineClose", (r) => {
1201
+ }), re.on("onStateMachineClose", (r) => {
1270
1202
  delete this._stateMachine[r];
1271
- }), ae.set(o.lang);
1203
+ }), ce.set(o.lang);
1272
1204
  }
1273
1205
  _onInvite(e) {
1274
1206
  const {
@@ -1278,21 +1210,21 @@ class me {
1278
1210
  content: o,
1279
1211
  messageType: r,
1280
1212
  senderUserId: a,
1281
- pushConfig: c
1213
+ pushConfig: h
1282
1214
  } = e;
1283
1215
  this._logger.warn("_", `RCCallEngine _onInvite:targetId ${n} senderUserId: ${a}`);
1284
1216
  const {
1285
- mediaType: l,
1217
+ mediaType: c,
1286
1218
  callId: _,
1287
- extra: d,
1288
- roomType: I
1219
+ extra: u,
1220
+ roomType: S
1289
1221
  } = o;
1290
- let E;
1291
- I !== G.RCCallRoomTypeAcrossCall ? E = a : [, E] = a.split("_");
1292
- const u = this._context.getCurrentId();
1293
- if (this._context.getCurrentId() === E || r === R.VCModifyMem && o.existedUserPofiles.some((p) => p.userId === u) && !this._stateMachine[_])
1222
+ let C;
1223
+ S !== $.RCCallRoomTypeAcrossCall ? C = a : [, C] = a.split("_");
1224
+ const g = this._context.getCurrentId();
1225
+ if (this._context.getCurrentId() === C || r === R.VCModifyMem && o.existedUserPofiles.some((E) => E.userId === g) && !this._stateMachine[_])
1294
1226
  return;
1295
- this._stateMachine[_] ? r === R.VCModifyMem && this._stateMachine[_].__onMemberModify(e) : (this._stateMachine[_] = new Y(
1227
+ this._stateMachine[_] ? r === R.VCModifyMem && this._stateMachine[_].__onMemberModify(e) : (this._stateMachine[_] = new F(
1296
1228
  this._context,
1297
1229
  this._runtime,
1298
1230
  this._logger,
@@ -1300,9 +1232,9 @@ class me {
1300
1232
  t,
1301
1233
  i,
1302
1234
  n,
1303
- l,
1235
+ c,
1304
1236
  _
1305
- ), this._logger.info("_", `[RCCallEngine] RCCallStateMachine successfully created -> callId: ${_}`), r === R.VCInvite ? this._stateMachine[_].__onInvite(e) : r === R.VCModifyMem && this._stateMachine[_].__onMemberModify(e), this._watchers.onInvite(this._stateMachine[_], d), Object.keys(this._stateMachine).filter((p) => _ !== p).length > 0 && !this._options.isAllowAcceptNewCall && this._stateMachine[_].__handleInviteInSession());
1237
+ ), this._logger.info("_", `[RCCallEngine] RCCallStateMachine successfully created -> callId: ${_}`), r === R.VCInvite ? this._stateMachine[_].__onInvite(e) : r === R.VCModifyMem && this._stateMachine[_].__onMemberModify(e), this._watchers.onInvite(this._stateMachine[_], u), Object.keys(this._stateMachine).filter((E) => _ !== E).length > 0 && !this._options.isAllowAcceptNewCall && this._stateMachine[_].__handleInviteInSession());
1306
1238
  }
1307
1239
  /**
1308
1240
  * 允许接听新的通话时,接听完新的通话后,挂断其他通话
@@ -1332,22 +1264,20 @@ class me {
1332
1264
  * @param targetId 对方 ID
1333
1265
  * @param mediaType 媒体类型
1334
1266
  * @param extra 消息扩展信息
1335
- * @param pushTitle 通知的标题
1336
- * @param pushContent 通知的内容
1267
+ * @param pushConfig 推送配置
1337
1268
  */
1338
- async call(e, t, i, n = "", o = "", r = "", a = !1) {
1269
+ async call(e, t, i, n = "", o, r = !1) {
1339
1270
  this._logger.debug("_", `[RCCallEngine] call -> args: ${JSON.stringify({
1340
1271
  channelId: e,
1341
1272
  targetId: t,
1342
1273
  mediaType: i,
1343
1274
  extra: n,
1344
- pushTitle: o,
1345
- pushContent: r
1275
+ pushConfig: o
1346
1276
  })}`);
1347
- const c = Q();
1277
+ const a = ee();
1348
1278
  if (Object.keys(this._stateMachine).length > 0)
1349
- return { code: h.STATE_MACHINE_EXIT };
1350
- this._stateMachine[c] = new Y(
1279
+ return { code: l.STATE_MACHINE_EXIT };
1280
+ this._stateMachine[a] = new F(
1351
1281
  this._context,
1352
1282
  this._runtime,
1353
1283
  this._logger,
@@ -1356,13 +1286,13 @@ class me {
1356
1286
  D.PRIVATE,
1357
1287
  t,
1358
1288
  i,
1359
- c
1289
+ a
1360
1290
  );
1361
- const { code: _ } = await this._stateMachine[c].__call([t], n, o, r, a);
1362
- return _ === h.SUCCESS ? {
1363
- code: h.SUCCESS,
1364
- stateMachine: this._stateMachine[c]
1365
- } : { code: _ };
1291
+ const { code: c } = await this._stateMachine[a].__call([t], n, o, r);
1292
+ return c === l.SUCCESS ? {
1293
+ code: l.SUCCESS,
1294
+ stateMachine: this._stateMachine[a]
1295
+ } : { code: c };
1366
1296
  }
1367
1297
  /**
1368
1298
  * 群呼
@@ -1371,15 +1301,14 @@ class me {
1371
1301
  * @param mediaType 媒体类型
1372
1302
  * @param userIds 被邀请人员列表
1373
1303
  * @param extra 消息扩展信息
1374
- * @param pushTitle 通知的标题
1375
- * @param pushContent 通知的内容
1304
+ * @param pushConfig 推送配置
1376
1305
  */
1377
- async callInGroup(e, t, i, n, o = "", r = "", a = "") {
1306
+ async callInGroup(e, t, i, n, o = "", r) {
1378
1307
  this._logger.debug("_", `[RCCallEngine] callInGroup -> args: ${JSON.stringify({ channelId: e, targetId: t, mediaType: i })}`);
1379
- const c = Q();
1308
+ const a = ee();
1380
1309
  if (Object.keys(this._stateMachine).length > 0)
1381
- return { code: h.STATE_MACHINE_EXIT };
1382
- this._stateMachine[c] = new Y(
1310
+ return { code: l.STATE_MACHINE_EXIT };
1311
+ this._stateMachine[a] = new F(
1383
1312
  this._context,
1384
1313
  this._runtime,
1385
1314
  this._logger,
@@ -1388,13 +1317,13 @@ class me {
1388
1317
  D.GROUP,
1389
1318
  t,
1390
1319
  i,
1391
- c
1320
+ a
1392
1321
  );
1393
- const { code: _ } = await this._stateMachine[c].__call(n, o, r, a);
1394
- return _ === h.SUCCESS ? {
1395
- code: h.SUCCESS,
1396
- stateMachine: this._stateMachine[c]
1397
- } : { code: _ };
1322
+ const { code: c } = await this._stateMachine[a].__call(n, o, r);
1323
+ return c === l.SUCCESS ? {
1324
+ code: l.SUCCESS,
1325
+ stateMachine: this._stateMachine[a]
1326
+ } : { code: c };
1398
1327
  }
1399
1328
  /**
1400
1329
  * 销毁当前的状态机
@@ -1404,7 +1333,7 @@ class me {
1404
1333
  }
1405
1334
  }
1406
1335
  var x = /* @__PURE__ */ ((s) => (s[s.CALLER = 1] = "CALLER", s[s.CALLEE = 2] = "CALLEE", s))(x || {});
1407
- class pe {
1336
+ class ye {
1408
1337
  constructor() {
1409
1338
  f(this, "list", {});
1410
1339
  }
@@ -1441,17 +1370,17 @@ class pe {
1441
1370
  });
1442
1371
  }
1443
1372
  }
1444
- const $ = new pe();
1445
- function Se(s) {
1373
+ const B = new ye();
1374
+ function Me(s) {
1446
1375
  return Object.values(P).includes(s);
1447
1376
  }
1448
- function Oe(s) {
1449
- return Object.values(ie).includes(s);
1377
+ function Ne(s) {
1378
+ return Object.values(ne).includes(s);
1450
1379
  }
1451
- function ye(s) {
1452
- return [B.DEBUG, B.INFO, B.WARN, B.ERROR].includes(s);
1380
+ function Ae(s) {
1381
+ return [K.DEBUG, K.INFO, K.WARN, K.ERROR].includes(s);
1453
1382
  }
1454
- const Me = (s) => {
1383
+ const Ue = (s) => {
1455
1384
  if (!s)
1456
1385
  return { result: !1, msg: "Initialization missing parameter -> options" };
1457
1386
  if (typeof s != "object")
@@ -1459,8 +1388,8 @@ const Me = (s) => {
1459
1388
  const e = ["rtcClient", "onSession", "onSessionClose"], t = Object.keys(s), i = [];
1460
1389
  return e.forEach((n) => {
1461
1390
  t.includes(n) || i.push(n);
1462
- }), i.length ? { result: !1, msg: `Initialization missing parameter -> "${i.join(",")}"` } : typeof s.rtcClient != "object" ? { result: !1, msg: "Initialization 'rtcClient' parameter must be of type 'object'" } : typeof s.onSession != "function" ? { result: !1, msg: "Initialization 'onSession' parameter must be of type 'function'" } : typeof s.onSessionClose != "function" ? { result: !1, msg: "Initialization 'onSessionClose' parameter must be of type 'function'" } : typeof s.isAllowSubscribeRetry < "u" && typeof s.isAllowSubscribeRetry != "boolean" ? { result: !1, msg: "Initialization 'isAllowSubscribeRetry' parameter must be of type 'boolean'" } : typeof s.isAllowPublishRetry < "u" && typeof s.isAllowPublishRetry != "boolean" ? { result: !1, msg: "Initialization 'isAllowPublishRetry' parameter must be of type 'boolean'" } : typeof s.isOffCameraWhenVideoDisable < "u" && typeof s.isOffCameraWhenVideoDisable != "boolean" ? { result: !1, msg: "Initialization 'isOffCameraWhenVideoDisable' parameter must be of type 'boolean'" } : typeof s.joinType < "u" && !Oe(s.joinType) ? { result: !1, msg: "Initialization 'joinType' parameter must be of type correct type" } : typeof s.isAllowDemotionGetStream < "u" && typeof s.isAllowDemotionGetStream != "boolean" ? { result: !1, msg: "Initialization 'isAllowDemotionGetStream' parameter must be of type 'boolean'" } : typeof s.lang < "u" && !Se(s.lang) ? { result: !1, msg: "Initialization 'lang' parameter must be of type correct type" } : typeof s.logOutputLevel < "u" && !ye(s.logOutputLevel) ? { result: !1, msg: "Initialization 'logOutputLevel' parameter must be of type correct type" } : { result: !0 };
1463
- }, K = (s) => {
1391
+ }), i.length ? { result: !1, msg: `Initialization missing parameter -> "${i.join(",")}"` } : typeof s.rtcClient != "object" ? { result: !1, msg: "Initialization 'rtcClient' parameter must be of type 'object'" } : typeof s.onSession != "function" ? { result: !1, msg: "Initialization 'onSession' parameter must be of type 'function'" } : typeof s.onSessionClose != "function" ? { result: !1, msg: "Initialization 'onSessionClose' parameter must be of type 'function'" } : typeof s.isAllowSubscribeRetry < "u" && typeof s.isAllowSubscribeRetry != "boolean" ? { result: !1, msg: "Initialization 'isAllowSubscribeRetry' parameter must be of type 'boolean'" } : typeof s.isAllowPublishRetry < "u" && typeof s.isAllowPublishRetry != "boolean" ? { result: !1, msg: "Initialization 'isAllowPublishRetry' parameter must be of type 'boolean'" } : typeof s.isOffCameraWhenVideoDisable < "u" && typeof s.isOffCameraWhenVideoDisable != "boolean" ? { result: !1, msg: "Initialization 'isOffCameraWhenVideoDisable' parameter must be of type 'boolean'" } : typeof s.joinType < "u" && !Ne(s.joinType) ? { result: !1, msg: "Initialization 'joinType' parameter must be of type correct type" } : typeof s.isAllowDemotionGetStream < "u" && typeof s.isAllowDemotionGetStream != "boolean" ? { result: !1, msg: "Initialization 'isAllowDemotionGetStream' parameter must be of type 'boolean'" } : typeof s.lang < "u" && !Me(s.lang) ? { result: !1, msg: "Initialization 'lang' parameter must be of type correct type" } : typeof s.logOutputLevel < "u" && !Ae(s.logOutputLevel) ? { result: !1, msg: "Initialization 'logOutputLevel' parameter must be of type correct type" } : { result: !0 };
1392
+ }, j = (s) => {
1464
1393
  if (!s)
1465
1394
  return { result: !1, msg: "missing parameter -> listener" };
1466
1395
  if (typeof s != "object")
@@ -1469,19 +1398,73 @@ const Me = (s) => {
1469
1398
  return e.forEach((n) => {
1470
1399
  t.includes(n) || i.push(n);
1471
1400
  }), i.length ? { result: !1, msg: `missing parameter -> "${i.join(",")}"` } : typeof s.onRinging != "function" ? { result: !1, msg: "'onRinging' parameter must be of type 'function'" } : typeof s.onAccept != "function" ? { result: !1, msg: "'onAccept' parameter must be of type 'function'" } : typeof s.onHungup != "function" ? { result: !1, msg: "'onHungup' parameter must be of type 'function'" } : typeof s.onTrackReady != "function" ? { result: !1, msg: "'onTrackReady' parameter must be of type 'function'" } : { result: !0 };
1472
- }, ee = (s) => s && typeof s == "string" ? { result: !0 } : { result: !1, msg: "'targetId' parameter is required, must be of type 'string'" }, te = (s) => s === y.AUDIO || s === y.AUDIO_VIDEO ? { result: !0 } : { result: !1, msg: "'mediaType' parameter is required, must be of type 'RCCallMediaType'" }, q = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'extra' parameter must be of type 'string'" }, j = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'pushTitle' parameter must be of type 'string'" }, W = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'pushContent' parameter must be of type 'string'" }, Ne = (s) => {
1473
- const { pushTitle: e = "", pushContent: t = "" } = s, i = [];
1474
- return i.push(j(e)), i.push(W(t)), i;
1401
+ }, te = (s) => s && typeof s == "string" ? { result: !0 } : { result: !1, msg: "'targetId' parameter is required, must be of type 'string'" }, se = (s) => s === O.AUDIO || s === O.AUDIO_VIDEO ? { result: !0 } : { result: !1, msg: "'mediaType' parameter is required, must be of type 'RCCallMediaType'" }, X = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'extra' parameter must be of type 'string'" }, J = (s) => {
1402
+ const e = ["pushTitle", "pushContent", "pushData", "iOSConfig", "androidConfig", "disablePushTitle", "templateId"];
1403
+ if (!Object.keys(s).every((a) => e.includes(a)))
1404
+ return {
1405
+ code: l.PARAM_ERROR,
1406
+ errorMsg: `right key: ${e.join(",")}`
1407
+ };
1408
+ for (let a = 0; a < e.length; a++) {
1409
+ const h = e[a];
1410
+ if (h === "disablePushTitle") {
1411
+ if (!ge(s[h]) && !de(s[h]))
1412
+ return {
1413
+ code: l.PARAM_ERROR,
1414
+ errorMsg: `${h} type is boolean`
1415
+ };
1416
+ } else if ((h === "pushTitle" || h === "templateId") && s[h] && !Y(s[h]))
1417
+ return {
1418
+ code: l.PARAM_ERROR,
1419
+ errorMsg: `${h} type is string`
1420
+ };
1421
+ }
1422
+ const { iOSConfig: i, androidConfig: n } = s, o = ve(i || {});
1423
+ if (o.code !== l.SUCCESS)
1424
+ return o;
1425
+ const r = Le(n || {});
1426
+ return r.code !== l.SUCCESS ? r : { code: l.SUCCESS };
1427
+ }, ve = (s) => {
1428
+ const { threadId: e, richMediaUri: t } = s || {};
1429
+ return e && !Y(e) ? {
1430
+ code: l.PARAM_ERROR,
1431
+ errorMsg: "iOSConfig.threadId type is string"
1432
+ } : t && !Y(t) ? {
1433
+ code: l.PARAM_ERROR,
1434
+ errorMsg: "iOSConfig.richMediaUri type is string"
1435
+ } : { code: l.SUCCESS };
1436
+ }, Le = (s) => {
1437
+ const e = ["notificationId", "channelIdMi", "miLargeIconUrl", "channelIdHW", "categoryHW", "importanceHW", "imageUrlHW", "channelIdOPPO", "typeVivo", "categoryVivo", "fcmChannelId", "fcmCollapseKey", "fcmImageUrl", "importanceHonor", "imageUrlHonor"];
1438
+ if (!Object.keys(s).every((i) => e.includes(i)))
1439
+ return {
1440
+ code: l.PARAM_ERROR,
1441
+ errorMsg: `right key: ${e.join(",")}`
1442
+ };
1443
+ for (let i = 0; i < e.length; i++) {
1444
+ const n = e[i];
1445
+ if (n === "importanceHW" || n === "importanceHonor") {
1446
+ if (s[n] && s[n] !== "LOW" && s[n] !== "NORMAL")
1447
+ return {
1448
+ code: l.PARAM_ERROR,
1449
+ errorMsg: `androidConfig.${n} value is NORMAL|LOW`
1450
+ };
1451
+ } else if (s[n] && !Y(s[n]))
1452
+ return {
1453
+ code: l.PARAM_ERROR,
1454
+ errorMsg: `androidConfig.${n} type is string`
1455
+ };
1456
+ }
1457
+ return { code: l.SUCCESS };
1475
1458
  }, le = (s) => Array.isArray(s) ? s.length ? s.every((e) => typeof e == "string" && e.length > 0) ? { result: !0 } : { result: !1, msg: "'userIds' parameter is required" } : { result: !1, msg: "'userIds' parameter is required, must be of type 'string[]'" } : { result: !1, msg: "'userIds' parameter is required, must be of type 'string[]'" };
1476
- function Ae(s) {
1459
+ function De(s) {
1477
1460
  return ["FPS_10", "FPS_15", "FPS_24", "FPS_30"].includes(s);
1478
1461
  }
1479
- const Ue = (s) => !!he[s], ve = (s) => s && s.audio && typeof s.audio.micphoneId < "u" && typeof s.audio.micphoneId != "string" ? { result: !1, msg: "'constraints.audio.micphoneId' must be of type 'string'" } : s && s.audio && typeof s.audio.sampleRate < "u" && typeof s.audio.sampleRate != "number" ? { result: !1, msg: "'constraints.audio.sampleRate' must be of type 'number'" } : s && s.video && typeof s.video.cameraId < "u" && typeof s.video.cameraId != "string" ? { result: !1, msg: "'constraints.video.cameraId' must be of type 'string'" } : s && s.video && typeof s.video.frameRate < "u" && typeof s.video.frameRate != "string" ? { result: !1, msg: "'constraints.video.frameRate' must be of type 'string'" } : s && s.video && typeof s.video.frameRate < "u" && !Ae(s.video.frameRate) ? { result: !1, msg: "'frameRate' value is out of range" } : s && s.video && typeof s.video.resolution < "u" && typeof s.video.resolution != "string" ? { result: !1, msg: "'constraints.video.frameRate' must be of type 'string'" } : s && s.video && typeof s.video.resolution < "u" && !Ue(s.video.resolution) ? { result: !1, msg: "'resolution' value is out of range" } : s && s.video && (!s.video.frameRate || !s.video.resolution) ? { result: !1, msg: "'resolution' and 'resolution' is required" } : { result: !0 }, Le = (s, e) => setTimeout(s, e);
1480
- class De {
1462
+ const ke = (s) => !!ue[s], be = (s) => s && s.audio && typeof s.audio.micphoneId < "u" && typeof s.audio.micphoneId != "string" ? { result: !1, msg: "'constraints.audio.micphoneId' must be of type 'string'" } : s && s.audio && typeof s.audio.sampleRate < "u" && typeof s.audio.sampleRate != "number" ? { result: !1, msg: "'constraints.audio.sampleRate' must be of type 'number'" } : s && s.video && typeof s.video.cameraId < "u" && typeof s.video.cameraId != "string" ? { result: !1, msg: "'constraints.video.cameraId' must be of type 'string'" } : s && s.video && typeof s.video.frameRate < "u" && typeof s.video.frameRate != "string" ? { result: !1, msg: "'constraints.video.frameRate' must be of type 'string'" } : s && s.video && typeof s.video.frameRate < "u" && !De(s.video.frameRate) ? { result: !1, msg: "'frameRate' value is out of range" } : s && s.video && typeof s.video.resolution < "u" && typeof s.video.resolution != "string" ? { result: !1, msg: "'constraints.video.frameRate' must be of type 'string'" } : s && s.video && typeof s.video.resolution < "u" && !ke(s.video.resolution) ? { result: !1, msg: "'resolution' value is out of range" } : s && s.video && (!s.video.frameRate || !s.video.resolution) ? { result: !1, msg: "'resolution' and 'resolution' is required" } : { result: !0 }, we = (s, e) => setTimeout(s, e);
1463
+ class Pe {
1481
1464
  constructor(e, t) {
1482
1465
  f(this, "_timerId", 0);
1483
1466
  f(this, "_startTime", 0);
1484
- e && (this._timerId = Le(() => {
1467
+ e && (this._timerId = we(() => {
1485
1468
  e();
1486
1469
  }, t)), this._startTime = Date.now();
1487
1470
  }
@@ -1499,7 +1482,7 @@ class De {
1499
1482
  this._startTime = 0;
1500
1483
  }
1501
1484
  }
1502
- class F {
1485
+ class z {
1503
1486
  constructor(e, t, i, n = {}) {
1504
1487
  /**
1505
1488
  * RTC房间实例
@@ -1522,28 +1505,28 @@ class F {
1522
1505
  * 用户状态变更
1523
1506
  * @param info
1524
1507
  */
1525
- onUserStateChange: ({ user: a, reason: c }) => {
1526
- this._logger.info("_", `[RCCallSession onUserStateChange] userId->${a == null ? void 0 : a.userId} state->${a == null ? void 0 : a.state} reason->${c}`);
1508
+ onUserStateChange: ({ user: o, reason: r }) => {
1509
+ this._logger.info("_", `[RCCallSession onUserStateChange] userId->${o == null ? void 0 : o.userId} state->${o == null ? void 0 : o.state} reason->${r}`);
1527
1510
  },
1528
1511
  /**
1529
1512
  * 房间状态变更
1530
1513
  * @param
1531
1514
  */
1532
- onStateChange: async (a) => {
1533
- const { state: c, reason: l } = a;
1534
- if (this._logger.info("_", `[RCCallSession onStateChange] : state->${c} reason->${l}`), c === m.KEEPING) {
1535
- const _ = this._stateMachine.getCallId();
1536
- this._logger.info("_", `[RCCallSession onStateChange] roomId: ${_}`);
1515
+ onStateChange: async (o) => {
1516
+ const { state: r, reason: a } = o;
1517
+ if (this._logger.info("_", `[RCCallSession onStateChange] : state->${r} reason->${a}`), r === T.KEEPING) {
1518
+ const h = this._stateMachine.getCallId();
1519
+ this._logger.info("_", `[RCCallSession onStateChange] roomId: ${h}`);
1537
1520
  try {
1538
- await this._joinRoom(_);
1539
- } catch (d) {
1540
- this._exceptionClose(g.NETWORK_ERROR), this._logger.error("_", `[RCCallSession onStateChange] joinRoom throw exception roomId -> ${_}`), console.error(d);
1521
+ await this._joinRoom(h);
1522
+ } catch (c) {
1523
+ this._exceptionClose(d.NETWORK_ERROR), this._logger.error("_", `[RCCallSession onStateChange] joinRoom throw exception roomId -> ${h}`), console.error(c);
1541
1524
  }
1542
- } else if (c === m.END) {
1525
+ } else if (r === T.END) {
1543
1526
  if (!this._room) {
1544
1527
  this._options.localTracks && this._destroyTracks(this._options.localTracks);
1545
- const _ = this._stateMachine.getSummary();
1546
- $.emit("sessionClose", { session: this, summaryInfo: _ });
1528
+ const h = this._stateMachine.getSummary();
1529
+ B.emit("sessionClose", { session: this, summaryInfo: h });
1547
1530
  return;
1548
1531
  }
1549
1532
  this._options.localTracks && this._destroyTracks(this._options.localTracks), this._logger.info("_", "[RCCallSession onStateChange] localTracks destroyed"), this._leaveRoom(), this._room = null;
@@ -1553,70 +1536,68 @@ class F {
1553
1536
  * 收到响铃
1554
1537
  * @param sender 发起用户信息
1555
1538
  */
1556
- onRinging: (a) => {
1557
- this._logger.info("_", `[RCCallSession onRinging]sender: sender.userId -> ${a.userId}`);
1539
+ onRinging: (o) => {
1540
+ this._logger.info("_", `[RCCallSession onRinging]sender: sender.userId -> ${o.userId}`);
1558
1541
  try {
1559
- this._listener.onRinging(a, this);
1560
- } catch (c) {
1561
- this._logger.error("_", "[RCCallSession onRinging] method exception -> onRinging"), console.error(c);
1542
+ this._listener.onRinging(o, this);
1543
+ } catch (r) {
1544
+ this._logger.error("_", "[RCCallSession onRinging] method exception -> onRinging"), console.error(r);
1562
1545
  }
1563
1546
  },
1564
1547
  /**
1565
1548
  * 当远端用户同意接听
1566
1549
  */
1567
- onAccept: (a) => {
1568
- this._logger.info("_", `[RCCallSession onAccept]sender: sender.userId -> ${a.userId}`);
1550
+ onAccept: (o) => {
1551
+ this._logger.info("_", `[RCCallSession onAccept]sender: sender.userId -> ${o.userId}`);
1569
1552
  try {
1570
- this._listener.onAccept(a, this);
1571
- } catch (c) {
1572
- this._logger.error("_", "[RCCallSession onAccept] method exception -> onAccept"), console.error(c);
1553
+ this._listener.onAccept(o, this);
1554
+ } catch (r) {
1555
+ this._logger.error("_", "[RCCallSession onAccept] method exception -> onAccept"), console.error(r);
1573
1556
  }
1574
1557
  },
1575
1558
  /**
1576
1559
  * 当有远端用户挂断
1577
1560
  */
1578
- onHungup: (a, c) => {
1579
- this._logger.info("_", `[RCCallSession onHungup]sender: sender.userId -> ${a.userId} reason->${c}`);
1561
+ onHungup: (o, r) => {
1562
+ this._logger.info("_", `[RCCallSession onHungup]sender: sender.userId -> ${o.userId} reason->${r}`);
1580
1563
  try {
1581
- this._listener.onHungup(a, c, this);
1582
- } catch (l) {
1583
- this._logger.error("_", "[RCCallSession onHungup] method exception -> onHungup"), console.error(l);
1564
+ this._listener.onHungup(o, r, this);
1565
+ } catch (a) {
1566
+ this._logger.error("_", "[RCCallSession onHungup] method exception -> onHungup"), console.error(a);
1584
1567
  }
1585
1568
  },
1586
1569
  /**
1587
1570
  * 收到人员变更
1588
1571
  * @param sender 发起用户信息
1589
1572
  */
1590
- onMemberModify: ({ sender: a, invitedUsers: c }) => {
1591
- this._logger.info("_", `[RCCallSession onMemberModify] sender.userId -> ${a.userId}`);
1573
+ onMemberModify: ({ sender: o, invitedUsers: r }) => {
1574
+ this._logger.info("_", `[RCCallSession onMemberModify] sender.userId -> ${o.userId}`);
1592
1575
  try {
1593
- this._listener.onMemberModify(a, c, this);
1594
- } catch (l) {
1595
- this._logger.error("_", "[RCCallSession onMemberModify] method exception -> onMemberModify"), console.error(l);
1576
+ this._listener.onMemberModify(o, r, this);
1577
+ } catch (a) {
1578
+ this._logger.error("_", "[RCCallSession onMemberModify] method exception -> onMemberModify"), console.error(a);
1596
1579
  }
1597
1580
  },
1598
1581
  /**
1599
1582
  * 收到通话类型变更 (通话降级)
1600
1583
  * @param sender 发起用户信息
1601
1584
  */
1602
- onMediaModify: ({ sender: a, mediaType: c }) => {
1603
- this._logger.info("_", `[RCCallSession onMediaModify]sender: sender.userId -> ${a.userId} mediaType: ${c}`), c === y.AUDIO && this._setMediaTypeToAudio();
1585
+ onMediaModify: ({ sender: o, mediaType: r }) => {
1586
+ this._logger.info("_", `[RCCallSession onMediaModify]sender: sender.userId -> ${o.userId} mediaType: ${r}`), r === O.AUDIO && this._setMediaTypeToAudio();
1604
1587
  try {
1605
- this._listener.onMediaModify(a, c, this);
1606
- } catch (l) {
1607
- this._logger.error("_", "[RCCallSession onMediaModify] method exception -> onMediaModify"), console.error(l);
1588
+ this._listener.onMediaModify(o, r, this);
1589
+ } catch (a) {
1590
+ this._logger.error("_", "[RCCallSession onMediaModify] method exception -> onMediaModify"), console.error(a);
1608
1591
  }
1609
1592
  },
1610
1593
  /**
1611
1594
  * 是否跨appkey
1612
1595
  * @param sender 发起用户信息
1613
1596
  */
1614
- crossAppkey: (a) => {
1615
- this._logger.info("_", `[RCCallSession crossAppkey] 是否跨 appkey: ${a}`), this._options.isCrossAppkey = a;
1597
+ crossAppkey: (o) => {
1598
+ this._logger.info("_", `[RCCallSession crossAppkey] 是否跨 appkey: ${o}`), this._options.isCrossAppkey = o;
1616
1599
  }
1617
- });
1618
- const { pushTitle: o, pushContent: r } = this._options.hungupPushConfig;
1619
- this._stateMachine.setHungupPushConfig(o, r);
1600
+ }), this._stateMachine.setHungupPushConfig(this._options.hungupPushConfig || { pushTitle: "", pushContent: "" });
1620
1601
  }
1621
1602
  /**
1622
1603
  * 加入房间
@@ -1626,28 +1607,28 @@ class F {
1626
1607
  try {
1627
1608
  this._options.isCrossAppkey ? t = await this._rtcClient.joinCrossRTCRoom(e, this._options.joinType) : t = await this._rtcClient.joinRTCRoom(e, this._options.joinType);
1628
1609
  const { code: i, userIds: n, room: o } = t;
1629
- if (i !== O.SUCCESS)
1630
- return i === O.NOT_OPEN_VIDEO_AUDIO_SERVER && this._exceptionClose(g.SERVICE_NOT_OPENED), i === O.SIGNAL_JOIN_RTC_ROOM_REFUSED ? this._exceptionClose(g.OTHER_CLIENT_IN_CALL) : this._exceptionClose(g.NETWORK_ERROR), this._logger.info("_", `[RCCallClient _joinRoom] join room failed: roomId -> ${e} RCRTCCode -> ${i}`), { code: h.JOIN_ROOM_ERROR };
1631
- if (this._stateMachine.getConversationType() === D.GROUP && this._stateMachine.userJoin([this._rtcClient.getCurrentId()]), this._stateMachine.getState() === m.END)
1632
- return await this._rtcClient.leaveRoom(o), this._room = null, { code: h.SUCCESS };
1633
- n.length < 1 && (this.joinRoomTimer = new De(() => {
1634
- this._exceptionClose(g.REMOTE_NETWORK_ERROR);
1610
+ if (i !== p.SUCCESS)
1611
+ return i === p.NOT_OPEN_VIDEO_AUDIO_SERVER && this._exceptionClose(d.SERVICE_NOT_OPENED), i === p.SIGNAL_JOIN_RTC_ROOM_REFUSED ? this._exceptionClose(d.OTHER_CLIENT_IN_CALL) : this._exceptionClose(d.NETWORK_ERROR), this._logger.info("_", `[RCCallClient _joinRoom] join room failed: roomId -> ${e} RCRTCCode -> ${i}`), { code: l.JOIN_ROOM_ERROR };
1612
+ if (this._stateMachine.getConversationType() === D.GROUP && this._stateMachine.userJoin([this._rtcClient.getCurrentId()]), this._stateMachine.getState() === T.END)
1613
+ return await this._rtcClient.leaveRoom(o), this._room = null, { code: l.SUCCESS };
1614
+ n.length < 1 && (this.joinRoomTimer = new Pe(() => {
1615
+ this._exceptionClose(d.REMOTE_NETWORK_ERROR);
1635
1616
  }, 6e4)), this._room = o;
1636
1617
  } catch (i) {
1637
- return this._exceptionClose(g.NETWORK_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _rtcClient.joinRTCRoom throw exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1618
+ return this._exceptionClose(d.NETWORK_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _rtcClient.joinRTCRoom throw exception roomId -> ${e}`), console.error(i), { code: l.JOIN_ROOM_ERROR };
1638
1619
  }
1639
1620
  this._registerRoomEventListener(), this._registerReportListener();
1640
1621
  try {
1641
1622
  await this._subscribeInRoomRemoteTrack();
1642
1623
  } catch (i) {
1643
- return this._exceptionClose(g.SUBSCRIBE_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _subscribeInRoomRemoteTrack Exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1624
+ return this._exceptionClose(d.SUBSCRIBE_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _subscribeInRoomRemoteTrack Exception roomId -> ${e}`), console.error(i), { code: l.JOIN_ROOM_ERROR };
1644
1625
  }
1645
1626
  try {
1646
1627
  await this._publish();
1647
1628
  } catch (i) {
1648
- return this._exceptionClose(g.PUBLISH_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _publish Exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1629
+ return this._exceptionClose(d.PUBLISH_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _publish Exception roomId -> ${e}`), console.error(i), { code: l.JOIN_ROOM_ERROR };
1649
1630
  }
1650
- return { code: h.SUCCESS };
1631
+ return { code: l.SUCCESS };
1651
1632
  }
1652
1633
  /**
1653
1634
  * (初始化房间的时候) 订阅远程的流,把远程的流抛给用户
@@ -1656,7 +1637,7 @@ class F {
1656
1637
  const e = this._room.getRemoteTracks();
1657
1638
  if (e.length) {
1658
1639
  const { code: t } = await this._subscribeRetry(e, this._options.isAllowSubscribeRetry, this._RETRYCOUNT);
1659
- t !== O.SUCCESS && (this._exceptionClose(g.SUBSCRIBE_ERROR), this._logger.error("_", `[RCCallSession _subscribeInRoomRemoteTrack] Resource subscription failed roomId -> ${this._stateMachine.getCallId()} RTC code -> ${t}`));
1640
+ t !== p.SUCCESS && (this._exceptionClose(d.SUBSCRIBE_ERROR), this._logger.error("_", `[RCCallSession _subscribeInRoomRemoteTrack] Resource subscription failed roomId -> ${this._stateMachine.getCallId()} RTC code -> ${t}`));
1660
1641
  }
1661
1642
  }
1662
1643
  /**
@@ -1667,7 +1648,7 @@ class F {
1667
1648
  */
1668
1649
  async _subscribeRetry(e, t = !1, i = 0) {
1669
1650
  const { code: n } = await this._room.subscribe(e);
1670
- if (n !== O.SUCCESS) {
1651
+ if (n !== p.SUCCESS) {
1671
1652
  try {
1672
1653
  this._listener.onTrackSubscribeFail && this._listener.onTrackSubscribeFail(n, this);
1673
1654
  } catch (o) {
@@ -1686,8 +1667,8 @@ class F {
1686
1667
  */
1687
1668
  async _publish() {
1688
1669
  const e = this._options.localTracks, { code: t } = await this._publishRetry(e, this._options.isAllowPublishRetry, this._RETRYCOUNT);
1689
- if (t !== O.SUCCESS) {
1690
- this._exceptionClose(g.PUBLISH_ERROR), this._logger.info("_", `[RCCallSession _publist] Resource publishing failed: roomId -> ${this._stateMachine.getCallId()} RCRTCCode -> ${t}`);
1670
+ if (t !== p.SUCCESS) {
1671
+ this._exceptionClose(d.PUBLISH_ERROR), this._logger.info("_", `[RCCallSession _publist] Resource publishing failed: roomId -> ${this._stateMachine.getCallId()} RCRTCCode -> ${t}`);
1691
1672
  return;
1692
1673
  }
1693
1674
  this._options.produceType === x.CALLEE && this._notifyTrackReady(e);
@@ -1700,7 +1681,7 @@ class F {
1700
1681
  */
1701
1682
  async _publishRetry(e, t = !1, i = 0) {
1702
1683
  const { code: n } = await this._room.publish(e);
1703
- if (n !== O.SUCCESS) {
1684
+ if (n !== p.SUCCESS) {
1704
1685
  try {
1705
1686
  this._listener.onTrackPublishFail && this._listener.onTrackPublishFail(n, this);
1706
1687
  } catch (o) {
@@ -1724,7 +1705,7 @@ class F {
1724
1705
  this._logger.error("_", "[RCCallSession _leaveRoom] leaveRoom throw exception"), console.error(e);
1725
1706
  } finally {
1726
1707
  const e = this._stateMachine.getSummary();
1727
- $.emit("sessionClose", { session: this, summaryInfo: e });
1708
+ B.emit("sessionClose", { session: this, summaryInfo: e });
1728
1709
  }
1729
1710
  }
1730
1711
  /**
@@ -1738,7 +1719,7 @@ class F {
1738
1719
  * 用户调用的,注册session上的监听
1739
1720
  */
1740
1721
  registerSessionListener(e) {
1741
- const t = K(e);
1722
+ const t = j(e);
1742
1723
  if (!t.result)
1743
1724
  throw new Error(`[RCCallSession registerSessionListener] ${t.msg}`);
1744
1725
  this._listener = { ...e };
@@ -1747,40 +1728,40 @@ class F {
1747
1728
  * 调RTC API 获得本地流
1748
1729
  */
1749
1730
  async _getLocalTrackCore(e, t) {
1750
- if (e === y.AUDIO) {
1731
+ if (e === O.AUDIO) {
1751
1732
  const { code: o, track: r } = await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC", t && t.audio && { ...t.audio });
1752
- return o !== O.SUCCESS ? (this._logger.error("_", `[RCCallSession _getLocalTrackCore] get Audio local tracks failed RCT code -> ${o}`), { code: h.GET_LOCAL_AUDIO_TRACK_ERROR }) : (this._logger.info("_", "[RCCallSession _getLocalTrackCore] successfully get Audio local tracks"), { code: h.SUCCESS, tracks: [r] });
1733
+ return o !== p.SUCCESS ? (this._logger.error("_", `[RCCallSession _getLocalTrackCore] get Audio local tracks failed RCT code -> ${o}`), { code: l.GET_LOCAL_AUDIO_TRACK_ERROR }) : (this._logger.info("_", "[RCCallSession _getLocalTrackCore] successfully get Audio local tracks"), { code: l.SUCCESS, tracks: [r] });
1753
1734
  }
1754
1735
  const { code: i, tracks: n } = await this._rtcClient.createMicrophoneAndCameraTracks("RongCloudRTC", t && { ...t });
1755
- return i !== O.SUCCESS ? (this._logger.error("_", `[RCCallSession _getLocalTrackCore] get Audio and Video local tracks failed RCT code -> ${i}`), { code: h.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR }) : (this._logger.info("_", "[RCCallSession _getLocalTrackCore] successfully get audio and video local tracks"), { code: h.SUCCESS, tracks: n });
1736
+ return i !== p.SUCCESS ? (this._logger.error("_", `[RCCallSession _getLocalTrackCore] get Audio and Video local tracks failed RCT code -> ${i}`), { code: l.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR }) : (this._logger.info("_", "[RCCallSession _getLocalTrackCore] successfully get audio and video local tracks"), { code: l.SUCCESS, tracks: n });
1756
1737
  }
1757
1738
  async _getLocalTrack(e, t) {
1758
- if (this._options.isAllowDemotionGetStream && e === y.AUDIO_VIDEO) {
1759
- const { code: o, tracks: r } = await this._getLocalTrackCore(y.AUDIO_VIDEO, t);
1760
- if (o !== h.SUCCESS) {
1761
- const { code: a, tracks: c } = await this._getLocalTrackCore(y.AUDIO, t);
1762
- return a !== h.SUCCESS ? (this._exceptionClose(g.GET_MEDIA_RESOURCES_ERROR), { code: a }) : { code: a, tracks: c };
1739
+ if (this._options.isAllowDemotionGetStream && e === O.AUDIO_VIDEO) {
1740
+ const { code: o, tracks: r } = await this._getLocalTrackCore(O.AUDIO_VIDEO, t);
1741
+ if (o !== l.SUCCESS) {
1742
+ const { code: a, tracks: h } = await this._getLocalTrackCore(O.AUDIO, t);
1743
+ return a !== l.SUCCESS ? (this._exceptionClose(d.GET_MEDIA_RESOURCES_ERROR), { code: a }) : { code: a, tracks: h };
1763
1744
  }
1764
1745
  return { code: o, tracks: r };
1765
1746
  }
1766
1747
  const { code: i, tracks: n } = await this._getLocalTrackCore(e, t);
1767
- return i !== h.SUCCESS ? (this._exceptionClose(g.GET_MEDIA_RESOURCES_ERROR), { code: i }) : { code: i, tracks: n };
1748
+ return i !== l.SUCCESS ? (this._exceptionClose(d.GET_MEDIA_RESOURCES_ERROR), { code: i }) : { code: i, tracks: n };
1768
1749
  }
1769
1750
  /**
1770
1751
  * 通话中更换音频设备
1771
1752
  */
1772
1753
  async changeAudioDevice(e) {
1773
1754
  const t = [], i = [], { code: n, track: o } = await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC", e);
1774
- if (n !== O.SUCCESS)
1775
- return this._logger.error("_", `[RCCallSession changeDevice] get local Audio tracks failed RCTLib code -> ${n}`), { code: h.GET_LOCAL_AUDIO_TRACK_ERROR };
1755
+ if (n !== p.SUCCESS)
1756
+ return this._logger.error("_", `[RCCallSession changeDevice] get local Audio tracks failed RCTLib code -> ${n}`), { code: l.GET_LOCAL_AUDIO_TRACK_ERROR };
1776
1757
  if (this._options.localTracks && this._options.localTracks.forEach((r) => {
1777
1758
  r.isAudioTrack() || i.push(r);
1778
1759
  }), t.push(o), i.push(o), this._options.localTracks = i, this._notifyTrackReady(t), this._room) {
1779
1760
  const { code: r } = await this._room.publish(t);
1780
- if (r !== O.SUCCESS)
1781
- return { code: h.AUDIO_PUBLISH_ERROR };
1761
+ if (r !== p.SUCCESS)
1762
+ return { code: l.AUDIO_PUBLISH_ERROR };
1782
1763
  }
1783
- return { code: h.SUCCESS };
1764
+ return { code: l.SUCCESS };
1784
1765
  }
1785
1766
  /**
1786
1767
  * 群呼叫中继续邀请
@@ -1790,28 +1771,36 @@ class F {
1790
1771
  * @deprecated 5.1.2 废弃 options.pushContent 通知内容
1791
1772
  */
1792
1773
  async invite(e, t = {}) {
1793
- var _, d;
1794
- const { extra: i = "" } = t, { pushTitle: n = "", pushContent: o = "" } = (_ = this._options.callPushConfig) != null && _.pushTitle || (d = this._options.callPushConfig) != null && d.pushContent ? this._options.callPushConfig : t, r = [le(e), q(i), j(n), W(o)], a = [];
1795
- if (!r.every((I) => (!I.result && a.push(I.msg), I.result)))
1796
- throw new Error(`[RCCallClient invite] ${a.join(`
1774
+ const { extra: i = "" } = t, n = this._options.callPushConfig ? this._options.callPushConfig : t.pushConfig, o = [le(e), X(i)];
1775
+ if (n) {
1776
+ const { code: c, errorMsg: _ } = J(n);
1777
+ if (c !== l.SUCCESS)
1778
+ return this._logger.error("_", `[RCCallSession invite] param error, errorMsg: ${_}`), { code: c };
1779
+ }
1780
+ const r = [];
1781
+ if (!o.every((c) => (!c.result && r.push(c.msg), c.result)))
1782
+ throw new Error(`[RCCallClient invite] ${r.join(`
1797
1783
  `)}`);
1798
- const { code: l } = await this._stateMachine.invite(e, { extra: i, pushTitle: n, pushContent: o });
1799
- return { code: l };
1784
+ const { code: h } = await this._stateMachine.invite(e, {
1785
+ extra: i,
1786
+ pushConfig: n
1787
+ });
1788
+ return { code: h };
1800
1789
  }
1801
1790
  /**
1802
1791
  * 同意接听
1803
1792
  */
1804
1793
  async accept(e) {
1805
- const t = ve(e);
1794
+ const t = be(e);
1806
1795
  if (!t.result)
1807
1796
  throw new Error(`[RCCallSession accept] ${t.msg}`);
1808
- $.emit("hungupOtherSession", { session: this });
1797
+ B.emit("hungupOtherSession", { session: this });
1809
1798
  const i = this._stateMachine.getMediaType(), { code: n, tracks: o } = await this._getLocalTrack(i, e);
1810
- if (n !== h.SUCCESS)
1799
+ if (n !== l.SUCCESS)
1811
1800
  return { code: n };
1812
1801
  this._options.localTracks = o;
1813
1802
  const { code: r } = await this._stateMachine.accept();
1814
- return r !== h.SUCCESS ? (this._logger.error("_", `[RCCallSession accept]Send accept message failed -> code: ${r}`), { code: r }) : { code: r };
1803
+ return r !== l.SUCCESS ? (this._logger.error("_", `[RCCallSession accept]Send accept message failed -> code: ${r}`), { code: r }) : { code: r };
1815
1804
  }
1816
1805
  /**
1817
1806
  * 挂断
@@ -1825,7 +1814,7 @@ class F {
1825
1814
  */
1826
1815
  async _changeMediaType(e) {
1827
1816
  const { code: t } = await this._stateMachine.changeMediaType(e);
1828
- return t !== h.SUCCESS && this._logger.error("_", `[RCCallSession _changeMediaType] change media type fail code-> ${t}`), { code: t };
1817
+ return t !== l.SUCCESS && this._logger.error("_", `[RCCallSession _changeMediaType] change media type fail code-> ${t}`), { code: t };
1829
1818
  }
1830
1819
  /**
1831
1820
  * 获得本地视频
@@ -1846,14 +1835,14 @@ class F {
1846
1835
  */
1847
1836
  async _setMediaTypeToAudioAndVideo() {
1848
1837
  const { code: e, track: t } = await this._rtcClient.createCameraVideoTrack();
1849
- if (e !== O.SUCCESS)
1850
- return { code: h.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR };
1838
+ if (e !== p.SUCCESS)
1839
+ return { code: l.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR };
1851
1840
  const { code: i } = await this._room.publish([t]);
1852
- if (i !== O.SUCCESS) {
1841
+ if (i !== p.SUCCESS) {
1853
1842
  this._logger.error("_", `[RCCallSession _enableVideo] Resource publishing failed: RCRTCCode -> ${e}`);
1854
1843
  return;
1855
1844
  }
1856
- this._notifyTrackReady([t]), this._changeMediaType(y.AUDIO_VIDEO);
1845
+ this._notifyTrackReady([t]), this._changeMediaType(O.AUDIO_VIDEO);
1857
1846
  }
1858
1847
  /**
1859
1848
  * 把通话的MediaType降级到音频
@@ -1866,7 +1855,7 @@ class F {
1866
1855
  i.mute();
1867
1856
  });
1868
1857
  const { code: t } = await this._room.unpublish(e);
1869
- t !== O.SUCCESS && this._logger.error("_", `[RCCallSession disableVideo] unpublish failed -> ${t}`), this._destroyTracks(e);
1858
+ t !== p.SUCCESS && this._logger.error("_", `[RCCallSession disableVideo] unpublish failed -> ${t}`), this._destroyTracks(e);
1870
1859
  }
1871
1860
  }
1872
1861
  /**
@@ -1874,55 +1863,55 @@ class F {
1874
1863
  *
1875
1864
  */
1876
1865
  async descendAbility() {
1877
- const { code: e } = await this._changeMediaType(y.AUDIO);
1878
- return e === h.SUCCESS && this._setMediaTypeToAudio(), { code: e };
1866
+ const { code: e } = await this._changeMediaType(O.AUDIO);
1867
+ return e === l.SUCCESS && this._setMediaTypeToAudio(), { code: e };
1879
1868
  }
1880
1869
  /**
1881
1870
  * 禁用视频track
1882
1871
  */
1883
1872
  async disableVideoTrack() {
1884
1873
  if (!this._room)
1885
- return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${h.NOT_IN_ROOM_ERROR}`), { code: h.NOT_IN_ROOM_ERROR };
1874
+ return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${l.NOT_IN_ROOM_ERROR}`), { code: l.NOT_IN_ROOM_ERROR };
1886
1875
  const e = this._getLocalVideoTracks();
1887
1876
  if (!e.length)
1888
- return this._logger.error("_", `[RCCallSession disableVideoTrack] Room missing video track -> ${h.MISSING_VIDEO_TRACK_ERROR}`), { code: h.MISSING_VIDEO_TRACK_ERROR };
1877
+ return this._logger.error("_", `[RCCallSession disableVideoTrack] Room missing video track -> ${l.MISSING_VIDEO_TRACK_ERROR}`), { code: l.MISSING_VIDEO_TRACK_ERROR };
1889
1878
  if (e.forEach((i) => {
1890
1879
  i.mute();
1891
1880
  }), !this._options.isOffCameraWhenVideoDisable)
1892
- return { code: h.SUCCESS };
1881
+ return { code: l.SUCCESS };
1893
1882
  const { code: t } = await this._room.unpublish(e);
1894
- return t !== O.SUCCESS ? (this._logger.error("_", `[RCCallSession disableVideo] unpublish failed -> ${t}`), { code: h.UNPUBLISH_VIDEO_ERROR }) : (e.forEach((i) => {
1883
+ return t !== p.SUCCESS ? (this._logger.error("_", `[RCCallSession disableVideo] unpublish failed -> ${t}`), { code: l.UNPUBLISH_VIDEO_ERROR }) : (e.forEach((i) => {
1895
1884
  i.destroy();
1896
- }), { code: h.SUCCESS });
1885
+ }), { code: l.SUCCESS });
1897
1886
  }
1898
1887
  /**
1899
1888
  * 启用视频track
1900
1889
  */
1901
1890
  async enableVideoTrack() {
1902
1891
  if (!this._room)
1903
- return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${h.NOT_IN_ROOM_ERROR}`), { code: h.NOT_IN_ROOM_ERROR };
1892
+ return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${l.NOT_IN_ROOM_ERROR}`), { code: l.NOT_IN_ROOM_ERROR };
1904
1893
  if (!this._options.isOffCameraWhenVideoDisable) {
1905
1894
  const o = this._getLocalVideoTracks();
1906
1895
  return o.length ? (o.forEach((r) => {
1907
1896
  r.unmute();
1908
- }), { code: h.SUCCESS }) : (this._logger.error("_", `[RCCallSession EnableVideoTrack] Room missing video track -> ${h.MISSING_VIDEO_TRACK_ERROR}`), { code: h.MISSING_VIDEO_TRACK_ERROR });
1897
+ }), { code: l.SUCCESS }) : (this._logger.error("_", `[RCCallSession EnableVideoTrack] Room missing video track -> ${l.MISSING_VIDEO_TRACK_ERROR}`), { code: l.MISSING_VIDEO_TRACK_ERROR });
1909
1898
  }
1910
1899
  const { code: e, track: t } = await this._rtcClient.createCameraVideoTrack();
1911
- if (e !== O.SUCCESS)
1912
- return this._logger.error("_", `[RCCallSession EnableVideoTrack] Get Resource failed: RCRTCCode -> ${e}`), { code: h.GET_LOCAL_VIDEO_TRACK_ERROR };
1900
+ if (e !== p.SUCCESS)
1901
+ return this._logger.error("_", `[RCCallSession EnableVideoTrack] Get Resource failed: RCRTCCode -> ${e}`), { code: l.GET_LOCAL_VIDEO_TRACK_ERROR };
1913
1902
  const i = [];
1914
1903
  this._options.localTracks && this._options.localTracks.forEach((o) => {
1915
1904
  o.isVideoTrack() ? o.destroy() : i.push(o);
1916
1905
  }), i.push(t), this._options.localTracks = i, t.mute();
1917
1906
  const { code: n } = await this._room.publish([t]);
1918
- return n !== O.SUCCESS ? (this._logger.error("_", `[RCCallSession EnableVideoTrack] Resource publishing failed: RCRTCCode -> ${e}`), { code: h.VIDEO_PUBLISH_ERROR }) : (t.unmute(), this._notifyTrackReady([t]), { code: h.SUCCESS });
1907
+ return n !== p.SUCCESS ? (this._logger.error("_", `[RCCallSession EnableVideoTrack] Resource publishing failed: RCRTCCode -> ${e}`), { code: l.VIDEO_PUBLISH_ERROR }) : (t.unmute(), this._notifyTrackReady([t]), { code: l.SUCCESS });
1919
1908
  }
1920
1909
  /**
1921
1910
  * 禁用音频track
1922
1911
  */
1923
1912
  async disableAudioTrack() {
1924
1913
  if (!this._room)
1925
- return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${h.NOT_IN_ROOM_ERROR}`), { code: h.NOT_IN_ROOM_ERROR };
1914
+ return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${l.NOT_IN_ROOM_ERROR}`), { code: l.NOT_IN_ROOM_ERROR };
1926
1915
  this._getLocalAudioTracks().forEach((t) => {
1927
1916
  t.mute();
1928
1917
  });
@@ -1932,10 +1921,10 @@ class F {
1932
1921
  */
1933
1922
  async enableAudioTrack() {
1934
1923
  if (!this._room)
1935
- return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${h.NOT_IN_ROOM_ERROR}`), { code: h.NOT_IN_ROOM_ERROR };
1924
+ return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${l.NOT_IN_ROOM_ERROR}`), { code: l.NOT_IN_ROOM_ERROR };
1936
1925
  const e = this._getLocalAudioTracks();
1937
1926
  if (!e.length)
1938
- return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${h.MISSING_VIDEO_TRACK_ERROR}`), { code: h.MISSING_VIDEO_TRACK_ERROR };
1927
+ return this._logger.error("_", `[RCCallSession disableAudioTrack] Room missing audio track -> ${l.MISSING_VIDEO_TRACK_ERROR}`), { code: l.MISSING_VIDEO_TRACK_ERROR };
1939
1928
  e.forEach((t) => {
1940
1929
  t.unmute();
1941
1930
  });
@@ -1976,7 +1965,7 @@ class F {
1976
1965
  */
1977
1966
  onKickOff: (e, t) => {
1978
1967
  const i = this._rtcClient.getCurrentId();
1979
- this._stateMachine.userLeave([i]), e ? (t === Z.SERVER_KICK && this._exceptionClose(g.KICKED_BY_SERVER), t === Z.OTHER_KICK && this._exceptionClose(g.OTHER_CLIENT_JOINED_CALL)) : this._exceptionClose(g.NETWORK_ERROR);
1968
+ this._stateMachine.userLeave([i]), e ? (t === Q.SERVER_KICK && this._exceptionClose(d.KICKED_BY_SERVER), t === Q.OTHER_KICK && this._exceptionClose(d.OTHER_CLIENT_JOINED_CALL)) : this._exceptionClose(d.NETWORK_ERROR);
1980
1969
  },
1981
1970
  /**
1982
1971
  * 接收到房间信令时回调,用户可通过房间实例的 `sendMessage(name, content)` 接口发送信令
@@ -2038,7 +2027,7 @@ class F {
2038
2027
  onTrackPublish: async (e) => {
2039
2028
  if (this._room) {
2040
2029
  const { code: t } = await this._room.subscribe(e);
2041
- t !== O.SUCCESS && this._logger.error("_", `[RCCallSession onTrackPublish] subscribe failed RTCCode ->${t}`);
2030
+ t !== p.SUCCESS && this._logger.error("_", `[RCCallSession onTrackPublish] subscribe failed RTCCode ->${t}`);
2042
2031
  }
2043
2032
  },
2044
2033
  /**
@@ -2053,7 +2042,7 @@ class F {
2053
2042
  * @param track RCRemoteTrack 类实例
2054
2043
  */
2055
2044
  onTrackReady: (e) => {
2056
- this._stateMachine.getMediaType() === y.AUDIO && e.isVideoTrack() || this._notifyTrackReady([e]);
2045
+ this._stateMachine.getMediaType() === O.AUDIO && e.isVideoTrack() || this._notifyTrackReady([e]);
2057
2046
  },
2058
2047
  /**
2059
2048
  * 人员加入
@@ -2181,7 +2170,7 @@ class F {
2181
2170
  return this._stateMachine.getMediaType();
2182
2171
  }
2183
2172
  }
2184
- class ke {
2173
+ class He {
2185
2174
  constructor(e, t, i, n) {
2186
2175
  /**
2187
2176
  * rtc实例
@@ -2199,8 +2188,14 @@ class ke {
2199
2188
  * session列表
2200
2189
  */
2201
2190
  f(this, "_sessionList", []);
2202
- f(this, "_callPushConfig", {});
2203
- f(this, "_hungupPushConfig", {});
2191
+ /**
2192
+ * 移动端呼叫推送配置
2193
+ */
2194
+ f(this, "_callPushConfig");
2195
+ /**
2196
+ * 移动端挂断推送配置
2197
+ */
2198
+ f(this, "_hungupPushConfig");
2204
2199
  this._context = e, this._runtime = t, this._logger = i, this._rtcClient = n.rtcClient, this._options = {
2205
2200
  /**
2206
2201
  * 是否允许发布重试, 默认不允许
@@ -2220,7 +2215,7 @@ class ke {
2220
2215
  * RTCJoinType.REFUSE = 1,当前加入拒绝
2221
2216
  * RTCJoinType.COEXIST = 2 两个设备共存
2222
2217
  */
2223
- joinType: ie.COEXIST,
2218
+ joinType: ne.COEXIST,
2224
2219
  /**
2225
2220
  * 允许降级获得流,获得音视频不成功 ,降级获得音频, 默认不允许
2226
2221
  */
@@ -2230,7 +2225,7 @@ class ke {
2230
2225
  */
2231
2226
  lang: P.ZH,
2232
2227
  ...n
2233
- }, this._callEngine = new me(this._context, t, this._logger, {
2228
+ }, this._callEngine = new Oe(this._context, t, this._logger, {
2234
2229
  /**
2235
2230
  * 监听收到invite
2236
2231
  */
@@ -2244,16 +2239,16 @@ class ke {
2244
2239
  * 语言设置 (推送), 不传默认为中文
2245
2240
  */
2246
2241
  lang: this._options.lang || P.ZH
2247
- }), $.on("sessionClose", ({ session: o, summaryInfo: r }) => {
2242
+ }), B.on("sessionClose", ({ session: o, summaryInfo: r }) => {
2248
2243
  this._removeSession(o);
2249
2244
  try {
2250
2245
  this._options.onSessionClose(o, r);
2251
2246
  } catch (a) {
2252
2247
  this._logger.error("_", "[RCCCallClient] options.onSessionClose exception"), console.log(a);
2253
2248
  }
2254
- }), $.on("hungupOtherSession", ({ session: o }) => {
2249
+ }), B.on("hungupOtherSession", ({ session: o }) => {
2255
2250
  const r = o.getSessionId();
2256
- this._logger.info("_", `[RCCallClient hungupOtherSession] sessionId ready to accept -> ${r}`), this._logger.info("_", `[RCCallClient hungupOtherSession] sessionList ->${this._sessionList.map((c) => c.getSessionId()).join(",")}`);
2251
+ this._logger.info("_", `[RCCallClient hungupOtherSession] sessionId ready to accept -> ${r}`), this._logger.info("_", `[RCCallClient hungupOtherSession] sessionList ->${this._sessionList.map((h) => h.getSessionId()).join(",")}`);
2257
2252
  let a = 0;
2258
2253
  for (; this._sessionList.length > 1; )
2259
2254
  this._sessionList[a].getSessionId() !== r ? (this._sessionList[a].hungup(), this._sessionList.splice(a, 1)) : a++;
@@ -2265,7 +2260,7 @@ class ke {
2265
2260
  */
2266
2261
  _onInvite(e, t) {
2267
2262
  this._logger.info("_", "[RCCallClient _onInvite] Received invite message");
2268
- const i = new F(e, this._rtcClient, this._logger, {
2263
+ const i = new z(e, this._rtcClient, this._logger, {
2269
2264
  // 是否允许订阅重试
2270
2265
  isAllowSubscribeRetry: this._options.isAllowSubscribeRetry,
2271
2266
  // 是否允许发布重试
@@ -2292,7 +2287,7 @@ class ke {
2292
2287
  this._logger.error("_", "[RCCallClient _options.onSession] onSession exception"), console.log(n);
2293
2288
  }
2294
2289
  if (i._listener) {
2295
- const n = K(i._listener);
2290
+ const n = j(i._listener);
2296
2291
  if (!n.result)
2297
2292
  throw new Error(n.msg);
2298
2293
  } else
@@ -2333,14 +2328,14 @@ class ke {
2333
2328
  */
2334
2329
  async startCrossCall({
2335
2330
  targetId: e,
2336
- mediaType: t = y.AUDIO,
2331
+ mediaType: t = O.AUDIO,
2337
2332
  listener: i,
2338
2333
  constraints: n,
2339
2334
  channelId: o = "",
2340
2335
  extra: r = "",
2341
2336
  pushTitle: a = "",
2342
- pushContent: c = "",
2343
- bitrate: l
2337
+ pushContent: h = "",
2338
+ bitrate: c
2344
2339
  }) {
2345
2340
  return this.__call({
2346
2341
  targetId: e,
@@ -2350,8 +2345,8 @@ class ke {
2350
2345
  channelId: o,
2351
2346
  extra: r,
2352
2347
  pushTitle: a,
2353
- pushContent: c,
2354
- bitrate: l,
2348
+ pushContent: h,
2349
+ bitrate: c,
2355
2350
  isCrossAppkey: !0
2356
2351
  });
2357
2352
  }
@@ -2370,14 +2365,14 @@ class ke {
2370
2365
  */
2371
2366
  async call({
2372
2367
  targetId: e,
2373
- mediaType: t = y.AUDIO,
2368
+ mediaType: t = O.AUDIO,
2374
2369
  listener: i,
2375
2370
  constraints: n,
2376
2371
  channelId: o = "",
2377
2372
  extra: r = "",
2378
2373
  pushTitle: a = "",
2379
- pushContent: c = "",
2380
- bitrate: l
2374
+ pushContent: h = "",
2375
+ bitrate: c
2381
2376
  }) {
2382
2377
  return this.__call({
2383
2378
  targetId: e,
@@ -2387,41 +2382,44 @@ class ke {
2387
2382
  channelId: o,
2388
2383
  extra: r,
2389
2384
  pushTitle: a,
2390
- pushContent: c,
2391
- bitrate: l
2385
+ pushContent: h,
2386
+ bitrate: c
2392
2387
  });
2393
2388
  }
2394
2389
  async __call({
2395
2390
  targetId: e,
2396
- mediaType: t = y.AUDIO,
2391
+ mediaType: t = O.AUDIO,
2397
2392
  listener: i,
2398
2393
  constraints: n,
2399
2394
  channelId: o = "",
2400
2395
  extra: r = "",
2401
2396
  pushTitle: a = "",
2402
- pushContent: c = "",
2403
- bitrate: l,
2397
+ pushContent: h = "",
2398
+ bitrate: c,
2404
2399
  isCrossAppkey: _ = !1
2405
2400
  }) {
2406
- const { pushTitle: d = "", pushContent: I = "" } = this._callPushConfig.pushTitle || this._callPushConfig.pushContent ? this._callPushConfig : { pushTitle: a, pushContent: c };
2407
- this._logger.info("_", `[RCCallClient call] extra->${r} pushTitle->${d} pushContent->${I}`);
2408
- const E = [ee(e), te(t), K(i), q(r), j(d), W(I)], u = [];
2409
- if (!E.every((C) => (!C.result && u.push(C.msg), C.result)))
2410
- throw new Error(`[RCCallClient call] ${u.join(`
2401
+ const u = this._callPushConfig ? this._callPushConfig : { pushTitle: a, pushContent: h };
2402
+ this._logger.info("_", `[RCCallClient call] extra->${r} pushConfig->${JSON.stringify(u)}`);
2403
+ const S = [te(e), se(t), j(i), X(r)], C = [];
2404
+ if (!S.every((I) => (!I.result && C.push(I.msg), I.result)))
2405
+ throw new Error(`[RCCallClient call] ${C.join(`
2411
2406
  `)}`);
2412
- let M = [];
2413
- const { code: p, tracks: A } = await this._getLocalTrack(t, n);
2414
- if (p !== h.SUCCESS)
2415
- return { code: p };
2416
- M = A, M.forEach((C) => {
2417
- var U, v, k;
2418
- C.isAudioTrack() && (l != null && l.audio) && C.setBitrate(l == null ? void 0 : l.audio), C.isVideoTrack() && (l != null && l.video) && C.setBitrate((U = l == null ? void 0 : l.video) == null ? void 0 : U.max, (v = l == null ? void 0 : l.video) == null ? void 0 : v.min, (k = l == null ? void 0 : l.video) == null ? void 0 : k.start), i.onTrackReady(C);
2407
+ const { code: y, errorMsg: U } = J(u);
2408
+ if (y !== l.SUCCESS)
2409
+ return this._logger.error("_", `[RCCallClient call] param error, errorMsg: ${U}`), { code: y };
2410
+ let E = [];
2411
+ const { code: M, tracks: N } = await this._getLocalTrack(t, n);
2412
+ if (M !== l.SUCCESS)
2413
+ return { code: M };
2414
+ E = N, E.forEach((I) => {
2415
+ var L, k, H;
2416
+ I.isAudioTrack() && (c != null && c.audio) && I.setBitrate(c == null ? void 0 : c.audio), I.isVideoTrack() && (c != null && c.video) && I.setBitrate((L = c == null ? void 0 : c.video) == null ? void 0 : L.max, (k = c == null ? void 0 : c.video) == null ? void 0 : k.min, (H = c == null ? void 0 : c.video) == null ? void 0 : H.start), i.onTrackReady(I);
2419
2417
  });
2420
- const { code: S, stateMachine: L } = await this._callEngine.call(o, e, t, r, d, I, _);
2421
- if (S === h.SUCCESS && L) {
2418
+ const { code: A, stateMachine: v } = await this._callEngine.call(o, e, t, r, u, _);
2419
+ if (A === l.SUCCESS && v) {
2422
2420
  this._logger.info("_", "[RCCallClient call] successfully created state machine");
2423
- const C = new F(L, this._rtcClient, this._logger, {
2424
- localTracks: M,
2421
+ const I = new z(v, this._rtcClient, this._logger, {
2422
+ localTracks: E,
2425
2423
  // 是否允许订阅重试
2426
2424
  isAllowSubscribeRetry: this._options.isAllowSubscribeRetry,
2427
2425
  // 是否允许订阅重试
@@ -2442,11 +2440,11 @@ class ke {
2442
2440
  callPushConfig: this._callPushConfig,
2443
2441
  hungupPushConfig: this._hungupPushConfig
2444
2442
  });
2445
- return C.registerSessionListener(i), this._sessionList.push(C), this._logger.info("_", `[RCCallClient call] successfully created session object, sessionId: ${C.getSessionId()}`), { code: S, session: C };
2443
+ return I.registerSessionListener(i), this._sessionList.push(I), this._logger.info("_", `[RCCallClient call] successfully created session object, sessionId: ${I.getSessionId()}`), { code: A, session: I };
2446
2444
  }
2447
- return this._logger.error("_", `[RCCallClient call] call failed code ->: ${S}`), M.forEach((C) => {
2448
- C.mute(), C.destroy();
2449
- }), { code: S };
2445
+ return this._logger.error("_", `[RCCallClient call] call failed code ->: ${A}`), E.forEach((I) => {
2446
+ I.mute(), I.destroy();
2447
+ }), { code: A };
2450
2448
  }
2451
2449
  /**
2452
2450
  * 发起群组呼叫
@@ -2464,32 +2462,35 @@ class ke {
2464
2462
  async callInGroup({
2465
2463
  targetId: e,
2466
2464
  userIds: t,
2467
- mediaType: i = y.AUDIO,
2465
+ mediaType: i = O.AUDIO,
2468
2466
  listener: n,
2469
2467
  constraints: o,
2470
2468
  channelId: r = "",
2471
2469
  extra: a = "",
2472
- pushTitle: c = "",
2473
- pushContent: l = "",
2470
+ pushTitle: h = "",
2471
+ pushContent: c = "",
2474
2472
  bitrate: _
2475
2473
  }) {
2476
- const { pushTitle: d = "", pushContent: I = "" } = this._callPushConfig.pushTitle || this._callPushConfig.pushContent ? this._callPushConfig : { pushTitle: c, pushContent: l }, E = [ee(e), le(t), te(i), K(n), q(a), j(d), W(I)], u = [];
2477
- if (!E.every((C) => (!C.result && u.push(C.msg), C.result)))
2478
- throw new Error(`[RCCallClient callInGroup] ${u.join(`
2474
+ const u = this._callPushConfig ? this._callPushConfig : { pushTitle: h, pushContent: c }, S = [te(e), le(t), se(i), j(n), X(a)], C = [];
2475
+ if (!S.every((I) => (!I.result && C.push(I.msg), I.result)))
2476
+ throw new Error(`[RCCallClient callInGroup] ${C.join(`
2479
2477
  `)}`);
2480
- let M = [];
2481
- const { code: p, tracks: A } = await this._getLocalTrack(i, o);
2482
- if (p !== h.SUCCESS)
2483
- return { code: p };
2484
- M = A, M.forEach((C) => {
2485
- var U, v, k;
2486
- C.isAudioTrack() && (_ != null && _.audio) && C.setBitrate(_ == null ? void 0 : _.audio), C.isVideoTrack() && (_ != null && _.video) && C.setBitrate((U = _ == null ? void 0 : _.video) == null ? void 0 : U.max, (v = _ == null ? void 0 : _.video) == null ? void 0 : v.min, (k = _ == null ? void 0 : _.video) == null ? void 0 : k.start), n.onTrackReady(C);
2478
+ const { code: y, errorMsg: U } = J(u);
2479
+ if (y !== l.SUCCESS)
2480
+ return this._logger.error("_", `[RCCallClient call] param error, errorMsg: ${U}`), { code: y };
2481
+ let E = [];
2482
+ const { code: M, tracks: N } = await this._getLocalTrack(i, o);
2483
+ if (M !== l.SUCCESS)
2484
+ return { code: M };
2485
+ E = N, E.forEach((I) => {
2486
+ var L, k, H;
2487
+ I.isAudioTrack() && (_ != null && _.audio) && I.setBitrate(_ == null ? void 0 : _.audio), I.isVideoTrack() && (_ != null && _.video) && I.setBitrate((L = _ == null ? void 0 : _.video) == null ? void 0 : L.max, (k = _ == null ? void 0 : _.video) == null ? void 0 : k.min, (H = _ == null ? void 0 : _.video) == null ? void 0 : H.start), n.onTrackReady(I);
2487
2488
  });
2488
- const { code: S, stateMachine: L } = await this._callEngine.callInGroup(r, e, i, t, a, d, I);
2489
- if (S === h.SUCCESS && L) {
2489
+ const { code: A, stateMachine: v } = await this._callEngine.callInGroup(r, e, i, t, a, u);
2490
+ if (A === l.SUCCESS && v) {
2490
2491
  this._logger.info("_", "[RCCallClient callInGroup] successfully created state machine");
2491
- const C = new F(L, this._rtcClient, this._logger, {
2492
- localTracks: M,
2492
+ const I = new z(v, this._rtcClient, this._logger, {
2493
+ localTracks: E,
2493
2494
  // 是否允许订阅重试
2494
2495
  isAllowSubscribeRetry: this._options.isAllowSubscribeRetry,
2495
2496
  // 是否允许发布重试
@@ -2509,34 +2510,34 @@ class ke {
2509
2510
  callPushConfig: this._callPushConfig,
2510
2511
  hungupPushConfig: this._hungupPushConfig
2511
2512
  });
2512
- return C.registerSessionListener(n), this._sessionList.push(C), this._logger.info("_", `[RCCallClient callInGroup] successfully created session object, sessionId: ${C.getSessionId()}`), { code: S, session: C };
2513
+ return I.registerSessionListener(n), this._sessionList.push(I), this._logger.info("_", `[RCCallClient callInGroup] successfully created session object, sessionId: ${I.getSessionId()}`), { code: A, session: I };
2513
2514
  }
2514
- return this._logger.info("_", `[RCCallClient callInGroup] callInGroup failed code -> ${S}`), M.forEach((C) => {
2515
- C.mute(), C.destroy();
2516
- }), { code: S };
2515
+ return this._logger.info("_", `[RCCallClient callInGroup] callInGroup failed code -> ${A}`), E.forEach((I) => {
2516
+ I.mute(), I.destroy();
2517
+ }), { code: A };
2517
2518
  }
2518
2519
  /**
2519
2520
  * 调RTC API 获得本地流
2520
2521
  */
2521
2522
  async _getLocalTrackCore(e, t) {
2522
- if (e === y.AUDIO) {
2523
+ if (e === O.AUDIO) {
2523
2524
  const { code: o, track: r } = await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC", t && t.audio && { ...t.audio });
2524
- return o !== O.SUCCESS ? (this._logger.error("_", `[RCCallClient _getTrack] get Audio local tracks failed RCT code -> ${o}`), { code: h.GET_LOCAL_AUDIO_TRACK_ERROR }) : (this._logger.info("_", "[RCCallClient _getTrack] successfully get Audio local tracks"), { code: h.SUCCESS, tracks: [r] });
2525
+ return o !== p.SUCCESS ? (this._logger.error("_", `[RCCallClient _getTrack] get Audio local tracks failed RCT code -> ${o}`), { code: l.GET_LOCAL_AUDIO_TRACK_ERROR }) : (this._logger.info("_", "[RCCallClient _getTrack] successfully get Audio local tracks"), { code: l.SUCCESS, tracks: [r] });
2525
2526
  }
2526
2527
  const { code: i, tracks: n } = await this._rtcClient.createMicrophoneAndCameraTracks("RongCloudRTC", t && { ...t });
2527
- return i !== O.SUCCESS ? (this._logger.error("_", `[RCCallClient _getTrack] get Audio and Video local tracks failed RCT code -> ${i}`), { code: h.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR }) : (this._logger.info("_", "[RCCallClient _getTrack] successfully get audio and video local tracks"), { code: h.SUCCESS, tracks: n });
2528
+ return i !== p.SUCCESS ? (this._logger.error("_", `[RCCallClient _getTrack] get Audio and Video local tracks failed RCT code -> ${i}`), { code: l.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR }) : (this._logger.info("_", "[RCCallClient _getTrack] successfully get audio and video local tracks"), { code: l.SUCCESS, tracks: n });
2528
2529
  }
2529
2530
  async _getLocalTrack(e, t) {
2530
- if (this._options.isAllowDemotionGetStream && e === y.AUDIO_VIDEO) {
2531
- const { code: o, tracks: r } = await this._getLocalTrackCore(y.AUDIO_VIDEO, t);
2532
- if (o !== h.SUCCESS) {
2533
- const { code: a, tracks: c } = await this._getLocalTrackCore(y.AUDIO, t);
2534
- return a !== h.SUCCESS ? { code: a } : { code: a, tracks: c };
2531
+ if (this._options.isAllowDemotionGetStream && e === O.AUDIO_VIDEO) {
2532
+ const { code: o, tracks: r } = await this._getLocalTrackCore(O.AUDIO_VIDEO, t);
2533
+ if (o !== l.SUCCESS) {
2534
+ const { code: a, tracks: h } = await this._getLocalTrackCore(O.AUDIO, t);
2535
+ return a !== l.SUCCESS ? { code: a } : { code: a, tracks: h };
2535
2536
  }
2536
2537
  return { code: o, tracks: r };
2537
2538
  }
2538
2539
  const { code: i, tracks: n } = await this._getLocalTrackCore(e, t);
2539
- return i !== h.SUCCESS ? { code: i } : { code: i, tracks: n };
2540
+ return i !== l.SUCCESS ? { code: i } : { code: i, tracks: n };
2540
2541
  }
2541
2542
  /**
2542
2543
  * 从sessionList删除某个session
@@ -2550,50 +2551,47 @@ class ke {
2550
2551
  */
2551
2552
  async getJoinedRoomInfo() {
2552
2553
  const { code: e, data: t } = await this._context.getRTCJoinedUserInfo(this._context.getCurrentId());
2553
- return e !== J.SUCCESS ? (this._logger.error("_", `getJoinedUserInfo error code: ${e}`), { code: h.QUERY_JOINED_USER_INFO_ERROR }) : { code: h.SUCCESS, data: t };
2554
+ return e !== W.SUCCESS ? (this._logger.error("_", `getJoinedUserInfo error code: ${e}`), { code: l.QUERY_JOINED_USER_INFO_ERROR }) : { code: l.SUCCESS, data: t };
2554
2555
  }
2555
2556
  /**
2556
2557
  * 设置呼叫、挂断推送数据
2557
2558
  * @param callPushConfig 呼叫推送配置
2558
- * @param callPushConfig.pushTitle 呼叫推送标题
2559
- * @param callPushConfig.pushContent 呼叫推送内容
2560
2559
  * @param hungupPushConfig 挂断推送配置
2561
- * @param hungupPushConfig.pushTitle 挂断推送标题
2562
- * @param hungupPushConfig.pushContent 挂断推送内容
2560
+ * @description callLib 会内置 IPushConfig 中 pushData 的赋值,业务层无需关注 pushData 字段值
2563
2561
  */
2564
- setPushConfig(e = {}, t = {}) {
2565
- const i = [e, t].map((r) => Ne(r))[0], n = [];
2566
- if (!i.every((r) => (!r.result && n.push(r.msg), r.result)))
2567
- throw new Error(`[RCCallClient callInGroup callPushConfig or hungupPushConfig] ${n.join(`
2568
- `)}`);
2562
+ setPushConfig(e, t) {
2563
+ const i = [e, t].map((n) => J(n));
2564
+ for (const { code: n, errorMsg: o } of i)
2565
+ if (n !== l.SUCCESS)
2566
+ return this._logger.error("_", `[RCCallClient setPushConfig] param error, errorMsg: ${o}`), { code: n };
2569
2567
  this._callPushConfig = e, this._hungupPushConfig = t;
2570
2568
  }
2571
2569
  }
2572
- z.add("plugin-call", "5.2.3");
2573
- const He = {
2570
+ q.add("plugin-call", "5.2.5");
2571
+ const Be = {
2574
2572
  tag: "RCCall",
2575
2573
  verify(s) {
2576
2574
  return s.tag === "browser";
2577
2575
  },
2578
2576
  setup(s, e, t) {
2579
- const i = Me(t);
2577
+ const i = Ue(t);
2580
2578
  if (!i.result)
2581
2579
  throw new Error(`[RCCallLib installer steup]${i.msg}`);
2582
- if (!z.validEngine("5.7.7"))
2583
- throw new Error(`The current engine version '${z.getInfo().engine}' error, plugin-call required engine version at least '5.7.7'.`);
2580
+ if (!q.validEngine("5.9.0"))
2581
+ throw new Error(`The current engine version '${q.getInfo().engine}' error, plugin-call required engine version at least '5.9.0'.`);
2584
2582
  const n = s.createLogger("RCCall", "RTC");
2585
- return t.logOutputLevel && n.setOutputLevel(t.logOutputLevel), typeof t.logLevel < "u" && n.warn("_", "The 'logLevel' parameter is deprecated, please use 'logOutputLevel' instead."), n.warn("_", "RCCall Version: 5.2.3, Commit: e27050187c1e74221d5e1bacd782866037c4c265"), new ke(s, e, n, t);
2583
+ return t.logOutputLevel && n.setOutputLevel(t.logOutputLevel), typeof t.logLevel < "u" && n.warn("_", "The 'logLevel' parameter is deprecated, please use 'logOutputLevel' instead."), n.warn("_", "RCCall Version: 5.2.5, Commit: 3580977730beafd1c85aff0653e30f8c75cff0cf"), new He(s, e, n, t);
2586
2584
  }
2587
2585
  };
2588
2586
  export {
2589
- ke as RCCallClient,
2590
- g as RCCallEndReason,
2591
- h as RCCallErrorCode,
2587
+ He as RCCallClient,
2588
+ d as RCCallEndReason,
2589
+ l as RCCallErrorCode,
2592
2590
  P as RCCallLanguage,
2593
- y as RCCallMediaType,
2594
- F as RCCallSession,
2595
- m as RCCallSessionState,
2596
- T as RCCallUserState,
2597
- He as installer
2591
+ O as RCCallMediaType,
2592
+ z as RCCallSession,
2593
+ T as RCCallSessionState,
2594
+ m as RCCallUserState,
2595
+ Be as installer
2598
2596
  };
2599
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9lbmdpbmUvaGVscGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTXNnQ2FsbFN0YXR1cy50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbENvZGUudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24udHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL1RpbWVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvU3RhdGVNYWNoaW5lLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTWVtYmVyTW9kaWZ5VHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1BsYXRmb3JtLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvT2ZmbGluZVJlY29yZGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvTWVzc2FnZUhhbmRsZXIudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxMYW5nLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2VuLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL3poLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vZW5naW5lL2luZGV4LnRzIiwiLi4vLi4vLi4vc3JjL2VudW1zLnRzIiwiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vLi4vc3JjL2V2ZW50RW1pdHRlci50cyIsIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2hlbHBlci50cyIsIi4uLy4uLy4uL3NyYy90aW1lci50cyIsIi4uLy4uLy4uL3NyYy9SQ0NhbGxTZXNzaW9uLnRzIiwiLi4vLi4vLi4vc3JjL1JDQ2FsbENsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElSdW50aW1lIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcblxuLyoqXG4gKiDnlJ/miJDpmo/mnLogaWQg5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJhbmRvbUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICBsZXQgdXVpZCA9IGdldFVVSUQyMigpO1xuICB1dWlkID0gdXVpZC5yZXBsYWNlKC9cXC8vZywgJzAnKTtcbiAgY29uc3QgaW5mbyA9IFt1dWlkLCBEYXRlLm5vdygpLCByYW5kb21dO1xuICByZXR1cm4gaW5mby5qb2luKCdfJyk7XG59O1xuXG5leHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCB0aW1lckludGVydmFsID0gKGZ1bjogRnVuY3Rpb24sIGl0djogbnVtYmVyKTogbnVtYmVyID0+IHNldEludGVydmFsKGZ1biwgaXR2KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogY2FsbCBkZXZpY2VJZCDlrZjlgqjlnKggc2Vzc2lvblN0b3JhZ2Ug5LitXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDYWxsRGV2aWNlSWQgPSAocnVudGltZTogSVJ1bnRpbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gJ1JDQ2FsbERldmljZUlkJztcbiAgbGV0IHV1aWQgPSBydW50aW1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgaWYgKCF1dWlkKSB7XG4gICAgdXVpZCA9IGdldFVVSUQyMigpO1xuICAgIHJ1bnRpbWUuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHV1aWQpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsIi8qKlxuICog5rOo6YeKXG4gKiBUT0RPXG4gKi9cbmV4cG9ydCBlbnVtIE1zZ0NhbGxTdGF0dXMge1xuICBPVVRHT0lORyA9IDEsIC8vIHdhaXRpbmdcbiAgSU5DT01JTkcsIC8vIHdhaXRpbmdcbiAgUklOR0lORywgLy8gd2FpdGluZ1xuICBDT05ORUNURUQsIC8vIGtlZXBpbmdcbiAgSURMRSwgLy8gZW5kXG4gIEFDQ0VQVEVEIC8vIHdhaXRpbmdcbn1cbiIsIi8qKlxuICog6ZSZ6K+v56CB77yM5LiO56e75Yqo56uv5a+56b2QXG4gKiBAZGVzY3JpcHRpb25cbiAqIDEuIGA1MTAwMCAtIDUxOTk5YCDkuLogQW5kcm9pZCDkuJPnlKjmrrVcbiAqIDIuIGA1MjAwMCAtIDUyOTk5YCDkuLogaU9TIOS4k+eUqOautVxuICogMy4gYDUzMDAwIC0gNTMxOTlgIOS4uiBXZWIgUlRDIOS4k+eUqOautVxuICogNC4gYDUzMjAwIC0gNTM0OTlgIOS4uiBXZWIgQ2FsbExpYiDkuJPnlKjmrrVcbiAqICogIGA1MzIwMCAtIDUzMjk5YCDkuLogV2ViIENhbGxFbmdpbmUg5LiT55So56uvXG4gKiAqICBgNTMzMDAgLSA1MzQ5OWAg5Li6IFdlYiBDYWxsIOS4k+eUqOerr1xuICogNS4gYDUzNTAwIC0gNTM5OTlgIOS4uiBXZWIg5L+d55WZ5q61XG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbEVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1MgPSAxMDAwMCxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahOeKtuaAgeaculxuICAgKi9cbiAgU1RBVEVfTUFDSElORV9FWElUID0gNTMyMDAsXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGv5aSx6LSlXG4gICAqL1xuICBTRU5EX01TR19FUlJPUiA9IDUzMjAxLFxuICAvKipcbiAgICog6KKr5a+55pa55Yqg5YWl6buR5ZCN5Y2VXG4gICAqL1xuICBSRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPSA1MzIwMixcbiAgLyoqXG4gICAqIOW9k+WJjeeUqOaIt+S4jeWGjee+pOe7hOS4rVxuICAgKi9cbiAgTk9UX0lOX0dST1VQID0gNTMyMDMsXG5cbiAgLyoqXG4gICAqIENhbGwg55u45YWzXG4gICAqL1xuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgPSA1MzMwMSxcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgPSA1MzMwMixcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDMsXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUk9SID0gNTMzMDQsXG5cbiAgLyoqXG4gICAqIOWPkeW4g+mfs+mikeWksei0pVxuICAgKi9cbiAgQVVESU9fUFVCTElTSF9FUlJPUiA9IDUzMzA1LFxuXG4gIC8qKlxuICAgKiDlj5HluIPop4bpopHlpLHotKVcbiAgICovXG4gIFZJREVPX1BVQkxJU0hfRVJST1IgPSA1MzMwNixcblxuICAvKipcbiAgICog5Y+R5biD6Z+z6KeG6aKR5aSx6LSlXG4gICAqL1xuICBBVURJT19BTkRfVklERU9fUFVCTElTSF9FUlJPUiA9IDUzMzA3LFxuXG4gIC8qKlxuICAgKiDmn6Xor6LmiL/pl7TnlKjmiLfkv6Hmga/lpLHotKVcbiAgICovXG4gIFFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgPSA1MzMwOCxcblxuICAvKipcbiAgICog56aB55So5ZCv55So6KeG6aKR5pe277yM5oi/6Ze05YaF57y65bCR6KeG6aKR5rWBXG4gICAqL1xuICBNSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDksXG5cbiAgLyoqXG4gICAqIOWPlua2iOWPkeW4g+inhumikeWksei0pVxuICAgKi9cbiAgVU5QVUJMSVNIX1ZJREVPX0VSUk9SID0gNTMzMTAsXG5cbiAgLyoqXG4gICAqIOS8muivneS4jeaYr+e+pOe7hFxuICAgKi9cbiAgQ09OVkVSU0FUSU9OX05PVF9HUk9VUF9FUlJPUiA9IDUzMzExLFxuXG4gIC8qKlxuICAqIOS4jeWcqHJvb23kuK3npoHnlKjpn7Pop4bpopFcbiAgKi9cbiAgTk9UX0lOX1JPT01fRVJST1IgPSA1MzMxMlxuXG59XG4iLCIvKipcbiAqIOaMguaWreWOn+WboFxuICogQGRlc2NyaXB0aW9uXG4gKiDmoLnmja7ljp/mnIkgSGFuZ3VwUmVhc29uIOiuvuiuoe+8jOW3seaWueWOn+WboOS4juWvueaWueWOn+WboOacieebuOW3riAxMCDnmoTlt67ot50uXG4gKiDnjrDmnInmnKzlnLDljp/lm6Dlj5blgLzojIPlm7Q6IDEgfiAxMCwg6L+c56uv5Y6f5Zug5Y+W5YC86IyD5Zu0OiAxMSB+IDIwLlxuICog5Li65L6/5LqOIEhhbmd1cFJlYXNvbiDmianlsZXvvIzkv53nlZkgMTAwIOS7peWGheeahOWPluWAvC5cbiAqIOmcgOimgeWGjeasoeaJqeWxleaXtu+8jOW3seaWueWOn+WboOS9v+eUqDogMjEgfiAzMCwg5a+55bqU5a+55pa55Y6f5Zug5L2/55SoOiAzMSB+IDQwLFxuICog5Lul5q2k57G75o6o77yMXG4gKiDlt7Hmlrnljp/lm6Dkvb/nlKg6IDQxIH4gNTAsIOWvueaWueWOn+WboOS9v+eUqDogNTEgfiA2MCxcbiAqIOW3seaWueWOn+WboOS9v+eUqDogNjEgfiA3MCwg5a+55pa55Y6f5Zug5L2/55SoOiA3MSB+IDgwLFxuICog5bex5pa55Y6f5Zug5L2/55SoOiA3MSB+IDkwLCDlr7nmlrnljp/lm6Dkvb/nlKg6IDkxIH4gMTAwLlxuICpcbiAqIOWQhOW5s+WPsOeLrOacieWtl+auteiMg+WbtFxuICogQW5kcm9pZCAyMDEgfiAyOTlcbiAqIGlPUyAgICAgMzAxIH4gMzk5XG4gKiBXZWIgICAgIDQwMSB+IDQ5OVxuICog6K+m57uG5paH5qGj77yaaHR0cHM6Ly9naXRib29rLnJvbmdjbG91ZC5uZXQvcnRjLWRvY3MvIy9ydGMtY2xpZW50L2lvcy9hbmFseXNpcy9jYWxsbGliL0hhbmd1cFJlYXNvblxuICovXG5leHBvcnQgZW51bSBSQ0NhbGxFbmRSZWFzb24ge1xuICAvKipcbiAgICog5bex5pa55Y+W5raI5bey5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBDQU5DRUwgPSAxLFxuICAvKipcbiAgICog5bex5pa55ouS57ud5pS25Yiw55qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRUpFQ1QgPSAyLFxuICAvKipcbiAgICog5bex5pa55oyC5patXG4gICAqL1xuICBIQU5HVVAgPSAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KMXG4gICAqL1xuICBCVVNZX0xJTkUgPSA0LFxuICAvKipcbiAgICog5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBOT19SRVNQT05TRSA9IDUsXG4gIC8qKlxuICAgKiDlt7HmlrnkuI3mlK/mjIHlvZPliY3pn7Pop4bpopHlvJXmk45cbiAgICovXG4gIEVOR0lORV9VTlNVUFBPUlRFRCA9IDYsXG4gIC8qKlxuICAgKiDlt7HmlrnnvZHnu5zplJnor69cbiAgICovXG4gIE5FVFdPUktfRVJST1IgPSA3LFxuICAvKipcbiAgICog5bex5pa55pGE5YOP5aS06LWE5rqQ6I635Y+W5aSx6LSl77yM5Y+v6IO95piv5p2D6ZmQ5Y6f5ZugXG4gICAqL1xuICBHRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SID0gOCxcbiAgLyoqXG4gICAqIOW3seaWuei1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUFVCTElTSF9FUlJPUiA9IDksXG4gIC8qKlxuICAgKiDlt7HmlrnorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlJPUiA9IDEwLFxuICAvKipcbiAgICog5a+55pa55Y+W5raI5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRU1PVEVfQ0FOQ0VMID0gMTEsXG4gIC8qKlxuICAgKiDlr7nmlrnmi5Lnu53mlLbliLDnmoTpgJror53or7fmsYJcbiAgICovXG4gIFJFTU9URV9SRUpFQ1QgPSAxMixcbiAgLyoqXG4gICAqIOmAmuivnei/h+eoi+S4reWvueaWueaMguaWrVxuICAgKi9cbiAgUkVNT1RFX0hBTkdVUCA9IDEzLFxuICAvKipcbiAgICog5a+55pa55b+Z56KMXG4gICAqL1xuICBSRU1PVEVfQlVTWV9MSU5FID0gMTQsXG4gIC8qKlxuICAgKiDlr7nmlrnmnKrmjqXlkKxcbiAgICovXG4gIFJFTU9URV9OT19SRVNQT05TRSA9IDE1LFxuICAvKipcbiAgICog5a+55pa55byV5pOO5LiN5pSv5oyBXG4gICAqL1xuICBSRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVEID0gMTYsXG4gIC8qKlxuICAgKiDlr7nmlrnnvZHnu5zplJnor69cbiAgICovXG4gIFJFTU9URV9ORVRXT1JLX0VSUk9SID0gMTcsXG4gIC8qKlxuICAgKiDlr7nmlrnmkYTlg4/lpLTotYTmupDojrflj5blpLHotKXvvIzlj6/og73mmK/mnYPpmZDljp/lm6BcbiAgICovXG4gIFJFTU9URV9HRVRfTUVESUFfUkVTT1VSQ0VfRVJST1IgPSAxOCxcbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxOSxcbiAgLyoqXG4gICAqIOi/nOerr+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDIwLFxuICAvKipcbiAgICog5bex5pa55YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwgPSAyMSxcbiAgLyoqXG4gICAqIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX0NBTEwgPSAyMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDIzLFxuICAvKipcbiAgICog5bex5pa55o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIEFDQ0VQVF9TWVNURU1fQ0FMTCA9IDI0LFxuICAvKipcbiAgICog6L+c56uv5YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMID0gMzEsXG4gIC8qKlxuICAgKiDov5znq6/lhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfSU5fQ0FMTCA9IDMyLFxuICAvKipcbiAgICog6L+c56uv6KKr56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDMzLFxuICAvKipcbiAgICog6L+c56uv5o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIFJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwgPSAzNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aOpeWQrFxuICAgKi9cbiAgQUNDRVBUX0JZX09USEVSX0NMSUVOVCA9IDEwMSxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aMguaWrVxuICAgKi9cbiAgSEFOR1VQX0JZX09USEVSX0NMSUVOVCA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+WvueaWueWKoOWFpem7keWQjeWNlVxuICAgKi9cbiAgQURERURfVE9fQkxBQ0tMSVNUID0gMTAzLFxuICAvKipcbiAgICog6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAqL1xuICBTRVJWSUNFX05PVF9PUEVORUQgPSAxMDRcbn1cblxuLyoqXG4gKiDlt7Hmlrnljp/lm6DovazkuLrlr7nmlrnljp/lm6BcbiAqL1xuZXhwb3J0IGNvbnN0IENhbGxSZW1vdGVFbmRSZWFzb246IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRW5kUmVhc29uIH0gPSB7XG4gIFtSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVKRUNUXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9SRUpFQ1QsXG4gIFtSQ0NhbGxFbmRSZWFzb24uSEFOR1VQXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gIFtSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9CVVNZX0xJTkUsXG4gIFtSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0VdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkVOR0lORV9VTlNVUFBPUlRFRF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVELFxuICBbUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUl06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfR0VUX01FRElBX1JFU09VUkNFX0VSUk9SLFxuICBbUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX1BVQkxJU0hfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9TVUJTQ1JJQkVfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTExdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9JTl9DQUxMLFxuICBbUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVJdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFXTogUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbE1lc3NhZ2VUeXBlIHtcbiAgLyoqXG4gICAqIOmCgOivt+a2iOaBr1xuICAgKi9cbiAgVkNJbnZpdGUgPSAnUkM6VkNJbnZpdGUnLFxuICAvKipcbiAgICog5ZON6ZOD5raI5oGvXG4gICAqL1xuICBWQ1JpbmdpbmcgPSAnUkM6VkNSaW5naW5nJyxcbiAgLyoqXG4gICAqIOaOpeWQrOa2iOaBr1xuICAgKi9cbiAgVkNBY2NlcHQgPSAnUkM6VkNBY2NlcHQnLFxuICAvKipcbiAgICog5oyC5pat5raI5oGvXG4gICAqL1xuICBWQ0hhbmd1cCA9ICdSQzpWQ0hhbmd1cCcsXG4gIC8qKlxuICAgKiDnvqTlkbzkuK0g5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBWQ01vZGlmeU1lbSA9ICdSQzpWQ01vZGlmeU1lbScsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovkv67mlLnmtojmga9cbiAgICovXG4gIFZDTW9kaWZ5TWVkaWEgPSAnUkM6VkNNb2RpZnlNZWRpYScsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAvKipcbiAgICog562J5b6F5bu656uL6L+e5o6lXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog5Lya6K+d57u05oyB5LitXG4gICAqL1xuICBLRUVQSU5HLFxuICAvKipcbiAgICog5Lya6K+d5bey57uT5p2fXG4gICAqL1xuICBFTkRcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiDnlKjmiLfkuI3lrZjlnKjkuo7pgJror53kuK1cbiAgICovXG4gIE5PTkUgPSAwLFxuICAvKipcbiAgICog562J5b6F5o6l5ZCsXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBLRUVQSU5HLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDcm9zc0NhbGxUeXBlIHtcbiAgLyohXG4gIOWQjEFwcOmAmuivnVxuICAqL1xuICBSQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwgPSAwLFxuICAvKiFcbiAg6LeoQXBw6YCa6K+dXG4gICovXG4gIFJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA9IDdcbn1cbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgTXNnQ2FsbFN0YXR1cyB9IGZyb20gJy4vZW51bXMvTXNnQ2FsbFN0YXR1cyc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7XG4gIElFeGlzdGVkVXNlclBvZmlsZXMsIElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsIElSaW5naW5nTXNnQ29udGVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVVzZXJEYXRhLCBJVXNlclByb2ZpbGUsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi9UaW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxTdGF0ZU1hY2hpbmUge1xuICAvKipcbiAgICog5oi/6Ze054q25oCBXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uU3RhdGU6IFJDQ2FsbFNlc3Npb25TdGF0ZSB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOeUqOaIt+eKtuaAgeWPiuS/oeaBr1xuICAgKi9cbiAgcHJpdmF0ZSBfdXNlckluZm86IHsgW3VzZXJJZDogc3RyaW5nXTogSVVzZXJEYXRhIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDnlKjmiLforqHml7blmajmmKDlsIRcbiAgICovXG4gIHByaXZhdGUgX3VzZXJUaW1lcnM6IHsgW3VzZXJJZDogc3RyaW5nXTogVGltZXIgfSA9IHt9XG5cbiAgLyoqXG4gICAqIOebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfd2F0Y2hlcnMhOiBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzXG5cbiAgLyoqXG4gICAqIOWRvOWPq+i2heaXtuaXtumXtCAo5Y2V5L2N77ya5q+r56eSKVxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFRpbWVvdXQ6IG51bWJlciA9IDYwICogMTAwMFxuXG4gIC8qKlxuICAgKiDpgJror53lu7rnq4vlvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+aXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24gfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDkuLvlj6sgSURcbiAgICog5Y+R6LW36YKA6K+35Li65b2T5YmN55So5oi3IElEXG4gICAqIOaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWRcbiAgICog5pS25Yiw5Lq65ZGY5Y+Y5pu06YKA6K+35Li65raI5oGv5L2T5LitIGNhbGxlcklkXG4gICAqL1xuICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5b2T5qyh6YCa6K+d6YKA6K+36ICFIElEXG4gICAqIOWPkei1t+mCgOivt+S4uuW9k+WJjeeUqOaItyBJROOAgeaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWTjgIHmlLbliLDkurrlkZjlj5jmm7TpgoDor7fkuLrmtojmga/kvZPkuK0gc2VuZGVyVXNlcklkXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOaYr+WQpuaYr+i3qCBhcHBrZXlcbiAgICovXG4gIHByaXZhdGUgX2lzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hUaXRsZTogc3RyaW5nID0gJydcblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29udGVudDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsTXNnSGFuZGxlcjogQ2FsbE1lc3NhZ2VIYW5kbGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5uZWxJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvblJpbmdpbmcnLCB0aGlzLl9vblJpbmdpbmcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkFjY2VwdCcsIHRoaXMuX29uQWNjZXB0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkLCAnb25NZWRpYU1vZGlmeScsIHRoaXMuX29uTWVkaWFNb2RpZnkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkh1bmd1cCcsIHRoaXMuX29uSHVuZ3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluagoeato+WQjui2heaXtuaXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VGltZW91dChzZW50VGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICBpZiAoZGVsYXlUaW1lIDwgMCkge1xuICAgICAgZGVsYXlUaW1lID0gNTAwOyAvLyDlgYforr7lu7bov5/ml7bpl7TkuLogNTAwIG1zXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9jYWxsVGltZW91dCAtIGRlbGF5VGltZTtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBfZ2V0VGltZW91dCAtPiB0aW1lb3V0OiAke3RpbWVvdXR9YCk7XG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVyQnlJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBiZWZvcmUgX2NsZWFyVGltZXJCeUlkICAtPiB1c2VySWQ6ICR7dXNlcklkfSB1c2VyVGltZXJzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3VzZXJUaW1lcnMpfWApO1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXS5zdG9wKCk7XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdO1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWZ0ZXIgX2NsZWFyVGltZXJCeUlkIC0+IHVzZXJUaW1lcnM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fdXNlclRpbWVycyl9YCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlTdGF0ZUNoYW5nZShzdGF0ZTogUkNDYWxsU2Vzc2lvblN0YXRlLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlTdGF0ZUNoYW5nZSAtPiBpbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIHN0YXRlLCByZWFzb24sXG4gICAgfSl9YCk7XG5cbiAgICB0aGlzLl9lbmRSZWFzb24gPSByZWFzb24gfHwgbnVsbDtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl93YXRjaGVycz8ub25TdGF0ZUNoYW5nZSh7IHN0YXRlLCByZWFzb24gfSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgLy8g5b2T54q25oCB5py657uT5p2f5pe277yM6ZyA5ZyoIENhbGxFbmdpbmUg5riF6ZmkXG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnb25TdGF0ZU1hY2hpbmVDbG9zZScsIHRoaXMuX2NhbGxJZCk7XG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci51bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlcjogSVVzZXJEYXRhLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlVc2VyU3RhdGVDaGFuZ2UgLT4gaW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VyLCByZWFzb24sXG4gICAgfSl9YCk7XG4gICAgdGhpcy5fd2F0Y2hlcnM/Lm9uVXNlclN0YXRlQ2hhbmdlKHsgdXNlciwgcmVhc29uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3RoZXJDbGllbnRIYW5kbGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCByZWFzb246IGh1bmd1cFJlYXNvbiB9LCBtZXNzYWdlVHlwZSB9ID0gbWVzc2FnZTtcbiAgICB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdID0ge1xuICAgICAgdXNlcklkOiBzZW5kZXJVc2VySWQsXG4gICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICBpc1JlbW90ZTogZmFsc2UsXG4gICAgfTtcbiAgICAvLyDlpJrnq6/mjqXlkKzjgIHlpJrnq6/mi5Lnu53vvIzmuIXpmaTmlLbliLDpgoDor7flkI7otbfnmoTorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICAvLyDlhbbku5bnq6/mjqXlkKxcbiAgICBsZXQgZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9CWV9PVEhFUl9DTElFTlQ7XG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSkge1xuICAgICAgICBlbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEw7XG4gICAgICB9IGVsc2UgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFKSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5OT19SRVNQT05TRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVBfQllfT1RIRVJfQ0xJRU5UO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDmt7vliqDnlKjmiLfnroDopoHkv6Hmga9cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBlbmRSZWFzb24pO1xuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5Lit77yM5LiU5LiN5piv5b2T5YmN5bey5o6l6YCa55So5oi36K6+5aSH77yIZGV2aWNlSWTvvInlj5HmnaXnmoTmtojmga9cbiAgKi9cbiAgcHJpdmF0ZSBfaXNSZW1vdGVJbnZhbGlkTXNnKHJlbW90ZVVzZXJJZDogc3RyaW5nLCBtc2dEZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdLmRldmljZUlkIHx8ICFtc2dEZXZpY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcgJiYgdGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5kZXZpY2VJZCAhPT0gbXNnRGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vblJpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiBzdWlkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCB9IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBvblJpbmdpbmcgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICByZXR1cm47IC8vIOWkmuerr+WkhOeQhlxuICAgIH1cbiAgICB0aGlzLl93YXRjaGVycy5vblJpbmdpbmcoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudDogeyB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQ6IHNlbmRlckRldmljZUlkIH0sIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBzZW5kZXJEZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25BY2NlcHQgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHRoaXMuX290aGVyQ2xpZW50SGFuZGxlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOe+pOe7hOmAmuivneaXtu+8miBB44CBQiDpgJror50gQemCgOivt0MsIEPlkIzmhI/mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahOiuoeaXtuWZqO+8jOaJgOS7pei/memHjOWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoc2VuZGVyVXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBjb25zdCBpZHMgPSAodGhpcy5fY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSA/IFtjdXJyZW50VXNlcklkLCBzZW5kZXJVc2VySWRdIDogW3NlbmRlclVzZXJJZF07XG4gICAgaWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgaXNDdXJyZW50VXNlcklkID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLktFRVBJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGRldmljZUlkOiBpc0N1cnJlbnRVc2VySWQgPyBnZXRDYWxsRGV2aWNlSWQodGhpcy5fcnVudGltZSkgOiBzZW5kZXJEZXZpY2VJZCxcbiAgICAgIH07XG4gICAgICBpZiAoIWlzQ3VycmVudFVzZXJJZCkge1xuICAgICAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldENhbGxlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICB9XG4gICAgLy8g5oqb5Ye6b25BY2NlcHTml7bnirbmgIHlt7Lnu4/lsLHnu6pcbiAgICB0aGlzLl93YXRjaGVycy5vbkFjY2VwdCh7IHVzZXJJZDogc2VuZGVyVXNlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgbWVkaWFUeXBlLCB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICBpZiAodGhpcy5faXNSZW1vdGVJbnZhbGlkTXNnKHNlbmRlclVzZXJJZCwgZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gX29uTWVkaWFNb2RpZnkgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOabtOaWsCBtZWRpYVR5cGVcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fd2F0Y2hlcnMub25NZWRpYU1vZGlmeSh7XG4gICAgICBzZW5kZXI6IHsgdXNlcklkOiBzZW5kZXJVc2VySWQsIC4uLjxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCBzZW5kZXJVc2VySWQgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gc3VpZC5zcGxpdCgnXycpWzFdIDogc3VpZDtcbiAgICBjb25zdCB7IHJlYXNvbiwgdXNlcjogdXNlclByb2ZpbGUsIGRldmljZUlkIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25IdW5ndXAgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhiDmipvlh7rlpJrnq6/lt7LlpITnkIYgcmVhc29uXG4gICAgICB0aGlzLl9vdGhlckNsaWVudEhhbmRsZShtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAvLyDlpoLmnpzlt7HmlrnmiL/pl7TnirbmgIHlt7Lnu5PmnZ/vvIzlho3mlLbliLAgaHVuZ3VwIOa2iOaBr+S4jeWGjeWkhOeQhlxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gSW52YWxpZCBoYW5nIHVwIG1lc3NhZ2UsIGN1cnJlbnQgcm9vbSBzdGF0dXMgaGFzIGVuZGVkIC0+IHNlc3Npb25TdGF0ZTogJHt0aGlzLl9zZXNzaW9uU3RhdGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOS/ruaUueWGheWtmOaAgeaVsOaNruW5tumAmuefpVxuICAgICAgdGhpcy5fdXNlckluZm9bc2VuZGVyVXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCA8SVVzZXJQcm9maWxlPnVzZXJQcm9maWxlKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF07XG4gICAgfVxuXG4gICAgLy8gdGltZXIg5riF6ZmkXG4gICAgaWYgKENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXSA9PT0gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwpIHtcbiAgICAgIC8vIOi/nOerr+WPlua2iOmAmuivne+8jOayoeaciei/nOerr+eUqOaIt++8jOa4hemZpOW3seerr+eahOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoIDwgMSAmJiB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SW52aXRlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIC8vIOi/nOerr+aLkue7neOAgeW/meeijOOAgeacquaOpeWQrOetie+8jOmAmui/h+iHquW3seaYr+WQpuaYr+S4u+WPq+adpeWIpOaWreimgea4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqCDmiJYg5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChzZW5kZXJVc2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPCAxICYmIHRoaXMuX2NsZWFyVGltZXJCeUlkKGN1cnJlbnRVc2VySWQpO1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgIGNvbnN0IGlzTGVzc1RoYW5Ud28gPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMjtcbiAgICAvLyDnvqTlkbzkuK3pgoDor7fogIXmjILmlq3vvIjpnZ7lkbzlj6vlj5HotbfogIXvvInkuJTmiL/pl7TkuK3ooqvpgoDor7fogIXpg73mnKrmjqXlkKzvvIzpgJrnn6XmiL/pl7TnirbmgIHnu5PmnZ9cbiAgICBjb25zdCBpc0ludml0ZVVzZXIgPSB0aGlzLl9pbnZpdGVySWQgPT09IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCBpc05vT25lQW5zd2VyZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3VzZXJJbmZvKS5ldmVyeSgodXNlcikgPT4gdXNlci5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgIGlmIChpc0xlc3NUaGFuVHdvIHx8IChpc0ludml0ZVVzZXIgJiYgaXNOb09uZUFuc3dlcmVkKSkge1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7ogb25IdW5ndXAg5pe254q25oCB5bey57uP5bCx57uqXG4gICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9LCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tuebkeWQrFxuICAgKiBAcGFyYW1zIHdhdGNoZXJzXG4gICAqL1xuICByZWdpc3RlckV2ZW50TGlzdGVuZXIod2F0Y2hlcnM6IElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMpIHtcbiAgICB0aGlzLl93YXRjaGVycyA9IHdhdGNoZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBpbnZpdGUg5raI5oGv5pe254q25oCB5py65pu05paw77yIQ2FsbEVuZ2luZSDlhoXpg6josIPnlKjvvIlcbiAgICogQHBhcmFtIG1lc3NhZ2Ug5o6l5pS25raI5oGvXG4gICAqL1xuICBfX29uSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCwgc2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlVXNlcklkczogaW5pZHMsIHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCwgcm9vbVR5cGUsXG4gICAgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgLy8g5aSE55CG6LeoIGFwcGtleSDpgoDor7cgc2VuZGVyVXNlcklkIOW4puaciSBhcHBrZXkg5LiO5pys5ZywIGN1cnJlbnRVc2VySWQg5Yy56YWN6Zeu6aKYXG4gICAgLy8g5ZCM5pe26K6w5b2V5pys5Zyw5piv5ZCm5Li66LeoIGFwcGtleSDnirbmgIFcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlID09PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuY3Jvc3NBcHBrZXkodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZGVyVXNlcklkID0gc3VpZDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5q2j5Zyo6YCa6K+d5Lit77yM6L+c56uv5aSa56uv5Y+R55qE5raI5oGv55u05o6l6L+H5rukXG4gICAgaWYgKHRoaXMuX2lzUmVtb3RlSW52YWxpZE1zZyhzZW5kZXJVc2VySWQsIGRldmljZUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIF9fb25JbnZpdGUgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCB1c2VySWRMaXN0ID0gW3N1aWQsIC4uLmluaWRzXTtcbiAgICAvLyDmlLbliLDpgoDor7flkI7vvIzlhoXpg6jlm57lupTlk43pk4Pmtojmga8sIHVzZXJJZHMg5Lyg6Zmk6Ieq5bex55qE5omA5pyJ5Lq6XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB1c2VySWRzOiB1c2VySWRMaXN0LmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gaWQuc3BsaXQoJ18nKVsxXSAhPT0gY3VycmVudFVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludml0ZVVzZXJJZHMgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gW2luaWRzWzBdLnNwbGl0KCdfJylbMV1dIDogaW5pZHM7XG5cbiAgICAvLyDlkIzmraXmnKzlnLDnlKjmiLfliJfooajpnIDopoHkvb/nlKjmi4bliIblkI7nmoQgVXNlcklkIOS/neivgeacrOWcsOWFtuS7luaWueazleWMuemFjSB1c2VyaWRcbiAgICBjb25zdCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBhbGxVc2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiB1c2VySWQgPT09IHNlbmRlclVzZXJJZCxcbiAgICAgICAgaXNSZW1vdGU6IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCxcbiAgICAgIH07XG4gICAgICBpZiAodXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGv5Y+KIGRldmljZUlkXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOe7meaJgOacieiiq+mCgOivt+S6uuWQr+WKqOaOpeWQrOiuoeaXtuWZqFxuICAgICAgaWYgKHVzZXJJZCAhPT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkID8gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7IC8vIOe+pOiBiuS4reW3seaWuei2heaXtumcgOWPkemAgeaMguaWrVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHsgLy8g5YW25LuW5Lq65ZGY6LaF5pe25Y+q6YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+mXtOeKtuaAgemAmuefpVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5XQUlUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgbWVtYmVyTW9kaWZ5IOa2iOaBr+aXtueKtuaAgeacuuabtOaWsO+8iENhbGxFbmdpbmUg5YaF6YOo6LCD55So77yJXG4gICAqIEBwYXJhbSBtZXNzYWdlIOaOpeaUtua2iOaBr1xuICAgKi9cbiAgX19vbk1lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQsIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXI6IHVzZXJQcm9maWxlLCBleGlzdGVkVXNlclBvZmlsZXMsIGNhbGxlciwgZGV2aWNlSWQsIGludml0ZVVzZXJJZHMsIG1lZGlhVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICAvLyB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdICYmICF0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLmRldmljZUlkICYmICFkZXZpY2VJZCAmJlxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfX29uTWVtYmVyTW9kaWZ5IC0+IG5vdCB0aGUgcmVtb3RlIGRldmljZSB0aGF0IGlzIGN1cnJlbnRseSB0YWxraW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgIC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsZXJJZCA9IGNhbGxlcjtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgaW52aXRlVXNlcklkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLnB1c2goeyB1c2VySWQ6IGlkLCBtZWRpYVR5cGUsIGNhbGxTdGF0dXM6IE1zZ0NhbGxTdGF0dXMuSU5DT01JTkcgfSk7XG4gICAgfSk7XG4gICAgLy8g5bex5pa554q25oCB5Li6IE5PTkUgKOacquWtmOWcqOW3seaWueeUqOaIt+S/oeaBrykg6K+05piO6Ieq5bex5Li66KKr6YKA6K+36ICFLCDpnIDlj5HpgIEgcmluZ2luZ1xuICAgIGNvbnN0IGlzTmV3SW52aXRlZFVzZXIgPSBpbnZpdGVVc2VySWRzLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc05ld0ludml0ZWRVc2VyKSB7XG4gICAgICBjb25zdCBuZWVkUmluZ2luZ1VzZXJJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgICAgaWYgKHVzZXJJbmZvLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIG5lZWRSaW5naW5nVXNlcklkcy5wdXNoKHVzZXJJbmZvLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgdXNlcklkczogbmVlZFJpbmdpbmdVc2VySWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOiiq+mCgOivt+iAhemAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlt7LlnKjpgJror53mtYHnqIvkuK3nlKjmiLfvvIzmipvlh7rkurrlkZjlj5jmm7Tnm5HlkKxcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uTWVtYmVyTW9kaWZ5KHtcbiAgICAgICAgc2VuZGVyOiB7IHVzZXJJZDogc2VuZGVyVXNlcklkLCAuLi51c2VyUHJvZmlsZSB9LFxuICAgICAgICBpbnZpdGVkVXNlcnM6IGludml0ZVVzZXJJZHMubWFwKChpZCkgPT4gKHsgdXNlcklkOiBpZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmm7TmlrDlhajph4/nlKjmiLfnirbmgIFcbiAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsU3RhdHVzIH0gPSB1c2VySW5mbztcbiAgICAgIC8vIOS6uuWRmOS4uue7k+adn+eKtuaAgeaXtu+8jOS4jeWGjeabtOaWsFxuICAgICAgaWYgKGNhbGxTdGF0dXMgPT09IE1zZ0NhbGxTdGF0dXMuSURMRSkgcmV0dXJuO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogY2FsbFN0YXR1cyAhPT0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQgPyBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyA6IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HLFxuICAgICAgICBpc0NhbGxlcjogc2VuZGVyVXNlcklkID09PSB1c2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBjdXJyZW50VXNlcklkICE9PSB1c2VySWQsXG4gICAgICB9O1xuICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGvIOWPiiBkZXZpY2VJZFxuICAgICAgaWYgKHVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgLy8g6Zmk5LqGIGNhbGxNc2dTdGF0dXMuY29ubmVjdGVkICzlhbbku5bkurrpg73otbforqHml7blmahcblxuICAgICAgaWYgKGNhbGxTdGF0dXMgIT09IE1zZ0NhbGxTdGF0dXMuQ09OTkVDVEVEICYmICF0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS7hee7meiiq+mCgOivt+aIkOWRmOWQr+WKqOWumuaXtuWZqFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCFpbnZpdGVVc2VySWRzLmluY2x1ZGVzKHVzZXJJZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgPyBSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2FsbCBvbmh1bmd1cCBlcnJvciAtPiAke2Vycm9yPy5zdGFja31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKog5oiWIOacquaOpeWQrOeahOaYr+iHquW3se+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9nZXRUaW1lb3V0KHNlbnRUaW1lKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5bey5pyJIHNlc3Npb24g77yM5LiN5YWB6K645YaN5o6l5ZCs5paw5Lya6K+d5oOF5Ya1XG4gICAqL1xuICBfX2hhbmRsZUludml0ZUluU2Vzc2lvbigpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdTdGF0ZU1hY2hpbmUgLT4gX19oYW5kbGVJbnZpdGVJblNlc3Npb24nKTtcbiAgICAvLyDkv67mlLnmiYDmnInnlKjmiLfnirbmgIHlubbmipvlh7rvvIzmuIXnqbrorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOWwhuW3suWtmOWcqOeahOiuoeaXtuWZqOmDvea4heaOiVxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgLy8g55u05o6l57uI5q2i5b2T5YmNIHNlc3Npb24g54q25oCBXG4gICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSk7XG4gICAgLy8g5Y+R6YCB5oyC5pat5raI5oGv77yM5bm25pC65bimIOW3seaWueW/meeijCDljp/lm6BcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Li75Yqo5ZG85Y+rIChDYWxsRW5naW5lIOWGhemDqOiwg+eUqClcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIF9fY2FsbCh1c2VySWRzOiBzdHJpbmdbXSwgZXh0cmE6IHN0cmluZyA9ICcnLCBwdXNoVGl0bGU6IHN0cmluZyA9ICcnLCBwdXNoQ29udGVudDogc3RyaW5nID0gJycsIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBpbnZpdGUgLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlj5HpgIHpgoDor7fmtojmga9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY2FsbGVySWQgPSB0aGlzLl9pbnZpdGVySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEludml0ZSh7XG4gICAgICByb29tVHlwZTogaXNDcm9zc0FwcGtleSA/IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwgOiBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVOb3JtYWxDYWxsLFxuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBleHRyYSxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzOiB1c2VySWRzLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPSBpc0Nyb3NzQXBwa2V5O1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcblxuICAgICAgLyoqXG4gICAgICAgKiDot6ggYXBwa2V5IOS7heWtmOWcqOWNleiBiu+8jOWvueerryB1c2VySWQg6ZyA5Y+W5LiL5YiS57q/5ZCO6Z2i55qE6YOo5YiGXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlkcyA9IGlzQ3Jvc3NBcHBrZXkgPyBbY3VycmVudFVzZXJJZCwgLi4uW3VzZXJJZHNbMF0uc3BsaXQoJ18nKVsxXV1dIDogW2N1cnJlbnRVc2VySWQsIC4uLnVzZXJJZHNdO1xuXG4gICAgICAvLyDpgY3ljobmm7TmlrDmiL/pl7TmiYDmnInkurrlkZjnirbmgIHjgIHlubbnu5nooqvlj6vlkK/liqjorqHml7blmahcbiAgICAgIGlkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgaXNDYWxsZXIgPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyxcbiAgICAgICAgICBpc0NhbGxlcixcbiAgICAgICAgICBpc1JlbW90ZTogIWlzQ2FsbGVyLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuXG4gICAgICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICBpZiAoIWlzQ2FsbGVyKSB7XG4gICAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuWkhOeQhueKtuaAgeOAgeW5tumAmuefpSBjYWxsIOWxglxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgICAgLy8g5oi/6Ze05Lq65ZGY5L+h5oGv5bCR5LqO5Lik5Liq77yM6YCa55+l5oi/6Ze054q25oCBXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDov5znq6/kurrlkZjlpKfkuo4gMSDkuJTlt7HmlrnkuI3kuLrmraPlnKjpgJror53ml7bvvIzlj5HpgIEgaHVuZ3VwLCDlkYror4nov5znq6/oh6rlt7HpgIDlh7rpgJror51cbiAgICAgICAgICAgIGNvbnN0IGlzTmVlZFNlbmRIdW5ndXAgPSB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPT09IDAgJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORyk7XG4gICAgICAgICAgICBpZiAoaXNOZWVkU2VuZEh1bmd1cCkge1xuICAgICAgICAgICAgICB0aGlzLl9odW5ndXBIYW5kbGUoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuV0FJVElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVuZENvZGUgPSBjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUID8gUkNDYWxsRW5kUmVhc29uLkFEREVEX1RPX0JMQUNLTElTVCA6IFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SO1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgZW5kQ29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBhY2NlcHQnKTtcblxuICAgIC8vIOWPkemAgeaOpeWQrOa2iOaBr1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEFjY2VwdCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG5cbiAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0pO1xuICAgICAgLy8g5L+u5pS55bm26YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvOWPq+S4ree7p+e7remCgOivt1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fnlKjmiLcgSUQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAodGhpcy5fY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkNPTlZFUlNBVElPTl9OT1RfR1JPVVBfRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gaW52aXRlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbyk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJQb2ZpbGVzOiBJRXhpc3RlZFVzZXJQb2ZpbGVzW10gPSBleGlzdGVkVXNlcklkcy5tYXAoKHVzZXJJZCkgPT4ge1xuICAgICAgbGV0IGNhbGxTdGF0dXMgPSBNc2dDYWxsU3RhdHVzLkNPTk5FQ1RFRDtcbiAgICAgIC8vIOWMheWQq+iiq+mCgOivt+iAhe+8jOaIluiAheeUqOaIt+eKtuaAgeS4uiB3YXRpbmcg5pe277yM54q25oCB5Li6IOWTjemTg1xuICAgICAgaWYgKHVzZXJJZHMuaW5jbHVkZXModXNlcklkKSB8fCB0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID09PSBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORykge1xuICAgICAgICBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5SSU5HSU5HO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgY2FsbFN0YXR1cyxcbiAgICAgICAgbWVkaWFJZDogdXNlcklkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhID0gb3B0aW9ucy5leHRyYSB8fCAnJztcbiAgICBjb25zdCBwdXNoVGl0bGUgPSBvcHRpb25zLnB1c2hUaXRsZSB8fCAnJztcbiAgICBjb25zdCBwdXNoQ29udGVudCA9IG9wdGlvbnMucHVzaENvbnRlbnQgfHwgJyc7XG5cbiAgICAvLyDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZW1lYmVyTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgLy8g6Zmk6Ieq5bex77yM5YW25LuW5omA5pyJ5Lq65Z2H6ZyA5pS25YiwIG1vZGlmeSDmtojmga/vvIzku6XmraTmm7TmlrDnirbmgIFcbiAgICAgIGludml0ZVVzZXJJZHM6IHVzZXJJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IGN1cnJlbnRVc2VySWQpLFxuICAgICAgY2FsbGVySWQ6IHRoaXMuZ2V0Q2FsbGVySWQoKSxcbiAgICAgIGV4aXN0ZWRVc2VyUG9maWxlcyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogWy4uLmV4aXN0ZWRVc2VySWRzLCAuLi51c2VySWRzXS5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgLy8g5L+u5pS56KKr6YKA6K+35Lq654q25oCB77yM5bm26YCa55+lXG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgICAgaXNDYWxsZXI6IGZhbHNlLFxuICAgICAgICAgIGlzUmVtb3RlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAvLyDlkK/liqjlkbzlj6vorqHml7blmahcbiAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAvLyDlkbzlj6votoXml7blpITnkIbnirbmgIHjgIHlubbpgJrnn6UgY2FsbCDlsYJcbiAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuacquaOpeaKm+WHum9uSHVuZ3VwXG4gICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKrvvIzpgJrnn6XmiL/pl7TnirbmgIFcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc3RhdGU6IFJDQ2FsbFVzZXJTdGF0ZS5OT05FLFxuICAgICAgICAgIGlzQ2FsbGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1JlbW90ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG5cbiAgICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIGVuZFJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9odW5ndXBIYW5kbGUocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlj5HpgIHmjILmlq3nsbvlnovmtojmga9cbiAgICBsZXQgY29kZSA9IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTO1xuXG4gICAgY29uc3QgaGFuZ3VwUGFyYW1zID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICAgIHB1c2hUaXRsZTogdGhpcy5faHVuZ3VwUHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQ6IHRoaXMuX2h1bmd1cFB1c2hDb250ZW50LFxuICAgIH07XG5cbiAgICBpZiAocmVhc29uID09PSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKSB7XG4gICAgICAvLyDlt7Hnq6/ooqvlpJrnq6/liqDlhaUgUlRDIOaIv+mXtOaMpOaOieWQju+8jOS4jeWGjeetieWPkeaMguaWrea2iOaBr+eahOe7k+aenO+8jOmYsuatoui1sCB1c2VyTGVhdmUg5a+86Ie05oyC5pat5Y6f5Zug5LiN5YeG56GuXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgY29kZTogbXNnQ29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cChoYW5ndXBQYXJhbXMpO1xuICAgICAgY29kZSA9IG1zZ0NvZGU7XG4gICAgfVxuXG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAvLyDmm7TmlrDpgJror53kurrlkZjnirbmgIHjgIHpgJror53nu5PmnZ/ml7bpl7Qg5bm26YCa55+lXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOa4heepuuWGheWtmOaAgeaVsOaNru+8jOW5tumAmuefpVxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgcmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqL1xuICBhc3luYyBodW5ndXAocHVzaFRpdGxlOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIGh1bmd1cCcpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOm7mOiupOaMguaWrSByZWFzb24g5Li66YCa6K+d6L+H56iL5Lit77yM5bex5pa55q2j5bi45Y+W5raI6YCa6K+dXG4gICAgbGV0IHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgLyoqXG4gICAgICog6Iul6LaF5pe26K6h5pe25Zmo5a2Y5ZyoLCDlt7HmlrnkuLogY2FsbGVyIOWOn+WboOS4uuW3seaWueWPlua2iOmAmuivnSxcbiAgICAgKiDlt7HmlrnkuLogY2FsbGVlIOS4lOacqui/m+WFpemAmuivneS4re+8jOWOn+WboOS4uuW3seaWueaLkue7nemAmuivnVxuICAgICAqL1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VyVGltZXJzKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uaXNDYWxsZXIpIHtcbiAgICAgICAgcmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkNBTkNFTDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uc3RhdGUgPT09IFJDQ2FsbFVzZXJTdGF0ZS5XQUlUSU5HKSB7XG4gICAgICAgIHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5SRUpFQ1Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5riF6Zmk5omA5pyJ6LaF5pe26K6h5pe25ZmoXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlclRpbWVycykge1xuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2h1bmd1cEhhbmRsZShyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIOS/ruaUuemAmuivneWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIFJDQ2FsbE1lZGlhVHlwZS5BVURJTyDmlLnkuLrpn7PpopHpgJror50gfCBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8g5pS55Li66Z+z6KeG6aKR6YCa6K+dXG4gICAqL1xuICBhc3luYyBjaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2hhbmdlTWVkaWFUeXBlIC0+IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kTWVkaWFNb2RpZnkoe1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICB9KTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+WKoOWFpemAmuivneihpeWBv+acuuWItu+8iHJ0YyB1c2VySm9pbiDkuovku7bop6blj5HvvIlcbiAgICog5Li75Y+r5ZG85Y+r5ZCO77yM5pyq5pS25Yiw6KKr5Y+rIGFjY2VwdCDmtojmga/vvIzkvYbmlLbliLDkuoYgdXNlckpvaW4g5ZCM5qC36KGl5YG/5pu05paw55So5oi344CB5oi/6Ze054q25oCB44CB5ZG85Y+r6K6h5pe25ZmoXG4gICAqL1xuICB1c2VySm9pbih1c2VySWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSB1c2VySm9pbiAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIC8vIOW7tui/nyAzMDBtcyDpmLLmraIgdXNlckppb24g5ZKMIGFjY2VwdCDmtojmga/pg73mnInnmoTmg4XlhrXkuIvvvIwgdXNlckpvaW4g5q+UIGFjY2VwdCDlhYjliLBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgLy8g5pu05paw5Lq65ZGY54q25oCBICgvLyDnvqTnu4TpgJror53ml7bvvJogQeWQkULjgIFD5Y+R6LW36YCa6K+dIELlhYjmjqXlkKzvvIxD5ZCO5o6l5ZCs77yM6L+Z5pe2QuayoeaciUPnmoR1c2VySWTlr7nlupTnmoRfdXNlckluZm/vvIzmiYDku6Xov5nph4zliKTmlq3kuIDkuIspXG4gICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICB1c2VySW5mby5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh1c2VySW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5pu05paw5oi/6Ze054q25oCBXG4gICAgICAgIGlmICh0aGlzLl9zZXNzaW9uU3RhdGUgIT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKSB7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWBnOatouW5tua4hemZpOWRvOWPq+iuoeaXtuWZqFxuICAgICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgICAgfSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKjmiLfnprvlvIDpgJror53ooaXlgb/mnLrliLbvvIhydGMgdXNlckxlYXZl44CBa2lja09mZiDkuovku7bop6blj5HvvIlcbiAgICog6YCa6K+d5Lit6L+c56uv55So5oi35oyC5pat77yM5oyC5pat5raI5oGv5pyq5Yiw77yM5L2G5piv55uR5ZCs5YiwIHJ0YyB1c2VyTGVhdmUg5ZCM5qC36KGl5YG/5pu05paw55So5oi344CB5oi/6Ze054q25oCBXG4gICAqL1xuICB1c2VyTGVhdmUodXNlcklkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gdXNlckxlYXZlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5bu26L+fIDMwMG1zIOmYsuatoiB1c2VyTGVhdmUg5ZKMIGh1bmd1cCDmtojmga/pg73mnInnmoTmg4XlhrXkuIvvvIx1c2VyTGVhdmUg5q+UIGh1bmd1cCDlhYjliLBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgLy8g5pu05paw5Lq65ZGY54q25oCBXG4gICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLk5PTkUpIHtcbiAgICAgICAgICB1c2VySW5mby5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh1c2VySW5mbywgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHVzZXJJbmZvLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Li75Y+r5pa5576k6IGK6YKA6K+36KKr5Y+r5pa55ZCO56a757q/77yM5Li75Y+r5pa55q2k5pe25Li6562J5b6F54q25oCB5ZCO5LiN5YaN5LiK57q/77yM6KKr5Y+r5pa55o6l5ZCs5ZCO5oyC5pat6Iez5Ymp5L2Z5LiA5Lq65pe2562J5b6F5LiA5YiG6ZKf5ZCO5oyC5patXG4gICAgICAgIGNvbnN0IHJlbW90ZVVzZXJzVGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW90ZVVzZXJzID0gdGhpcy5nZXRSZW1vdGVVc2VycygpO1xuICAgICAgICAgIC8vIOi/nOerr+WPquacieS4gOS4queUqOaIt+S4lOaYr+etieW+heeKtuaAge+8jOetieW+heS4gOWIhumSn+WQjuaMguaWrVxuICAgICAgICAgIGlmIChyZW1vdGVVc2Vycy5sZW5ndGggPT09IDEgJiYgcmVtb3RlVXNlcnNbMF0uc3RhdGUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2h1bmd1cEhhbmRsZShSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgNjAwMDApO1xuICAgICAgICAvLyDmm7TmlrDmiL/pl7TnirbmgIFcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyICYmIHRoaXMuX3Nlc3Npb25TdGF0ZSAhPT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIHRoaXMuX2VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwg5bGC5bex5pa55byC5bi45aSx6LSl5ZCO6LCD55So55qE5pa55rOVXG4gICAqIOinpuWPkeaXtuacuu+8mumfs+inhumikeacjeWKoeW8guW4uOOAgeiOt+WPlui1hOa6kOWksei0peOAgeWKoOWFpSBSVEMg5oi/6Ze05aSx6LSl44CB5Y+R5biDfOiuoumYheWksei0pVxuICAgKi9cbiAgY2xvc2UocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9odW5ndXBIYW5kbGUocmVhc29uKTtcbiAgfVxuXG4gIHNldEh1bmd1cFB1c2hDb25maWcocHVzaENvbmZpZzogc3RyaW5nID0gJycsIHB1c2hDb250ZW50OiBzdHJpbmcgPSAnJykge1xuICAgIHRoaXMuX2h1bmd1cFB1c2hUaXRsZSA9IHB1c2hDb25maWc7XG4gICAgdGhpcy5faHVuZ3VwUHVzaENvbnRlbnQgPSBwdXNoQ29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIGdldENhbGxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsSWQ7XG4gIH1cblxuICAvKipcbiAgICog5aSa57uE57uHIElEXG4gICAqL1xuICBnZXRDaGFubmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBnZXRUYXJnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YXJnZXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkvJror53nsbvlnotcbiAgICovXG4gIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnZlcnNhdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6L+c56uv5oiQ5ZGYIElEIOWIl+ihqFxuICAgKi9cbiAgZ2V0UmVtb3RlVXNlcklkcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYWxsVXNlcklkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKTtcbiAgICBjb25zdCByZW1vdGVVc2VySWRzID0gYWxsVXNlcklkcy5maWx0ZXIoKGlkKSA9PiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpICE9PSBpZCk7XG4gICAgcmV0dXJuIHJlbW90ZVVzZXJJZHM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6L+c56uv5oiQ5ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICBnZXRSZW1vdGVVc2VycygpOiBJVXNlckRhdGFbXSB7XG4gICAgY29uc3QgcmVtb3RlVXNlcjogSVVzZXJEYXRhW10gPSBbXTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBmb3IgKGNvbnN0IHVpZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgY29uc3QgeyB1c2VySWQgfSA9IHRoaXMuX3VzZXJJbmZvW3VpZF07XG4gICAgICBpZiAodXNlcklkICE9PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHJlbW90ZVVzZXIucHVzaCh0aGlzLl91c2VySW5mb1t1aWRdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlbW90ZVVzZXI7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5oi/6Ze054q25oCBXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uU3RhdGUgPT09IG51bGwgPyBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EIDogdGhpcy5fc2Vzc2lvblN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS6uuWRmOeKtuaAgVxuICAgKi9cbiAgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckluZm9bdXNlcklkXT8uc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lya6K+d5Y+R6LW36ICFIElkXG4gICAqL1xuICBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsZXJJZCE7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5qyh5Lya6K+d6YKA6K+36ICFIElkXG4gICAqL1xuICBnZXRJbnZpdGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faW52aXRlcklkITtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3pgJror53lqpLkvZPnsbvlnotcbiAgICovXG4gIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5ZCO5Y+v6LCD55SoXG4gICAqL1xuICBnZXRTdW1tYXJ5KCk6IElFbmRTdW1tYXJ5IHtcbiAgICAvLyDpgJror53ml7bpl7TorqHnrpdcbiAgICBjb25zdCBiZWdpblRpbWVzdGFtcCA9IHRoaXMuX2JlZ2luVGltZXN0YW1wO1xuICAgIGNvbnN0IGVuZFRpbWVzdGFtcCA9IHRoaXMuX2VuZFRpbWVzdGFtcDtcbiAgICBsZXQgZHVyYXRpb24gPSAwO1xuICAgIGlmIChlbmRUaW1lc3RhbXAgPiBiZWdpblRpbWVzdGFtcCAmJiBiZWdpblRpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgZHVyYXRpb24gPSBlbmRUaW1lc3RhbXAgLSBiZWdpblRpbWVzdGFtcDtcbiAgICB9XG5cbiAgICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBiZWdpblRpbWVzdGFtcCxcbiAgICAgIGVuZFRpbWVzdGFtcCxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgZW5kUmVhc29uOiB0aGlzLl9lbmRSZWFzb24hLFxuICAgIH07XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gZ2V0U3VtbWFyeSAtPiBzdW1tYXJ5OiAke0pTT04uc3RyaW5naWZ5KHN1bW1hcnkpfWApO1xuICAgIHJldHVybiBzdW1tYXJ5O1xuICB9XG59XG4iLCIvKipcbiAqIOmAmuivneWqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxNZWRpYVR5cGUge1xuICAvKipcbiAgICog6Z+z6aKR6YCa6K+dXG4gICAqL1xuICBBVURJTyA9IDEsXG4gIC8qKlxuICAgKiDop4bpopHpgJror51cbiAgICovXG4gIEFVRElPX1ZJREVPXG59XG4iLCJleHBvcnQgZW51bSBNZW1iZXJNb2RpZnlUeXBlIHtcbiAgQUREID0gMSxcbiAgUkVNT1ZFXG59XG4iLCIvKipcbiAqIOW5s+WPsFxuICovXG5leHBvcnQgZW51bSBQbGF0Zm9ybSB7XG4gIFdFQiA9ICdXZWInLFxuICBJT1MgPSAnaU9TJyxcbiAgQU5EUk9JRCA9ICdBbmRyb2lkJ1xufVxuIiwiaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHlwZSwgSUxvZ2dlciwgSVJlY2VpdmVkTWVzc2FnZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lZGlhTW9kaWZ5TXNnQ29udGVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPZmZsaW5lUmVjb3JkIHtcbiAgY2hhbm5lbElkOiBzdHJpbmcsXG4gIGNvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gIHRhcmdldElkOiBzdHJpbmcsXG4gIG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLFxuICBjYWxsSWQ6IHN0cmluZyxcbiAgaW52aXRlcklkOiBzdHJpbmcsXG4gIGVuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uLFxuICBiZWdpblRpbWVzdGFtcDogbnVtYmVyLFxuICBlbmRUaW1lc3RhbXA6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlclxufVxuXG4vKipcbiAqIOemu+e6v+mAmuivneiusOW9leWZqFxuICovXG5leHBvcnQgY2xhc3MgT2ZmbGluZVJlY29yZGVyIHtcbiAgcHJpdmF0ZSBfbWVzc2FnZXM6IElSZWNlaXZlZE1lc3NhZ2VbXSB8IFtdID0gW11cblxuICBwcml2YXRlIF9jaGFubmVsSWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9jb252ZXJzYXRpb25UeXBlITogQ29udmVyc2F0aW9uVHlwZVxuXG4gIHByaXZhdGUgX3RhcmdldElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfbWVkaWFUeXBlITogUkNDYWxsTWVkaWFUeXBlXG5cbiAgcHJpdmF0ZSBfY2FsbElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfY2FsbGVySWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9pbnZpdGVySWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9lbmRSZWFzb24hOiBSQ0NhbGxFbmRSZWFzb25cblxuICBwcml2YXRlIF9iZWdpblRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX2VuZFRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uUmVjb3JkOiAocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkgPT4gdm9pZCxcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOe7k+adn1xuICAgKiDljp/lm6DmoLnmja7lt7HmlrnmmK/lkKbkuLrkuLvlj6vvvIzkuLvlj6vkuLrov5znq6/mnKrmjqXlkKwg6KKr5Y+r6KKr5bex56uv5pyq5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9kb0ludml0ZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZGVyVXNlcklkLCBjb250ZW50LFxuICAgIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgY2FsbElkLCBtZWRpYVR5cGUgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgdGhpcy5fY2hhbm5lbElkID0gY2hhbm5lbElkITtcbiAgICB0aGlzLl9jb252ZXJzYXRpb25UeXBlID0gY29udmVyc2F0aW9uVHlwZTtcbiAgICB0aGlzLl90YXJnZXRJZCA9IHRhcmdldElkO1xuICAgIHRoaXMuX2NhbGxJZCA9IGNhbGxJZDtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgY29uc3QgaXNDYWxsZXIgPSBzZW5kZXJVc2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgdGhpcy5faW52aXRlcklkID0gc2VuZGVyVXNlcklkO1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IGlzQ2FsbGVyID8gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSA6IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0U7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGludml0ZSB8IG1lbWJlck1vZGlmeSDnu5PmnZ9cbiAgICog5Y6f5Zug5qC55o2u5bex5pa55piv5ZCm5Li65Li75Y+r77yM5Li75Y+r5Li66L+c56uv5pyq5o6l5ZCsIOiiq+WPq+iiq+W3seerr+acquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9NZW1iZXJNb2RpZnkobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2RvSW52aXRlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg6K6h566X55qE56a757q/6K6w5b2VXG4gICAqL1xuICBwcml2YXRlIF9kb1JpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBhY2NlcHQg6K+05piO6YCa6K+d5bey5bu656uLXG4gICAqIOWOn+WboOm7mOiupOW3seaWueato+W4uOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfZG9BY2NlcHQobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBtZXNzYWdlLnNlbnRUaW1lO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBodW5ndXAg6K+05piO5Li65q2j5bi45oyC5patXG4gICAqIOWOn+WboOWPlua2iOaBr+S9k+mHjOaMguaWreWOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9IdW5ndXAobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY29udGVudCwgc2VudFRpbWUsIHNlbmRlclVzZXJJZCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IHJlYXNvbiB9ID0gY29udGVudCBhcyBJSHVuZ3VwTXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBpc1NlbGZTZW5kID0gc2VuZGVyVXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IGlzU2VsZlNlbmQgPyByZWFzb24gOiBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl07XG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gc2VudFRpbWU7XG5cbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj6rkv67mlLnpgJror53nsbvlnotcbiAgICovXG4gIHByaXZhdGUgX2RvTWVkaWFNb2RpZnkobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSB9ID0gY29udGVudCBhcyBJTWVkaWFNb2RpZnlNc2dDb250ZW50O1xuICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbkdlblJlY29yZCgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsZXQgZHVyYXRpb24gPSAwO1xuICAgICAgY29uc3QgaXNOZWVkRHVyYXRpb25SZWFzb24gPSBbXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVAsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9KT0lORURfQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfS0lDS0VEX0JZX1NFUlZFUixcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwsXG4gICAgICBdLmluY2x1ZGVzKHRoaXMuX2VuZFJlYXNvbik7XG4gICAgICBpZiAoaXNOZWVkRHVyYXRpb25SZWFzb24pIHtcbiAgICAgICAgZHVyYXRpb24gPSB0aGlzLl9lbmRUaW1lc3RhbXAgLSB0aGlzLl9iZWdpblRpbWVzdGFtcDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29uUmVjb3JkKHtcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICAgIGludml0ZXJJZDogdGhpcy5faW52aXRlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgZW5kUmVhc29uOiB0aGlzLl9lbmRSZWFzb24sXG4gICAgICAgIGJlZ2luVGltZXN0YW1wOiB0aGlzLl9iZWdpblRpbWVzdGFtcCxcbiAgICAgICAgZW5kVGltZXN0YW1wOiB0aGlzLl9lbmRUaW1lc3RhbXAsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZWN2T2ZmbGluZU1zZ3MobWVzc2FnZXM6IElSZWNlaXZlZE1lc3NhZ2VbXSkge1xuICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgZG8ge1xuICAgICAgY29uc3QgbXNnID0gdGhpcy5fbWVzc2FnZXMuc2hpZnQoKSE7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VUeXBlLCBjb250ZW50OiB7IGNhbGxJZCB9IH0gPSBtc2c7XG4gICAgICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGU6XG4gICAgICAgICAgdGhpcy5fZG9JbnZpdGUobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1Jpbmdpbmc6XG4gICAgICAgICAgdGhpcy5fZG9SaW5naW5nKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQ6XG4gICAgICAgICAgdGhpcy5fZG9BY2NlcHQobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbTpcbiAgICAgICAgICB0aGlzLl9kb01lbWJlck1vZGlmeShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWE6XG4gICAgICAgICAgdGhpcy5fZG9NZWRpYU1vZGlmeShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwOlxuICAgICAgICAgIHRoaXMuX2RvSHVuZ3VwKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtPZmZsaW5lUmVjb3JkZXJdIG9uUmVjdk9mZmxpbmVNc2dzIC0+IHVuZXhwZWN0ZWQgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtc2cpfWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRoaXMuX21lc3NhZ2VzLmxlbmd0aCA+IDApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgSUxvZ2dlciwgSVB1c2hDb25maWcsIElSZWNlaXZlZE1lc3NhZ2UsIElSdW50aW1lLCBJU2VuZE1zZ09wdGlvbnMsIFJUQ1BsdWdpbkNvbnRleHQsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IE1lbWJlck1vZGlmeVR5cGUgfSBmcm9tICcuL2VudW1zL01lbWJlck1vZGlmeVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJVXNlclByb2ZpbGUgfSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0TXNnQ29udGVudCwgSUFjY2VwdE1zZ09wdGlvbnMsIElDYWxsTXNnT3B0aW9uLCBJSHVuZ3VwTXNnQ29udGVudCwgSUh1bmd1cE1zZ09wdGlvbnMsXG4gIElJbnZpdGVNc2dDb250ZW50LCBJSW52aXRlTXNnT3B0aW9ucywgSU1lZGlhTW9kaWZ5TXNnQ29udGVudCwgSU1lZGlhTW9kaWZ5TXNnT3B0aW9ucywgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsXG4gIElNZW1iZXJNb2RpZnlNc2dPcHRpb25zLCBJTXNnTGlzdGVuZXIsIElSaW5naW5nTXNnQ29udGVudCwgSVJpbmdpbmdNc2dPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnLi9lbnVtcy9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgSU9mZmxpbmVSZWNvcmQsIE9mZmxpbmVSZWNvcmRlciB9IGZyb20gJy4vT2ZmbGluZVJlY29yZGVyJztcbmltcG9ydCB7IFJDQ2FsbFN0YXRlTWFjaGluZSB9IGZyb20gJy4uJztcblxuY29uc3QgY2FsbE1zZ1R5cGVzID0gWydSQzpWQ0FjY2VwdCcsICdSQzpWQ1JpbmdpbmcnLCAnUkM6VkNTdW1tYXJ5JywgJ1JDOlZDSGFuZ3VwJywgJ1JDOlZDSW52aXRlJywgJ1JDOlZDTW9kaWZ5TWVkaWEnLCAnUkM6VkNNb2RpZnlNZW0nXTtcblxudHlwZSBNc2dMaXN0ZW5lcktleXMgPSBrZXlvZiBJTXNnTGlzdGVuZXJcblxuaW50ZXJmYWNlIElNc2dCdWZmZXJJdGVtIHtcbiAgbWFya1RpbWU6IG51bWJlcixcbiAgbXNnOiBJUmVjZWl2ZWRNZXNzYWdlXG59XG5cbmNvbnN0IEVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZTogeyBba2V5OiBudW1iZXJdOiBSQ0NhbGxFcnJvckNvZGUgfSA9IHtcbiAgW0Vycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1RdOiBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNULFxuICBbRXJyb3JDb2RlLk5PVF9JTl9HUk9VUF06IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fR1JPVVAsXG59O1xuXG4vKipcbiAqIOa2iOaBr+aOpeaUtuWkhOeQhjog5Zyo57q/5raI5oGv44CB56a757q/5raI5oGvXG4gKiDlj5HpgIHmtojmga/lpITnkIY6IOWPkemAgeS4jeWQjOexu+Wei+a2iOaBr+WwgeijhVxuICovXG5leHBvcnQgY2xhc3MgQ2FsbE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBfd2F0Y2hlcnM6IElNc2dMaXN0ZW5lciA9IHt9XG5cbiAgcHJpdmF0ZSBfdXNlckluZm86IElVc2VyUHJvZmlsZSA9IHt9XG5cbiAgcHJpdmF0ZSBfbXNnQnVmZmVyTGlzdDogSU1zZ0J1ZmZlckl0ZW1bXSA9IFtdXG5cbiAgcHJpdmF0ZSBfaGFkSGFuZGxlTXNnVGltZXI6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX29mZmxpbmVSZWNvcmRlciE6IE9mZmxpbmVSZWNvcmRlclxuXG4gIHByaXZhdGUgX2RldmljZUlkOiBzdHJpbmcgPSAnJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOemu+e6v+a2iOaBr+WkhOeQhuaXtumXtOmXtOmalFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29mZmxpbmVNc2dJdHY6IG51bWJlciA9IDYwICogMTAwMCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nZXRTdGF0ZU1hY2hpbmU6IChjYWxsSWQ6IHN0cmluZykgPT4gUkNDYWxsU3RhdGVNYWNoaW5lIHwgbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBkZXZpY2VJZFxuICAgIHRoaXMuX2RldmljZUlkID0gZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDlpITnkIbmtojmga/mlLblj5FcbiAgICB0aGlzLl9jb250ZXh0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgIC8vIOWkhOeQhuemu+e6v+a2iOaBr+iusOW9lVxuICAgIHRoaXMuX29mZmxpbmVSZWNvcmRlciA9IG5ldyBPZmZsaW5lUmVjb3JkZXIodGhpcy5fY29udGV4dCwgdGhpcy5fbG9nZ2VyLCAocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gb2ZmbGluZVJlY29yZGVyIC0+ICR7SlNPTi5zdHJpbmdpZnkocmVjb3JkKX1gKTtcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZCAmJiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQocmVjb3JkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTWVzc2FnZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgaXNDYWxsTXNnID0gY2FsbE1zZ1R5cGVzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpO1xuICAgIGlmIChpc0NhbGxNc2cpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBfb25NZXNzYWdlIC0+IGNhbGwgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgIC8vIOmAmui/h+mBjeWOhiBidWZmZXJMaXN0IOafpeaJvuimgeaPkuWFpeeahOiKgueCuVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFya1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB7IHNlbnRUaW1lOiBjdXJyZW50TXNnU2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgICAgIGxldCBpbnNlcnRJbmRleCA9IDA7XG4gICAgICAgIC8vIOmcgOmBjeWOhuaVsOe7hOWFqOmDqOmhue+8jOaVheS9v+eUqCBmb3JFYWNoLCBmaW5kSW5kZXgg5om+5Yiw56ys5LiA5Liq56ym5ZCI5p2h5Lu255qE5bCx5Lya57uI5q2iXG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3QuZm9yRWFjaCgoeyBtc2c6IHsgc2VudFRpbWUgfSB9LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50TXNnU2VudFRpbWUgPj0gc2VudFRpbWUpIHtcbiAgICAgICAgICAgIC8vIGluc2VydEluZGV4IOmcgOS4uuW9k+WJjeespuWQiOadoeS7tuWFg+e0oOeahOWQjuS4gOS9je+8jOaVhSArMVxuICAgICAgICAgICAgaW5zZXJ0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHtcbiAgICAgICAgICBtYXJrVGltZSxcbiAgICAgICAgICBtc2c6IG1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBvbk1lc3NhZ2UgLT4gbXNnQnVmZmVyTGlzdDogJHt0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzcGxpY2UgYnVmZmVyIG1zZyBlcnJvciAtPiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIOWQr+WKqOa2iOaBr+WkhOeQhlxuICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjnur/mtojmga/mipvnu5nnirbmgIHmnLrlpITnkIZcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdk9ubGluZUNhbGxNc2cobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYG9uTWVzc2FnZSAtPiBfb25SZWN2T25saW5lQ2FsbE1zZzogJHttZXNzYWdlLm1lc3NhZ2VUeXBlfWApO1xuICAgIGNvbnN0IHsgY29udGVudDogeyBjYWxsSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDlnKjnur/mtojmga/nm7TmjqXmipvlh7pcbiAgICBzd2l0Y2ggKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGU6XG4gICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlICYmIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vblJpbmdpbmdgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0OlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbkFjY2VwdGAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW06XG4gICAgICAgIC8vIOaUtuWIsOS6uuWRmOWPmOabtOaKm+WHuiBvbkludml0ZSDnlJ/miJDnirbmgIHmnLrlrp7kvotcbiAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUgJiYgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbk1lZGlhTW9kaWZ5YCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cDpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25IdW5ndXBgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBvblJlY3ZPbmxpbmVDYWxsTXNnIC0+IHVuZXhwZWN0ZWQgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOa2iOaBryBidWZmZXIg5YiX6KGo5aSE55CG6YC76L6RXG4gICAqIDHjgIHmr48gMjBtcyDmo4Dmn6XkuIDmrKEgYnVmZmVyIGxpc3RcbiAgICogMuOAgeWPluWHuuW3sue7j+W7tui/nyAyMDAg55qE5raI5oGv5YiX6KGo6L+b6KGM5raI6LS5IHwg5peg5bu26L+fIDIwMG1zIOWGhea2iOaBr+ebtOaOpemAkuW9klxuICAgKiAz44CB5raI6LS55YiG5Li6IOemu+e6v+a2iOaBr+a2iOi0uemAu+i+keOAgeWcqOe6v+a2iOaBr+a2iOi0uemAu+i+ke+8jOa2iOi0ueWQjumAkuW9klxuICAqL1xuICBwcml2YXRlIF9oYW5kbGVCdWZmZXJNc2dzKCkge1xuICAgIC8vIOa2iOaBryBidWZmZXIg5YiX6KGo6ZW/5bqm5Li6IDAg5pe25Yqg6ZSBXG4gICAgaWYgKHRoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RoID09PSAwIHx8IHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdfaGFuZGxlQnVmZmVyTXNncyByZXR1cm4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g6ZyA6KaB5Yqg6ZSB77yM5pS25Yiw5aSa5qyh5raI5oGv5ZCO77yM5Y+v6IO95Lya6LW35aSa5LiqIHRpbWVyXG4gICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8g5Y+W5Ye65aSn5LqOIDIwMCBtcyDmtojmga/liJfooahcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbHRlcigoaXRlbSkgPT4gY3VycmVudFRpbWUgLSBpdGVtLm1hcmtUaW1lID49IDIwMCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gaGFuZGxlQnVmZmVyTXNncyAtPiBsaXN0cyBvdmVyIDIwMG1zIDogJHtKU09OLnN0cmluZ2lmeShidWZmZXJzLm1hcCgoeyBtc2c6IHsgbWVzc2FnZVVJZCwgaXNPZmZMaW5lTWVzc2FnZSwgY29udGVudDogeyBjYWxsSWQgfSB9IH0pID0+ICh7IG1lc3NhZ2VVSWQsIGlzT2ZmTGluZU1lc3NhZ2UsIGNhbGxJZCB9KSkpfWApO1xuICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIOayoeacieW7tui/nyAyMDBtcyDnmoTmtojmga/vvIzmtojotLnpgLvovpHop6PplIHlubbpgJLlvZLmiafooYxcbiAgICAgICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChidWZmZXJzWzBdLm1zZy5pc09mZkxpbmVNZXNzYWdlKSB7XG4gICAgICAgIC8vIOW9k+esrOS4gOadoea2iOaBr+S4uuemu+e6v+a2iOaBr+aXtu+8jOebtOaOpeS7jiBidWZmZXIg5Lit5Y+W5Ye65omA5pyJ56a757q/5raI5oGv77yM6L+b6KGM5raI5oGvXG4gICAgICAgIGxldCBvZmZsaW5lQnVmZmVycyA9IHRoaXMuX21zZ0J1ZmZlckxpc3QuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm1zZy5pc09mZkxpbmVNZXNzYWdlKTtcblxuICAgICAgICAvLyDnprvnur/mtojmga/lpITnkIbpgLvovpFcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvblR5cGUsIG1lc3NhZ2VUeXBlLCBzZW50VGltZSwgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IGNhbGxJZDogaW52aXRlQ2FsbElkLCBpbnZpdGVVc2VySWRzIH0sXG4gICAgICAgICAgfSA9IG9mZmxpbmVCdWZmZXJzWzBdLm1zZztcblxuICAgICAgICAgIGNvbnN0IGlzSW52aXRlTXNnVHlwZSA9IFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW1dLmluY2x1ZGVzKG1lc3NhZ2VUeXBlIGFzIFJDQ2FsbE1lc3NhZ2VUeXBlKTtcblxuICAgICAgICAgIC8vIOiuoeeul+W9k+WJjeaXtumXtOS4jua2iOaBr+WPkemAgeaXtumXtOW3rlxuICAgICAgICAgIGNvbnN0IGRlbGF5VGltZSA9IHRoaXMuX2NvbnRleHQuZ2V0U2VydmVyVGltZSgpIC0gc2VudFRpbWU7XG4gICAgICAgICAgY29uc3QgaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgPSBkZWxheVRpbWUgPCB0aGlzLl9vZmZsaW5lTXNnSXR2O1xuXG4gICAgICAgICAgaWYgKCFpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0dikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgb2ZmbGluZSBtc2cgZGVsYXlUaW1lOiAke2RlbGF5VGltZX1tc2ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0ludml0ZU1zZ1R5cGUpIHsgLy8g5Y+W5Ye655qE56ys5LiA5p2h5raI5oGv5Li6IGludml0ZSB8IG1lbU1vZGlmeVxuICAgICAgICAgICAgLy8g5Y+W5Ye655u45ZCMIENhbGxJZCDmtojmga/liJfooahcbiAgICAgICAgICAgIGNvbnN0IHRhc2tNc2dMaXN0OiBJUmVjZWl2ZWRNZXNzYWdlW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2ZmbGluZUJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG9mZmxpbmVCdWZmZXJzW2ldLm1zZztcbiAgICAgICAgICAgICAgY29uc3QgeyBjb250ZW50OiB7IGNhbGxJZDogb3RoZXJDYWxsSWQgfSB9ID0gaXRlbTtcbiAgICAgICAgICAgICAgaWYgKGludml0ZUNhbGxJZCA9PT0gb3RoZXJDYWxsSWQpIHtcbiAgICAgICAgICAgICAgICB0YXNrTXNnTGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGB0YXNrTXNnTGlzdCBsZW5ndGg6ICR7dGFza01zZ0xpc3QubGVuZ3RofWApO1xuXG4gICAgICAgICAgICBpZiAodGFza01zZ0xpc3QubGVuZ3RoID4gMCkgeyAvLyDpmLLmraIgdGFza01zZ0xpc3Qg5Li6IDBcbiAgICAgICAgICAgICAgLy8g5om+5Ye6IG1zZ0J1ZmZlckxpc3Qg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgICAgICAgIGNvbnN0IGRlbEluZGV4ID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubXNnLm1lc3NhZ2VVSWQgPT09IHRhc2tNc2dMaXN0W3Rhc2tNc2dMaXN0Lmxlbmd0aCAtIDFdLm1lc3NhZ2VVSWQpO1xuICAgICAgICAgICAgICAvLyDliKDpmaTmtojotLnov4cgbXNnQnVmZmVyTGlzdCDnmoTmtojmga9cbiAgICAgICAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdCA9IHRoaXMuX21zZ0J1ZmZlckxpc3Quc2xpY2UoZGVsSW5kZXggKyAxKTtcblxuICAgICAgICAgICAgICAvLyDmib7lh7ogb2ZmbGluZU1zZ3Mg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgICAgICAgIGNvbnN0IGRlbE9mZmxpbmVJbmRleCA9IG9mZmxpbmVCdWZmZXJzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5tc2cubWVzc2FnZVVJZCA9PT0gdGFza01zZ0xpc3RbdGFza01zZ0xpc3QubGVuZ3RoIC0gMV0ubWVzc2FnZVVJZCk7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpOa2iOi0uei/hyBvZmZsaW5lQnVmZmVycyDnmoTmtojmga9cbiAgICAgICAgICAgICAgb2ZmbGluZUJ1ZmZlcnMgPSBvZmZsaW5lQnVmZmVycy5zbGljZShkZWxPZmZsaW5lSW5kZXggKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog5Y2V6IGK5pyq57uT5p2f6YCa6K+d5Yik5patXG4gICAgICAgICAgICAgKiDlpoLmnpzmtojmga/lnKggNjBzIOWGhe+8jOWIpOaWreaYr+WQpuacquaIkOWvue+8iOWPquaciSBpbnZpdGUg5oiW5Y+q5pyJIGludml0ZSDmiJYgcmluZ2luZyDmiJDlr7nmipvnu5kg56a757q/6K6w5b2V5Zmo77yM5pyq5oiQ5a+55oqb57uZ54q25oCB5py6XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVW5maW5pc2hlZFByaXZhdGVDYWxsOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuUFJJVkFURSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCBpc09ubHlJbnZpdGUgPSB0YXNrTXNnTGlzdC5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICAgIGNvbnN0IGhhc0ludml0ZUFuZFJpbmdpbmcgPSB0YXNrTXNnTGlzdC5ldmVyeSgoaXRlbSkgPT4gW1JDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1JpbmdpbmddLmluY2x1ZGVzKGl0ZW0ubWVzc2FnZVR5cGUgYXMgUkNDYWxsTWVzc2FnZVR5cGUpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzT25seUludml0ZSB8fCBoYXNJbnZpdGVBbmRSaW5naW5nO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog576k6IGK5pyq57uT5p2f6YCa6K+d5Yik5patXG4gICAgICAgICAgICAgKiDpgJrov4cgbGlzdCDkuK0gaW52aXRlIOWSjCBtZW1iZXJNb2RpZnkg5raI5oGv5Lit5Y+W5Ye65omA5pyJ5Y+C5LiO6YCa6K+d55qEIHVzZXJJZFxuICAgICAgICAgICAgICog6YGN5Y6GIGxpc3Qg5om+5Ye65omA5pyJIGhhbmd1cCDnmoQgc2VuZFVzZXJJZFxuICAgICAgICAgICAgICogICAgIOaAu+S6uuaVsCAtIOaMguaWreS6uuaVsCA+IDEgIOS4lOWJqeS9meS6uuaVsOWMheWQq+iHquW3se+8jOiupOS4uumAmuivneacquaMguaWrei/m+eKtuaAgeaculxuICAgICAgICAgICAgICogICAgIOaAu+S6uuaVsCAtIOaMguaWreS6uuaVsCA8PSAxIOmAmuivneaMguaWre+8jOi/m+emu+e6v+a2iOaBr+WkhOeQhuWZqFxuICAgICAgICAgICAgICogICAgIOS4u+WPq+ebtOaOpeaMguaWreS4lOWFtuS7luS6uuacquaOpeWQrOebtOaOpei/m+emu+e6v+WkhOeQhuWZqFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBpc1VuZmluaXNoZWRHcnBDYWxsOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgbGV0IGlzVW5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgbm9PbmVBY2NlcHQgPSB0cnVlO1xuICAgICAgICAgICAgICBsZXQgYWxsVXNlcklkcyA9IFtzZW5kZXJVc2VySWQsIC4uLmludml0ZVVzZXJJZHNdO1xuICAgICAgICAgICAgICBsZXQgaXNDYWxsZXJIdW5ndXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrTXNnTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiB0YXNrTXNnU2VuZGVyVXNlcklkLCBtZXNzYWdlVHlwZSB9ID0gdGFza01zZ0xpc3RbaV07XG4gICAgICAgICAgICAgICAgLy8g5Y+q6KaB6Ieq5bex5oyC5pat55u05o6l6Lez5Ye65b6q546v77yM6L+b56a757q/5raI5oGvXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCAmJiB0YXNrTXNnU2VuZGVyVXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5om+5Ye65omA5pyJ5oyC5pat55qE5Lq65ZGY77yM5Lul5Y+K6YCa6K+d5Y+R6LW36ICF5piv5ZCm5oyC5patXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgICAgICAgICAgICAgaXNDYWxsZXJIdW5ndXAgPSBzZW5kZXJVc2VySWQgPT09IHRhc2tNc2dTZW5kZXJVc2VySWQ7XG4gICAgICAgICAgICAgICAgICBhbGxVc2VySWRzID0gYWxsVXNlcklkcy5maWx0ZXIoKGlkKSA9PiB0YXNrTXNnU2VuZGVyVXNlcklkICE9PSBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOWIpOaWreaYr+WQpuaXoOS6uuaOpeWQrFxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQpIHtcbiAgICAgICAgICAgICAgICAgIG5vT25lQWNjZXB0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIOS4jeaYr+S4u+WPq+aMguaWreS4lOaXoOS6uuaOpeWQrO+8jOS4lOWJqeS9meS6uuaVsOWkp+S6jiAxXG4gICAgICAgICAgICAgIGlmICghKG5vT25lQWNjZXB0ICYmIGlzQ2FsbGVySHVuZ3VwKSAmJiBhbGxVc2VySWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpc1VuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBpc1VuZmluaXNoZWQ7XG4gICAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgJiYgKGlzVW5maW5pc2hlZFByaXZhdGVDYWxsIHx8IGlzVW5maW5pc2hlZEdycENhbGwpKSB7XG4gICAgICAgICAgICAgIHRhc2tNc2dMaXN0LmZvckVhY2godGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZywgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZsaW5lUmVjb3JkZXIub25SZWN2T2ZmbGluZU1zZ3ModGFza01zZ0xpc3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgJiYgdGhpcy5fZ2V0U3RhdGVNYWNoaW5lKGludml0ZUNhbGxJZCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZyhvZmZsaW5lQnVmZmVyc1swXS5tc2cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIHVuZXhjZXB0ZWQgb2ZmbGluZSBtc2cgLT4gJHtKU09OLnN0cmluZ2lmeShvZmZsaW5lQnVmZmVyc1swXS5tc2cpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmbGluZUJ1ZmZlcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG9mZmxpbmVCdWZmZXJzLmxlbmd0aCA+IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Zyo57q/5raI5oGv5aSE55CG6YC76L6RXG4gICAgICAgIGJ1ZmZlcnMuZm9yRWFjaCgoeyBtc2cgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuX29uUmVjdk9ubGluZUNhbGxNc2cobXNnISk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyDmib7lh7ogbXNnQnVmZmVyTGlzdCDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgY29uc3QgZGVsQ291bnQgPSBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+H55qE5raI5oGvXG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc3BsaWNlKDAsIGRlbENvdW50KTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYHRpbWVyIG9ubGluZSBtc2cgaGFuZGxlIC0+IGRlbENvdW50OiAke2RlbENvdW50fSBtc2dCdWZmZXJMaXN0OiAke3RoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RofWApO1xuICAgICAgfVxuICAgICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICB9LCAyMCk7XG4gIH1cblxuICByZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElNc2dMaXN0ZW5lcikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fd2F0Y2hlcnMsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQoY2FsbElkOiBzdHJpbmcsIGZ1bmNOYW1lOiBNc2dMaXN0ZW5lcktleXMsIGV2ZW50OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSBjYWxsSWQgKyBmdW5jTmFtZTtcbiAgICBzdXBlci5vbihldmVudFR5cGUsIGV2ZW50KTtcbiAgfVxuXG4gIHVucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudChjYWxsSWQ6IHN0cmluZykge1xuICAgIFsnb25SaW5naW5nJywgJ29uQWNjZXB0JywgJ29uSHVuZ3VwJywgJ29uTWVkaWFNb2RpZnknXS5mb3JFYWNoKChmdW5jTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRUeXBlID0gY2FsbElkICsgZnVuY05hbWU7XG4gICAgICBzdXBlci5yZW1vdmVBbGwoZXZlbnRUeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX3VzZXJJbmZvID0gdXNlckluZm87XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCBIElNIOa2iOaBr1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZENhbGxNZXNzYWdlKG9wdGlvbnM6IElDYWxsTXNnT3B0aW9uKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgbWVzc2FnZT86IElSZWNlaXZlZE1lc3NhZ2UgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIC0+IG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YCk7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgcHVzaFRpdGxlLCBwdXNoRGF0YSwgcHVzaENvbnRlbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2VuZE9wdHM6IElTZW5kTXNnT3B0aW9ucyA9IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIG1lc3NhZ2VUeXBlLFxuICAgICAgY29udGVudCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdCxcbiAgICB9O1xuXG4gICAgaWYgKFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSkpIHtcbiAgICAgIGNvbnN0IHB1c2hDb25pZmc6IElQdXNoQ29uZmlnID0ge1xuICAgICAgICBwdXNoVGl0bGU6IHB1c2hUaXRsZSB8fCAnJyxcbiAgICAgICAgcHVzaENvbnRlbnQ6IHB1c2hDb250ZW50IHx8ICcnLFxuICAgICAgICBwdXNoRGF0YTogcHVzaERhdGEgfHwgJycsXG4gICAgICAgIGFuZHJvaWRDb25maWc6IHtcbiAgICAgICAgICBjYXRlZ29yeUhXOiAnVk9JUCcsXG4gICAgICAgICAgY2F0ZWdvcnlWaXZvOiAnSU0nLFxuICAgICAgICB9LFxuICAgICAgICBpT1NDb25maWc6IHtcbiAgICAgICAgICBhcG5zQ29sbGFwc2VJZDogY29udGVudC5jYWxsSWQsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVQdXNoVGl0bGU6IGZhbHNlLFxuICAgICAgICBmb3JjZVNob3dEZXRhaWxDb250ZW50OiBmYWxzZSxcbiAgICAgICAgdGVtcGxhdGVJZDogJycsXG4gICAgICB9O1xuICAgICAgc2VuZE9wdHMucHVzaENvbmZpZyA9IHB1c2hDb25pZmc7XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5zZW5kTWVzc2FnZShjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZE9wdHMpO1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgZXJyb3IgLT4gY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogRW5naW5lRXJyb3JDb2RlVG9DYWxsRXJyb3JDb2RlW2NvZGVdIHx8IFJDQ2FsbEVycm9yQ29kZS5TRU5EX01TR19FUlJPUixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBtZXNzYWdlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB6YKA6K+35raI5oGvXG4gICAqL1xuICBhc3luYyBzZW5kSW52aXRlKG9wdGlvbnM6IElJbnZpdGVNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm9vbVR5cGUsIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCBpbnZpdGVVc2VySWRzLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIHNlbmRJbnZpdGUnLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgdGhpcy5fd2F0Y2hlcnMuc2VuZEFjY2VwdCAmJiB0aGlzLl93YXRjaGVycy5zZW5kQWNjZXB0KHsgY2FsbElkIH0pO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElJbnZpdGVNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJvb21UeXBlLFxuICAgICAgZXh0cmEsXG4gICAgICBlbmdpbmVUeXBlOiA0LFxuICAgICAgY2hhbm5lbEluZm86IHsgSWQ6IGNhbGxJZCwgS2V5OiAnJyB9LFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkcyxcbiAgICAgIG9ic2VydmVyVXNlcklkczogW10sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCA/IGludml0ZVVzZXJJZHMgOiBbdGFyZ2V0SWRdLFxuICAgICAgcHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQsXG4gICAgICBwdXNoRGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHVzZXJJZExpc3Q6IGludml0ZVVzZXJJZHMsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeS6uuWRmOWPmOabtOa2iOaBr1xuICAgKi9cbiAgYXN5bmMgc2VuZE1lbWViZXJNb2RpZnkob3B0aW9uczogSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgaW52aXRlVXNlcklkcywgY2FsbGVySWQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLCAvLyBUT0RPIOS4jiBJTSDkuIDoh7RcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5naW5lVHlwZTogNCxcbiAgICAgIGNoYW5uZWxJbmZvOiB7IElkOiBjYWxsSWQsIEtleTogJycgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZHMsXG4gICAgICBvYnNlcnZlclVzZXJJZHM6IFtdLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgICBjYWxsZXI6IGNhbGxlcklkLFxuICAgICAgbW9kaWZ5TWVtVHlwZTogTWVtYmVyTW9kaWZ5VHlwZS5BREQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3QsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIHB1c2hEYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgdXNlcklkTGlzdDogaW52aXRlVXNlcklkcyxcbiAgICAgICAgY2FsbElkLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5ZON6ZOD5raI5oGvXG4gICAqL1xuICBzZW5kUmluZ2luZyhvcHRpb25zOiBJUmluZ2luZ01zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSVJpbmdpbmdNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlkIzmhI/mjqXlkKzmtojmga9cbiAgICovXG4gIHNlbmRBY2NlcHQob3B0aW9uczogSUFjY2VwdE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJQWNjZXB0TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHmjILmlq3mtojmga9cbiAgICovXG4gIHNlbmRIdW5ndXAob3B0aW9uczogSUh1bmd1cE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHJlYXNvbiwgdXNlcklkcywgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJSHVuZ3VwTXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgcHVzaERhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2FsbElkLCByZWFzb24sXG4gICAgICB9KSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlqpLkvZPlj5jmm7Tmtojmga9cbiAgICovXG4gIHNlbmRNZWRpYU1vZGlmeShvcHRpb25zOiBJTWVkaWFNb2RpZnlNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lZGlhTW9kaWZ5TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxMYW5ndWFnZSB7XG4gIFpIID0gJ3poJyxcbiAgRU4gPSAnZW4nXG59XG4iLCJleHBvcnQgY29uc3QgRU4gPSB7XG4gIFB1c2hUaXRsZToge1xuICAgIEFVRElPOiAnWW91IGhhdmUgYSB2b2ljZSBjYWxsJyxcbiAgICBWSURFTzogJ1lvdSBoYXZlIGEgdmlkZW8gY2FsbCcsXG4gIH0sXG59O1xuIiwiZXhwb3J0IGNvbnN0IFpIID0ge1xuICBQdXNoVGl0bGU6IHtcbiAgICBBVURJTzogJ+aCqOacieS4gOadoemfs+mikemAmuivnScsXG4gICAgVklERU86ICfmgqjmnInkuIDmnaHop4bpopHpgJror50nLFxuICB9LFxufTtcbiIsImltcG9ydCB7IFJDQ2FsbExhbmd1YWdlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBFTiB9IGZyb20gJy4vZW4nO1xuaW1wb3J0IHsgWkggfSBmcm9tICcuL3poJztcblxuLyoqXG4gKiBDYWxsRW5naW5lIOWFqOWxgOivreiogOiuvue9ru+8jOW9k+WJjeS7heaUr+aMgeS4reOAgeiLseaWh1xuICovXG5leHBvcnQgY2xhc3MgTG9jYWwge1xuICBzdGF0aWMgX2xhbmc6IFJDQ2FsbExhbmd1YWdlID0gUkNDYWxsTGFuZ3VhZ2UuWkhcblxuICBzdGF0aWMgc2V0KGxhbmc6IFJDQ2FsbExhbmd1YWdlKSB7XG4gICAgdGhpcy5fbGFuZyA9IGxhbmc7XG4gIH1cblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIGlmICh0aGlzLl9sYW5nID09PSBSQ0NhbGxMYW5ndWFnZS5FTikge1xuICAgICAgcmV0dXJuIEVOO1xuICAgIH1cbiAgICByZXR1cm4gWkg7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBDb252ZXJzYXRpb25UeXBlLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsU3RhdGVNYWNoaW5lIH0gZnJvbSAnLi9jb3JlL1N0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSU1lZGlhTW9kaWZ5SW5mbywgSU1lbWJlck1vZGlmeUluZm8sIElTZW5kZXJJbmZvLCBJU3RhdGVDaGFuZ2VJbmZvLCBJVXNlclByb2ZpbGUsIElVc2VyU3RhdGVDaGFuZ2VJbmZvLCBJVXNlckRhdGEsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7IFJDQ2FsbEVycm9yQ29kZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxVc2VyU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvblN0YXRlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxFbmRSZWFzb24gfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsRW5kUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbE1lZGlhVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgQ2FsbE1lc3NhZ2VIYW5kbGVyIH0gZnJvbSAnLi9jb3JlL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IGV2ZW50RW1pdHRlciwgZ2VuZXJhdGVSYW5kb21JZCwgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBJQ2FsbEVuZ2luZU9wdGlvbnMsIElDYWxsRW5naW5lV2F0Y2hlcnMgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJSW52aXRlTXNnQ29udGVudCB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQgeyBMb2NhbCB9IGZyb20gJy4vY29yZS9sb2NhbGUnO1xuaW1wb3J0IHsgSU9mZmxpbmVSZWNvcmQgfSBmcm9tICcuL2NvcmUvT2ZmbGluZVJlY29yZGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0Nyb3NzQ2FsbFR5cGUnO1xuXG5jbGFzcyBSQ0NhbGxFbmdpbmUge1xuICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IHsgW2NhbGxJZDogc3RyaW5nXTogUkNDYWxsU3RhdGVNYWNoaW5lIH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxNc2dIYW5kbGVyOiBDYWxsTWVzc2FnZUhhbmRsZXJcblxuICAvKipcbiAgICog5Yid5aeL5YyWXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBlbmdpbmUgUGxndWluQ29udGV4dCDlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIC8qKlxuICAgICAqIOi/kOihjOaXtuebuOWFs1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSDml6Xlv5fmqKHlnZflrp7kvovvvIznlLEgQ2FsbExpYiDlsYLliJ3lp4vljJZcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOebkeWQrOaWueazlVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3dhdGNoZXJzOiBJQ2FsbEVuZ2luZVdhdGNoZXJzLFxuICAgIC8qKlxuICAgICAqIOWFtuS7lumFjee9rumhuVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IElDYWxsRW5naW5lT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIFZlcnNpb246ICR7X19WRVJTSU9OX199IENvbW1pdElkOiAke19fQ09NTUlUX0lEX199YCk7XG4gICAgLy8g6K6+572uIERldmljZUlkXG4gICAgZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDnm5HlkKwgSU0g5raI5oGvXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIgPSBuZXcgQ2FsbE1lc3NhZ2VIYW5kbGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwgdGhpcy5fb3B0aW9ucy5vZmZsaW5lTXNnSXR2LCB0aGlzLl9nZXRTdGF0ZU1hY2hpbmUuYmluZCh0aGlzKSk7XG4gICAgLy8g5rOo5YaM5raI5oGv5qih5Z2X55uR5ZCsXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJFdmVudExpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgc2VuZEFjY2VwdDogdGhpcy5faGFuZGxlU2VuZEFjY2VwdC5iaW5kKHRoaXMpLFxuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQsXG4gICAgfSk7XG4gICAgLy8g55uR5ZCs54q25oCB5py65YWz6ZetXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdvblN0YXRlTWFjaGluZUNsb3NlJywgKGNhbGxJZDogc3RyaW5nKSA9PiB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgfSk7XG4gICAgLy8g6K6+572u6K+t6KiAXG4gICAgTG9jYWwuc2V0KF9vcHRpb25zLmxhbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25JbnZpdGUobXNnOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIHNlbmRlclVzZXJJZDogc3VpZCwgcHVzaENvbmZpZyxcbiAgICB9ID0gbXNnO1xuICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYFJDQ2FsbEVuZ2luZSBfb25JbnZpdGU6dGFyZ2V0SWQgJHt0YXJnZXRJZH0gc2VuZGVyVXNlcklkOiAke3N1aWR9YCk7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWFUeXBlLCBjYWxsSWQsIGV4dHJhLCByb29tVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJSW52aXRlTXNnQ29udGVudDtcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlICE9PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBzZW5kZXJVc2VySWQgPSBzdWlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBjb25zdCBjcnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpID09PSBzZW5kZXJVc2VySWQpIHsgLy8g5aSa56uv5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog576k6IGK6YCa6K+d5pyJ5YW25LuW56uv5aSE55CG5pe277yM5LiN5YaN5aSE55CG5q2k6YCa6K+d5Lit55qE6YKA6K+35raI5oGvXG4gICAgICog5p2h5Lu2MTog5q2k5Lq65bey6KKr6YKA6K+36YCa6K+dXG4gICAgICog5p2h5Lu2Mjog5pys56uv5peg5q2k6YCa6K+d55qE54q25oCB5py6XG4gICAgICovXG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgY29uc3QgaXNLZWVwaW5nID0gY29udGVudC5leGlzdGVkVXNlclBvZmlsZXMuc29tZSgoaXRlbTogeyB1c2VySWQ6IHN0cmluZyB9KSA9PiAoaXRlbS51c2VySWQgPT09IGNydFVzZXJJZCkpO1xuICAgICAgaWYgKGlzS2VlcGluZyAmJiAhdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlTWFjaGluZSA9IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdO1xuICAgIGlmICghc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICAgIGNoYW5uZWxJZCEsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgICk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsRW5naW5lXSBSQ0NhbGxTdGF0ZU1hY2hpbmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgLT4gY2FsbElkOiAke2NhbGxJZH1gKTtcblxuICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSkge1xuICAgICAgICAvLyDnirbmgIHmnLrlhoXpg6jlpITnkIYgaW52aXRlIOa2iOaBr1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uSW52aXRlKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uTWVtYmVyTW9kaWZ5KG1zZyk7XG4gICAgICB9XG4gICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSh0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSwgZXh0cmEpO1xuXG4gICAgICBjb25zdCBoYXNPdGhlclN0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkuZmlsdGVyKChvdGhlckNhbGxJZCkgPT4gY2FsbElkICE9PSBvdGhlckNhbGxJZCkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChoYXNPdGhlclN0YXRlTWFjaGluZSAmJiAhKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwgfHwgZmFsc2UpKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9faGFuZGxlSW52aXRlSW5TZXNzaW9uKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0pIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5YWB6K645o6l5ZCs5paw55qE6YCa6K+d5pe277yM5o6l5ZCs5a6M5paw55qE6YCa6K+d5ZCO77yM5oyC5pat5YW25LuW6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVTZW5kQWNjZXB0KGluZm86IHsgY2FsbElkOiBzdHJpbmcgfSkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dBY2NlcHROZXdDYWxsKSB7XG4gICAgICBjb25zdCB7IGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc3RhdGVNYWNoaW5lKSB7XG4gICAgICAgIGlmIChjYWxsSWQgIT09IGlkKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXS5odW5ndXAoKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlueKtuaAgeaculxuICAqL1xuICBwcml2YXRlIF9nZXRTdGF0ZU1hY2hpbmUoY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM55So5oi35L+h5oGvLCDlj5HpgIEgY2FsbCDmtojmga/ml7bnlKjmiLfkv6Hmga/mkLrluKZcbiAgICovXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSByZWdpc3RlclVzZXJJbmZvIC0+IHVzZXJJbmZvOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJbmZvKX1gKTtcblxuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyVXNlckluZm8odXNlckluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvFxuICAgKiBAcGFyYW0gY2hhbm5lbElkIOe7hOe7hyBJRFxuICAgKiBAcGFyYW0gdGFyZ2V0SWQgIOWvueaWuSBJRFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIGNhbGwoXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IG51bWJlcixcbiAgICBleHRyYTogc3RyaW5nID0gJycsXG4gICAgcHVzaFRpdGxlOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29udGVudDogc3RyaW5nID0gJycsXG4gICAgaXNDcm9zc0FwcGtleSA9IGZhbHNlLFxuICApOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzdGF0ZU1hY2hpbmU/OiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSBjYWxsIC0+IGFyZ3M6ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9KX1gKTtcbiAgICBjb25zdCBjYWxsSWQgPSBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgY29uc3QgaGFzU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNTdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVEFURV9NQUNISU5FX0VYSVQgfTtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0gPSBuZXcgUkNDYWxsU3RhdGVNYWNoaW5lKFxuICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIENvbnZlcnNhdGlvblR5cGUuUFJJVkFURSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgY2FsbElkLFxuICAgICk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX2NhbGwoW3RhcmdldElkXSwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsIGlzQ3Jvc3NBcHBrZXkpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsXG4gICAgICAgIHN0YXRlTWFjaGluZTogdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog576k5ZG8XG4gICAqIEBwYXJhbSBjaGFubmVsSWQg57uE57uHIElEXG4gICAqIEBwYXJhbSB0YXJnZXRJZCAg576k57uEIElEXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+S6uuWRmOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIGNhbGxJbkdyb3VwKFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgbWVkaWFUeXBlOiBudW1iZXIsXG4gICAgdXNlcklkczogc3RyaW5nW10sXG4gICAgZXh0cmE6IHN0cmluZyA9ICcnLFxuICAgIHB1c2hUaXRsZTogc3RyaW5nID0gJycsXG4gICAgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnLFxuICApOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzdGF0ZU1hY2hpbmU/OiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSBjYWxsSW5Hcm91cCAtPiBhcmdzOiAke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5HUk9VUCxcbiAgICAgIHRhcmdldElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgY2FsbElkLFxuICAgICk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX2NhbGwodXNlcklkcywgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsXG4gICAgICAgIHN0YXRlTWFjaGluZTogdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6ZSA5q+B5b2T5YmN55qE54q25oCB5py6XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsRW5naW5lXSBkZXN0cm95Jyk7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lID0ge307XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUkNDYWxsRW5naW5lLFxuICBSQ0NhbGxTdGF0ZU1hY2hpbmUsIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbEVuZFJlYXNvbixcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxMYW5ndWFnZSxcbn07XG5cbmV4cG9ydCB0eXBlIHtcbiAgSUNhbGxTdGF0ZU1hY2hpbmVXYXRjaGVycywgSUVuZFN1bW1hcnksXG4gIElDYWxsRW5naW5lV2F0Y2hlcnMsXG4gIElVc2VyU3RhdGVDaGFuZ2VJbmZvLFxuICBJU3RhdGVDaGFuZ2VJbmZvLFxuICBJU2VuZGVySW5mbyxcbiAgSU1lbWJlck1vZGlmeUluZm8sXG4gIElNZWRpYU1vZGlmeUluZm8sXG4gIElJbnZpdGVkVXNlcnMsXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJQcm9maWxlLFxuICBJT2ZmbGluZVJlY29yZCxcbiAgSUludml0ZU9wdGlvbnMsXG59O1xuIiwiLyoqXG4gKiDkuqfnlJ9zZXNzaW9u55qE5Zy65pmvXG4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y2VUeXBlcyB7XG4gIC8qKlxuICAgKiDkuLvlj6tcbiAgICovXG4gIENBTExFUiA9IDEsXG5cbiAgLyoqXG4gICAqIOiiq+WPq1xuICAgKi9cbiAgQ0FMTEVFID0gMlxufVxuIiwiY2xhc3MgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsaXN0OiB7W3Byb3BOYW1lOiBzdHJpbmddOiBhbnlbXX0gPSB7fVxuXG4gIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBmdW46KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICAodGhpcy5saXN0W2V2ZW50XSB8fCAodGhpcy5saXN0W2V2ZW50XSA9IFtdKSkucHVzaChmdW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuOihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgY29uc3Qgb24gPSAoZGF0YT86YW55KSA9PiB7XG4gICAgICB0aGlzLm9mZihldmVudCwgb24pO1xuICAgICAgZnVuLmNhbGwodGhpcywgZGF0YSk7XG4gICAgfTtcbiAgICBvbi5mdW4gPSBmdW47XG4gICAgdGhpcy5vbihldmVudCwgb24pO1xuICB9XG5cbiAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBmdW4/OihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgY29uc3QgZnVucyA9IHRoaXMubGlzdFtldmVudF07XG4gICAgaWYgKCFmdW5zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZnVuKSB7XG4gICAgICAvLyDlpoLmnpzmsqHmnInkvKAgZm4g55qE6K+d77yM5bCx5Lya5bCGIGV2ZW50IOWAvOWvueW6lOe8k+WtmOWIl+ihqOS4reeahCBmdW4g6YO95riF56m6XG4gICAgICBmdW5zICYmIChmdW5zLmxlbmd0aCA9IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDoi6XmnIkgZnVu77yM6YGN5Y6G57yT5a2Y5YiX6KGo77yM55yL55yL5Lyg5YWl55qEIGZuIOS4juWTquS4quWHveaVsOebuOWQjO+8jOWmguaenOebuOWQjOWwseebtOaOpeS7jue8k+WtmOWIl+ihqOS4reWIoOaOieWNs+WPr1xuICAgICAgbGV0IGNiO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIHsgbGVuZ3RoIH0gPSBmdW5zOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2IgPSBmdW5zW2ldO1xuICAgICAgICBpZiAoY2IgPT09IGZ1biB8fCBjYi5mdW4gPT09IGZ1bikge1xuICAgICAgICAgIGZ1bnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgZGF0YT86YW55KSB7XG4gICAgLy8g56ys5LiA5Liq5Y+C5pWw5piv5a+55bqU55qEIGV2ZW50IOWAvO+8jOebtOaOpeeUqOaVsOe7hOeahCBzaGlmdCDmlrnms5Xlj5blh7pcbiAgICBjb25zdCBmdW5zID0gWy4uLnRoaXMubGlzdFtldmVudF1dO1xuXG4gICAgLy8g5aaC5p6c57yT5a2Y5YiX6KGo6YeM5rKh5pyJIGZ1biDlsLHov5Tlm54gZmFsc2VcbiAgICBpZiAoIWZ1bnMgfHwgZnVucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8g6YGN5Y6GIGV2ZW50IOWAvOWvueW6lOeahOe8k+WtmOWIl+ihqO+8jOS+neasoeaJp+ihjCBmblxuICAgIGZ1bnMuZm9yRWFjaCgoZnVuKSA9PiB7XG4gICAgICBmdW4uY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXZlbnRFbWl0dGVyLFxufTtcbiIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgRXZlbnRFbWl0dGVyKCk7XG4iLCJpbXBvcnQgeyBSVENKb2luVHlwZSwgTG9nTCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZXNvbHV0aW9uIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHtcbiAgSVNlc3Npb25MaXN0ZW5lciwgSVJDQ2FsbEluaXRPcHRpb25zLCBJVmFsaWRhdGlvblJlc3VsdCwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmZ1bmN0aW9uIGlzTGFuZ3VhZ2UodmFsOiBzdHJpbmcpIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IE9iamVjdC52YWx1ZXMoUkNDYWxsTGFuZ3VhZ2UpO1xuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmZ1bmN0aW9uIGlzSm9pblR5cGUodmFsOiBudW1iZXIpIHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhSVENKb2luVHlwZSkgYXMgbnVtYmVyW107XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModmFsKTtcbn1cblxuZnVuY3Rpb24gaXNMb2dMZXZlbCh2YWw6IG51bWJlcikge1xuICByZXR1cm4gW0xvZ0wuREVCVUcsIExvZ0wuSU5GTywgTG9nTC5XQVJOLCBMb2dMLkVSUk9SXS5pbmNsdWRlcyh2YWwpO1xufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgPSAob3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG4gIGNvbnN0IGtleU5hbWVzOiBzdHJpbmdbXSA9IFsncnRjQ2xpZW50JywgJ29uU2Vzc2lvbicsICdvblNlc3Npb25DbG9zZSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAvLyDmoKHpqozloavpobnmmK/lkKbpg73ljIXlkKvvvIzlpoLmnpzlk6rkuKrkuI3ljIXlkKvlsLHmlLbpm4botbfmnaVcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8g5aaC5p6c57y65bCR5b+F5aGr55qE55uR5ZCs5Ye95pWw5oiW5a+56LGhXG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5ydGNDbGllbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5vblNlc3Npb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25cXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25DbG9zZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqGaXNBbGxvd1N1YnNjcmliZVJldHJ5IOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5ICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc0FsbG93U3Vic2NyaWJlUmV0cnlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd1B1Ymxpc2hSZXRyeVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JUQ0pvaW5UeXBl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5qb2luVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzSm9pblR5cGUob3B0aW9ucy5qb2luVHlwZSEpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnam9pblR5cGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JDQ2FsbExhbmd1YWdl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sYW5nICE9PSAndW5kZWZpbmVkJyAmJiAhaXNMYW5ndWFnZShvcHRpb25zLmxhbmchKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xhbmdcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwgIT09ICd1bmRlZmluZWQnICYmICFpc0xvZ0xldmVsKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwhKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ091dHB1dExldmVsXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiDmoKHpqoxyZWdpc3RlclNlc3Npb25MaXN0ZW5lcuWPguaVsFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnbGlzdGVuZXIgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cbiAgY29uc3Qga2V5TmFtZXM6IHN0cmluZ1tdID0gWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25UcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25SaW5naW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25SaW5naW5nXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkFjY2VwdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uQWNjZXB0XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkh1bmd1cCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uSHVuZ3VwXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vblRyYWNrUmVhZHkgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvblRyYWNrUmVhZHlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVRhcmdldElkID0gKHRhcmdldElkOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0YXJnZXRJZCAmJiB0eXBlb2YgdGFyZ2V0SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndGFyZ2V0SWRcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFUeXBlID0gKG1lZGlhVHlwZTogbnVtYmVyKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gfHwgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdtZWRpYVR5cGVcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnUkNDYWxsTWVkaWFUeXBlXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUV4dHJhID0gKGV4dHJhOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgZXh0cmEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZXh0cmFcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaFRpdGxlID0gKHB1c2hUaXRsZTogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIHB1c2hUaXRsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoVGl0bGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbnRlbnQgPSAocHVzaENvbnRlbnQ6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwdXNoQ29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoQ29udGVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb25maWcgPSAocHVzaENvbmZpZzogSVB1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJyB9ID0gcHVzaENvbmZpZztcbiAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFtdO1xuICBjb25jbHVzaW9uLnB1c2godmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlKSk7XG4gIGNvbmNsdXNpb24ucHVzaCh2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50KSk7XG4gIHJldHVybiBjb25jbHVzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVXNlcklkcyA9ICh1c2VySWRzOiBzdHJpbmdbXSk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJJZHMpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMuZXZlcnkoKHN0cikgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuXG5mdW5jdGlvbiBpc1JDRnJhbWVSYXRlKHZhbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFycnMgPSBbJ0ZQU18xMCcsICdGUFNfMTUnLCAnRlBTXzI0JywgJ0ZQU18zMCddO1xuICByZXR1cm4gYXJycy5pbmNsdWRlcyh2YWwpO1xufVxuXG5jb25zdCBpc1ZhbGlkUmVzb2x1dGlvbiA9IChyZXNvbHV0aW9uPzogUkNSZXNvbHV0aW9uKTogYm9vbGVhbiA9PiAhIVJDUmVzb2x1dGlvbltyZXNvbHV0aW9uIV07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMgPSAoY29uc3RyYWludHM6IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5taWNwaG9uZUlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5zYW1wbGVSYXRlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ251bWJlclxcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICAvLyBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3VzZXInICYmIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAnZW52aXJvbm1lbnQnKSB7XG4gIC8vICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSAgXFwndXNlclxcJyBvciBcXCdlbnZpcm9ubWVudFxcJycgfVxuICAvLyB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzUkNGcmFtZVJhdGUoY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2ZyYW1lUmF0ZVxcJyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAndW5kZWZpbmVkJyAmJiAhaXNWYWxpZFJlc29sdXRpb24oY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbikpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdyZXNvbHV0aW9uXFwnIHZhbHVlIGlzIG91dCBvZiByYW5nZScgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgKCFjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgfHwgIWNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24pKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncmVzb2x1dGlvblxcJyBhbmQgXFwncmVzb2x1dGlvblxcJyBpcyByZXF1aXJlZCcgfTtcbiAgfVxuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIFRpbWVyIHtcbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgc3RvcCgpOiB7XG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgZW5kVGltZTogbnVtYmVyLFxuICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICB9IHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG5cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZHVyYXRpb24gPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUgPT09IDApIHtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgICBlbmRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnZlcnNhdGlvblR5cGUsIElMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJTWVkaWFNb2RpZnlJbmZvLFxuICBJTWVtYmVyTW9kaWZ5SW5mbyxcbiAgSVNlbmRlckluZm8sXG4gIElTdGF0ZUNoYW5nZUluZm8sXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJTdGF0ZUNoYW5nZUluZm8sXG4gIElJbnZpdGVPcHRpb25zLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbFN0YXRlTWFjaGluZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIFJDS2lja1JlYXNvbixcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZUF1ZGlvVHJhY2ssXG4gIFJDUmVtb3RlVHJhY2ssXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNSVENQaW5nUmVzdWx0LFxuICBSQ1JUQ1Jvb20sXG4gIElNaWNwaG9uZUF1ZGlvUHJvZmlsZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHsgUHJvZHVjZVR5cGVzIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmltcG9ydCB7XG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLFxuICBJTXV0ZVVzZXIsXG4gIElSQ0NhbGxTZXNzaW9uT3B0aW9ucyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVMaXN0ZW5lciwgdmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCB2YWxpZGF0ZVVzZXJJZHMsIHZhbGlkYXRlRXh0cmEsIHZhbGlkYXRlUHVzaFRpdGxlLCB2YWxpZGF0ZVB1c2hDb250ZW50LFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tICcuL3RpbWVyJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFNlc3Npb24ge1xuICAvKipcbiAgICogUlRD5oi/6Ze05a6e5L6LXG4gICAqL1xuICBwcml2YXRlIF9yb29tITogUkNSVENSb29tXG5cbiAgLyoqXG4gICAqIOeUqOaIt+S8oOi/m+adpeeahCDlr7lzZXNzaW9u55qE55uR5ZCsICjopoHlnKhSQ0NhbGxDbGllbnTnmoRfb25JbnZpdGXph4zliKTmlq3vvIzopoHmsYLmiafooYzlroxvblNlc3Npb27lv4Xpobvms6jlhoxzZXNzaW9u55qE55uR5ZCs77yM5omA5Lul6L+Z6YeM5pivcHVibGljKVxuICAgKi9cbiAgcHVibGljIF9saXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJUQ+iuoumYheOAgeWPkeW4g+mHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfUkVUUllDT1VOVDogbnVtYmVyID0gMlxuXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7Tlrprml7blmahcbiAgICovXG5cbiAgcHJpdmF0ZSBqb2luUm9vbVRpbWVyOiBhbnkgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoXG5cbiAgICAvKipcbiAgICAgKiDnirbmgIHmnLrlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSxcblxuICAgIC8qKlxuICAgICAqIHJ0Y+WunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnQsXG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG5cbiAgICAvKipcbiAgICAgKiBzZXNzaW9u55qE5YW25a6D6YCJ6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbFNlc3Npb25PcHRpb25zID0ge30sXG5cbiAgKSB7XG4gICAgLy8g55uR5ZCs54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOaIt+eKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtIGluZm9cbiAgICAgICAqL1xuICAgICAgb25Vc2VyU3RhdGVDaGFuZ2U6ICh7IHVzZXIsIHJlYXNvbiB9OiBJVXNlclN0YXRlQ2hhbmdlSW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJTdGF0ZUNoYW5nZV0gdXNlcklkLT4ke3VzZXI/LnVzZXJJZH0gc3RhdGUtPiR7dXNlcj8uc3RhdGV9IHJlYXNvbi0+JHtyZWFzb259YCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtXG4gICAgICAgKi9cbiAgICAgIG9uU3RhdGVDaGFuZ2U6IGFzeW5jIChpbmZvOiBJU3RhdGVDaGFuZ2VJbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHJlYXNvbiB9ID0gaW5mbztcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gOiBzdGF0ZS0+JHtzdGF0ZX0gcmVhc29uLT4ke3JlYXNvbn1gKTtcblxuICAgICAgICAvLyDlpoLmnpzlnKjpgJror53kuK3vvIzlsLHliqDmiL/pl7RcbiAgICAgICAgaWYgKHN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIGNvbnN0IHJvb21JZDogc3RyaW5nID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIHJvb21JZDogJHtyb29tSWR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fam9pblJvb20ocm9vbUlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIGpvaW5Sb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAg5Lul5LiL5LiJ5p2h5Y+q6KaB5ruh6Laz5LiA5p2h77yM54q25oCB5Lya5Y+Y5oiQUkNDYWxsU2Vzc2lvblN0YXRlLkVORFxuICAgICAgICAgICAqICAx44CB5pys56uv55So5oi36Ieq5bex5Li75Yqo5oyC5patXG4gICAgICAgICAgICogIDLjgIHmnI3liqHnq6/miormnKznq6/nlKjmiLfouKLlh7pSVEPmiL/pl7RcbiAgICAgICAgICAgKiAgM+OAgeaIv+mXtOmHjOWwj+S6jjLkuKrkurpcbiAgICAgICAgICAgKi9cbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIC8vIOi/mOacquWKoOWFpeaIv+mXtOWwseaMguaWrVxuICAgICAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g6ZSA5q+B5pys5Zyw5rWB77yM5YWz6Zet5pGE5YOP5aS0XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KCk7XG4gICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gbG9jYWxUcmFja3MgZGVzdHJveWVkJyk7XG4gICAgICAgICAgdGhpcy5fbGVhdmVSb29tKCk7XG4gICAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw5ZON6ZODXG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBvblJpbmdpbmc6IChzZW5kZXI6IElTZW5kZXJJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uUmluZ2luZ11zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l55So5oi35ZON6ZODXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUmluZ2luZyhzZW5kZXIsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblJpbmdpbmddIG1ldGhvZCBleGNlcHRpb24gLT4gb25SaW5naW5nJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICAgKiDlvZPov5znq6/nlKjmiLflkIzmhI/mjqXlkKxcbiAgICAgICAgICovXG4gICAgICBvbkFjY2VwdDogKHNlbmRlcjogSVNlbmRlckluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjqXlkKxcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BY2NlcHQoc2VuZGVyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdIG1ldGhvZCBleGNlcHRpb24gLT4gb25BY2NlcHQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgICAqIOW9k+aciei/nOerr+eUqOaIt+aMguaWrVxuICAgICAgICAgKi9cbiAgICAgIG9uSHVuZ3VwOiAoc2VuZGVyOiBJU2VuZGVySW5mbywgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25IdW5ndXBdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH0gcmVhc29uLT4ke3JlYXNvbn1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjILmlq1cbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25IdW5ndXAoc2VuZGVyLCByZWFzb24sIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbkh1bmd1cF0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbkh1bmd1cCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOS6uuWRmOWPmOabtFxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZW1iZXJNb2RpZnk6ICh7IHNlbmRlciwgaW52aXRlZFVzZXJzIH06IElNZW1iZXJNb2RpZnlJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uTWVtYmVyTW9kaWZ5XSBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XnlKjmiLfkurrlkZjlj5jmm7RcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25NZW1iZXJNb2RpZnkoc2VuZGVyLCBpbnZpdGVkVXNlcnMsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lbWJlck1vZGlmeV0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbk1lbWJlck1vZGlmeScpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmAmuivneexu+Wei+WPmOabtCAo6YCa6K+d6ZmN57qnKVxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZWRpYU1vZGlmeTogKHsgc2VuZGVyLCBtZWRpYVR5cGUgfTogSU1lZGlhTW9kaWZ5SW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgICAgIC8vIOi/nOerr+aUtuWIsOmAmuivnemZjee6p+mAmuefpeWQju+8jOi/nOerr+aJp+ihjOmZjee6p+mAmuivnSjkuI3lj5Hmtojmga8pXG4gICAgICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uTWVkaWFNb2RpZnkoc2VuZGVyLCBtZWRpYVR5cGUsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uTWVkaWFNb2RpZnknKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm6LeoYXBwa2V5XG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBjcm9zc0FwcGtleTogKGlzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gY3Jvc3NBcHBrZXldIOaYr+WQpui3qCBhcHBrZXk6ICR7aXNDcm9zc0FwcGtleX1gKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7mjILmlq3nmoTmjqjpgIHkv6Hmga9cbiAgICAgKi9cbiAgICBjb25zdCB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfSA9IHRoaXMuX29wdGlvbnMuaHVuZ3VwUHVzaENvbmZpZyE7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnNldEh1bmd1cFB1c2hDb25maWcocHVzaFRpdGxlLCBwdXNoQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICogIOWKoOWFpeaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfam9pblJvb20ocm9vbUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBsZXQgY2FsbEJhY2s7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuaXNDcm9zc0FwcGtleSkge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luQ3Jvc3NSVENSb29tKHJvb21JZCwgdGhpcy5fb3B0aW9ucy5qb2luVHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbShyb29tSWQsIHRoaXMuX29wdGlvbnMuam9pblR5cGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvZGUsIHVzZXJJZHMsIHJvb20gfSA9IGNhbGxCYWNrO1xuXG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAgICAgIGlmIChjb2RlID09PSBSQ1JUQ0NvZGUuTk9UX09QRU5fVklERU9fQVVESU9fU0VSVkVSKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNFUlZJQ0VfTk9UX09QRU5FRCk7XG4gICAgICAgICAgLy8g5bex5pa55YW25LuW56uv5bey5Zyo6YCa6K+d5LitXG4gICAgICAgIH0gaWYgKGNvZGUgPT09IFJDUlRDQ29kZS5TSUdOQUxfSk9JTl9SVENfUk9PTV9SRUZVU0VEKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9JTl9DQUxMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IF9qb2luUm9vbV0gam9pbiByb29tIGZhaWxlZDogcm9vbUlkIC0+ICR7cm9vbUlkfSBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICog576k6IGK5pys56uv5Yqg5YWl5oi/6Ze05ZCO77yM5pu05paw5Lq65ZGY54q25oCB5Li66YCa6K+d5LitXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvblR5cGUgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q29udmVyc2F0aW9uVHlwZSgpO1xuICAgICAgY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCAmJiB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4oW3RoaXMuX3J0Y0NsaWVudC5nZXRDdXJyZW50SWQoKV0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIOmSiOWvueengeacieS6kSBAcm9uZ2Nsb3VkL3BsdWdpbi1ydGNANS4xLjEwLWVudGVycHJpc2UuNyDlop7liqDooaXkuIHvvIxcbiAgICAgICAqIOengeacieS6keWNh+WujCBSVEMgc2RrIOeJiOacrOWQjuWIoOaOieatpOihpeS4gVxuICAgICAgICog5Yqg5a6M5oi/6Ze05ZCO77yM5a+55pa55oyC5pat5LqG77yM6ZyA6YCA5Ye65oi/6Ze0XG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3RhdGUoKSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHJvb20hKTtcbiAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOiiq+WPq+aWueWKoOWFpeaIv+mXtOaIkOWKn++8jOS9huS4u+WPq+aWueWcqOWKoOWFpeaIv+mXtOWJjeemu+e6v1xuICAgICAgaWYgKHVzZXJJZHMhLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhpcy5qb2luUm9vbVRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IpO1xuICAgICAgICB9LCA2MDAwMCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yb29tID0gcm9vbSBhcyBSQ1JUQ1Jvb207XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9ydGNDbGllbnQuam9pblJUQ1Jvb20gdGhyb3cgZXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS4iuazqOWGjOebkeWQrOS6i+S7tlxuICAgIHRoaXMuX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKTtcblxuICAgIC8vIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgIHRoaXMuX3JlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDorqLpmIXov5znqIvnmoTmtYHvvIzmiorov5znqIvnmoTmtYHmipvnu5nnlKjmiLdcbiAgICAgIGF3YWl0IHRoaXMuX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOe7k+adn+mAmuivnXNlc3Npb25cbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5TVUJTQ1JJQkVfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9qb2luUm9vbV0gX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrIEV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8g5b6A5oi/6Ze06YeM5Y+R5biD5pys5Zyw6LWE5rqQXG4gICAgICBhd2FpdCB0aGlzLl9wdWJsaXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOe7k+adn+mAmuivnXNlc3Npb25cbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5QVUJMSVNIX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9wdWJsaXNoIEV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiAo5Yid5aeL5YyW5oi/6Ze055qE5pe25YCZKSDorqLpmIXov5znqIvnmoTmtYHvvIzmiorov5znqIvnmoTmtYHmipvnu5nnlKjmiLdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrKCkge1xuICAgIC8vIOiOt+WPluaJgOaciei/nOeoi+W3suWPkeW4g+eahOmfs+inhumikei1hOa6kOWIl+ihqFxuICAgIGNvbnN0IHRyYWNrczogUkNSZW1vdGVUcmFja1tdID0gdGhpcy5fcm9vbS5nZXRSZW1vdGVUcmFja3MoKTtcbiAgICBpZiAodHJhY2tzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdWJzY3JpYmVSZXRyeSh0cmFja3MsIHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LCB0aGlzLl9SRVRSWUNPVU5UKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SKTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFja10gUmVzb3VyY2Ugc3Vic2NyaXB0aW9uIGZhaWxlZCByb29tSWQgLT4gJHt0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCl9IFJUQyBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y+v5Lul6YeN6K+V55qE6K6i6ZiFXG4gICAqIEBwYXJhbSBwYXJhbXMudHJhY2tzIHRyYWNrc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSDmmK/lkKblhYHorrjph43or5VcbiAgICogQHBhcmFtIHBhcmFtcy5jb3VudCDlhYHorrjph43or5XnmoTmrKHmlbBcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3N1YnNjcmliZVJldHJ5KHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IGJvb2xlYW4gPSBmYWxzZSwgY291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPHsgY29kZTogUkNSVENDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20uc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1N1YnNjcmliZUZhaWwgJiYgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tTdWJzY3JpYmVGYWlsKGNvZGUsIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uXSBfbGlzdGVuZXIub25UcmFja1N1YnNjcmliZUZhaWwgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzkuI3lhYHorrjph43or5XvvIznm7TmjqXov5Tlm55cbiAgICAgIGlmICghaXNBbGxvd1N1YnNjcmliZVJldHJ5KSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY291bnQtLTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZVJldHJ5KHRyYWNrcywgaXNBbGxvd1N1YnNjcmliZVJldHJ5LCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HluIPmnKzlnLDotYTmupDnmoTpgLvovpFcbiAgICpcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3B1Ymxpc2goKSB7XG4gICAgY29uc3QgdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyE7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9wdWJsaXNoUmV0cnkodHJhY2tzLCB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksIHRoaXMuX1JFVFJZQ09VTlQpO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUFVCTElTSF9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBfcHVibGlzdF0gUmVzb3VyY2UgcHVibGlzaGluZyBmYWlsZWQ6IHJvb21JZCAtPiAke3RoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKX0gUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/kuLvliqjlj5HotbfnmoTlkbzlj6vvvIzlt7Lmj5DliY3mipvlh7rkuobotYTmupAsIOiiq+WKqOWRvOWPq++8jOi/memHjOaJjemcgOimgeaKm+WHulxuICAgIGlmICh0aGlzLl9vcHRpb25zLnByb2R1Y2VUeXBlID09PSBQcm9kdWNlVHlwZXMuQ0FMTEVFKSB7XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYEsIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkodHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y+v5Lul6YeN6K+V55qE5Y+R5biDXG4gICAqIEBwYXJhbSBwYXJhbXMudHJhY2tzIHRyYWNrc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlzQWxsb3dQdWJsaXNoUmV0cnkg5piv5ZCm5YWB6K646YeN6K+VXG4gICAqIEBwYXJhbSBwYXJhbXMuY291bnQg5YWB6K646YeN6K+V55qE5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdWJsaXNoUmV0cnkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSwgaXNBbGxvd1B1Ymxpc2hSZXRyeTogYm9vbGVhbiA9IGZhbHNlLCBjb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8eyBjb2RlOiBSQ1JUQ0NvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1B1Ymxpc2hGYWlsICYmIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUHVibGlzaEZhaWwoY29kZSwgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb25dIF9saXN0ZW5lci5vblRyYWNrUHVibGlzaEZhaWwgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzkuI3lhYHorrjph43or5XvvIznm7TmjqXov5Tlm55cbiAgICAgIGlmICghaXNBbGxvd1B1Ymxpc2hSZXRyeSkge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIHJldHVybiB0aGlzLl9wdWJsaXNoUmV0cnkodHJhY2tzLCBpc0FsbG93UHVibGlzaFJldHJ5LCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2xlYXZlUm9vbSgpIHtcbiAgICB0cnkge1xuICAgICAgLy8g6YCA5Ye65oi/6Ze0XG4gICAgICBjb25zdCBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20odGhpcy5fcm9vbSk7XG4gICAgICAvLyDmiJDlip/pgIDlh7rmiL/pl7TvvIzop6blj5FSQ0NhbGxDbGllbnTlrp7kvovkuIrnmoRvblNlc3Npb25DbG9zZeebkeWQrO+8jOaKm+e7meeUqOaIt+S/oeaBr1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2xlYXZlUm9vbV0gU3VjY2Vzc2Z1bGx5IGV4aXRlZCB0aGUgcm9vbSBjb2RlOiAke2NhbGxCYWNrLmNvZGV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBfbGVhdmVSb29tXSBsZWF2ZVJvb20gdGhyb3cgZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpO1xuICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWHuueOsOW8guW4uOWQjuimgeWkhOeQhueahOmAu+i+kSxcbiAgICogQHBhcmFtIGVuZFJlYXNvbiDljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX2V4Y2VwdGlvbkNsb3NlKGVuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uKSB7XG4gICAgLy8g6ZSA5q+B5pys5Zyw5rWBXG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9kZXN0cm95VHJhY2tzKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpO1xuXG4gICAgLy8g57uT5p2f54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLmNsb3NlKGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog55So5oi36LCD55So55qE77yM5rOo5YaMc2Vzc2lvbuS4iueahOebkeWQrFxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyOiBJU2Vzc2lvbkxpc3RlbmVyKTogdm9pZCB7XG4gICAgLy8g5YWI5qCh6aqMbGlzdGVuZXIsIOWmguaenOS4jemAmui/h++8jOS8mnRyb3cgZXJyb3JcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbFNlc3Npb24gcmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXJdICR7Y29uY2x1c2lvbi5tc2d9YCk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyID0geyAuLi5saXN0ZW5lciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiwg1JUQyBBUEkg6I635b6X5pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDmo4DmtYvmmK/lkKbog73lpJ/ojrflvpfmnKzlnLDmtYFcbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgeyAuLi5jb25zdHJhaW50cy5hdWRpbyB9KTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gc3VjY2Vzc2Z1bGx5IGdldCBBdWRpbyBsb2NhbCB0cmFja3MnKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3M6IFt0cmFjayFdIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUFuZENhbWVyYVRyYWNrcygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgeyAuLi5jb25zdHJhaW50cyB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIGdldCBBdWRpbyBhbmQgVmlkZW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIHN1Y2Nlc3NmdWxseSBnZXQgYXVkaW8gYW5kIHZpZGVvIGxvY2FsIHRyYWNrcycpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2sobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5bm25LiU5piv6I635b6X6Z+z6KeG6aKRLCDlubbkuJQg77yI5aaC5p6c6I635b6X6Z+z6KeG6aKR5LiN5oiQ5Yqf77yM5YWB6K646ZmN57qn6I635b6X6Z+z6aKR77yJXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPLCBjb25zdHJhaW50cyk7XG5cbiAgICAgIC8vIOWmguaenOmfs+inhumikeS4jeiDveiOt+W+l++8jOWwsemZjee6p+iOt+W+l+mfs+mikVxuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGNvbnN0cmFpbnRzKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgLy8g6I635Y+W6LWE5rqQ5aSx6LSl77yM6ZyA6KaB6LCD54q25oCB5py6c3RhdGUg5Li6IGVuZFxuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5HRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SKTtcbiAgICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAvLyDojrflj5botYTmupDlpLHotKXvvIzpnIDopoHosIPnirbmgIHmnLpzdGF0ZSDkuLogZW5kXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUik7XG5cbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3mm7TmjaLpn7PpopHorr7lpIdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VBdWRpb0RldmljZShhdWRpb0NvbnN0cmFpbnRzPzogSU1pY3Bob25lQXVkaW9Qcm9maWxlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgLy8g5paw6K6+5aSH55qEdHJhY2tcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICAvLyDmlbTnkIblkI7nmoTmnKzlnLB0cmFja1xuICAgIGNvbnN0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgYXVkaW9Db25zdHJhaW50cyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gY2hhbmdlRGV2aWNlXSBnZXQgbG9jYWwgQXVkaW8gdHJhY2tzIGZhaWxlZCBSQ1RMaWIgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTpn7PpopHpg73plIDmr4HvvIzvvIhSVENMaWIgU0RL5YaF6YOo5Lya5ZyoIGFkZExvY2FsVHJhY2sg5riF55CG5ZCM57G75Z6L6L2o6YGT5pWw5o2u77yM5omA5Lul6L+Z6YeM5rOo6YeK5o6J77yJXG4gICAgICAgIC8vIHRyYWNrLmRlc3Ryb3koKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q5oqK5LmL5YmN55qE6KeG6aKR55WZ5LiLXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVjZW50VHJhY2tzLnB1c2godHJhY2shKTtcblxuICAgIC8vIOWKoOS4iuacrOWcsOaWsOS6p+eUn+eahOmfs+mikVxuICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzID0gbG9jYWxUcmFja3M7XG4gICAgLy8g6YCa55+l5Lia5Yqh5bGCdHJhY2tSZWFkeVxuICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkocmVjZW50VHJhY2tzKTtcblxuICAgIC8vIOWmguaenOW9k+WJjeW3suWKoOWFpeaIv+mXtO+8jOWPkeW4g+aWsOa1gVxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmlrDmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkFVRElPX1BVQkxJU0hfRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbzlj6vkuK3nu6fnu63pgoDor7dcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRyYSDmtojmga/nmoTmianlsZXkv6Hmga9cbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg5bqf5byDIG9wdGlvbnMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDlup/lvIMgb3B0aW9ucy5wdXNoQ29udGVudCDpgJrnn6XlhoXlrrlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGV4dHJhID0gJycgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJyB9ID0gKHRoaXMuX29wdGlvbnMuY2FsbFB1c2hDb25maWc/LnB1c2hUaXRsZSB8fCB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnPy5wdXNoQ29udGVudCkgPyB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnIDogb3B0aW9ucztcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVXNlcklkcyh1c2VySWRzKSwgdmFsaWRhdGVFeHRyYShleHRyYSksIHZhbGlkYXRlUHVzaFRpdGxlKHB1c2hUaXRsZSksIHZhbGlkYXRlUHVzaENvbnRlbnQocHVzaENvbnRlbnQpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBpbnZpdGVdICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuaW52aXRlKHVzZXJJZHMsIHsgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfSk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQjOaEj+aOpeWQrFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjY2VwdChjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMoY29uc3RyYWludHMhKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF0gJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG5cbiAgICAvLyDmjqXlkKzkuYvliY3vvIzlhYjmjILmlq3lvZPliY3kuYvlpJbnmoRzZXNzaW9u77yM546w6Zi25q615LiN5YWB6K6455So5oi35YWI5oup5o6l5ZCsc2Vzc2lvbu+8jOS6i+WFiOS8muWcqOeKtuaAgeacuuWGhemDqOaMguaWre+8jOi/memHjOaKm+WHuuWOu++8jOS8mua4heeQhuWFtuWug+eahHNlZXNpb25cbiAgICBldmVudEVtaXR0ZXIuZW1pdCgnaHVuZ3VwT3RoZXJTZXNzaW9uJywgeyBzZXNzaW9uOiB0aGlzIH0pO1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IHRyYWNrcztcblxuICAgIC8vIOWPkemAgeaOpeWQrOeahOa2iOaBr1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lLmFjY2VwdCgpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF1TZW5kIGFjY2VwdCBtZXNzYWdlIGZhaWxlZCAtPiBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBodW5ndXAoKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZTsgfT4ge1xuICAgIC8vIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKVxuICAgIC8vIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5odW5ndXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53lqpLkvZPlj5jmm7RcbiAgICogIEBwYXJhbSBtZWRpYVR5cGUgUkNDYWxsTWVkaWFUeXBlLkFVRElPIOaUueS4uumfs+mikemAmuivnSB8IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyDmlLnkuLrpn7Pop4bpopHpgJror51cbiAgICovXG4gIHB1YmxpYyBhc3luYyBfY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2NoYW5nZU1lZGlhVHlwZV0gY2hhbmdlIG1lZGlhIHR5cGUgZmFpbCBjb2RlLT4gJHtjb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKRXG4gICAqL1xuICBwcml2YXRlIF9nZXRMb2NhbFZpZGVvVHJhY2tzKCk6IFJDTG9jYWxUcmFja1tdIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2tzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcykge1xuICAgICAgbG9jYWxWaWRlb1RyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNWaWRlb1RyYWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxWaWRlb1RyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDpn7PpopFcbiAgICovXG4gIHByaXZhdGUgX2dldExvY2FsQXVkaW9UcmFja3MoKTogUkNMb2NhbFRyYWNrW10ge1xuICAgIGxldCBsb2NhbEF1ZGlvdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIGxvY2FsQXVkaW90cmFja3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKSB7XG4gICAgICBsb2NhbEF1ZGlvdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvdHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiumAmuivneeahE1lZGlhVHlwZeWNh+e6p+WIsOmfs+inhumikVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2V0TWVkaWFUeXBlVG9BdWRpb0FuZFZpZGVvKCkge1xuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWPkeW4g+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChbdHJhY2shXSk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoX2NvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2VuYWJsZVZpZGVvXSBSZXNvdXJjZSBwdWJsaXNoaW5nIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG5cbiAgICAvLyDlj5Hmtojmga9cbiAgICB0aGlzLl9jaGFuZ2VNZWRpYVR5cGUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiorpgJror53nmoRNZWRpYVR5cGXpmY3nuqfliLDpn7PpopFcbiAgICogQHBhcmFtIGlzU2VuZE1lc3NzYWdlIOaYr+WQpumcgOimgeWPkea2iOaBrywg6buY6K6k5Y+R5raI5oGvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZXRNZWRpYVR5cGVUb0F1ZGlvKCkge1xuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgaWYgKHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnVucHVibGlzaCh0cmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRoaXMuX2Rlc3Ryb3lUcmFja3ModHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d6ZmN57qn77yM55uu5YmN6ZyA5rGC5Y+q5YGa6YCa6K+d6ZmN57qn77yM6Z+z6KeG6aKR5Y+v5Lul6ZmN57qn5Li66Z+z6aKR77yM6Z+z6aKR5LiN6IO95Y2H5Yiw6Z+z6KeG6aKRLCDlj5Hmtojmga/miJDlip/miY3nrpfpmY3nuqfmiJDlip9cbiAgICpcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXNjZW5kQWJpbGl0eSgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NoYW5nZU1lZGlhVHlwZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8pO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6KeG6aKRdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNhYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9UcmFja10gUm9vbSBtaXNzaW5nIHZpZGVvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOinhumikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5tdXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyDlpoLmnpzkuI3pnIDlhbPpl63mkYTlg4/lpLRcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS51bnB1Ymxpc2godHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuVU5QVUJMSVNIX1ZJREVPX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjop4bpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZVZpZGVvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWmguaenOS4jemcgOWFs+mXreaRhOWDj+WktFxuICAgIGlmICghdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUpIHtcbiAgICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJvb20gbWlzc2luZyB2aWRlbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICAvLyDlkK/nlKjop4bpopFcbiAgICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gR2V0IFJlc291cmNlIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTop4bpopHpg73plIDmr4FcbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q55WZ5LiL5LmL5YmN55qE6Z+z6aKRXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5Yqg5LiK5pys5Zyw5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOS4uuS6huinpuWPkeWvueaWueeahG9uVmlkZW9NdXRlQ2hhbmdlIOWFiOemgeeUqFxuICAgIHRyYWNrIS5tdXRlKCk7XG5cbiAgICAvLyDlj5HluIPmnKznq6/op4bpopHotYTmupBcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2goW3RyYWNrIV0pO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKF9jb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlZJREVPX1BVQkxJU0hfRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlkK/nlKhcbiAgICB0cmFjayEudW5tdXRlKCk7XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCkge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxBdWRpb1RyYWNrcygpO1xuXG4gICAgLy8g56aB55So6Z+z6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZUF1ZGlvVHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk7XG5cbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWQr+eUqOmfs+mikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay51bm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgX2Rlc3Ryb3lUcmFja3ModHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSkge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlUcmFja1JlYWR5KHRyYWNrczogUkNMb2NhbFRyYWNrW10gfCBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjayB8IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUmVhZHkodHJhY2ssIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9ub3RpZnlUcmFja1JlYWR5XSBfbGlzdGVuZXIgb25UcmFja1JlYWR5IGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiL/pl7TkuIrms6jlhozkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5fcm9vbS5yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKFxuICAgICAge1xuICAgICAgICAvKipcbiAgICAgICAgICog5pys56uv6KKr6Lii5Ye65oi/6Ze05pe26Kem5Y+RXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAgICog5Y+m5LiA56eN5Y+v6IO95piv5bex5pa5IHJ0Y1Bpbmcg5aSx6LSl5qyh5pWw6LaF5Ye65LiK6ZmQ77yM5pWF6ICM5Li75Yqo5pat57q/XG4gICAgICAgICAqIEBwYXJhbSBieVNlcnZlclxuICAgICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgICAqIOW9k+WAvOS4uiB0cnVlIOaXtu+8jOivtOaYjuacrOerr+aUtuWIsOiiq+i4ouWHuuaIv+mXtOmAmuefpVxuICAgICAgICAgKi9cbiAgICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVzZXJJZDogc3RyaW5nID0gdGhpcy5fcnRjQ2xpZW50LmdldEN1cnJlbnRJZCgpO1xuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VyTGVhdmUoW2N1cnJlbnRVc2VySWRdKTtcblxuICAgICAgICAgIGlmICghYnlTZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uU0VSVkVSX0tJQ0spIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSykge1xuICAgICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmjqXmlLbliLDmiL/pl7Tkv6Hku6Tml7blm57osIPvvIznlKjmiLflj6/pgJrov4fmiL/pl7Tlrp7kvovnmoQgYHNlbmRNZXNzYWdlKG5hbWUsIGNvbnRlbnQpYCDmjqXlj6Plj5HpgIHkv6Hku6RcbiAgICAgICAgICogQHBhcmFtIG5hbWUg5L+h5Luk5ZCNXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50IOS/oeS7pOWGheWuuVxuICAgICAgICAgKiBAcGFyYW0gc2VuZGVyVXNlcklkIOWPkemAgeiAhSBJZFxuICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZVVJZCDmtojmga/llK/kuIDmoIfor4ZcbiAgICAgICAgICovXG4gICAgICAgIG9uTWVzc2FnZVJlY2VpdmUobmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnksIHNlbmRlclVzZXJJZDogc3RyaW5nLCBtZXNzYWdlVUlkOiBzdHJpbmcpIHtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOebkeWQrOaIv+mXtOWxnuaAp+WPmOabtOmAmuefpVxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gY29udGVudFxuICAgICAgICAgKi9cbiAgICAgICAgb25Sb29tQXR0cmlidXRlQ2hhbmdlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HluIPogIXnpoHnlKgv5ZCv55So6Z+z6aKRXG4gICAgICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrIFJDUmVtb3RlQXVkaW9UcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uQXVkaW9NdXRlQ2hhbmdlOiAoYXVkaW9UcmFjazogUkNSZW1vdGVBdWRpb1RyYWNrKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BdWRpb011dGVDaGFuZ2VdIHVzZXJJZC0+JHthdWRpb1RyYWNrLmdldFVzZXJJZCgpfSBtdXRlZCAtPiAke2F1ZGlvVHJhY2suaXNPd25lck11dGVkKCl9YCk7XG4gICAgICAgICAgY29uc3QgbXV0ZVVzZXI6IElNdXRlVXNlciA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIG11dGVkOiBhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgICAga2luZDogJ2F1ZGlvJyxcbiAgICAgICAgICAgIHRyYWNrSWQ6IGF1ZGlvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uQXVkaW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uQXVkaW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25UcmFja011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWPkeW4g+iAheemgeeUqC/lkK/nlKjop4bpopFcbiAgICAgICAgICogQHBhcmFtIHZpZGVvVHJhY2sgUkNSZW1vdGVWaWRlb1RyYWNrIOexu+WunuS+i+WvueixoVxuICAgICAgICAgKi9cbiAgICAgICAgb25WaWRlb011dGVDaGFuZ2U6ICh2aWRlb1RyYWNrOiBSQ1JlbW90ZVZpZGVvVHJhY2spID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblZpZGVvTXV0ZUNoYW5nZV11c2VySWQtPiR7dmlkZW9UcmFjay5nZXRVc2VySWQoKX0gbXV0ZWQgLT4gJHt2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpfWApO1xuICAgICAgICAgIGNvbnN0IG11dGVVc2VyOiBJTXV0ZVVzZXIgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IHZpZGVvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICAgIGtpbmQ6ICd2aWRlbycsXG4gICAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVmlkZW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uVmlkZW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25WaWRlb011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOWGheWFtuS7lueUqOaIt+aWsOWPkeW4g+i1hOa6kOaXtuinpuWPkVxuICAgICAgICAgKiDlpoLpnIDojrflj5bliqDlhaXmiL/pl7TkuYvliY3miL/pl7TlhoXmn5DkuKrnlKjmiLflj5HluIPnmoTotYTmupDliJfooajvvIzlj6/kvb/nlKggcm9vbS5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCgndXNlcklkJykg6I635Y+WXG4gICAgICAgICAqIEBwYXJhbSB0cmFja3Mg5paw5Y+R5biD55qE6Z+z6L2o5LiO6KeG6L2o5pWw5o2u5YiX6KGo77yM5YyF5ZCr5paw5Y+R5biD55qEIFJDUmVtb3RlQXVkaW9UcmFjayDkuI4gUkNSZW1vdGVWaWRlb1RyYWNrIOWunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1B1Ymxpc2g6IGFzeW5jICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuICAgICAgICAgIC8vIOmAgOWHuuaIv+mXtOWQju+8jOi/mOS8mui1sOWIsOi/me+8n++8n++8jOaJgOS7peWIpOaWreS4gOS4i++8jOayoeaciXJvb23kuI3miafooYzorqLpmIVcbiAgICAgICAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g5oyJ5Lia5Yqh6ZyA5rGC6YCJ5oup6ZyA6KaB6K6i6ZiF6LWE5rqQ77yM6YCa6L+HIHJvb20uc3Vic2NyaWJlIOaOpeWPo+i/m+ihjOiuoumYhVxuICAgICAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnN1YnNjcmliZSh0cmFja3MpO1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBvblRyYWNrUHVibGlzaF0gc3Vic2NyaWJlIGZhaWxlZCBSVENDb2RlIC0+JHtjb2RlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOeUqOaIt+WPlua2iOWPkeW4g+i1hOa6kFxuICAgICAgICAgKiBAcGFyYW0gdHJhY2tzIOiiq+WPlua2iOWPkeW4g+eahOmfs+i9qOS4juinhui9qOaVsOaNruWIl+ihqFxuICAgICAgICAgKiBAZGVzY3JpcHRpb24g5b2T6LWE5rqQ6KKr5Y+W5raI5Y+R5biD5pe277yMU0RLIOWGhemDqOS8muWPlua2iOWvueebuOWFs+i1hOa6kOeahOiuoumYhe+8jOS4muWKoeWxguS7hemcgOWkhOeQhiBVSSDkuJrliqFcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tVbnB1Ymxpc2g6ICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDorqLpmIXnmoTpn7Pop4bpopHmtYHpgJrpgZPlt7Llu7rnq4ssIHRyYWNrIOW3suWPr+S7pei/m+ihjOaSreaUvlxuICAgICAgICAgKiBAcGFyYW0gdHJhY2sgUkNSZW1vdGVUcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tSZWFkeTogKHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuXG4gICAgICAgICAgLy8g5pyJ5pe25a+55pa55rKh5pyJ6ZmN57qn5oiQ5Yqf77yM5omU5oqb6L+H5p2l6KeG6aKR77yM6L+Z5pe255qE6KeG6aKR5LiN5a+55aSW5oqb5Ye6XG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPICYmIHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8g5omn6KGM55So5oi355qEb25UcmFja1JlYWR555uR5ZCsXG4gICAgICAgICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2tdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS6uuWRmOWKoOWFpVxuICAgICAgICAgKiBAcGFyYW0gdXNlcklkcyDliqDlhaXnmoTkurrlkZggaWQg5YiX6KGoXG4gICAgICAgICAqL1xuICAgICAgICBvblVzZXJKb2luOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAvLyDmnInkurrliqDlhaXmuIXpmaTlrprml7blmahcbiAgICAgICAgICBpZiAodGhpcy5qb2luUm9vbVRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLmpvaW5Sb29tVGltZXIuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4odXNlcklkcyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDkurrlkZjpgIDlh7pcbiAgICAgICAgICogQHBhcmFtIHVzZXJJZHNcbiAgICAgICAgICovXG4gICAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJMZWF2ZV0gbGlzdGVuaW5nIG9uVXNlckxlYXZlIHVzZXJJZHMgLT4gJHt1c2VySWRzPy5qb2luKCcsJyl9YCk7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJMZWF2ZSh1c2VySWRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmr4/mrKEgUGluZyDnu5PmnpxcbiAgICAgICAgICovXG4gICAgICAgIG9uUGluZzogKHJlc3VsdDogUkNSVENQaW5nUmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25QaW5nXSR7cmVzdWx0fWApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDpgJrnn6Xnu5nkuJrliqFcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblBpbmcgJiYgdGhpcy5fbGlzdGVuZXIhLm9uUGluZyhyZXN1bHQsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25QaW5nXSBsaXN0ZW5pbmcgb25QaW5nIGV4Y2VwdGlvbicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcigpIHtcbiAgICAvLyDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICB0aGlzLl9yb29tLnJlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDnlKjkuo7mjqXmlLbnirbmgIHmlbDmja7miqXlkYpcbiAgICAgICAqIEBwYXJhbSByZXBvcnRcbiAgICAgICAqL1xuICAgICAgb25TdGF0ZVJlcG9ydDogKHJlcG9ydDogSVJDUlRDU3RhdGVSZXBvcnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydCAmJiB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydChyZXBvcnQsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblN0YXRlUmVwb3J0XSBsaXN0ZW5lciBvblN0YXRlUmVwb3J0IGV4Y2VwdGlvbicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIH5JQ0Ug6L+e5o6l54q25oCB5Y+Y5pu06YCa55+lflxuICAgICAgICogQHNpbmNlIHZlcnNpb24gNS4xLjVcbiAgICAgICAqL1xuICAgICAgb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2U6IChzdGF0ZTogUlRDSWNlQ29ubmVjdGlvblN0YXRlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlICYmIHRoaXMuX2xpc3RlbmVyIS5vbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlXSBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSBleGNlcHRpb24nKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICDojrflj5bmiL/pl7TlvZPliY3kvJror50gSWTvvIzlvZPmiL/pl7TlhoXlt7Lml6DmiJDlkZjml7bmiL/pl7TkvJrlm57mlLbvvIzph43mlrDliqDlhaXml7Ygc2Vzc2lvbklkIOWwhuabtOaWsO+8jCjnlKjmiLflvZXliLbotYTmupDnlKjnmoQpXG4gICAqL1xuICBwdWJsaWMgZ2V0UlRDU2Vzc2lvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb29tID8gdGhpcy5fcm9vbS5nZXRTZXNzaW9uSWQoKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFyZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFRhcmdldElkKCk7XG4gIH1cblxuICAvKipcbiAgICogIOiOt+WPluS8muivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDb252ZXJzYXRpb25UeXBlKCk7XG4gIH1cblxuICAvKipcbiAgICogIOe7hOe7hyBJRFxuICAgKi9cbiAgcHVibGljIGdldENoYW5uZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2hhbm5lbElkKCk7XG4gIH1cblxuICAvKipcbiAgICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVtb3RlVXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gKi9cbiAgcHVibGljIGdldFVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFJlbW90ZVVzZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lq65ZGY54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICBpZiAoIXVzZXJJZCB8fCB0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VySWQgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRVc2VyU3RhdGUodXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZzZXNzaW9u54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogUkNDYWxsU2Vzc2lvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5Lya6K+d5Y+R6LW36ICFaWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpdtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRNZWRpYVR5cGUoKTogUkNDYWxsTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBSVENQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgSVJUQ0pvaW5lZEluZm8sIEVycm9yQ29kZSwgUlRDSm9pblR5cGUsIElMb2dnZXIsIEJhc2ljTG9nZ2VyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ0NhbGxFbmdpbmUsIFJDQ2FsbFN0YXRlTWFjaGluZSwgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsTWVkaWFUeXBlLCBJT2ZmbGluZVJlY29yZCxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ2xpZW50LCBSQ1JUQ0NvZGUsIFJDTG9jYWxUcmFjayB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQge1xuICBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBQcm9kdWNlVHlwZXMgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvbiB9IGZyb20gJy4vUkNDYWxsU2Vzc2lvbic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUxpc3RlbmVyLCB2YWxpZGF0ZVRhcmdldElkLCB2YWxpZGF0ZU1lZGlhVHlwZSwgdmFsaWRhdGVVc2VySWRzLCB2YWxpZGF0ZUV4dHJhLCB2YWxpZGF0ZVB1c2hUaXRsZSwgdmFsaWRhdGVQdXNoQ29udGVudCwgdmFsaWRhdGVQdXNoQ29uZmlnLFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxDbGllbnQge1xuICAvKipcbiAgICogcnRj5a6e5L6LXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydGNDbGllbnQ6IFJDUlRDQ2xpZW50XG5cbiAgLyoqXG4gICAqIGNhbGxFbmdpbmXlsYLlrp7kvotcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZVxuXG4gIC8qKlxuICAgKiDlhbblroPlj4LmlbBcbiAgICovXG4gIHByaXZhdGUgX29wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9uc1xuXG4gIC8qKlxuICAgKiBzZXNzaW9u5YiX6KGoXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uTGlzdDogUkNDYWxsU2Vzc2lvbltdID0gW11cblxuICBwcml2YXRlIF9jYWxsUHVzaENvbmZpZzogSVB1c2hDb25maWcgPSB7fVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hDb25maWc6IElQdXNoQ29uZmlnID17fVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBfb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLl9ydGNDbGllbnQgPSBfb3B0aW9ucy5ydGNDbGllbnQ7XG5cbiAgICB0aGlzLl9vcHRpb25zID0geyAvKipcbiAgICAgICAqIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivle+8jCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+V77yM6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktCwg6buY6K6k5YWz6ZetXG4gICAgICAgKi9cbiAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei++8jOm7mOiupCAgIFJUQ0pvaW5UeXBlLkNPRVhJU1QgPSAyIOS4pOS4quiuvuWkh+WFseWtmFxuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLktJQ0sgPSAwLOi4ouWJjeS4gOS4quiuvuWkh1xuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLlJFRlVTRSA9IDEs5b2T5YmN5Yqg5YWl5ouS57udXG4gICAgICAgKiAgICAgUlRDSm9pblR5cGUuQ09FWElTVCA9IDIg5Lik5Liq6K6+5aSH5YWx5a2YXG4gICAgICAgKi9cbiAgICAgIGpvaW5UeXBlOiBSVENKb2luVHlwZS5DT0VYSVNULFxuXG4gICAgICAvKipcbiAgICAgICAqIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIOivreiogOiuvue9riAo5o6o6YCBKSwg5LiN5Lyg6buY6K6k5Li65Lit5paHXG4gICAgICAgKi9cbiAgICAgIGxhbmc6IFJDQ2FsbExhbmd1YWdlLlpILFxuICAgICAgLi4uX29wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIOWIneWni+WMlmNhbGxFbmdpbmUsIOW5tuebkeWQrG9uSW52aXRlXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwge1xuXG4gICAgICAvKipcbiAgICAgICAqIOebkeWQrOaUtuWIsGludml0ZVxuICAgICAgICovXG4gICAgICBvbkludml0ZTogdGhpcy5fb25JbnZpdGUuYmluZCh0aGlzKSxcblxuICAgICAgLyoqXG4gICAgICAgKiDnm5HlkKznprvnur/mtojmga/miqXlkYpcbiAgICAgICAqL1xuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl9vbk9mZmxpbmVSZWNvcmQuYmluZCh0aGlzKSxcbiAgICB9LCB7XG5cbiAgICAgIC8qKlxuICAgICAgICog6K+t6KiA6K6+572uICjmjqjpgIEpLCDkuI3kvKDpu5jorqTkuLrkuK3mlodcbiAgICAgICAqL1xuICAgICAgbGFuZzogdGhpcy5fb3B0aW9ucy5sYW5nIHx8IFJDQ2FsbExhbmd1YWdlLlpILFxuXG4gICAgfSk7XG5cbiAgICBldmVudEVtaXR0ZXIub24oJ3Nlc3Npb25DbG9zZScsICh7IHNlc3Npb24sIHN1bW1hcnlJbmZvIH0pID0+IHtcbiAgICAgIC8vIOS7jnNlc3Npb25MaXN05Y675o6J6L+Z5Liq5YWz6Zet55qEc2Vzc2lvblxuICAgICAgdGhpcy5fcmVtb3ZlU2Vzc2lvbihzZXNzaW9uKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5vblNlc3Npb25DbG9zZShzZXNzaW9uLCBzdW1tYXJ5SW5mbyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ0NhbGxDbGllbnRdIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOaOpeWQrOS5i+WJjeaMguaWreWFtuWug+eahHNlc3Npb25cbiAgICBldmVudEVtaXR0ZXIub24oJ2h1bmd1cE90aGVyU2Vzc2lvbicsICh7IHNlc3Npb24gfSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBzZXNzaW9uLmdldFNlc3Npb25JZCgpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBodW5ndXBPdGhlclNlc3Npb25dIHNlc3Npb25JZCByZWFkeSB0byBhY2NlcHQgLT4gJHtpZH1gKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBzZXNzaW9uTGlzdCAtPiR7dGhpcy5fc2Vzc2lvbkxpc3QubWFwKChzZXMpID0+IHNlcy5nZXRTZXNzaW9uSWQoKSkuam9pbignLCcpfWApO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgd2hpbGUgKHRoaXMuX3Nlc3Npb25MaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8g5aaC5p6c5LiO6KaB5o6l5ZCs55qEc2Vzc2lvbuS4jeS4gOiHtFxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkxpc3RbaV0uZ2V0U2Vzc2lvbklkKCkgIT09IGlkKSB7XG4gICAgICAgICAgLy8g5oyC5patXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkxpc3RbaV0uaHVuZ3VwKCk7XG5cbiAgICAgICAgICAvLyDmjILmlq3lkI7liKDpmaRcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uTGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g5aaC5p6c5piv6KaB5o6l5ZCs55qEc2Vzc2lvbu+8jOi3s+i/h+i/meS4que0ouW8le+8jOaJgOS7peWKoDFcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBjdXJyZW50IHNlc3Npb25MaXN0IGxlbmd0aCAtPiR7dGhpcy5fc2Vzc2lvbkxpc3QubGVuZ3RofWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOebkeWQrG9uSW52aXRlXG4gICAqL1xuICBwcml2YXRlIF9vbkludml0ZShzdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSwgZXh0cmE/OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9vbkludml0ZV0gUmVjZWl2ZWQgaW52aXRlIG1lc3NhZ2UnKTtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuXG4gICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgIC8vIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivlVxuICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAvKipcbiAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICovXG4gICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAqL1xuICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgLy8g5qCH5piO5piv6KKr5Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRUUsXG5cbiAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICB9KTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9vbkludml0ZV0gUmVjZWl2ZWQgaW52aXRlIG1lc3NhZ2UsIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24nKTtcblxuICAgIC8qKlxuICAgICAqIOWmguaenOmAmuivneeahOaXtuWAmeS4jeWFgeiuuOaOpeWQrOaWsOeahOmAmuivne+8jOebtOaOpeaMguaWre+8jCDov5nkupvlt6XkvZzlnKhjYWxsRW5naW5l6YeM5a6M5oiQXG4gICAgICovXG4gICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDmiafooYznlKjmiLdBUEnnmoTnm5HlkKxcbiAgICAgIHRoaXMuX29wdGlvbnMub25TZXNzaW9uKHNlc3Npb24sIGV4dHJhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25TZXNzaW9uXSBvblNlc3Npb24gZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuXG4gICAgLy8g5b+F6aG75Zyob25TZXNzaW9u6YeM5rOo5YaMc2Vzc2lvbuebkeWQrOS6i+S7tu+8jOi/memHjOajgOa1i+S4gOS4i+acieayoeacieazqOWGjFxuICAgIGlmIChzZXNzaW9uLl9saXN0ZW5lcikge1xuICAgICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUxpc3RlbmVyKHNlc3Npb24uX2xpc3RlbmVyKTtcbiAgICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmNsdXNpb24ubXNnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25TZXNzaW9uXSBzZXNzaW9uIE11c3QgSGF2ZSBMaXN0ZW5lcicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUkNDYWxsU2Vzc2lvbiAgX29wdGlvbnMub25TZXNzaW9uXSBzZXNzaW9uIE11c3QgSGF2ZSBMaXN0ZW5lcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnm5HlkKznprvnur/mtojmga/miqXlkYpcbiAgICogQHBhcmFtIHJlY29yZFxuICAgKi9cbiAgcHVibGljIF9vbk9mZmxpbmVSZWNvcmQocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkge1xuICAgIHRyeSB7XG4gICAgICAvLyDmiafooYznlKjmiLdBUEnnmoTnm5HlkKxcbiAgICAgIHRoaXMuX29wdGlvbnMub25PZmZsaW5lUmVjb3JkICYmIHRoaXMuX29wdGlvbnMub25PZmZsaW5lUmVjb3JkKHJlY29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uT2ZmbGluZVJlY29yZF0gb25PZmZsaW5lUmVjb3JkIGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhoznlKjmiLfkv6Hmga/jgILms6jlhozlkI7vvIzlnKjlj5HotbfpgoDor7fmiJbmjILmlq3nrYnmk43kvZzml7bvvIzkvJrlsIbor6Xkv6Hmga/kuIDlubblj5HpgIHnu5nlr7nnq69cbiAgICogQHBhcmFtIGluZm8ubmFtZSAgICAgICAg55So5oi35ZCN56ewXG4gICAqIEBwYXJhbSBpbmZvLnBvcnRyYWl0VXJpIOeUqOaIt+WktOWDj+S/oeaBr1xuICAgKiBAcGFyYW0gaW5mby5leHRyYSAgICAgICDpooTnlZnmi5PlsZXlrZfmrrVcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclVzZXJJbmZvKGluZm86IHsgbmFtZT86IHN0cmluZzsgcG9ydHJhaXRVcmk/OiBzdHJpbmc7IGV4dHJhPzogc3RyaW5nOyB9ID0ge30pIHtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnJlZ2lzdGVyVXNlckluZm8oaW5mbyk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCByZWdpc3RlclVzZXJJbmZvXSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXIgdXNlciBpbmZvIGRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAqIOi3qEFwcOWNleWRvO+8jFxi5Y+R6YCBaW52aXRl5raI5oGv77yM5Zue6LCD5Zue5p2l5o6l5pS2c3RhdGVNYWNoaW5lLCDlu7pzZXNzaW9uXG4gICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDooqvlkbzlj6vkuIDmlrnnmoTnlKjmiLcgaWQg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyAg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5jb25zdHJhaW50cyDojrflj5bpn7PpopHmiJbpn7Pop4bpopHotYTmupDml7bnmoTlj4LmlbAg5Y+v6YCJXG4gICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICpcbiAgKi9cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q3Jvc3NDYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbGwoe1xuICAgICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LCBiaXRyYXRlLCBpc0Nyb3NzQXBwa2V5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvO+8jFxi5Y+R6YCBaW52aXRl5raI5oGv77yM5Zue6LCD5Zue5p2l5o6l5pS2c3RhdGVNYWNoaW5lLCDlu7pzZXNzaW9uXG4gICAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0SWQg6KKr5ZG85Y+r5LiA5pa555qE55So5oi3IGlkIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLm1lZGlhVHlwZSDpn7PpopHlkbzlj6sgb3Ig6Z+z6KeG6aKR5ZG85Y+rICDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX19jYWxsKHtcbiAgICAgIHRhcmdldElkLCBtZWRpYVR5cGUsIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgYml0cmF0ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19jYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSwgaXNDcm9zc0FwcGtleSA9IGZhbHNlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHsgcHVzaFRpdGxlOiBwdXNoVGl0bGVWYWx1ZSA9ICcnLCBwdXNoQ29udGVudDogcHVzaENvbnRlbnRWYWx1ZSA9ICcnIH0gPSAodGhpcy5fY2FsbFB1c2hDb25maWcucHVzaFRpdGxlIHx8IHRoaXMuX2NhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50KSA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBleHRyYS0+JHtleHRyYX0gcHVzaFRpdGxlLT4ke3B1c2hUaXRsZVZhbHVlfSBwdXNoQ29udGVudC0+JHtwdXNoQ29udGVudFZhbHVlfWApO1xuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0W10gPSBbdmFsaWRhdGVUYXJnZXRJZCh0YXJnZXRJZCksIHZhbGlkYXRlTWVkaWFUeXBlKG1lZGlhVHlwZSksIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKSwgdmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlVmFsdWUpLCB2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50VmFsdWUpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbF0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgbG9jYWxUcmFja3MgPSB0cmFja3MhO1xuXG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOiuvue9rueggeeOh1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpICYmIGJpdHJhdGU/LmF1ZGlvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8uYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpICYmIGJpdHJhdGU/LnZpZGVvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8udmlkZW8/Lm1heCwgYml0cmF0ZT8udmlkZW8/Lm1pbiwgYml0cmF0ZT8udmlkZW8/LnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgICAgbGlzdGVuZXIub25UcmFja1JlYWR5KHRyYWNrKTtcbiAgICB9KTtcblxuICAgIC8vIOiwg+eUqGNhbGxFbmdpbmXnmoRjYWxs6L+U5Zue5LiA5Liq54q25oCB5py655qE5a6e5L6LXG4gICAgY29uc3QgeyBjb2RlLCBzdGF0ZU1hY2hpbmUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FsbChjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoVGl0bGVWYWx1ZSwgcHVzaENvbnRlbnRWYWx1ZSwgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzdGF0ZSBtYWNoaW5lJyk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBsb2NhbFRyYWNrcyxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAgICovXG4gICAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAgIC8vIOagh+aYjuaYr+S4u+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRVIsXG5cbiAgICAgICAgaXNDcm9zc0FwcGtleSxcblxuICAgICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXNzaW9u5LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgICBzZXNzaW9uLnJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbiBvYmplY3QsIHNlc3Npb25JZDogJHtzZXNzaW9uLmdldFNlc3Npb25JZCgpfWApO1xuICAgICAgcmV0dXJuIHsgY29kZSwgc2Vzc2lvbiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBjYWxsIGZhaWxlZCBjb2RlIC0+OiAke2NvZGV9YCk7XG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2subXV0ZSgpO1xuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HotbfnvqTnu4Tlkbzlj6tcbiAgICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDnvqTnu4QgSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcklkcyDooqvlkbzlj6vnmoTnvqTlhoXmiJDlkZggSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBryDlj6/pgIlcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsSW5Hcm91cCh7XG4gICAgdGFyZ2V0SWQsIHVzZXJJZHMsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxJbkdyb3VwUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHsgcHVzaFRpdGxlOiBwdXNoVGl0bGVWYWx1ZSA9ICcnLCBwdXNoQ29udGVudDogcHVzaENvbnRlbnRWYWx1ZSA9ICcnIH0gPSAodGhpcy5fY2FsbFB1c2hDb25maWcucHVzaFRpdGxlIHx8IHRoaXMuX2NhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50KSA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVVc2VySWRzKHVzZXJJZHMpLCB2YWxpZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGUpLCB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSwgdmFsaWRhdGVFeHRyYShleHRyYSksIHZhbGlkYXRlUHVzaFRpdGxlKHB1c2hUaXRsZVZhbHVlKSwgdmFsaWRhdGVQdXNoQ29udGVudChwdXNoQ29udGVudFZhbHVlKV07XG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgbGV0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIGxvY2FsVHJhY2tzID0gdHJhY2tzITtcblxuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDorr7nva7noIHnjodcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSAmJiBiaXRyYXRlPy5hdWRpbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSAmJiBiaXRyYXRlPy52aWRlbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LnZpZGVvPy5tYXgsIGJpdHJhdGU/LnZpZGVvPy5taW4sIGJpdHJhdGU/LnZpZGVvPy5zdGFydCk7XG4gICAgICB9XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICAgIGxpc3RlbmVyLm9uVHJhY2tSZWFkeSh0cmFjayk7XG4gICAgfSk7XG5cbiAgICAvLyDlvoDnu4Tph4zlj5Hmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIHN0YXRlTWFjaGluZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5jYWxsSW5Hcm91cChjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsIGV4dHJhLCBwdXNoVGl0bGVWYWx1ZSwgcHVzaENvbnRlbnRWYWx1ZSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc3RhdGUgbWFjaGluZScpO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBSQ0NhbGxTZXNzaW9uKHN0YXRlTWFjaGluZSwgdGhpcy5fcnRjQ2xpZW50LCB0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgbG9jYWxUcmFja3MsXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K645Y+R5biD6YeN6K+VXG4gICAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSxcblxuICAgICAgICAvKipcbiAgICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0XG4gICAgICAgICAqL1xuICAgICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6LXG4gICAgICAgICAqL1xuICAgICAgICBqb2luVHlwZTogdGhpcy5fb3B0aW9ucy5qb2luVHlwZSxcblxuICAgICAgICAvLyDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgICAvLyDmoIfmmI7mmK/kuLvlj6vkuqfnlJ/nmoRzZXNzaW9uXG4gICAgICAgIHByb2R1Y2VUeXBlOiBQcm9kdWNlVHlwZXMuQ0FMTEVSLFxuXG4gICAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNlc3Npb27kuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICAgIHNlc3Npb24ucmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24gb2JqZWN0LCBzZXNzaW9uSWQ6ICR7c2Vzc2lvbi5nZXRTZXNzaW9uSWQoKX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGUsIHNlc3Npb24gfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gY2FsbEluR3JvdXAgZmFpbGVkIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDnpoHnlKjop4bpopFcbiAgICAgIHRyYWNrLm11dGUoKTtcblxuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6LCDUlRDIEFQSSDojrflvpfmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOajgOa1i+aYr+WQpuiDveWkn+iOt+W+l+acrOWcsOa1gVxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB7IC4uLmNvbnN0cmFpbnRzLmF1ZGlvIH0pO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gc3VjY2Vzc2Z1bGx5IGdldCBBdWRpbyBsb2NhbCB0cmFja3MnKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3M6IFt0cmFjayFdIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUFuZENhbWVyYVRyYWNrcygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgeyAuLi5jb25zdHJhaW50cyB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gZ2V0IEF1ZGlvIGFuZCBWaWRlbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBzdWNjZXNzZnVsbHkgZ2V0IGF1ZGlvIGFuZCB2aWRlbyBsb2NhbCB0cmFja3MnKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOWmguaenOaYr+WFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOW5tuS4lOaYr+iOt+W+l+mfs+inhumikVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTywgY29uc3RyYWludHMpO1xuXG4gICAgICAvLyDlpoLmnpzpn7Pop4bpopHkuI3og73ojrflvpfvvIzlsLHpmY3nu4Tojrflvpfpn7PpopFcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBjb25zdHJhaW50cyk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDku45zZXNzaW9uTGlzdOWIoOmZpOafkOS4qnNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZVNlc3Npb24oc2Vzc2lvbjogUkNDYWxsU2Vzc2lvbikge1xuICAgIGNvbnN0IGlkID0gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKTtcbiAgICB0aGlzLl9zZXNzaW9uTGlzdCA9IHRoaXMuX3Nlc3Npb25MaXN0LmZpbHRlcigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKSAhPT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW3seaWueWFtuS7luerr+WKoOWFpemAmuivne+8iOW3suWKoOWFpSBSVEMg5oi/6Ze077yJ55qE55So5oi35L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Sm9pbmVkUm9vbUluZm8oKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgZGF0YT86IElSVENKb2luZWRJbmZvW10gfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5nZXRSVENKb2luZWRVc2VySW5mbyh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKTtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBnZXRKb2luZWRVc2VySW5mbyBlcnJvciBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUVVFUllfSk9JTkVEX1VTRVJfSU5GT19FUlJPUiB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5ZG85Y+r44CB5oyC5pat5o6o6YCB5pWw5o2uXG4gICAqIEBwYXJhbSBjYWxsUHVzaENvbmZpZyDlkbzlj6vmjqjpgIHphY3nva5cbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnLnB1c2hUaXRsZSDlkbzlj6vmjqjpgIHmoIfpophcbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50IOWRvOWPq+aOqOmAgeWGheWuuVxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZyDmjILmlq3mjqjpgIHphY3nva5cbiAgICogQHBhcmFtIGh1bmd1cFB1c2hDb25maWcucHVzaFRpdGxlIOaMguaWreaOqOmAgeagh+mimFxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZy5wdXNoQ29udGVudCDmjILmlq3mjqjpgIHlhoXlrrlcbiAgICovXG4gIHB1YmxpYyBzZXRQdXNoQ29uZmlnKGNhbGxQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9IHt9LCBodW5ndXBQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgY29uY2x1c2lvbiA9IFtjYWxsUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZ10ubWFwKChwdXNoQ29uZmlnOiBJUHVzaENvbmZpZykgPT4gdmFsaWRhdGVQdXNoQ29uZmlnKHB1c2hDb25maWcpKVswXTtcblxuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwIGNhbGxQdXNoQ29uZmlnIG9yIGh1bmd1cFB1c2hDb25maWddICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbFB1c2hDb25maWcgPSBjYWxsUHVzaENvbmZpZztcbiAgICB0aGlzLl9odW5ndXBQdXNoQ29uZmlnID0gaHVuZ3VwUHVzaENvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSVBsdWdpbkdlbmVyYXRvciwgSVJ1bnRpbWUsIFJUQ1BsdWdpbkNvbnRleHQsIFZlcnNpb25NYW5hZ2UsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbEVycm9yQ29kZSwgUkNDYWxsTGFuZ3VhZ2UsIFJDQ2FsbEVuZFJlYXNvbiwgUkNDYWxsTWVkaWFUeXBlLCBSQ0NhbGxVc2VyU3RhdGUsIFJDQ2FsbFNlc3Npb25TdGF0ZSwgSUVuZFN1bW1hcnksIElJbnZpdGVkVXNlcnMsIElTZW5kZXJJbmZvLCBJT2ZmbGluZVJlY29yZCxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IElSQ1JUQ1N0YXRlUmVwb3J0IH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElSQ0NhbGxJbml0T3B0aW9ucywgSVJDQ2FsbFBhcmFtcywgSVJDQ2FsbEluR3JvdXBQYXJhbXMsIElTZXNzaW9uTGlzdGVuZXIsIElNdXRlVXNlciwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElEZXZpY2VDaGFuZ2VQYXJhbXMsIElWYWxpZGF0aW9uUmVzdWx0LCBJUHVzaENvbmZpZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IFJDQ2FsbENsaWVudCBmcm9tICcuL1JDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uIH0gZnJvbSAnLi9SQ0NhbGxTZXNzaW9uJztcbmltcG9ydCB7IHZhbGlkYXRlQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi92YWxpZGF0aW9uJztcblxuLy8gcGx1Z2luLWNhbGwg54mI5pys5LiK5oqlXG5WZXJzaW9uTWFuYWdlLmFkZCgncGx1Z2luLWNhbGwnLCBfX1ZFUlNJT05fXyk7XG5cbmNvbnN0IGluc3RhbGxlcjogSVBsdWdpbkdlbmVyYXRvcjxSQ0NhbGxDbGllbnQsIElSQ0NhbGxJbml0T3B0aW9ucz4gPSB7XG4gIHRhZzogJ1JDQ2FsbCcsXG4gIHZlcmlmeShydW50aW1lOiBJUnVudGltZSkge1xuICAgIHJldHVybiBydW50aW1lLnRhZyA9PT0gJ2Jyb3dzZXInO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogUkNDYWxsQ2xpZW50IHtcbiAgICAvLyDlhYjmoKHpqozlj4LmlbBcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlQ2FsbEluaXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbExpYiBpbnN0YWxsZXIgc3RldXBdJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG5cbiAgICAvLyDmoKHpqozlvZPliY3lronoo4XnmoQgZW5naW5lIOeJiOacrOaYr+WQpuWPr+eUqFxuICAgIGlmICghVmVyc2lvbk1hbmFnZS52YWxpZEVuZ2luZShfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX18pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbCByZXF1aXJlZCBlbmdpbmUgdmVyc2lvbiBhdCBsZWFzdCAnJHtfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX199Jy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignUkNDYWxsJywgJ1JUQycpO1xuICAgIG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwgJiYgbG9nZ2VyLnNldE91dHB1dExldmVsKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmxvZ0xldmVsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbG9nZ2VyLndhcm4oJ18nLCAnVGhlIFxcJ2xvZ0xldmVsXFwnIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIFxcJ2xvZ091dHB1dExldmVsXFwnIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsQ2xpZW50KGNvbnRleHQsIHJ1bnRpbWUsIGxvZ2dlciwgb3B0aW9ucyk7XG4gIH0sXG59O1xuXG5leHBvcnQge1xuICBpbnN0YWxsZXIsXG4gIFJDQ2FsbENsaWVudCxcbiAgUkNDYWxsU2Vzc2lvbixcbiAgUkNDYWxsTGFuZ3VhZ2UsXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbFVzZXJTdGF0ZSxcbiAgUkNDYWxsU2Vzc2lvblN0YXRlLFxufTtcblxuZXhwb3J0IHR5cGUge1xuICBJRW5kU3VtbWFyeSxcbiAgSVJDQ2FsbEluaXRPcHRpb25zLFxuICBJUkNDYWxsUGFyYW1zLFxuICBJUkNDYWxsSW5Hcm91cFBhcmFtcyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVNlbmRlckluZm8sXG4gIElNdXRlVXNlcixcbiAgSUludml0ZWRVc2VycyxcbiAgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsXG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElPZmZsaW5lUmVjb3JkLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgSVB1c2hDb25maWcsXG59O1xuIl0sIm5hbWVzIjpbInN0cmluZzEwdG82NCIsIm51bWJlciIsImNoYXJzIiwicmFkaXgiLCJxdXRpZW50IiwiYXJyIiwibW9kIiwiZ2V0VVVJRCIsImMiLCJyIiwiZ2V0VVVJRDIyIiwidXVpZCIsImdlbmVyYXRlUmFuZG9tSWQiLCJyYW5kb20iLCJ0aW1lclNldFRpbWVvdXQiLCJmdW5jIiwidGltZW91dCIsImV2ZW50RW1pdHRlciIsIkV2ZW50RW1pdHRlciIsImdldENhbGxEZXZpY2VJZCIsInJ1bnRpbWUiLCJrZXkiLCJNc2dDYWxsU3RhdHVzIiwiTXNnQ2FsbFN0YXR1czIiLCJSQ0NhbGxFcnJvckNvZGUiLCJSQ0NhbGxFbmRSZWFzb24iLCJDYWxsUmVtb3RlRW5kUmVhc29uIiwiUkNDYWxsTWVzc2FnZVR5cGUiLCJSQ0NhbGxTZXNzaW9uU3RhdGUiLCJSQ0NhbGxTZXNzaW9uU3RhdGUyIiwiUkNDYWxsVXNlclN0YXRlIiwiUkNDYWxsVXNlclN0YXRlMiIsIlJDQ3Jvc3NDYWxsVHlwZSIsIlRpbWVyJDEiLCJjYWxsYmFjayIsIl9fcHVibGljRmllbGQiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJSQ0NhbGxTdGF0ZU1hY2hpbmUiLCJfY29udGV4dCIsIl9ydW50aW1lIiwiX2xvZ2dlciIsIl9jYWxsTXNnSGFuZGxlciIsIl9jaGFubmVsSWQiLCJfY29udmVyc2F0aW9uVHlwZSIsIl90YXJnZXRJZCIsIl9tZWRpYVR5cGUiLCJfY2FsbElkIiwic2VudFRpbWUiLCJkZWxheVRpbWUiLCJ1c2VySWQiLCJzdGF0ZSIsInJlYXNvbiIsIl9hIiwidXNlciIsIm1lc3NhZ2UiLCJzZW5kZXJVc2VySWQiLCJ1c2VyUHJvZmlsZSIsImh1bmd1cFJlYXNvbiIsIm1lc3NhZ2VUeXBlIiwiZW5kUmVhc29uIiwicmVtb3RlVXNlcklkIiwibXNnRGV2aWNlSWQiLCJzdWlkIiwiZGV2aWNlSWQiLCJzZW5kZXJEZXZpY2VJZCIsImN1cnJlbnRVc2VySWQiLCJDb252ZXJzYXRpb25UeXBlIiwiaXNDdXJyZW50VXNlcklkIiwibWVkaWFUeXBlIiwiY29udGVudCIsImlzTGVzc1RoYW5Ud28iLCJpc0ludml0ZVVzZXIiLCJpc05vT25lQW5zd2VyZWQiLCJ3YXRjaGVycyIsImluaWRzIiwicm9vbVR5cGUiLCJ1c2VySWRMaXN0IiwiaWQiLCJpbnZpdGVVc2VySWRzIiwiVGltZXIiLCJleGlzdGVkVXNlclBvZmlsZXMiLCJjYWxsZXIiLCJuZWVkUmluZ2luZ1VzZXJJZHMiLCJ1c2VySW5mbyIsImNhbGxTdGF0dXMiLCJlcnJvciIsInVzZXJJZHMiLCJleHRyYSIsInB1c2hUaXRsZSIsInB1c2hDb250ZW50IiwiaXNDcm9zc0FwcGtleSIsImNvZGUiLCJpc0NhbGxlciIsImVuZENvZGUiLCJvcHRpb25zIiwiZXhpc3RlZFVzZXJJZHMiLCJoYW5ndXBQYXJhbXMiLCJtc2dDb2RlIiwicmVtb3RlVXNlcnMiLCJwdXNoQ29uZmlnIiwicmVtb3RlVXNlciIsInVpZCIsImJlZ2luVGltZXN0YW1wIiwiZW5kVGltZXN0YW1wIiwic3VtbWFyeSIsIlJDQ2FsbE1lZGlhVHlwZSIsIlJDQ2FsbE1lZGlhVHlwZTIiLCJNZW1iZXJNb2RpZnlUeXBlIiwiTWVtYmVyTW9kaWZ5VHlwZTIiLCJQbGF0Zm9ybSIsIk9mZmxpbmVSZWNvcmRlciIsIl9vblJlY29yZCIsImNoYW5uZWxJZCIsImNvbnZlcnNhdGlvblR5cGUiLCJ0YXJnZXRJZCIsImNhbGxJZCIsImlzU2VsZlNlbmQiLCJtZXNzYWdlcyIsIm1zZyIsImNhbGxNc2dUeXBlcyIsIkVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZSIsIkVycm9yQ29kZSIsIkNhbGxNZXNzYWdlSGFuZGxlciIsIl9vZmZsaW5lTXNnSXR2IiwiX2dldFN0YXRlTWFjaGluZSIsInJlY29yZCIsIm1hcmtUaW1lIiwiY3VycmVudE1zZ1NlbnRUaW1lIiwiaW5zZXJ0SW5kZXgiLCJpbmRleCIsImN1cnJlbnRUaW1lIiwiYnVmZmVycyIsIml0ZW0iLCJtZXNzYWdlVUlkIiwiaXNPZmZMaW5lTWVzc2FnZSIsIm9mZmxpbmVCdWZmZXJzIiwiaW52aXRlQ2FsbElkIiwiaXNJbnZpdGVNc2dUeXBlIiwiaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYiLCJ0YXNrTXNnTGlzdCIsImkiLCJvdGhlckNhbGxJZCIsImRlbEluZGV4IiwiZGVsT2ZmbGluZUluZGV4IiwiaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGwiLCJpc09ubHlJbnZpdGUiLCJoYXNJbnZpdGVBbmRSaW5naW5nIiwiaXNVbmZpbmlzaGVkR3JwQ2FsbCIsImlzVW5maW5pc2hlZCIsIm5vT25lQWNjZXB0IiwiYWxsVXNlcklkcyIsImlzQ2FsbGVySHVuZ3VwIiwidGFza01zZ1NlbmRlclVzZXJJZCIsImRlbENvdW50IiwibGlzdGVuZXIiLCJmdW5jTmFtZSIsImV2ZW50IiwiZXZlbnRUeXBlIiwiZGlyZWN0aW9uYWxVc2VySWRMaXN0IiwicHVzaERhdGEiLCJzZW5kT3B0cyIsInB1c2hDb25pZmciLCJjYWxsZXJJZCIsIlJDQ2FsbExhbmd1YWdlIiwiRU4iLCJaSCIsIkxvY2FsIiwibGFuZyIsIlJDQ2FsbEVuZ2luZSIsIl93YXRjaGVycyIsIl9vcHRpb25zIiwiY3J0VXNlcklkIiwiaW5mbyIsIlByb2R1Y2VUeXBlcyIsImZ1biIsIm9uIiwiZGF0YSIsImZ1bnMiLCJjYiIsImxlbmd0aCIsImlzTGFuZ3VhZ2UiLCJ2YWwiLCJpc0pvaW5UeXBlIiwiUlRDSm9pblR5cGUiLCJpc0xvZ0xldmVsIiwiTG9nTCIsInZhbGlkYXRlQ2FsbEluaXRPcHRpb25zIiwia2V5TmFtZXMiLCJrZXlzIiwibWlzc2luZ0tleXMiLCJ2YWxpZGF0ZUxpc3RlbmVyIiwidmFsaWRhdGVUYXJnZXRJZCIsInZhbGlkYXRlTWVkaWFUeXBlIiwidmFsaWRhdGVFeHRyYSIsInZhbGlkYXRlUHVzaFRpdGxlIiwidmFsaWRhdGVQdXNoQ29udGVudCIsInZhbGlkYXRlUHVzaENvbmZpZyIsImNvbmNsdXNpb24iLCJ2YWxpZGF0ZVVzZXJJZHMiLCJzdHIiLCJpc1JDRnJhbWVSYXRlIiwiaXNWYWxpZFJlc29sdXRpb24iLCJyZXNvbHV0aW9uIiwiUkNSZXNvbHV0aW9uIiwidmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJSQ0NhbGxTZXNzaW9uIiwiX3N0YXRlTWFjaGluZSIsIl9ydGNDbGllbnQiLCJyb29tSWQiLCJzdW1tYXJ5SW5mbyIsInNlbmRlciIsImludml0ZWRVc2VycyIsImNhbGxCYWNrIiwicm9vbSIsIlJDUlRDQ29kZSIsInRyYWNrcyIsImlzQWxsb3dTdWJzY3JpYmVSZXRyeSIsImNvdW50IiwiaXNBbGxvd1B1Ymxpc2hSZXRyeSIsInRyYWNrIiwiX2NvZGUiLCJhdWRpb0NvbnN0cmFpbnRzIiwicmVjZW50VHJhY2tzIiwibG9jYWxUcmFja3MiLCJfYiIsIm9iaiIsImxvY2FsVmlkZW9UcmFja3MiLCJsb2NhbEF1ZGlvdHJhY2tzIiwiYnlTZXJ2ZXIiLCJSQ0tpY2tSZWFzb24iLCJuYW1lIiwiYXVkaW9UcmFjayIsIm11dGVVc2VyIiwidmlkZW9UcmFjayIsInJlc3VsdCIsInJlcG9ydCIsIlJDQ2FsbENsaWVudCIsInNlc3Npb24iLCJzZXMiLCJzdGF0ZU1hY2hpbmUiLCJiaXRyYXRlIiwicHVzaFRpdGxlVmFsdWUiLCJwdXNoQ29udGVudFZhbHVlIiwiX2MiLCJjYWxsUHVzaENvbmZpZyIsImh1bmd1cFB1c2hDb25maWciLCJWZXJzaW9uTWFuYWdlIiwiaW5zdGFsbGVyIiwiY29udGV4dCIsImxvZ2dlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxNQUFNQSxLQUFlLENBQUNDLE1BQW1CO0FBQ2pDLFFBQUFDLElBQVEsbUVBQW1FLE1BQU0sRUFBRSxHQUNuRkMsSUFBUUQsRUFBTSxTQUFTO0FBQzdCLE1BQUlFLElBQVUsQ0FBQ0g7QUFDZixRQUFNSSxJQUFNLENBQUE7QUFDVCxLQUFBO0FBQ0QsVUFBTUMsSUFBTUYsSUFBVUQ7QUFDdEIs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
2597
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9lbmdpbmUvaGVscGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTXNnQ2FsbFN0YXR1cy50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbENvZGUudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24udHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL1RpbWVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvU3RhdGVNYWNoaW5lLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTWVtYmVyTW9kaWZ5VHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1BsYXRmb3JtLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvT2ZmbGluZVJlY29yZGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvTWVzc2FnZUhhbmRsZXIudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxMYW5nLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2VuLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL3poLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vZW5naW5lL2luZGV4LnRzIiwiLi4vLi4vLi4vc3JjL2VudW1zLnRzIiwiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vLi4vc3JjL2V2ZW50RW1pdHRlci50cyIsIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2hlbHBlci50cyIsIi4uLy4uLy4uL3NyYy90aW1lci50cyIsIi4uLy4uLy4uL3NyYy9SQ0NhbGxTZXNzaW9uLnRzIiwiLi4vLi4vLi4vc3JjL1JDQ2FsbENsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElSdW50aW1lIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcblxuLyoqXG4gKiDnlJ/miJDpmo/mnLogaWQg5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJhbmRvbUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICBsZXQgdXVpZCA9IGdldFVVSUQyMigpO1xuICB1dWlkID0gdXVpZC5yZXBsYWNlKC9cXC8vZywgJzAnKTtcbiAgY29uc3QgaW5mbyA9IFt1dWlkLCBEYXRlLm5vdygpLCByYW5kb21dO1xuICByZXR1cm4gaW5mby5qb2luKCdfJyk7XG59O1xuXG5leHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCB0aW1lckludGVydmFsID0gKGZ1bjogRnVuY3Rpb24sIGl0djogbnVtYmVyKTogbnVtYmVyID0+IHNldEludGVydmFsKGZ1biwgaXR2KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogY2FsbCBkZXZpY2VJZCDlrZjlgqjlnKggc2Vzc2lvblN0b3JhZ2Ug5LitXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDYWxsRGV2aWNlSWQgPSAocnVudGltZTogSVJ1bnRpbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gJ1JDQ2FsbERldmljZUlkJztcbiAgbGV0IHV1aWQgPSBydW50aW1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgaWYgKCF1dWlkKSB7XG4gICAgdXVpZCA9IGdldFVVSUQyMigpO1xuICAgIHJ1bnRpbWUuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHV1aWQpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsIi8qKlxuICog5rOo6YeKXG4gKiBUT0RPXG4gKi9cbmV4cG9ydCBlbnVtIE1zZ0NhbGxTdGF0dXMge1xuICBPVVRHT0lORyA9IDEsIC8vIHdhaXRpbmdcbiAgSU5DT01JTkcsIC8vIHdhaXRpbmdcbiAgUklOR0lORywgLy8gd2FpdGluZ1xuICBDT05ORUNURUQsIC8vIGtlZXBpbmdcbiAgSURMRSwgLy8gZW5kXG4gIEFDQ0VQVEVEIC8vIHdhaXRpbmdcbn1cbiIsIi8qKlxuICog6ZSZ6K+v56CB77yM5LiO56e75Yqo56uv5a+56b2QXG4gKiBAZGVzY3JpcHRpb25cbiAqIDEuIGA1MTAwMCAtIDUxOTk5YCDkuLogQW5kcm9pZCDkuJPnlKjmrrVcbiAqIDIuIGA1MjAwMCAtIDUyOTk5YCDkuLogaU9TIOS4k+eUqOautVxuICogMy4gYDUzMDAwIC0gNTMxOTlgIOS4uiBXZWIgUlRDIOS4k+eUqOautVxuICogNC4gYDUzMjAwIC0gNTM0OTlgIOS4uiBXZWIgQ2FsbExpYiDkuJPnlKjmrrVcbiAqICogIGA1MzIwMCAtIDUzMjk5YCDkuLogV2ViIENhbGxFbmdpbmUg5LiT55So56uvXG4gKiAqICBgNTMzMDAgLSA1MzQ5OWAg5Li6IFdlYiBDYWxsIOS4k+eUqOerr1xuICogNS4gYDUzNTAwIC0gNTM5OTlgIOS4uiBXZWIg5L+d55WZ5q61XG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbEVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1MgPSAxMDAwMCxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahOeKtuaAgeaculxuICAgKi9cbiAgU1RBVEVfTUFDSElORV9FWElUID0gNTMyMDAsXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGv5aSx6LSlXG4gICAqL1xuICBTRU5EX01TR19FUlJPUiA9IDUzMjAxLFxuICAvKipcbiAgICog6KKr5a+55pa55Yqg5YWl6buR5ZCN5Y2VXG4gICAqL1xuICBSRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPSA1MzIwMixcbiAgLyoqXG4gICAqIOW9k+WJjeeUqOaIt+S4jeWGjee+pOe7hOS4rVxuICAgKi9cbiAgTk9UX0lOX0dST1VQID0gNTMyMDMsXG5cbiAgLyoqXG4gICAqIENhbGwg55u45YWzXG4gICAqL1xuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgPSA1MzMwMSxcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgPSA1MzMwMixcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDMsXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUk9SID0gNTMzMDQsXG5cbiAgLyoqXG4gICAqIOWPkeW4g+mfs+mikeWksei0pVxuICAgKi9cbiAgQVVESU9fUFVCTElTSF9FUlJPUiA9IDUzMzA1LFxuXG4gIC8qKlxuICAgKiDlj5HluIPop4bpopHlpLHotKVcbiAgICovXG4gIFZJREVPX1BVQkxJU0hfRVJST1IgPSA1MzMwNixcblxuICAvKipcbiAgICog5Y+R5biD6Z+z6KeG6aKR5aSx6LSlXG4gICAqL1xuICBBVURJT19BTkRfVklERU9fUFVCTElTSF9FUlJPUiA9IDUzMzA3LFxuXG4gIC8qKlxuICAgKiDmn6Xor6LmiL/pl7TnlKjmiLfkv6Hmga/lpLHotKVcbiAgICovXG4gIFFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgPSA1MzMwOCxcblxuICAvKipcbiAgICog56aB55So5ZCv55So6KeG6aKR5pe277yM5oi/6Ze05YaF57y65bCR6KeG6aKR5rWBXG4gICAqL1xuICBNSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDksXG5cbiAgLyoqXG4gICAqIOWPlua2iOWPkeW4g+inhumikeWksei0pVxuICAgKi9cbiAgVU5QVUJMSVNIX1ZJREVPX0VSUk9SID0gNTMzMTAsXG5cbiAgLyoqXG4gICAqIOS8muivneS4jeaYr+e+pOe7hFxuICAgKi9cbiAgQ09OVkVSU0FUSU9OX05PVF9HUk9VUF9FUlJPUiA9IDUzMzExLFxuXG4gIC8qKlxuICAqIOS4jeWcqHJvb23kuK3npoHnlKjpn7Pop4bpopFcbiAgKi9cbiAgTk9UX0lOX1JPT01fRVJST1IgPSA1MzMxMixcblxuICAvKipcbiAgICog5Y+C5pWw6ZSZ6K+vXG4gICAqL1xuICBQQVJBTV9FUlJPUiA9IDUzMzEzXG59XG4iLCIvKipcbiAqIOaMguaWreWOn+WboFxuICogQGRlc2NyaXB0aW9uXG4gKiDmoLnmja7ljp/mnIkgSGFuZ3VwUmVhc29uIOiuvuiuoe+8jOW3seaWueWOn+WboOS4juWvueaWueWOn+WboOacieebuOW3riAxMCDnmoTlt67ot50uXG4gKiDnjrDmnInmnKzlnLDljp/lm6Dlj5blgLzojIPlm7Q6IDEgfiAxMCwg6L+c56uv5Y6f5Zug5Y+W5YC86IyD5Zu0OiAxMSB+IDIwLlxuICog5Li65L6/5LqOIEhhbmd1cFJlYXNvbiDmianlsZXvvIzkv53nlZkgMTAwIOS7peWGheeahOWPluWAvC5cbiAqIOmcgOimgeWGjeasoeaJqeWxleaXtu+8jOW3seaWueWOn+WboOS9v+eUqDogMjEgfiAzMCwg5a+55bqU5a+55pa55Y6f5Zug5L2/55SoOiAzMSB+IDQwLFxuICog5Lul5q2k57G75o6o77yMXG4gKiDlt7Hmlrnljp/lm6Dkvb/nlKg6IDQxIH4gNTAsIOWvueaWueWOn+WboOS9v+eUqDogNTEgfiA2MCxcbiAqIOW3seaWueWOn+WboOS9v+eUqDogNjEgfiA3MCwg5a+55pa55Y6f5Zug5L2/55SoOiA3MSB+IDgwLFxuICog5bex5pa55Y6f5Zug5L2/55SoOiA3MSB+IDkwLCDlr7nmlrnljp/lm6Dkvb/nlKg6IDkxIH4gMTAwLlxuICpcbiAqIOWQhOW5s+WPsOeLrOacieWtl+auteiMg+WbtFxuICogQW5kcm9pZCAyMDEgfiAyOTlcbiAqIGlPUyAgICAgMzAxIH4gMzk5XG4gKiBXZWIgICAgIDQwMSB+IDQ5OVxuICog6K+m57uG5paH5qGj77yaaHR0cHM6Ly9naXRib29rLnJvbmdjbG91ZC5uZXQvcnRjLWRvY3MvIy9ydGMtY2xpZW50L2lvcy9hbmFseXNpcy9jYWxsbGliL0hhbmd1cFJlYXNvblxuICovXG5leHBvcnQgZW51bSBSQ0NhbGxFbmRSZWFzb24ge1xuICAvKipcbiAgICog5bex5pa55Y+W5raI5bey5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBDQU5DRUwgPSAxLFxuICAvKipcbiAgICog5bex5pa55ouS57ud5pS25Yiw55qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRUpFQ1QgPSAyLFxuICAvKipcbiAgICog5bex5pa55oyC5patXG4gICAqL1xuICBIQU5HVVAgPSAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KMXG4gICAqL1xuICBCVVNZX0xJTkUgPSA0LFxuICAvKipcbiAgICog5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBOT19SRVNQT05TRSA9IDUsXG4gIC8qKlxuICAgKiDlt7HmlrnkuI3mlK/mjIHlvZPliY3pn7Pop4bpopHlvJXmk45cbiAgICovXG4gIEVOR0lORV9VTlNVUFBPUlRFRCA9IDYsXG4gIC8qKlxuICAgKiDlt7HmlrnnvZHnu5zplJnor69cbiAgICovXG4gIE5FVFdPUktfRVJST1IgPSA3LFxuICAvKipcbiAgICog5bex5pa55pGE5YOP5aS06LWE5rqQ6I635Y+W5aSx6LSl77yM5Y+v6IO95piv5p2D6ZmQ5Y6f5ZugXG4gICAqL1xuICBHRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SID0gOCxcbiAgLyoqXG4gICAqIOW3seaWuei1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUFVCTElTSF9FUlJPUiA9IDksXG4gIC8qKlxuICAgKiDlt7HmlrnorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlJPUiA9IDEwLFxuICAvKipcbiAgICog5a+55pa55Y+W5raI5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRU1PVEVfQ0FOQ0VMID0gMTEsXG4gIC8qKlxuICAgKiDlr7nmlrnmi5Lnu53mlLbliLDnmoTpgJror53or7fmsYJcbiAgICovXG4gIFJFTU9URV9SRUpFQ1QgPSAxMixcbiAgLyoqXG4gICAqIOmAmuivnei/h+eoi+S4reWvueaWueaMguaWrVxuICAgKi9cbiAgUkVNT1RFX0hBTkdVUCA9IDEzLFxuICAvKipcbiAgICog5a+55pa55b+Z56KMXG4gICAqL1xuICBSRU1PVEVfQlVTWV9MSU5FID0gMTQsXG4gIC8qKlxuICAgKiDlr7nmlrnmnKrmjqXlkKxcbiAgICovXG4gIFJFTU9URV9OT19SRVNQT05TRSA9IDE1LFxuICAvKipcbiAgICog5a+55pa55byV5pOO5LiN5pSv5oyBXG4gICAqL1xuICBSRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVEID0gMTYsXG4gIC8qKlxuICAgKiDlr7nmlrnnvZHnu5zplJnor69cbiAgICovXG4gIFJFTU9URV9ORVRXT1JLX0VSUk9SID0gMTcsXG4gIC8qKlxuICAgKiDlr7nmlrnmkYTlg4/lpLTotYTmupDojrflj5blpLHotKXvvIzlj6/og73mmK/mnYPpmZDljp/lm6BcbiAgICovXG4gIFJFTU9URV9HRVRfTUVESUFfUkVTT1VSQ0VfRVJST1IgPSAxOCxcbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxOSxcbiAgLyoqXG4gICAqIOi/nOerr+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDIwLFxuICAvKipcbiAgICog5bex5pa55YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwgPSAyMSxcbiAgLyoqXG4gICAqIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX0NBTEwgPSAyMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDIzLFxuICAvKipcbiAgICog5bex5pa55o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIEFDQ0VQVF9TWVNURU1fQ0FMTCA9IDI0LFxuICAvKipcbiAgICog6L+c56uv5YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMID0gMzEsXG4gIC8qKlxuICAgKiDov5znq6/lhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfSU5fQ0FMTCA9IDMyLFxuICAvKipcbiAgICog6L+c56uv6KKr56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDMzLFxuICAvKipcbiAgICog6L+c56uv5o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIFJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwgPSAzNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aOpeWQrFxuICAgKi9cbiAgQUNDRVBUX0JZX09USEVSX0NMSUVOVCA9IDEwMSxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aMguaWrVxuICAgKi9cbiAgSEFOR1VQX0JZX09USEVSX0NMSUVOVCA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+WvueaWueWKoOWFpem7keWQjeWNlVxuICAgKi9cbiAgQURERURfVE9fQkxBQ0tMSVNUID0gMTAzLFxuICAvKipcbiAgICog6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAqL1xuICBTRVJWSUNFX05PVF9PUEVORUQgPSAxMDRcbn1cblxuLyoqXG4gKiDlt7Hmlrnljp/lm6DovazkuLrlr7nmlrnljp/lm6BcbiAqL1xuZXhwb3J0IGNvbnN0IENhbGxSZW1vdGVFbmRSZWFzb246IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRW5kUmVhc29uIH0gPSB7XG4gIFtSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVKRUNUXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9SRUpFQ1QsXG4gIFtSQ0NhbGxFbmRSZWFzb24uSEFOR1VQXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gIFtSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9CVVNZX0xJTkUsXG4gIFtSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0VdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkVOR0lORV9VTlNVUFBPUlRFRF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVELFxuICBbUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUl06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfR0VUX01FRElBX1JFU09VUkNFX0VSUk9SLFxuICBbUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX1BVQkxJU0hfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9TVUJTQ1JJQkVfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTExdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9JTl9DQUxMLFxuICBbUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVJdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFXTogUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbE1lc3NhZ2VUeXBlIHtcbiAgLyoqXG4gICAqIOmCgOivt+a2iOaBr1xuICAgKi9cbiAgVkNJbnZpdGUgPSAnUkM6VkNJbnZpdGUnLFxuICAvKipcbiAgICog5ZON6ZOD5raI5oGvXG4gICAqL1xuICBWQ1JpbmdpbmcgPSAnUkM6VkNSaW5naW5nJyxcbiAgLyoqXG4gICAqIOaOpeWQrOa2iOaBr1xuICAgKi9cbiAgVkNBY2NlcHQgPSAnUkM6VkNBY2NlcHQnLFxuICAvKipcbiAgICog5oyC5pat5raI5oGvXG4gICAqL1xuICBWQ0hhbmd1cCA9ICdSQzpWQ0hhbmd1cCcsXG4gIC8qKlxuICAgKiDnvqTlkbzkuK0g5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBWQ01vZGlmeU1lbSA9ICdSQzpWQ01vZGlmeU1lbScsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovkv67mlLnmtojmga9cbiAgICovXG4gIFZDTW9kaWZ5TWVkaWEgPSAnUkM6VkNNb2RpZnlNZWRpYScsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAvKipcbiAgICog562J5b6F5bu656uL6L+e5o6lXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog5Lya6K+d57u05oyB5LitXG4gICAqL1xuICBLRUVQSU5HLFxuICAvKipcbiAgICog5Lya6K+d5bey57uT5p2fXG4gICAqL1xuICBFTkRcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiDnlKjmiLfkuI3lrZjlnKjkuo7pgJror53kuK1cbiAgICovXG4gIE5PTkUgPSAwLFxuICAvKipcbiAgICog562J5b6F5o6l5ZCsXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBLRUVQSU5HLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDcm9zc0NhbGxUeXBlIHtcbiAgLyohXG4gIOWQjEFwcOmAmuivnVxuICAqL1xuICBSQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwgPSAwLFxuICAvKiFcbiAg6LeoQXBw6YCa6K+dXG4gICovXG4gIFJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA9IDdcbn1cbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgTXNnQ2FsbFN0YXR1cyB9IGZyb20gJy4vZW51bXMvTXNnQ2FsbFN0YXR1cyc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7XG4gIElFeGlzdGVkVXNlclBvZmlsZXMsIElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsIElSaW5naW5nTXNnQ29udGVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVVzZXJEYXRhLCBJVXNlclByb2ZpbGUsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi9UaW1lcic7XG5pbXBvcnQgeyBJUHVzaENvbmZpZyB9IGZyb20gJy4uLy4uL3NyYy9pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsU3RhdGVNYWNoaW5lIHtcbiAgLyoqXG4gICAqIOaIv+mXtOeKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBfc2Vzc2lvblN0YXRlOiBSQ0NhbGxTZXNzaW9uU3RhdGUgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDnlKjmiLfnirbmgIHlj4rkv6Hmga9cbiAgICovXG4gIHByaXZhdGUgX3VzZXJJbmZvOiB7IFt1c2VySWQ6IHN0cmluZ106IElVc2VyRGF0YSB9ID0ge31cblxuICAvKipcbiAgICog55So5oi36K6h5pe25Zmo5pig5bCEXG4gICAqL1xuICBwcml2YXRlIF91c2VyVGltZXJzOiB7IFt1c2VySWQ6IHN0cmluZ106IFRpbWVyIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDnm5HlkKzlmahcbiAgICovXG4gIHByaXZhdGUgX3dhdGNoZXJzITogSUNhbGxTdGF0ZU1hY2hpbmVXYXRjaGVyc1xuXG4gIC8qKlxuICAgKiDlkbzlj6votoXml7bml7bpl7QgKOWNleS9je+8muavq+enkilcbiAgICovXG4gIHByaXZhdGUgX2NhbGxUaW1lb3V0OiBudW1iZXIgPSA2MCAqIDEwMDBcblxuICAvKipcbiAgICog6YCa6K+d5bu656uL5byA5aeL5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIF9iZWdpblRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ/ml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX2VuZFRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ/ljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX2VuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5Li75Y+rIElEXG4gICAqIOWPkei1t+mCgOivt+S4uuW9k+WJjeeUqOaItyBJRFxuICAgKiDmlLbliLDpgoDor7fkuLogc2VuZGVyVXNlcklkXG4gICAqIOaUtuWIsOS6uuWRmOWPmOabtOmCgOivt+S4uua2iOaBr+S9k+S4rSBjYWxsZXJJZFxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOW9k+asoemAmuivnemCgOivt+iAhSBJRFxuICAgKiDlj5HotbfpgoDor7fkuLrlvZPliY3nlKjmiLcgSUTjgIHmlLbliLDpgoDor7fkuLogc2VuZGVyVXNlcklk44CB5pS25Yiw5Lq65ZGY5Y+Y5pu06YKA6K+35Li65raI5oGv5L2T5LitIHNlbmRlclVzZXJJZFxuICAgKi9cbiAgcHJpdmF0ZSBfaW52aXRlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDmmK/lkKbmmK/ot6ggYXBwa2V5XG4gICAqL1xuICBwcml2YXRlIF9pc0Nyb3NzQXBwa2V5OiBib29sZWFuID0gZmFsc2VcblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29uZmlnPzogSVB1c2hDb25maWdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsTXNnSGFuZGxlcjogQ2FsbE1lc3NhZ2VIYW5kbGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5uZWxJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvblJpbmdpbmcnLCB0aGlzLl9vblJpbmdpbmcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkFjY2VwdCcsIHRoaXMuX29uQWNjZXB0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkLCAnb25NZWRpYU1vZGlmeScsIHRoaXMuX29uTWVkaWFNb2RpZnkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkh1bmd1cCcsIHRoaXMuX29uSHVuZ3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluagoeato+WQjui2heaXtuaXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VGltZW91dChzZW50VGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICBpZiAoZGVsYXlUaW1lIDwgMCkge1xuICAgICAgZGVsYXlUaW1lID0gNTAwOyAvLyDlgYforr7lu7bov5/ml7bpl7TkuLogNTAwIG1zXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9jYWxsVGltZW91dCAtIGRlbGF5VGltZTtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBfZ2V0VGltZW91dCAtPiB0aW1lb3V0OiAke3RpbWVvdXR9YCk7XG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVyQnlJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBiZWZvcmUgX2NsZWFyVGltZXJCeUlkICAtPiB1c2VySWQ6ICR7dXNlcklkfSB1c2VyVGltZXJzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3VzZXJUaW1lcnMpfWApO1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXS5zdG9wKCk7XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdO1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWZ0ZXIgX2NsZWFyVGltZXJCeUlkIC0+IHVzZXJUaW1lcnM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fdXNlclRpbWVycyl9YCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlTdGF0ZUNoYW5nZShzdGF0ZTogUkNDYWxsU2Vzc2lvblN0YXRlLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlTdGF0ZUNoYW5nZSAtPiBpbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIHN0YXRlLCByZWFzb24sXG4gICAgfSl9YCk7XG5cbiAgICB0aGlzLl9lbmRSZWFzb24gPSByZWFzb24gfHwgbnVsbDtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl93YXRjaGVycz8ub25TdGF0ZUNoYW5nZSh7IHN0YXRlLCByZWFzb24gfSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgLy8g5b2T54q25oCB5py657uT5p2f5pe277yM6ZyA5ZyoIENhbGxFbmdpbmUg5riF6ZmkXG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnb25TdGF0ZU1hY2hpbmVDbG9zZScsIHRoaXMuX2NhbGxJZCk7XG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci51bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlcjogSVVzZXJEYXRhLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlVc2VyU3RhdGVDaGFuZ2UgLT4gaW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VyLCByZWFzb24sXG4gICAgfSl9YCk7XG4gICAgdGhpcy5fd2F0Y2hlcnM/Lm9uVXNlclN0YXRlQ2hhbmdlKHsgdXNlciwgcmVhc29uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3RoZXJDbGllbnRIYW5kbGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCByZWFzb246IGh1bmd1cFJlYXNvbiB9LCBtZXNzYWdlVHlwZSB9ID0gbWVzc2FnZTtcbiAgICB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdID0ge1xuICAgICAgdXNlcklkOiBzZW5kZXJVc2VySWQsXG4gICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICBpc1JlbW90ZTogZmFsc2UsXG4gICAgfTtcbiAgICAvLyDlpJrnq6/mjqXlkKzjgIHlpJrnq6/mi5Lnu53vvIzmuIXpmaTmlLbliLDpgoDor7flkI7otbfnmoTorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICAvLyDlhbbku5bnq6/mjqXlkKxcbiAgICBsZXQgZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9CWV9PVEhFUl9DTElFTlQ7XG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSkge1xuICAgICAgICBlbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEw7XG4gICAgICB9IGVsc2UgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFKSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5OT19SRVNQT05TRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVBfQllfT1RIRVJfQ0xJRU5UO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDmt7vliqDnlKjmiLfnroDopoHkv6Hmga9cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBlbmRSZWFzb24pO1xuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5Lit77yM5LiU5LiN5piv5b2T5YmN5bey5o6l6YCa55So5oi36K6+5aSH77yIZGV2aWNlSWTvvInlj5HmnaXnmoTmtojmga9cbiAgKi9cbiAgcHJpdmF0ZSBfaXNSZW1vdGVJbnZhbGlkTXNnKHJlbW90ZVVzZXJJZDogc3RyaW5nLCBtc2dEZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdLmRldmljZUlkIHx8ICFtc2dEZXZpY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcgJiYgdGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5kZXZpY2VJZCAhPT0gbXNnRGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vblJpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiBzdWlkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCB9IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBvblJpbmdpbmcgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICByZXR1cm47IC8vIOWkmuerr+WkhOeQhlxuICAgIH1cbiAgICB0aGlzLl93YXRjaGVycy5vblJpbmdpbmcoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudDogeyB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQ6IHNlbmRlckRldmljZUlkIH0sIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBzZW5kZXJEZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25BY2NlcHQgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHRoaXMuX290aGVyQ2xpZW50SGFuZGxlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOe+pOe7hOmAmuivneaXtu+8miBB44CBQiDpgJror50gQemCgOivt0MsIEPlkIzmhI/mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahOiuoeaXtuWZqO+8jOaJgOS7pei/memHjOWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoc2VuZGVyVXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBjb25zdCBpZHMgPSAodGhpcy5fY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSA/IFtjdXJyZW50VXNlcklkLCBzZW5kZXJVc2VySWRdIDogW3NlbmRlclVzZXJJZF07XG4gICAgaWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgaXNDdXJyZW50VXNlcklkID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLktFRVBJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGRldmljZUlkOiBpc0N1cnJlbnRVc2VySWQgPyBnZXRDYWxsRGV2aWNlSWQodGhpcy5fcnVudGltZSkgOiBzZW5kZXJEZXZpY2VJZCxcbiAgICAgIH07XG4gICAgICBpZiAoIWlzQ3VycmVudFVzZXJJZCkge1xuICAgICAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldENhbGxlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICB9XG4gICAgLy8g5oqb5Ye6b25BY2NlcHTml7bnirbmgIHlt7Lnu4/lsLHnu6pcbiAgICB0aGlzLl93YXRjaGVycy5vbkFjY2VwdCh7IHVzZXJJZDogc2VuZGVyVXNlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgbWVkaWFUeXBlLCB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICBpZiAodGhpcy5faXNSZW1vdGVJbnZhbGlkTXNnKHNlbmRlclVzZXJJZCwgZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gX29uTWVkaWFNb2RpZnkgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOabtOaWsCBtZWRpYVR5cGVcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fd2F0Y2hlcnMub25NZWRpYU1vZGlmeSh7XG4gICAgICBzZW5kZXI6IHsgdXNlcklkOiBzZW5kZXJVc2VySWQsIC4uLjxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCBzZW5kZXJVc2VySWQgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gc3VpZC5zcGxpdCgnXycpWzFdIDogc3VpZDtcbiAgICBjb25zdCB7IHJlYXNvbiwgdXNlcjogdXNlclByb2ZpbGUsIGRldmljZUlkIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25IdW5ndXAgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhiDmipvlh7rlpJrnq6/lt7LlpITnkIYgcmVhc29uXG4gICAgICB0aGlzLl9vdGhlckNsaWVudEhhbmRsZShtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAvLyDlpoLmnpzlt7HmlrnmiL/pl7TnirbmgIHlt7Lnu5PmnZ/vvIzlho3mlLbliLAgaHVuZ3VwIOa2iOaBr+S4jeWGjeWkhOeQhlxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gSW52YWxpZCBoYW5nIHVwIG1lc3NhZ2UsIGN1cnJlbnQgcm9vbSBzdGF0dXMgaGFzIGVuZGVkIC0+IHNlc3Npb25TdGF0ZTogJHt0aGlzLl9zZXNzaW9uU3RhdGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOS/ruaUueWGheWtmOaAgeaVsOaNruW5tumAmuefpVxuICAgICAgdGhpcy5fdXNlckluZm9bc2VuZGVyVXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCA8SVVzZXJQcm9maWxlPnVzZXJQcm9maWxlKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF07XG4gICAgfVxuXG4gICAgLy8gdGltZXIg5riF6ZmkXG4gICAgaWYgKENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXSA9PT0gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwpIHtcbiAgICAgIC8vIOi/nOerr+WPlua2iOmAmuivne+8jOayoeaciei/nOerr+eUqOaIt++8jOa4hemZpOW3seerr+eahOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoIDwgMSAmJiB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SW52aXRlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIC8vIOi/nOerr+aLkue7neOAgeW/meeijOOAgeacquaOpeWQrOetie+8jOmAmui/h+iHquW3seaYr+WQpuaYr+S4u+WPq+adpeWIpOaWreimgea4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqCDmiJYg5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChzZW5kZXJVc2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPCAxICYmIHRoaXMuX2NsZWFyVGltZXJCeUlkKGN1cnJlbnRVc2VySWQpO1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgIGNvbnN0IGlzTGVzc1RoYW5Ud28gPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMjtcbiAgICAvLyDnvqTlkbzkuK3pgoDor7fogIXmjILmlq3vvIjpnZ7lkbzlj6vlj5HotbfogIXvvInkuJTmiL/pl7TkuK3ooqvpgoDor7fogIXpg73mnKrmjqXlkKzvvIzpgJrnn6XmiL/pl7TnirbmgIHnu5PmnZ9cbiAgICBjb25zdCBpc0ludml0ZVVzZXIgPSB0aGlzLl9pbnZpdGVySWQgPT09IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCBpc05vT25lQW5zd2VyZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3VzZXJJbmZvKS5ldmVyeSgodXNlcikgPT4gdXNlci5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgIGlmIChpc0xlc3NUaGFuVHdvIHx8IChpc0ludml0ZVVzZXIgJiYgaXNOb09uZUFuc3dlcmVkKSkge1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7ogb25IdW5ndXAg5pe254q25oCB5bey57uP5bCx57uqXG4gICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9LCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tuebkeWQrFxuICAgKiBAcGFyYW1zIHdhdGNoZXJzXG4gICAqL1xuICByZWdpc3RlckV2ZW50TGlzdGVuZXIod2F0Y2hlcnM6IElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMpIHtcbiAgICB0aGlzLl93YXRjaGVycyA9IHdhdGNoZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBpbnZpdGUg5raI5oGv5pe254q25oCB5py65pu05paw77yIQ2FsbEVuZ2luZSDlhoXpg6josIPnlKjvvIlcbiAgICogQHBhcmFtIG1lc3NhZ2Ug5o6l5pS25raI5oGvXG4gICAqL1xuICBfX29uSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCwgc2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlVXNlcklkczogaW5pZHMsIHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCwgcm9vbVR5cGUsXG4gICAgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgLy8g5aSE55CG6LeoIGFwcGtleSDpgoDor7cgc2VuZGVyVXNlcklkIOW4puaciSBhcHBrZXkg5LiO5pys5ZywIGN1cnJlbnRVc2VySWQg5Yy56YWN6Zeu6aKYXG4gICAgLy8g5ZCM5pe26K6w5b2V5pys5Zyw5piv5ZCm5Li66LeoIGFwcGtleSDnirbmgIFcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlID09PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuY3Jvc3NBcHBrZXkodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZGVyVXNlcklkID0gc3VpZDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5q2j5Zyo6YCa6K+d5Lit77yM6L+c56uv5aSa56uv5Y+R55qE5raI5oGv55u05o6l6L+H5rukXG4gICAgaWYgKHRoaXMuX2lzUmVtb3RlSW52YWxpZE1zZyhzZW5kZXJVc2VySWQsIGRldmljZUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIF9fb25JbnZpdGUgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCB1c2VySWRMaXN0ID0gW3N1aWQsIC4uLmluaWRzXTtcbiAgICAvLyDmlLbliLDpgoDor7flkI7vvIzlhoXpg6jlm57lupTlk43pk4Pmtojmga8sIHVzZXJJZHMg5Lyg6Zmk6Ieq5bex55qE5omA5pyJ5Lq6XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB1c2VySWRzOiB1c2VySWRMaXN0LmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gaWQuc3BsaXQoJ18nKVsxXSAhPT0gY3VycmVudFVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludml0ZVVzZXJJZHMgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gW2luaWRzWzBdLnNwbGl0KCdfJylbMV1dIDogaW5pZHM7XG5cbiAgICAvLyDlkIzmraXmnKzlnLDnlKjmiLfliJfooajpnIDopoHkvb/nlKjmi4bliIblkI7nmoQgVXNlcklkIOS/neivgeacrOWcsOWFtuS7luaWueazleWMuemFjSB1c2VyaWRcbiAgICBjb25zdCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBhbGxVc2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiB1c2VySWQgPT09IHNlbmRlclVzZXJJZCxcbiAgICAgICAgaXNSZW1vdGU6IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCxcbiAgICAgIH07XG4gICAgICBpZiAodXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGv5Y+KIGRldmljZUlkXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOe7meaJgOacieiiq+mCgOivt+S6uuWQr+WKqOaOpeWQrOiuoeaXtuWZqFxuICAgICAgaWYgKHVzZXJJZCAhPT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkID8gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7IC8vIOe+pOiBiuS4reW3seaWuei2heaXtuaXoOmcgOWPkeaMguaWrea2iOaBr++8jOWPqumcgOS/ruaUueS6uuWRmOOAgemAmuivneaMguaWreeKtuaAgVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbiwgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIOWFtuS7luS6uuWRmOi2heaXtuWPqumAmuefpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICog6LaF5pe25ZCO77yM5bqU5riF6Zmk5ZCv5Yqo55qE6LaF5pe25a6a5pe25ZmoXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+mXtOeKtuaAgemAmuefpVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5XQUlUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgbWVtYmVyTW9kaWZ5IOa2iOaBr+aXtueKtuaAgeacuuabtOaWsO+8iENhbGxFbmdpbmUg5YaF6YOo6LCD55So77yJXG4gICAqIEBwYXJhbSBtZXNzYWdlIOaOpeaUtua2iOaBr1xuICAgKi9cbiAgX19vbk1lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQsIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXI6IHVzZXJQcm9maWxlLCBleGlzdGVkVXNlclBvZmlsZXMsIGNhbGxlciwgZGV2aWNlSWQsIGludml0ZVVzZXJJZHMsIG1lZGlhVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICAvLyB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdICYmICF0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLmRldmljZUlkICYmICFkZXZpY2VJZCAmJlxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfX29uTWVtYmVyTW9kaWZ5IC0+IG5vdCB0aGUgcmVtb3RlIGRldmljZSB0aGF0IGlzIGN1cnJlbnRseSB0YWxraW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgIC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsZXJJZCA9IGNhbGxlcjtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgaW52aXRlVXNlcklkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLnB1c2goeyB1c2VySWQ6IGlkLCBtZWRpYVR5cGUsIGNhbGxTdGF0dXM6IE1zZ0NhbGxTdGF0dXMuSU5DT01JTkcgfSk7XG4gICAgfSk7XG4gICAgLy8g5bex5pa554q25oCB5Li6IE5PTkUgKOacquWtmOWcqOW3seaWueeUqOaIt+S/oeaBrykg6K+05piO6Ieq5bex5Li66KKr6YKA6K+36ICFLCDpnIDlj5HpgIEgcmluZ2luZ1xuICAgIGNvbnN0IGlzTmV3SW52aXRlZFVzZXIgPSBpbnZpdGVVc2VySWRzLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc05ld0ludml0ZWRVc2VyKSB7XG4gICAgICBjb25zdCBuZWVkUmluZ2luZ1VzZXJJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgICAgaWYgKHVzZXJJbmZvLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIG5lZWRSaW5naW5nVXNlcklkcy5wdXNoKHVzZXJJbmZvLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgdXNlcklkczogbmVlZFJpbmdpbmdVc2VySWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOiiq+mCgOivt+iAhemAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlt7LlnKjpgJror53mtYHnqIvkuK3nlKjmiLfvvIzmipvlh7rkurrlkZjlj5jmm7Tnm5HlkKxcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uTWVtYmVyTW9kaWZ5KHtcbiAgICAgICAgc2VuZGVyOiB7IHVzZXJJZDogc2VuZGVyVXNlcklkLCAuLi51c2VyUHJvZmlsZSB9LFxuICAgICAgICBpbnZpdGVkVXNlcnM6IGludml0ZVVzZXJJZHMubWFwKChpZCkgPT4gKHsgdXNlcklkOiBpZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmm7TmlrDlhajph4/nlKjmiLfnirbmgIFcbiAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsU3RhdHVzIH0gPSB1c2VySW5mbztcbiAgICAgIC8vIOS6uuWRmOS4uue7k+adn+eKtuaAgeaXtu+8jOS4jeWGjeabtOaWsFxuICAgICAgaWYgKGNhbGxTdGF0dXMgPT09IE1zZ0NhbGxTdGF0dXMuSURMRSkgcmV0dXJuO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogY2FsbFN0YXR1cyAhPT0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQgPyBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyA6IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HLFxuICAgICAgICBpc0NhbGxlcjogc2VuZGVyVXNlcklkID09PSB1c2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBjdXJyZW50VXNlcklkICE9PSB1c2VySWQsXG4gICAgICB9O1xuICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGvIOWPiiBkZXZpY2VJZFxuICAgICAgaWYgKHVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgLy8g6Zmk5LqGIGNhbGxNc2dTdGF0dXMuY29ubmVjdGVkICzlhbbku5bkurrpg73otbforqHml7blmahcblxuICAgICAgaWYgKGNhbGxTdGF0dXMgIT09IE1zZ0NhbGxTdGF0dXMuQ09OTkVDVEVEICYmICF0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS7hee7meiiq+mCgOivt+aIkOWRmOWQr+WKqOWumuaXtuWZqFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCFpbnZpdGVVc2VySWRzLmluY2x1ZGVzKHVzZXJJZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgPyBSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2FsbCBvbmh1bmd1cCBlcnJvciAtPiAke2Vycm9yPy5zdGFja31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKog5oiWIOacquaOpeWQrOeahOaYr+iHquW3se+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICog6LaF5pe25ZCO77yM5bqU5riF6Zmk5ZCv5Yqo55qE6LaF5pe25a6a5pe25ZmoXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuW3suaciSBzZXNzaW9uIO+8jOS4jeWFgeiuuOWGjeaOpeWQrOaWsOS8muivneaDheWGtVxuICAgKi9cbiAgX19oYW5kbGVJbnZpdGVJblNlc3Npb24oKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnU3RhdGVNYWNoaW5lIC0+IF9faGFuZGxlSW52aXRlSW5TZXNzaW9uJyk7XG4gICAgLy8g5L+u5pS55omA5pyJ55So5oi354q25oCB5bm25oqb5Ye677yM5riF56m66K6h5pe25ZmoXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgJiYgKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICAvLyDlsIblt7LlrZjlnKjnmoTorqHml7blmajpg73muIXmjolcbiAgICAgIHRoaXMuX2NsZWFyVGltZXJCeUlkKHVzZXJJZCk7XG4gICAgfVxuICAgIC8vIOebtOaOpee7iOatouW9k+WJjSBzZXNzaW9uIOeKtuaAgVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5CVVNZX0xJTkUpO1xuICAgIC8vIOWPkemAgeaMguaWrea2iOaBr++8jOW5tuaQuuW4piDlt7Hmlrnlv5nnoowg5Y6f5ZugXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHJlYXNvbjogUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOS4u+WKqOWRvOWPqyAoQ2FsbEVuZ2luZSDlhoXpg6josIPnlKgpXG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+eUqOaItyBJRCDliJfooahcbiAgICogQHBhcmFtIGV4dHJhIOa2iOaBr+eahOaJqeWxleS/oeaBr1xuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHphY3nva5cbiAgICovXG4gIGFzeW5jIF9fY2FsbCh1c2VySWRzOiBzdHJpbmdbXSwgZXh0cmE6IHN0cmluZyA9ICcnLCBwdXNoQ29uZmlnOiBJUHVzaENvbmZpZywgaXNDcm9zc0FwcGtleSA9IGZhbHNlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGludml0ZSAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIC8vIOWPkemAgemCgOivt+a2iOaBr1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSW52aXRlKHtcbiAgICAgIHJvb21UeXBlOiBpc0Nyb3NzQXBwa2V5ID8gUkNDcm9zc0NhbGxUeXBlLlJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA6IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwsXG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgcHVzaENvbmZpZyxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkczogdXNlcklkcy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgfSk7XG5cbiAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcblxuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgY29uc3QgeyBzZW50VGltZSB9ID0gbWVzc2FnZSE7XG5cbiAgICAgIC8qKlxuICAgICAgICog6LeoIGFwcGtleSDku4XlrZjlnKjljZXogYrvvIzlr7nnq68gdXNlcklkIOmcgOWPluS4i+WIkue6v+WQjumdoueahOmDqOWIhlxuICAgICAgICovXG4gICAgICBjb25zdCBpZHMgPSBpc0Nyb3NzQXBwa2V5ID8gW2N1cnJlbnRVc2VySWQsIC4uLlt1c2VySWRzWzBdLnNwbGl0KCdfJylbMV1dXSA6IFtjdXJyZW50VXNlcklkLCAuLi51c2VySWRzXTtcblxuICAgICAgLy8g6YGN5Y6G5pu05paw5oi/6Ze05omA5pyJ5Lq65ZGY54q25oCB44CB5bm257uZ6KKr5Y+r5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICBpZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzQ2FsbGVyID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgICAgaXNDYWxsZXIsXG4gICAgICAgICAgaXNSZW1vdGU6ICFpc0NhbGxlcixcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcblxuICAgICAgICAvLyDlkK/liqjlkbzlj6votoXml7borqHml7blmahcbiAgICAgICAgaWYgKCFpc0NhbGxlcikge1xuICAgICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7blpITnkIbnirbmgIHjgIHlubbpgJrnn6UgY2FsbCDlsYJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25pyq5o6l5oqb5Ye6b25IdW5ndXBcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6L+c56uv5Lq65ZGY5aSn5LqOIDEg5LiU5bex5pa55LiN5Li65q2j5Zyo6YCa6K+d5pe277yM5Y+R6YCBIGh1bmd1cCwg5ZGK6K+J6L+c56uv6Ieq5bex6YCA5Ye66YCa6K+dXG4gICAgICAgICAgICBjb25zdCBpc05lZWRTZW5kSHVuZ3VwID0gdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoID09PSAwICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgICAgICAgaWYgKGlzTmVlZFNlbmRIdW5ndXApIHtcbiAgICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRoaXMuX2dldFRpbWVvdXQoc2VudFRpbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbmRDb2RlID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZENvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXlkKxcbiAgICovXG4gIGFzeW5jIGFjY2VwdCgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWNjZXB0Jyk7XG5cbiAgICAvLyDlj5HpgIHmjqXlkKzmtojmga9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRBY2NlcHQoe1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuXG4gICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoY3VycmVudFVzZXJJZCk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HKTtcbiAgICAgIHRoaXMuX2JlZ2luVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXSk7XG4gICAgICAvLyDkv67mlLnlubbpgJrnn6UgY2FsbCDlsYLmiL/pl7TnirbmgIHlj5jmm7RcbiAgICAgIGNvbnN0IGVuZFJlYXNvbiA9IGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPyBSQ0NhbGxFbmRSZWFzb24uQURERURfVE9fQkxBQ0tMSVNUIDogUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1I7XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuRU5ELCBlbmRSZWFzb24pO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbzlj6vkuK3nu6fnu63pgoDor7dcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdLCBvcHRpb25zOiBJSW52aXRlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKHRoaXMuX2NvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVApIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5DT05WRVJTQVRJT05fTk9UX0dST1VQX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGludml0ZSAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IGV4aXN0ZWRVc2VySWRzID0gT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pO1xuICAgIGNvbnN0IGV4aXN0ZWRVc2VyUG9maWxlczogSUV4aXN0ZWRVc2VyUG9maWxlc1tdID0gZXhpc3RlZFVzZXJJZHMubWFwKCh1c2VySWQpID0+IHtcbiAgICAgIGxldCBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQ7XG4gICAgICAvLyDljIXlkKvooqvpgoDor7fogIXvvIzmiJbogIXnlKjmiLfnirbmgIHkuLogd2F0aW5nIOaXtu+8jOeKtuaAgeS4uiDlk43pk4NcbiAgICAgIGlmICh1c2VySWRzLmluY2x1ZGVzKHVzZXJJZCkgfHwgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLldBSVRJTkcpIHtcbiAgICAgICAgY2FsbFN0YXR1cyA9IE1zZ0NhbGxTdGF0dXMuUklOR0lORztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICAgIGNhbGxTdGF0dXMsXG4gICAgICAgIG1lZGlhSWQ6IHVzZXJJZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGV4dHJhID0gJycsIHB1c2hDb25maWcgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZW1lYmVyTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICAvLyDpmaToh6rlt7HvvIzlhbbku5bmiYDmnInkurrlnYfpnIDmlLbliLAgbW9kaWZ5IOa2iOaBr++8jOS7peatpOabtOaWsOeKtuaAgVxuICAgICAgaW52aXRlVXNlcklkczogdXNlcklkcy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgICBjYWxsZXJJZDogdGhpcy5nZXRDYWxsZXJJZCgpLFxuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiBbLi4uZXhpc3RlZFVzZXJJZHMsIC4uLnVzZXJJZHNdLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICB9KTtcblxuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgY29uc3QgeyBzZW50VGltZSB9ID0gbWVzc2FnZSE7XG4gICAgICAvLyDkv67mlLnooqvpgoDor7fkurrnirbmgIHvvIzlubbpgJrnn6VcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyxcbiAgICAgICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICAgICAgaXNSZW1vdGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICAgIC8vIOWQr+WKqOWRvOWPq+iuoeaXtuWZqFxuICAgICAgICB0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0gPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuWkhOeQhueKtuaAgeOAgeW5tumAmuefpSBjYWxsIOWxglxuICAgICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25pyq5o6l5oqb5Ye6b25IdW5ndXBcbiAgICAgICAgICB0aGlzLl93YXRjaGVycy5vbkh1bmd1cCh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9nZXRUaW1lb3V0KHNlbnRUaW1lKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6YCa55+l5Lq65ZGY5Y+Y5pu0XG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICAgICAgaXNDYWxsZXI6IGZhbHNlLFxuICAgICAgICAgIGlzUmVtb3RlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcblxuICAgICAgICBjb25zdCBlbmRSZWFzb24gPSBjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUID8gUkNDYWxsRW5kUmVhc29uLkFEREVEX1RPX0JMQUNLTElTVCA6IFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SO1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSwgZW5kUmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2h1bmd1cEhhbmRsZShyZWFzb246IFJDQ2FsbEVuZFJlYXNvbiwgaXNTZW5kSGFuZ3VwTWVzc2FnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOWPkemAgeaMguaWreexu+Wei+a2iOaBr1xuICAgIGxldCBjb2RlID0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1M7XG4gICAgaWYgKGlzU2VuZEhhbmd1cE1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IGhhbmd1cFBhcmFtcyA9IHtcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgICAgIHB1c2hDb25maWc6IHRoaXMuX2h1bmd1cFB1c2hDb25maWcsXG4gICAgICB9O1xuXG4gICAgICBpZiAocmVhc29uID09PSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKSB7XG4gICAgICAgIC8vIOW3seerr+iiq+Wkmuerr+WKoOWFpSBSVEMg5oi/6Ze05oyk5o6J5ZCO77yM5LiN5YaN562J5Y+R5oyC5pat5raI5oGv55qE57uT5p6c77yM6Ziy5q2i6LWwIHVzZXJMZWF2ZSDlr7zoh7TmjILmlq3ljp/lm6DkuI3lh4bnoa5cbiAgICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cChoYW5ndXBQYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBjb2RlOiBtc2dDb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgICAgIGNvZGUgPSBtc2dDb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgLy8g5pu05paw6YCa6K+d5Lq65ZGY54q25oCB44CB6YCa6K+d57uT5p2f5pe26Ze0IOW5tumAmuefpVxuICAgIGZvciAoY29uc3QgdXNlcklkIGluIHRoaXMuX3VzZXJJbmZvKSB7XG4gICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkU7XG4gICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyKSB7XG4gICAgICAvLyDmuIXnqbrlhoXlrZjmgIHmlbDmja7vvIzlubbpgJrnn6VcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgYXN5bmMgaHVuZ3VwKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBodW5ndXAnKTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDpu5jorqTmjILmlq0gcmVhc29uIOS4uumAmuivnei/h+eoi+S4re+8jOW3seaWueato+W4uOWPlua2iOmAmuivnVxuICAgIGxldCByZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uSEFOR1VQO1xuICAgIC8qKlxuICAgICAqIOiLpei2heaXtuiuoeaXtuWZqOWtmOWcqCwg5bex5pa55Li6IGNhbGxlciDljp/lm6DkuLrlt7Hmlrnlj5bmtojpgJror50sXG4gICAgICog5bex5pa55Li6IGNhbGxlZSDkuJTmnKrov5vlhaXpgJror53kuK3vvIzljp/lm6DkuLrlt7Hmlrnmi5Lnu53pgJror51cbiAgICAgKi9cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlclRpbWVycykubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLmlzQ2FsbGVyKSB7XG4gICAgICAgIHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5DQU5DRUw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlID09PSBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORykge1xuICAgICAgICByZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uUkVKRUNUO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOa4hemZpOaJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIGZvciAoY29uc3QgdXNlcklkIGluIHRoaXMuX3VzZXJUaW1lcnMpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZXJCeUlkKHVzZXJJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9odW5ndXBIYW5kbGUocmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkv67mlLnpgJror53lqpLkvZPnsbvlnotcbiAgICogQHBhcmFtIG1lZGlhVHlwZSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8g5pS55Li66Z+z6aKR6YCa6K+dIHwgUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPIOaUueS4uumfs+inhumikemAmuivnVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGNoYW5nZU1lZGlhVHlwZSAtPiBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWApO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZE1lZGlhTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKjmiLfliqDlhaXpgJror53ooaXlgb/mnLrliLbvvIhydGMgdXNlckpvaW4g5LqL5Lu26Kem5Y+R77yJXG4gICAqIOS4u+WPq+WRvOWPq+WQju+8jOacquaUtuWIsOiiq+WPqyBhY2NlcHQg5raI5oGv77yM5L2G5pS25Yiw5LqGIHVzZXJKb2luIOWQjOagt+ihpeWBv+abtOaWsOeUqOaIt+OAgeaIv+mXtOeKtuaAgeOAgeWRvOWPq+iuoeaXtuWZqFxuICAgKi9cbiAgdXNlckpvaW4odXNlcklkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gdXNlckpvaW4gLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlu7bov58gMzAwbXMg6Ziy5q2iIHVzZXJKaW9uIOWSjCBhY2NlcHQg5raI5oGv6YO95pyJ55qE5oOF5Ya15LiL77yMIHVzZXJKb2luIOavlCBhY2NlcHQg5YWI5YiwXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICBjb25zdCB1c2VySW5mbyA9IHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgIC8vIOabtOaWsOS6uuWRmOeKtuaAgSAoLy8g576k57uE6YCa6K+d5pe277yaIEHlkJFC44CBQ+WPkei1t+mAmuivnSBC5YWI5o6l5ZCs77yMQ+WQjuaOpeWQrO+8jOi/meaXtkLmsqHmnIlD55qEdXNlcklk5a+55bqU55qEX3VzZXJJbmZv77yM5omA5Lul6L+Z6YeM5Yik5pat5LiA5LiLKVxuICAgICAgICBpZiAodXNlckluZm8gJiYgdXNlckluZm8uc3RhdGUgIT09IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HKSB7XG4gICAgICAgICAgdXNlckluZm8uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORztcbiAgICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlckluZm8pO1xuICAgICAgICB9XG4gICAgICAgIC8vIOabtOaWsOaIv+mXtOeKtuaAgVxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlgZzmraLlubbmuIXpmaTlkbzlj6vorqHml7blmahcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICAgIH0pO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICAvKipcbiAgICog55So5oi356a75byA6YCa6K+d6KGl5YG/5py65Yi277yIcnRjIHVzZXJMZWF2ZeOAgWtpY2tPZmYg5LqL5Lu26Kem5Y+R77yJXG4gICAqIOmAmuivneS4rei/nOerr+eUqOaIt+aMguaWre+8jOaMguaWrea2iOaBr+acquWIsO+8jOS9huaYr+ebkeWQrOWIsCBydGMgdXNlckxlYXZlIOWQjOagt+ihpeWBv+abtOaWsOeUqOaIt+OAgeaIv+mXtOeKtuaAgVxuICAgKi9cbiAgdXNlckxlYXZlKHVzZXJJZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIHVzZXJMZWF2ZSAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIC8vIOW7tui/nyAzMDBtcyDpmLLmraIgdXNlckxlYXZlIOWSjCBodW5ndXAg5raI5oGv6YO95pyJ55qE5oOF5Ya15LiL77yMdXNlckxlYXZlIOavlCBodW5ndXAg5YWI5YiwXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICBjb25zdCB1c2VySW5mbyA9IHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgIC8vIOabtOaWsOS6uuWRmOeKtuaAgVxuICAgICAgICBpZiAodXNlckluZm8gJiYgdXNlckluZm8uc3RhdGUgIT09IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKSB7XG4gICAgICAgICAgdXNlckluZm8uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlckluZm8sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQKTtcbiAgICAgICAgICB0aGlzLl93YXRjaGVycy5vbkh1bmd1cCh1c2VySW5mbywgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICB9XG4gICAgICAgIC8vIOS4u+WPq+aWuee+pOiBiumCgOivt+iiq+WPq+aWueWQjuemu+e6v++8jOS4u+WPq+aWueatpOaXtuS4uuetieW+heeKtuaAgeWQjuS4jeWGjeS4iue6v++8jOiiq+WPq+aWueaOpeWQrOWQjuaMguaWreiHs+WJqeS9meS4gOS6uuaXtuetieW+heS4gOWIhumSn+WQjuaMguaWrVxuICAgICAgICBjb25zdCByZW1vdGVVc2Vyc1RpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdGVVc2VycyA9IHRoaXMuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgICAgICAgICAvLyDov5znq6/lj6rmnInkuIDkuKrnlKjmiLfkuJTmmK/nrYnlvoXnirbmgIHvvIznrYnlvoXkuIDliIbpkp/lkI7mjILmlq1cbiAgICAgICAgICBpZiAocmVtb3RlVXNlcnMubGVuZ3RoID09PSAxICYmIHJlbW90ZVVzZXJzWzBdLnN0YXRlID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9odW5ndXBIYW5kbGUoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDYwMDAwKTtcbiAgICAgICAgLy8g5pu05paw5oi/6Ze054q25oCBXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiAmJiB0aGlzLl9zZXNzaW9uU3RhdGUgIT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQpIHtcbiAgICAgICAgICB0aGlzLl9lbmRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIOWxguW3seaWueW8guW4uOWksei0peWQjuiwg+eUqOeahOaWueazlVxuICAgKiDop6blj5Hml7bmnLrvvJrpn7Pop4bpopHmnI3liqHlvILluLjjgIHojrflj5botYTmupDlpLHotKXjgIHliqDlhaUgUlRDIOaIv+mXtOWksei0peOAgeWPkeW4g3zorqLpmIXlpLHotKVcbiAgICovXG4gIGNsb3NlKHJlYXNvbjogUkNDYWxsRW5kUmVhc29uKSB7XG4gICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gIH1cblxuICBzZXRIdW5ndXBQdXNoQ29uZmlnKHB1c2hDb25maWc6IElQdXNoQ29uZmlnKSB7XG4gICAgdGhpcy5faHVuZ3VwUHVzaENvbmZpZyA9IHB1c2hDb25maWc7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5ZSv5LiA5qCH6K+GXG4gICAqL1xuICBnZXRDYWxsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkmue7hOe7hyBJRFxuICAgKi9cbiAgZ2V0Q2hhbm5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm67moIcgSUTvvIzljZXlkbzlr7nmlrnkurrlkZggSWQsIOe+pOWRvOe+pOe7hCBJZFxuICAgKi9cbiAgZ2V0VGFyZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0SWQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lya6K+d57G75Z6LXG4gICAqL1xuICBnZXRDb252ZXJzYXRpb25UeXBlKCk6IENvbnZlcnNhdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9jb252ZXJzYXRpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlui/nOerr+aIkOWRmCBJRCDliJfooahcbiAgICovXG4gIGdldFJlbW90ZVVzZXJJZHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFsbFVzZXJJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbyk7XG4gICAgY29uc3QgcmVtb3RlVXNlcklkcyA9IGFsbFVzZXJJZHMuZmlsdGVyKChpZCkgPT4gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSAhPT0gaWQpO1xuICAgIHJldHVybiByZW1vdGVVc2VySWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlui/nOerr+aIkOWRmOS/oeaBr+WIl+ihqFxuICAgKi9cbiAgZ2V0UmVtb3RlVXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIGNvbnN0IHJlbW90ZVVzZXI6IElVc2VyRGF0YVtdID0gW107XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgZm9yIChjb25zdCB1aWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIGNvbnN0IHsgdXNlcklkIH0gPSB0aGlzLl91c2VySW5mb1t1aWRdO1xuICAgICAgaWYgKHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICByZW1vdGVVc2VyLnB1c2godGhpcy5fdXNlckluZm9bdWlkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZW1vdGVVc2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluaIv+mXtOeKtuaAgVxuICAgKi9cbiAgZ2V0U3RhdGUoKTogUkNDYWxsU2Vzc2lvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvblN0YXRlID09PSBudWxsID8gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCA6IHRoaXMuX3Nlc3Npb25TdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkurrlkZjnirbmgIFcbiAgICovXG4gIGdldFVzZXJTdGF0ZSh1c2VySWQ6IHN0cmluZyk6IFJDQ2FsbFVzZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0/LnN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS8muivneWPkei1t+iAhSBJZFxuICAgKi9cbiAgZ2V0Q2FsbGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbGVySWQhO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+asoeS8muivnemCgOivt+iAhSBJZFxuICAgKi9cbiAgZ2V0SW52aXRlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0ZXJJZCE7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6YCa6K+d5aqS5L2T57G75Z6LXG4gICAqL1xuICBnZXRNZWRpYVR5cGUoKTogUkNDYWxsTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneaMguaWreWQjuWPr+iwg+eUqFxuICAgKi9cbiAgZ2V0U3VtbWFyeSgpOiBJRW5kU3VtbWFyeSB7XG4gICAgLy8g6YCa6K+d5pe26Ze06K6h566XXG4gICAgY29uc3QgYmVnaW5UaW1lc3RhbXAgPSB0aGlzLl9iZWdpblRpbWVzdGFtcDtcbiAgICBjb25zdCBlbmRUaW1lc3RhbXAgPSB0aGlzLl9lbmRUaW1lc3RhbXA7XG4gICAgbGV0IGR1cmF0aW9uID0gMDtcbiAgICBpZiAoZW5kVGltZXN0YW1wID4gYmVnaW5UaW1lc3RhbXAgJiYgYmVnaW5UaW1lc3RhbXAgIT09IDApIHtcbiAgICAgIGR1cmF0aW9uID0gZW5kVGltZXN0YW1wIC0gYmVnaW5UaW1lc3RhbXA7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VtbWFyeSA9IHtcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgYmVnaW5UaW1lc3RhbXAsXG4gICAgICBlbmRUaW1lc3RhbXAsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGVuZFJlYXNvbjogdGhpcy5fZW5kUmVhc29uISxcbiAgICB9O1xuXG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGdldFN1bW1hcnkgLT4gc3VtbWFyeTogJHtKU09OLnN0cmluZ2lmeShzdW1tYXJ5KX1gKTtcbiAgICByZXR1cm4gc3VtbWFyeTtcbiAgfVxufVxuIiwiLyoqXG4gKiDpgJror53lqpLkvZPnsbvlnotcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsTWVkaWFUeXBlIHtcbiAgLyoqXG4gICAqIOmfs+mikemAmuivnVxuICAgKi9cbiAgQVVESU8gPSAxLFxuICAvKipcbiAgICog6KeG6aKR6YCa6K+dXG4gICAqL1xuICBBVURJT19WSURFT1xufVxuIiwiZXhwb3J0IGVudW0gTWVtYmVyTW9kaWZ5VHlwZSB7XG4gIEFERCA9IDEsXG4gIFJFTU9WRVxufVxuIiwiLyoqXG4gKiDlubPlj7BcbiAqL1xuZXhwb3J0IGVudW0gUGxhdGZvcm0ge1xuICBXRUIgPSAnV2ViJyxcbiAgSU9TID0gJ2lPUycsXG4gIEFORFJPSUQgPSAnQW5kcm9pZCdcbn1cbiIsImltcG9ydCB7XG4gIENvbnZlcnNhdGlvblR5cGUsIElMb2dnZXIsIElSZWNlaXZlZE1lc3NhZ2UsIFJUQ1BsdWdpbkNvbnRleHQsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IENhbGxSZW1vdGVFbmRSZWFzb24sIFJDQ2FsbEVuZFJlYXNvbiB9IGZyb20gJy4vZW51bXMvUkNDYWxsRW5kUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbE1lZGlhVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsTWVkaWFUeXBlJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJSHVuZ3VwTXNnQ29udGVudCwgSUludml0ZU1zZ0NvbnRlbnQsIElNZWRpYU1vZGlmeU1zZ0NvbnRlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBJT2ZmbGluZVJlY29yZCB7XG4gIGNoYW5uZWxJZDogc3RyaW5nLFxuICBjb252ZXJzYXRpb25UeXBlOiBDb252ZXJzYXRpb25UeXBlLFxuICB0YXJnZXRJZDogc3RyaW5nLFxuICBtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgY2FsbElkOiBzdHJpbmcsXG4gIGludml0ZXJJZDogc3RyaW5nLFxuICBlbmRSZWFzb246IFJDQ2FsbEVuZFJlYXNvbixcbiAgYmVnaW5UaW1lc3RhbXA6IG51bWJlcixcbiAgZW5kVGltZXN0YW1wOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXJcbn1cblxuLyoqXG4gKiDnprvnur/pgJror53orrDlvZXlmahcbiAqL1xuZXhwb3J0IGNsYXNzIE9mZmxpbmVSZWNvcmRlciB7XG4gIHByaXZhdGUgX21lc3NhZ2VzOiBJUmVjZWl2ZWRNZXNzYWdlW10gfCBbXSA9IFtdXG5cbiAgcHJpdmF0ZSBfY2hhbm5lbElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfY29udmVyc2F0aW9uVHlwZSE6IENvbnZlcnNhdGlvblR5cGVcblxuICBwcml2YXRlIF90YXJnZXRJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX21lZGlhVHlwZSE6IFJDQ2FsbE1lZGlhVHlwZVxuXG4gIHByaXZhdGUgX2NhbGxJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2NhbGxlcklkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfaW52aXRlcklkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfZW5kUmVhc29uITogUkNDYWxsRW5kUmVhc29uXG5cbiAgcHJpdmF0ZSBfYmVnaW5UaW1lc3RhbXA6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9lbmRUaW1lc3RhbXA6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vblJlY29yZDogKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpID0+IHZvaWQsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog5YiwIGludml0ZSB8IG1lbWJlck1vZGlmeSDnu5PmnZ9cbiAgICog5Y6f5Zug5qC55o2u5bex5pa55piv5ZCm5Li65Li75Y+r77yM5Li75Y+r5Li66L+c56uv5pyq5o6l5ZCsIOiiq+WPq+iiq+W3seerr+acquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9JbnZpdGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIHNlbmRlclVzZXJJZCwgY29udGVudCxcbiAgICB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IGNhbGxJZCwgbWVkaWFUeXBlIH0gPSBjb250ZW50IGFzIElJbnZpdGVNc2dDb250ZW50O1xuICAgIHRoaXMuX2NoYW5uZWxJZCA9IGNoYW5uZWxJZCE7XG4gICAgdGhpcy5fY29udmVyc2F0aW9uVHlwZSA9IGNvbnZlcnNhdGlvblR5cGU7XG4gICAgdGhpcy5fdGFyZ2V0SWQgPSB0YXJnZXRJZDtcbiAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIGNvbnN0IGlzQ2FsbGVyID0gc2VuZGVyVXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgIHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICB0aGlzLl9lbmRSZWFzb24gPSBpc0NhbGxlciA/IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg57uT5p2fXG4gICAqIOWOn+WboOagueaNruW3seaWueaYr+WQpuS4uuS4u+WPq++8jOS4u+WPq+S4uui/nOerr+acquaOpeWQrCDooqvlj6vooqvlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX2RvTWVtYmVyTW9kaWZ5KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9kb0ludml0ZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKggaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOiuoeeul+eahOemu+e6v+iusOW9lVxuICAgKi9cbiAgcHJpdmF0ZSBfZG9SaW5naW5nKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgYWNjZXB0IOivtOaYjumAmuivneW3suW7uueri1xuICAgKiDljp/lm6Dpu5jorqTlt7HmlrnmraPluLjmjILmlq1cbiAgICovXG4gIHByaXZhdGUgX2RvQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9lbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uSEFOR1VQO1xuICAgIHRoaXMuX2JlZ2luVGltZXN0YW1wID0gbWVzc2FnZS5zZW50VGltZTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaHVuZ3VwIOivtOaYjuS4uuato+W4uOaMguaWrVxuICAgKiDljp/lm6Dlj5bmtojmga/kvZPph4zmjILmlq3ljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX2RvSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGNvbnRlbnQsIHNlbnRUaW1lLCBzZW5kZXJVc2VySWQgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3QgeyByZWFzb24gfSA9IGNvbnRlbnQgYXMgSUh1bmd1cE1zZ0NvbnRlbnQ7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgaXNTZWxmU2VuZCA9IHNlbmRlclVzZXJJZCA9PT0gY3VycmVudFVzZXJJZDtcbiAgICB0aGlzLl9lbmRSZWFzb24gPSBpc1NlbGZTZW5kID8gcmVhc29uIDogQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dO1xuICAgIHRoaXMuX2VuZFRpbWVzdGFtcCA9IHNlbnRUaW1lO1xuXG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5Y+q5L+u5pS56YCa6K+d57G75Z6LXG4gICAqL1xuICBwcml2YXRlIF9kb01lZGlhTW9kaWZ5KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGNvbnRlbnQgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3QgeyBtZWRpYVR5cGUgfSA9IGNvbnRlbnQgYXMgSU1lZGlhTW9kaWZ5TXNnQ29udGVudDtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICBwcml2YXRlIF9jYW5HZW5SZWNvcmQoKSB7XG4gICAgaWYgKHRoaXMuX21lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbGV0IGR1cmF0aW9uID0gMDtcbiAgICAgIGNvbnN0IGlzTmVlZER1cmF0aW9uUmVhc29uID0gW1xuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uSEFOR1VQLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9KT0lORURfQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5LSUNLRURfQllfU0VSVkVSLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5BQ0NFUFRfU1lTVEVNX0NBTEwsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxuICAgICAgXS5pbmNsdWRlcyh0aGlzLl9lbmRSZWFzb24pO1xuICAgICAgaWYgKGlzTmVlZER1cmF0aW9uUmVhc29uKSB7XG4gICAgICAgIGR1cmF0aW9uID0gdGhpcy5fZW5kVGltZXN0YW1wIC0gdGhpcy5fYmVnaW5UaW1lc3RhbXA7XG4gICAgICB9XG4gICAgICB0aGlzLl9vblJlY29yZCh7XG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgICBpbnZpdGVySWQ6IHRoaXMuX2ludml0ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICAgIGVuZFJlYXNvbjogdGhpcy5fZW5kUmVhc29uLFxuICAgICAgICBiZWdpblRpbWVzdGFtcDogdGhpcy5fYmVnaW5UaW1lc3RhbXAsXG4gICAgICAgIGVuZFRpbWVzdGFtcDogdGhpcy5fZW5kVGltZXN0YW1wLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVjdk9mZmxpbmVNc2dzKG1lc3NhZ2VzOiBJUmVjZWl2ZWRNZXNzYWdlW10pIHtcbiAgICB0aGlzLl9tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IG1zZyA9IHRoaXMuX21lc3NhZ2VzLnNoaWZ0KCkhO1xuICAgICAgY29uc3QgeyBtZXNzYWdlVHlwZSwgY29udGVudDogeyBjYWxsSWQgfSB9ID0gbXNnO1xuICAgICAgc3dpdGNoIChtZXNzYWdlVHlwZSkge1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlOlxuICAgICAgICAgIHRoaXMuX2RvSW52aXRlKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nOlxuICAgICAgICAgIHRoaXMuX2RvUmluZ2luZyhtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0OlxuICAgICAgICAgIHRoaXMuX2RvQWNjZXB0KG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW06XG4gICAgICAgICAgdGhpcy5fZG9NZW1iZXJNb2RpZnkobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhOlxuICAgICAgICAgIHRoaXMuX2RvTWVkaWFNb2RpZnkobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cDpcbiAgICAgICAgICB0aGlzLl9kb0h1bmd1cChtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbT2ZmbGluZVJlY29yZGVyXSBvblJlY3ZPZmZsaW5lTXNncyAtPiB1bmV4cGVjdGVkIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IHdoaWxlICh0aGlzLl9tZXNzYWdlcy5sZW5ndGggPiAwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHlwZSwgRXJyb3JDb2RlLCBFdmVudEVtaXR0ZXIsIElMb2dnZXIsIElQdXNoQ29uZmlnIGFzIElFbmdpbmVQdXNoQ29uZmlnLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgSVNlbmRNc2dPcHRpb25zLCBSVENQbHVnaW5Db250ZXh0LFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBNZW1iZXJNb2RpZnlUeXBlIH0gZnJvbSAnLi9lbnVtcy9NZW1iZXJNb2RpZnlUeXBlJztcbmltcG9ydCB7IFJDQ2FsbEVycm9yQ29kZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsQ29kZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsTWVzc2FnZVR5cGUnO1xuaW1wb3J0IHsgSVVzZXJQcm9maWxlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lTdGF0ZU1hY2hpbmUnO1xuaW1wb3J0IHtcbiAgSUFjY2VwdE1zZ0NvbnRlbnQsIElBY2NlcHRNc2dPcHRpb25zLCBJQ2FsbE1zZ09wdGlvbiwgSUh1bmd1cE1zZ0NvbnRlbnQsIElIdW5ndXBNc2dPcHRpb25zLFxuICBJSW52aXRlTXNnQ29udGVudCwgSUludml0ZU1zZ09wdGlvbnMsIElNZWRpYU1vZGlmeU1zZ0NvbnRlbnQsIElNZWRpYU1vZGlmeU1zZ09wdGlvbnMsIElNZW1iZXJNb2RpZnlNc2dDb250ZW50LFxuICBJTWVtYmVyTW9kaWZ5TXNnT3B0aW9ucywgSU1zZ0xpc3RlbmVyLCBJUmluZ2luZ01zZ0NvbnRlbnQsIElSaW5naW5nTXNnT3B0aW9ucyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJy4vZW51bXMvUGxhdGZvcm0nO1xuaW1wb3J0IHsgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7IElPZmZsaW5lUmVjb3JkLCBPZmZsaW5lUmVjb3JkZXIgfSBmcm9tICcuL09mZmxpbmVSZWNvcmRlcic7XG5pbXBvcnQgeyBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSBmcm9tICcuLic7XG5cbmNvbnN0IGNhbGxNc2dUeXBlcyA9IFsnUkM6VkNBY2NlcHQnLCAnUkM6VkNSaW5naW5nJywgJ1JDOlZDU3VtbWFyeScsICdSQzpWQ0hhbmd1cCcsICdSQzpWQ0ludml0ZScsICdSQzpWQ01vZGlmeU1lZGlhJywgJ1JDOlZDTW9kaWZ5TWVtJ107XG5cbnR5cGUgTXNnTGlzdGVuZXJLZXlzID0ga2V5b2YgSU1zZ0xpc3RlbmVyXG5cbmludGVyZmFjZSBJTXNnQnVmZmVySXRlbSB7XG4gIG1hcmtUaW1lOiBudW1iZXIsXG4gIG1zZzogSVJlY2VpdmVkTWVzc2FnZVxufVxuXG5jb25zdCBFbmdpbmVFcnJvckNvZGVUb0NhbGxFcnJvckNvZGU6IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRXJyb3JDb2RlIH0gPSB7XG4gIFtFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUXTogUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCxcbiAgW0Vycm9yQ29kZS5OT1RfSU5fR1JPVVBdOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX0dST1VQLFxufTtcblxuLyoqXG4gKiDmtojmga/mjqXmlLblpITnkIY6IOWcqOe6v+a2iOaBr+OAgeemu+e6v+a2iOaBr1xuICog5Y+R6YCB5raI5oGv5aSE55CGOiDlj5HpgIHkuI3lkIznsbvlnovmtojmga/lsIHoo4VcbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxNZXNzYWdlSGFuZGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgX3dhdGNoZXJzOiBJTXNnTGlzdGVuZXIgPSB7fVxuXG4gIHByaXZhdGUgX3VzZXJJbmZvOiBJVXNlclByb2ZpbGUgPSB7fVxuXG4gIHByaXZhdGUgX21zZ0J1ZmZlckxpc3Q6IElNc2dCdWZmZXJJdGVtW10gPSBbXVxuXG4gIHByaXZhdGUgX2hhZEhhbmRsZU1zZ1RpbWVyOiBib29sZWFuID0gZmFsc2VcblxuICBwcml2YXRlIF9vZmZsaW5lUmVjb3JkZXIhOiBPZmZsaW5lUmVjb3JkZXJcblxuICBwcml2YXRlIF9kZXZpY2VJZDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICAvKipcbiAgICAgKiDnprvnur/mtojmga/lpITnkIbml7bpl7Tpl7TpmpRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vZmZsaW5lTXNnSXR2OiBudW1iZXIgPSA2MCAqIDEwMDAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ2V0U3RhdGVNYWNoaW5lOiAoY2FsbElkOiBzdHJpbmcpID0+IFJDQ2FsbFN0YXRlTWFjaGluZSB8IG51bGwsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gZGV2aWNlSWRcbiAgICB0aGlzLl9kZXZpY2VJZCA9IGdldENhbGxEZXZpY2VJZChfcnVudGltZSk7XG4gICAgLy8g5aSE55CG5raI5oGv5pS25Y+RXG4gICAgdGhpcy5fY29udGV4dC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAvLyDlpITnkIbnprvnur/mtojmga/orrDlvZVcbiAgICB0aGlzLl9vZmZsaW5lUmVjb3JkZXIgPSBuZXcgT2ZmbGluZVJlY29yZGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX2xvZ2dlciwgKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIG9mZmxpbmVSZWNvcmRlciAtPiAke0pTT04uc3RyaW5naWZ5KHJlY29yZCl9YCk7XG4gICAgICB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQgJiYgdGhpcy5fd2F0Y2hlcnMub25PZmZsaW5lUmVjb3JkKHJlY29yZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1lc3NhZ2UobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IGlzQ2FsbE1zZyA9IGNhbGxNc2dUeXBlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKTtcbiAgICBpZiAoaXNDYWxsTXNnKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gX29uTWVzc2FnZSAtPiBjYWxsIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG4gICAgICAvLyDpgJrov4fpgY3ljoYgYnVmZmVyTGlzdCDmn6Xmib7opoHmj5LlhaXnmoToioLngrlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hcmtUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgeyBzZW50VGltZTogY3VycmVudE1zZ1NlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgICAgICBsZXQgaW5zZXJ0SW5kZXggPSAwO1xuICAgICAgICAvLyDpnIDpgY3ljobmlbDnu4Tlhajpg6jpobnvvIzmlYXkvb/nlKggZm9yRWFjaCwgZmluZEluZGV4IOaJvuWIsOesrOS4gOS4quespuWQiOadoeS7tueahOWwseS8mue7iOatolxuICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LmZvckVhY2goKHsgbXNnOiB7IHNlbnRUaW1lIH0gfSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoY3VycmVudE1zZ1NlbnRUaW1lID49IHNlbnRUaW1lKSB7XG4gICAgICAgICAgICAvLyBpbnNlcnRJbmRleCDpnIDkuLrlvZPliY3nrKblkIjmnaHku7blhYPntKDnmoTlkI7kuIDkvY3vvIzmlYUgKzFcbiAgICAgICAgICAgIGluc2VydEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc3BsaWNlKGluc2VydEluZGV4LCAwLCB7XG4gICAgICAgICAgbWFya1RpbWUsXG4gICAgICAgICAgbXNnOiBtZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgb25NZXNzYWdlIC0+IG1zZ0J1ZmZlckxpc3Q6ICR7dGhpcy5fbXNnQnVmZmVyTGlzdC5sZW5ndGh9YCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gc3BsaWNlIGJ1ZmZlciBtc2cgZXJyb3IgLT4gJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICAvLyDlkK/liqjmtojmga/lpITnkIZcbiAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog5Zyo57q/5raI5oGv5oqb57uZ54q25oCB5py65aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZPbmxpbmVDYWxsTXNnKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBvbk1lc3NhZ2UgLT4gX29uUmVjdk9ubGluZUNhbGxNc2c6ICR7bWVzc2FnZS5tZXNzYWdlVHlwZX1gKTtcbiAgICBjb25zdCB7IGNvbnRlbnQ6IHsgY2FsbElkIH0gfSA9IG1lc3NhZ2U7XG4gICAgLy8g5Zyo57q/5raI5oGv55u05o6l5oqb5Ye6XG4gICAgc3dpdGNoIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlOlxuICAgICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSAmJiB0aGlzLl93YXRjaGVycy5vbkludml0ZShtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZzpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25SaW5naW5nYCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdDpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25BY2NlcHRgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtOlxuICAgICAgICAvLyDmlLbliLDkurrlkZjlj5jmm7Tmipvlh7ogb25JbnZpdGUg55Sf5oiQ54q25oCB5py65a6e5L6LXG4gICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlICYmIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYTpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25NZWRpYU1vZGlmeWAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXA6XG4gICAgICAgIHN1cGVyLmVtaXQoYCR7Y2FsbElkfW9uSHVuZ3VwYCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gb25SZWN2T25saW5lQ2FsbE1zZyAtPiB1bmV4cGVjdGVkIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmtojmga8gYnVmZmVyIOWIl+ihqOWkhOeQhumAu+i+kVxuICAgKiAx44CB5q+PIDIwbXMg5qOA5p+l5LiA5qyhIGJ1ZmZlciBsaXN0XG4gICAqIDLjgIHlj5blh7rlt7Lnu4/lu7bov58gMjAwIOeahOa2iOaBr+WIl+ihqOi/m+ihjOa2iOi0uSB8IOaXoOW7tui/nyAyMDBtcyDlhoXmtojmga/nm7TmjqXpgJLlvZJcbiAgICogM+OAgea2iOi0ueWIhuS4uiDnprvnur/mtojmga/mtojotLnpgLvovpHjgIHlnKjnur/mtojmga/mtojotLnpgLvovpHvvIzmtojotLnlkI7pgJLlvZJcbiAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQnVmZmVyTXNncygpIHtcbiAgICAvLyDmtojmga8gYnVmZmVyIOWIl+ihqOmVv+W6puS4uiAwIOaXtuWKoOmUgVxuICAgIGlmICh0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCAnX2hhbmRsZUJ1ZmZlck1zZ3MgcmV0dXJuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOmcgOimgeWKoOmUge+8jOaUtuWIsOWkmuasoea2iOaBr+WQju+8jOWPr+iDveS8mui1t+WkmuS4qiB0aW1lclxuICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIOWPluWHuuWkp+S6jiAyMDAgbXMg5raI5oGv5YiX6KGoXG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBidWZmZXJzID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGN1cnJlbnRUaW1lIC0gaXRlbS5tYXJrVGltZSA+PSAyMDApO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIGhhbmRsZUJ1ZmZlck1zZ3MgLT4gbGlzdHMgb3ZlciAyMDBtcyA6ICR7SlNPTi5zdHJpbmdpZnkoYnVmZmVycy5tYXAoKHsgbXNnOiB7IG1lc3NhZ2VVSWQsIGlzT2ZmTGluZU1lc3NhZ2UsIGNvbnRlbnQ6IHsgY2FsbElkIH0gfSB9KSA9PiAoeyBtZXNzYWdlVUlkLCBpc09mZkxpbmVNZXNzYWdlLCBjYWxsSWQgfSkpKX1gKTtcbiAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyDmsqHmnInlu7bov58gMjAwbXMg55qE5raI5oGv77yM5raI6LS56YC76L6R6Kej6ZSB5bm26YCS5b2S5omn6KGMXG4gICAgICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVmZmVyc1swXS5tc2cuaXNPZmZMaW5lTWVzc2FnZSkge1xuICAgICAgICAvLyDlvZPnrKzkuIDmnaHmtojmga/kuLrnprvnur/mtojmga/ml7bvvIznm7TmjqXku44gYnVmZmVyIOS4reWPluWHuuaJgOacieemu+e6v+a2iOaBr++8jOi/m+ihjOa2iOaBr1xuICAgICAgICBsZXQgb2ZmbGluZUJ1ZmZlcnMgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5tc2cuaXNPZmZMaW5lTWVzc2FnZSk7XG5cbiAgICAgICAgLy8g56a757q/5raI5oGv5aSE55CG6YC76L6RXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb252ZXJzYXRpb25UeXBlLCBtZXNzYWdlVHlwZSwgc2VudFRpbWUsIHNlbmRlclVzZXJJZCwgY29udGVudDogeyBjYWxsSWQ6IGludml0ZUNhbGxJZCwgaW52aXRlVXNlcklkcyB9LFxuICAgICAgICAgIH0gPSBvZmZsaW5lQnVmZmVyc1swXS5tc2c7XG5cbiAgICAgICAgICBjb25zdCBpc0ludml0ZU1zZ1R5cGUgPSBbUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGUsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSBhcyBSQ0NhbGxNZXNzYWdlVHlwZSk7XG5cbiAgICAgICAgICAvLyDorqHnrpflvZPliY3ml7bpl7TkuI7mtojmga/lj5HpgIHml7bpl7Tlt65cbiAgICAgICAgICBjb25zdCBkZWxheVRpbWUgPSB0aGlzLl9jb250ZXh0LmdldFNlcnZlclRpbWUoKSAtIHNlbnRUaW1lO1xuICAgICAgICAgIGNvbnN0IGlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2ID0gZGVsYXlUaW1lIDwgdGhpcy5fb2ZmbGluZU1zZ0l0djtcblxuICAgICAgICAgIGlmICghaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYG9mZmxpbmUgbXNnIGRlbGF5VGltZTogJHtkZWxheVRpbWV9bXNgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNJbnZpdGVNc2dUeXBlKSB7IC8vIOWPluWHuueahOesrOS4gOadoea2iOaBr+S4uiBpbnZpdGUgfCBtZW1Nb2RpZnlcbiAgICAgICAgICAgIC8vIOWPluWHuuebuOWQjCBDYWxsSWQg5raI5oGv5YiX6KGoXG4gICAgICAgICAgICBjb25zdCB0YXNrTXNnTGlzdDogSVJlY2VpdmVkTWVzc2FnZVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9mZmxpbmVCdWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBvZmZsaW5lQnVmZmVyc1tpXS5tc2c7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29udGVudDogeyBjYWxsSWQ6IG90aGVyQ2FsbElkIH0gfSA9IGl0ZW07XG4gICAgICAgICAgICAgIGlmIChpbnZpdGVDYWxsSWQgPT09IG90aGVyQ2FsbElkKSB7XG4gICAgICAgICAgICAgICAgdGFza01zZ0xpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgdGFza01zZ0xpc3QgbGVuZ3RoOiAke3Rhc2tNc2dMaXN0Lmxlbmd0aH1gKTtcblxuICAgICAgICAgICAgaWYgKHRhc2tNc2dMaXN0Lmxlbmd0aCA+IDApIHsgLy8g6Ziy5q2iIHRhc2tNc2dMaXN0IOS4uiAwXG4gICAgICAgICAgICAgIC8vIOaJvuWHuiBtc2dCdWZmZXJMaXN0IOS4reW3sua2iOi0ueeahOa2iOaBr+acgOWkpyBpbmRleFxuICAgICAgICAgICAgICBjb25zdCBkZWxJbmRleCA9IHRoaXMuX21zZ0J1ZmZlckxpc3QuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm1zZy5tZXNzYWdlVUlkID09PSB0YXNrTXNnTGlzdFt0YXNrTXNnTGlzdC5sZW5ndGggLSAxXS5tZXNzYWdlVUlkKTtcbiAgICAgICAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+HIG1zZ0J1ZmZlckxpc3Qg55qE5raI5oGvXG4gICAgICAgICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3QgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LnNsaWNlKGRlbEluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgICAgLy8g5om+5Ye6IG9mZmxpbmVNc2dzIOS4reW3sua2iOi0ueeahOa2iOaBr+acgOWkpyBpbmRleFxuICAgICAgICAgICAgICBjb25zdCBkZWxPZmZsaW5lSW5kZXggPSBvZmZsaW5lQnVmZmVycy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubXNnLm1lc3NhZ2VVSWQgPT09IHRhc2tNc2dMaXN0W3Rhc2tNc2dMaXN0Lmxlbmd0aCAtIDFdLm1lc3NhZ2VVSWQpO1xuICAgICAgICAgICAgICAvLyDliKDpmaTmtojotLnov4cgb2ZmbGluZUJ1ZmZlcnMg55qE5raI5oGvXG4gICAgICAgICAgICAgIG9mZmxpbmVCdWZmZXJzID0gb2ZmbGluZUJ1ZmZlcnMuc2xpY2UoZGVsT2ZmbGluZUluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIOWNleiBiuacque7k+adn+mAmuivneWIpOaWrVxuICAgICAgICAgICAgICog5aaC5p6c5raI5oGv5ZyoIDYwcyDlhoXvvIzliKTmlq3mmK/lkKbmnKrmiJDlr7nvvIjlj6rmnIkgaW52aXRlIOaIluWPquaciSBpbnZpdGUg5oiWIHJpbmdpbmcg5oiQ5a+55oqb57uZIOemu+e6v+iusOW9leWZqO+8jOacquaIkOWvueaKm+e7meeKtuaAgeaculxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBpc1VuZmluaXNoZWRQcml2YXRlQ2FsbDogYm9vbGVhbiA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb252ZXJzYXRpb25UeXBlICE9PSBDb252ZXJzYXRpb25UeXBlLlBSSVZBVEUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3QgaXNPbmx5SW52aXRlID0gdGFza01zZ0xpc3QubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgICBjb25zdCBoYXNJbnZpdGVBbmRSaW5naW5nID0gdGFza01zZ0xpc3QuZXZlcnkoKGl0ZW0pID0+IFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nXS5pbmNsdWRlcyhpdGVtLm1lc3NhZ2VUeXBlIGFzIFJDQ2FsbE1lc3NhZ2VUeXBlKSk7XG4gICAgICAgICAgICAgIHJldHVybiBpc09ubHlJbnZpdGUgfHwgaGFzSW52aXRlQW5kUmluZ2luZztcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIOe+pOiBiuacque7k+adn+mAmuivneWIpOaWrVxuICAgICAgICAgICAgICog6YCa6L+HIGxpc3Qg5LitIGludml0ZSDlkowgbWVtYmVyTW9kaWZ5IOa2iOaBr+S4reWPluWHuuaJgOacieWPguS4jumAmuivneeahCB1c2VySWRcbiAgICAgICAgICAgICAqIOmBjeWOhiBsaXN0IOaJvuWHuuaJgOaciSBoYW5ndXAg55qEIHNlbmRVc2VySWRcbiAgICAgICAgICAgICAqICAgICDmgLvkurrmlbAgLSDmjILmlq3kurrmlbAgPiAxICDkuJTliankvZnkurrmlbDljIXlkKvoh6rlt7HvvIzorqTkuLrpgJror53mnKrmjILmlq3ov5vnirbmgIHmnLpcbiAgICAgICAgICAgICAqICAgICDmgLvkurrmlbAgLSDmjILmlq3kurrmlbAgPD0gMSDpgJror53mjILmlq3vvIzov5vnprvnur/mtojmga/lpITnkIblmahcbiAgICAgICAgICAgICAqICAgICDkuLvlj6vnm7TmjqXmjILmlq3kuJTlhbbku5bkurrmnKrmjqXlkKznm7TmjqXov5vnprvnur/lpITnkIblmahcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaXNVbmZpbmlzaGVkR3JwQ2FsbDogYm9vbGVhbiA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb252ZXJzYXRpb25UeXBlICE9PSBDb252ZXJzYXRpb25UeXBlLkdST1VQKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGxldCBpc1VuZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbGV0IG5vT25lQWNjZXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbGV0IGFsbFVzZXJJZHMgPSBbc2VuZGVyVXNlcklkLCAuLi5pbnZpdGVVc2VySWRzXTtcbiAgICAgICAgICAgICAgbGV0IGlzQ2FsbGVySHVuZ3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFza01zZ0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogdGFza01zZ1NlbmRlclVzZXJJZCwgbWVzc2FnZVR5cGUgfSA9IHRhc2tNc2dMaXN0W2ldO1xuICAgICAgICAgICAgICAgIC8vIOWPquimgeiHquW3seaMguaWreebtOaOpei3s+WHuuW+queOr++8jOi/m+emu+e6v+a2iOaBr1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXAgJiYgdGFza01zZ1NlbmRlclVzZXJJZCA9PT0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOaJvuWHuuaJgOacieaMguaWreeahOS6uuWRmO+8jOS7peWPiumAmuivneWPkei1t+iAheaYr+WQpuaMguaWrVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXApIHtcbiAgICAgICAgICAgICAgICAgIGlzQ2FsbGVySHVuZ3VwID0gc2VuZGVyVXNlcklkID09PSB0YXNrTXNnU2VuZGVyVXNlcklkO1xuICAgICAgICAgICAgICAgICAgYWxsVXNlcklkcyA9IGFsbFVzZXJJZHMuZmlsdGVyKChpZCkgPT4gdGFza01zZ1NlbmRlclVzZXJJZCAhPT0gaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliKTmlq3mmK/lkKbml6DkurrmjqXlkKxcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0KSB7XG4gICAgICAgICAgICAgICAgICBub09uZUFjY2VwdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyDkuI3mmK/kuLvlj6vmjILmlq3kuJTml6DkurrmjqXlkKzvvIzkuJTliankvZnkurrmlbDlpKfkuo4gMVxuICAgICAgICAgICAgICBpZiAoIShub09uZUFjY2VwdCAmJiBpc0NhbGxlckh1bmd1cCkgJiYgYWxsVXNlcklkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgaXNVbmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gaXNVbmZpbmlzaGVkO1xuICAgICAgICAgICAgfSkoKTtcblxuICAgICAgICAgICAgaWYgKGlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2ICYmIChpc1VuZmluaXNoZWRQcml2YXRlQ2FsbCB8fCBpc1VuZmluaXNoZWRHcnBDYWxsKSkge1xuICAgICAgICAgICAgICB0YXNrTXNnTGlzdC5mb3JFYWNoKHRoaXMuX29uUmVjdk9ubGluZUNhbGxNc2csIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2ZmbGluZVJlY29yZGVyLm9uUmVjdk9mZmxpbmVNc2dzKHRhc2tNc2dMaXN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2ICYmIHRoaXMuX2dldFN0YXRlTWFjaGluZShpbnZpdGVDYWxsSWQpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX29uUmVjdk9ubGluZUNhbGxNc2cob2ZmbGluZUJ1ZmZlcnNbMF0ubXNnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSB1bmV4Y2VwdGVkIG9mZmxpbmUgbXNnIC0+ICR7SlNPTi5zdHJpbmdpZnkob2ZmbGluZUJ1ZmZlcnNbMF0ubXNnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZmxpbmVCdWZmZXJzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChvZmZsaW5lQnVmZmVycy5sZW5ndGggPiAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWcqOe6v+a2iOaBr+WkhOeQhumAu+i+kVxuICAgICAgICBidWZmZXJzLmZvckVhY2goKHsgbXNnIH0pID0+IHtcbiAgICAgICAgICB0aGlzLl9vblJlY3ZPbmxpbmVDYWxsTXNnKG1zZyEpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8g5om+5Ye6IG1zZ0J1ZmZlckxpc3Qg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgIGNvbnN0IGRlbENvdW50ID0gYnVmZmVycy5sZW5ndGg7XG4gICAgICAgIC8vIOWIoOmZpOa2iOi0uei/h+eahOa2iOaBr1xuICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LnNwbGljZSgwLCBkZWxDb3VudCk7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGB0aW1lciBvbmxpbmUgbXNnIGhhbmRsZSAtPiBkZWxDb3VudDogJHtkZWxDb3VudH0gbXNnQnVmZmVyTGlzdDogJHt0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aH1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gZmFsc2U7XG4gICAgICB0aGlzLl9oYW5kbGVCdWZmZXJNc2dzKCk7XG4gICAgfSwgMjApO1xuICB9XG5cbiAgcmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJTXNnTGlzdGVuZXIpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3dhdGNoZXJzLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZWdpc3RlclN0YXRlTWFjaGluZUV2ZW50KGNhbGxJZDogc3RyaW5nLCBmdW5jTmFtZTogTXNnTGlzdGVuZXJLZXlzLCBldmVudDogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgZXZlbnRUeXBlID0gY2FsbElkICsgZnVuY05hbWU7XG4gICAgc3VwZXIub24oZXZlbnRUeXBlLCBldmVudCk7XG4gIH1cblxuICB1bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQoY2FsbElkOiBzdHJpbmcpIHtcbiAgICBbJ29uUmluZ2luZycsICdvbkFjY2VwdCcsICdvbkh1bmd1cCcsICdvbk1lZGlhTW9kaWZ5J10uZm9yRWFjaCgoZnVuY05hbWUpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNhbGxJZCArIGZ1bmNOYW1lO1xuICAgICAgc3VwZXIucmVtb3ZlQWxsKGV2ZW50VHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3RlclVzZXJJbmZvKHVzZXJJbmZvOiBJVXNlclByb2ZpbGUpIHtcbiAgICB0aGlzLl91c2VySW5mbyA9IHVzZXJJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgSBJTSDmtojmga9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRDYWxsTWVzc2FnZShvcHRpb25zOiBJQ2FsbE1zZ09wdGlvbik6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIG1lc3NhZ2U/OiBJUmVjZWl2ZWRNZXNzYWdlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzZW5kQ2FsbE1lc2FnZSAtPiBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWApO1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNvbnRlbnQsIG1lc3NhZ2VUeXBlLCBkaXJlY3Rpb25hbFVzZXJJZExpc3QsIHB1c2hDb25maWcsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2VuZE9wdHM6IElTZW5kTXNnT3B0aW9ucyA9IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIG1lc3NhZ2VUeXBlLFxuICAgICAgY29udGVudCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdCxcbiAgICB9O1xuXG4gICAgaWYgKFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSkpIHtcbiAgICAgIGNvbnN0IG5ld1B1c2hDb25maWcgPSBwdXNoQ29uZmlnIHx8IHsgcHVzaFRpdGxlOiAnJywgcHVzaENvbnRlbnQ6ICcnLCBwdXNoRGF0YTogJycgfTtcbiAgICAgIG5ld1B1c2hDb25maWcuYW5kcm9pZENvbmZpZyA9IE9iamVjdC5hc3NpZ24ocHVzaENvbmZpZz8uYW5kcm9pZENvbmZpZyB8fCB7fSwge1xuICAgICAgICBjYXRlZ29yeUhXOiAnVk9JUCcsXG4gICAgICAgIGNhdGVnb3J5Vml2bzogJ0lNJyxcbiAgICAgIH0pO1xuICAgICAgbmV3UHVzaENvbmZpZy5pT1NDb25maWcgPSBPYmplY3QuYXNzaWduKG5ld1B1c2hDb25maWcuaU9TQ29uZmlnIHx8IHt9LCB7XG4gICAgICAgIGFwbnNDb2xsYXBzZUlkOiBjb250ZW50LmNhbGxJZCxcbiAgICAgIH0pO1xuICAgICAgbmV3UHVzaENvbmZpZy5kaXNhYmxlUHVzaFRpdGxlID0gZmFsc2U7XG4gICAgICBuZXdQdXNoQ29uZmlnLmZvcmNlU2hvd0RldGFpbENvbnRlbnQgPSBmYWxzZTtcbiAgICAgIHNlbmRPcHRzLnB1c2hDb25maWcgPSBuZXdQdXNoQ29uZmlnIGFzIElFbmdpbmVQdXNoQ29uZmlnO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIGRhdGE6IG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NvbnRleHQuc2VuZE1lc3NhZ2UoY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIHNlbmRPcHRzKTtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIGVycm9yIC0+IGNvZGU6ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IEVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZVtjb2RlXSB8fCBSQ0NhbGxFcnJvckNvZGUuU0VORF9NU0dfRVJST1IsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgbWVzc2FnZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgemCgOivt+a2iOaBr1xuICAgKi9cbiAgYXN5bmMgc2VuZEludml0ZShvcHRpb25zOiBJSW52aXRlTXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvb21UeXBlLCBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgaW52aXRlVXNlcklkcywgZXh0cmEsIHB1c2hDb25maWcsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCAnQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzZW5kQ2FsbE1lc2FnZSBzZW5kSW52aXRlJywgSlNPTi5zdHJpbmdpZnkob3B0aW9ucykpO1xuICAgIHRoaXMuX3dhdGNoZXJzLnNlbmRBY2NlcHQgJiYgdGhpcy5fd2F0Y2hlcnMuc2VuZEFjY2VwdCh7IGNhbGxJZCB9KTtcbiAgICBjb25zdCBjb250ZW50OiBJSW52aXRlTXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICByb29tVHlwZSxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5naW5lVHlwZTogNCxcbiAgICAgIGNoYW5uZWxJbmZvOiB7IElkOiBjYWxsSWQsIEtleTogJycgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZHMsXG4gICAgICBvYnNlcnZlclVzZXJJZHM6IFtdLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgfTtcblxuICAgIGlmIChwdXNoQ29uZmlnKSB7XG4gICAgICBwdXNoQ29uZmlnLnB1c2hEYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHVzZXJJZExpc3Q6IGludml0ZVVzZXJJZHMsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCA/IGludml0ZVVzZXJJZHMgOiBbdGFyZ2V0SWRdLFxuICAgICAgcHVzaENvbmZpZyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICovXG4gIGFzeW5jIHNlbmRNZW1lYmVyTW9kaWZ5KG9wdGlvbnM6IElNZW1iZXJNb2RpZnlNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIGludml0ZVVzZXJJZHMsIGNhbGxlcklkLFxuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLCBkaXJlY3Rpb25hbFVzZXJJZExpc3QsIGV4dHJhLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElNZW1iZXJNb2RpZnlNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQiwgLy8gVE9ETyDkuI4gSU0g5LiA6Ie0XG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBleHRyYSxcbiAgICAgIGVuZ2luZVR5cGU6IDQsXG4gICAgICBjaGFubmVsSW5mbzogeyBJZDogY2FsbElkLCBLZXk6ICcnIH0sXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzLFxuICAgICAgb2JzZXJ2ZXJVc2VySWRzOiBbXSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgICAgY2FsbGVyOiBjYWxsZXJJZCxcbiAgICAgIG1vZGlmeU1lbVR5cGU6IE1lbWJlck1vZGlmeVR5cGUuQURELFxuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLFxuICAgIH07XG5cbiAgICBpZiAocHVzaENvbmZpZykge1xuICAgICAgcHVzaENvbmZpZy5wdXNoRGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICB1c2VySWRMaXN0OiBpbnZpdGVVc2VySWRzLFxuICAgICAgICBjYWxsSWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0LFxuICAgICAgcHVzaENvbmZpZyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlk43pk4Pmtojmga9cbiAgICovXG4gIHNlbmRSaW5naW5nKG9wdGlvbnM6IElSaW5naW5nTXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJUmluZ2luZ01zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuX2RldmljZUlkLFxuICAgICAgY2FsbElkLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeWQjOaEj+aOpeWQrOa2iOaBr1xuICAgKi9cbiAgc2VuZEFjY2VwdChvcHRpb25zOiBJQWNjZXB0TXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCB1c2VySWRzLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElBY2NlcHRNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0LFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeaMguaWrea2iOaBr1xuICAgKi9cbiAgc2VuZEh1bmd1cChvcHRpb25zOiBJSHVuZ3VwTXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgcmVhc29uLCB1c2VySWRzLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElIdW5ndXBNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJlYXNvbixcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG5cbiAgICBpZiAocHVzaENvbmZpZykge1xuICAgICAgcHVzaENvbmZpZy5wdXNoRGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2FsbElkLCByZWFzb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXAsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeWqkuS9k+WPmOabtOa2iOaBr1xuICAgKi9cbiAgc2VuZE1lZGlhTW9kaWZ5KG9wdGlvbnM6IElNZWRpYU1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJTWVkaWFNb2RpZnlNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWEsXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3Q6IHVzZXJJZHMsXG4gICAgfSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbExhbmd1YWdlIHtcbiAgWkggPSAnemgnLFxuICBFTiA9ICdlbidcbn1cbiIsImV4cG9ydCBjb25zdCBFTiA9IHtcbiAgUHVzaFRpdGxlOiB7XG4gICAgQVVESU86ICdZb3UgaGF2ZSBhIHZvaWNlIGNhbGwnLFxuICAgIFZJREVPOiAnWW91IGhhdmUgYSB2aWRlbyBjYWxsJyxcbiAgfSxcbn07XG4iLCJleHBvcnQgY29uc3QgWkggPSB7XG4gIFB1c2hUaXRsZToge1xuICAgIEFVRElPOiAn5oKo5pyJ5LiA5p2h6Z+z6aKR6YCa6K+dJyxcbiAgICBWSURFTzogJ+aCqOacieS4gOadoeinhumikemAmuivnScsXG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxMYW5nJztcbmltcG9ydCB7IEVOIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyBaSCB9IGZyb20gJy4vemgnO1xuXG4vKipcbiAqIENhbGxFbmdpbmUg5YWo5bGA6K+t6KiA6K6+572u77yM5b2T5YmN5LuF5pSv5oyB5Lit44CB6Iux5paHXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbCB7XG4gIHN0YXRpYyBfbGFuZzogUkNDYWxsTGFuZ3VhZ2UgPSBSQ0NhbGxMYW5ndWFnZS5aSFxuXG4gIHN0YXRpYyBzZXQobGFuZzogUkNDYWxsTGFuZ3VhZ2UpIHtcbiAgICB0aGlzLl9sYW5nID0gbGFuZztcbiAgfVxuXG4gIHN0YXRpYyBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX2xhbmcgPT09IFJDQ2FsbExhbmd1YWdlLkVOKSB7XG4gICAgICByZXR1cm4gRU47XG4gICAgfVxuICAgIHJldHVybiBaSDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQmFzaWNMb2dnZXIsIENvbnZlcnNhdGlvblR5cGUsIElSZWNlaXZlZE1lc3NhZ2UsIElSdW50aW1lLCBSVENQbHVnaW5Db250ZXh0LFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSBmcm9tICcuL2NvcmUvU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7XG4gIElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMsIElFbmRTdW1tYXJ5LCBJSW52aXRlZFVzZXJzLCBJTWVkaWFNb2RpZnlJbmZvLCBJTWVtYmVyTW9kaWZ5SW5mbywgSVNlbmRlckluZm8sIElTdGF0ZUNoYW5nZUluZm8sIElVc2VyUHJvZmlsZSwgSVVzZXJTdGF0ZUNoYW5nZUluZm8sIElVc2VyRGF0YSwgSUludml0ZU9wdGlvbnMsXG59IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lTdGF0ZU1hY2hpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgUkNDYWxsVXNlclN0YXRlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uU3RhdGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbEVuZFJlYXNvbiB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbE1lZGlhVHlwZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL2NvcmUvTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZW5lcmF0ZVJhbmRvbUlkLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxMYW5ndWFnZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxMYW5nJztcbmltcG9ydCB7IElDYWxsRW5naW5lT3B0aW9ucywgSUNhbGxFbmdpbmVXYXRjaGVycyB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElJbnZpdGVNc2dDb250ZW50IH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IExvY2FsIH0gZnJvbSAnLi9jb3JlL2xvY2FsZSc7XG5pbXBvcnQgeyBJT2ZmbGluZVJlY29yZCB9IGZyb20gJy4vY29yZS9PZmZsaW5lUmVjb3JkZXInO1xuaW1wb3J0IHsgUkNDcm9zc0NhbGxUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZSc7XG5pbXBvcnQgeyBJUHVzaENvbmZpZyB9IGZyb20gJy4uL3NyYy9pbnRlcmZhY2UnO1xuXG5jbGFzcyBSQ0NhbGxFbmdpbmUge1xuICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IHsgW2NhbGxJZDogc3RyaW5nXTogUkNDYWxsU3RhdGVNYWNoaW5lIH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxNc2dIYW5kbGVyOiBDYWxsTWVzc2FnZUhhbmRsZXJcblxuICAvKipcbiAgICog5Yid5aeL5YyWXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBlbmdpbmUgUGxndWluQ29udGV4dCDlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIC8qKlxuICAgICAqIOi/kOihjOaXtuebuOWFs1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSDml6Xlv5fmqKHlnZflrp7kvovvvIznlLEgQ2FsbExpYiDlsYLliJ3lp4vljJZcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOebkeWQrOaWueazlVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3dhdGNoZXJzOiBJQ2FsbEVuZ2luZVdhdGNoZXJzLFxuICAgIC8qKlxuICAgICAqIOWFtuS7lumFjee9rumhuVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IElDYWxsRW5naW5lT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIFZlcnNpb246ICR7X19WRVJTSU9OX199IENvbW1pdElkOiAke19fQ09NTUlUX0lEX199YCk7XG4gICAgLy8g6K6+572uIERldmljZUlkXG4gICAgZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDnm5HlkKwgSU0g5raI5oGvXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIgPSBuZXcgQ2FsbE1lc3NhZ2VIYW5kbGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwgdGhpcy5fb3B0aW9ucy5vZmZsaW5lTXNnSXR2LCB0aGlzLl9nZXRTdGF0ZU1hY2hpbmUuYmluZCh0aGlzKSk7XG4gICAgLy8g5rOo5YaM5raI5oGv5qih5Z2X55uR5ZCsXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJFdmVudExpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgc2VuZEFjY2VwdDogdGhpcy5faGFuZGxlU2VuZEFjY2VwdC5iaW5kKHRoaXMpLFxuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQsXG4gICAgfSk7XG4gICAgLy8g55uR5ZCs54q25oCB5py65YWz6ZetXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdvblN0YXRlTWFjaGluZUNsb3NlJywgKGNhbGxJZDogc3RyaW5nKSA9PiB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgfSk7XG4gICAgLy8g6K6+572u6K+t6KiAXG4gICAgTG9jYWwuc2V0KF9vcHRpb25zLmxhbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25JbnZpdGUobXNnOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIHNlbmRlclVzZXJJZDogc3VpZCwgcHVzaENvbmZpZyxcbiAgICB9ID0gbXNnO1xuICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYFJDQ2FsbEVuZ2luZSBfb25JbnZpdGU6dGFyZ2V0SWQgJHt0YXJnZXRJZH0gc2VuZGVyVXNlcklkOiAke3N1aWR9YCk7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWFUeXBlLCBjYWxsSWQsIGV4dHJhLCByb29tVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJSW52aXRlTXNnQ29udGVudDtcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlICE9PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBzZW5kZXJVc2VySWQgPSBzdWlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBjb25zdCBjcnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpID09PSBzZW5kZXJVc2VySWQpIHsgLy8g5aSa56uv5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog576k6IGK6YCa6K+d5pyJ5YW25LuW56uv5aSE55CG5pe277yM5LiN5YaN5aSE55CG5q2k6YCa6K+d5Lit55qE6YKA6K+35raI5oGvXG4gICAgICog5p2h5Lu2MTog5q2k5Lq65bey6KKr6YKA6K+36YCa6K+dXG4gICAgICog5p2h5Lu2Mjog5pys56uv5peg5q2k6YCa6K+d55qE54q25oCB5py6XG4gICAgICovXG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgY29uc3QgaXNLZWVwaW5nID0gY29udGVudC5leGlzdGVkVXNlclBvZmlsZXMuc29tZSgoaXRlbTogeyB1c2VySWQ6IHN0cmluZyB9KSA9PiAoaXRlbS51c2VySWQgPT09IGNydFVzZXJJZCkpO1xuICAgICAgaWYgKGlzS2VlcGluZyAmJiAhdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlTWFjaGluZSA9IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdO1xuICAgIGlmICghc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICAgIGNoYW5uZWxJZCEsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgICk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsRW5naW5lXSBSQ0NhbGxTdGF0ZU1hY2hpbmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgLT4gY2FsbElkOiAke2NhbGxJZH1gKTtcblxuICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSkge1xuICAgICAgICAvLyDnirbmgIHmnLrlhoXpg6jlpITnkIYgaW52aXRlIOa2iOaBr1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uSW52aXRlKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uTWVtYmVyTW9kaWZ5KG1zZyk7XG4gICAgICB9XG4gICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSh0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSwgZXh0cmEpO1xuXG4gICAgICBjb25zdCBoYXNPdGhlclN0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkuZmlsdGVyKChvdGhlckNhbGxJZCkgPT4gY2FsbElkICE9PSBvdGhlckNhbGxJZCkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChoYXNPdGhlclN0YXRlTWFjaGluZSAmJiAhKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwgfHwgZmFsc2UpKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9faGFuZGxlSW52aXRlSW5TZXNzaW9uKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0pIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5YWB6K645o6l5ZCs5paw55qE6YCa6K+d5pe277yM5o6l5ZCs5a6M5paw55qE6YCa6K+d5ZCO77yM5oyC5pat5YW25LuW6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVTZW5kQWNjZXB0KGluZm86IHsgY2FsbElkOiBzdHJpbmcgfSkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dBY2NlcHROZXdDYWxsKSB7XG4gICAgICBjb25zdCB7IGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc3RhdGVNYWNoaW5lKSB7XG4gICAgICAgIGlmIChjYWxsSWQgIT09IGlkKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXS5odW5ndXAoKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlueKtuaAgeaculxuICAqL1xuICBwcml2YXRlIF9nZXRTdGF0ZU1hY2hpbmUoY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM55So5oi35L+h5oGvLCDlj5HpgIEgY2FsbCDmtojmga/ml7bnlKjmiLfkv6Hmga/mkLrluKZcbiAgICovXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSByZWdpc3RlclVzZXJJbmZvIC0+IHVzZXJJbmZvOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJbmZvKX1gKTtcblxuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyVXNlckluZm8odXNlckluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvFxuICAgKiBAcGFyYW0gY2hhbm5lbElkIOe7hOe7hyBJRFxuICAgKiBAcGFyYW0gdGFyZ2V0SWQgIOWvueaWuSBJRFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoQ29uZmlnIOaOqOmAgemFjee9rlxuICAgKi9cbiAgYXN5bmMgY2FsbChcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogbnVtYmVyLFxuICAgIGV4dHJhOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29uZmlnOiBJUHVzaENvbmZpZyxcbiAgICBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UsXG4gICk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHN0YXRlTWFjaGluZT86IFJDQ2FsbFN0YXRlTWFjaGluZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIGNhbGwgLT4gYXJnczogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoQ29uZmlnLFxuICAgIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQsXG4gICAgKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fY2FsbChbdGFyZ2V0SWRdLCBleHRyYSwgcHVzaENvbmZpZywgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyxcbiAgICAgICAgc3RhdGVNYWNoaW5lOiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICogQHBhcmFtIGNoYW5uZWxJZCDnu4Tnu4cgSURcbiAgICogQHBhcmFtIHRhcmdldElkICDnvqTnu4QgSURcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDlqpLkvZPnsbvlnotcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+35Lq65ZGY5YiX6KGoXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hDb25maWcg5o6o6YCB6YWN572uXG4gICAqL1xuICBhc3luYyBjYWxsSW5Hcm91cChcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogbnVtYmVyLFxuICAgIHVzZXJJZHM6IHN0cmluZ1tdLFxuICAgIGV4dHJhOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29uZmlnOiBJUHVzaENvbmZpZyxcbiAgKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc3RhdGVNYWNoaW5lPzogUkNDYWxsU3RhdGVNYWNoaW5lIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbEVuZ2luZV0gY2FsbEluR3JvdXAgLT4gYXJnczogJHtKU09OLnN0cmluZ2lmeSh7IGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSB9KX1gKTtcbiAgICBjb25zdCBjYWxsSWQgPSBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgY29uc3QgaGFzU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNTdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVEFURV9NQUNISU5FX0VYSVQgfTtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0gPSBuZXcgUkNDYWxsU3RhdGVNYWNoaW5lKFxuICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIENvbnZlcnNhdGlvblR5cGUuR1JPVVAsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGNhbGxJZCxcbiAgICApO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19jYWxsKHVzZXJJZHMsIGV4dHJhLCBwdXNoQ29uZmlnKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLFxuICAgICAgICBzdGF0ZU1hY2hpbmU6IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmUgOavgeW9k+WJjeeahOeKtuaAgeaculxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbEVuZ2luZV0gZGVzdHJveScpO1xuICAgIHRoaXMuX3N0YXRlTWFjaGluZSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFJDQ2FsbEVuZ2luZSxcbiAgUkNDYWxsU3RhdGVNYWNoaW5lLCBSQ0NhbGxFcnJvckNvZGUsXG4gIFJDQ2FsbFVzZXJTdGF0ZSxcbiAgUkNDYWxsU2Vzc2lvblN0YXRlLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbE1lZGlhVHlwZSxcbiAgUkNDYWxsTGFuZ3VhZ2UsXG59O1xuXG5leHBvcnQgdHlwZSB7XG4gIElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMsIElFbmRTdW1tYXJ5LFxuICBJQ2FsbEVuZ2luZVdhdGNoZXJzLFxuICBJVXNlclN0YXRlQ2hhbmdlSW5mbyxcbiAgSVN0YXRlQ2hhbmdlSW5mbyxcbiAgSVNlbmRlckluZm8sXG4gIElNZW1iZXJNb2RpZnlJbmZvLFxuICBJTWVkaWFNb2RpZnlJbmZvLFxuICBJSW52aXRlZFVzZXJzLFxuICBJVXNlckRhdGEsXG4gIElVc2VyUHJvZmlsZSxcbiAgSU9mZmxpbmVSZWNvcmQsXG4gIElJbnZpdGVPcHRpb25zLFxufTtcbiIsIi8qKlxuICog5Lqn55Sfc2Vzc2lvbueahOWcuuaZr1xuICovXG5leHBvcnQgZW51bSBQcm9kdWNlVHlwZXMge1xuICAvKipcbiAgICog5Li75Y+rXG4gICAqL1xuICBDQUxMRVIgPSAxLFxuXG4gIC8qKlxuICAgKiDooqvlj6tcbiAgICovXG4gIENBTExFRSA9IDJcbn1cbiIsImNsYXNzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgbGlzdDoge1twcm9wTmFtZTogc3RyaW5nXTogYW55W119ID0ge31cblxuICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgZnVuOihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgKHRoaXMubGlzdFtldmVudF0gfHwgKHRoaXMubGlzdFtldmVudF0gPSBbXSkpLnB1c2goZnVuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGZ1bjooZGF0YT86YW55KT0+dm9pZCkge1xuICAgIGNvbnN0IG9uID0gKGRhdGE/OmFueSkgPT4ge1xuICAgICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcbiAgICAgIGZ1bi5jYWxsKHRoaXMsIGRhdGEpO1xuICAgIH07XG4gICAgb24uZnVuID0gZnVuO1xuICAgIHRoaXMub24oZXZlbnQsIG9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgZnVuPzooZGF0YT86YW55KT0+dm9pZCkge1xuICAgIGNvbnN0IGZ1bnMgPSB0aGlzLmxpc3RbZXZlbnRdO1xuICAgIGlmICghZnVucykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWZ1bikge1xuICAgICAgLy8g5aaC5p6c5rKh5pyJ5LygIGZuIOeahOivne+8jOWwseS8muWwhiBldmVudCDlgLzlr7nlupTnvJPlrZjliJfooajkuK3nmoQgZnVuIOmDvea4heepulxuICAgICAgZnVucyAmJiAoZnVucy5sZW5ndGggPSAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6Iul5pyJIGZ1bu+8jOmBjeWOhue8k+WtmOWIl+ihqO+8jOeci+eci+S8oOWFpeeahCBmbiDkuI7lk6rkuKrlh73mlbDnm7jlkIzvvIzlpoLmnpznm7jlkIzlsLHnm7TmjqXku47nvJPlrZjliJfooajkuK3liKDmjonljbPlj69cbiAgICAgIGxldCBjYjtcbiAgICAgIGZvciAobGV0IGkgPSAwLCB7IGxlbmd0aCB9ID0gZnVuczsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNiID0gZnVuc1tpXTtcbiAgICAgICAgaWYgKGNiID09PSBmdW4gfHwgY2IuZnVuID09PSBmdW4pIHtcbiAgICAgICAgICBmdW5zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGRhdGE/OmFueSkge1xuICAgIC8vIOesrOS4gOS4quWPguaVsOaYr+WvueW6lOeahCBldmVudCDlgLzvvIznm7TmjqXnlKjmlbDnu4TnmoQgc2hpZnQg5pa55rOV5Y+W5Ye6XG4gICAgY29uc3QgZnVucyA9IFsuLi50aGlzLmxpc3RbZXZlbnRdXTtcblxuICAgIC8vIOWmguaenOe8k+WtmOWIl+ihqOmHjOayoeaciSBmdW4g5bCx6L+U5ZueIGZhbHNlXG4gICAgaWYgKCFmdW5zIHx8IGZ1bnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIOmBjeWOhiBldmVudCDlgLzlr7nlupTnmoTnvJPlrZjliJfooajvvIzkvp3mrKHmiafooYwgZm5cbiAgICBmdW5zLmZvckVhY2goKGZ1bikgPT4ge1xuICAgICAgZnVuLmNhbGwodGhpcywgZGF0YSk7XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIEV2ZW50RW1pdHRlcixcbn07XG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgbmV3IEV2ZW50RW1pdHRlcigpO1xuIiwiaW1wb3J0IHtcbiAgUlRDSm9pblR5cGUsIExvZ0wsIGlzVW5kZWZpbmVkLCBpc0Jvb2xlYW4sIGlzU3RyaW5nLCBJaU9TUHVzaENvbmZpZyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IFJDUmVzb2x1dGlvbiB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5cbmltcG9ydCB7XG4gIElTZXNzaW9uTGlzdGVuZXIsIElSQ0NhbGxJbml0T3B0aW9ucywgSVZhbGlkYXRpb25SZXN1bHQsIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCBJUHVzaENvbmZpZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5mdW5jdGlvbiBpc0xhbmd1YWdlKHZhbDogc3RyaW5nKSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBPYmplY3QudmFsdWVzKFJDQ2FsbExhbmd1YWdlKTtcbiAgcmV0dXJuIHZhbHVlcy5pbmNsdWRlcyh2YWwpO1xufVxuXG5mdW5jdGlvbiBpc0pvaW5UeXBlKHZhbDogbnVtYmVyKSB7XG4gIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMoUlRDSm9pblR5cGUpIGFzIG51bWJlcltdO1xuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmZ1bmN0aW9uIGlzTG9nTGV2ZWwodmFsOiBudW1iZXIpIHtcbiAgcmV0dXJuIFtMb2dMLkRFQlVHLCBMb2dMLklORk8sIExvZ0wuV0FSTiwgTG9nTC5FUlJPUl0uaW5jbHVkZXModmFsKTtcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2FsbEluaXRPcHRpb25zID0gKG9wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9ucyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gbWlzc2luZyBwYXJhbWV0ZXIgLT4gb3B0aW9ucycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcgfTtcbiAgfVxuICBjb25zdCBrZXlOYW1lczogc3RyaW5nW10gPSBbJ3J0Y0NsaWVudCcsICdvblNlc3Npb24nLCAnb25TZXNzaW9uQ2xvc2UnXTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgY29uc3QgbWlzc2luZ0tleXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8g5qCh6aqM5aGr6aG55piv5ZCm6YO95YyF5ZCr77yM5aaC5p6c5ZOq5Liq5LiN5YyF5ZCr5bCx5pS26ZuG6LW35p2lXG4gIGtleU5hbWVzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIG1pc3NpbmdLZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIOWmguaenOe8uuWwkeW/heWhq+eahOebkeWQrOWHveaVsOaIluWvueixoVxuICBpZiAobWlzc2luZ0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiBgSW5pdGlhbGl6YXRpb24gbWlzc2luZyBwYXJhbWV0ZXIgLT4gXCIke21pc3NpbmdLZXlzLmpvaW4oJywnKX1cImAgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMucnRjQ2xpZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ3J0Y0NsaWVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ29iamVjdFxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25TZXNzaW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnb25TZXNzaW9uXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zLm9uU2Vzc2lvbkNsb3NlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnb25TZXNzaW9uQ2xvc2VcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hmlzQWxsb3dTdWJzY3JpYmVSZXRyeSDkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnkgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd1N1YnNjcmliZVJldHJ5XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnkgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnkgIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2lzQWxsb3dQdWJsaXNoUmV0cnlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUgIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2lzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9SVENKb2luVHlwZeeahOaemuS4vlxuICBpZiAodHlwZW9mIG9wdGlvbnMuam9pblR5cGUgIT09ICd1bmRlZmluZWQnICYmICFpc0pvaW5UeXBlKG9wdGlvbnMuam9pblR5cGUhKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2pvaW5UeXBlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2lzQWxsb3dEZW1vdGlvbkdldFN0cmVhbVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9SQ0NhbGxMYW5ndWFnZeeahOaemuS4vlxuICBpZiAodHlwZW9mIG9wdGlvbnMubGFuZyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzTGFuZ3VhZ2Uob3B0aW9ucy5sYW5nISkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdsYW5nXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmxvZ091dHB1dExldmVsICE9PSAndW5kZWZpbmVkJyAmJiAhaXNMb2dMZXZlbChvcHRpb25zLmxvZ091dHB1dExldmVsISkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdsb2dPdXRwdXRMZXZlbFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGNvcnJlY3QgdHlwZScgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbi8qKlxuICog5qCh6aqMcmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXLlj4LmlbBcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTGlzdGVuZXIgPSAobGlzdGVuZXI6IElTZXNzaW9uTGlzdGVuZXIpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICghbGlzdGVuZXIpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdtaXNzaW5nIHBhcmFtZXRlciAtPiBsaXN0ZW5lcicgfTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ2xpc3RlbmVyIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG4gIGNvbnN0IGtleU5hbWVzOiBzdHJpbmdbXSA9IFsnb25SaW5naW5nJywgJ29uQWNjZXB0JywgJ29uSHVuZ3VwJywgJ29uVHJhY2tSZWFkeSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGxpc3RlbmVyKTtcbiAgY29uc3QgbWlzc2luZ0tleXM6IHN0cmluZ1tdID0gW107XG4gIGtleU5hbWVzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIG1pc3NpbmdLZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuICBpZiAobWlzc2luZ0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiBgbWlzc2luZyBwYXJhbWV0ZXIgLT4gXCIke21pc3NpbmdLZXlzLmpvaW4oJywnKX1cImAgfTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3RlbmVyLm9uUmluZ2luZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uUmluZ2luZ1xcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25BY2NlcHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvbkFjY2VwdFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25IdW5ndXAgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvbkh1bmd1cFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25UcmFja1JlYWR5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25UcmFja1JlYWR5XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVUYXJnZXRJZCA9ICh0YXJnZXRJZDogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodGFyZ2V0SWQgJiYgdHlwZW9mIHRhcmdldElkID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3RhcmdldElkXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1lZGlhVHlwZSA9IChtZWRpYVR5cGU6IG51bWJlcik6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPIHx8IG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnbWVkaWFUeXBlXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ1JDQ2FsbE1lZGlhVHlwZVxcJycgfTtcbn07XG5leHBvcnQgY29uc3QgdmFsaWRhdGVFeHRyYSA9IChleHRyYTogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIGV4dHJhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2V4dHJhXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hUaXRsZSA9IChwdXNoVGl0bGU6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwdXNoVGl0bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncHVzaFRpdGxlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb250ZW50ID0gKHB1c2hDb250ZW50OiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgcHVzaENvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncHVzaENvbnRlbnRcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuXG4vKipcbiAqIOagoemqjCBwdXNoQ29uZmlnXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb25maWcgPSAocHVzaENvbmZpZzogSVB1c2hDb25maWcpID0+IHtcbiAgY29uc3QgcHVzaENvbmZpZ0tleXMgPSBbJ3B1c2hUaXRsZScsICdwdXNoQ29udGVudCcsICdwdXNoRGF0YScsICdpT1NDb25maWcnLCAnYW5kcm9pZENvbmZpZycsICdkaXNhYmxlUHVzaFRpdGxlJywgJ3RlbXBsYXRlSWQnXTtcbiAgY29uc3Qga2V5SXNSaWdodCA9IE9iamVjdC5rZXlzKHB1c2hDb25maWcpLmV2ZXJ5KChrZXkpID0+IHB1c2hDb25maWdLZXlzLmluY2x1ZGVzKGtleSkpO1xuICBpZiAoIWtleUlzUmlnaHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6IGByaWdodCBrZXk6ICR7cHVzaENvbmZpZ0tleXMuam9pbignLCcpfWAsXG4gICAgfTtcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwdXNoQ29uZmlnS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBrZXkgPSBwdXNoQ29uZmlnS2V5c1tpbmRleF07XG4gICAgLyoqXG4gICAgICog5qCh6aqMIGJvb2xlYW4g57G75Z6LXG4gICAgICovXG4gICAgaWYgKGtleSA9PT0gJ2Rpc2FibGVQdXNoVGl0bGUnKSB7XG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHB1c2hDb25maWdba2V5XSkgJiYgIWlzQm9vbGVhbihwdXNoQ29uZmlnW2tleV0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgJHtrZXl9IHR5cGUgaXMgYm9vbGVhbmAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdwdXNoVGl0bGUnXG4gICAgICB8fCBrZXkgPT09ICd0ZW1wbGF0ZUlkJykge1xuICAgICAgLyoqXG4gICAgICAgKiDmoKHpqowgc3RyaW5nIOexu+Wei1xuICAgICAgICovXG4gICAgICBpZiAocHVzaENvbmZpZ1trZXldICYmICFpc1N0cmluZyhwdXNoQ29uZmlnW2tleV0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgeyBpT1NDb25maWcsIGFuZHJvaWRDb25maWcgfSA9IHB1c2hDb25maWc7XG5cbiAgLyoqXG4gICAqIOagoemqjCBpT1NDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnUmVzID0gdmFsaWRhdGVJT1NDb25maWcoaU9TQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlSU9TQ29uZmlnUmVzLmNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlSU9TQ29uZmlnUmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOagoemqjCBhbmRyb2lkQ29uZmlnXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZUFuZHJvaWRDb25maWdSZXMgPSB2YWxpZGF0ZUFuZHJvaWRDb25maWcoYW5kcm9pZENvbmZpZyB8fCB7fSk7XG4gIGlmICh2YWxpZGF0ZUFuZHJvaWRDb25maWdSZXMuY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVBbmRyb2lkQ29uZmlnUmVzO1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnID0gKGlPU0NvbmZpZzogSWlPU1B1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyB0aHJlYWRJZCwgcmljaE1lZGlhVXJpIH0gPSBpT1NDb25maWcgfHwge307XG4gIGlmICh0aHJlYWRJZCAmJiAhaXNTdHJpbmcodGhyZWFkSWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgIGVycm9yTXNnOiAnaU9TQ29uZmlnLnRocmVhZElkIHR5cGUgaXMgc3RyaW5nJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJpY2hNZWRpYVVyaSAmJiAhaXNTdHJpbmcocmljaE1lZGlhVXJpKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUEFSQU1fRVJST1IsXG4gICAgICBlcnJvck1zZzogJ2lPU0NvbmZpZy5yaWNoTWVkaWFVcmkgdHlwZSBpcyBzdHJpbmcnLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZyA9IChhbmRyb2lkQ29uZmlnOiBhbnkpID0+IHtcbiAgY29uc3QgYW5kcm9pZENvbmZpZ0tleXMgPSBbJ25vdGlmaWNhdGlvbklkJywgJ2NoYW5uZWxJZE1pJywgJ21pTGFyZ2VJY29uVXJsJywgJ2NoYW5uZWxJZEhXJywgJ2NhdGVnb3J5SFcnLCAnaW1wb3J0YW5jZUhXJywgJ2ltYWdlVXJsSFcnLCAnY2hhbm5lbElkT1BQTycsICd0eXBlVml2bycsICdjYXRlZ29yeVZpdm8nLCAnZmNtQ2hhbm5lbElkJywgJ2ZjbUNvbGxhcHNlS2V5JywgJ2ZjbUltYWdlVXJsJywgJ2ltcG9ydGFuY2VIb25vcicsICdpbWFnZVVybEhvbm9yJ107XG4gIGNvbnN0IGtleUlzUmlnaHQgPSBPYmplY3Qua2V5cyhhbmRyb2lkQ29uZmlnKS5ldmVyeSgoa2V5KSA9PiBhbmRyb2lkQ29uZmlnS2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgaWYgKCFrZXlJc1JpZ2h0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgIGVycm9yTXNnOiBgcmlnaHQga2V5OiAke2FuZHJvaWRDb25maWdLZXlzLmpvaW4oJywnKX1gLFxuICAgIH07XG4gIH1cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYW5kcm9pZENvbmZpZ0tleXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3Qga2V5ID0gYW5kcm9pZENvbmZpZ0tleXNbaW5kZXhdO1xuICAgIGlmIChrZXkgPT09ICdpbXBvcnRhbmNlSFcnIHx8IGtleSA9PT0gJ2ltcG9ydGFuY2VIb25vcicpIHtcbiAgICAgIGlmIChhbmRyb2lkQ29uZmlnW2tleV0gJiYgYW5kcm9pZENvbmZpZ1trZXldICE9PSAnTE9XJyAmJiBhbmRyb2lkQ29uZmlnW2tleV0gIT09ICdOT1JNQUwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgYW5kcm9pZENvbmZpZy4ke2tleX0gdmFsdWUgaXMgTk9STUFMfExPV2AsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbmRyb2lkQ29uZmlnW2tleV0gJiYgIWlzU3RyaW5nKGFuZHJvaWRDb25maWdba2V5XSkpIHtcbiAgICAgIC8qKlxuICAgICAgICog5qCh6aqMIHN0cmluZyDnsbvlnotcbiAgICAgICAqL1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICBlcnJvck1zZzogYGFuZHJvaWRDb25maWcuJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVVc2VySWRzID0gKHVzZXJJZHM6IHN0cmluZ1tdKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodXNlcklkcykpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1tdXFwnJyB9O1xuICB9XG4gIGlmICghdXNlcklkcy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1tdXFwnJyB9O1xuICB9XG4gIGlmICghdXNlcklkcy5ldmVyeSgoc3RyKSA9PiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCcgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmZ1bmN0aW9uIGlzUkNGcmFtZVJhdGUodmFsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYXJycyA9IFsnRlBTXzEwJywgJ0ZQU18xNScsICdGUFNfMjQnLCAnRlBTXzMwJ107XG4gIHJldHVybiBhcnJzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmNvbnN0IGlzVmFsaWRSZXNvbHV0aW9uID0gKHJlc29sdXRpb24/OiBSQ1Jlc29sdXRpb24pOiBib29sZWFuID0+ICEhUkNSZXNvbHV0aW9uW3Jlc29sdXRpb24hXTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyA9IChjb25zdHJhaW50czogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB0eXBlb2YgY29uc3RyYWludHMuYXVkaW8ubWljcGhvbmVJZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMuYXVkaW8ubWljcGhvbmVJZFxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB0eXBlb2YgY29uc3RyYWludHMuYXVkaW8uc2FtcGxlUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMuYXVkaW8uc2FtcGxlUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnbnVtYmVyXFwnJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZFxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG4gIC8vIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uZmFjZU1vZGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAndXNlcicgJiYgY29uc3RyYWludHMudmlkZW8uZmFjZU1vZGUgIT09ICdlbnZpcm9ubWVudCcpIHtcbiAgLy8gICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZFxcJyBtdXN0IGJlICBcXCd1c2VyXFwnIG9yIFxcJ2Vudmlyb25tZW50XFwnJyB9XG4gIC8vIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNSQ0ZyYW1lUmF0ZShjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZnJhbWVSYXRlXFwnIHZhbHVlIGlzIG91dCBvZiByYW5nZScgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICd1bmRlZmluZWQnICYmICFpc1ZhbGlkUmVzb2x1dGlvbihjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3Jlc29sdXRpb25cXCcgdmFsdWUgaXMgb3V0IG9mIHJhbmdlJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiAoIWNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSB8fCAhY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbikpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdyZXNvbHV0aW9uXFwnIGFuZCBcXCdyZXNvbHV0aW9uXFwnIGlzIHJlcXVpcmVkJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuIiwiZXhwb3J0IGNvbnN0IHRpbWVyU2V0VGltZW91dCA9IChmdW5jOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKTogbnVtYmVyID0+IHNldFRpbWVvdXQoZnVuYywgdGltZW91dCkgYXMgbnVtYmVyO1xuIiwiaW1wb3J0IHsgdGltZXJTZXRUaW1lb3V0IH0gZnJvbSAnLi9oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgVGltZXIge1xuICBwcml2YXRlIF90aW1lcklkOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwXG5cbiAgY29uc3RydWN0b3IoY2FsbGJhY2s6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3RpbWVySWQgPSB0aW1lclNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIH1cblxuICBzdG9wKCk6IHtcbiAgICBzdGFydFRpbWU6IG51bWJlcixcbiAgICBlbmRUaW1lOiBudW1iZXIsXG4gICAgZHVyYXRpb246IG51bWJlclxuICAgIH0ge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcklkKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBkdXJhdGlvbiA9IGVuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XG4gICAgaWYgKHRoaXMuX3N0YXJ0VGltZSA9PT0gMCkge1xuICAgICAgZHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydFRpbWU6IHRoaXMuX3N0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWUsXG4gICAgICBkdXJhdGlvbixcbiAgICB9O1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udmVyc2F0aW9uVHlwZSwgSUxvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIElNZWRpYU1vZGlmeUluZm8sXG4gIElNZW1iZXJNb2RpZnlJbmZvLFxuICBJU2VuZGVySW5mbyxcbiAgSVN0YXRlQ2hhbmdlSW5mbyxcbiAgSVVzZXJEYXRhLFxuICBJVXNlclN0YXRlQ2hhbmdlSW5mbyxcbiAgSUludml0ZU9wdGlvbnMsXG4gIFJDQ2FsbEVuZFJlYXNvbixcbiAgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbFNlc3Npb25TdGF0ZSxcbiAgUkNDYWxsU3RhdGVNYWNoaW5lLFxuICBSQ0NhbGxVc2VyU3RhdGUsXG59IGZyb20gJ0ByYy1lbWJlZC9jYWxsLWVuZ2luZSc7XG5pbXBvcnQge1xuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgUkNLaWNrUmVhc29uLFxuICBSQ0xvY2FsVHJhY2ssXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNSZW1vdGVWaWRlb1RyYWNrLFxuICBSQ1JUQ0NsaWVudCxcbiAgUkNSVENDb2RlLFxuICBSQ1JUQ1BpbmdSZXN1bHQsXG4gIFJDUlRDUm9vbSxcbiAgSU1pY3Bob25lQXVkaW9Qcm9maWxlLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuXG5pbXBvcnQgeyBQcm9kdWNlVHlwZXMgfSBmcm9tICcuL2VudW1zJztcblxuaW1wb3J0IHtcbiAgSURldmljZUNoYW5nZVBhcmFtcyxcbiAgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsXG4gIElNdXRlVXNlcixcbiAgSVJDQ2FsbFNlc3Npb25PcHRpb25zLFxuICBJU2Vzc2lvbkxpc3RlbmVyLFxuICBJVmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IGV2ZW50RW1pdHRlciBmcm9tICcuL2V2ZW50RW1pdHRlcic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUxpc3RlbmVyLCB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIHZhbGlkYXRlVXNlcklkcywgdmFsaWRhdGVFeHRyYSwgdmFsaWRhdGVQdXNoVGl0bGUsIHZhbGlkYXRlUHVzaENvbnRlbnQsIHZhbGlkYXRlUHVzaENvbmZpZyxcbn0gZnJvbSAnLi92YWxpZGF0aW9uJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi90aW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxTZXNzaW9uIHtcbiAgLyoqXG4gICAqIFJUQ+aIv+mXtOWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSBfcm9vbSE6IFJDUlRDUm9vbVxuXG4gIC8qKlxuICAgKiDnlKjmiLfkvKDov5vmnaXnmoQg5a+5c2Vzc2lvbueahOebkeWQrCAo6KaB5ZyoUkNDYWxsQ2xpZW5055qEX29uSW52aXRl6YeM5Yik5pat77yM6KaB5rGC5omn6KGM5a6Mb25TZXNzaW9u5b+F6aG75rOo5YaMc2Vzc2lvbueahOebkeWQrO+8jOaJgOS7pei/memHjOaYr3B1YmxpYylcbiAgICovXG4gIHB1YmxpYyBfbGlzdGVuZXI6IElTZXNzaW9uTGlzdGVuZXIgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSVEPorqLpmIXjgIHlj5HluIPph43or5XnmoTmrKHmlbBcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX1JFVFJZQ09VTlQ6IG51bWJlciA9IDJcblxuICAvKipcbiAgICog5Yqg5YWl5oi/6Ze05a6a5pe25ZmoXG4gICAqL1xuXG4gIHByaXZhdGUgam9pblJvb21UaW1lcjogYW55ID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yKFxuXG4gICAgLyoqXG4gICAgICog54q25oCB5py65a6e5L6LXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3RhdGVNYWNoaW5lOiBSQ0NhbGxTdGF0ZU1hY2hpbmUsXG5cbiAgICAvKipcbiAgICAgKiBydGPlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydGNDbGllbnQ6IFJDUlRDQ2xpZW50LFxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuXG4gICAgLyoqXG4gICAgICogc2Vzc2lvbueahOWFtuWug+mAiemhuVxuICAgICAqL1xuICAgIHByaXZhdGUgX29wdGlvbnM6IElSQ0NhbGxTZXNzaW9uT3B0aW9ucyA9IHt9LFxuXG4gICkge1xuICAgIC8vIOebkeWQrOeKtuaAgeaculxuICAgIHRoaXMuX3N0YXRlTWFjaGluZS5yZWdpc3RlckV2ZW50TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDnlKjmiLfnirbmgIHlj5jmm7RcbiAgICAgICAqIEBwYXJhbSBpbmZvXG4gICAgICAgKi9cbiAgICAgIG9uVXNlclN0YXRlQ2hhbmdlOiAoeyB1c2VyLCByZWFzb24gfTogSVVzZXJTdGF0ZUNoYW5nZUluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25Vc2VyU3RhdGVDaGFuZ2VdIHVzZXJJZC0+JHt1c2VyPy51c2VySWR9IHN0YXRlLT4ke3VzZXI/LnN0YXRlfSByZWFzb24tPiR7cmVhc29ufWApO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmiL/pl7TnirbmgIHlj5jmm7RcbiAgICAgICAqIEBwYXJhbVxuICAgICAgICovXG4gICAgICBvblN0YXRlQ2hhbmdlOiBhc3luYyAoaW5mbzogSVN0YXRlQ2hhbmdlSW5mbykgPT4ge1xuICAgICAgICBjb25zdCB7IHN0YXRlLCByZWFzb24gfSA9IGluZm87XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIDogc3RhdGUtPiR7c3RhdGV9IHJlYXNvbi0+JHtyZWFzb259YCk7XG5cbiAgICAgICAgLy8g5aaC5p6c5Zyo6YCa6K+d5Lit77yM5bCx5Yqg5oi/6Ze0XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICBjb25zdCByb29tSWQ6IHN0cmluZyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKTtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblN0YXRlQ2hhbmdlXSByb29tSWQ6ICR7cm9vbUlkfWApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDliqDmiL/pl7RcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2pvaW5Sb29tKHJvb21JZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBvblN0YXRlQ2hhbmdlXSBqb2luUm9vbSB0aHJvdyBleGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogIOS7peS4i+S4ieadoeWPquimgea7oei2s+S4gOadoe+8jOeKtuaAgeS8muWPmOaIkFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkRcbiAgICAgICAgICAgKiAgMeOAgeacrOerr+eUqOaIt+iHquW3seS4u+WKqOaMguaWrVxuICAgICAgICAgICAqICAy44CB5pyN5Yqh56uv5oqK5pys56uv55So5oi36Lii5Ye6UlRD5oi/6Ze0XG4gICAgICAgICAgICogIDPjgIHmiL/pl7Tph4zlsI/kuo4y5Liq5Lq6XG4gICAgICAgICAgICovXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQpIHtcbiAgICAgICAgICAvLyDov5jmnKrliqDlhaXmiL/pl7TlsLHmjILmlq1cbiAgICAgICAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgICAgICAgIC8vIOmUgOavgeacrOWcsOa1ge+8jOWFs+mXreaRhOWDj+WktFxuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9kZXN0cm95VHJhY2tzKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpO1xuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpO1xuICAgICAgICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9kZXN0cm95VHJhY2tzKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpO1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIGxvY2FsVHJhY2tzIGRlc3Ryb3llZCcpO1xuICAgICAgICAgIHRoaXMuX2xlYXZlUm9vbSgpO1xuICAgICAgICAgIHRoaXMuX3Jvb20gPSBudWxsIGFzIHVua25vd24gYXMgUkNSVENSb29tO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOWTjemTg1xuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25SaW5naW5nOiAoc2VuZGVyOiBJU2VuZGVySW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblJpbmdpbmddc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIOmAmuefpeeUqOaIt+WTjemTg1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblJpbmdpbmcoc2VuZGVyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25SaW5naW5nXSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uUmluZ2luZycpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAgICog5b2T6L+c56uv55So5oi35ZCM5oSP5o6l5ZCsXG4gICAgICAgICAqL1xuICAgICAgb25BY2NlcHQ6IChzZW5kZXI6IElTZW5kZXJJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uQWNjZXB0XXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l5pys56uv77yM6L+c56uv55So5oi35bey5o6l5ZCsXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uQWNjZXB0KHNlbmRlciwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uQWNjZXB0XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uQWNjZXB0Jyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICAgKiDlvZPmnInov5znq6/nlKjmiLfmjILmlq1cbiAgICAgICAgICovXG4gICAgICBvbkh1bmd1cDogKHNlbmRlcjogSVNlbmRlckluZm8sIHJlYXNvbjogUkNDYWxsRW5kUmVhc29uKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uSHVuZ3VwXXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9IHJlYXNvbi0+JHtyZWFzb259YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l5pys56uv77yM6L+c56uv55So5oi35bey5oyC5patXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uSHVuZ3VwKHNlbmRlciwgcmVhc29uLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25IdW5ndXBdIG1ldGhvZCBleGNlcHRpb24gLT4gb25IdW5ndXAnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDkurrlkZjlj5jmm7RcbiAgICAgICAqIEBwYXJhbSBzZW5kZXIg5Y+R6LW355So5oi35L+h5oGvXG4gICAgICAgKi9cbiAgICAgIG9uTWVtYmVyTW9kaWZ5OiAoeyBzZW5kZXIsIGludml0ZWRVc2VycyB9OiBJTWVtYmVyTW9kaWZ5SW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbk1lbWJlck1vZGlmeV0gc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l55So5oi35Lq65ZGY5Y+Y5pu0XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uTWVtYmVyTW9kaWZ5KHNlbmRlciwgaW52aXRlZFVzZXJzLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25NZW1iZXJNb2RpZnldIG1ldGhvZCBleGNlcHRpb24gLT4gb25NZW1iZXJNb2RpZnknKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDpgJror53nsbvlnovlj5jmm7QgKOmAmuivnemZjee6pylcbiAgICAgICAqIEBwYXJhbSBzZW5kZXIg5Y+R6LW355So5oi35L+h5oGvXG4gICAgICAgKi9cbiAgICAgIG9uTWVkaWFNb2RpZnk6ICh7IHNlbmRlciwgbWVkaWFUeXBlIH06IElNZWRpYU1vZGlmeUluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25NZWRpYU1vZGlmeV1zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfSBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWApO1xuICAgICAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgICAgICAvLyDov5znq6/mlLbliLDpgJror53pmY3nuqfpgJrnn6XlkI7vvIzov5znq6/miafooYzpmY3nuqfpgJror50o5LiN5Y+R5raI5oGvKVxuICAgICAgICAgIHRoaXMuX3NldE1lZGlhVHlwZVRvQXVkaW8oKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vbk1lZGlhTW9kaWZ5KHNlbmRlciwgbWVkaWFUeXBlLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25NZWRpYU1vZGlmeV0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbk1lZGlhTW9kaWZ5Jyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIOaYr+WQpui3qGFwcGtleVxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgY3Jvc3NBcHBrZXk6IChpc0Nyb3NzQXBwa2V5OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGNyb3NzQXBwa2V5XSDmmK/lkKbot6ggYXBwa2V5OiAke2lzQ3Jvc3NBcHBrZXl9YCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMuaXNDcm9zc0FwcGtleSA9IGlzQ3Jvc3NBcHBrZXk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog6K6+572u5oyC5pat55qE5o6o6YCB5L+h5oGvXG4gICAgICovXG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnNldEh1bmd1cFB1c2hDb25maWcodGhpcy5fb3B0aW9ucy5odW5ndXBQdXNoQ29uZmlnIHx8IHsgcHVzaFRpdGxlOiAnJywgcHVzaENvbnRlbnQ6ICcnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICDliqDlhaXmiL/pl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2pvaW5Sb29tKHJvb21JZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgbGV0IGNhbGxCYWNrO1xuICAgIHRyeSB7XG4gICAgICAvLyDliqDmiL/pl7RcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgY2FsbEJhY2sgPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuam9pbkNyb3NzUlRDUm9vbShyb29tSWQsIHRoaXMuX29wdGlvbnMuam9pblR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbEJhY2sgPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuam9pblJUQ1Jvb20ocm9vbUlkLCB0aGlzLl9vcHRpb25zLmpvaW5UeXBlKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBjb2RlLCB1c2VySWRzLCByb29tIH0gPSBjYWxsQmFjaztcblxuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIC8vIOWmguaenOmfs+inhumikeacjeWKoeacquW8gOmAmlxuICAgICAgICBpZiAoY29kZSA9PT0gUkNSVENDb2RlLk5PVF9PUEVOX1ZJREVPX0FVRElPX1NFUlZFUikge1xuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5TRVJWSUNFX05PVF9PUEVORUQpO1xuICAgICAgICAgIC8vIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgICAgICB9IGlmIChjb2RlID09PSBSQ1JUQ0NvZGUuU0lHTkFMX0pPSU5fUlRDX1JPT01fUkVGVVNFRCkge1xuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSU5fQ0FMTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBfam9pblJvb21dIGpvaW4gcm9vbSBmYWlsZWQ6IHJvb21JZCAtPiAke3Jvb21JZH0gUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIOe+pOiBiuacrOerr+WKoOWFpeaIv+mXtOWQju+8jOabtOaWsOS6uuWRmOeKtuaAgeS4uumAmuivneS4rVxuICAgICAgICovXG4gICAgICBjb25zdCBjb252ZXJzYXRpb25UeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENvbnZlcnNhdGlvblR5cGUoKTtcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUgPT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVAgJiYgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJKb2luKFt0aGlzLl9ydGNDbGllbnQuZ2V0Q3VycmVudElkKCldKTtcblxuICAgICAgLyoqXG4gICAgICAgKiDpkojlr7nnp4HmnInkupEgQHJvbmdjbG91ZC9wbHVnaW4tcnRjQDUuMS4xMC1lbnRlcnByaXNlLjcg5aKe5Yqg6KGl5LiB77yMXG4gICAgICAgKiDnp4HmnInkupHljYflrowgUlRDIHNkayDniYjmnKzlkI7liKDmjonmraTooaXkuIFcbiAgICAgICAqIOWKoOWujOaIv+mXtOWQju+8jOWvueaWueaMguaWreS6hu+8jOmcgOmAgOWHuuaIv+mXtFxuICAgICAgICovXG4gICAgICBpZiAodGhpcy5fc3RhdGVNYWNoaW5lLmdldFN0YXRlKCkgPT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbShyb29tISk7XG4gICAgICAgIHRoaXMuX3Jvb20gPSBudWxsIGFzIHVua25vd24gYXMgUkNSVENSb29tO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgICAgfVxuXG4gICAgICAvLyDooqvlj6vmlrnliqDlhaXmiL/pl7TmiJDlip/vvIzkvYbkuLvlj6vmlrnlnKjliqDlhaXmiL/pl7TliY3nprvnur9cbiAgICAgIGlmICh1c2VySWRzIS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRoaXMuam9pblJvb21UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgfSwgNjAwMDApO1xuICAgICAgfVxuICAgICAgdGhpcy5fcm9vbSA9IHJvb20gYXMgUkNSVENSb29tO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2pvaW5Sb29tXSBfcnRjQ2xpZW50LmpvaW5SVENSb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDmiL/pl7TkuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICB0aGlzLl9yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKCk7XG5cbiAgICAvLyDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICB0aGlzLl9yZWdpc3RlclJlcG9ydExpc3RlbmVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8g6K6i6ZiF6L+c56iL55qE5rWB77yM5oqK6L+c56iL55qE5rWB5oqb57uZ55So5oi3XG4gICAgICBhd2FpdCB0aGlzLl9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDnu5PmnZ/pgJror51zZXNzaW9uXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjayBFeGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOW+gOaIv+mXtOmHjOWPkeW4g+acrOWcsOi1hOa6kFxuICAgICAgYXdhaXQgdGhpcy5fcHVibGlzaCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDnu5PmnZ/pgJror51zZXNzaW9uXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUFVCTElTSF9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2pvaW5Sb29tXSBfcHVibGlzaCBFeGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICogKOWIneWni+WMluaIv+mXtOeahOaXtuWAmSkg6K6i6ZiF6L+c56iL55qE5rWB77yM5oqK6L+c56iL55qE5rWB5oqb57uZ55So5oi3XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjaygpIHtcbiAgICAvLyDojrflj5bmiYDmnInov5znqIvlt7Llj5HluIPnmoTpn7Pop4bpopHotYTmupDliJfooahcbiAgICBjb25zdCB0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSA9IHRoaXMuX3Jvb20uZ2V0UmVtb3RlVHJhY2tzKCk7XG4gICAgaWYgKHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3Vic2NyaWJlUmV0cnkodHJhY2tzLCB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSwgdGhpcy5fUkVUUllDT1VOVCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNVQlNDUklCRV9FUlJPUik7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2tdIFJlc291cmNlIHN1YnNjcmlwdGlvbiBmYWlsZWQgcm9vbUlkIC0+ICR7dGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpfSBSVEMgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPr+S7pemHjeivleeahOiuoumYhVxuICAgKiBAcGFyYW0gcGFyYW1zLnRyYWNrcyB0cmFja3NcbiAgICogQHBhcmFtIHBhcmFtcy5pc0FsbG93U3Vic2NyaWJlUmV0cnkg5piv5ZCm5YWB6K646YeN6K+VXG4gICAqIEBwYXJhbSBwYXJhbXMuY291bnQg5YWB6K646YeN6K+V55qE5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zdWJzY3JpYmVSZXRyeSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiBib29sZWFuID0gZmFsc2UsIGNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTx7IGNvZGU6IFJDUlRDQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnN1YnNjcmliZSh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tTdWJzY3JpYmVGYWlsICYmIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrU3Vic2NyaWJlRmFpbChjb2RlLCB0aGlzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbl0gX2xpc3RlbmVyLm9uVHJhY2tTdWJzY3JpYmVGYWlsIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5LiN5YWB6K646YeN6K+V77yM55u05o6l6L+U5ZueXG4gICAgICBpZiAoIWlzQWxsb3dTdWJzY3JpYmVSZXRyeSkge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmVSZXRyeSh0cmFja3MsIGlzQWxsb3dTdWJzY3JpYmVSZXRyeSwgY291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R5biD5pys5Zyw6LWE5rqQ55qE6YC76L6RXG4gICAqXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdWJsaXNoKCkge1xuICAgIGNvbnN0IHRyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MhO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcHVibGlzaFJldHJ5KHRyYWNrcywgdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LCB0aGlzLl9SRVRSWUNPVU5UKTtcblxuICAgIC8vIOiLpei1hOa6kOWPkeW4g+Wksei0pVxuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gX3B1Ymxpc3RdIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiByb29tSWQgLT4gJHt0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCl9IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5piv5Li75Yqo5Y+R6LW355qE5ZG85Y+r77yM5bey5o+Q5YmN5oqb5Ye65LqG6LWE5rqQLCDooqvliqjlkbzlj6vvvIzov5nph4zmiY3pnIDopoHmipvlh7pcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5wcm9kdWNlVHlwZSA9PT0gUHJvZHVjZVR5cGVzLkNBTExFRSkge1xuICAgICAgLy8g5ZCR5aSW5oqb5Ye65pys5Zyw5rWBLCDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPr+S7pemHjeivleeahOWPkeW4g1xuICAgKiBAcGFyYW0gcGFyYW1zLnRyYWNrcyB0cmFja3NcbiAgICogQHBhcmFtIHBhcmFtcy5pc0FsbG93UHVibGlzaFJldHJ5IOaYr+WQpuWFgeiuuOmHjeivlVxuICAgKiBAcGFyYW0gcGFyYW1zLmNvdW50IOWFgeiuuOmHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcHVibGlzaFJldHJ5KHRyYWNrczogUkNMb2NhbFRyYWNrW10sIGlzQWxsb3dQdWJsaXNoUmV0cnk6IGJvb2xlYW4gPSBmYWxzZSwgY291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPHsgY29kZTogUkNSVENDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaCh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tQdWJsaXNoRmFpbCAmJiB0aGlzLl9saXN0ZW5lciEub25UcmFja1B1Ymxpc2hGYWlsKGNvZGUsIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uXSBfbGlzdGVuZXIub25UcmFja1B1Ymxpc2hGYWlsIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5LiN5YWB6K646YeN6K+V77yM55u05o6l6L+U5ZueXG4gICAgICBpZiAoIWlzQWxsb3dQdWJsaXNoUmV0cnkpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVibGlzaFJldHJ5KHRyYWNrcywgaXNBbGxvd1B1Ymxpc2hSZXRyeSwgY291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6YCA5Ye65oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9sZWF2ZVJvb20oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOmAgOWHuuaIv+mXtFxuICAgICAgY29uc3QgY2FsbEJhY2sgPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHRoaXMuX3Jvb20pO1xuICAgICAgLy8g5oiQ5Yqf6YCA5Ye65oi/6Ze077yM6Kem5Y+RUkNDYWxsQ2xpZW505a6e5L6L5LiK55qEb25TZXNzaW9uQ2xvc2Xnm5HlkKzvvIzmipvnu5nnlKjmiLfkv6Hmga9cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9sZWF2ZVJvb21dIFN1Y2Nlc3NmdWxseSBleGl0ZWQgdGhlIHJvb20gY29kZTogJHtjYWxsQmFjay5jb2RlfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gX2xlYXZlUm9vbV0gbGVhdmVSb29tIHRocm93IGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKTtcbiAgICAgIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlh7rnjrDlvILluLjlkI7opoHlpITnkIbnmoTpgLvovpEsXG4gICAqIEBwYXJhbSBlbmRSZWFzb24g5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9leGNlcHRpb25DbG9zZShlbmRSZWFzb246IFJDQ2FsbEVuZFJlYXNvbikge1xuICAgIC8vIOmUgOavgeacrOWcsOa1gVxuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fZGVzdHJveVRyYWNrcyh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKTtcblxuICAgIC8vIOe7k+adn+eKtuaAgeaculxuICAgIHRoaXMuX3N0YXRlTWFjaGluZS5jbG9zZShlbmRSZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+iwg+eUqOeahO+8jOazqOWGjHNlc3Npb27kuIrnmoTnm5HlkKxcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclNlc3Npb25MaXN0ZW5lcihsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIOWFiOagoemqjGxpc3RlbmVyLCDlpoLmnpzkuI3pgJrov4fvvIzkvJp0cm93IGVycm9yXG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxTZXNzaW9uIHJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyXSAke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5lciA9IHsgLi4ubGlzdGVuZXIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDosINSVEMgQVBJIOiOt+W+l+acrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5qOA5rWL5piv5ZCm6IO95aSf6I635b6X5pys5Zyw5rWBXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLmF1ZGlvICYmIHsgLi4uY29uc3RyYWludHMuYXVkaW8gfSk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIHN1Y2Nlc3NmdWxseSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzOiBbdHJhY2shXSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBbmRDYW1lcmFUcmFja3MoJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIHsgLi4uY29uc3RyYWludHMgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBnZXQgQXVkaW8gYW5kIFZpZGVvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19BTkRfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBzdWNjZXNzZnVsbHkgZ2V0IGF1ZGlvIGFuZCB2aWRlbyBsb2NhbCB0cmFja3MnKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOW5tuS4lOaYr+iOt+W+l+mfs+inhumikSwg5bm25LiUIO+8iOWmguaenOiOt+W+l+mfs+inhumikeS4jeaIkOWKn++8jOWFgeiuuOmZjee6p+iOt+W+l+mfs+mike+8iVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTywgY29uc3RyYWludHMpO1xuXG4gICAgICAvLyDlpoLmnpzpn7Pop4bpopHkuI3og73ojrflvpfvvIzlsLHpmY3nuqfojrflvpfpn7PpopFcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBjb25zdHJhaW50cyk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIC8vIOiOt+WPlui1hOa6kOWksei0pe+8jOmcgOimgeiwg+eKtuaAgeacunN0YXRlIOS4uiBlbmRcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUik7XG4gICAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgLy8g6I635Y+W6LWE5rqQ5aSx6LSl77yM6ZyA6KaB6LCD54q25oCB5py6c3RhdGUg5Li6IGVuZFxuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLkdFVF9NRURJQV9SRVNPVVJDRVNfRVJST1IpO1xuXG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBfY29kZSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5pu05o2i6Z+z6aKR6K6+5aSHXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hhbmdlQXVkaW9EZXZpY2UoYXVkaW9Db25zdHJhaW50cz86IElNaWNwaG9uZUF1ZGlvUHJvZmlsZSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIC8vIOaWsOiuvuWkh+eahHRyYWNrXG4gICAgY29uc3QgcmVjZW50VHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgLy8g5pW055CG5ZCO55qE5pys5ZywdHJhY2tcbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soJ1JvbmdDbG91ZFJUQycsIGF1ZGlvQ29uc3RyYWludHMpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGNoYW5nZURldmljZV0gZ2V0IGxvY2FsIEF1ZGlvIHRyYWNrcyBmYWlsZWQgUkNUTGliIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g5LmL5YmN55qE6Z+z6aKR6YO96ZSA5q+B77yM77yIUlRDTGliIFNES+WGhemDqOS8muWcqCBhZGRMb2NhbFRyYWNrIOa4heeQhuWQjOexu+Wei+i9qOmBk+aVsOaNru+8jOaJgOS7pei/memHjOazqOmHiuaOie+8iVxuICAgICAgICAvLyB0cmFjay5kZXN0cm95KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWPquaKiuS5i+WJjeeahOinhumikeeVmeS4i1xuICAgICAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlY2VudFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICAvLyDliqDkuIrmnKzlnLDmlrDkuqfnlJ/nmoTpn7PpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KHJlY2VudFRyYWNrcyk7XG5cbiAgICAvLyDlpoLmnpzlvZPliY3lt7LliqDlhaXmiL/pl7TvvIzlj5HluIPmlrDmtYFcbiAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgLy8g5Y+R5biD5paw5rWBXG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChyZWNlbnRUcmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5BVURJT19QVUJMSVNIX0VSUk9SIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog576k5ZG85Y+r5Lit57un57ut6YKA6K+3XG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+eUqOaItyBJRCDliJfooahcbiAgICogQHBhcmFtIG9wdGlvbnMuZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOW6n+W8gyBvcHRpb25zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg5bqf5byDIG9wdGlvbnMucHVzaENvbnRlbnQg6YCa55+l5YaF5a65XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdLCBvcHRpb25zOiBJSW52aXRlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBleHRyYSA9ICcnIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHB1c2hDb25maWcgPSB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnID8gdGhpcy5fb3B0aW9ucy5jYWxsUHVzaENvbmZpZyA6IG9wdGlvbnMucHVzaENvbmZpZztcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVXNlcklkcyh1c2VySWRzKSwgdmFsaWRhdGVFeHRyYShleHRyYSldO1xuICAgIGlmIChwdXNoQ29uZmlnKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZVB1c2hDb25maWcocHVzaENvbmZpZyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGludml0ZV0gcGFyYW0gZXJyb3IsIGVycm9yTXNnOiAke2Vycm9yTXNnfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGludml0ZV0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZS5pbnZpdGUodXNlcklkcywge1xuICAgICAgZXh0cmEsIHB1c2hDb25maWcsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQjOaEj+aOpeWQrFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjY2VwdChjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMoY29uc3RyYWludHMhKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF0gJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG5cbiAgICAvLyDmjqXlkKzkuYvliY3vvIzlhYjmjILmlq3lvZPliY3kuYvlpJbnmoRzZXNzaW9u77yM546w6Zi25q615LiN5YWB6K6455So5oi35YWI5oup5o6l5ZCsc2Vzc2lvbu+8jOS6i+WFiOS8muWcqOeKtuaAgeacuuWGhemDqOaMguaWre+8jOi/memHjOaKm+WHuuWOu++8jOS8mua4heeQhuWFtuWug+eahHNlZXNpb25cbiAgICBldmVudEVtaXR0ZXIuZW1pdCgnaHVuZ3VwT3RoZXJTZXNzaW9uJywgeyBzZXNzaW9uOiB0aGlzIH0pO1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IHRyYWNrcztcblxuICAgIC8vIOWPkemAgeaOpeWQrOeahOa2iOaBr1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lLmFjY2VwdCgpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF1TZW5kIGFjY2VwdCBtZXNzYWdlIGZhaWxlZCAtPiBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBodW5ndXAoKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZTsgfT4ge1xuICAgIC8vIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKVxuICAgIC8vIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5odW5ndXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53lqpLkvZPlj5jmm7RcbiAgICogIEBwYXJhbSBtZWRpYVR5cGUgUkNDYWxsTWVkaWFUeXBlLkFVRElPIOaUueS4uumfs+mikemAmuivnSB8IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyDmlLnkuLrpn7Pop4bpopHpgJror51cbiAgICovXG4gIHB1YmxpYyBhc3luYyBfY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2NoYW5nZU1lZGlhVHlwZV0gY2hhbmdlIG1lZGlhIHR5cGUgZmFpbCBjb2RlLT4gJHtjb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKRXG4gICAqL1xuICBwcml2YXRlIF9nZXRMb2NhbFZpZGVvVHJhY2tzKCk6IFJDTG9jYWxUcmFja1tdIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2tzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcykge1xuICAgICAgbG9jYWxWaWRlb1RyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNWaWRlb1RyYWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxWaWRlb1RyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDpn7PpopFcbiAgICovXG4gIHByaXZhdGUgX2dldExvY2FsQXVkaW9UcmFja3MoKTogUkNMb2NhbFRyYWNrW10ge1xuICAgIGxldCBsb2NhbEF1ZGlvdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIGxvY2FsQXVkaW90cmFja3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKSB7XG4gICAgICBsb2NhbEF1ZGlvdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvdHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiumAmuivneeahE1lZGlhVHlwZeWNh+e6p+WIsOmfs+inhumikVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2V0TWVkaWFUeXBlVG9BdWRpb0FuZFZpZGVvKCkge1xuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWPkeW4g+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChbdHJhY2shXSk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoX2NvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2VuYWJsZVZpZGVvXSBSZXNvdXJjZSBwdWJsaXNoaW5nIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG5cbiAgICAvLyDlj5Hmtojmga9cbiAgICB0aGlzLl9jaGFuZ2VNZWRpYVR5cGUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiorpgJror53nmoRNZWRpYVR5cGXpmY3nuqfliLDpn7PpopFcbiAgICogQHBhcmFtIGlzU2VuZE1lc3NzYWdlIOaYr+WQpumcgOimgeWPkea2iOaBrywg6buY6K6k5Y+R5raI5oGvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZXRNZWRpYVR5cGVUb0F1ZGlvKCkge1xuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgaWYgKHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnVucHVibGlzaCh0cmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRoaXMuX2Rlc3Ryb3lUcmFja3ModHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d6ZmN57qn77yM55uu5YmN6ZyA5rGC5Y+q5YGa6YCa6K+d6ZmN57qn77yM6Z+z6KeG6aKR5Y+v5Lul6ZmN57qn5Li66Z+z6aKR77yM6Z+z6aKR5LiN6IO95Y2H5Yiw6Z+z6KeG6aKRLCDlj5Hmtojmga/miJDlip/miY3nrpfpmY3nuqfmiJDlip9cbiAgICpcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXNjZW5kQWJpbGl0eSgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NoYW5nZU1lZGlhVHlwZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8pO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6KeG6aKRdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNhYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9UcmFja10gUm9vbSBtaXNzaW5nIHZpZGVvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOinhumikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5tdXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyDlpoLmnpzkuI3pnIDlhbPpl63mkYTlg4/lpLRcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS51bnB1Ymxpc2godHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuVU5QVUJMSVNIX1ZJREVPX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjop4bpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZVZpZGVvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWmguaenOS4jemcgOWFs+mXreaRhOWDj+WktFxuICAgIGlmICghdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUpIHtcbiAgICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJvb20gbWlzc2luZyB2aWRlbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICAvLyDlkK/nlKjop4bpopFcbiAgICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gR2V0IFJlc291cmNlIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTop4bpopHpg73plIDmr4FcbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q55WZ5LiL5LmL5YmN55qE6Z+z6aKRXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5Yqg5LiK5pys5Zyw5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOS4uuS6huinpuWPkeWvueaWueeahG9uVmlkZW9NdXRlQ2hhbmdlIOWFiOemgeeUqFxuICAgIHRyYWNrIS5tdXRlKCk7XG5cbiAgICAvLyDlj5HluIPmnKznq6/op4bpopHotYTmupBcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2goW3RyYWNrIV0pO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKF9jb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlZJREVPX1BVQkxJU0hfRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlkK/nlKhcbiAgICB0cmFjayEudW5tdXRlKCk7XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCkge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxBdWRpb1RyYWNrcygpO1xuXG4gICAgLy8g56aB55So6Z+z6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZUF1ZGlvVHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk7XG5cbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWQr+eUqOmfs+mikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay51bm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgX2Rlc3Ryb3lUcmFja3ModHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSkge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlUcmFja1JlYWR5KHRyYWNrczogUkNMb2NhbFRyYWNrW10gfCBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjayB8IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUmVhZHkodHJhY2ssIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9ub3RpZnlUcmFja1JlYWR5XSBfbGlzdGVuZXIgb25UcmFja1JlYWR5IGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiL/pl7TkuIrms6jlhozkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5fcm9vbS5yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKFxuICAgICAge1xuICAgICAgICAvKipcbiAgICAgICAgICog5pys56uv6KKr6Lii5Ye65oi/6Ze05pe26Kem5Y+RXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAgICog5Y+m5LiA56eN5Y+v6IO95piv5bex5pa5IHJ0Y1Bpbmcg5aSx6LSl5qyh5pWw6LaF5Ye65LiK6ZmQ77yM5pWF6ICM5Li75Yqo5pat57q/XG4gICAgICAgICAqIEBwYXJhbSBieVNlcnZlclxuICAgICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgICAqIOW9k+WAvOS4uiB0cnVlIOaXtu+8jOivtOaYjuacrOerr+aUtuWIsOiiq+i4ouWHuuaIv+mXtOmAmuefpVxuICAgICAgICAgKi9cbiAgICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVzZXJJZDogc3RyaW5nID0gdGhpcy5fcnRjQ2xpZW50LmdldEN1cnJlbnRJZCgpO1xuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VyTGVhdmUoW2N1cnJlbnRVc2VySWRdKTtcblxuICAgICAgICAgIGlmICghYnlTZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uU0VSVkVSX0tJQ0spIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSykge1xuICAgICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmjqXmlLbliLDmiL/pl7Tkv6Hku6Tml7blm57osIPvvIznlKjmiLflj6/pgJrov4fmiL/pl7Tlrp7kvovnmoQgYHNlbmRNZXNzYWdlKG5hbWUsIGNvbnRlbnQpYCDmjqXlj6Plj5HpgIHkv6Hku6RcbiAgICAgICAgICogQHBhcmFtIG5hbWUg5L+h5Luk5ZCNXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50IOS/oeS7pOWGheWuuVxuICAgICAgICAgKiBAcGFyYW0gc2VuZGVyVXNlcklkIOWPkemAgeiAhSBJZFxuICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZVVJZCDmtojmga/llK/kuIDmoIfor4ZcbiAgICAgICAgICovXG4gICAgICAgIG9uTWVzc2FnZVJlY2VpdmUobmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnksIHNlbmRlclVzZXJJZDogc3RyaW5nLCBtZXNzYWdlVUlkOiBzdHJpbmcpIHtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOebkeWQrOaIv+mXtOWxnuaAp+WPmOabtOmAmuefpVxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gY29udGVudFxuICAgICAgICAgKi9cbiAgICAgICAgb25Sb29tQXR0cmlidXRlQ2hhbmdlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HluIPogIXnpoHnlKgv5ZCv55So6Z+z6aKRXG4gICAgICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrIFJDUmVtb3RlQXVkaW9UcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uQXVkaW9NdXRlQ2hhbmdlOiAoYXVkaW9UcmFjazogUkNSZW1vdGVBdWRpb1RyYWNrKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BdWRpb011dGVDaGFuZ2VdIHVzZXJJZC0+JHthdWRpb1RyYWNrLmdldFVzZXJJZCgpfSBtdXRlZCAtPiAke2F1ZGlvVHJhY2suaXNPd25lck11dGVkKCl9YCk7XG4gICAgICAgICAgY29uc3QgbXV0ZVVzZXI6IElNdXRlVXNlciA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIG11dGVkOiBhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgICAga2luZDogJ2F1ZGlvJyxcbiAgICAgICAgICAgIHRyYWNrSWQ6IGF1ZGlvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uQXVkaW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uQXVkaW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25UcmFja011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWPkeW4g+iAheemgeeUqC/lkK/nlKjop4bpopFcbiAgICAgICAgICogQHBhcmFtIHZpZGVvVHJhY2sgUkNSZW1vdGVWaWRlb1RyYWNrIOexu+WunuS+i+WvueixoVxuICAgICAgICAgKi9cbiAgICAgICAgb25WaWRlb011dGVDaGFuZ2U6ICh2aWRlb1RyYWNrOiBSQ1JlbW90ZVZpZGVvVHJhY2spID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblZpZGVvTXV0ZUNoYW5nZV11c2VySWQtPiR7dmlkZW9UcmFjay5nZXRVc2VySWQoKX0gbXV0ZWQgLT4gJHt2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpfWApO1xuICAgICAgICAgIGNvbnN0IG11dGVVc2VyOiBJTXV0ZVVzZXIgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IHZpZGVvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICAgIGtpbmQ6ICd2aWRlbycsXG4gICAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVmlkZW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uVmlkZW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25WaWRlb011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOWGheWFtuS7lueUqOaIt+aWsOWPkeW4g+i1hOa6kOaXtuinpuWPkVxuICAgICAgICAgKiDlpoLpnIDojrflj5bliqDlhaXmiL/pl7TkuYvliY3miL/pl7TlhoXmn5DkuKrnlKjmiLflj5HluIPnmoTotYTmupDliJfooajvvIzlj6/kvb/nlKggcm9vbS5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCgndXNlcklkJykg6I635Y+WXG4gICAgICAgICAqIEBwYXJhbSB0cmFja3Mg5paw5Y+R5biD55qE6Z+z6L2o5LiO6KeG6L2o5pWw5o2u5YiX6KGo77yM5YyF5ZCr5paw5Y+R5biD55qEIFJDUmVtb3RlQXVkaW9UcmFjayDkuI4gUkNSZW1vdGVWaWRlb1RyYWNrIOWunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1B1Ymxpc2g6IGFzeW5jICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuICAgICAgICAgIC8vIOmAgOWHuuaIv+mXtOWQju+8jOi/mOS8mui1sOWIsOi/me+8n++8n++8jOaJgOS7peWIpOaWreS4gOS4i++8jOayoeaciXJvb23kuI3miafooYzorqLpmIVcbiAgICAgICAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g5oyJ5Lia5Yqh6ZyA5rGC6YCJ5oup6ZyA6KaB6K6i6ZiF6LWE5rqQ77yM6YCa6L+HIHJvb20uc3Vic2NyaWJlIOaOpeWPo+i/m+ihjOiuoumYhVxuICAgICAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnN1YnNjcmliZSh0cmFja3MpO1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBvblRyYWNrUHVibGlzaF0gc3Vic2NyaWJlIGZhaWxlZCBSVENDb2RlIC0+JHtjb2RlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOeUqOaIt+WPlua2iOWPkeW4g+i1hOa6kFxuICAgICAgICAgKiBAcGFyYW0gdHJhY2tzIOiiq+WPlua2iOWPkeW4g+eahOmfs+i9qOS4juinhui9qOaVsOaNruWIl+ihqFxuICAgICAgICAgKiBAZGVzY3JpcHRpb24g5b2T6LWE5rqQ6KKr5Y+W5raI5Y+R5biD5pe277yMU0RLIOWGhemDqOS8muWPlua2iOWvueebuOWFs+i1hOa6kOeahOiuoumYhe+8jOS4muWKoeWxguS7hemcgOWkhOeQhiBVSSDkuJrliqFcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tVbnB1Ymxpc2g6ICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDorqLpmIXnmoTpn7Pop4bpopHmtYHpgJrpgZPlt7Llu7rnq4ssIHRyYWNrIOW3suWPr+S7pei/m+ihjOaSreaUvlxuICAgICAgICAgKiBAcGFyYW0gdHJhY2sgUkNSZW1vdGVUcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tSZWFkeTogKHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuXG4gICAgICAgICAgLy8g5pyJ5pe25a+55pa55rKh5pyJ6ZmN57qn5oiQ5Yqf77yM5omU5oqb6L+H5p2l6KeG6aKR77yM6L+Z5pe255qE6KeG6aKR5LiN5a+55aSW5oqb5Ye6XG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPICYmIHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8g5omn6KGM55So5oi355qEb25UcmFja1JlYWR555uR5ZCsXG4gICAgICAgICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2tdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS6uuWRmOWKoOWFpVxuICAgICAgICAgKiBAcGFyYW0gdXNlcklkcyDliqDlhaXnmoTkurrlkZggaWQg5YiX6KGoXG4gICAgICAgICAqL1xuICAgICAgICBvblVzZXJKb2luOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAvLyDmnInkurrliqDlhaXmuIXpmaTlrprml7blmahcbiAgICAgICAgICBpZiAodGhpcy5qb2luUm9vbVRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLmpvaW5Sb29tVGltZXIuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4odXNlcklkcyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDkurrlkZjpgIDlh7pcbiAgICAgICAgICogQHBhcmFtIHVzZXJJZHNcbiAgICAgICAgICovXG4gICAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJMZWF2ZV0gbGlzdGVuaW5nIG9uVXNlckxlYXZlIHVzZXJJZHMgLT4gJHt1c2VySWRzPy5qb2luKCcsJyl9YCk7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJMZWF2ZSh1c2VySWRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmr4/mrKEgUGluZyDnu5PmnpxcbiAgICAgICAgICovXG4gICAgICAgIG9uUGluZzogKHJlc3VsdDogUkNSVENQaW5nUmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25QaW5nXSR7cmVzdWx0fWApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDpgJrnn6Xnu5nkuJrliqFcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblBpbmcgJiYgdGhpcy5fbGlzdGVuZXIhLm9uUGluZyhyZXN1bHQsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25QaW5nXSBsaXN0ZW5pbmcgb25QaW5nIGV4Y2VwdGlvbicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcigpIHtcbiAgICAvLyDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICB0aGlzLl9yb29tLnJlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDnlKjkuo7mjqXmlLbnirbmgIHmlbDmja7miqXlkYpcbiAgICAgICAqIEBwYXJhbSByZXBvcnRcbiAgICAgICAqL1xuICAgICAgb25TdGF0ZVJlcG9ydDogKHJlcG9ydDogSVJDUlRDU3RhdGVSZXBvcnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydCAmJiB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydChyZXBvcnQsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblN0YXRlUmVwb3J0XSBsaXN0ZW5lciBvblN0YXRlUmVwb3J0IGV4Y2VwdGlvbicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIH5JQ0Ug6L+e5o6l54q25oCB5Y+Y5pu06YCa55+lflxuICAgICAgICogQHNpbmNlIHZlcnNpb24gNS4xLjVcbiAgICAgICAqL1xuICAgICAgb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2U6IChzdGF0ZTogUlRDSWNlQ29ubmVjdGlvblN0YXRlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlICYmIHRoaXMuX2xpc3RlbmVyIS5vbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlXSBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSBleGNlcHRpb24nKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICDojrflj5bmiL/pl7TlvZPliY3kvJror50gSWTvvIzlvZPmiL/pl7TlhoXlt7Lml6DmiJDlkZjml7bmiL/pl7TkvJrlm57mlLbvvIzph43mlrDliqDlhaXml7Ygc2Vzc2lvbklkIOWwhuabtOaWsO+8jCjnlKjmiLflvZXliLbotYTmupDnlKjnmoQpXG4gICAqL1xuICBwdWJsaWMgZ2V0UlRDU2Vzc2lvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb29tID8gdGhpcy5fcm9vbS5nZXRTZXNzaW9uSWQoKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFyZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFRhcmdldElkKCk7XG4gIH1cblxuICAvKipcbiAgICogIOiOt+WPluS8muivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDb252ZXJzYXRpb25UeXBlKCk7XG4gIH1cblxuICAvKipcbiAgICogIOe7hOe7hyBJRFxuICAgKi9cbiAgcHVibGljIGdldENoYW5uZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2hhbm5lbElkKCk7XG4gIH1cblxuICAvKipcbiAgICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVtb3RlVXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gKi9cbiAgcHVibGljIGdldFVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFJlbW90ZVVzZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lq65ZGY54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICBpZiAoIXVzZXJJZCB8fCB0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VySWQgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRVc2VyU3RhdGUodXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZzZXNzaW9u54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogUkNDYWxsU2Vzc2lvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5Lya6K+d5Y+R6LW36ICFaWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpdtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRNZWRpYVR5cGUoKTogUkNDYWxsTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBSVENQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgSVJUQ0pvaW5lZEluZm8sIEVycm9yQ29kZSwgUlRDSm9pblR5cGUsIElMb2dnZXIsIEJhc2ljTG9nZ2VyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ0NhbGxFbmdpbmUsIFJDQ2FsbFN0YXRlTWFjaGluZSwgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsTWVkaWFUeXBlLCBJT2ZmbGluZVJlY29yZCxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ2xpZW50LCBSQ1JUQ0NvZGUsIFJDTG9jYWxUcmFjayB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQge1xuICBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBQcm9kdWNlVHlwZXMgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvbiB9IGZyb20gJy4vUkNDYWxsU2Vzc2lvbic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUxpc3RlbmVyLCB2YWxpZGF0ZVRhcmdldElkLCB2YWxpZGF0ZU1lZGlhVHlwZSwgdmFsaWRhdGVVc2VySWRzLCB2YWxpZGF0ZUV4dHJhLCB2YWxpZGF0ZVB1c2hDb25maWcsXG59IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJDQ2FsbENsaWVudCB7XG4gIC8qKlxuICAgKiBydGPlrp7kvotcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnRcblxuICAvKipcbiAgICogY2FsbEVuZ2luZeWxguWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lXG5cbiAgLyoqXG4gICAqIOWFtuWug+WPguaVsFxuICAgKi9cbiAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zXG5cbiAgLyoqXG4gICAqIHNlc3Npb27liJfooahcbiAgICovXG4gIHByaXZhdGUgX3Nlc3Npb25MaXN0OiBSQ0NhbGxTZXNzaW9uW10gPSBbXVxuXG4gIC8qKlxuICAgKiDnp7vliqjnq6/lkbzlj6vmjqjpgIHphY3nva5cbiAgICovXG4gIHByaXZhdGUgX2NhbGxQdXNoQ29uZmlnPzogSVB1c2hDb25maWdcblxuICAvKipcbiAgICog56e75Yqo56uv5oyC5pat5o6o6YCB6YWN572uXG4gICAqL1xuICBwcml2YXRlIF9odW5ndXBQdXNoQ29uZmlnPzogSVB1c2hDb25maWdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgX29wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5fcnRjQ2xpZW50ID0gX29wdGlvbnMucnRjQ2xpZW50O1xuXG4gICAgdGhpcy5fb3B0aW9ucyA9IHsgLyoqXG4gICAgICAgKiDmmK/lkKblhYHorrjlj5HluIPph43or5XvvIwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIOaYr+WQpuWFgeiuuOiuoumYhemHjeivle+8jOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLQsIOm7mOiupOWFs+mXrVxuICAgICAgICovXG4gICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnovvvIzpu5jorqQgICBSVENKb2luVHlwZS5DT0VYSVNUID0gMiDkuKTkuKrorr7lpIflhbHlrZhcbiAgICAgICAqICAgICBSVENKb2luVHlwZS5LSUNLID0gMCzouKLliY3kuIDkuKrorr7lpIdcbiAgICAgICAqICAgICBSVENKb2luVHlwZS5SRUZVU0UgPSAxLOW9k+WJjeWKoOWFpeaLkue7nVxuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLkNPRVhJU1QgPSAyIOS4pOS4quiuvuWkh+WFseWtmFxuICAgICAgICovXG4gICAgICBqb2luVHlwZTogUlRDSm9pblR5cGUuQ09FWElTVCxcblxuICAgICAgLyoqXG4gICAgICAgKiDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiDor63oqIDorr7nva4gKOaOqOmAgSksIOS4jeS8oOm7mOiupOS4uuS4reaWh1xuICAgICAgICovXG4gICAgICBsYW5nOiBSQ0NhbGxMYW5ndWFnZS5aSCxcbiAgICAgIC4uLl9vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyDliJ3lp4vljJZjYWxsRW5naW5lLCDlubbnm5HlkKxvbkludml0ZVxuICAgIHRoaXMuX2NhbGxFbmdpbmUgPSBuZXcgUkNDYWxsRW5naW5lKHRoaXMuX2NvbnRleHQsIF9ydW50aW1lLCB0aGlzLl9sb2dnZXIsIHtcblxuICAgICAgLyoqXG4gICAgICAgKiDnm5HlkKzmlLbliLBpbnZpdGVcbiAgICAgICAqL1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG5cbiAgICAgIC8qKlxuICAgICAgICog55uR5ZCs56a757q/5raI5oGv5oql5ZGKXG4gICAgICAgKi9cbiAgICAgIG9uT2ZmbGluZVJlY29yZDogdGhpcy5fb25PZmZsaW5lUmVjb3JkLmJpbmQodGhpcyksXG4gICAgfSwge1xuXG4gICAgICAvKipcbiAgICAgICAqIOivreiogOiuvue9riAo5o6o6YCBKSwg5LiN5Lyg6buY6K6k5Li65Lit5paHXG4gICAgICAgKi9cbiAgICAgIGxhbmc6IHRoaXMuX29wdGlvbnMubGFuZyB8fCBSQ0NhbGxMYW5ndWFnZS5aSCxcblxuICAgIH0pO1xuXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdzZXNzaW9uQ2xvc2UnLCAoeyBzZXNzaW9uLCBzdW1tYXJ5SW5mbyB9KSA9PiB7XG4gICAgICAvLyDku45zZXNzaW9uTGlzdOWOu+aOiei/meS4quWFs+mXreeahHNlc3Npb25cbiAgICAgIHRoaXMuX3JlbW92ZVNlc3Npb24oc2Vzc2lvbik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMub25TZXNzaW9uQ2xvc2Uoc2Vzc2lvbiwgc3VtbWFyeUluZm8pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NDYWxsQ2xpZW50XSBvcHRpb25zLm9uU2Vzc2lvbkNsb3NlIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDmjqXlkKzkuYvliY3mjILmlq3lhbblroPnmoRzZXNzaW9uXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdodW5ndXBPdGhlclNlc3Npb24nLCAoeyBzZXNzaW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBzZXNzaW9uSWQgcmVhZHkgdG8gYWNjZXB0IC0+ICR7aWR9YCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGh1bmd1cE90aGVyU2Vzc2lvbl0gc2Vzc2lvbkxpc3QgLT4ke3RoaXMuX3Nlc3Npb25MaXN0Lm1hcCgoc2VzKSA9PiBzZXMuZ2V0U2Vzc2lvbklkKCkpLmpvaW4oJywnKX1gKTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHdoaWxlICh0aGlzLl9zZXNzaW9uTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIOWmguaenOS4juimgeaOpeWQrOeahHNlc3Npb27kuI3kuIDoh7RcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25MaXN0W2ldLmdldFNlc3Npb25JZCgpICE9PSBpZCkge1xuICAgICAgICAgIC8vIOaMguaWrVxuICAgICAgICAgIHRoaXMuX3Nlc3Npb25MaXN0W2ldLmh1bmd1cCgpO1xuXG4gICAgICAgICAgLy8g5oyC5pat5ZCO5Yig6ZmkXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkxpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOWmguaenOaYr+imgeaOpeWQrOeahHNlc3Npb27vvIzot7Pov4fov5nkuKrntKLlvJXvvIzmiYDku6XliqAxXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGh1bmd1cE90aGVyU2Vzc2lvbl0gY3VycmVudCBzZXNzaW9uTGlzdCBsZW5ndGggLT4ke3RoaXMuX3Nlc3Npb25MaXN0Lmxlbmd0aH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm5HlkKxvbkludml0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfb25JbnZpdGUoc3RhdGVNYWNoaW5lOiBSQ0NhbGxTdGF0ZU1hY2hpbmUsIGV4dHJhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfb25JbnZpdGVdIFJlY2VpdmVkIGludml0ZSBtZXNzYWdlJyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBSQ0NhbGxTZXNzaW9uKHN0YXRlTWFjaGluZSwgdGhpcy5fcnRjQ2xpZW50LCB0aGlzLl9sb2dnZXIsIHtcblxuICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAvLyDmmK/lkKblhYHorrjlj5HluIPph43or5VcbiAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSxcblxuICAgICAgLyoqXG4gICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAqL1xuICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6LXG4gICAgICAgKi9cbiAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAvLyDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgIC8vIOagh+aYjuaYr+iiq+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgIHByb2R1Y2VUeXBlOiBQcm9kdWNlVHlwZXMuQ0FMTEVFLFxuXG4gICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgIGh1bmd1cFB1c2hDb25maWc6IHRoaXMuX2h1bmd1cFB1c2hDb25maWcsXG4gICAgfSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfb25JbnZpdGVdIFJlY2VpdmVkIGludml0ZSBtZXNzYWdlLCBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uJyk7XG5cbiAgICAvKipcbiAgICAgKiDlpoLmnpzpgJror53nmoTml7blgJnkuI3lhYHorrjmjqXlkKzmlrDnmoTpgJror53vvIznm7TmjqXmjILmlq3vvIwg6L+Z5Lqb5bel5L2c5ZyoY2FsbEVuZ2luZemHjOWujOaIkFxuICAgICAqL1xuICAgIHRoaXMuX3Nlc3Npb25MaXN0LnB1c2goc2Vzc2lvbik7XG5cbiAgICB0cnkge1xuICAgICAgLy8g5omn6KGM55So5oi3QVBJ55qE55uR5ZCsXG4gICAgICB0aGlzLl9vcHRpb25zLm9uU2Vzc2lvbihzZXNzaW9uLCBleHRyYSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uU2Vzc2lvbl0gb25TZXNzaW9uIGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIOW/hemhu+WcqG9uU2Vzc2lvbumHjOazqOWGjHNlc3Npb27nm5HlkKzkuovku7bvvIzov5nph4zmo4DmtYvkuIDkuIvmnInmsqHmnInms6jlhoxcbiAgICBpZiAoc2Vzc2lvbi5fbGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVMaXN0ZW5lcihzZXNzaW9uLl9saXN0ZW5lcik7XG4gICAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjb25jbHVzaW9uLm1zZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uU2Vzc2lvbl0gc2Vzc2lvbiBNdXN0IEhhdmUgTGlzdGVuZXInKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JDQ2FsbFNlc3Npb24gIF9vcHRpb25zLm9uU2Vzc2lvbl0gc2Vzc2lvbiBNdXN0IEhhdmUgTGlzdGVuZXInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog55uR5ZCs56a757q/5raI5oGv5oql5ZGKXG4gICAqIEBwYXJhbSByZWNvcmRcbiAgICovXG4gIHB1YmxpYyBfb25PZmZsaW5lUmVjb3JkKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpIHtcbiAgICB0cnkge1xuICAgICAgLy8g5omn6KGM55So5oi3QVBJ55qE55uR5ZCsXG4gICAgICB0aGlzLl9vcHRpb25zLm9uT2ZmbGluZVJlY29yZCAmJiB0aGlzLl9vcHRpb25zLm9uT2ZmbGluZVJlY29yZChyZWNvcmQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbENsaWVudCBfb3B0aW9ucy5vbk9mZmxpbmVSZWNvcmRdIG9uT2ZmbGluZVJlY29yZCBleGNlcHRpb24nKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM55So5oi35L+h5oGv44CC5rOo5YaM5ZCO77yM5Zyo5Y+R6LW36YKA6K+35oiW5oyC5pat562J5pON5L2c5pe277yM5Lya5bCG6K+l5L+h5oGv5LiA5bm25Y+R6YCB57uZ5a+556uvXG4gICAqIEBwYXJhbSBpbmZvLm5hbWUgICAgICAgIOeUqOaIt+WQjeensFxuICAgKiBAcGFyYW0gaW5mby5wb3J0cmFpdFVyaSDnlKjmiLflpLTlg4/kv6Hmga9cbiAgICogQHBhcmFtIGluZm8uZXh0cmEgICAgICAg6aKE55WZ5ouT5bGV5a2X5q61XG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJVc2VySW5mbyhpbmZvOiB7IG5hbWU/OiBzdHJpbmc7IHBvcnRyYWl0VXJpPzogc3RyaW5nOyBleHRyYT86IHN0cmluZzsgfSA9IHt9KSB7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5yZWdpc3RlclVzZXJJbmZvKGluZm8pO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgcmVnaXN0ZXJVc2VySW5mb10gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIHVzZXIgaW5mbyBkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgKiDot6hBcHDljZXlkbzvvIxcYuWPkemAgWludml0Zea2iOaBr++8jOWbnuiwg+WbnuadpeaOpeaUtnN0YXRlTWFjaGluZSwg5bu6c2Vzc2lvblxuICAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0SWQg6KKr5ZG85Y+r5LiA5pa555qE55So5oi3IGlkIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sgIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAqIEBwYXJhbSBwYXJhbXMuY2hhbm5lbElkIOe7hOe7hyBJZCDlj6/pgIlcbiAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBr1xuICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAqXG4gICovXG4gIHB1YmxpYyBhc3luYyBzdGFydENyb3NzQ2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX19jYWxsKHtcbiAgICAgIHRhcmdldElkLCBtZWRpYVR5cGUsIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgYml0cmF0ZSwgaXNDcm9zc0FwcGtleTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlkbzvvIxcYuWPkemAgWludml0Zea2iOaBr++8jOWbnuiwg+WbnuadpeaOpeaUtnN0YXRlTWFjaGluZSwg5bu6c2Vzc2lvblxuICAgKiBAcGFyYW0gcGFyYW1zLnRhcmdldElkIOiiq+WRvOWPq+S4gOaWueeahOeUqOaItyBpZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyAg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBr1xuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAgKlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbGwoe1xuICAgIHRhcmdldElkLCBtZWRpYVR5cGUgPSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkID0gJycsIGV4dHJhID0gJycsIHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnLCBiaXRyYXRlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIHJldHVybiB0aGlzLl9fY2FsbCh7XG4gICAgICB0YXJnZXRJZCwgbWVkaWFUeXBlLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsIGJpdHJhdGUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9fY2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICBjb25zdCBwdXNoQ29uZmlnID0gdGhpcy5fY2FsbFB1c2hDb25maWcgPyB0aGlzLl9jYWxsUHVzaENvbmZpZyA6IHsgcHVzaFRpdGxlLCBwdXNoQ29udGVudCB9O1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gZXh0cmEtPiR7ZXh0cmF9IHB1c2hDb25maWctPiR7SlNPTi5zdHJpbmdpZnkocHVzaENvbmZpZyl9YCk7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVNZWRpYVR5cGUobWVkaWFUeXBlKSwgdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lciksIHZhbGlkYXRlRXh0cmEoZXh0cmEpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbF0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGU6IHZhbGlkYXRlUHVzaENvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZVB1c2hDb25maWcocHVzaENvbmZpZyk7XG4gICAgaWYgKHZhbGlkYXRlUHVzaENvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBwYXJhbSBlcnJvciwgZXJyb3JNc2c6ICR7ZXJyb3JNc2d9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiB2YWxpZGF0ZVB1c2hDb2RlIH07XG4gICAgfVxuXG4gICAgbGV0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIGxvY2FsVHJhY2tzID0gdHJhY2tzITtcblxuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDorr7nva7noIHnjodcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSAmJiBiaXRyYXRlPy5hdWRpbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSAmJiBiaXRyYXRlPy52aWRlbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LnZpZGVvPy5tYXgsIGJpdHJhdGU/LnZpZGVvPy5taW4sIGJpdHJhdGU/LnZpZGVvPy5zdGFydCk7XG4gICAgICB9XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICAgIGxpc3RlbmVyLm9uVHJhY2tSZWFkeSh0cmFjayk7XG4gICAgfSk7XG5cbiAgICAvLyDosIPnlKhjYWxsRW5naW5l55qEY2FsbOi/lOWbnuS4gOS4queKtuaAgeacuueahOWunuS+i1xuICAgIGNvbnN0IHsgY29kZSwgc3RhdGVNYWNoaW5lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbGwoY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlLCBleHRyYSwgcHVzaENvbmZpZywgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzdGF0ZSBtYWNoaW5lJyk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBsb2NhbFRyYWNrcyxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAgICovXG4gICAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAgIC8vIOagh+aYjuaYr+S4u+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRVIsXG5cbiAgICAgICAgaXNDcm9zc0FwcGtleSxcblxuICAgICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXNzaW9u5LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgICBzZXNzaW9uLnJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbiBvYmplY3QsIHNlc3Npb25JZDogJHtzZXNzaW9uLmdldFNlc3Npb25JZCgpfWApO1xuICAgICAgcmV0dXJuIHsgY29kZSwgc2Vzc2lvbiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBjYWxsIGZhaWxlZCBjb2RlIC0+OiAke2NvZGV9YCk7XG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2subXV0ZSgpO1xuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HotbfnvqTnu4Tlkbzlj6tcbiAgICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDnvqTnu4QgSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcklkcyDooqvlkbzlj6vnmoTnvqTlhoXmiJDlkZggSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBryDlj6/pgIlcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsSW5Hcm91cCh7XG4gICAgdGFyZ2V0SWQsIHVzZXJJZHMsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxJbkdyb3VwUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHB1c2hDb25maWcgPSB0aGlzLl9jYWxsUHVzaENvbmZpZyA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVVc2VySWRzKHVzZXJJZHMpLCB2YWxpZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGUpLCB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSwgdmFsaWRhdGVFeHRyYShleHRyYSldO1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZTogdmFsaWRhdGVQdXNoQ29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICBpZiAodmFsaWRhdGVQdXNoQ29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIHBhcmFtIGVycm9yLCBlcnJvck1zZzogJHtlcnJvck1zZ31gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IHZhbGlkYXRlUHVzaENvZGUgfTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgbG9jYWxUcmFja3MgPSB0cmFja3MhO1xuXG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOiuvue9rueggeeOh1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpICYmIGJpdHJhdGU/LmF1ZGlvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8uYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpICYmIGJpdHJhdGU/LnZpZGVvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8udmlkZW8/Lm1heCwgYml0cmF0ZT8udmlkZW8/Lm1pbiwgYml0cmF0ZT8udmlkZW8/LnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgICAgbGlzdGVuZXIub25UcmFja1JlYWR5KHRyYWNrKTtcbiAgICB9KTtcblxuICAgIC8vIOW+gOe7hOmHjOWPkea2iOaBr1xuICAgIGNvbnN0IHsgY29kZSwgc3RhdGVNYWNoaW5lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbGxJbkdyb3VwKGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgdXNlcklkcywgZXh0cmEsIHB1c2hDb25maWcpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyAmJiBzdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHN0YXRlIG1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUkNDYWxsU2Vzc2lvbihzdGF0ZU1hY2hpbmUsIHRoaXMuX3J0Y0NsaWVudCwgdGhpcy5fbG9nZ2VyLCB7XG4gICAgICAgIGxvY2FsVHJhY2tzLFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivlVxuICAgICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICAgKi9cbiAgICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei1xuICAgICAgICAgKi9cbiAgICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgICAgLy8g5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgICAgLy8g5qCH5piO5piv5Li75Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgICBwcm9kdWNlVHlwZTogUHJvZHVjZVR5cGVzLkNBTExFUixcblxuICAgICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXNzaW9u5LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgICBzZXNzaW9uLnJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMuX3Nlc3Npb25MaXN0LnB1c2goc2Vzc2lvbik7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uIG9iamVjdCwgc2Vzc2lvbklkOiAke3Nlc3Npb24uZ2V0U2Vzc2lvbklkKCl9YCk7XG4gICAgICByZXR1cm4geyBjb2RlLCBzZXNzaW9uIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIGNhbGxJbkdyb3VwIGZhaWxlZCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFjay5tdXRlKCk7XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiwg1JUQyBBUEkg6I635b6X5pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDmo4DmtYvmmK/lkKbog73lpJ/ojrflvpfmnKzlnLDmtYFcbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgeyAuLi5jb25zdHJhaW50cy5hdWRpbyB9KTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIGdldCBBdWRpbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIHN1Y2Nlc3NmdWxseSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzOiBbdHJhY2shXSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBbmRDYW1lcmFUcmFja3MoJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIHsgLi4uY29uc3RyYWludHMgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIGdldCBBdWRpbyBhbmQgVmlkZW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gc3VjY2Vzc2Z1bGx5IGdldCBhdWRpbyBhbmQgdmlkZW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDlpoLmnpzmmK/lhYHorrjpmY3nuqfojrflvpfmtYHvvIzlubbkuJTmmK/ojrflvpfpn7Pop4bpopFcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gJiYgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8sIGNvbnN0cmFpbnRzKTtcblxuICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5LiN6IO96I635b6X77yM5bCx6ZmN57uE6I635b6X6Z+z6aKRXG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgY29uc3RyYWludHMpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBfY29kZSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICog5LuOc2Vzc2lvbkxpc3TliKDpmaTmn5DkuKpzZXNzaW9uXG4gICAqL1xuICBwcml2YXRlIF9yZW1vdmVTZXNzaW9uKHNlc3Npb246IFJDQ2FsbFNlc3Npb24pIHtcbiAgICBjb25zdCBpZCA9IHNlc3Npb24uZ2V0U2Vzc2lvbklkKCk7XG4gICAgdGhpcy5fc2Vzc2lvbkxpc3QgPSB0aGlzLl9zZXNzaW9uTGlzdC5maWx0ZXIoKHNlc3Npb24pID0+IHNlc3Npb24uZ2V0U2Vzc2lvbklkKCkgIT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blt7Hmlrnlhbbku5bnq6/liqDlhaXpgJror53vvIjlt7LliqDlhaUgUlRDIOaIv+mXtO+8ieeahOeUqOaIt+S/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEpvaW5lZFJvb21JbmZvKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIGRhdGE/OiBJUlRDSm9pbmVkSW5mb1tdIH0+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NvbnRleHQuZ2V0UlRDSm9pbmVkVXNlckluZm8odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSk7XG4gICAgaWYgKGNvZGUgIT09IEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgZ2V0Sm9pbmVkVXNlckluZm8gZXJyb3IgY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWRvOWPq+OAgeaMguaWreaOqOmAgeaVsOaNrlxuICAgKiBAcGFyYW0gY2FsbFB1c2hDb25maWcg5ZG85Y+r5o6o6YCB6YWN572uXG4gICAqIEBwYXJhbSBodW5ndXBQdXNoQ29uZmlnIOaMguaWreaOqOmAgemFjee9rlxuICAgKiBAZGVzY3JpcHRpb24gY2FsbExpYiDkvJrlhoXnva4gSVB1c2hDb25maWcg5LitIHB1c2hEYXRhIOeahOi1i+WAvO+8jOS4muWKoeWxguaXoOmcgOWFs+azqCBwdXNoRGF0YSDlrZfmrrXlgLxcbiAgICovXG4gIHB1YmxpYyBzZXRQdXNoQ29uZmlnKGNhbGxQdXNoQ29uZmlnOiBJUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZzogSVB1c2hDb25maWcpIHtcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IFtjYWxsUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZ10ubWFwKChpdGVtKSA9PiB2YWxpZGF0ZVB1c2hDb25maWcoaXRlbSkpO1xuXG4gICAgZm9yIChjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gb2YgdmFsaWRhdGVSZXMpIHtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBzZXRQdXNoQ29uZmlnXSBwYXJhbSBlcnJvciwgZXJyb3JNc2c6ICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsUHVzaENvbmZpZyA9IGNhbGxQdXNoQ29uZmlnO1xuICAgIHRoaXMuX2h1bmd1cFB1c2hDb25maWcgPSBodW5ndXBQdXNoQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsRW5kUmVhc29uLCBSQ0NhbGxNZWRpYVR5cGUsIFJDQ2FsbFVzZXJTdGF0ZSwgUkNDYWxsU2Vzc2lvblN0YXRlLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVNlbmRlckluZm8sIElPZmZsaW5lUmVjb3JkLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgSVJDUlRDU3RhdGVSZXBvcnQgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVNlc3Npb25MaXN0ZW5lciwgSU11dGVVc2VyLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSURldmljZUNoYW5nZVBhcmFtcywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNDYWxsQ2xpZW50IGZyb20gJy4vUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbFNlc3Npb24nO1xuaW1wb3J0IHsgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG4vLyBwbHVnaW4tY2FsbCDniYjmnKzkuIrmiqVcblZlcnNpb25NYW5hZ2UuYWRkKCdwbHVnaW4tY2FsbCcsIF9fVkVSU0lPTl9fKTtcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbENsaWVudCwgSVJDQ2FsbEluaXRPcHRpb25zPiA9IHtcbiAgdGFnOiAnUkNDYWxsJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgcmV0dXJuIHJ1bnRpbWUudGFnID09PSAnYnJvd3Nlcic7XG4gIH0sXG4gIHNldHVwKGNvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsIHJ1bnRpbWU6IElSdW50aW1lLCBvcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBSQ0NhbGxDbGllbnQge1xuICAgIC8vIOWFiOagoemqjOWPguaVsFxuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMob3B0aW9ucyk7XG4gICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsTGliIGluc3RhbGxlciBzdGV1cF0ke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOagoemqjOW9k+WJjeWuieijheeahCBlbmdpbmUg54mI5pys5piv5ZCm5Y+v55SoXG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGN1cnJlbnQgZW5naW5lIHZlcnNpb24gJyR7VmVyc2lvbk1hbmFnZS5nZXRJbmZvKCkuZW5naW5lfScgZXJyb3IsIHBsdWdpbi1jYWxsIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGNvbnRleHQuY3JlYXRlTG9nZ2VyKCdSQ0NhbGwnLCAnUlRDJyk7XG4gICAgb3B0aW9ucy5sb2dPdXRwdXRMZXZlbCAmJiBsb2dnZXIuc2V0T3V0cHV0TGV2ZWwob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9nTGV2ZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsb2dnZXIud2FybignXycsICdUaGUgXFwnbG9nTGV2ZWxcXCcgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgXFwnbG9nT3V0cHV0TGV2ZWxcXCcgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybignXycsIGBSQ0NhbGwgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30sIENvbW1pdDogJHtfX0NPTU1JVF9JRF9ffWApO1xuXG4gICAgcmV0dXJuIG5ldyBSQ0NhbGxDbGllbnQoY29udGV4dCwgcnVudGltZSwgbG9nZ2VyLCBvcHRpb25zKTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7XG4gIGluc3RhbGxlcixcbiAgUkNDYWxsQ2xpZW50LFxuICBSQ0NhbGxTZXNzaW9uLFxuICBSQ0NhbGxMYW5ndWFnZSxcbiAgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbE1lZGlhVHlwZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG59O1xuXG5leHBvcnQgdHlwZSB7XG4gIElFbmRTdW1tYXJ5LFxuICBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gIElSQ0NhbGxQYXJhbXMsXG4gIElSQ0NhbGxJbkdyb3VwUGFyYW1zLFxuICBJU2Vzc2lvbkxpc3RlbmVyLFxuICBJU2VuZGVySW5mbyxcbiAgSU11dGVVc2VyLFxuICBJSW52aXRlZFVzZXJzLFxuICBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyxcbiAgSURldmljZUNoYW5nZVBhcmFtcyxcbiAgSU9mZmxpbmVSZWNvcmQsXG4gIElSQ1JUQ1N0YXRlUmVwb3J0LFxuICBJUHVzaENvbmZpZyxcbn07XG4iXSwibmFtZXMiOlsic3RyaW5nMTB0bzY0IiwibnVtYmVyIiwiY2hhcnMiLCJyYWRpeCIsInF1dGllbnQiLCJhcnIiLCJtb2QiLCJnZXRVVUlEIiwiYyIsInIiLCJnZXRVVUlEMjIiLCJ1dWlkIiwiZ2VuZXJhdGVSYW5kb21JZCIsInJhbmRvbSIsInRpbWVyU2V0VGltZW91dCIsImZ1bmMiLCJ0aW1lb3V0IiwiZXZlbnRFbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwiZ2V0Q2FsbERldmljZUlkIiwicnVudGltZSIsImtleSIsIk1zZ0NhbGxTdGF0dXMiLCJNc2dDYWxsU3RhdHVzMiIsIlJDQ2FsbEVycm9yQ29kZSIsIlJDQ2FsbEVuZFJlYXNvbiIsIkNhbGxSZW1vdGVFbmRSZWFzb24iLCJSQ0NhbGxNZXNzYWdlVHlwZSIsIlJDQ2FsbFNlc3Npb25TdGF0ZSIsIlJDQ2FsbFNlc3Npb25TdGF0ZTIiLCJSQ0NhbGxVc2VyU3RhdGUiLCJSQ0NhbGxVc2VyU3RhdGUyIiwiUkNDcm9zc0NhbGxUeXBlIiwiVGltZXIkMSIsImNhbGxiYWNrIiwiX19wdWJsaWNGaWVsZCIsImVuZFRpbWUiLCJkdXJhdGlvbiIsIlJDQ2FsbFN0YXRlTWFjaGluZSIsIl9jb250ZXh0IiwiX3J1bnRpbWUiLCJfbG9nZ2VyIiwiX2NhbGxNc2dIYW5kbGVyIiwiX2NoYW5uZWxJZCIsIl9jb252ZXJzYXRpb25UeXBlIiwiX3RhcmdldElkIiwiX21lZGlhVHlwZSIsIl9jYWxsSWQiLCJzZW50VGltZSIsImRlbGF5VGltZSIsInVzZXJJZCIsInN0YXRlIiwicmVhc29uIiwiX2EiLCJ1c2VyIiwibWVzc2FnZSIsInNlbmRlclVzZXJJZCIsInVzZXJQcm9maWxlIiwiaHVuZ3VwUmVhc29uIiwibWVzc2FnZVR5cGUiLCJlbmRSZWFzb24iLCJyZW1vdGVVc2VySWQiLCJtc2dEZXZpY2VJZCIsInN1aWQiLCJkZXZpY2VJZCIsInNlbmRlckRldmljZUlkIiwiY3VycmVudFVzZXJJZCIsIkNvbnZlcnNhdGlvblR5cGUiLCJpc0N1cnJlbnRVc2VySWQiLCJtZWRpYVR5cGUiLCJjb250ZW50IiwiaXNMZXNzVGhhblR3byIsImlzSW52aXRlVXNlciIsImlzTm9PbmVBbnN3ZXJlZCIsIndhdGNoZXJzIiwiaW5pZHMiLCJyb29tVHlwZSIsInVzZXJJZExpc3QiLCJpZCIsImludml0ZVVzZXJJZHMiLCJUaW1lciIsImV4aXN0ZWRVc2VyUG9maWxlcyIsImNhbGxlciIsIm5lZWRSaW5naW5nVXNlcklkcyIsInVzZXJJbmZvIiwiY2FsbFN0YXR1cyIsImVycm9yIiwidXNlcklkcyIsImV4dHJhIiwicHVzaENvbmZpZyIsImlzQ3Jvc3NBcHBrZXkiLCJjb2RlIiwiaXNDYWxsZXIiLCJlbmRDb2RlIiwib3B0aW9ucyIsImV4aXN0ZWRVc2VySWRzIiwiaXNTZW5kSGFuZ3VwTWVzc2FnZSIsImhhbmd1cFBhcmFtcyIsIm1zZ0NvZGUiLCJyZW1vdGVVc2VycyIsInJlbW90ZVVzZXIiLCJ1aWQiLCJiZWdpblRpbWVzdGFtcCIsImVuZFRpbWVzdGFtcCIsInN1bW1hcnkiLCJSQ0NhbGxNZWRpYVR5cGUiLCJSQ0NhbGxNZWRpYVR5cGUyIiwiTWVtYmVyTW9kaWZ5VHlwZSIsIk1lbWJlck1vZGlmeVR5cGUyIiwiUGxhdGZvcm0iLCJPZmZsaW5lUmVjb3JkZXIiLCJfb25SZWNvcmQiLCJjaGFubmVsSWQiLCJjb252ZXJzYXRpb25UeXBlIiwidGFyZ2V0SWQiLCJjYWxsSWQiLCJpc1NlbGZTZW5kIiwibWVzc2FnZXMiLCJtc2ciLCJjYWxsTXNnVHlwZXMiLCJFbmdpbmVFcnJvckNvZGVUb0NhbGxFcnJvckNvZGUiLCJFcnJvckNvZGUiLCJDYWxsTWVzc2FnZUhhbmRsZXIiLCJfb2ZmbGluZU1zZ0l0diIsIl9nZXRTdGF0ZU1hY2hpbmUiLCJyZWNvcmQiLCJtYXJrVGltZSIsImN1cnJlbnRNc2dTZW50VGltZSIsImluc2VydEluZGV4IiwiaW5kZXgiLCJjdXJyZW50VGltZSIsImJ1ZmZlcnMiLCJpdGVtIiwibWVzc2FnZVVJZCIsImlzT2ZmTGluZU1lc3NhZ2UiLCJvZmZsaW5lQnVmZmVycyIsImludml0ZUNhbGxJZCIsImlzSW52aXRlTXNnVHlwZSIsImlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2IiwidGFza01zZ0xpc3QiLCJpIiwib3RoZXJDYWxsSWQiLCJkZWxJbmRleCIsImRlbE9mZmxpbmVJbmRleCIsImlzVW5maW5pc2hlZFByaXZhdGVDYWxsIiwiaXNPbmx5SW52aXRlIiwiaGFzSW52aXRlQW5kUmluZ2luZyIsImlzVW5maW5pc2hlZEdycENhbGwiLCJpc1VuZmluaXNoZWQiLCJub09uZUFjY2VwdCIsImFsbFVzZXJJZHMiLCJpc0NhbGxlckh1bmd1cCIsInRhc2tNc2dTZW5kZXJVc2VySWQiLCJkZWxDb3VudCIsImxpc3RlbmVyIiwiZnVuY05hbWUiLCJldmVudCIsImV2ZW50VHlwZSIsImRpcmVjdGlvbmFsVXNlcklkTGlzdCIsInNlbmRPcHRzIiwibmV3UHVzaENvbmZpZyIsImNhbGxlcklkIiwiUkNDYWxsTGFuZ3VhZ2UiLCJFTiIsIlpIIiwiTG9jYWwiLCJsYW5nIiwiUkNDYWxsRW5naW5lIiwiX3dhdGNoZXJzIiwiX29wdGlvbnMiLCJjcnRVc2VySWQiLCJpbmZvIiwiUHJvZHVjZVR5cGVzIiwiZnVuIiwib24iLCJkYXRhIiwiZnVucyIsImNiIiwibGVuZ3RoIiwiaXNMYW5ndWFnZSIsInZhbCIsImlzSm9pblR5cGUiLCJSVENKb2luVHlwZSIsImlzTG9nTGV2ZWwiLCJMb2dMIiwidmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMiLCJrZXlOYW1lcyIsImtleXMiLCJtaXNzaW5nS2V5cyIsInZhbGlkYXRlTGlzdGVuZXIiLCJ2YWxpZGF0ZVRhcmdldElkIiwidmFsaWRhdGVNZWRpYVR5cGUiLCJ2YWxpZGF0ZUV4dHJhIiwidmFsaWRhdGVQdXNoQ29uZmlnIiwicHVzaENvbmZpZ0tleXMiLCJpc1VuZGVmaW5lZCIsImlzQm9vbGVhbiIsImlzU3RyaW5nIiwiaU9TQ29uZmlnIiwiYW5kcm9pZENvbmZpZyIsInZhbGlkYXRlSU9TQ29uZmlnUmVzIiwidmFsaWRhdGVJT1NDb25maWciLCJ2YWxpZGF0ZUFuZHJvaWRDb25maWdSZXMiLCJ2YWxpZGF0ZUFuZHJvaWRDb25maWciLCJ0aHJlYWRJZCIsInJpY2hNZWRpYVVyaSIsImFuZHJvaWRDb25maWdLZXlzIiwidmFsaWRhdGVVc2VySWRzIiwic3RyIiwiaXNSQ0ZyYW1lUmF0ZSIsImlzVmFsaWRSZXNvbHV0aW9uIiwicmVzb2x1dGlvbiIsIlJDUmVzb2x1dGlvbiIsInZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiUkNDYWxsU2Vzc2lvbiIsIl9zdGF0ZU1hY2hpbmUiLCJfcnRjQ2xpZW50Iiwicm9vbUlkIiwic3VtbWFyeUluZm8iLCJzZW5kZXIiLCJpbnZpdGVkVXNlcnMiLCJjYWxsQmFjayIsInJvb20iLCJSQ1JUQ0NvZGUiLCJ0cmFja3MiLCJpc0FsbG93U3Vic2NyaWJlUmV0cnkiLCJjb3VudCIsImlzQWxsb3dQdWJsaXNoUmV0cnkiLCJjb25jbHVzaW9uIiwidHJhY2siLCJfY29kZSIsImF1ZGlvQ29uc3RyYWludHMiLCJyZWNlbnRUcmFja3MiLCJsb2NhbFRyYWNrcyIsImVycm9yTXNnIiwib2JqIiwibG9jYWxWaWRlb1RyYWNrcyIsImxvY2FsQXVkaW90cmFja3MiLCJieVNlcnZlciIsIlJDS2lja1JlYXNvbiIsIm5hbWUiLCJhdWRpb1RyYWNrIiwibXV0ZVVzZXIiLCJ2aWRlb1RyYWNrIiwicmVzdWx0IiwicmVwb3J0IiwiUkNDYWxsQ2xpZW50Iiwic2Vzc2lvbiIsInNlcyIsInN0YXRlTWFjaGluZSIsInB1c2hUaXRsZSIsInB1c2hDb250ZW50IiwiYml0cmF0ZSIsInZhbGlkYXRlUHVzaENvZGUiLCJfYiIsIl9jIiwiY2FsbFB1c2hDb25maWciLCJodW5ndXBQdXNoQ29uZmlnIiwidmFsaWRhdGVSZXMiLCJWZXJzaW9uTWFuYWdlIiwiaW5zdGFsbGVyIiwiY29udGV4dCIsImxvZ2dlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxNQUFNQSxLQUFlLENBQUNDLE1BQW1CO0FBQ2pD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