@agilemotion/oui-react-js 2.0.16 → 2.0.18
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/components/Calender.css +1 -1
- package/dist/components/TableCellContent.js +9 -18
- package/dist/components/dashboard/FoldingSideTabDashboard.css +1 -1
- package/dist/components/dashboard/FoldingSideTabDashboard.js +10 -7
- package/dist/components/form/LookupField.js +27 -3
- package/dist/components/layout/Layout.js +15 -3
- package/dist/components/layout/ViewPort.js +2 -2
- package/dist/components/layout/Window.css +4 -1
- package/dist/components/layout/Window.js +147 -29
- package/dist/components/layout/WindowDialog.js +8 -5
- package/dist/components/layout/WindowViewPort.js +8 -2
- package/dist/components/media/Chat.js +4 -2
- package/dist/components/media/ClosablePanel.js +55 -27
- package/dist/components/media/MediaSoupHelper.js +13 -1
- package/dist/components/media/SideBarContent.js +22 -8
- package/dist/components/media/TrainingRoom.js +141 -46
- package/dist/components/media/VCEventType.js +3 -1
- package/dist/components/media/VCParticipantList.js +53 -27
- package/dist/components/media/VCRoom.css +22 -0
- package/dist/components/media/VCRoom.js +34 -15
- package/dist/components/media/VCRoomParticipant.css +3 -2
- package/dist/components/media/VCRoomParticipant.js +140 -48
- package/dist/components/media/VCRoomRecorder.js +117 -40
- package/dist/components/media/VCRoomWorkspace.css +0 -1
- package/dist/components/media/VCRoomWorkspace.js +158 -23
- package/dist/components/media/VCSettings.js +462 -0
- package/dist/components/media/VideoPlayer.js +4 -1
- package/dist/components/media/audioLevelMeter.js +96 -0
- package/dist/components/media/chat/ChatRoom.js +13 -9
- package/dist/components/media/chat/ChatRoomItem.js +3 -2
- package/dist/components/media/chat/ChatRoomWrapper.js +4 -1
- package/dist/components/media/chat/ChatRooms.scss +5 -3
- package/dist/hooks/useContainerWidth.js +44 -0
- package/dist/js/Media.js +11 -2
- package/dist/view/security/RegisterInteractionPortal.js +101 -3
- package/package.json +2 -2
|
@@ -20,19 +20,60 @@ class VCRoomRecorder {
|
|
|
20
20
|
_defineProperty(this, "addTrack", (id, track) => {
|
|
21
21
|
console.log('ADDING TRACK FOR : ' + id);
|
|
22
22
|
this.audioTracks.set(id, track);
|
|
23
|
-
if (this.recorder && this.recorder.state === 'recording') {
|
|
24
|
-
|
|
25
|
-
const mediaStreamAudioSourceNode = new MediaStreamAudioSourceNode(this.audioContext, {
|
|
26
|
-
mediaStream: mediaStream
|
|
27
|
-
});
|
|
28
|
-
mediaStreamAudioSourceNode.connect(this.mediaStreamAudioDestinationNode);
|
|
23
|
+
if (this.recorder && this.recorder.state === 'recording' && this.audioContext && this.mediaStreamAudioDestinationNode) {
|
|
24
|
+
this.connectAudioTrack(id, track);
|
|
29
25
|
}
|
|
30
26
|
});
|
|
31
27
|
_defineProperty(this, "removeTrack", id => {
|
|
28
|
+
// Disconnect from the live mix before forgetting the track.
|
|
29
|
+
this.disconnectAudioTrack(id);
|
|
32
30
|
if (this.audioTracks.has(id)) {
|
|
33
31
|
this.audioTracks.delete(id);
|
|
34
32
|
}
|
|
35
33
|
});
|
|
34
|
+
// Route a participant's audio into the mixed recording destination. Replaces
|
|
35
|
+
// any existing node for the id so a re-add doesn't stack duplicate audio.
|
|
36
|
+
_defineProperty(this, "connectAudioTrack", (id, track) => {
|
|
37
|
+
if (!this.audioContext || !this.mediaStreamAudioDestinationNode || !track) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.disconnectAudioTrack(id);
|
|
41
|
+
try {
|
|
42
|
+
const sourceNode = new MediaStreamAudioSourceNode(this.audioContext, {
|
|
43
|
+
mediaStream: new MediaStream([track])
|
|
44
|
+
});
|
|
45
|
+
sourceNode.connect(this.mediaStreamAudioDestinationNode);
|
|
46
|
+
this.audioSourceNodes.set(id, sourceNode);
|
|
47
|
+
} catch (e) {
|
|
48
|
+
console.error('Failed to connect audio track for ' + id, e);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
_defineProperty(this, "disconnectAudioTrack", id => {
|
|
52
|
+
const existing = this.audioSourceNodes.get(id);
|
|
53
|
+
if (existing) {
|
|
54
|
+
try {
|
|
55
|
+
existing.disconnect();
|
|
56
|
+
} catch (e) {
|
|
57
|
+
/* node may already be detached */
|
|
58
|
+
}
|
|
59
|
+
this.audioSourceNodes.delete(id);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// Tear down the whole mixing graph. Idempotent.
|
|
63
|
+
_defineProperty(this, "releaseAudioGraph", () => {
|
|
64
|
+
for (const id of Array.from(this.audioSourceNodes.keys())) {
|
|
65
|
+
this.disconnectAudioTrack(id);
|
|
66
|
+
}
|
|
67
|
+
if (this.audioContext) {
|
|
68
|
+
try {
|
|
69
|
+
this.audioContext.close();
|
|
70
|
+
} catch (e) {
|
|
71
|
+
/* already closed */
|
|
72
|
+
}
|
|
73
|
+
this.audioContext = null;
|
|
74
|
+
}
|
|
75
|
+
this.mediaStreamAudioDestinationNode = null;
|
|
76
|
+
});
|
|
36
77
|
_defineProperty(this, "handleRecordingDataAvailable", e => {
|
|
37
78
|
if (e.data.size > 0) {
|
|
38
79
|
console.log('ADDED CHUNK : ' + this.recordingSequence);
|
|
@@ -56,13 +97,14 @@ class VCRoomRecorder {
|
|
|
56
97
|
_this.recordingType = blob.type;
|
|
57
98
|
_this.recordingSize += blob.size;
|
|
58
99
|
data.recordedData = result.replace('data:video/webm;base64,', '');
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
100
|
+
|
|
101
|
+
// Send STOP_RECORDING once the recording has been stopped, whether or
|
|
102
|
+
// not the final chunk saved — otherwise a failed last SAVE_RECORDING
|
|
103
|
+
// would leave the recording un-finalised server-side.
|
|
104
|
+
const finalizeStop = () => {
|
|
63
105
|
if (!_this.isRecording) {
|
|
64
106
|
console.log('======= STOPPING RECORDING =======', _this.meetingTitle);
|
|
65
|
-
|
|
107
|
+
_SocketManager.default.emitEvent(_VCEventType.VCEventType.STOP_RECORDING, {
|
|
66
108
|
meetingId: _this.meetingId,
|
|
67
109
|
userId: _ApplicationManager.default.getUserDetails().username,
|
|
68
110
|
name: _this.meetingTitle,
|
|
@@ -70,11 +112,18 @@ class VCRoomRecorder {
|
|
|
70
112
|
size: _this.recordingSize,
|
|
71
113
|
sequenceNumber: _this.recordingSequence,
|
|
72
114
|
sessionId: _this.currentRecordingId
|
|
73
|
-
}
|
|
74
|
-
|
|
115
|
+
}).catch(error => {
|
|
116
|
+
console.error('STOP RECORDING ERROR', error);
|
|
117
|
+
});
|
|
75
118
|
}
|
|
119
|
+
};
|
|
120
|
+
console.log('======== SAVING RECORDING CHUNK =========');
|
|
121
|
+
_SocketManager.default.emitEvent(_VCEventType.VCEventType.SAVE_RECORDING, data).then(() => {
|
|
122
|
+
console.log('===== SAVE RECORDING SUCCESS ======');
|
|
123
|
+
finalizeStop();
|
|
76
124
|
}).catch(error => {
|
|
77
|
-
console.
|
|
125
|
+
console.error('SAVE RECORDING ERROR', error);
|
|
126
|
+
finalizeStop();
|
|
78
127
|
});
|
|
79
128
|
};
|
|
80
129
|
_this.recordingSequence++;
|
|
@@ -86,7 +135,9 @@ class VCRoomRecorder {
|
|
|
86
135
|
this.recorder = null;
|
|
87
136
|
try {
|
|
88
137
|
this.recorder = await this.createMediaRecorder();
|
|
89
|
-
} catch (e) {
|
|
138
|
+
} catch (e) {
|
|
139
|
+
console.error('FAILED TO CREATE MEDIA RECORDER', e);
|
|
140
|
+
}
|
|
90
141
|
let _this = this;
|
|
91
142
|
if (this.recorder != null) {
|
|
92
143
|
_SocketManager.default.emitEvent(_VCEventType.VCEventType.TOGGLE_RECORD_MEETING, {
|
|
@@ -103,6 +154,13 @@ class VCRoomRecorder {
|
|
|
103
154
|
}).catch(error => {
|
|
104
155
|
console.log('RECORD START ERROR');
|
|
105
156
|
console.log(error);
|
|
157
|
+
// The recorder was created (screen-share prompt accepted) but the
|
|
158
|
+
// server never acknowledged — release the captured media + graph.
|
|
159
|
+
_this.releaseAudioGraph();
|
|
160
|
+
if (_this.recorder && _this.recorder.stream) {
|
|
161
|
+
_this.recorder.stream.getTracks().forEach(t => t.stop());
|
|
162
|
+
}
|
|
163
|
+
_this.recorder = null;
|
|
106
164
|
});
|
|
107
165
|
}
|
|
108
166
|
});
|
|
@@ -112,17 +170,25 @@ class VCRoomRecorder {
|
|
|
112
170
|
_SocketManager.default.emitEvent(_VCEventType.VCEventType.TOGGLE_RECORD_MEETING, {
|
|
113
171
|
roomId: this.meetingId,
|
|
114
172
|
isRecording: false
|
|
115
|
-
}).catch(error => {
|
|
173
|
+
}).catch(error => {
|
|
174
|
+
console.error('TOGGLE RECORD (stop) ERROR', error);
|
|
175
|
+
});
|
|
116
176
|
if (this.recorder && this.recorder.stream) {
|
|
117
177
|
if (this.recorder.stream.getVideoTracks().length > 0) {
|
|
118
178
|
this.recorder.stream.getVideoTracks()[0].stop();
|
|
119
179
|
}
|
|
120
180
|
if (this.recorder.state === 'recording') {
|
|
181
|
+
// onstop releases the audio graph after the final chunk flushes.
|
|
121
182
|
this.recorder.stop();
|
|
183
|
+
return;
|
|
122
184
|
}
|
|
123
185
|
}
|
|
186
|
+
|
|
187
|
+
// No active recorder to stop — release the graph directly.
|
|
188
|
+
this.releaseAudioGraph();
|
|
124
189
|
} catch (e) {
|
|
125
190
|
console.error(e);
|
|
191
|
+
this.releaseAudioGraph();
|
|
126
192
|
}
|
|
127
193
|
});
|
|
128
194
|
_defineProperty(this, "createMediaRecorder", () => {
|
|
@@ -142,32 +208,37 @@ class VCRoomRecorder {
|
|
|
142
208
|
const options = {
|
|
143
209
|
mimeType: 'video/webm; codecs=vp9'
|
|
144
210
|
};
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
} else {
|
|
157
|
-
let mediaStreamAudioSourceNode = new MediaStreamAudioSourceNode(audioContext, {
|
|
158
|
-
mediaStream: new MediaStream(tracks)
|
|
159
|
-
});
|
|
160
|
-
mediaStreamAudioSourceNode.connect(mediaStreamAudioDestinationNode);
|
|
211
|
+
const audioContext = new AudioContext();
|
|
212
|
+
const mediaStreamAudioDestinationNode = new MediaStreamAudioDestinationNode(audioContext);
|
|
213
|
+
_this.audioContext = audioContext;
|
|
214
|
+
_this.mediaStreamAudioDestinationNode = mediaStreamAudioDestinationNode;
|
|
215
|
+
_this.audioSourceNodes = new Map();
|
|
216
|
+
|
|
217
|
+
// Mix every known participant's audio into the single destination
|
|
218
|
+
// track (tracked so we can disconnect them later).
|
|
219
|
+
for (const [id, track] of _this.audioTracks.entries()) {
|
|
220
|
+
_this.connectAudioTrack(id, track);
|
|
161
221
|
}
|
|
162
|
-
|
|
163
|
-
|
|
222
|
+
|
|
223
|
+
// Record ONLY the mixed audio + screen video. (Pushing the raw
|
|
224
|
+
// per-participant tracks here used to rely on MediaRecorder
|
|
225
|
+
// silently ignoring extra audio tracks — fragile across browsers.)
|
|
226
|
+
const recordedTracks = [mediaStreamAudioDestinationNode.stream.getAudioTracks()[0], stream.getVideoTracks()[0]];
|
|
227
|
+
const initialMediaStream = new MediaStream(recordedTracks);
|
|
164
228
|
const recorder = new MediaRecorder(initialMediaStream, options);
|
|
165
229
|
recorder.ondataavailable = _this.handleRecordingDataAvailable;
|
|
166
|
-
recorder.onstop =
|
|
230
|
+
recorder.onstop = () => {
|
|
167
231
|
_this.isRecording = false;
|
|
232
|
+
_this.releaseAudioGraph();
|
|
168
233
|
};
|
|
169
|
-
|
|
170
|
-
|
|
234
|
+
|
|
235
|
+
// If the user ends the share via the browser's own "Stop sharing"
|
|
236
|
+
// control, the video track ends — stop the recording cleanly
|
|
237
|
+
// instead of carrying on with a dead track.
|
|
238
|
+
const videoTrack = stream.getVideoTracks()[0];
|
|
239
|
+
if (videoTrack) {
|
|
240
|
+
videoTrack.onended = () => _this.stopRecordingMeeting();
|
|
241
|
+
}
|
|
171
242
|
resolve(recorder);
|
|
172
243
|
}).catch(e => {
|
|
173
244
|
console.error(e);
|
|
@@ -179,13 +250,19 @@ class VCRoomRecorder {
|
|
|
179
250
|
this.meetingTitle = '';
|
|
180
251
|
this.recordingSequence = 0;
|
|
181
252
|
this.currentRecordingId = null;
|
|
182
|
-
this.recordingType =
|
|
183
|
-
this.recordingSize =
|
|
253
|
+
this.recordingType = '';
|
|
254
|
+
this.recordingSize = 0;
|
|
184
255
|
this.isRecording = false;
|
|
185
256
|
this.recorder = null;
|
|
186
257
|
this.audioTracks = new Map();
|
|
258
|
+
// Web Audio graph used to mix every participant's audio into one track.
|
|
259
|
+
this.audioContext = null;
|
|
260
|
+
this.mediaStreamAudioDestinationNode = null;
|
|
261
|
+
// Source nodes keyed by participant id so they can be disconnected when a
|
|
262
|
+
// participant leaves (otherwise they leak + re-adds stack duplicate audio).
|
|
263
|
+
this.audioSourceNodes = new Map();
|
|
187
264
|
}
|
|
188
265
|
}
|
|
189
266
|
const instance = new VCRoomRecorder();
|
|
190
267
|
var _default = exports.default = instance;
|
|
191
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU29ja2V0TWFuYWdlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX1ZDRXZlbnRUeXBlIiwiX0FwcGxpY2F0aW9uTWFuYWdlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9kZWZpbmVQcm9wZXJ0eSIsInIiLCJ0IiwiX3RvUHJvcGVydHlLZXkiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiY2FsbCIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIlZDUm9vbVJlY29yZGVyIiwiY29uc3RydWN0b3IiLCJtZWV0aW5nSWQiLCJtZWV0aW5nVGl0bGUiLCJpZCIsInRyYWNrIiwiY29uc29sZSIsImxvZyIsImF1ZGlvVHJhY2tzIiwic2V0IiwicmVjb3JkZXIiLCJzdGF0ZSIsIm1lZGlhU3RyZWFtIiwiTWVkaWFTdHJlYW0iLCJtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSIsIk1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlIiwiYXVkaW9Db250ZXh0IiwiY29ubmVjdCIsIm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUiLCJoYXMiLCJkZWxldGUiLCJkYXRhIiwic2l6ZSIsInJlY29yZGluZ1NlcXVlbmNlIiwiYmxvYiIsIkJsb2IiLCJ0eXBlIiwidXNlcklkIiwiYXBwbGljYXRpb25NYW5hZ2VyIiwiZ2V0VXNlckRldGFpbHMiLCJ1c2VybmFtZSIsIm5hbWUiLCJzZXF1ZW5jZU51bWJlciIsInNlc3Npb25JZCIsImN1cnJlbnRSZWNvcmRpbmdJZCIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwiX3RoaXMiLCJvbmxvYWQiLCJldnQiLCJyZXN1bHQiLCJ0YXJnZXQiLCJyZWNvcmRpbmdUeXBlIiwicmVjb3JkaW5nU2l6ZSIsInJlY29yZGVkRGF0YSIsInJlcGxhY2UiLCJzb2NrZXRNYW5hZ2VyIiwiZW1pdEV2ZW50IiwiVkNFdmVudFR5cGUiLCJTQVZFX1JFQ09SRElORyIsInRoZW4iLCJpc1JlY29yZGluZyIsIlNUT1BfUkVDT1JESU5HIiwiY2F0Y2giLCJlcnJvciIsImNyZWF0ZU1lZGlhUmVjb3JkZXIiLCJUT0dHTEVfUkVDT1JEX01FRVRJTkciLCJyb29tSWQiLCJzdGFydCIsInN0cmVhbSIsImdldFZpZGVvVHJhY2tzIiwibGVuZ3RoIiwic3RvcCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidmlkZW9Db25zdHJhaW50cyIsImN1cnNvciIsImF1ZGlvIiwibWVkaWFTb3VyY2UiLCJwcmVmZXJDdXJyZW50VGFiIiwic2VsZkJyb3dzZXJTdXJmYWNlIiwic3lzdGVtQXVkaW8iLCJzdXJmYWNlU3dpdGNoaW5nIiwibW9uaXRvclR5cGVTdXJmYWNlcyIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsImdldERpc3BsYXlNZWRpYSIsIm9wdGlvbnMiLCJtaW1lVHlwZSIsIkF1ZGlvQ29udGV4dCIsIk1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUiLCJ0cmFja3MiLCJnZXRBdWRpb1RyYWNrcyIsInZhbHVlcyIsInB1c2giLCJpbml0aWFsTWVkaWFTdHJlYW0iLCJNZWRpYVJlY29yZGVyIiwib25kYXRhYXZhaWxhYmxlIiwiaGFuZGxlUmVjb3JkaW5nRGF0YUF2YWlsYWJsZSIsIm9uc3RvcCIsIkVycm9yIiwibWVzc2FnZSIsIk1hcCIsImluc3RhbmNlIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21lZGlhL1ZDUm9vbVJlY29yZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzb2NrZXRNYW5hZ2VyIGZyb20gJy4uL1NvY2tldE1hbmFnZXInO1xuaW1wb3J0IHsgVkNFdmVudFR5cGUgfSBmcm9tICcuL1ZDRXZlbnRUeXBlJztcbmltcG9ydCBhcHBsaWNhdGlvbk1hbmFnZXIgZnJvbSBcIi4uLy4uL0FwcGxpY2F0aW9uTWFuYWdlclwiO1xuXG5jbGFzcyBWQ1Jvb21SZWNvcmRlciB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tZWV0aW5nSWQgPSBudWxsO1xuICAgICAgICB0aGlzLm1lZXRpbmdUaXRsZSA9ICcnO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1NlcXVlbmNlID0gMDtcbiAgICAgICAgdGhpcy5jdXJyZW50UmVjb3JkaW5nSWQgPSBudWxsO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1NpemUgPSBudWxsO1xuICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVjb3JkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmF1ZGlvVHJhY2tzID0gbmV3IE1hcCgpO1xuICAgIH1cblxuICAgIGluaXQgPSBhc3luYyAobWVldGluZ0lkLCBtZWV0aW5nVGl0bGUpID0+IHtcbiAgICAgICAgdGhpcy5tZWV0aW5nSWQgPSBtZWV0aW5nSWQ7XG4gICAgICAgIHRoaXMubWVldGluZ1RpdGxlID0gbWVldGluZ1RpdGxlO1xuICAgIH07XG5cbiAgICBhZGRUcmFjayA9IChpZCwgdHJhY2spID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FERElORyBUUkFDSyBGT1IgOiAnICsgaWQpO1xuICAgICAgICB0aGlzLmF1ZGlvVHJhY2tzLnNldChpZCwgdHJhY2spO1xuXG4gICAgICAgIGlmICh0aGlzLnJlY29yZGVyICYmIHRoaXMucmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgICAgICBsZXQgbWVkaWFTdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSk7XG4gICAgICAgICAgICBjb25zdCBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSA9IG5ldyBNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZShcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvQ29udGV4dCxcbiAgICAgICAgICAgICAgICB7IG1lZGlhU3RyZWFtOiBtZWRpYVN0cmVhbSB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5jb25uZWN0KHRoaXMubWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVtb3ZlVHJhY2sgPSAoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXVkaW9UcmFja3MuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1RyYWNrcy5kZWxldGUoaWQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGhhbmRsZVJlY29yZGluZ0RhdGFBdmFpbGFibGUgPSAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5kYXRhLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQURERUQgQ0hVTksgOiAnICsgdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSk7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2UuZGF0YV0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndmlkZW8vd2VibScsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICB1c2VySWQ6IGFwcGxpY2F0aW9uTWFuYWdlci5nZXRVc2VyRGV0YWlscygpLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgIG1lZXRpbmdJZDogdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5tZWV0aW5nVGl0bGUsXG4gICAgICAgICAgICAgICAgdHlwZTogYmxvYi50eXBlLFxuICAgICAgICAgICAgICAgIHNpemU6IGJsb2Iuc2l6ZSxcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcjogdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuY3VycmVudFJlY29yZGluZ0lkXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV2dC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGluZ1R5cGUgPSBibG9iLnR5cGU7XG4gICAgICAgICAgICAgICAgX3RoaXMucmVjb3JkaW5nU2l6ZSArPSBibG9iLnNpemU7XG5cbiAgICAgICAgICAgICAgICBkYXRhLnJlY29yZGVkRGF0YSA9IHJlc3VsdC5yZXBsYWNlKCdkYXRhOnZpZGVvL3dlYm07YmFzZTY0LCcsICcnKTtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBTQVZJTkcgUkVDT1JESU5HIENIVU5LID09PT09PT09PScpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlNBVkVfUkVDT1JESU5HLCBkYXRhKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09IFNBVkUgUkVDT1JESU5HIFNVQ0NFU1MgPT09PT09Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV90aGlzLmlzUmVjb3JkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PT0gU1RPUFBJTkcgUkVDT1JESU5HID09PT09PT0nLCBfdGhpcy5tZWV0aW5nVGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZXRpbmdJZDogX3RoaXMubWVldGluZ0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IGFwcGxpY2F0aW9uTWFuYWdlci5nZXRVc2VyRGV0YWlscygpLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBfdGhpcy5tZWV0aW5nVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IF90aGlzLnJlY29yZGluZ1R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IF90aGlzLnJlY29yZGluZ1NpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBfdGhpcy5jdXJyZW50UmVjb3JkaW5nSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0TWFuYWdlci5lbWl0RXZlbnQoVkNFdmVudFR5cGUuU1RPUF9SRUNPUkRJTkcsIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PSBTQVZFIFJFQ09SRElORyBFUlJPUiA9PT09PT0nKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25vIGRhdGEgdG8gcHVzaCcpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJlY29yZE1lZXRpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVjb3JkZXIgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZGVyID0gYXdhaXQgdGhpcy5jcmVhdGVNZWRpYVJlY29yZGVyKCk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucmVjb3JkZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgc29ja2V0TWFuYWdlci5lbWl0RXZlbnQoVkNFdmVudFR5cGUuVE9HR0xFX1JFQ09SRF9NRUVUSU5HLCB7XG4gICAgICAgICAgICAgICAgcm9vbUlkOiBfdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgaXNSZWNvcmRpbmc6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JFQ09SRElORyBTVEFSVEVEIDogJyArIGRhdGEuaWQpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5jdXJyZW50UmVjb3JkaW5nSWQgPSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGluZ1NpemUgPSAwO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdUeXBlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGVyLnN0YXJ0KDYwMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaXNSZWNvcmRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUkVDT1JEIFNUQVJUIEVSUk9SJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzdG9wUmVjb3JkaW5nTWVldGluZyA9ICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlRPR0dMRV9SRUNPUkRfTUVFVElORywge1xuICAgICAgICAgICAgICAgIHJvb21JZDogdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgaXNSZWNvcmRpbmc6IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkZXIgJiYgdGhpcy5yZWNvcmRlci5zdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRlci5zdHJlYW0uZ2V0VmlkZW9UcmFja3MoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkZXIuc3RyZWFtLmdldFZpZGVvVHJhY2tzKClbMF0uc3RvcCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKHRoaXMucmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjcmVhdGVNZWRpYVJlY29yZGVyID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9Db25zdHJhaW50cyA9IHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgYXVkaW86IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lZGlhU291cmNlOiBcInNjcmVlblwiLFxuICAgICAgICAgICAgICAgIHByZWZlckN1cnJlbnRUYWI6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VsZkJyb3dzZXJTdXJmYWNlOiAnaW5jbHVkZScsXG4gICAgICAgICAgICAgICAgc3lzdGVtQXVkaW86ICdleGNsdWRlJyxcbiAgICAgICAgICAgICAgICBzdXJmYWNlU3dpdGNoaW5nOiAnZXhjbHVkZScsXG4gICAgICAgICAgICAgICAgbW9uaXRvclR5cGVTdXJmYWNlczogJ2V4Y2x1ZGUnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAgICAgICAgIC5nZXREaXNwbGF5TWVkaWEodmlkZW9Db25zdHJhaW50cylcbiAgICAgICAgICAgICAgICAudGhlbigoc3RyZWFtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZTogJ3ZpZGVvL3dlYm07IGNvZGVjcz12cDknXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvQ29udGV4dCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUgPSBuZXcgTWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZShhdWRpb0NvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFja3MgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlLnN0cmVhbS5nZXRBdWRpb1RyYWNrcygpWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmdldFZpZGVvVHJhY2tzKClbMF1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb1RyYWNrcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLmF1ZGlvVHJhY2tzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSA9IG5ldyBNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lZGlhU3RyZWFtOiBuZXcgTWVkaWFTdHJlYW0oW3ZhbHVlXSkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5jb25uZWN0KG1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlID0gbmV3IE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lZGlhU3RyZWFtOiBuZXcgTWVkaWFTdHJlYW0odHJhY2tzKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5jb25uZWN0KG1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0lOSVQgV0lUSCBUUkFDS1MgOiAnLCB0cmFja3MpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbE1lZGlhU3RyZWFtID0gbmV3IE1lZGlhU3RyZWFtKHRyYWNrcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihpbml0aWFsTWVkaWFTdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSBfdGhpcy5oYW5kbGVSZWNvcmRpbmdEYXRhQXZhaWxhYmxlO1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRlci5vbnN0b3AgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IGF1ZGlvQ29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlID0gbWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlY29yZGVyKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlLm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuY29uc3QgaW5zdGFuY2UgPSBuZXcgVkNSb29tUmVjb3JkZXIoKTtcbmV4cG9ydCBkZWZhdWx0IGluc3RhbmNlO1xuXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLG1CQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFBMEQsU0FBQUQsdUJBQUFJLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFBQSxTQUFBRyxnQkFBQUgsQ0FBQSxFQUFBSSxDQUFBLEVBQUFDLENBQUEsWUFBQUQsQ0FBQSxHQUFBRSxjQUFBLENBQUFGLENBQUEsTUFBQUosQ0FBQSxHQUFBTyxNQUFBLENBQUFDLGNBQUEsQ0FBQVIsQ0FBQSxFQUFBSSxDQUFBLElBQUFLLEtBQUEsRUFBQUosQ0FBQSxFQUFBSyxVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxVQUFBWixDQUFBLENBQUFJLENBQUEsSUFBQUMsQ0FBQSxFQUFBTCxDQUFBO0FBQUEsU0FBQU0sZUFBQUQsQ0FBQSxRQUFBUSxDQUFBLEdBQUFDLFlBQUEsQ0FBQVQs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
|
|
268
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU29ja2V0TWFuYWdlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX1ZDRXZlbnRUeXBlIiwiX0FwcGxpY2F0aW9uTWFuYWdlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9kZWZpbmVQcm9wZXJ0eSIsInIiLCJ0IiwiX3RvUHJvcGVydHlLZXkiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiY2FsbCIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIlZDUm9vbVJlY29yZGVyIiwiY29uc3RydWN0b3IiLCJtZWV0aW5nSWQiLCJtZWV0aW5nVGl0bGUiLCJpZCIsInRyYWNrIiwiY29uc29sZSIsImxvZyIsImF1ZGlvVHJhY2tzIiwic2V0IiwicmVjb3JkZXIiLCJzdGF0ZSIsImF1ZGlvQ29udGV4dCIsIm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUiLCJjb25uZWN0QXVkaW9UcmFjayIsImRpc2Nvbm5lY3RBdWRpb1RyYWNrIiwiaGFzIiwiZGVsZXRlIiwic291cmNlTm9kZSIsIk1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlIiwibWVkaWFTdHJlYW0iLCJNZWRpYVN0cmVhbSIsImNvbm5lY3QiLCJhdWRpb1NvdXJjZU5vZGVzIiwiZXJyb3IiLCJleGlzdGluZyIsImdldCIsImRpc2Nvbm5lY3QiLCJBcnJheSIsImZyb20iLCJrZXlzIiwiY2xvc2UiLCJkYXRhIiwic2l6ZSIsInJlY29yZGluZ1NlcXVlbmNlIiwiYmxvYiIsIkJsb2IiLCJ0eXBlIiwidXNlcklkIiwiYXBwbGljYXRpb25NYW5hZ2VyIiwiZ2V0VXNlckRldGFpbHMiLCJ1c2VybmFtZSIsIm5hbWUiLCJzZXF1ZW5jZU51bWJlciIsInNlc3Npb25JZCIsImN1cnJlbnRSZWNvcmRpbmdJZCIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwiX3RoaXMiLCJvbmxvYWQiLCJldnQiLCJyZXN1bHQiLCJ0YXJnZXQiLCJyZWNvcmRpbmdUeXBlIiwicmVjb3JkaW5nU2l6ZSIsInJlY29yZGVkRGF0YSIsInJlcGxhY2UiLCJmaW5hbGl6ZVN0b3AiLCJpc1JlY29yZGluZyIsInNvY2tldE1hbmFnZXIiLCJlbWl0RXZlbnQiLCJWQ0V2ZW50VHlwZSIsIlNUT1BfUkVDT1JESU5HIiwiY2F0Y2giLCJTQVZFX1JFQ09SRElORyIsInRoZW4iLCJjcmVhdGVNZWRpYVJlY29yZGVyIiwiVE9HR0xFX1JFQ09SRF9NRUVUSU5HIiwicm9vbUlkIiwic3RhcnQiLCJyZWxlYXNlQXVkaW9HcmFwaCIsInN0cmVhbSIsImdldFRyYWNrcyIsImZvckVhY2giLCJzdG9wIiwiZ2V0VmlkZW9UcmFja3MiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInZpZGVvQ29uc3RyYWludHMiLCJjdXJzb3IiLCJhdWRpbyIsIm1lZGlhU291cmNlIiwicHJlZmVyQ3VycmVudFRhYiIsInNlbGZCcm93c2VyU3VyZmFjZSIsInN5c3RlbUF1ZGlvIiwic3VyZmFjZVN3aXRjaGluZyIsIm1vbml0b3JUeXBlU3VyZmFjZXMiLCJuYXZpZ2F0b3IiLCJtZWRpYURldmljZXMiLCJnZXREaXNwbGF5TWVkaWEiLCJvcHRpb25zIiwibWltZVR5cGUiLCJBdWRpb0NvbnRleHQiLCJNZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlIiwiTWFwIiwiZW50cmllcyIsInJlY29yZGVkVHJhY2tzIiwiZ2V0QXVkaW9UcmFja3MiLCJpbml0aWFsTWVkaWFTdHJlYW0iLCJNZWRpYVJlY29yZGVyIiwib25kYXRhYXZhaWxhYmxlIiwiaGFuZGxlUmVjb3JkaW5nRGF0YUF2YWlsYWJsZSIsIm9uc3RvcCIsInZpZGVvVHJhY2siLCJvbmVuZGVkIiwic3RvcFJlY29yZGluZ01lZXRpbmciLCJFcnJvciIsIm1lc3NhZ2UiLCJpbnN0YW5jZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tZWRpYS9WQ1Jvb21SZWNvcmRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc29ja2V0TWFuYWdlciBmcm9tICcuLi9Tb2NrZXRNYW5hZ2VyJztcbmltcG9ydCB7IFZDRXZlbnRUeXBlIH0gZnJvbSAnLi9WQ0V2ZW50VHlwZSc7XG5pbXBvcnQgYXBwbGljYXRpb25NYW5hZ2VyIGZyb20gXCIuLi8uLi9BcHBsaWNhdGlvbk1hbmFnZXJcIjtcblxuY2xhc3MgVkNSb29tUmVjb3JkZXIge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWVldGluZ0lkID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZWV0aW5nVGl0bGUgPSAnJztcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudFJlY29yZGluZ0lkID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdUeXBlID0gJyc7XG4gICAgICAgIHRoaXMucmVjb3JkaW5nU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWNvcmRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9UcmFja3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIFdlYiBBdWRpbyBncmFwaCB1c2VkIHRvIG1peCBldmVyeSBwYXJ0aWNpcGFudCdzIGF1ZGlvIGludG8gb25lIHRyYWNrLlxuICAgICAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMubWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZSA9IG51bGw7XG4gICAgICAgIC8vIFNvdXJjZSBub2RlcyBrZXllZCBieSBwYXJ0aWNpcGFudCBpZCBzbyB0aGV5IGNhbiBiZSBkaXNjb25uZWN0ZWQgd2hlbiBhXG4gICAgICAgIC8vIHBhcnRpY2lwYW50IGxlYXZlcyAob3RoZXJ3aXNlIHRoZXkgbGVhayArIHJlLWFkZHMgc3RhY2sgZHVwbGljYXRlIGF1ZGlvKS5cbiAgICAgICAgdGhpcy5hdWRpb1NvdXJjZU5vZGVzID0gbmV3IE1hcCgpO1xuICAgIH1cblxuICAgIGluaXQgPSBhc3luYyAobWVldGluZ0lkLCBtZWV0aW5nVGl0bGUpID0+IHtcbiAgICAgICAgdGhpcy5tZWV0aW5nSWQgPSBtZWV0aW5nSWQ7XG4gICAgICAgIHRoaXMubWVldGluZ1RpdGxlID0gbWVldGluZ1RpdGxlO1xuICAgIH07XG5cbiAgICBhZGRUcmFjayA9IChpZCwgdHJhY2spID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FERElORyBUUkFDSyBGT1IgOiAnICsgaWQpO1xuICAgICAgICB0aGlzLmF1ZGlvVHJhY2tzLnNldChpZCwgdHJhY2spO1xuXG4gICAgICAgIGlmICh0aGlzLnJlY29yZGVyICYmIHRoaXMucmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnXG4gICAgICAgICAgICAmJiB0aGlzLmF1ZGlvQ29udGV4dCAmJiB0aGlzLm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdEF1ZGlvVHJhY2soaWQsIHRyYWNrKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZW1vdmVUcmFjayA9IChpZCkgPT4ge1xuICAgICAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIGxpdmUgbWl4IGJlZm9yZSBmb3JnZXR0aW5nIHRoZSB0cmFjay5cbiAgICAgICAgdGhpcy5kaXNjb25uZWN0QXVkaW9UcmFjayhpZCk7XG4gICAgICAgIGlmICh0aGlzLmF1ZGlvVHJhY2tzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9UcmFja3MuZGVsZXRlKGlkKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBSb3V0ZSBhIHBhcnRpY2lwYW50J3MgYXVkaW8gaW50byB0aGUgbWl4ZWQgcmVjb3JkaW5nIGRlc3RpbmF0aW9uLiBSZXBsYWNlc1xuICAgIC8vIGFueSBleGlzdGluZyBub2RlIGZvciB0aGUgaWQgc28gYSByZS1hZGQgZG9lc24ndCBzdGFjayBkdXBsaWNhdGUgYXVkaW8uXG4gICAgY29ubmVjdEF1ZGlvVHJhY2sgPSAoaWQsIHRyYWNrKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb0NvbnRleHQgfHwgIXRoaXMubWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZSB8fCAhdHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RBdWRpb1RyYWNrKGlkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBuZXcgTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGUodGhpcy5hdWRpb0NvbnRleHQsIHtcbiAgICAgICAgICAgICAgICBtZWRpYVN0cmVhbTogbmV3IE1lZGlhU3RyZWFtKFt0cmFja10pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvdXJjZU5vZGUuY29ubmVjdCh0aGlzLm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUpO1xuICAgICAgICAgICAgdGhpcy5hdWRpb1NvdXJjZU5vZGVzLnNldChpZCwgc291cmNlTm9kZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb25uZWN0IGF1ZGlvIHRyYWNrIGZvciAnICsgaWQsIGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGRpc2Nvbm5lY3RBdWRpb1RyYWNrID0gKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5hdWRpb1NvdXJjZU5vZGVzLmdldChpZCk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBleGlzdGluZy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLyogbm9kZSBtYXkgYWxyZWFkeSBiZSBkZXRhY2hlZCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hdWRpb1NvdXJjZU5vZGVzLmRlbGV0ZShpZCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVGVhciBkb3duIHRoZSB3aG9sZSBtaXhpbmcgZ3JhcGguIElkZW1wb3RlbnQuXG4gICAgcmVsZWFzZUF1ZGlvR3JhcGggPSAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgQXJyYXkuZnJvbSh0aGlzLmF1ZGlvU291cmNlTm9kZXMua2V5cygpKSkge1xuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0QXVkaW9UcmFjayhpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXVkaW9Db250ZXh0KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Db250ZXh0LmNsb3NlKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLyogYWxyZWFkeSBjbG9zZWQgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUgPSBudWxsO1xuICAgIH07XG5cbiAgICBoYW5kbGVSZWNvcmRpbmdEYXRhQXZhaWxhYmxlID0gKGUpID0+IHtcbiAgICAgICAgaWYgKGUuZGF0YS5zaXplID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FEREVEIENIVU5LIDogJyArIHRoaXMucmVjb3JkaW5nU2VxdWVuY2UpO1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtlLmRhdGFdLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3ZpZGVvL3dlYm0nLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdXNlcklkOiBhcHBsaWNhdGlvbk1hbmFnZXIuZ2V0VXNlckRldGFpbHMoKS51c2VybmFtZSxcbiAgICAgICAgICAgICAgICBtZWV0aW5nSWQ6IHRoaXMubWVldGluZ0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubWVldGluZ1RpdGxlLFxuICAgICAgICAgICAgICAgIHR5cGU6IGJsb2IudHlwZSxcbiAgICAgICAgICAgICAgICBzaXplOiBibG9iLnNpemUsXG4gICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IHRoaXMucmVjb3JkaW5nU2VxdWVuY2UsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmN1cnJlbnRSZWNvcmRpbmdJZFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBldnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdUeXBlID0gYmxvYi50eXBlO1xuICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGluZ1NpemUgKz0gYmxvYi5zaXplO1xuXG4gICAgICAgICAgICAgICAgZGF0YS5yZWNvcmRlZERhdGEgPSByZXN1bHQucmVwbGFjZSgnZGF0YTp2aWRlby93ZWJtO2Jhc2U2NCwnLCAnJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZW5kIFNUT1BfUkVDT1JESU5HIG9uY2UgdGhlIHJlY29yZGluZyBoYXMgYmVlbiBzdG9wcGVkLCB3aGV0aGVyIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90IHRoZSBmaW5hbCBjaHVuayBzYXZlZCDigJQgb3RoZXJ3aXNlIGEgZmFpbGVkIGxhc3QgU0FWRV9SRUNPUkRJTkdcbiAgICAgICAgICAgICAgICAvLyB3b3VsZCBsZWF2ZSB0aGUgcmVjb3JkaW5nIHVuLWZpbmFsaXNlZCBzZXJ2ZXItc2lkZS5cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbGl6ZVN0b3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX3RoaXMuaXNSZWNvcmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09IFNUT1BQSU5HIFJFQ09SRElORyA9PT09PT09JywgX3RoaXMubWVldGluZ1RpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlNUT1BfUkVDT1JESU5HLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVldGluZ0lkOiBfdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBhcHBsaWNhdGlvbk1hbmFnZXIuZ2V0VXNlckRldGFpbHMoKS51c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBfdGhpcy5tZWV0aW5nVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogX3RoaXMucmVjb3JkaW5nVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBfdGhpcy5yZWNvcmRpbmdTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IF90aGlzLmN1cnJlbnRSZWNvcmRpbmdJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU1RPUCBSRUNPUkRJTkcgRVJST1InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnPT09PT09PT0gU0FWSU5HIFJFQ09SRElORyBDSFVOSyA9PT09PT09PT0nKTtcbiAgICAgICAgICAgICAgICBzb2NrZXRNYW5hZ2VyLmVtaXRFdmVudChWQ0V2ZW50VHlwZS5TQVZFX1JFQ09SRElORywgZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09IFNBVkUgUkVDT1JESU5HIFNVQ0NFU1MgPT09PT09Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZVN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU0FWRSBSRUNPUkRJTkcgRVJST1InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZVN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25vIGRhdGEgdG8gcHVzaCcpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJlY29yZE1lZXRpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVjb3JkZXIgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZGVyID0gYXdhaXQgdGhpcy5jcmVhdGVNZWRpYVJlY29yZGVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZBSUxFRCBUTyBDUkVBVEUgTUVESUEgUkVDT1JERVInLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLnJlY29yZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlRPR0dMRV9SRUNPUkRfTUVFVElORywge1xuICAgICAgICAgICAgICAgIHJvb21JZDogX3RoaXMubWVldGluZ0lkLFxuICAgICAgICAgICAgICAgIGlzUmVjb3JkaW5nOiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSRUNPUkRJTkcgU1RBUlRFRCA6ICcgKyBkYXRhLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3VycmVudFJlY29yZGluZ0lkID0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVjb3JkaW5nU2VxdWVuY2UgPSAwO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdTaXplID0gMDtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVjb3JkaW5nVHlwZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRlci5zdGFydCg2MDAwMCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JFQ09SRCBTVEFSVCBFUlJPUicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWNvcmRlciB3YXMgY3JlYXRlZCAoc2NyZWVuLXNoYXJlIHByb21wdCBhY2NlcHRlZCkgYnV0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgbmV2ZXIgYWNrbm93bGVkZ2VkIOKAlCByZWxlYXNlIHRoZSBjYXB0dXJlZCBtZWRpYSArIGdyYXBoLlxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWxlYXNlQXVkaW9HcmFwaCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMucmVjb3JkZXIgJiYgX3RoaXMucmVjb3JkZXIuc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRlci5zdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzdG9wUmVjb3JkaW5nTWVldGluZyA9ICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlRPR0dMRV9SRUNPUkRfTUVFVElORywge1xuICAgICAgICAgICAgICAgIHJvb21JZDogdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgaXNSZWNvcmRpbmc6IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVE9HR0xFIFJFQ09SRCAoc3RvcCkgRVJST1InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZGVyICYmIHRoaXMucmVjb3JkZXIuc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkZXIuc3RyZWFtLmdldFZpZGVvVHJhY2tzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyLnN0cmVhbS5nZXRWaWRlb1RyYWNrcygpWzBdLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRlci5zdGF0ZSA9PT0gJ3JlY29yZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb25zdG9wIHJlbGVhc2VzIHRoZSBhdWRpbyBncmFwaCBhZnRlciB0aGUgZmluYWwgY2h1bmsgZmx1c2hlcy5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRlci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5vIGFjdGl2ZSByZWNvcmRlciB0byBzdG9wIOKAlCByZWxlYXNlIHRoZSBncmFwaCBkaXJlY3RseS5cbiAgICAgICAgICAgIHRoaXMucmVsZWFzZUF1ZGlvR3JhcGgoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIHRoaXMucmVsZWFzZUF1ZGlvR3JhcGgoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjcmVhdGVNZWRpYVJlY29yZGVyID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9Db25zdHJhaW50cyA9IHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgYXVkaW86IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lZGlhU291cmNlOiBcInNjcmVlblwiLFxuICAgICAgICAgICAgICAgIHByZWZlckN1cnJlbnRUYWI6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VsZkJyb3dzZXJTdXJmYWNlOiAnaW5jbHVkZScsXG4gICAgICAgICAgICAgICAgc3lzdGVtQXVkaW86ICdleGNsdWRlJyxcbiAgICAgICAgICAgICAgICBzdXJmYWNlU3dpdGNoaW5nOiAnZXhjbHVkZScsXG4gICAgICAgICAgICAgICAgbW9uaXRvclR5cGVTdXJmYWNlczogJ2V4Y2x1ZGUnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAgICAgICAgIC5nZXREaXNwbGF5TWVkaWEodmlkZW9Db25zdHJhaW50cylcbiAgICAgICAgICAgICAgICAudGhlbigoc3RyZWFtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZTogJ3ZpZGVvL3dlYm07IGNvZGVjcz12cDknXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlID0gbmV3IE1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUoYXVkaW9Db250ZXh0KTtcblxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hdWRpb0NvbnRleHQgPSBhdWRpb0NvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUgPSBtZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hdWRpb1NvdXJjZU5vZGVzID0gbmV3IE1hcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1peCBldmVyeSBrbm93biBwYXJ0aWNpcGFudCdzIGF1ZGlvIGludG8gdGhlIHNpbmdsZSBkZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICAvLyB0cmFjayAodHJhY2tlZCBzbyB3ZSBjYW4gZGlzY29ubmVjdCB0aGVtIGxhdGVyKS5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaWQsIHRyYWNrXSBvZiBfdGhpcy5hdWRpb1RyYWNrcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbm5lY3RBdWRpb1RyYWNrKGlkLCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgT05MWSB0aGUgbWl4ZWQgYXVkaW8gKyBzY3JlZW4gdmlkZW8uIChQdXNoaW5nIHRoZSByYXdcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXBhcnRpY2lwYW50IHRyYWNrcyBoZXJlIHVzZWQgdG8gcmVseSBvbiBNZWRpYVJlY29yZGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yaW5nIGV4dHJhIGF1ZGlvIHRyYWNrcyDigJQgZnJhZ2lsZSBhY3Jvc3MgYnJvd3NlcnMuKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRlZFRyYWNrcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUuc3RyZWFtLmdldEF1ZGlvVHJhY2tzKClbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsTWVkaWFTdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0ocmVjb3JkZWRUcmFja3MpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoaW5pdGlhbE1lZGlhU3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gX3RoaXMuaGFuZGxlUmVjb3JkaW5nRGF0YUF2YWlsYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkZXIub25zdG9wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbGVhc2VBdWRpb0dyYXBoKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgZW5kcyB0aGUgc2hhcmUgdmlhIHRoZSBicm93c2VyJ3Mgb3duIFwiU3RvcCBzaGFyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udHJvbCwgdGhlIHZpZGVvIHRyYWNrIGVuZHMg4oCUIHN0b3AgdGhlIHJlY29yZGluZyBjbGVhbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgY2Fycnlpbmcgb24gd2l0aCBhIGRlYWQgdHJhY2suXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvVHJhY2sgPSBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvVHJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvVHJhY2sub25lbmRlZCA9ICgpID0+IF90aGlzLnN0b3BSZWNvcmRpbmdNZWV0aW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlY29yZGVyKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlLm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuY29uc3QgaW5zdGFuY2UgPSBuZXcgVkNSb29tUmVjb3JkZXIoKTtcbmV4cG9ydCBkZWZhdWx0IGluc3RhbmNlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxjQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxtQkFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQTBELFNBQUFELHVCQUFBSSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBQUEsU0FBQUcsZ0JBQUFILENBQUEsRUFBQUksQ0FBQSxFQUFBQyxDQUFBLFlBQUFELENBQUEsR0FBQUUsY0FBQSxDQUFBRixDQUFBLE1BQUFKLENBQUEsR0FBQU8sTUFBQSxDQUFBQyxjQUFBLENBQUFSLENBQUEsRUFBQUksQ0FBQSxJQUFBSyxLQUFBLEVBQUFKLENBQUEsRUFBQUssVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsVUFBQVosQ0FBQSxDQUFBSSxDQUFBLElBQUFDLENBQUEsRUFBQUwsQ0FBQTtBQUFBLFNBQUFNLGVBQUFELENBQUEsUUFBQVEsQ0FBQSxHQUFBQyxZQUFBLENBQUFULENBQUEsdUNBQUFRLENBQUEsR0FBQUEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQUMsYUFBQVQsQ0FBQSxFQUFBRCxDQUFBLDJCQUFBQyxDQUFBLEtBQUFBLENBQUEsU0FBQUEsQ0FBQSxNQUFBTCxDQUFBLEdBQUFLLENBQUEsQ0FBQVUsTUFBQSxDQUFBQyxXQUFBLGtCQUFBaEIsQ0FB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
|