tedious 13.0.5 → 14.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/bulk-load-payload.js +1 -19
- package/lib/bulk-load.js +1 -76
- package/lib/connection.js +164 -391
- package/lib/data-types/char.js +2 -6
- package/lib/data-types/nchar.js +2 -6
- package/lib/data-types/ntext.js +2 -6
- package/lib/data-types/nvarchar.js +2 -6
- package/lib/data-types/text.js +2 -6
- package/lib/data-types/uniqueidentifier.js +2 -6
- package/lib/data-types/varchar.js +2 -6
- package/lib/errors.js +26 -33
- package/lib/message-io.js +17 -7
- package/lib/token/handler.js +552 -0
- package/lib/token/token-stream-parser.js +3 -5
- package/lib/token/token.js +30 -34
- package/package.json +1 -2
package/lib/connection.js
CHANGED
|
@@ -59,8 +59,6 @@ var _message = _interopRequireDefault(require("./message"));
|
|
|
59
59
|
|
|
60
60
|
var _ntlm = require("./ntlm");
|
|
61
61
|
|
|
62
|
-
var _depd = _interopRequireDefault(require("depd"));
|
|
63
|
-
|
|
64
62
|
var _nodeAbortController = require("node-abort-controller");
|
|
65
63
|
|
|
66
64
|
var _dataType = require("./data-type");
|
|
@@ -71,10 +69,18 @@ var _package = require("../package.json");
|
|
|
71
69
|
|
|
72
70
|
var _url = require("url");
|
|
73
71
|
|
|
72
|
+
var _handler = require("./token/handler");
|
|
73
|
+
|
|
74
74
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
let trustServerWarningEmitted = false;
|
|
77
|
+
|
|
78
|
+
const emitTrustServerCertificateWarning = () => {
|
|
79
|
+
if (!trustServerWarningEmitted) {
|
|
80
|
+
trustServerWarningEmitted = true;
|
|
81
|
+
process.emitWarning('`config.options.trustServerCertificate` will default to false in the future. To silence this message, specify a value explicitly in the config options');
|
|
82
|
+
}
|
|
83
|
+
};
|
|
78
84
|
|
|
79
85
|
/**
|
|
80
86
|
* @private
|
|
@@ -278,18 +284,6 @@ class Connection extends _events.EventEmitter {
|
|
|
278
284
|
* @private
|
|
279
285
|
*/
|
|
280
286
|
|
|
281
|
-
/**
|
|
282
|
-
* @private
|
|
283
|
-
*/
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* @private
|
|
287
|
-
*/
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* @private
|
|
291
|
-
*/
|
|
292
|
-
|
|
293
287
|
/**
|
|
294
288
|
* Note: be aware of the different options field:
|
|
295
289
|
* 1. config.authentication.options
|
|
@@ -314,7 +308,6 @@ class Connection extends _events.EventEmitter {
|
|
|
314
308
|
constructor(config) {
|
|
315
309
|
super();
|
|
316
310
|
this.fedAuthRequired = void 0;
|
|
317
|
-
this.fedAuthInfoToken = void 0;
|
|
318
311
|
this.config = void 0;
|
|
319
312
|
this.secureContext = void 0;
|
|
320
313
|
this.inTransaction = void 0;
|
|
@@ -324,7 +317,6 @@ class Connection extends _events.EventEmitter {
|
|
|
324
317
|
this.curTransientRetryCount = void 0;
|
|
325
318
|
this.transientErrorLookup = void 0;
|
|
326
319
|
this.closed = void 0;
|
|
327
|
-
this.loggedIn = void 0;
|
|
328
320
|
this.loginError = void 0;
|
|
329
321
|
this.debug = void 0;
|
|
330
322
|
this.ntlmpacket = void 0;
|
|
@@ -333,7 +325,6 @@ class Connection extends _events.EventEmitter {
|
|
|
333
325
|
this.messageIo = void 0;
|
|
334
326
|
this.state = void 0;
|
|
335
327
|
this.resetConnectionOnNextRequest = void 0;
|
|
336
|
-
this.attentionReceived = void 0;
|
|
337
328
|
this.request = void 0;
|
|
338
329
|
this.procReturnStatusValue = void 0;
|
|
339
330
|
this.socket = void 0;
|
|
@@ -354,7 +345,6 @@ class Connection extends _events.EventEmitter {
|
|
|
354
345
|
}
|
|
355
346
|
|
|
356
347
|
this.fedAuthRequired = false;
|
|
357
|
-
this.fedAuthInfoToken = undefined;
|
|
358
348
|
let authentication;
|
|
359
349
|
|
|
360
350
|
if (config.authentication !== undefined) {
|
|
@@ -934,6 +924,8 @@ class Connection extends _events.EventEmitter {
|
|
|
934
924
|
}
|
|
935
925
|
|
|
936
926
|
this.config.options.trustServerCertificate = config.options.trustServerCertificate;
|
|
927
|
+
} else {
|
|
928
|
+
emitTrustServerCertificateWarning();
|
|
937
929
|
}
|
|
938
930
|
|
|
939
931
|
if (config.options.useColumnNames !== undefined) {
|
|
@@ -996,7 +988,6 @@ class Connection extends _events.EventEmitter {
|
|
|
996
988
|
this.transactionDepth = 0;
|
|
997
989
|
this.isSqlBatch = false;
|
|
998
990
|
this.closed = false;
|
|
999
|
-
this.loggedIn = false;
|
|
1000
991
|
this.messageBuffer = Buffer.alloc(0);
|
|
1001
992
|
this.curTransientRetryCount = 0;
|
|
1002
993
|
this.transientErrorLookup = new _transientErrorLookup.TransientErrorLookup();
|
|
@@ -1004,7 +995,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1004
995
|
|
|
1005
996
|
this._cancelAfterRequestSent = () => {
|
|
1006
997
|
this.messageIo.sendMessage(_packet.TYPE.ATTENTION);
|
|
1007
|
-
this.transitionTo(this.STATE.SENT_ATTENTION);
|
|
1008
998
|
this.createCancelTimer();
|
|
1009
999
|
};
|
|
1010
1000
|
}
|
|
@@ -1079,7 +1069,7 @@ class Connection extends _events.EventEmitter {
|
|
|
1079
1069
|
return;
|
|
1080
1070
|
}
|
|
1081
1071
|
|
|
1082
|
-
this.emit('connect',
|
|
1072
|
+
this.emit('connect', new _errors.ConnectionError(err.message, 'EINSTLOOKUP'));
|
|
1083
1073
|
} else {
|
|
1084
1074
|
this.connectOnPort(port, this.config.options.multiSubnetFailover, signal);
|
|
1085
1075
|
}
|
|
@@ -1109,13 +1099,12 @@ class Connection extends _events.EventEmitter {
|
|
|
1109
1099
|
const request = this.request;
|
|
1110
1100
|
|
|
1111
1101
|
if (request) {
|
|
1112
|
-
const err =
|
|
1102
|
+
const err = new _errors.RequestError('Connection closed before request completed.', 'ECLOSE');
|
|
1113
1103
|
request.callback(err);
|
|
1114
1104
|
this.request = undefined;
|
|
1115
1105
|
}
|
|
1116
1106
|
|
|
1117
1107
|
this.closed = true;
|
|
1118
|
-
this.loggedIn = false;
|
|
1119
1108
|
this.loginError = undefined;
|
|
1120
1109
|
}
|
|
1121
1110
|
}
|
|
@@ -1136,261 +1125,8 @@ class Connection extends _events.EventEmitter {
|
|
|
1136
1125
|
*/
|
|
1137
1126
|
|
|
1138
1127
|
|
|
1139
|
-
createTokenStreamParser(message) {
|
|
1140
|
-
|
|
1141
|
-
tokenStreamParser.on('infoMessage', token => {
|
|
1142
|
-
this.emit('infoMessage', token);
|
|
1143
|
-
});
|
|
1144
|
-
tokenStreamParser.on('sspichallenge', token => {
|
|
1145
|
-
if (token.ntlmpacket) {
|
|
1146
|
-
this.ntlmpacket = token.ntlmpacket;
|
|
1147
|
-
this.ntlmpacketBuffer = token.ntlmpacketBuffer;
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
this.emit('sspichallenge', token);
|
|
1151
|
-
});
|
|
1152
|
-
tokenStreamParser.on('errorMessage', token => {
|
|
1153
|
-
this.emit('errorMessage', token);
|
|
1154
|
-
|
|
1155
|
-
if (this.loggedIn) {
|
|
1156
|
-
const request = this.request;
|
|
1157
|
-
|
|
1158
|
-
if (request) {
|
|
1159
|
-
if (!request.canceled) {
|
|
1160
|
-
const error = new _errors.RequestError(token.message, 'EREQUEST');
|
|
1161
|
-
error.number = token.number;
|
|
1162
|
-
error.state = token.state;
|
|
1163
|
-
error.class = token.class;
|
|
1164
|
-
error.serverName = token.serverName;
|
|
1165
|
-
error.procName = token.procName;
|
|
1166
|
-
error.lineNumber = token.lineNumber;
|
|
1167
|
-
request.error = error;
|
|
1168
|
-
}
|
|
1169
|
-
}
|
|
1170
|
-
} else {
|
|
1171
|
-
const error = (0, _errors.ConnectionError)(token.message, 'ELOGIN');
|
|
1172
|
-
const isLoginErrorTransient = this.transientErrorLookup.isTransientError(token.number);
|
|
1173
|
-
|
|
1174
|
-
if (isLoginErrorTransient && this.curTransientRetryCount !== this.config.options.maxRetriesOnTransientErrors) {
|
|
1175
|
-
error.isTransient = true;
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
|
-
this.loginError = error;
|
|
1179
|
-
}
|
|
1180
|
-
});
|
|
1181
|
-
tokenStreamParser.on('databaseChange', token => {
|
|
1182
|
-
this.emit('databaseChange', token.newValue);
|
|
1183
|
-
});
|
|
1184
|
-
tokenStreamParser.on('languageChange', token => {
|
|
1185
|
-
this.emit('languageChange', token.newValue);
|
|
1186
|
-
});
|
|
1187
|
-
tokenStreamParser.on('charsetChange', token => {
|
|
1188
|
-
this.emit('charsetChange', token.newValue);
|
|
1189
|
-
});
|
|
1190
|
-
tokenStreamParser.on('sqlCollationChange', token => {
|
|
1191
|
-
this.databaseCollation = token.newValue;
|
|
1192
|
-
});
|
|
1193
|
-
tokenStreamParser.on('fedAuthInfo', token => {
|
|
1194
|
-
this.dispatchEvent('fedAuthInfo', token);
|
|
1195
|
-
});
|
|
1196
|
-
tokenStreamParser.on('featureExtAck', token => {
|
|
1197
|
-
this.dispatchEvent('featureExtAck', token);
|
|
1198
|
-
});
|
|
1199
|
-
tokenStreamParser.on('loginack', token => {
|
|
1200
|
-
if (!token.tdsVersion) {
|
|
1201
|
-
// unsupported TDS version
|
|
1202
|
-
this.loginError = (0, _errors.ConnectionError)('Server responded with unknown TDS version.', 'ETDS');
|
|
1203
|
-
this.loggedIn = false;
|
|
1204
|
-
return;
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
if (!token.interface) {
|
|
1208
|
-
// unsupported interface
|
|
1209
|
-
this.loginError = (0, _errors.ConnectionError)('Server responded with unsupported interface.', 'EINTERFACENOTSUPP');
|
|
1210
|
-
this.loggedIn = false;
|
|
1211
|
-
return;
|
|
1212
|
-
} // use negotiated version
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
this.config.options.tdsVersion = token.tdsVersion;
|
|
1216
|
-
this.loggedIn = true;
|
|
1217
|
-
});
|
|
1218
|
-
tokenStreamParser.on('routingChange', token => {
|
|
1219
|
-
// Removes instance name attached to the redirect url. E.g., redirect.db.net\instance1 --> redirect.db.net
|
|
1220
|
-
const [server] = token.newValue.server.split('\\');
|
|
1221
|
-
this.routingData = {
|
|
1222
|
-
server,
|
|
1223
|
-
port: token.newValue.port
|
|
1224
|
-
};
|
|
1225
|
-
});
|
|
1226
|
-
tokenStreamParser.on('packetSizeChange', token => {
|
|
1227
|
-
this.messageIo.packetSize(token.newValue);
|
|
1228
|
-
}); // A new top-level transaction was started. This is not fired
|
|
1229
|
-
// for nested transactions.
|
|
1230
|
-
|
|
1231
|
-
tokenStreamParser.on('beginTransaction', token => {
|
|
1232
|
-
this.transactionDescriptors.push(token.newValue);
|
|
1233
|
-
this.inTransaction = true;
|
|
1234
|
-
}); // A top-level transaction was committed. This is not fired
|
|
1235
|
-
// for nested transactions.
|
|
1236
|
-
|
|
1237
|
-
tokenStreamParser.on('commitTransaction', () => {
|
|
1238
|
-
this.transactionDescriptors.length = 1;
|
|
1239
|
-
this.inTransaction = false;
|
|
1240
|
-
}); // A top-level transaction was rolled back. This is not fired
|
|
1241
|
-
// for nested transactions. This is also fired if a batch
|
|
1242
|
-
// aborting error happened that caused a rollback.
|
|
1243
|
-
|
|
1244
|
-
tokenStreamParser.on('rollbackTransaction', () => {
|
|
1245
|
-
this.transactionDescriptors.length = 1; // An outermost transaction was rolled back. Reset the transaction counter
|
|
1246
|
-
|
|
1247
|
-
this.inTransaction = false;
|
|
1248
|
-
this.emit('rollbackTransaction');
|
|
1249
|
-
});
|
|
1250
|
-
tokenStreamParser.on('columnMetadata', token => {
|
|
1251
|
-
const request = this.request;
|
|
1252
|
-
|
|
1253
|
-
if (request) {
|
|
1254
|
-
if (!request.canceled) {
|
|
1255
|
-
if (this.config.options.useColumnNames) {
|
|
1256
|
-
const columns = Object.create(null);
|
|
1257
|
-
|
|
1258
|
-
for (let j = 0, len = token.columns.length; j < len; j++) {
|
|
1259
|
-
const col = token.columns[j];
|
|
1260
|
-
|
|
1261
|
-
if (columns[col.colName] == null) {
|
|
1262
|
-
columns[col.colName] = col;
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
|
|
1266
|
-
request.emit('columnMetadata', columns);
|
|
1267
|
-
} else {
|
|
1268
|
-
request.emit('columnMetadata', token.columns);
|
|
1269
|
-
}
|
|
1270
|
-
}
|
|
1271
|
-
} else {
|
|
1272
|
-
this.emit('error', new Error("Received 'columnMetadata' when no sqlRequest is in progress"));
|
|
1273
|
-
this.close();
|
|
1274
|
-
}
|
|
1275
|
-
});
|
|
1276
|
-
tokenStreamParser.on('order', token => {
|
|
1277
|
-
const request = this.request;
|
|
1278
|
-
|
|
1279
|
-
if (request) {
|
|
1280
|
-
if (!request.canceled) {
|
|
1281
|
-
request.emit('order', token.orderColumns);
|
|
1282
|
-
}
|
|
1283
|
-
} else {
|
|
1284
|
-
this.emit('error', new Error("Received 'order' when no sqlRequest is in progress"));
|
|
1285
|
-
this.close();
|
|
1286
|
-
}
|
|
1287
|
-
});
|
|
1288
|
-
tokenStreamParser.on('row', token => {
|
|
1289
|
-
const request = this.request;
|
|
1290
|
-
|
|
1291
|
-
if (request) {
|
|
1292
|
-
if (!request.canceled) {
|
|
1293
|
-
if (this.config.options.rowCollectionOnRequestCompletion) {
|
|
1294
|
-
request.rows.push(token.columns);
|
|
1295
|
-
}
|
|
1296
|
-
|
|
1297
|
-
if (this.config.options.rowCollectionOnDone) {
|
|
1298
|
-
request.rst.push(token.columns);
|
|
1299
|
-
}
|
|
1300
|
-
|
|
1301
|
-
if (!request.canceled) {
|
|
1302
|
-
request.emit('row', token.columns);
|
|
1303
|
-
}
|
|
1304
|
-
}
|
|
1305
|
-
} else {
|
|
1306
|
-
this.emit('error', new Error("Received 'row' when no sqlRequest is in progress"));
|
|
1307
|
-
this.close();
|
|
1308
|
-
}
|
|
1309
|
-
});
|
|
1310
|
-
tokenStreamParser.on('returnStatus', token => {
|
|
1311
|
-
const request = this.request;
|
|
1312
|
-
|
|
1313
|
-
if (request) {
|
|
1314
|
-
if (!request.canceled) {
|
|
1315
|
-
// Keep value for passing in 'doneProc' event.
|
|
1316
|
-
this.procReturnStatusValue = token.value;
|
|
1317
|
-
}
|
|
1318
|
-
}
|
|
1319
|
-
});
|
|
1320
|
-
tokenStreamParser.on('returnValue', token => {
|
|
1321
|
-
const request = this.request;
|
|
1322
|
-
|
|
1323
|
-
if (request) {
|
|
1324
|
-
if (!request.canceled) {
|
|
1325
|
-
request.emit('returnValue', token.paramName, token.value, token.metadata);
|
|
1326
|
-
}
|
|
1327
|
-
}
|
|
1328
|
-
});
|
|
1329
|
-
tokenStreamParser.on('doneProc', token => {
|
|
1330
|
-
const request = this.request;
|
|
1331
|
-
|
|
1332
|
-
if (request) {
|
|
1333
|
-
if (!request.canceled) {
|
|
1334
|
-
request.emit('doneProc', token.rowCount, token.more, this.procReturnStatusValue, request.rst);
|
|
1335
|
-
this.procReturnStatusValue = undefined;
|
|
1336
|
-
|
|
1337
|
-
if (token.rowCount !== undefined) {
|
|
1338
|
-
request.rowCount += token.rowCount;
|
|
1339
|
-
}
|
|
1340
|
-
|
|
1341
|
-
if (this.config.options.rowCollectionOnDone) {
|
|
1342
|
-
request.rst = [];
|
|
1343
|
-
}
|
|
1344
|
-
}
|
|
1345
|
-
}
|
|
1346
|
-
});
|
|
1347
|
-
tokenStreamParser.on('doneInProc', token => {
|
|
1348
|
-
const request = this.request;
|
|
1349
|
-
|
|
1350
|
-
if (request) {
|
|
1351
|
-
if (!request.canceled) {
|
|
1352
|
-
request.emit('doneInProc', token.rowCount, token.more, request.rst);
|
|
1353
|
-
|
|
1354
|
-
if (token.rowCount !== undefined) {
|
|
1355
|
-
request.rowCount += token.rowCount;
|
|
1356
|
-
}
|
|
1357
|
-
|
|
1358
|
-
if (this.config.options.rowCollectionOnDone) {
|
|
1359
|
-
request.rst = [];
|
|
1360
|
-
}
|
|
1361
|
-
}
|
|
1362
|
-
}
|
|
1363
|
-
});
|
|
1364
|
-
tokenStreamParser.on('done', token => {
|
|
1365
|
-
const request = this.request;
|
|
1366
|
-
|
|
1367
|
-
if (request) {
|
|
1368
|
-
if (token.attention) {
|
|
1369
|
-
this.dispatchEvent('attention');
|
|
1370
|
-
}
|
|
1371
|
-
|
|
1372
|
-
if (!request.canceled) {
|
|
1373
|
-
if (token.sqlError && !request.error) {
|
|
1374
|
-
// check if the DONE_ERROR flags was set, but an ERROR token was not sent.
|
|
1375
|
-
request.error = (0, _errors.RequestError)('An unknown error has occurred.', 'UNKNOWN');
|
|
1376
|
-
}
|
|
1377
|
-
|
|
1378
|
-
request.emit('done', token.rowCount, token.more, request.rst);
|
|
1379
|
-
|
|
1380
|
-
if (token.rowCount !== undefined) {
|
|
1381
|
-
request.rowCount += token.rowCount;
|
|
1382
|
-
}
|
|
1383
|
-
|
|
1384
|
-
if (this.config.options.rowCollectionOnDone) {
|
|
1385
|
-
request.rst = [];
|
|
1386
|
-
}
|
|
1387
|
-
}
|
|
1388
|
-
}
|
|
1389
|
-
});
|
|
1390
|
-
tokenStreamParser.on('resetConnection', () => {
|
|
1391
|
-
this.emit('resetConnection');
|
|
1392
|
-
});
|
|
1393
|
-
return tokenStreamParser;
|
|
1128
|
+
createTokenStreamParser(message, handler) {
|
|
1129
|
+
return new _tokenStreamParser.Parser(message, this.debug, handler, this.config.options);
|
|
1394
1130
|
}
|
|
1395
1131
|
|
|
1396
1132
|
connectOnPort(port, multiSubnetFailover, signal) {
|
|
@@ -1420,17 +1156,14 @@ class Connection extends _events.EventEmitter {
|
|
|
1420
1156
|
});
|
|
1421
1157
|
socket.setKeepAlive(true, KEEP_ALIVE_INITIAL_DELAY);
|
|
1422
1158
|
this.messageIo = new _messageIo.default(socket, this.config.options.packetSize, this.debug);
|
|
1423
|
-
this.messageIo.on('data', message => {
|
|
1424
|
-
this.dispatchEvent('message', message);
|
|
1425
|
-
});
|
|
1426
1159
|
this.messageIo.on('secure', cleartext => {
|
|
1427
1160
|
this.emit('secure', cleartext);
|
|
1428
1161
|
});
|
|
1429
|
-
this.messageIo.on('error', error => {
|
|
1430
|
-
this.socketError(error);
|
|
1431
|
-
});
|
|
1432
1162
|
this.socket = socket;
|
|
1433
|
-
this.
|
|
1163
|
+
this.closed = false;
|
|
1164
|
+
this.debug.log('connected to ' + this.config.server + ':' + this.config.options.port);
|
|
1165
|
+
this.sendPreLogin();
|
|
1166
|
+
this.transitionTo(this.STATE.SENT_PRELOGIN);
|
|
1434
1167
|
});
|
|
1435
1168
|
}
|
|
1436
1169
|
/**
|
|
@@ -1507,7 +1240,7 @@ class Connection extends _events.EventEmitter {
|
|
|
1507
1240
|
connectTimeout() {
|
|
1508
1241
|
const message = `Failed to connect to ${this.config.server}${this.config.options.port ? `:${this.config.options.port}` : `\\${this.config.options.instanceName}`} in ${this.config.options.connectTimeout}ms`;
|
|
1509
1242
|
this.debug.log(message);
|
|
1510
|
-
this.emit('connect',
|
|
1243
|
+
this.emit('connect', new _errors.ConnectionError(message, 'ETIMEOUT'));
|
|
1511
1244
|
this.connectTimer = undefined;
|
|
1512
1245
|
this.dispatchEvent('connectTimeout');
|
|
1513
1246
|
}
|
|
@@ -1519,7 +1252,7 @@ class Connection extends _events.EventEmitter {
|
|
|
1519
1252
|
cancelTimeout() {
|
|
1520
1253
|
const message = `Failed to cancel request in ${this.config.options.cancelTimeout}ms`;
|
|
1521
1254
|
this.debug.log(message);
|
|
1522
|
-
this.dispatchEvent('socketError',
|
|
1255
|
+
this.dispatchEvent('socketError', new _errors.ConnectionError(message, 'ETIMEOUT'));
|
|
1523
1256
|
}
|
|
1524
1257
|
/**
|
|
1525
1258
|
* @private
|
|
@@ -1532,7 +1265,7 @@ class Connection extends _events.EventEmitter {
|
|
|
1532
1265
|
request.cancel();
|
|
1533
1266
|
const timeout = request.timeout !== undefined ? request.timeout : this.config.options.requestTimeout;
|
|
1534
1267
|
const message = 'Timeout: Request failed to complete in ' + timeout + 'ms';
|
|
1535
|
-
request.error =
|
|
1268
|
+
request.error = new _errors.RequestError(message, 'ETIMEOUT');
|
|
1536
1269
|
}
|
|
1537
1270
|
/**
|
|
1538
1271
|
* @private
|
|
@@ -1552,6 +1285,7 @@ class Connection extends _events.EventEmitter {
|
|
|
1552
1285
|
clearConnectTimer() {
|
|
1553
1286
|
if (this.connectTimer) {
|
|
1554
1287
|
clearTimeout(this.connectTimer);
|
|
1288
|
+
this.connectTimer = undefined;
|
|
1555
1289
|
}
|
|
1556
1290
|
}
|
|
1557
1291
|
/**
|
|
@@ -1562,6 +1296,7 @@ class Connection extends _events.EventEmitter {
|
|
|
1562
1296
|
clearCancelTimer() {
|
|
1563
1297
|
if (this.cancelTimer) {
|
|
1564
1298
|
clearTimeout(this.cancelTimer);
|
|
1299
|
+
this.cancelTimer = undefined;
|
|
1565
1300
|
}
|
|
1566
1301
|
}
|
|
1567
1302
|
/**
|
|
@@ -1646,11 +1381,11 @@ class Connection extends _events.EventEmitter {
|
|
|
1646
1381
|
if (this.state === this.STATE.CONNECTING || this.state === this.STATE.SENT_TLSSSLNEGOTIATION) {
|
|
1647
1382
|
const message = `Failed to connect to ${this.config.server}:${this.config.options.port} - ${error.message}`;
|
|
1648
1383
|
this.debug.log(message);
|
|
1649
|
-
this.emit('connect',
|
|
1384
|
+
this.emit('connect', new _errors.ConnectionError(message, 'ESOCKET'));
|
|
1650
1385
|
} else {
|
|
1651
1386
|
const message = `Connection lost - ${error.message}`;
|
|
1652
1387
|
this.debug.log(message);
|
|
1653
|
-
this.emit('error',
|
|
1388
|
+
this.emit('error', new _errors.ConnectionError(message, 'ESOCKET'));
|
|
1654
1389
|
}
|
|
1655
1390
|
|
|
1656
1391
|
this.dispatchEvent('socketError', error);
|
|
@@ -1660,16 +1395,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1660
1395
|
*/
|
|
1661
1396
|
|
|
1662
1397
|
|
|
1663
|
-
socketConnect() {
|
|
1664
|
-
this.closed = false;
|
|
1665
|
-
this.debug.log('connected to ' + this.config.server + ':' + this.config.options.port);
|
|
1666
|
-
this.dispatchEvent('socketConnect');
|
|
1667
|
-
}
|
|
1668
|
-
/**
|
|
1669
|
-
* @private
|
|
1670
|
-
*/
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
1398
|
socketEnd() {
|
|
1674
1399
|
this.debug.log('socket ended');
|
|
1675
1400
|
|
|
@@ -2056,23 +1781,20 @@ class Connection extends _events.EventEmitter {
|
|
|
2056
1781
|
* bulkLoad.addColumn('last_name', TYPES.NVarchar, { nullable: false });
|
|
2057
1782
|
* bulkLoad.addColumn('date_of_birth', TYPES.Date, { nullable: false });
|
|
2058
1783
|
*
|
|
2059
|
-
* //
|
|
1784
|
+
* // Execute a bulk load with a predefined list of rows.
|
|
2060
1785
|
* //
|
|
2061
1786
|
* // Note that these rows are held in memory until the
|
|
2062
1787
|
* // bulk load was performed, so if you need to write a large
|
|
2063
1788
|
* // number of rows (e.g. by reading from a CSV file),
|
|
2064
|
-
* //
|
|
2065
|
-
*
|
|
2066
|
-
*
|
|
2067
|
-
*
|
|
2068
|
-
*
|
|
1789
|
+
* // passing an `AsyncIterable` is advisable to keep memory usage low.
|
|
1790
|
+
* connection.execBulkLoad(bulkLoad, [
|
|
1791
|
+
* { 'first_name': 'Steve', 'last_name': 'Jobs', 'day_of_birth': new Date('02-24-1955') },
|
|
1792
|
+
* { 'first_name': 'Bill', 'last_name': 'Gates', 'day_of_birth': new Date('10-28-1955') }
|
|
1793
|
+
* ]);
|
|
2069
1794
|
* ```
|
|
2070
1795
|
*
|
|
2071
1796
|
* @param bulkLoad A previously created [[BulkLoad]].
|
|
2072
|
-
*
|
|
2073
|
-
* @deprecated Adding rows to a [[BulkLoad]] via [[BulkLoad.addRow]] or [[BulkLoad.getRowStream]]
|
|
2074
|
-
* is deprecated and will be removed in the future. You should migrate to calling [[Connection.execBulkLoad]]
|
|
2075
|
-
* with a `Iterable` or `AsyncIterable` as the second argument instead.
|
|
1797
|
+
* @param rows A [[Iterable]] or [[AsyncIterable]] that contains the rows that should be bulk loaded.
|
|
2076
1798
|
*/
|
|
2077
1799
|
|
|
2078
1800
|
|
|
@@ -2179,7 +1901,7 @@ class Connection extends _events.EventEmitter {
|
|
|
2179
1901
|
if (name === 'handle') {
|
|
2180
1902
|
request.handle = value;
|
|
2181
1903
|
} else {
|
|
2182
|
-
request.error =
|
|
1904
|
+
request.error = new _errors.RequestError(`Tedious > Unexpected output parameter ${name} from sp_prepare`);
|
|
2183
1905
|
}
|
|
2184
1906
|
});
|
|
2185
1907
|
this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default('sp_prepare', parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
|
|
@@ -2485,10 +2207,10 @@ class Connection extends _events.EventEmitter {
|
|
|
2485
2207
|
if (this.state !== this.STATE.LOGGED_IN) {
|
|
2486
2208
|
const message = 'Requests can only be made in the ' + this.STATE.LOGGED_IN.name + ' state, not the ' + this.state.name + ' state';
|
|
2487
2209
|
this.debug.log(message);
|
|
2488
|
-
request.callback(
|
|
2210
|
+
request.callback(new _errors.RequestError(message, 'EINVALIDSTATE'));
|
|
2489
2211
|
} else if (request.canceled) {
|
|
2490
2212
|
process.nextTick(() => {
|
|
2491
|
-
request.callback(
|
|
2213
|
+
request.callback(new _errors.RequestError('Canceled.', 'ECANCEL'));
|
|
2492
2214
|
});
|
|
2493
2215
|
} else {
|
|
2494
2216
|
if (packetType === _packet.TYPE.SQL_BATCH) {
|
|
@@ -2504,7 +2226,8 @@ class Connection extends _events.EventEmitter {
|
|
|
2504
2226
|
request.rst = [];
|
|
2505
2227
|
|
|
2506
2228
|
const onCancel = () => {
|
|
2507
|
-
payloadStream.unpipe(message);
|
|
2229
|
+
payloadStream.unpipe(message);
|
|
2230
|
+
payloadStream.destroy(new _errors.RequestError('Canceled.', 'ECANCEL')); // set the ignore bit and end the message.
|
|
2508
2231
|
|
|
2509
2232
|
message.ignore = true;
|
|
2510
2233
|
message.end();
|
|
@@ -2540,7 +2263,6 @@ class Connection extends _events.EventEmitter {
|
|
|
2540
2263
|
payloadStream.unpipe(message); // Only set a request error if no error was set yet.
|
|
2541
2264
|
|
|
2542
2265
|
(_request$error = request.error) !== null && _request$error !== void 0 ? _request$error : request.error = error;
|
|
2543
|
-
payloadStream.unpipe(message);
|
|
2544
2266
|
message.ignore = true;
|
|
2545
2267
|
message.end();
|
|
2546
2268
|
});
|
|
@@ -2636,10 +2358,6 @@ Connection.prototype.STATE = {
|
|
|
2636
2358
|
},
|
|
2637
2359
|
connectTimeout: function () {
|
|
2638
2360
|
this.transitionTo(this.STATE.FINAL);
|
|
2639
|
-
},
|
|
2640
|
-
socketConnect: function () {
|
|
2641
|
-
this.sendPreLogin();
|
|
2642
|
-
this.transitionTo(this.STATE.SENT_PRELOGIN);
|
|
2643
2361
|
}
|
|
2644
2362
|
}
|
|
2645
2363
|
},
|
|
@@ -2647,6 +2365,11 @@ Connection.prototype.STATE = {
|
|
|
2647
2365
|
name: 'SentPrelogin',
|
|
2648
2366
|
enter: function () {
|
|
2649
2367
|
this.emptyMessageBuffer();
|
|
2368
|
+
this.messageIo.readMessage().then(message => {
|
|
2369
|
+
this.dispatchEvent('message', message);
|
|
2370
|
+
}, err => {
|
|
2371
|
+
this.socketError(err);
|
|
2372
|
+
});
|
|
2650
2373
|
},
|
|
2651
2374
|
events: {
|
|
2652
2375
|
socketError: function () {
|
|
@@ -2673,7 +2396,7 @@ Connection.prototype.STATE = {
|
|
|
2673
2396
|
var _this$routingData$ser, _this$routingData;
|
|
2674
2397
|
|
|
2675
2398
|
if (!this.config.options.encrypt) {
|
|
2676
|
-
this.emit('connect',
|
|
2399
|
+
this.emit('connect', new _errors.ConnectionError("Server requires encryption, set 'encrypt' config option to true.", 'EENCRYPT'));
|
|
2677
2400
|
return this.close();
|
|
2678
2401
|
}
|
|
2679
2402
|
|
|
@@ -2734,6 +2457,13 @@ Connection.prototype.STATE = {
|
|
|
2734
2457
|
},
|
|
2735
2458
|
SENT_TLSSSLNEGOTIATION: {
|
|
2736
2459
|
name: 'SentTLSSSLNegotiation',
|
|
2460
|
+
enter: function () {
|
|
2461
|
+
this.messageIo.readMessage().then(message => {
|
|
2462
|
+
this.dispatchEvent('message', message);
|
|
2463
|
+
}, err => {
|
|
2464
|
+
this.socketError(err);
|
|
2465
|
+
});
|
|
2466
|
+
},
|
|
2737
2467
|
events: {
|
|
2738
2468
|
socketError: function () {
|
|
2739
2469
|
this.transitionTo(this.STATE.FINAL);
|
|
@@ -2759,6 +2489,12 @@ Connection.prototype.STATE = {
|
|
|
2759
2489
|
} else {
|
|
2760
2490
|
this.transitionTo(this.STATE.SENT_LOGIN7_WITH_STANDARD_LOGIN);
|
|
2761
2491
|
}
|
|
2492
|
+
} else {
|
|
2493
|
+
this.messageIo.readMessage().then(message => {
|
|
2494
|
+
this.dispatchEvent('message', message);
|
|
2495
|
+
}, err => {
|
|
2496
|
+
this.socketError(err);
|
|
2497
|
+
});
|
|
2762
2498
|
}
|
|
2763
2499
|
});
|
|
2764
2500
|
}
|
|
@@ -2766,6 +2502,13 @@ Connection.prototype.STATE = {
|
|
|
2766
2502
|
},
|
|
2767
2503
|
SENT_LOGIN7_WITH_STANDARD_LOGIN: {
|
|
2768
2504
|
name: 'SentLogin7WithStandardLogin',
|
|
2505
|
+
enter: function () {
|
|
2506
|
+
this.messageIo.readMessage().then(message => {
|
|
2507
|
+
this.dispatchEvent('message', message);
|
|
2508
|
+
}, err => {
|
|
2509
|
+
this.socketError(err);
|
|
2510
|
+
});
|
|
2511
|
+
},
|
|
2769
2512
|
events: {
|
|
2770
2513
|
socketError: function () {
|
|
2771
2514
|
this.transitionTo(this.STATE.FINAL);
|
|
@@ -2773,32 +2516,13 @@ Connection.prototype.STATE = {
|
|
|
2773
2516
|
connectTimeout: function () {
|
|
2774
2517
|
this.transitionTo(this.STATE.FINAL);
|
|
2775
2518
|
},
|
|
2776
|
-
featureExtAck: function (token) {
|
|
2777
|
-
const {
|
|
2778
|
-
authentication
|
|
2779
|
-
} = this.config;
|
|
2780
|
-
|
|
2781
|
-
if (authentication.type === 'azure-active-directory-password' || authentication.type === 'azure-active-directory-access-token' || authentication.type === 'azure-active-directory-msi-vm' || authentication.type === 'azure-active-directory-msi-app-service' || authentication.type === 'azure-active-directory-service-principal-secret') {
|
|
2782
|
-
if (token.fedAuth === undefined) {
|
|
2783
|
-
this.loginError = (0, _errors.ConnectionError)('Did not receive Active Directory authentication acknowledgement');
|
|
2784
|
-
this.loggedIn = false;
|
|
2785
|
-
} else if (token.fedAuth.length !== 0) {
|
|
2786
|
-
this.loginError = (0, _errors.ConnectionError)(`Active Directory authentication acknowledgment for ${authentication.type} authentication method includes extra data`);
|
|
2787
|
-
this.loggedIn = false;
|
|
2788
|
-
}
|
|
2789
|
-
} else if (token.fedAuth === undefined && token.utf8Support === undefined) {
|
|
2790
|
-
this.loginError = (0, _errors.ConnectionError)('Received acknowledgement for unknown feature');
|
|
2791
|
-
this.loggedIn = false;
|
|
2792
|
-
} else if (token.fedAuth) {
|
|
2793
|
-
this.loginError = (0, _errors.ConnectionError)('Did not request Active Directory authentication, but received the acknowledgment');
|
|
2794
|
-
this.loggedIn = false;
|
|
2795
|
-
}
|
|
2796
|
-
},
|
|
2797
2519
|
message: function (message) {
|
|
2798
|
-
const
|
|
2520
|
+
const handler = new _handler.Login7TokenHandler(this);
|
|
2521
|
+
const tokenStreamParser = this.createTokenStreamParser(message, handler);
|
|
2799
2522
|
tokenStreamParser.once('end', () => {
|
|
2800
|
-
if (
|
|
2801
|
-
if (
|
|
2523
|
+
if (handler.loginAckReceived) {
|
|
2524
|
+
if (handler.routingData) {
|
|
2525
|
+
this.routingData = handler.routingData;
|
|
2802
2526
|
this.transitionTo(this.STATE.REROUTING);
|
|
2803
2527
|
} else {
|
|
2804
2528
|
this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL);
|
|
@@ -2812,7 +2536,7 @@ Connection.prototype.STATE = {
|
|
|
2812
2536
|
this.transitionTo(this.STATE.FINAL);
|
|
2813
2537
|
}
|
|
2814
2538
|
} else {
|
|
2815
|
-
this.emit('connect',
|
|
2539
|
+
this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN'));
|
|
2816
2540
|
this.transitionTo(this.STATE.FINAL);
|
|
2817
2541
|
}
|
|
2818
2542
|
});
|
|
@@ -2821,6 +2545,13 @@ Connection.prototype.STATE = {
|
|
|
2821
2545
|
},
|
|
2822
2546
|
SENT_LOGIN7_WITH_NTLM: {
|
|
2823
2547
|
name: 'SentLogin7WithNTLMLogin',
|
|
2548
|
+
enter: function () {
|
|
2549
|
+
this.messageIo.readMessage().then(message => {
|
|
2550
|
+
this.dispatchEvent('message', message);
|
|
2551
|
+
}, err => {
|
|
2552
|
+
this.socketError(err);
|
|
2553
|
+
});
|
|
2554
|
+
},
|
|
2824
2555
|
events: {
|
|
2825
2556
|
socketError: function () {
|
|
2826
2557
|
this.transitionTo(this.STATE.FINAL);
|
|
@@ -2829,9 +2560,17 @@ Connection.prototype.STATE = {
|
|
|
2829
2560
|
this.transitionTo(this.STATE.FINAL);
|
|
2830
2561
|
},
|
|
2831
2562
|
message: function (message) {
|
|
2832
|
-
const
|
|
2563
|
+
const handler = new _handler.Login7TokenHandler(this);
|
|
2564
|
+
const tokenStreamParser = this.createTokenStreamParser(message, handler);
|
|
2833
2565
|
tokenStreamParser.once('end', () => {
|
|
2834
|
-
if (
|
|
2566
|
+
if (handler.loginAckReceived) {
|
|
2567
|
+
if (handler.routingData) {
|
|
2568
|
+
this.routingData = handler.routingData;
|
|
2569
|
+
this.transitionTo(this.STATE.REROUTING);
|
|
2570
|
+
} else {
|
|
2571
|
+
this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL);
|
|
2572
|
+
}
|
|
2573
|
+
} else if (this.ntlmpacket) {
|
|
2835
2574
|
const authentication = this.config.authentication;
|
|
2836
2575
|
const payload = new _ntlmPayload.default({
|
|
2837
2576
|
domain: authentication.options.domain,
|
|
@@ -2844,12 +2583,11 @@ Connection.prototype.STATE = {
|
|
|
2844
2583
|
return payload.toString(' ');
|
|
2845
2584
|
});
|
|
2846
2585
|
this.ntlmpacket = undefined;
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
}
|
|
2586
|
+
this.messageIo.readMessage().then(message => {
|
|
2587
|
+
this.dispatchEvent('message', message);
|
|
2588
|
+
}, err => {
|
|
2589
|
+
this.socketError(err);
|
|
2590
|
+
});
|
|
2853
2591
|
} else if (this.loginError) {
|
|
2854
2592
|
if (this.loginError.isTransient) {
|
|
2855
2593
|
this.debug.log('Initiating retry on transient error');
|
|
@@ -2859,7 +2597,7 @@ Connection.prototype.STATE = {
|
|
|
2859
2597
|
this.transitionTo(this.STATE.FINAL);
|
|
2860
2598
|
}
|
|
2861
2599
|
} else {
|
|
2862
|
-
this.emit('connect',
|
|
2600
|
+
this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN'));
|
|
2863
2601
|
this.transitionTo(this.STATE.FINAL);
|
|
2864
2602
|
}
|
|
2865
2603
|
});
|
|
@@ -2868,6 +2606,13 @@ Connection.prototype.STATE = {
|
|
|
2868
2606
|
},
|
|
2869
2607
|
SENT_LOGIN7_WITH_FEDAUTH: {
|
|
2870
2608
|
name: 'SentLogin7Withfedauth',
|
|
2609
|
+
enter: function () {
|
|
2610
|
+
this.messageIo.readMessage().then(message => {
|
|
2611
|
+
this.dispatchEvent('message', message);
|
|
2612
|
+
}, err => {
|
|
2613
|
+
this.socketError(err);
|
|
2614
|
+
});
|
|
2615
|
+
},
|
|
2871
2616
|
events: {
|
|
2872
2617
|
socketError: function () {
|
|
2873
2618
|
this.transitionTo(this.STATE.FINAL);
|
|
@@ -2875,14 +2620,13 @@ Connection.prototype.STATE = {
|
|
|
2875
2620
|
connectTimeout: function () {
|
|
2876
2621
|
this.transitionTo(this.STATE.FINAL);
|
|
2877
2622
|
},
|
|
2878
|
-
fedAuthInfo: function (token) {
|
|
2879
|
-
this.fedAuthInfoToken = token;
|
|
2880
|
-
},
|
|
2881
2623
|
message: function (message) {
|
|
2882
|
-
const
|
|
2624
|
+
const handler = new _handler.Login7TokenHandler(this);
|
|
2625
|
+
const tokenStreamParser = this.createTokenStreamParser(message, handler);
|
|
2883
2626
|
tokenStreamParser.once('end', () => {
|
|
2884
|
-
if (
|
|
2885
|
-
if (
|
|
2627
|
+
if (handler.loginAckReceived) {
|
|
2628
|
+
if (handler.routingData) {
|
|
2629
|
+
this.routingData = handler.routingData;
|
|
2886
2630
|
this.transitionTo(this.STATE.REROUTING);
|
|
2887
2631
|
} else {
|
|
2888
2632
|
this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL);
|
|
@@ -2891,7 +2635,7 @@ Connection.prototype.STATE = {
|
|
|
2891
2635
|
return;
|
|
2892
2636
|
}
|
|
2893
2637
|
|
|
2894
|
-
const fedAuthInfoToken =
|
|
2638
|
+
const fedAuthInfoToken = handler.fedAuthInfoToken;
|
|
2895
2639
|
|
|
2896
2640
|
if (fedAuthInfoToken && fedAuthInfoToken.stsurl && fedAuthInfoToken.spn) {
|
|
2897
2641
|
const authentication = this.config.authentication;
|
|
@@ -2923,7 +2667,7 @@ Connection.prototype.STATE = {
|
|
|
2923
2667
|
|
|
2924
2668
|
getToken((err, token) => {
|
|
2925
2669
|
if (err) {
|
|
2926
|
-
this.loginError =
|
|
2670
|
+
this.loginError = new _errors.ConnectionError('Security token could not be authenticated or authorized.', 'EFEDAUTH');
|
|
2927
2671
|
this.emit('connect', this.loginError);
|
|
2928
2672
|
this.transitionTo(this.STATE.FINAL);
|
|
2929
2673
|
return;
|
|
@@ -2940,7 +2684,7 @@ Connection.prototype.STATE = {
|
|
|
2940
2684
|
this.transitionTo(this.STATE.FINAL);
|
|
2941
2685
|
}
|
|
2942
2686
|
} else {
|
|
2943
|
-
this.emit('connect',
|
|
2687
|
+
this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN'));
|
|
2944
2688
|
this.transitionTo(this.STATE.FINAL);
|
|
2945
2689
|
}
|
|
2946
2690
|
});
|
|
@@ -2951,6 +2695,11 @@ Connection.prototype.STATE = {
|
|
|
2951
2695
|
name: 'LoggedInSendingInitialSql',
|
|
2952
2696
|
enter: function () {
|
|
2953
2697
|
this.sendInitialSql();
|
|
2698
|
+
this.messageIo.readMessage().then(message => {
|
|
2699
|
+
this.dispatchEvent('message', message);
|
|
2700
|
+
}, err => {
|
|
2701
|
+
this.socketError(err);
|
|
2702
|
+
});
|
|
2954
2703
|
},
|
|
2955
2704
|
events: {
|
|
2956
2705
|
socketError: function socketError() {
|
|
@@ -2960,7 +2709,7 @@ Connection.prototype.STATE = {
|
|
|
2960
2709
|
this.transitionTo(this.STATE.FINAL);
|
|
2961
2710
|
},
|
|
2962
2711
|
message: function (message) {
|
|
2963
|
-
const tokenStreamParser = this.createTokenStreamParser(message);
|
|
2712
|
+
const tokenStreamParser = this.createTokenStreamParser(message, new _handler.InitialSqlTokenHandler(this));
|
|
2964
2713
|
tokenStreamParser.once('end', () => {
|
|
2965
2714
|
this.transitionTo(this.STATE.LOGGED_IN);
|
|
2966
2715
|
this.processedInitialSql();
|
|
@@ -2978,6 +2727,14 @@ Connection.prototype.STATE = {
|
|
|
2978
2727
|
},
|
|
2979
2728
|
SENT_CLIENT_REQUEST: {
|
|
2980
2729
|
name: 'SentClientRequest',
|
|
2730
|
+
enter: function () {
|
|
2731
|
+
this.emptyMessageBuffer();
|
|
2732
|
+
this.messageIo.readMessage().then(message => {
|
|
2733
|
+
this.dispatchEvent('message', message);
|
|
2734
|
+
}, err => {
|
|
2735
|
+
this.socketError(err);
|
|
2736
|
+
});
|
|
2737
|
+
},
|
|
2981
2738
|
exit: function (nextState) {
|
|
2982
2739
|
this.clearRequestTimer();
|
|
2983
2740
|
},
|
|
@@ -2989,31 +2746,42 @@ Connection.prototype.STATE = {
|
|
|
2989
2746
|
sqlRequest.callback(err);
|
|
2990
2747
|
},
|
|
2991
2748
|
message: function (message) {
|
|
2992
|
-
var _this$
|
|
2749
|
+
var _this$request, _this$request3, _this$request10;
|
|
2993
2750
|
|
|
2994
2751
|
// request timer is stopped on first data package
|
|
2995
2752
|
this.clearRequestTimer();
|
|
2996
|
-
const tokenStreamParser = this.createTokenStreamParser(message);
|
|
2753
|
+
const tokenStreamParser = this.createTokenStreamParser(message, new _handler.RequestTokenHandler(this, this.request)); // If the request was canceled and we have a `cancelTimer`
|
|
2754
|
+
// defined, we send a attention message after the
|
|
2755
|
+
// request message was fully sent off.
|
|
2756
|
+
//
|
|
2757
|
+
// We already started consuming the current message
|
|
2758
|
+
// (but all the token handlers should be no-ops), and
|
|
2759
|
+
// need to ensure the next message is handled by the
|
|
2760
|
+
// `SENT_ATTENTION` state.
|
|
2761
|
+
|
|
2762
|
+
if ((_this$request = this.request) !== null && _this$request !== void 0 && _this$request.canceled && this.cancelTimer) {
|
|
2763
|
+
return this.transitionTo(this.STATE.SENT_ATTENTION);
|
|
2764
|
+
}
|
|
2997
2765
|
|
|
2998
2766
|
const onResume = () => {
|
|
2999
2767
|
tokenStreamParser.resume();
|
|
3000
2768
|
};
|
|
3001
2769
|
|
|
3002
2770
|
const onPause = () => {
|
|
3003
|
-
var _this$
|
|
2771
|
+
var _this$request2;
|
|
3004
2772
|
|
|
3005
2773
|
tokenStreamParser.pause();
|
|
3006
|
-
(_this$
|
|
2774
|
+
(_this$request2 = this.request) === null || _this$request2 === void 0 ? void 0 : _this$request2.once('resume', onResume);
|
|
3007
2775
|
};
|
|
3008
2776
|
|
|
3009
|
-
(_this$
|
|
2777
|
+
(_this$request3 = this.request) === null || _this$request3 === void 0 ? void 0 : _this$request3.on('pause', onPause);
|
|
3010
2778
|
|
|
3011
2779
|
if (this.request instanceof _request.default && this.request.paused) {
|
|
3012
2780
|
onPause();
|
|
3013
2781
|
}
|
|
3014
2782
|
|
|
3015
2783
|
const onCancel = () => {
|
|
3016
|
-
var _this$
|
|
2784
|
+
var _this$request4, _this$request5;
|
|
3017
2785
|
|
|
3018
2786
|
tokenStreamParser.removeListener('end', onEndOfMessage);
|
|
3019
2787
|
|
|
@@ -3022,17 +2790,22 @@ Connection.prototype.STATE = {
|
|
|
3022
2790
|
this.request.resume();
|
|
3023
2791
|
}
|
|
3024
2792
|
|
|
3025
|
-
(_this$
|
|
3026
|
-
(_this$
|
|
2793
|
+
(_this$request4 = this.request) === null || _this$request4 === void 0 ? void 0 : _this$request4.removeListener('pause', onPause);
|
|
2794
|
+
(_this$request5 = this.request) === null || _this$request5 === void 0 ? void 0 : _this$request5.removeListener('resume', onResume); // The `_cancelAfterRequestSent` callback will have sent a
|
|
2795
|
+
// attention message, so now we need to also switch to
|
|
2796
|
+
// the `SENT_ATTENTION` state to make sure the attention ack
|
|
2797
|
+
// message is processed correctly.
|
|
2798
|
+
|
|
2799
|
+
this.transitionTo(this.STATE.SENT_ATTENTION);
|
|
3027
2800
|
};
|
|
3028
2801
|
|
|
3029
2802
|
const onEndOfMessage = () => {
|
|
3030
|
-
var _this$
|
|
2803
|
+
var _this$request6, _this$request7, _this$request8, _this$request9;
|
|
3031
2804
|
|
|
3032
|
-
(_this$
|
|
3033
|
-
(_this$
|
|
3034
|
-
(_this$
|
|
3035
|
-
(_this$
|
|
2805
|
+
(_this$request6 = this.request) === null || _this$request6 === void 0 ? void 0 : _this$request6.removeListener('cancel', this._cancelAfterRequestSent);
|
|
2806
|
+
(_this$request7 = this.request) === null || _this$request7 === void 0 ? void 0 : _this$request7.removeListener('cancel', onCancel);
|
|
2807
|
+
(_this$request8 = this.request) === null || _this$request8 === void 0 ? void 0 : _this$request8.removeListener('pause', onPause);
|
|
2808
|
+
(_this$request9 = this.request) === null || _this$request9 === void 0 ? void 0 : _this$request9.removeListener('resume', onResume);
|
|
3036
2809
|
this.transitionTo(this.STATE.LOGGED_IN);
|
|
3037
2810
|
const sqlRequest = this.request;
|
|
3038
2811
|
this.request = undefined;
|
|
@@ -3045,14 +2818,19 @@ Connection.prototype.STATE = {
|
|
|
3045
2818
|
};
|
|
3046
2819
|
|
|
3047
2820
|
tokenStreamParser.once('end', onEndOfMessage);
|
|
3048
|
-
(_this$
|
|
2821
|
+
(_this$request10 = this.request) === null || _this$request10 === void 0 ? void 0 : _this$request10.once('cancel', onCancel);
|
|
3049
2822
|
}
|
|
3050
2823
|
}
|
|
3051
2824
|
},
|
|
3052
2825
|
SENT_ATTENTION: {
|
|
3053
2826
|
name: 'SentAttention',
|
|
3054
2827
|
enter: function () {
|
|
3055
|
-
this.
|
|
2828
|
+
this.emptyMessageBuffer();
|
|
2829
|
+
this.messageIo.readMessage().then(message => {
|
|
2830
|
+
this.dispatchEvent('message', message);
|
|
2831
|
+
}, err => {
|
|
2832
|
+
this.socketError(err);
|
|
2833
|
+
});
|
|
3056
2834
|
},
|
|
3057
2835
|
events: {
|
|
3058
2836
|
socketError: function (err) {
|
|
@@ -3061,16 +2839,13 @@ Connection.prototype.STATE = {
|
|
|
3061
2839
|
this.transitionTo(this.STATE.FINAL);
|
|
3062
2840
|
sqlRequest.callback(err);
|
|
3063
2841
|
},
|
|
3064
|
-
attention: function () {
|
|
3065
|
-
this.attentionReceived = true;
|
|
3066
|
-
},
|
|
3067
2842
|
message: function (message) {
|
|
3068
|
-
const
|
|
2843
|
+
const handler = new _handler.AttentionTokenHandler(this, this.request);
|
|
2844
|
+
const tokenStreamParser = this.createTokenStreamParser(message, handler);
|
|
3069
2845
|
tokenStreamParser.once('end', () => {
|
|
3070
2846
|
// 3.2.5.7 Sent Attention State
|
|
3071
2847
|
// Discard any data contained in the response, until we receive the attention response
|
|
3072
|
-
if (
|
|
3073
|
-
this.attentionReceived = false;
|
|
2848
|
+
if (handler.attentionReceived) {
|
|
3074
2849
|
this.clearCancelTimer();
|
|
3075
2850
|
const sqlRequest = this.request;
|
|
3076
2851
|
this.request = undefined;
|
|
@@ -3079,7 +2854,7 @@ Connection.prototype.STATE = {
|
|
|
3079
2854
|
if (sqlRequest.error && sqlRequest.error instanceof _errors.RequestError && sqlRequest.error.code === 'ETIMEOUT') {
|
|
3080
2855
|
sqlRequest.callback(sqlRequest.error);
|
|
3081
2856
|
} else {
|
|
3082
|
-
sqlRequest.callback(
|
|
2857
|
+
sqlRequest.callback(new _errors.RequestError('Canceled.', 'ECANCEL'));
|
|
3083
2858
|
}
|
|
3084
2859
|
}
|
|
3085
2860
|
});
|
|
@@ -3092,8 +2867,6 @@ Connection.prototype.STATE = {
|
|
|
3092
2867
|
this.cleanupConnection(CLEANUP_TYPE.NORMAL);
|
|
3093
2868
|
},
|
|
3094
2869
|
events: {
|
|
3095
|
-
loginFailed: function () {// Do nothing. The connection was probably closed by the client code.
|
|
3096
|
-
},
|
|
3097
2870
|
connectTimeout: function () {// Do nothing, as the timer should be cleaned up.
|
|
3098
2871
|
},
|
|
3099
2872
|
message: function () {// Do nothing
|
|
@@ -3103,4 +2876,4 @@ Connection.prototype.STATE = {
|
|
|
3103
2876
|
}
|
|
3104
2877
|
}
|
|
3105
2878
|
};
|
|
3106
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbImRlcHJlY2F0ZSIsIktFRVBfQUxJVkVfSU5JVElBTF9ERUxBWSIsIkRFRkFVTFRfQ09OTkVDVF9USU1FT1VUIiwiREVGQVVMVF9DTElFTlRfUkVRVUVTVF9USU1FT1VUIiwiREVGQVVMVF9DQU5DRUxfVElNRU9VVCIsIkRFRkFVTFRfQ09OTkVDVF9SRVRSWV9JTlRFUlZBTCIsIkRFRkFVTFRfUEFDS0VUX1NJWkUiLCJERUZBVUxUX1RFWFRTSVpFIiwiREVGQVVMVF9EQVRFRklSU1QiLCJERUZBVUxUX1BPUlQiLCJERUZBVUxUX1REU19WRVJTSU9OIiwiREVGQVVMVF9MQU5HVUFHRSIsIkRFRkFVTFRfREFURUZPUk1BVCIsIkNMRUFOVVBfVFlQRSIsIk5PUk1BTCIsIlJFRElSRUNUIiwiUkVUUlkiLCJDb25uZWN0aW9uIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJmZWRBdXRoUmVxdWlyZWQiLCJmZWRBdXRoSW5mb1Rva2VuIiwic2VjdXJlQ29udGV4dCIsImluVHJhbnNhY3Rpb24iLCJ0cmFuc2FjdGlvbkRlc2NyaXB0b3JzIiwidHJhbnNhY3Rpb25EZXB0aCIsImlzU3FsQmF0Y2giLCJjdXJUcmFuc2llbnRSZXRyeUNvdW50IiwidHJhbnNpZW50RXJyb3JMb29rdXAiLCJjbG9zZWQiLCJsb2dnZWRJbiIsImxvZ2luRXJyb3IiLCJkZWJ1ZyIsIm50bG1wYWNrZXQiLCJudGxtcGFja2V0QnVmZmVyIiwicm91dGluZ0RhdGEiLCJtZXNzYWdlSW8iLCJzdGF0ZSIsInJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QiLCJhdHRlbnRpb25SZWNlaXZlZCIsInJlcXVlc3QiLCJwcm9jUmV0dXJuU3RhdHVzVmFsdWUiLCJzb2NrZXQiLCJtZXNzYWdlQnVmZmVyIiwiY29ubmVjdFRpbWVyIiwiY2FuY2VsVGltZXIiLCJyZXF1ZXN0VGltZXIiLCJyZXRyeVRpbWVyIiwiX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQiLCJkYXRhYmFzZUNvbGxhdGlvbiIsIlR5cGVFcnJvciIsInNlcnZlciIsInVuZGVmaW5lZCIsImF1dGhlbnRpY2F0aW9uIiwidHlwZSIsIm9wdGlvbnMiLCJkb21haW4iLCJ1c2VyTmFtZSIsInBhc3N3b3JkIiwidG9VcHBlckNhc2UiLCJ0b2tlbiIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwidGVuYW50SWQiLCJhYm9ydFRyYW5zYWN0aW9uT25FcnJvciIsImFwcE5hbWUiLCJjYW1lbENhc2VDb2x1bW5zIiwiY2FuY2VsVGltZW91dCIsImNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCIsImNvbHVtbkVuY3J5cHRpb25TZXR0aW5nIiwiY29sdW1uTmFtZVJlcGxhY2VyIiwiY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwiLCJjb25uZWN0VGltZW91dCIsImNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCIsIklTT0xBVElPTl9MRVZFTCIsIlJFQURfQ09NTUlUVEVEIiwiY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzIiwiZGF0YWJhc2UiLCJkYXRlZmlyc3QiLCJkYXRlRm9ybWF0IiwiZGF0YSIsInBhY2tldCIsInBheWxvYWQiLCJlbmFibGVBbnNpTnVsbCIsImVuYWJsZUFuc2lOdWxsRGVmYXVsdCIsImVuYWJsZUFuc2lQYWRkaW5nIiwiZW5hYmxlQW5zaVdhcm5pbmdzIiwiZW5hYmxlQXJpdGhBYm9ydCIsImVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsIiwiZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCIsImVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zIiwiZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQiLCJlbmFibGVRdW90ZWRJZGVudGlmaWVyIiwiZW5jcnlwdCIsImZhbGxiYWNrVG9EZWZhdWx0RGIiLCJlbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnMiLCJpbnN0YW5jZU5hbWUiLCJpc29sYXRpb25MZXZlbCIsImxhbmd1YWdlIiwibG9jYWxBZGRyZXNzIiwibWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzIiwibXVsdGlTdWJuZXRGYWlsb3ZlciIsInBhY2tldFNpemUiLCJwb3J0IiwicmVhZE9ubHlJbnRlbnQiLCJyZXF1ZXN0VGltZW91dCIsInJvd0NvbGxlY3Rpb25PbkRvbmUiLCJyb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiIsInNlcnZlck5hbWUiLCJzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb24iLCJ0ZHNWZXJzaW9uIiwidGV4dHNpemUiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwidHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSIsInVzZUNvbHVtbk5hbWVzIiwidXNlVVRDIiwid29ya3N0YXRpb25JZCIsImxvd2VyQ2FzZUd1aWRzIiwiRXJyb3IiLCJSYW5nZUVycm9yIiwiY3JlZGVudGlhbHNEZXRhaWxzIiwic2VjdXJlT3B0aW9ucyIsIk9iamVjdCIsImNyZWF0ZSIsInZhbHVlIiwiY29uc3RhbnRzIiwiU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyIsImNyZWF0ZURlYnVnIiwiQnVmZmVyIiwiZnJvbSIsImFsbG9jIiwiVHJhbnNpZW50RXJyb3JMb29rdXAiLCJTVEFURSIsIklOSVRJQUxJWkVEIiwic2VuZE1lc3NhZ2UiLCJUWVBFIiwiQVRURU5USU9OIiwidHJhbnNpdGlvblRvIiwiU0VOVF9BVFRFTlRJT04iLCJjcmVhdGVDYW5jZWxUaW1lciIsImNvbm5lY3QiLCJjb25uZWN0TGlzdGVuZXIiLCJDb25uZWN0aW9uRXJyb3IiLCJuYW1lIiwib25Db25uZWN0IiwiZXJyIiwicmVtb3ZlTGlzdGVuZXIiLCJvbkVycm9yIiwib25jZSIsIkNPTk5FQ1RJTkciLCJvbiIsImV2ZW50IiwibGlzdGVuZXIiLCJlbWl0IiwiYXJncyIsImNsb3NlIiwiRklOQUwiLCJpbml0aWFsaXNlQ29ubmVjdGlvbiIsInNpZ25hbCIsImNyZWF0ZUNvbm5lY3RUaW1lciIsImNvbm5lY3RPblBvcnQiLCJJbnN0YW5jZUxvb2t1cCIsImluc3RhbmNlTG9va3VwIiwidGltZW91dCIsIm1lc3NhZ2UiLCJjbGVhbnVwQ29ubmVjdGlvbiIsImNsZWFudXBUeXBlIiwiY2xlYXJDb25uZWN0VGltZXIiLCJjbGVhclJlcXVlc3RUaW1lciIsImNsZWFyUmV0cnlUaW1lciIsImNsb3NlQ29ubmVjdGlvbiIsInByb2Nlc3MiLCJuZXh0VGljayIsImNhbGxiYWNrIiwiRGVidWciLCJjcmVhdGVUb2tlblN0cmVhbVBhcnNlciIsInRva2VuU3RyZWFtUGFyc2VyIiwiVG9rZW5TdHJlYW1QYXJzZXIiLCJjYW5jZWxlZCIsImVycm9yIiwiUmVxdWVzdEVycm9yIiwibnVtYmVyIiwiY2xhc3MiLCJwcm9jTmFtZSIsImxpbmVOdW1iZXIiLCJpc0xvZ2luRXJyb3JUcmFuc2llbnQiLCJpc1RyYW5zaWVudEVycm9yIiwiaXNUcmFuc2llbnQiLCJuZXdWYWx1ZSIsImRpc3BhdGNoRXZlbnQiLCJpbnRlcmZhY2UiLCJzcGxpdCIsInB1c2giLCJsZW5ndGgiLCJjb2x1bW5zIiwiaiIsImxlbiIsImNvbCIsImNvbE5hbWUiLCJvcmRlckNvbHVtbnMiLCJyb3dzIiwicnN0IiwicGFyYW1OYW1lIiwibWV0YWRhdGEiLCJyb3dDb3VudCIsIm1vcmUiLCJhdHRlbnRpb24iLCJzcWxFcnJvciIsImNvbm5lY3RPcHRzIiwiaG9zdCIsIkNvbm5lY3RvciIsImV4ZWN1dGUiLCJzb2NrZXRFcnJvciIsInNvY2tldENsb3NlIiwic29ja2V0RW5kIiwic2V0S2VlcEFsaXZlIiwiTWVzc2FnZUlPIiwiY2xlYXJ0ZXh0Iiwic29ja2V0Q29ubmVjdCIsImRlc3Ryb3kiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiY2xlYXJDYW5jZWxUaW1lciIsImNyZWF0ZVJlcXVlc3RUaW1lciIsImNyZWF0ZVJldHJ5VGltZXIiLCJyZXRyeVRpbWVvdXQiLCJsb2ciLCJjYW5jZWwiLCJjbGVhclRpbWVvdXQiLCJuZXdTdGF0ZSIsImV4aXQiLCJjYWxsIiwiZW50ZXIiLCJhcHBseSIsImdldEV2ZW50SGFuZGxlciIsImV2ZW50TmFtZSIsImhhbmRsZXIiLCJldmVudHMiLCJTRU5UX1RMU1NTTE5FR09USUFUSU9OIiwiY29kZSIsIlJFUk9VVElORyIsIlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZIiwic2VuZFByZUxvZ2luIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwiZXhlYyIsInZlcnNpb24iLCJQcmVsb2dpblBheWxvYWQiLCJOdW1iZXIiLCJzdWJidWlsZCIsIlBSRUxPR0lOIiwidG9TdHJpbmciLCJlbXB0eU1lc3NhZ2VCdWZmZXIiLCJhZGRUb01lc3NhZ2VCdWZmZXIiLCJjb25jYXQiLCJzZW5kTG9naW43UGFja2V0IiwiTG9naW43UGF5bG9hZCIsInZlcnNpb25zIiwiY2xpZW50UHJvZ1ZlciIsImNsaWVudFBpZCIsInBpZCIsImNvbm5lY3Rpb25JZCIsImNsaWVudFRpbWVab25lIiwiRGF0ZSIsImdldFRpbWV6b25lT2Zmc2V0IiwiY2xpZW50TGNpZCIsImZlZEF1dGgiLCJlY2hvIiwid29ya2Zsb3ciLCJmZWRBdXRoVG9rZW4iLCJzc3BpIiwiaG9zdG5hbWUiLCJvcyIsImxpYnJhcnlOYW1lIiwiaW5pdERiRmF0YWwiLCJMT0dJTjciLCJ0b0J1ZmZlciIsInNlbmRGZWRBdXRoVG9rZW5NZXNzYWdlIiwiYWNjZXNzVG9rZW5MZW4iLCJieXRlTGVuZ3RoIiwib2Zmc2V0Iiwid3JpdGVVSW50MzJMRSIsIndyaXRlIiwiRkVEQVVUSF9UT0tFTiIsIlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4iLCJzZW5kSW5pdGlhbFNxbCIsIlNxbEJhdGNoUGF5bG9hZCIsImdldEluaXRpYWxTcWwiLCJjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yIiwiTWVzc2FnZSIsIlNRTF9CQVRDSCIsIm91dGdvaW5nTWVzc2FnZVN0cmVhbSIsIlJlYWRhYmxlIiwicGlwZSIsImdldElzb2xhdGlvbkxldmVsVGV4dCIsImpvaW4iLCJwcm9jZXNzZWRJbml0aWFsU3FsIiwiZXhlY1NxbEJhdGNoIiwibWFrZVJlcXVlc3QiLCJzcWxUZXh0T3JQcm9jZWR1cmUiLCJleGVjU3FsIiwidmFsaWRhdGVQYXJhbWV0ZXJzIiwicGFyYW1ldGVycyIsIlRZUEVTIiwiTlZhckNoYXIiLCJvdXRwdXQiLCJwcmVjaXNpb24iLCJzY2FsZSIsIm1ha2VQYXJhbXNQYXJhbWV0ZXIiLCJSUENfUkVRVUVTVCIsIlJwY1JlcXVlc3RQYXlsb2FkIiwibmV3QnVsa0xvYWQiLCJ0YWJsZSIsImNhbGxiYWNrT3JPcHRpb25zIiwiQnVsa0xvYWQiLCJleGVjQnVsa0xvYWQiLCJidWxrTG9hZCIsImV4ZWN1dGlvblN0YXJ0ZWQiLCJzdHJlYW1pbmdNb2RlIiwiZmlyc3RSb3dXcml0dGVuIiwicm93U3RyZWFtIiwicm93VG9QYWNrZXRUcmFuc2Zvcm0iLCJlbmQiLCJvbkNhbmNlbCIsIkJ1bGtMb2FkUGF5bG9hZCIsIlJlcXVlc3QiLCJnZXRCdWxrSW5zZXJ0U3FsIiwiQlVMS19MT0FEIiwicHJlcGFyZSIsIkludCIsInByZXBhcmluZyIsImhhbmRsZSIsInVucHJlcGFyZSIsImV4ZWN1dGVQYXJhbWV0ZXJzIiwiaSIsInBhcmFtZXRlciIsInZhbGlkYXRlIiwiY2FsbFByb2NlZHVyZSIsImJlZ2luVHJhbnNhY3Rpb24iLCJ0cmFuc2FjdGlvbiIsIlRyYW5zYWN0aW9uIiwiaXNvbGF0aW9uTGV2ZWxUb1RTUUwiLCJUUkFOU0FDVElPTl9NQU5BR0VSIiwiYmVnaW5QYXlsb2FkIiwiY29tbWl0VHJhbnNhY3Rpb24iLCJjb21taXRQYXlsb2FkIiwicm9sbGJhY2tUcmFuc2FjdGlvbiIsInJvbGxiYWNrUGF5bG9hZCIsInNhdmVUcmFuc2FjdGlvbiIsInNhdmVQYXlsb2FkIiwiY2IiLCJ1c2VTYXZlcG9pbnQiLCJjcnlwdG8iLCJyYW5kb21CeXRlcyIsInR4RG9uZSIsImRvbmUiLCJMT0dHRURfSU4iLCJ0eEVyciIsInBhY2tldFR5cGUiLCJjb25uZWN0aW9uIiwicGF5bG9hZFN0cmVhbSIsInVucGlwZSIsImlnbm9yZSIsInBhdXNlZCIsInJlc3VtZSIsInJlc2V0Q29ubmVjdGlvbiIsIlNFTlRfQ0xJRU5UX1JFUVVFU1QiLCJyZXNldCIsIlJFQURfVU5DT01NSVRURUQiLCJSRVBFQVRBQkxFX1JFQUQiLCJTRVJJQUxJWkFCTEUiLCJTTkFQU0hPVCIsIm1vZHVsZSIsImV4cG9ydHMiLCJwcm90b3R5cGUiLCJTRU5UX1BSRUxPR0lOIiwicHJlbG9naW5QYXlsb2FkIiwiZW5jcnlwdGlvblN0cmluZyIsInN0YXJ0VGxzIiwiU0VOVF9MT0dJTjdfV0lUSF9OVExNIiwicmVjb25uZWN0IiwicmV0cnkiLCJ0bHNIYW5kc2hha2VEYXRhIiwidGxzTmVnb3RpYXRpb25Db21wbGV0ZSIsIlNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSCIsImZlYXR1cmVFeHRBY2siLCJ1dGY4U3VwcG9ydCIsIkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMIiwiTlRMTVJlc3BvbnNlUGF5bG9hZCIsIk5UTE1BVVRIX1BLVCIsImZlZEF1dGhJbmZvIiwic3RzdXJsIiwic3BuIiwidG9rZW5TY29wZSIsIlVSTCIsImdldFRva2VuIiwiZ2V0VG9rZW5Gcm9tQ3JlZGVudGlhbHMiLCJjcmVkZW50aWFscyIsInRoZW4iLCJ0b2tlblJlc3BvbnNlIiwiVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWwiLCJtc2lBcmdzIiwiTWFuYWdlZElkZW50aXR5Q3JlZGVudGlhbCIsIkNsaWVudFNlY3JldENyZWRlbnRpYWwiLCJuZXh0U3RhdGUiLCJzcWxSZXF1ZXN0Iiwib25SZXN1bWUiLCJvblBhdXNlIiwicGF1c2UiLCJvbkVuZE9mTWVzc2FnZSIsImxvZ2luRmFpbGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7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Q3pCO0FBQ0QsT0FOSztBQU9ONEYsTUFBQUEsT0FBTyxFQUFFLFlBQVcsQ0FDbEI7QUFDRCxPQVRLO0FBVU5nRCxNQUFBQSxXQUFXLEVBQUUsWUFBVyxDQUN0QjtBQUNEO0FBWks7QUFMSDtBQXpkb0IsQ0FBN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnbmV0JztcblxuaW1wb3J0IGNvbnN0YW50cyBmcm9tICdjb25zdGFudHMnO1xuaW1wb3J0IHsgY3JlYXRlU2VjdXJlQ29udGV4dCwgU2VjdXJlQ29udGV4dCwgU2VjdXJlQ29udGV4dE9wdGlvbnMgfSBmcm9tICd0bHMnO1xuXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5cbmltcG9ydCB7XG4gIENsaWVudFNlY3JldENyZWRlbnRpYWwsXG4gIE1hbmFnZWRJZGVudGl0eUNyZWRlbnRpYWwsXG4gIFRva2VuQ3JlZGVudGlhbCxcbiAgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWwsXG59IGZyb20gJ0BhenVyZS9pZGVudGl0eSc7XG5cbmltcG9ydCBCdWxrTG9hZCwgeyBPcHRpb25zIGFzIEJ1bGtMb2FkT3B0aW9ucywgQ2FsbGJhY2sgYXMgQnVsa0xvYWRDYWxsYmFjayB9IGZyb20gJy4vYnVsay1sb2FkJztcbmltcG9ydCBEZWJ1ZyBmcm9tICcuL2RlYnVnJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBJbnN0YW5jZUxvb2t1cCB9IGZyb20gJy4vaW5zdGFuY2UtbG9va3VwJztcbmltcG9ydCB7IFRyYW5zaWVudEVycm9yTG9va3VwIH0gZnJvbSAnLi90cmFuc2llbnQtZXJyb3ItbG9va3VwJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuL3BhY2tldCc7XG5pbXBvcnQgUHJlbG9naW5QYXlsb2FkIGZyb20gJy4vcHJlbG9naW4tcGF5bG9hZCc7XG5pbXBvcnQgTG9naW43UGF5bG9hZCBmcm9tICcuL2xvZ2luNy1wYXlsb2FkJztcbmltcG9ydCBOVExNUmVzcG9uc2VQYXlsb2FkIGZyb20gJy4vbnRsbS1wYXlsb2FkJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgUnBjUmVxdWVzdFBheWxvYWQgZnJvbSAnLi9ycGNyZXF1ZXN0LXBheWxvYWQnO1xuaW1wb3J0IFNxbEJhdGNoUGF5bG9hZCBmcm9tICcuL3NxbGJhdGNoLXBheWxvYWQnO1xuaW1wb3J0IE1lc3NhZ2VJTyBmcm9tICcuL21lc3NhZ2UtaW8nO1xuaW1wb3J0IHsgUGFyc2VyIGFzIFRva2VuU3RyZWFtUGFyc2VyIH0gZnJvbSAnLi90b2tlbi90b2tlbi1zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBJU09MQVRJT05fTEVWRUwsIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgQ29ubmVjdG9yIH0gZnJvbSAnLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgbmFtZSBhcyBsaWJyYXJ5TmFtZSB9IGZyb20gJy4vbGlicmFyeSc7XG5pbXBvcnQgeyB2ZXJzaW9ucyB9IGZyb20gJy4vdGRzLXZlcnNpb25zJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vbWVzc2FnZSc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4vbWV0YWRhdGEtcGFyc2VyJztcbmltcG9ydCB7IEZlZEF1dGhJbmZvVG9rZW4sIEZlYXR1cmVFeHRBY2tUb2tlbiB9IGZyb20gJy4vdG9rZW4vdG9rZW4nO1xuaW1wb3J0IHsgY3JlYXRlTlRMTVJlcXVlc3QgfSBmcm9tICcuL250bG0nO1xuaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGEgfSBmcm9tICcuL3Rva2VuL2NvbG1ldGFkYXRhLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBDb2x1bW5FbmNyeXB0aW9uQXp1cmVLZXlWYXVsdFByb3ZpZGVyIH0gZnJvbSAnLi9hbHdheXMtZW5jcnlwdGVkL2tleXN0b3JlLXByb3ZpZGVyLWF6dXJlLWtleS12YXVsdCc7XG5pbXBvcnQgZGVwZCBmcm9tICdkZXBkJztcblxuaW1wb3J0IHsgQWJvcnRDb250cm9sbGVyLCBBYm9ydFNpZ25hbCB9IGZyb20gJ25vZGUtYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQgeyBQYXJhbWV0ZXIsIFRZUEVTIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgQnVsa0xvYWRQYXlsb2FkIH0gZnJvbSAnLi9idWxrLWxvYWQtcGF5bG9hZCc7XG5pbXBvcnQgeyBDb2xsYXRpb24gfSBmcm9tICcuL2NvbGxhdGlvbic7XG5cbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuY29uc3QgZGVwcmVjYXRlID0gZGVwZCgndGVkaW91cycpO1xuXG50eXBlIEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbkRlc2NyaXB0b3IgQSBCdWZmZXIgdGhhdCBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgdHJhbnNhY3Rpb25EZXNjcmlwdG9yPzogQnVmZmVyKSA9PiB2b2lkXG5cbnR5cGUgU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHRvIHNldCBhIHNhdmVwb2ludCB3aXRoaW4gdGhlXG4gICAqIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbnR5cGUgQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLFxuICAgKiBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggYW4gZXJyb3IuXG4gICAqIElmIGFuIGVycm9yIG9jY3VycmVkIHRoZW4gYGVycmAgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGhhc1xuICAgKiBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBlcnIgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJlc2V0Q2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHJlc2V0IGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICpcbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlclxuICAgKiByZXF1ZXN0IHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgSWYgYW4gZXJyb3Igb2NjdXJyZWQsIGFuIFtbRXJyb3JdXSBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xudHlwZSBUcmFuc2FjdGlvbkNhbGxiYWNrPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgYSB0cmFuc2FjdGlvbiAob3IgY3JlYXRlIGEgc2F2ZXBvaW50LCBpblxuICAgKiB0aGUgY2FzZSBvZiBhIG5lc3RlZCB0cmFuc2FjdGlvbikgaGFzIGNvbXBsZXRlZCwgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICogSWYgbm8gZXJyb3Igb2NjdXJyZWQsIHRoZSBjYWxsYmFjayBzaG91bGQgcGVyZm9ybSBpdHMgd29yayBhbmQgZXZlbnR1YWxseSBjYWxsXG4gICAqIGBkb25lYCB3aXRoIGFuIGVycm9yIG9yIG51bGwgKHRvIHRyaWdnZXIgYSB0cmFuc2FjdGlvbiByb2xsYmFjayBvciBhXG4gICAqIHRyYW5zYWN0aW9uIGNvbW1pdCkgYW5kIGFuIGFkZGl0aW9uYWwgY29tcGxldGlvbiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3RcbiAgICogdG8gcm9sbGJhY2sgb3IgY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgZ2l2ZW4gdG8gYGRvbmVgIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhpcyBjYWxsYmFjay5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gdHhEb25lIElmIG5vIGVycm9yIG9jY3VycmVkLCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBjb21taXQgb3Igcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCB0eERvbmU/OiBUcmFuc2FjdGlvbkRvbmU8VD4pID0+IHZvaWQ7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2sgPSAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xudHlwZSBDYWxsYmFja1BhcmFtZXRlcnM8VCBleHRlbmRzIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pID0+IGFueT4gPSBUIGV4dGVuZHMgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBpbmZlciBQKSA9PiBhbnkgPyBQIDogbmV2ZXI7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBJZiBubyBlcnJvciBvY2N1cnJlZCwgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gY29tbWl0IG9yIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnIgb2NjdXJyZWQsIGEgc3RyaW5nIHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIGRvbmU6IFQsIC4uLmFyZ3M6IENhbGxiYWNrUGFyYW1ldGVyczxUPikgPT4gdm9pZDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkgPSAzMCAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUID0gMTUgKiAxMDAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0NMSUVOVF9SRVFVRVNUX1RJTUVPVVQgPSAxNSAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQgPSA1ICogMTAwMDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9DT05ORUNUX1JFVFJZX0lOVEVSVkFMID0gNTAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX1BBQ0tFVF9TSVpFID0gNCAqIDEwMjQ7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVEVYVFNJWkUgPSAyMTQ3NDgzNjQ3O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0RBVEVGSVJTVCA9IDc7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IDE0MzM7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVERTX1ZFUlNJT04gPSAnN180Jztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRSA9ICd1c19lbmdsaXNoJztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9EQVRFRk9STUFUID0gJ21keSc7XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgdXNlciB3YW50IHRvIGNvbm5lY3QgdG8gYW4gQXp1cmUgYXBwIHNlcnZpY2UgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzY29pYXRlIHRvIHRoZWlyIGNyZWF0ZWQgaWRuZXRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9wdGlvbmFsIGZvciByZXRyaWV2ZSB0b2tlbiBmcm9tIGF6dXJlIHdlYiBhcHAgc2VydmljZVxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB1c2VyIHdhbnQgdG8gY29ubmVjdCB0byBhbiBBenVyZSBhcHAgc2VydmljZSB1c2luZyBhIHNwZWNpZmljIGNsaWVudCBhY2NvdW50XG4gICAgICogdGhleSBuZWVkIHRvIHByb3ZpZGUgYGNsaWVudElkYCBhc3Njb2lhdGUgdG8gdGhlaXIgY3JlYXRlZCBpZG5ldGl0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb3B0aW9uYWwgZm9yIHJldHJpZXZlIHRva2VuIGZyb20gYXp1cmUgd2ViIGFwcCBzZXJ2aWNlXG4gICAgICovXG4gICAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeUFjY2Vzc1Rva2VuQXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogQSB1c2VyIG5lZWQgdG8gcHJvdmlkZSBgdG9rZW5gIHdoaWNoIHRoZXkgcmV0cml2ZWQgZWxzZSB3aGVyZVxuICAgICAqIHRvIGZvcm1pbmcgdGhlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgdG9rZW46IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5UGFzc3dvcmRBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIEEgdXNlciBuZWVkIHRvIHByb3ZpZGUgYHVzZXJOYW1lYCBhc3Njb2lhdGUgdG8gdGhlaXIgYWNjb3VudC5cbiAgICAgKi9cbiAgICB1c2VyTmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlciBuZWVkIHRvIHByb3ZpZGUgYHBhc3N3b3JkYCBhc3Njb2lhdGUgdG8gdGhlaXIgYWNjb3VudC5cbiAgICAgKi9cbiAgICBwYXNzd29yZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgcGFyYW1ldGVyIGZvciBzcGVjaWZpYyBBenVyZSB0ZW5hbnQgSURcbiAgICAgKi9cbiAgICBkb21haW46IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBBcHBsaWNhdGlvbiAoYGNsaWVudGApIElEIGZyb20geW91ciByZWdpc3RlcmVkIEF6dXJlIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlYXRlZCBgY2xpZW50IHNlY3JldGAgZm9yIHRoaXMgcmVnaXN0ZXJlZCBBenVyZSBhcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERpcmVjdG9yeSAoYHRlbmFudGApIElEIGZyb20geW91ciByZWdpc3RlcmVkIEF6dXJlIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIE50bG1BdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdudGxtJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIFVzZXIgbmFtZSBmcm9tIHlvdXIgd2luZG93cyBhY2NvdW50LlxuICAgICAqL1xuICAgIHVzZXJOYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGFzc3dvcmQgZnJvbSB5b3VyIHdpbmRvd3MgYWNjb3VudC5cbiAgICAgKi9cbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE9uY2UgeW91IHNldCBkb21haW4gZm9yIG50bG0gYXV0aGVudGljYXRpb24gdHlwZSwgZHJpdmVyIHdpbGwgY29ubmVjdCB0byBTUUwgU2VydmVyIHVzaW5nIGRvbWFpbiBsb2dpbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBmb3JtaW5nIGEgY29ubmVjdGlvbiB1c2luZyBudGxtIHR5cGVcbiAgICAgKi9cbiAgICBkb21haW46IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIERlZmF1bHRBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdkZWZhdWx0JztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIFVzZXIgbmFtZSB0byB1c2UgZm9yIHNxbCBzZXJ2ZXIgbG9naW4uXG4gICAgICovXG4gICAgdXNlck5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogUGFzc3dvcmQgdG8gdXNlIGZvciBzcWwgc2VydmVyIGxvZ2luLlxuICAgICAqL1xuICAgIHBhc3N3b3JkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgRXJyb3JXaXRoQ29kZSBleHRlbmRzIEVycm9yIHtcbiAgY29kZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludGVybmFsQ29ubmVjdGlvbkNvbmZpZyB7XG4gIHNlcnZlcjogc3RyaW5nO1xuICBhdXRoZW50aWNhdGlvbjogRGVmYXVsdEF1dGhlbnRpY2F0aW9uIHwgTnRsbUF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lBcHBTZXJ2aWNlQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeUFjY2Vzc1Rva2VuQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQ7XG4gIG9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyB7XG4gIGFib3J0VHJhbnNhY3Rpb25PbkVycm9yOiBib29sZWFuO1xuICBhcHBOYW1lOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGNhbWVsQ2FzZUNvbHVtbnM6IGJvb2xlYW47XG4gIGNhbmNlbFRpbWVvdXQ6IG51bWJlcjtcbiAgY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMOiBudW1iZXI7XG4gIGNvbHVtbkVuY3J5cHRpb25TZXR0aW5nOiBib29sZWFuO1xuICBjb2x1bW5OYW1lUmVwbGFjZXI6IHVuZGVmaW5lZCB8ICgoY29sTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBtZXRhZGF0YTogTWV0YWRhdGEpID0+IHN0cmluZyk7XG4gIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiBudW1iZXI7XG4gIGNvbm5lY3RUaW1lb3V0OiBudW1iZXI7XG4gIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbDogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXTtcbiAgY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzOiBTZWN1cmVDb250ZXh0T3B0aW9ucztcbiAgZGF0YWJhc2U6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgZGF0ZWZpcnN0OiBudW1iZXI7XG4gIGRhdGVGb3JtYXQ6IHN0cmluZztcbiAgZGVidWc6IHtcbiAgICBkYXRhOiBib29sZWFuO1xuICAgIHBhY2tldDogYm9vbGVhbjtcbiAgICBwYXlsb2FkOiBib29sZWFuO1xuICAgIHRva2VuOiBib29sZWFuO1xuICB9O1xuICBlbmFibGVBbnNpTnVsbDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lOdWxsRGVmYXVsdDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lQYWRkaW5nOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQW5zaVdhcm5pbmdzOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQXJpdGhBYm9ydDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVRdW90ZWRJZGVudGlmaWVyOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5jcnlwdDogYm9vbGVhbjtcbiAgZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzOiBLZXlTdG9yZVByb3ZpZGVyTWFwIHwgdW5kZWZpbmVkO1xuICBmYWxsYmFja1RvRGVmYXVsdERiOiBib29sZWFuO1xuICBpbnN0YW5jZU5hbWU6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgaXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF07XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIGxvY2FsQWRkcmVzczogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM6IG51bWJlcjtcbiAgbXVsdGlTdWJuZXRGYWlsb3ZlcjogYm9vbGVhbjtcbiAgcGFja2V0U2l6ZTogbnVtYmVyO1xuICBwb3J0OiB1bmRlZmluZWQgfCBudW1iZXI7XG4gIHJlYWRPbmx5SW50ZW50OiBib29sZWFuO1xuICByZXF1ZXN0VGltZW91dDogbnVtYmVyO1xuICByb3dDb2xsZWN0aW9uT25Eb25lOiBib29sZWFuO1xuICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjogYm9vbGVhbjtcbiAgc2VydmVyTmFtZTogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb246IGJvb2xlYW47XG4gIHRkc1ZlcnNpb246IHN0cmluZztcbiAgdGV4dHNpemU6IG51bWJlcjtcbiAgdHJ1c3RlZFNlcnZlck5hbWVBRTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnVzdFNlcnZlckNlcnRpZmljYXRlOiBib29sZWFuO1xuICB1c2VDb2x1bW5OYW1lczogYm9vbGVhbjtcbiAgdXNlVVRDOiBib29sZWFuO1xuICB3b3Jrc3RhdGlvbklkOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGxvd2VyQ2FzZUd1aWRzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgS2V5U3RvcmVQcm92aWRlck1hcCB7XG4gIFtrZXk6IHN0cmluZ106IENvbHVtbkVuY3J5cHRpb25BenVyZUtleVZhdWx0UHJvdmlkZXI7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW50ZXJmYWNlIFN0YXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbnRlcj8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gIGV4aXQ/KHRoaXM6IENvbm5lY3Rpb24sIG5ld1N0YXRlOiBTdGF0ZSk6IHZvaWQ7XG4gIGV2ZW50czoge1xuICAgIHNvY2tldEVycm9yPyh0aGlzOiBDb25uZWN0aW9uLCBlcnI6IEVycm9yKTogdm9pZDtcbiAgICBjb25uZWN0VGltZW91dD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gICAgc29ja2V0Q29ubmVjdD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gICAgbWVzc2FnZT8odGhpczogQ29ubmVjdGlvbiwgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWQ7XG4gICAgcmV0cnk/KHRoaXM6IENvbm5lY3Rpb24pOiB2b2lkO1xuICAgIHJlY29ubmVjdD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gICAgZmVhdHVyZUV4dEFjaz8odGhpczogQ29ubmVjdGlvbiwgdG9rZW46IEZlYXR1cmVFeHRBY2tUb2tlbik6IHZvaWQ7XG4gICAgZmVkQXV0aEluZm8/KHRoaXM6IENvbm5lY3Rpb24sIHRva2VuOiBGZWRBdXRoSW5mb1Rva2VuKTogdm9pZDtcbiAgICBsb2dpbkZhaWxlZD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gICAgYXR0ZW50aW9uPyh0aGlzOiBDb25uZWN0aW9uKTogdm9pZDtcbiAgfTtcbn1cblxudHlwZSBBdXRoZW50aWNhdGlvbiA9IERlZmF1bHRBdXRoZW50aWNhdGlvbiB8XG4gIE50bG1BdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5UGFzc3dvcmRBdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpQXBwU2VydmljZUF1dGhlbnRpY2F0aW9uIHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlBY2Nlc3NUb2tlbkF1dGhlbnRpY2F0aW9uIHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlUHJpbmNpcGFsU2VjcmV0O1xuXG50eXBlIEF1dGhlbnRpY2F0aW9uVHlwZSA9IEF1dGhlbnRpY2F0aW9uWyd0eXBlJ107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogSG9zdG5hbWUgdG8gY29ubmVjdCB0by5cbiAgICovXG4gIHNlcnZlcjogc3RyaW5nO1xuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBmb3JtaW5nIHRoZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgb3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zO1xuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gcmVhbHRlZCBvcHRpb25zIGZvciBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXV0aGVudGljYXRpb24/OiBBdXRoZW50aWNhdGlvbk9wdGlvbnM7XG59XG5cbmludGVyZmFjZSBEZWJ1Z09wdGlvbnMge1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBkYXRhIGRldGFpbHNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBkYXRhOiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBkZXRhaWxzXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgcGFja2V0OiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBwYXlsb2FkIGRldGFpbHNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBwYXlsb2FkOiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHRva2VuIHN0cmVhbSB0b2tlbnNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICB0b2tlbjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUeXBlIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QsIHZhbGlkIHR5cGVzIGFyZSBgZGVmYXVsdGAsIGBudGxtYCxcbiAgICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmRgLCBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW5gLFxuICAgKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm1gLCBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2VgLFxuICAgKiBvciBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXRgXG4gICAqL1xuICB0eXBlPzogQXV0aGVudGljYXRpb25UeXBlO1xuICAvKipcbiAgICogRGlmZmVyZW50IG9wdGlvbnMgZm9yIGF1dGhlbnRpY2F0aW9uIHR5cGVzOlxuICAgKlxuICAgKiAqIGBkZWZhdWx0YDogW1tEZWZhdWx0QXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYG50bG1gIDpbW050bG1BdXRoZW50aWNhdGlvbl1dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmRgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuYCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlBY2Nlc3NUb2tlbkF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bWAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2VgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXRgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQub3B0aW9uc11dXG4gICAqL1xuICBvcHRpb25zPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHJvbGxiYWNrIGEgdHJhbnNhY3Rpb24gYXV0b21hdGljYWxseSBpZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWRcbiAgICogZHVyaW5nIHRoZSBnaXZlbiB0cmFuc2FjdGlvbidzIGV4ZWN1dGlvbi4gVGhpcyBzZXRzIHRoZSB2YWx1ZSBmb3IgYFNFVCBYQUNUX0FCT1JUYCBkdXJpbmcgdGhlXG4gICAqIGluaXRpYWwgU1FMIHBoYXNlIG9mIGEgY29ubmVjdGlvbiBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvc3FsL3Qtc3FsL3N0YXRlbWVudHMvc2V0LXhhY3QtYWJvcnQtdHJhbnNhY3Qtc3FsKS5cbiAgICovXG4gIGFib3J0VHJhbnNhY3Rpb25PbkVycm9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gbmFtZSB1c2VkIGZvciBpZGVudGlmeWluZyBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIGluIHByb2ZpbGluZywgbG9nZ2luZyBvciB0cmFjaW5nIHRvb2xzIG9mIFNRTFNlcnZlci5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBUZWRpb3VzYClcbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciB0aGUgY29sdW1uIG5hbWVzIHJldHVybmVkIHdpbGwgaGF2ZSB0aGUgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlXG4gICAqIChgdHJ1ZWApIG9yIG5vdC4gVGhpcyB2YWx1ZSBpcyBpZ25vcmVkIGlmIHlvdSBwcm92aWRlIGEgW1tjb2x1bW5OYW1lUmVwbGFjZXJdXS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgY2FtZWxDYXNlQ29sdW1ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgW1tSZXF1ZXN0LmNhbmNlbF1dIChhYm9ydCkgb2YgYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgZmFpbGVkXG4gICAqXG4gICAqIChkZWZhdWx0OiBgNTAwMGApLlxuICAgKi9cbiAgY2FuY2VsVGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB3aXRoIHBhcmFtZXRlcnMgYChjb2x1bW5OYW1lLCBpbmRleCwgY29sdW1uTWV0YURhdGEpYCBhbmQgcmV0dXJuaW5nIGEgc3RyaW5nLiBJZiBwcm92aWRlZCxcbiAgICogdGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIHBlciBjb2x1bW4gcGVyIHJlc3VsdC1zZXQuIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgU1FMLXByb3ZpZGVkXG4gICAqIGNvbHVtbiBuYW1lIG9uIHJvdyBhbmQgbWV0YSBkYXRhIG9iamVjdHMuIFRoaXMgYWxsb3dzIHlvdSB0byBkeW5hbWljYWxseSBjb252ZXJ0IGJldHdlZW4gbmFtaW5nIGNvbnZlbnRpb25zLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYG51bGxgKVxuICAgKi9cbiAgY29sdW1uTmFtZVJlcGxhY2VyPzogKGNvbE5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHJldHJ5aW5nIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLCBpbiBjYXNlIG9mIHRyYW5zaWVudCBmYWlsdXJlLlxuICAgKlxuICAgKiAoZGVmYXVsdDpgNTAwYClcbiAgICovXG4gIGNvbm5lY3Rpb25SZXRyeUludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGF0dGVtcHQgdG8gY29ubmVjdCBpcyBjb25zaWRlcmVkIGZhaWxlZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYDE1MDAwYCkuXG4gICAqL1xuICBjb25uZWN0VGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsIGZvciBuZXcgY29ubmVjdGlvbnMuIEFsbCBvdXQtb2YtdHJhbnNhY3Rpb24gcXVlcmllcyBhcmUgZXhlY3V0ZWQgd2l0aCB0aGlzIHNldHRpbmcuXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gbGV2ZWxzIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLklTT0xBVElPTl9MRVZFTGAuXG4gICAqICogYFJFQURfVU5DT01NSVRURURgXG4gICAqICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAqIGBSRVBFQVRBQkxFX1JFQURgXG4gICAqICogYFNFUklBTElaQUJMRWBcbiAgICogKiBgU05BUFNIT1RgXG4gICAqXG4gICAqIChkZWZhdWx0OiBgUkVBRF9DT01NSVRFRGApLlxuICAgKi9cbiAgY29ubmVjdGlvbklzb2xhdGlvbkxldmVsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIGVuY3J5cHRpb24gaXMgdXNlZCwgYW4gb2JqZWN0IG1heSBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdXNlZFxuICAgKiBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IHdoZW4gY2FsbGluZyBbYHRscy5jcmVhdGVTZWN1cmVQYWlyYF0oaHR0cDovL25vZGVqcy5vcmcvZG9jcy9sYXRlc3QvYXBpL3Rscy5odG1sI3Rsc190bHNfY3JlYXRlc2VjdXJlcGFpcl9jcmVkZW50aWFsc19pc3NlcnZlcl9yZXF1ZXN0Y2VydF9yZWplY3R1bmF1dGhvcml6ZWQpXG4gICAqXG4gICAqIChkZWZhdWx0OiBge31gKVxuICAgKi9cbiAgY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzPzogU2VjdXJlQ29udGV4dE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIERhdGFiYXNlIHRvIGNvbm5lY3QgdG8gKGRlZmF1bHQ6IGRlcGVuZGVudCBvbiBzZXJ2ZXIgY29uZmlndXJhdGlvbikuXG4gICAqL1xuICBkYXRhYmFzZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIHRvIGEgbnVtYmVyIGZyb20gMSB0aHJvdWdoIDcuXG4gICAqL1xuICBkYXRlZmlyc3Q/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyBwb3NpdGlvbiBvZiBtb250aCwgZGF5IGFuZCB5ZWFyIGluIHRlbXBvcmFsIGRhdGF0eXBlcy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBtZHlgKVxuICAgKi9cbiAgZGF0ZUZvcm1hdD86IHN0cmluZztcblxuICBkZWJ1Zz86IERlYnVnT3B0aW9ucztcblxuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9scyB0aGUgd2F5IG51bGwgdmFsdWVzIHNob3VsZCBiZSB1c2VkIGR1cmluZyBjb21wYXJpc29uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFuc2lOdWxsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgYFNFVCBBTlNJX05VTExfREZMVF9PTiBPTmAgd2lsbCBiZSBzZXQgaW4gdGhlIGluaXRpYWwgc3FsLiBUaGlzIG1lYW5zIG5ldyBjb2x1bW5zIHdpbGwgYmVcbiAgICogbnVsbGFibGUgYnkgZGVmYXVsdC4gU2VlIHRoZSBbVC1TUUwgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE4NzM3NS5hc3B4KVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKS5cbiAgICovXG4gIGVuYWJsZUFuc2lOdWxsRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbHMgaWYgcGFkZGluZyBzaG91bGQgYmUgYXBwbGllZCBmb3IgdmFsdWVzIHNob3J0ZXIgdGhhbiB0aGUgc2l6ZSBvZiBkZWZpbmVkIGNvbHVtbi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFuc2lQYWRkaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgU1FMIFNlcnZlciB3aWxsIGZvbGxvdyBJU08gc3RhbmRhcmQgYmVoYXZpb3IgZHVyaW5nIHZhcmlvdXMgZXJyb3IgY29uZGl0aW9ucy4gRm9yIGRldGFpbHMsXG4gICAqIHNlZSBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvc3FsL3Qtc3FsL3N0YXRlbWVudHMvc2V0LWFuc2ktd2FybmluZ3MtdHJhbnNhY3Qtc3FsKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgZW5hYmxlQW5zaVdhcm5pbmdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5kcyBhIHF1ZXJ5IHdoZW4gYW4gb3ZlcmZsb3cgb3IgZGl2aWRlLWJ5LXplcm8gZXJyb3Igb2NjdXJzIGR1cmluZyBxdWVyeSBleGVjdXRpb24uXG4gICAqIFNlZSBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvc3FsL3Qtc3FsL3N0YXRlbWVudHMvc2V0LWFyaXRoYWJvcnQtdHJhbnNhY3Qtc3FsP3ZpZXc9c3FsLXNlcnZlci0yMDE3KVxuICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgZW5hYmxlQXJpdGhBYm9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgZGV0ZXJtaW5lcyBpZiBjb25jYXRlbmF0aW9uIHdpdGggTlVMTCBzaG91bGQgcmVzdWx0IGluIE5VTEwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlLCBtb3JlIGRldGFpbHMgaW5cbiAgICogW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1jb25jYXQtbnVsbC15aWVsZHMtbnVsbC10cmFuc2FjdC1zcWwpXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVDb25jYXROdWxsWWllbGRzTnVsbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbHMgd2hldGhlciBjdXJzb3Igc2hvdWxkIGJlIGNsb3NlZCwgaWYgdGhlIHRyYW5zYWN0aW9uIG9wZW5pbmcgaXQgZ2V0cyBjb21taXR0ZWQgb3Igcm9sbGVkXG4gICAqIGJhY2suXG4gICAqXG4gICAqIChkZWZhdWx0OiBgbnVsbGApXG4gICAqL1xuICBlbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0PzogYm9vbGVhbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgc2V0cyB0aGUgY29ubmVjdGlvbiB0byBlaXRoZXIgaW1wbGljaXQgb3IgYXV0b2NvbW1pdCB0cmFuc2FjdGlvbiBtb2RlLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgZmFsc2UsIGVycm9yIGlzIG5vdCBnZW5lcmF0ZWQgZHVyaW5nIGxvc3Mgb2YgcHJlY2Vzc2lvbi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBlbmFibGVOdW1lcmljUm91bmRhYm9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGNoYXJhY3RlcnMgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyBhcmUgdHJlYXRlZCBhcyBsaXRlcmFscyBhbmQgdGhvc2UgZW5jbG9zZWQgZG91YmxlIHF1b3RlcyBhcmUgdHJlYXRlZCBhcyBpZGVudGlmaWVycy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZVF1b3RlZElkZW50aWZpZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciBvciBub3QgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBlbmNyeXB0ZWQuIFNldCB0byBgdHJ1ZWAgaWYgeW91J3JlIG9uIFdpbmRvd3MgQXp1cmUuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZW5jcnlwdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIGlmIHRoZSBkYXRhYmFzZSByZXF1ZXN0ZWQgYnkgW1tkYXRhYmFzZV1dIGNhbm5vdCBiZSBhY2Nlc3NlZCxcbiAgICogdGhlIGNvbm5lY3Rpb24gd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuIEhvd2V2ZXIsIGlmIFtbZmFsbGJhY2tUb0RlZmF1bHREYl1dIGlzXG4gICAqIHNldCB0byBgdHJ1ZWAsIHRoZW4gdGhlIHVzZXIncyBkZWZhdWx0IGRhdGFiYXNlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZmFsbGJhY2tUb0RlZmF1bHREYj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSBuYW1lIHRvIGNvbm5lY3QgdG8uXG4gICAqIFRoZSBTUUwgU2VydmVyIEJyb3dzZXIgc2VydmljZSBtdXN0IGJlIHJ1bm5pbmcgb24gdGhlIGRhdGFiYXNlIHNlcnZlcixcbiAgICogYW5kIFVEUCBwb3J0IDE0MzQgb24gdGhlIGRhdGFiYXNlIHNlcnZlciBtdXN0IGJlIHJlYWNoYWJsZS5cbiAgICpcbiAgICogKG5vIGRlZmF1bHQpXG4gICAqXG4gICAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFtbcG9ydF1dLlxuICAgKi9cbiAgaW5zdGFuY2VOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBpc29sYXRpb24gbGV2ZWwgdGhhdCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBydW4gd2l0aC5cbiAgICpcbiAgICogVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogKiBgUkVBRF9VTkNPTU1JVFRFRGBcbiAgICogKiBgUkVBRF9DT01NSVRURURgXG4gICAqICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogKiBgU0VSSUFMSVpBQkxFYFxuICAgKiAqIGBTTkFQU0hPVGBcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBSRUFEX0NPTU1JVEVEYCkuXG4gICAqL1xuICBpc29sYXRpb25MZXZlbD86IG51bWJlcjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBsYW5ndWFnZSBlbnZpcm9ubWVudCBmb3IgdGhlIHNlc3Npb24uIFRoZSBzZXNzaW9uIGxhbmd1YWdlIGRldGVybWluZXMgdGhlIGRhdGV0aW1lIGZvcm1hdHMgYW5kIHN5c3RlbSBtZXNzYWdlcy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB1c19lbmdsaXNoYCkuXG4gICAqL1xuICBsYW5ndWFnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdHJpbmcgaW5kaWNhdGluZyB3aGljaCBuZXR3b3JrIGludGVyZmFjZSAoaXAgYWRkcmVzcykgdG8gdXNlIHdoZW4gY29ubmVjdGluZyB0byBTUUwgU2VydmVyLlxuICAgKi9cbiAgbG9jYWxBZGRyZXNzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbiByZXRyaWVzIGZvciB0cmFuc2llbnQgZXJyb3JzLuOAgVxuICAgKlxuICAgKiAoZGVmYXVsdDogYDNgKS5cbiAgICovXG4gIG1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycz86IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgTXVsdGlTdWJuZXRGYWlsb3ZlciA9IFRydWUgcGFyYW1ldGVyLCB3aGljaCBjYW4gaGVscCBtaW5pbWl6ZSB0aGUgY2xpZW50IHJlY292ZXJ5IGxhdGVuY3kgd2hlbiBmYWlsb3ZlcnMgb2NjdXIuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIG11bHRpU3VibmV0RmFpbG92ZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiBURFMgcGFja2V0cyAoc3ViamVjdCB0byBuZWdvdGlhdGlvbiB3aXRoIHRoZSBzZXJ2ZXIpLlxuICAgKiBTaG91bGQgYmUgYSBwb3dlciBvZiAyLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYDQwOTZgKS5cbiAgICovXG4gIHBhY2tldFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBvcnQgdG8gY29ubmVjdCB0byAoZGVmYXVsdDogYDE0MzNgKS5cbiAgICpcbiAgICogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggW1tpbnN0YW5jZU5hbWVdXVxuICAgKi9cbiAgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogQSBib29sZWFuLCBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHdpbGwgcmVxdWVzdCByZWFkIG9ubHkgYWNjZXNzIGZyb20gYSBTUUwgU2VydmVyIEF2YWlsYWJpbGl0eVxuICAgKiBHcm91cC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbaGVyZV0oaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2hoNzEwMDU0LmFzcHggXCJNaWNyb3NvZnQ6IENvbmZpZ3VyZSBSZWFkLU9ubHkgUm91dGluZyBmb3IgYW4gQXZhaWxhYmlsaXR5IEdyb3VwIChTUUwgU2VydmVyKVwiKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICByZWFkT25seUludGVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBhIHJlcXVlc3QgaXMgY29uc2lkZXJlZCBmYWlsZWQsIG9yIGAwYCBmb3Igbm8gdGltZW91dFxuICAgKlxuICAgKiAoZGVmYXVsdDogYDE1MDAwYCkuXG4gICAqL1xuICByZXF1ZXN0VGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogQSBib29sZWFuLCB0aGF0IHdoZW4gdHJ1ZSB3aWxsIGV4cG9zZSByZWNlaXZlZCByb3dzIGluIFJlcXVlc3RzIGRvbmUgcmVsYXRlZCBldmVudHM6XG4gICAqICogW1tSZXF1ZXN0LkV2ZW50X2RvbmVJblByb2NdXVxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lUHJvY11dXG4gICAqICogW1tSZXF1ZXN0LkV2ZW50X2RvbmVdXVxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICpcbiAgICogQ2F1dGlvbjogSWYgbWFueSByb3cgYXJlIHJlY2VpdmVkLCBlbmFibGluZyB0aGlzIG9wdGlvbiBjb3VsZCByZXN1bHQgaW5cbiAgICogZXhjZXNzaXZlIG1lbW9yeSB1c2FnZS5cbiAgICovXG4gIHJvd0NvbGxlY3Rpb25PbkRvbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIHRoYXQgd2hlbiB0cnVlIHdpbGwgZXhwb3NlIHJlY2VpdmVkIHJvd3MgaW4gUmVxdWVzdHMnIGNvbXBsZXRpb24gY2FsbGJhY2suU2VlIFtbUmVxdWVzdC5jb25zdHJ1Y3Rvcl1dLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICpcbiAgICogQ2F1dGlvbjogSWYgbWFueSByb3cgYXJlIHJlY2VpdmVkLCBlbmFibGluZyB0aGlzIG9wdGlvbiBjb3VsZCByZXN1bHQgaW5cbiAgICogZXhjZXNzaXZlIG1lbW9yeSB1c2FnZS5cbiAgICovXG4gIHJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgVERTIHRvIHVzZS4gSWYgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBzcGVjaWZpZWQgdmVyc2lvbiwgbmVnb3RpYXRlZCB2ZXJzaW9uIGlzIHVzZWQgaW5zdGVhZC5cbiAgICpcbiAgICogVGhlIHZlcnNpb25zIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLlREU19WRVJTSU9OYC5cbiAgICogKiBgN18xYFxuICAgKiAqIGA3XzJgXG4gICAqICogYDdfM19BYFxuICAgKiAqIGA3XzNfQmBcbiAgICogKiBgN180YFxuICAgKlxuICAgKiAoZGVmYXVsdDogYDdfNGApXG4gICAqL1xuICB0ZHNWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdmFyY2hhcihtYXgpLCBudmFyY2hhcihtYXgpLCB2YXJiaW5hcnkobWF4KSwgdGV4dCwgbnRleHQsIGFuZCBpbWFnZSBkYXRhIHJldHVybmVkIGJ5IGEgU0VMRUNUIHN0YXRlbWVudC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGAyMTQ3NDgzNjQ3YClcbiAgICovXG4gIHRleHRzaXplPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBcInRydWVcIiwgdGhlIFNRTCBTZXJ2ZXIgU1NMIGNlcnRpZmljYXRlIGlzIGF1dG9tYXRpY2FsbHkgdHJ1c3RlZCB3aGVuIHRoZSBjb21tdW5pY2F0aW9uIGxheWVyIGlzIGVuY3J5cHRlZCB1c2luZyBTU0wuXG4gICAqXG4gICAqIElmIFwiZmFsc2VcIiwgdGhlIFNRTCBTZXJ2ZXIgdmFsaWRhdGVzIHRoZSBzZXJ2ZXIgU1NMIGNlcnRpZmljYXRlLiBJZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZmFpbHMsXG4gICAqIHRoZSBkcml2ZXIgcmFpc2VzIGFuIGVycm9yIGFuZCB0ZXJtaW5hdGVzIHRoZSBjb25uZWN0aW9uLiBNYWtlIHN1cmUgdGhlIHZhbHVlIHBhc3NlZCB0byBzZXJ2ZXJOYW1lIGV4YWN0bHlcbiAgICogbWF0Y2hlcyB0aGUgQ29tbW9uIE5hbWUgKENOKSBvciBETlMgbmFtZSBpbiB0aGUgU3ViamVjdCBBbHRlcm5hdGUgTmFtZSBpbiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGZvciBhbiBTU0wgY29ubmVjdGlvbiB0byBzdWNjZWVkLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHJldHVybiByb3dzIGFzIGFycmF5cyBvciBrZXktdmFsdWUgY29sbGVjdGlvbnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIHVzZUNvbHVtbk5hbWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gcGFzcyB0aW1lIHZhbHVlcyBpbiBVVEMgb3IgbG9jYWwgdGltZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYCkuXG4gICAqL1xuICB1c2VVVEM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya3N0YXRpb24gSUQgKFdTSUQpIG9mIHRoZSBjbGllbnQsIGRlZmF1bHQgb3MuaG9zdG5hbWUoKS5cbiAgICogVXNlZCBmb3IgaWRlbnRpZnlpbmcgYSBzcGVjaWZpYyBjbGllbnQgaW4gcHJvZmlsaW5nLCBsb2dnaW5nIG9yXG4gICAqIHRyYWNpbmcgY2xpZW50IGFjdGl2aXR5IGluIFNRTFNlcnZlci5cbiAgICpcbiAgICogVGhlIHZhbHVlIGlzIHJlcG9ydGVkIGJ5IHRoZSBUU1FMIGZ1bmN0aW9uIEhPU1RfTkFNRSgpLlxuICAgKi9cbiAgd29ya3N0YXRpb25JZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gcGFyc2UgdW5pcXVlIGlkZW50aWZpZXIgdHlwZSB3aXRoIGxvd2VyY2FzZSBjYXNlIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIGxvd2VyQ2FzZUd1aWRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBDTEVBTlVQX1RZUEUgPSB7XG4gIE5PUk1BTDogMCxcbiAgUkVESVJFQ1Q6IDEsXG4gIFJFVFJZOiAyXG59O1xuXG5pbnRlcmZhY2UgUm91dGluZ0RhdGEge1xuICBzZXJ2ZXI6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgW1tDb25uZWN0aW9uXV0gaW5zdGFuY2UgcmVwcmVzZW50cyBhIHNpbmdsZSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2Ugc2VydmVyLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgQ29ubmVjdGlvbiA9IHJlcXVpcmUoJ3RlZGlvdXMnKS5Db25uZWN0aW9uO1xuICogdmFyIGNvbmZpZyA9IHtcbiAqICBcImF1dGhlbnRpY2F0aW9uXCI6IHtcbiAqICAgIC4uLixcbiAqICAgIFwib3B0aW9uc1wiOiB7Li4ufVxuICogIH0sXG4gKiAgXCJvcHRpb25zXCI6IHsuLi59XG4gKiB9O1xuICogdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihjb25maWcpO1xuICogYGBgXG4gKlxuICogT25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbi4gT25jZSBhIFtbUmVxdWVzdF1dXG4gKiBoYXMgYmVlbiBpbml0aWF0ZWQgKHdpdGggW1tDb25uZWN0aW9uLmNhbGxQcm9jZWR1cmVdXSwgW1tDb25uZWN0aW9uLmV4ZWNTcWxdXSxcbiAqIG9yIFtbQ29ubmVjdGlvbi5leGVjU3FsQmF0Y2hdXSksIGFub3RoZXIgc2hvdWxkIG5vdCBiZSBpbml0aWF0ZWQgdW50aWwgdGhlXG4gKiBbW1JlcXVlc3RdXSdzIGNvbXBsZXRpb24gY2FsbGJhY2sgaXMgY2FsbGVkLlxuICovXG5jbGFzcyBDb25uZWN0aW9uIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmZWRBdXRoUmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZmVkQXV0aEluZm9Ub2tlbjogdW5kZWZpbmVkIHwgRmVkQXV0aEluZm9Ub2tlbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25maWc6IEludGVybmFsQ29ubmVjdGlvbkNvbmZpZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZWN1cmVDb250ZXh0OiBTZWN1cmVDb250ZXh0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluVHJhbnNhY3Rpb246IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJhbnNhY3Rpb25EZXNjcmlwdG9yczogQnVmZmVyW107XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJhbnNhY3Rpb25EZXB0aDogbnVtYmVyO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzU3FsQmF0Y2g6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3VyVHJhbnNpZW50UmV0cnlDb3VudDogbnVtYmVyO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyYW5zaWVudEVycm9yTG9va3VwOiBUcmFuc2llbnRFcnJvckxvb2t1cDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbG9zZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbG9nZ2VkSW46IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbG9naW5FcnJvcjogdW5kZWZpbmVkIHwgQ29ubmVjdGlvbkVycm9yO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlYnVnOiBEZWJ1ZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBudGxtcGFja2V0OiB1bmRlZmluZWQgfCBhbnk7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbnRsbXBhY2tldEJ1ZmZlcjogdW5kZWZpbmVkIHwgQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBTVEFURToge1xuICAgIElOSVRJQUxJWkVEOiBTdGF0ZTtcbiAgICBDT05ORUNUSU5HOiBTdGF0ZTtcbiAgICBTRU5UX1BSRUxPR0lOOiBTdGF0ZTtcbiAgICBSRVJPVVRJTkc6IFN0YXRlO1xuICAgIFRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZOiBTdGF0ZTtcbiAgICBTRU5UX1RMU1NTTE5FR09USUFUSU9OOiBTdGF0ZTtcbiAgICBTRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOOiBTdGF0ZTtcbiAgICBTRU5UX0xPR0lON19XSVRIX05UTE06IFN0YXRlO1xuICAgIFNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSDogU3RhdGU7XG4gICAgTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUw6IFN0YXRlO1xuICAgIExPR0dFRF9JTjogU3RhdGU7XG4gICAgU0VOVF9DTElFTlRfUkVRVUVTVDogU3RhdGU7XG4gICAgU0VOVF9BVFRFTlRJT046IFN0YXRlO1xuICAgIEZJTkFMOiBTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm91dGluZ0RhdGE6IHVuZGVmaW5lZCB8IFJvdXRpbmdEYXRhO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWVzc2FnZUlvITogTWVzc2FnZUlPO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRlOiBTdGF0ZTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0OiB1bmRlZmluZWQgfCBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGF0dGVudGlvblJlY2VpdmVkOiB1bmRlZmluZWQgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVxdWVzdDogdW5kZWZpbmVkIHwgUmVxdWVzdCB8IEJ1bGtMb2FkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb2NSZXR1cm5TdGF0dXNWYWx1ZTogdW5kZWZpbmVkIHwgYW55O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldDogdW5kZWZpbmVkIHwgU29ja2V0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1lc3NhZ2VCdWZmZXI6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbm5lY3RUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsVGltZXI6IHVuZGVmaW5lZCB8IE5vZGVKUy5UaW1lb3V0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlcXVlc3RUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmV0cnlUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2FuY2VsQWZ0ZXJSZXF1ZXN0U2VudDogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRhdGFiYXNlQ29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE5vdGU6IGJlIGF3YXJlIG9mIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyBmaWVsZDpcbiAgICogMS4gY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnNcbiAgICogMi4gY29uZmlnLm9wdGlvbnNcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgeyBDb25uZWN0aW9uIH0gPSByZXF1aXJlKCd0ZWRpb3VzJyk7XG4gICAqXG4gICAqIGNvbnN0IGNvbmZpZyA9IHtcbiAgICogIFwiYXV0aGVudGljYXRpb25cIjoge1xuICAgKiAgICAuLi4sXG4gICAqICAgIFwib3B0aW9uc1wiOiB7Li4ufVxuICAgKiAgfSxcbiAgICogIFwib3B0aW9uc1wiOiB7Li4ufVxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oY29uZmlnKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWdcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29ubmVjdGlvbkNvbmZpZ3VyYXRpb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnIHx8IGNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnXCIgYXJndW1lbnQgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgb2YgdHlwZSBPYmplY3QuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcuc2VydmVyICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLnNlcnZlclwiIHByb3BlcnR5IGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgIH1cblxuICAgIHRoaXMuZmVkQXV0aFJlcXVpcmVkID0gZmFsc2U7XG4gICAgdGhpcy5mZWRBdXRoSW5mb1Rva2VuID0gdW5kZWZpbmVkO1xuXG4gICAgbGV0IGF1dGhlbnRpY2F0aW9uOiBJbnRlcm5hbENvbm5lY3Rpb25Db25maWdbJ2F1dGhlbnRpY2F0aW9uJ107XG4gICAgaWYgKGNvbmZpZy5hdXRoZW50aWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5hdXRoZW50aWNhdGlvbiAhPT0gJ29iamVjdCcgfHwgY29uZmlnLmF1dGhlbnRpY2F0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBjb25maWcuYXV0aGVudGljYXRpb24udHlwZTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucyA9PT0gdW5kZWZpbmVkID8ge30gOiBjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucztcblxuICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24udHlwZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlICE9PSAnZGVmYXVsdCcgJiYgdHlwZSAhPT0gJ250bG0nICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInR5cGVcIiBwcm9wZXJ0eSBtdXN0IG9uZSBvZiBcImRlZmF1bHRcIiwgXCJudGxtXCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZFwiLCBcImF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuXCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm1cIiBvciBcImF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlXCIgb3IgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldFwiLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnIHx8IG9wdGlvbnMgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ250bG0nKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kb21haW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuZG9tYWluXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnVzZXJOYW1lICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMudXNlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGFzc3dvcmQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5wYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnbnRsbScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgIGRvbWFpbjogb3B0aW9ucy5kb21haW4gJiYgb3B0aW9ucy5kb21haW4udG9VcHBlckNhc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnVzZXJOYW1lICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMudXNlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGFzc3dvcmQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5wYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgIGRvbWFpbjogb3B0aW9ucy5kb21haW4sXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50b2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy50b2tlblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHRva2VuOiBvcHRpb25zLnRva2VuXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuY2xpZW50SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJykge1xuICAgICAgICBpZiAob3B0aW9ucy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jbGllbnRTZWNyZXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50U2VjcmV0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50ZW5hbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy50ZW5hbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgICAgY2xpZW50U2VjcmV0OiBvcHRpb25zLmNsaWVudFNlY3JldCxcbiAgICAgICAgICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdGlvbnMudXNlck5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy51c2VyTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wYXNzd29yZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnBhc3N3b3JkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB1c2VyTmFtZTogb3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdXNlck5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXNzd29yZDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBzZXJ2ZXI6IGNvbmZpZy5zZXJ2ZXIsXG4gICAgICBhdXRoZW50aWNhdGlvbjogYXV0aGVudGljYXRpb24sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGFib3J0VHJhbnNhY3Rpb25PbkVycm9yOiBmYWxzZSxcbiAgICAgICAgYXBwTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBjYW1lbENhc2VDb2x1bW5zOiBmYWxzZSxcbiAgICAgICAgY2FuY2VsVGltZW91dDogREVGQVVMVF9DQU5DRUxfVElNRU9VVCxcbiAgICAgICAgY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMOiAyICogNjAgKiA2MCAqIDEwMDAsICAvLyBVbml0czogbWlsaXNlY29uZHNcbiAgICAgICAgY29sdW1uRW5jcnlwdGlvblNldHRpbmc6IGZhbHNlLFxuICAgICAgICBjb2x1bW5OYW1lUmVwbGFjZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw6IERFRkFVTFRfQ09OTkVDVF9SRVRSWV9JTlRFUlZBTCxcbiAgICAgICAgY29ubmVjdFRpbWVvdXQ6IERFRkFVTFRfQ09OTkVDVF9USU1FT1VULFxuICAgICAgICBjb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWw6IElTT0xBVElPTl9MRVZFTC5SRUFEX0NPTU1JVFRFRCxcbiAgICAgICAgY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzOiB7fSxcbiAgICAgICAgZGF0YWJhc2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0ZWZpcnN0OiBERUZBVUxUX0RBVEVGSVJTVCxcbiAgICAgICAgZGF0ZUZvcm1hdDogREVGQVVMVF9EQVRFRk9STUFULFxuICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgIGRhdGE6IGZhbHNlLFxuICAgICAgICAgIHBhY2tldDogZmFsc2UsXG4gICAgICAgICAgcGF5bG9hZDogZmFsc2UsXG4gICAgICAgICAgdG9rZW46IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGVuYWJsZUFuc2lOdWxsOiB0cnVlLFxuICAgICAgICBlbmFibGVBbnNpTnVsbERlZmF1bHQ6IHRydWUsXG4gICAgICAgIGVuYWJsZUFuc2lQYWRkaW5nOiB0cnVlLFxuICAgICAgICBlbmFibGVBbnNpV2FybmluZ3M6IHRydWUsXG4gICAgICAgIGVuYWJsZUFyaXRoQWJvcnQ6IHRydWUsXG4gICAgICAgIGVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsOiB0cnVlLFxuICAgICAgICBlbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0OiBudWxsLFxuICAgICAgICBlbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9uczogZmFsc2UsXG4gICAgICAgIGVuYWJsZU51bWVyaWNSb3VuZGFib3J0OiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUXVvdGVkSWRlbnRpZmllcjogdHJ1ZSxcbiAgICAgICAgZW5jcnlwdDogdHJ1ZSxcbiAgICAgICAgZmFsbGJhY2tUb0RlZmF1bHREYjogZmFsc2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBpbnN0YW5jZU5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgaXNvbGF0aW9uTGV2ZWw6IElTT0xBVElPTl9MRVZFTC5SRUFEX0NPTU1JVFRFRCxcbiAgICAgICAgbGFuZ3VhZ2U6IERFRkFVTFRfTEFOR1VBR0UsXG4gICAgICAgIGxvY2FsQWRkcmVzczogdW5kZWZpbmVkLFxuICAgICAgICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM6IDMsXG4gICAgICAgIG11bHRpU3VibmV0RmFpbG92ZXI6IGZhbHNlLFxuICAgICAgICBwYWNrZXRTaXplOiBERUZBVUxUX1BBQ0tFVF9TSVpFLFxuICAgICAgICBwb3J0OiBERUZBVUxUX1BPUlQsXG4gICAgICAgIHJlYWRPbmx5SW50ZW50OiBmYWxzZSxcbiAgICAgICAgcmVxdWVzdFRpbWVvdXQ6IERFRkFVTFRfQ0xJRU5UX1JFUVVFU1RfVElNRU9VVCxcbiAgICAgICAgcm93Q29sbGVjdGlvbk9uRG9uZTogZmFsc2UsXG4gICAgICAgIHJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uOiBmYWxzZSxcbiAgICAgICAgc2VydmVyTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb246IGZhbHNlLFxuICAgICAgICB0ZHNWZXJzaW9uOiBERUZBVUxUX1REU19WRVJTSU9OLFxuICAgICAgICB0ZXh0c2l6ZTogREVGQVVMVF9URVhUU0laRSxcbiAgICAgICAgdHJ1c3RlZFNlcnZlck5hbWVBRTogdW5kZWZpbmVkLFxuICAgICAgICB0cnVzdFNlcnZlckNlcnRpZmljYXRlOiB0cnVlLFxuICAgICAgICB1c2VDb2x1bW5OYW1lczogZmFsc2UsXG4gICAgICAgIHVzZVVUQzogdHJ1ZSxcbiAgICAgICAgd29ya3N0YXRpb25JZDogdW5kZWZpbmVkLFxuICAgICAgICBsb3dlckNhc2VHdWlkczogZmFsc2VcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGNvbmZpZy5vcHRpb25zKSB7XG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucG9ydCAmJiBjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0IGFuZCBpbnN0YW5jZU5hbWUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgYnV0ICcgKyBjb25maWcub3B0aW9ucy5wb3J0ICsgJyBhbmQgJyArIGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSArICcgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3JcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yID0gY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5hcHBOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5hcHBOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmFwcE5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5hcHBOYW1lID0gY29uZmlnLm9wdGlvbnMuYXBwTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY2FtZWxDYXNlQ29sdW1ucyA9IGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlciA9IGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCwgJ2NvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCcpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQgPSBjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzICE9PSAnb2JqZWN0JyB8fCBjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgT2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgPSBjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kYXRhYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGF0YWJhc2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGF0YWJhc2VcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kYXRhYmFzZSA9IGNvbmZpZy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09ICdudW1iZXInICYmIGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSBudWxsICYmIChjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgPCAxIHx8IGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCA+IDcpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdFwiIHByb3BlcnR5IG11c3QgYmUgPj0gMSBhbmQgPD0gNycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kYXRlZmlyc3QgPSBjb25maWcub3B0aW9ucy5kYXRlZmlyc3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSAnc3RyaW5nJyAmJiBjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IGNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGFcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGEgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLnBhY2tldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWQgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbiA9IGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgPSBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZ1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5nc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgPSBjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuY3J5cHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuY3J5cHQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuY3J5cHRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5jcnlwdCA9IGNvbmZpZy5vcHRpb25zLmVuY3J5cHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmZhbGxiYWNrVG9EZWZhdWx0RGIgPSBjb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lID0gY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lO1xuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwoY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwsICdjb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbCcpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwgPSBjb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmxhbmd1YWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gJ3N0cmluZycgJiYgY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5sYW5ndWFnZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgPSBjb25maWcub3B0aW9ucy5sYW5ndWFnZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMubG9jYWxBZGRyZXNzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcyA9IGNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubXVsdGlTdWJuZXRGYWlsb3ZlciA9IGNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5wYWNrZXRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5wYWNrZXRTaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnBhY2tldFNpemVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wYWNrZXRTaXplID0gY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnBvcnQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucG9ydFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMucG9ydCA8PSAwIHx8IGNvbmZpZy5vcHRpb25zLnBvcnQgPj0gNjU1MzYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucG9ydFwiIHByb3BlcnR5IG11c3QgYmUgPiAwIGFuZCA8IDY1NTM2Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQgPSBjb25maWcub3B0aW9ucy5wb3J0O1xuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yZWFkT25seUludGVudCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQgPSBjb25maWcub3B0aW9ucy5yZWFkT25seUludGVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycyA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnNcIiBwcm9wZXJ0eSBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiAwLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgPSBjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWxcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbFwiIHByb3BlcnR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUgPSBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiA9IGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50ZHNWZXJzaW9uXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA9IGNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy50ZXh0c2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudGV4dHNpemUgIT09ICdudW1iZXInICYmIGNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGV4dHNpemVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMudGV4dHNpemUgPiAyMTQ3NDgzNjQ3KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGV4dHNpemVcIiBjYW5cXCd0IGJlIGdyZWF0ZXIgdGhhbiAyMTQ3NDgzNjQ3LicpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5vcHRpb25zLnRleHRzaXplIDwgLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50ZXh0c2l6ZVwiIGNhblxcJ3QgYmUgc21hbGxlciB0aGFuIC0xLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy50ZXh0c2l6ZSA9IGNvbmZpZy5vcHRpb25zLnRleHRzaXplIHwgMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzID0gY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy51c2VVVEMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnVzZVVUQyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudXNlVVRDXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnVzZVVUQyA9IGNvbmZpZy5vcHRpb25zLnVzZVVUQztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgPSBjb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkcyA9IGNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjcmVkZW50aWFsc0RldGFpbHMgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscztcbiAgICBpZiAoY3JlZGVudGlhbHNEZXRhaWxzLnNlY3VyZU9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgdGhlIGNhbGxlciBoYXMgbm90IHNwZWNpZmllZCB0aGVpciBvd24gYHNlY3VyZU9wdGlvbnNgLFxuICAgICAgLy8gd2Ugc2V0IGBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTYCBoZXJlLlxuICAgICAgLy8gT2xkZXIgU1FMIFNlcnZlciBpbnN0YW5jZXMgcnVubmluZyBvbiBvbGRlciBXaW5kb3dzIHZlcnNpb25zIGhhdmVcbiAgICAgIC8vIHRyb3VibGUgd2l0aCB0aGUgQkVBU1Qgd29ya2Fyb3VuZCBpbiBPcGVuU1NMLlxuICAgICAgLy8gQXMgQkVBU1QgaXMgYSBicm93c2VyIHNwZWNpZmljIGV4cGxvaXQsIHdlIGNhbiBqdXN0IGRpc2FibGUgdGhpcyBvcHRpb24gaGVyZS5cbiAgICAgIGNyZWRlbnRpYWxzRGV0YWlscyA9IE9iamVjdC5jcmVhdGUoY3JlZGVudGlhbHNEZXRhaWxzLCB7XG4gICAgICAgIHNlY3VyZU9wdGlvbnM6IHtcbiAgICAgICAgICB2YWx1ZTogY29uc3RhbnRzLlNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWN1cmVDb250ZXh0ID0gY3JlYXRlU2VjdXJlQ29udGV4dChjcmVkZW50aWFsc0RldGFpbHMpO1xuXG4gICAgdGhpcy5kZWJ1ZyA9IHRoaXMuY3JlYXRlRGVidWcoKTtcbiAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMgPSBbQnVmZmVyLmZyb20oWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKV07XG5cbiAgICAvLyAnYmVnaW5UcmFuc2FjdGlvbicsICdjb21taXRUcmFuc2FjdGlvbicgYW5kICdyb2xsYmFja1RyYW5zYWN0aW9uJ1xuICAgIC8vIGV2ZW50cyBhcmUgdXRpbGl6ZWQgdG8gbWFpbnRhaW4gaW5UcmFuc2FjdGlvbiBwcm9wZXJ0eSBzdGF0ZSB3aGljaCBpblxuICAgIC8vIHR1cm4gaXMgdXNlZCBpbiBtYW5hZ2luZyB0cmFuc2FjdGlvbnMuIFRoZXNlIGV2ZW50cyBhcmUgb25seSBmaXJlZCBmb3JcbiAgICAvLyBURFMgdmVyc2lvbiA3LjIgYW5kIGJleW9uZC4gVGhlIHByb3BlcnRpZXMgYmVsb3cgYXJlIHVzZWQgdG8gZW11bGF0ZVxuICAgIC8vIGVxdWl2YWxlbnQgYmVoYXZpb3IgZm9yIFREUyB2ZXJzaW9ucyBiZWZvcmUgNy4yLlxuICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aCA9IDA7XG4gICAgdGhpcy5pc1NxbEJhdGNoID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLmxvZ2dlZEluID0gZmFsc2U7XG4gICAgdGhpcy5tZXNzYWdlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgdGhpcy5jdXJUcmFuc2llbnRSZXRyeUNvdW50ID0gMDtcbiAgICB0aGlzLnRyYW5zaWVudEVycm9yTG9va3VwID0gbmV3IFRyYW5zaWVudEVycm9yTG9va3VwKCk7XG5cbiAgICB0aGlzLnN0YXRlID0gdGhpcy5TVEFURS5JTklUSUFMSVpFRDtcblxuICAgIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLkFUVEVOVElPTik7XG5cbiAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9BVFRFTlRJT04pO1xuICAgICAgdGhpcy5jcmVhdGVDYW5jZWxUaW1lcigpO1xuICAgIH07XG4gIH1cblxuICBjb25uZWN0KGNvbm5lY3RMaXN0ZW5lcj86IChlcnI/OiBFcnJvcikgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSB0aGlzLlNUQVRFLklOSVRJQUxJWkVEKSB7XG4gICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdgLmNvbm5lY3RgIGNhbiBub3QgYmUgY2FsbGVkIG9uIGEgQ29ubmVjdGlvbiBpbiBgJyArIHRoaXMuc3RhdGUubmFtZSArICdgIHN0YXRlLicpO1xuICAgIH1cblxuICAgIGlmIChjb25uZWN0TGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IG9uQ29ubmVjdCA9IChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBjb25uZWN0TGlzdGVuZXIoZXJyKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICAgICAgY29ubmVjdExpc3RlbmVyKGVycik7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uY2UoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgICAgdGhpcy5vbmNlKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgIH1cblxuICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuQ09OTkVDVElORyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgcmVwb3J0ZWQgdGhhdCB0aGUgY2hhcnNldCBoYXMgY2hhbmdlZC5cbiAgICovXG4gIG9uKGV2ZW50OiAnY2hhcnNldENoYW5nZScsIGxpc3RlbmVyOiAoY2hhcnNldDogc3RyaW5nKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCB0byBjb25uZWN0IGFuZCB2YWxpZGF0ZSBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgb24oXG4gICAgZXZlbnQ6ICdjb25uZWN0JyxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZXJyIElmIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQsIHdpbGwgYmUgZmFsc2V5LiBJZiB0aGVyZSB3YXMgYVxuICAgICAqICAgcHJvYmxlbSAod2l0aCBlaXRoZXIgY29ubmVjdGluZyBvciB2YWxpZGF0aW9uKSwgd2lsbCBiZSBhbiBbW0Vycm9yXV0gb2JqZWN0LlxuICAgICAqL1xuICAgIGxpc3RlbmVyOiAoZXJyOiBFcnJvciB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIHJlcG9ydGVkIHRoYXQgdGhlIGFjdGl2ZSBkYXRhYmFzZSBoYXMgY2hhbmdlZC5cbiAgICogVGhpcyBtYXkgYmUgYXMgYSByZXN1bHQgb2YgYSBzdWNjZXNzZnVsIGxvZ2luLCBvciBhIGB1c2VgIHN0YXRlbWVudC5cbiAgICovXG4gIG9uKGV2ZW50OiAnZGF0YWJhc2VDaGFuZ2UnLCBsaXN0ZW5lcjogKGRhdGFiYXNlTmFtZTogc3RyaW5nKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBBIGRlYnVnIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiBJdCBtYXkgYmUgbG9nZ2VkIG9yIGlnbm9yZWQuXG4gICAqL1xuICBvbihldmVudDogJ2RlYnVnJywgbGlzdGVuZXI6IChtZXNzYWdlVGV4dDogc3RyaW5nKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBlcnJvciBvY2N1cnMuXG4gICAqL1xuICBvbihldmVudDogJ2Vycm9yJywgbGlzdGVuZXI6IChlcnI6IEVycm9yKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyBpc3N1ZWQgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIG9uKGV2ZW50OiAnZXJyb3JNZXNzYWdlJywgbGlzdGVuZXI6IChtZXNzYWdlOiBpbXBvcnQoJy4vdG9rZW4vdG9rZW4nKS5FcnJvck1lc3NhZ2VUb2tlbikgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIGNvbm5lY3Rpb24gaGFzIGVuZGVkLlxuICAgKlxuICAgKiBUaGlzIG1heSBiZSBhcyBhIHJlc3VsdCBvZiB0aGUgY2xpZW50IGNhbGxpbmcgW1tjbG9zZV1dLCB0aGUgc2VydmVyXG4gICAqIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24sIG9yIGEgbmV0d29yayBlcnJvci5cbiAgICovXG4gIG9uKGV2ZW50OiAnZW5kJywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIGlzc3VlZCBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdpbmZvTWVzc2FnZScsIGxpc3RlbmVyOiAobWVzc2FnZTogaW1wb3J0KCcuL3Rva2VuL3Rva2VuJykuSW5mb01lc3NhZ2VUb2tlbikgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgcmVwb3J0ZWQgdGhhdCB0aGUgbGFuZ3VhZ2UgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBvbihldmVudDogJ2xhbmd1YWdlQ2hhbmdlJywgbGlzdGVuZXI6IChsYW5ndWFnZU5hbWU6IHN0cmluZykgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIGNvbm5lY3Rpb24gd2FzIHJlc2V0LlxuICAgKi9cbiAgb24oZXZlbnQ6ICdyZXNldENvbm5lY3Rpb24nLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogQSBzZWN1cmUgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICovXG4gIG9uKGV2ZW50OiAnc2VjdXJlJywgbGlzdGVuZXI6IChjbGVhcnRleHQ6IGltcG9ydCgndGxzJykuVExTU29ja2V0KSA9PiB2b2lkKTogdGhpc1xuXG4gIG9uKGV2ZW50OiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICByZXR1cm4gc3VwZXIub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2NoYXJzZXRDaGFuZ2UnLCBjaGFyc2V0OiBzdHJpbmcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2Nvbm5lY3QnLCBlcnJvcj86IEVycm9yKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdkYXRhYmFzZUNoYW5nZScsIGRhdGFiYXNlTmFtZTogc3RyaW5nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdkZWJ1ZycsIG1lc3NhZ2VUZXh0OiBzdHJpbmcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2Vycm9yJywgZXJyb3I6IEVycm9yKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdlcnJvck1lc3NhZ2UnLCBtZXNzYWdlOiBpbXBvcnQoJy4vdG9rZW4vdG9rZW4nKS5FcnJvck1lc3NhZ2VUb2tlbik6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZW5kJyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnaW5mb01lc3NhZ2UnLCBtZXNzYWdlOiBpbXBvcnQoJy4vdG9rZW4vdG9rZW4nKS5JbmZvTWVzc2FnZVRva2VuKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdsYW5ndWFnZUNoYW5nZScsIGxhbmd1YWdlTmFtZTogc3RyaW5nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdzZWN1cmUnLCBjbGVhcnRleHQ6IGltcG9ydCgndGxzJykuVExTU29ja2V0KTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyZXJvdXRpbmcnKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyZXNldENvbm5lY3Rpb24nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyZXRyeScpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3JvbGxiYWNrVHJhbnNhY3Rpb24nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdzc3BpY2hhbGxlbmdlJywgdG9rZW46IGltcG9ydCgnLi90b2tlbi90b2tlbicpLlNTUElUb2tlbik6IGJvb2xlYW5cbiAgZW1pdChldmVudDogc3RyaW5nIHwgc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBzdXBlci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLlxuICAgKlxuICAgKiBUaGUgW1tFdmVudF9lbmRdXSB3aWxsIGJlIGVtaXR0ZWQgb25jZSB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGlzZUNvbm5lY3Rpb24oKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5jcmVhdGVDb25uZWN0VGltZXIoKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RPblBvcnQodGhpcy5jb25maWcub3B0aW9ucy5wb3J0LCB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIsIHNpZ25hbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VMb29rdXAoKS5pbnN0YW5jZUxvb2t1cCh7XG4gICAgICAgIHNlcnZlcjogdGhpcy5jb25maWcuc2VydmVyLFxuICAgICAgICBpbnN0YW5jZU5hbWU6IHRoaXMuY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lISxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCxcbiAgICAgICAgc2lnbmFsOiBzaWduYWxcbiAgICAgIH0sIChlcnIsIHBvcnQpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgQ29ubmVjdGlvbkVycm9yKGVyci5tZXNzYWdlLCAnRUlOU1RMT09LVVAnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb25uZWN0T25Qb3J0KHBvcnQhLCB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIsIHNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYW51cENvbm5lY3Rpb24oY2xlYW51cFR5cGU6IHR5cGVvZiBDTEVBTlVQX1RZUEVba2V5b2YgdHlwZW9mIENMRUFOVVBfVFlQRV0pIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmNsZWFyQ29ubmVjdFRpbWVyKCk7XG4gICAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7XG4gICAgICB0aGlzLmNsZWFyUmV0cnlUaW1lcigpO1xuICAgICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcbiAgICAgIGlmIChjbGVhbnVwVHlwZSA9PT0gQ0xFQU5VUF9UWVBFLlJFRElSRUNUKSB7XG4gICAgICAgIHRoaXMuZW1pdCgncmVyb3V0aW5nJyk7XG4gICAgICB9IGVsc2UgaWYgKGNsZWFudXBUeXBlICE9PSBDTEVBTlVQX1RZUEUuUkVUUlkpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3Q7XG4gICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBlcnIgPSBSZXF1ZXN0RXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSByZXF1ZXN0IGNvbXBsZXRlZC4nLCAnRUNMT1NFJyk7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2soZXJyKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB0aGlzLmxvZ2dlZEluID0gZmFsc2U7XG4gICAgICB0aGlzLmxvZ2luRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVEZWJ1ZygpIHtcbiAgICBjb25zdCBkZWJ1ZyA9IG5ldyBEZWJ1Zyh0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnKTtcbiAgICBkZWJ1Zy5vbignZGVidWcnLCAobWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIG1lc3NhZ2UpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWJ1ZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZTogTWVzc2FnZSkge1xuICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gbmV3IFRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2UsIHRoaXMuZGVidWcsIHRoaXMuY29uZmlnLm9wdGlvbnMpO1xuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ2luZm9NZXNzYWdlJywgKHRva2VuKSA9PiB7XG4gICAgICB0aGlzLmVtaXQoJ2luZm9NZXNzYWdlJywgdG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ3NzcGljaGFsbGVuZ2UnLCAodG9rZW4pID0+IHtcbiAgICAgIGlmICh0b2tlbi5udGxtcGFja2V0KSB7XG4gICAgICAgIHRoaXMubnRsbXBhY2tldCA9IHRva2VuLm50bG1wYWNrZXQ7XG4gICAgICAgIHRoaXMubnRsbXBhY2tldEJ1ZmZlciA9IHRva2VuLm50bG1wYWNrZXRCdWZmZXI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdCgnc3NwaWNoYWxsZW5nZScsIHRva2VuKTtcbiAgICB9KTtcblxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdlcnJvck1lc3NhZ2UnLCAodG9rZW4pID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3JNZXNzYWdlJywgdG9rZW4pO1xuICAgICAgaWYgKHRoaXMubG9nZ2VkSW4pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdDtcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICBpZiAoIXJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJlcXVlc3RFcnJvcih0b2tlbi5tZXNzYWdlLCAnRVJFUVVFU1QnKTtcbiAgICAgICAgICAgIGVycm9yLm51bWJlciA9IHRva2VuLm51bWJlcjtcbiAgICAgICAgICAgIGVycm9yLnN0YXRlID0gdG9rZW4uc3RhdGU7XG4gICAgICAgICAgICBlcnJvci5jbGFzcyA9IHRva2VuLmNsYXNzO1xuICAgICAgICAgICAgZXJyb3Iuc2VydmVyTmFtZSA9IHRva2VuLnNlcnZlck5hbWU7XG4gICAgICAgICAgICBlcnJvci5wcm9jTmFtZSA9IHRva2VuLnByb2NOYW1lO1xuICAgICAgICAgICAgZXJyb3IubGluZU51bWJlciA9IHRva2VuLmxpbmVOdW1iZXI7XG4gICAgICAgICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvciA9IENvbm5lY3Rpb25FcnJvcih0b2tlbi5tZXNzYWdlLCAnRUxPR0lOJyk7XG5cbiAgICAgICAgY29uc3QgaXNMb2dpbkVycm9yVHJhbnNpZW50ID0gdGhpcy50cmFuc2llbnRFcnJvckxvb2t1cC5pc1RyYW5zaWVudEVycm9yKHRva2VuLm51bWJlcik7XG4gICAgICAgIGlmIChpc0xvZ2luRXJyb3JUcmFuc2llbnQgJiYgdGhpcy5jdXJUcmFuc2llbnRSZXRyeUNvdW50ICE9PSB0aGlzLmNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycykge1xuICAgICAgICAgIGVycm9yLmlzVHJhbnNpZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9naW5FcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ2RhdGFiYXNlQ2hhbmdlJywgKHRva2VuKSA9PiB7XG4gICAgICB0aGlzLmVtaXQoJ2RhdGFiYXNlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICAgIH0pO1xuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ2xhbmd1YWdlQ2hhbmdlJywgKHRva2VuKSA9PiB7XG4gICAgICB0aGlzLmVtaXQoJ2xhbmd1YWdlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICAgIH0pO1xuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ2NoYXJzZXRDaGFuZ2UnLCAodG9rZW4pID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnY2hhcnNldENoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdzcWxDb2xsYXRpb25DaGFuZ2UnLCAodG9rZW4pID0+IHtcbiAgICAgIHRoaXMuZGF0YWJhc2VDb2xsYXRpb24gPSB0b2tlbi5uZXdWYWx1ZTtcbiAgICB9KTtcblxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdmZWRBdXRoSW5mbycsICh0b2tlbikgPT4ge1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdmZWRBdXRoSW5mbycsIHRva2VuKTtcbiAgICB9KTtcblxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdmZWF0dXJlRXh0QWNrJywgKHRva2VuKSA9PiB7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ2ZlYXR1cmVFeHRBY2snLCB0b2tlbik7XG4gICAgfSk7XG5cbiAgICB0b2tlblN0cmVhbVBhcnNlci5vbignbG9naW5hY2snLCAodG9rZW4pID0+IHtcbiAgICAgIGlmICghdG9rZW4udGRzVmVyc2lvbikge1xuICAgICAgICAvLyB1bnN1cHBvcnRlZCBURFMgdmVyc2lvblxuICAgICAgICB0aGlzLmxvZ2luRXJyb3IgPSBDb25uZWN0aW9uRXJyb3IoJ1NlcnZlciByZXNwb25kZWQgd2l0aCB1bmtub3duIFREUyB2ZXJzaW9uLicsICdFVERTJyk7XG4gICAgICAgIHRoaXMubG9nZ2VkSW4gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRva2VuLmludGVyZmFjZSkge1xuICAgICAgICAvLyB1bnN1cHBvcnRlZCBpbnRlcmZhY2VcbiAgICAgICAgdGhpcy5sb2dpbkVycm9yID0gQ29ubmVjdGlvbkVycm9yKCdTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggdW5zdXBwb3J0ZWQgaW50ZXJmYWNlLicsICdFSU5URVJGQUNFTk9UU1VQUCcpO1xuICAgICAgICB0aGlzLmxvZ2dlZEluID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gdXNlIG5lZ290aWF0ZWQgdmVyc2lvblxuICAgICAgdGhpcy5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uID0gdG9rZW4udGRzVmVyc2lvbjtcbiAgICAgIHRoaXMubG9nZ2VkSW4gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ3JvdXRpbmdDaGFuZ2UnLCAodG9rZW4pID0+IHtcbiAgICAgIC8vIFJlbW92ZXMgaW5zdGFuY2UgbmFtZSBhdHRhY2hlZCB0byB0aGUgcmVkaXJlY3QgdXJsLiBFLmcuLCByZWRpcmVjdC5kYi5uZXRcXGluc3RhbmNlMSAtLT4gcmVkaXJlY3QuZGIubmV0XG4gICAgICBjb25zdCBbIHNlcnZlciBdID0gdG9rZW4ubmV3VmFsdWUuc2VydmVyLnNwbGl0KCdcXFxcJyk7XG5cbiAgICAgIHRoaXMucm91dGluZ0RhdGEgPSB7XG4gICAgICAgIHNlcnZlciwgcG9ydDogdG9rZW4ubmV3VmFsdWUucG9ydFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdwYWNrZXRTaXplQ2hhbmdlJywgKHRva2VuKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VJby5wYWNrZXRTaXplKHRva2VuLm5ld1ZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIEEgbmV3IHRvcC1sZXZlbCB0cmFuc2FjdGlvbiB3YXMgc3RhcnRlZC4gVGhpcyBpcyBub3QgZmlyZWRcbiAgICAvLyBmb3IgbmVzdGVkIHRyYW5zYWN0aW9ucy5cbiAgICB0b2tlblN0cmVhbVBhcnNlci5vbignYmVnaW5UcmFuc2FjdGlvbicsICh0b2tlbikgPT4ge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLnB1c2godG9rZW4ubmV3VmFsdWUpO1xuICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIEEgdG9wLWxldmVsIHRyYW5zYWN0aW9uIHdhcyBjb21taXR0ZWQuIFRoaXMgaXMgbm90IGZpcmVkXG4gICAgLy8gZm9yIG5lc3RlZCB0cmFuc2FjdGlvbnMuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ2NvbW1pdFRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCA9IDE7XG4gICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIC8vIEEgdG9wLWxldmVsIHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjay4gVGhpcyBpcyBub3QgZmlyZWRcbiAgICAvLyBmb3IgbmVzdGVkIHRyYW5zYWN0aW9ucy4gVGhpcyBpcyBhbHNvIGZpcmVkIGlmIGEgYmF0Y2hcbiAgICAvLyBhYm9ydGluZyBlcnJvciBoYXBwZW5lZCB0aGF0IGNhdXNlZCBhIHJvbGxiYWNrLlxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdyb2xsYmFja1RyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCA9IDE7XG4gICAgICAvLyBBbiBvdXRlcm1vc3QgdHJhbnNhY3Rpb24gd2FzIHJvbGxlZCBiYWNrLiBSZXNldCB0aGUgdHJhbnNhY3Rpb24gY291bnRlclxuICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXQoJ3JvbGxiYWNrVHJhbnNhY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdjb2x1bW5NZXRhZGF0YScsICh0b2tlbikgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdDtcbiAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IENvbHVtbk1ldGFkYXRhIH0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuID0gdG9rZW4uY29sdW1ucy5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0b2tlbi5jb2x1bW5zW2pdO1xuICAgICAgICAgICAgICBpZiAoY29sdW1uc1tjb2wuY29sTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbnNbY29sLmNvbE5hbWVdID0gY29sO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlcXVlc3QuZW1pdCgnY29sdW1uTWV0YWRhdGEnLCBjb2x1bW5zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdC5lbWl0KCdjb2x1bW5NZXRhZGF0YScsIHRva2VuLmNvbHVtbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIlJlY2VpdmVkICdjb2x1bW5NZXRhZGF0YScgd2hlbiBubyBzcWxSZXF1ZXN0IGlzIGluIHByb2dyZXNzXCIpKTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ29yZGVyJywgKHRva2VuKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0O1xuICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICAgICAgcmVxdWVzdC5lbWl0KCdvcmRlcicsIHRva2VuLm9yZGVyQ29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXCJSZWNlaXZlZCAnb3JkZXInIHdoZW4gbm8gc3FsUmVxdWVzdCBpcyBpbiBwcm9ncmVzc1wiKSk7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdyb3cnLCAodG9rZW4pID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3QgYXMgUmVxdWVzdDtcbiAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnJvd3MhLnB1c2godG9rZW4uY29sdW1ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucnN0IS5wdXNoKHRva2VuLmNvbHVtbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuZW1pdCgncm93JywgdG9rZW4uY29sdW1ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKFwiUmVjZWl2ZWQgJ3Jvdycgd2hlbiBubyBzcWxSZXF1ZXN0IGlzIGluIHByb2dyZXNzXCIpKTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdG9rZW5TdHJlYW1QYXJzZXIub24oJ3JldHVyblN0YXR1cycsICh0b2tlbikgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdDtcbiAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgICAgIC8vIEtlZXAgdmFsdWUgZm9yIHBhc3NpbmcgaW4gJ2RvbmVQcm9jJyBldmVudC5cbiAgICAgICAgICB0aGlzLnByb2NSZXR1cm5TdGF0dXNWYWx1ZSA9IHRva2VuLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0b2tlblN0cmVhbVBhcnNlci5vbigncmV0dXJuVmFsdWUnLCAodG9rZW4pID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3Q7XG4gICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgICAgICByZXF1ZXN0LmVtaXQoJ3JldHVyblZhbHVlJywgdG9rZW4ucGFyYW1OYW1lLCB0b2tlbi52YWx1ZSwgdG9rZW4ubWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0b2tlblN0cmVhbVBhcnNlci5vbignZG9uZVByb2MnLCAodG9rZW4pID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3QgYXMgUmVxdWVzdDtcbiAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICghcmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgICAgIHJlcXVlc3QuZW1pdCgnZG9uZVByb2MnLCB0b2tlbi5yb3dDb3VudCwgdG9rZW4ubW9yZSwgdGhpcy5wcm9jUmV0dXJuU3RhdHVzVmFsdWUsIHJlcXVlc3QucnN0KTtcbiAgICAgICAgICB0aGlzLnByb2NSZXR1cm5TdGF0dXNWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAodG9rZW4ucm93Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxdWVzdC5yb3dDb3VudCEgKz0gdG9rZW4ucm93Q291bnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucnN0ID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0b2tlblN0cmVhbVBhcnNlci5vbignZG9uZUluUHJvYycsICh0b2tlbikgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCBhcyBSZXF1ZXN0O1xuICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmNhbmNlbGVkKSB7XG4gICAgICAgICAgcmVxdWVzdC5lbWl0KCdkb25lSW5Qcm9jJywgdG9rZW4ucm93Q291bnQsIHRva2VuLm1vcmUsIHJlcXVlc3QucnN0KTtcbiAgICAgICAgICBpZiAodG9rZW4ucm93Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxdWVzdC5yb3dDb3VudCEgKz0gdG9rZW4ucm93Q291bnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucnN0ID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0b2tlblN0cmVhbVBhcnNlci5vbignZG9uZScsICh0b2tlbikgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCBhcyBSZXF1ZXN0O1xuICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHRva2VuLmF0dGVudGlvbikge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnYXR0ZW50aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgICAgICBpZiAodG9rZW4uc3FsRXJyb3IgJiYgIXJlcXVlc3QuZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBET05FX0VSUk9SIGZsYWdzIHdhcyBzZXQsIGJ1dCBhbiBFUlJPUiB0b2tlbiB3YXMgbm90IHNlbnQuXG4gICAgICAgICAgICByZXF1ZXN0LmVycm9yID0gUmVxdWVzdEVycm9yKCdBbiB1bmtub3duIGVycm9yIGhhcyBvY2N1cnJlZC4nLCAnVU5LTk9XTicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXF1ZXN0LmVtaXQoJ2RvbmUnLCB0b2tlbi5yb3dDb3VudCwgdG9rZW4ubW9yZSwgcmVxdWVzdC5yc3QpO1xuICAgICAgICAgIGlmICh0b2tlbi5yb3dDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnJvd0NvdW50ISArPSB0b2tlbi5yb3dDb3VudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSkge1xuICAgICAgICAgICAgcmVxdWVzdC5yc3QgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uKCdyZXNldENvbm5lY3Rpb24nLCAoKSA9PiB7XG4gICAgICB0aGlzLmVtaXQoJ3Jlc2V0Q29ubmVjdGlvbicpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRva2VuU3RyZWFtUGFyc2VyO1xuICB9XG5cbiAgY29ubmVjdE9uUG9ydChwb3J0OiBudW1iZXIsIG11bHRpU3VibmV0RmFpbG92ZXI6IGJvb2xlYW4sIHNpZ25hbDogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCBjb25uZWN0T3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcixcbiAgICAgIHBvcnQ6IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnBvcnQgOiBwb3J0LFxuICAgICAgbG9jYWxBZGRyZXNzOiB0aGlzLmNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzc1xuICAgIH07XG5cbiAgICBuZXcgQ29ubmVjdG9yKGNvbm5lY3RPcHRzLCBzaWduYWwsIG11bHRpU3VibmV0RmFpbG92ZXIpLmV4ZWN1dGUoKGVyciwgc29ja2V0KSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgIH1cblxuICAgICAgc29ja2V0ID0gc29ja2V0ITtcbiAgICAgIHNvY2tldC5vbignZXJyb3InLCAoZXJyb3IpID0+IHsgdGhpcy5zb2NrZXRFcnJvcihlcnJvcik7IH0pO1xuICAgICAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHsgdGhpcy5zb2NrZXRDbG9zZSgpOyB9KTtcbiAgICAgIHNvY2tldC5vbignZW5kJywgKCkgPT4geyB0aGlzLnNvY2tldEVuZCgpOyB9KTtcbiAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwgS0VFUF9BTElWRV9JTklUSUFMX0RFTEFZKTtcblxuICAgICAgdGhpcy5tZXNzYWdlSW8gPSBuZXcgTWVzc2FnZUlPKHNvY2tldCwgdGhpcy5jb25maWcub3B0aW9ucy5wYWNrZXRTaXplLCB0aGlzLmRlYnVnKTtcbiAgICAgIHRoaXMubWVzc2FnZUlvLm9uKCdkYXRhJywgKG1lc3NhZ2UpID0+IHsgdGhpcy5kaXNwYXRjaEV2ZW50KCdtZXNzYWdlJywgbWVzc2FnZSk7IH0pO1xuICAgICAgdGhpcy5tZXNzYWdlSW8ub24oJ3NlY3VyZScsIChjbGVhcnRleHQpID0+IHsgdGhpcy5lbWl0KCdzZWN1cmUnLCBjbGVhcnRleHQpOyB9KTtcbiAgICAgIHRoaXMubWVzc2FnZUlvLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgIHRoaXMuc29ja2V0Q29ubmVjdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbG9zZUNvbm5lY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVDb25uZWN0VGltZXIoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgdGhpcy5jb25uZWN0VGltZW91dCgpO1xuICAgIH0sIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlQ2FuY2VsVGltZXIoKSB7XG4gICAgdGhpcy5jbGVhckNhbmNlbFRpbWVyKCk7XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMuY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dDtcbiAgICBpZiAodGltZW91dCA+IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYW5jZWxUaW1lb3V0KCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZVJlcXVlc3RUaW1lcigpIHtcbiAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7IC8vIHJlbGVhc2Ugb2xkIHRpbWVyLCBqdXN0IHRvIGJlIHNhZmVcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0IGFzIFJlcXVlc3Q7XG4gICAgY29uc3QgdGltZW91dCA9IChyZXF1ZXN0LnRpbWVvdXQgIT09IHVuZGVmaW5lZCkgPyByZXF1ZXN0LnRpbWVvdXQgOiB0aGlzLmNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0O1xuICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICB0aGlzLnJlcXVlc3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0KCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZVJldHJ5VGltZXIoKSB7XG4gICAgdGhpcy5jbGVhclJldHJ5VGltZXIoKTtcbiAgICB0aGlzLnJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmV0cnlUaW1lb3V0KCk7XG4gICAgfSwgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbm5lY3RUaW1lb3V0KCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIGNvbm5lY3QgdG8gJHt0aGlzLmNvbmZpZy5zZXJ2ZXJ9JHt0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQgPyBgOiR7dGhpcy5jb25maWcub3B0aW9ucy5wb3J0fWAgOiBgXFxcXCR7dGhpcy5jb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWV9YH0gaW4gJHt0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0fW1zYDtcbiAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VUSU1FT1VUJykpO1xuICAgIHRoaXMuY29ubmVjdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnY29ubmVjdFRpbWVvdXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsVGltZW91dCgpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYEZhaWxlZCB0byBjYW5jZWwgcmVxdWVzdCBpbiAke3RoaXMuY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dH1tc2A7XG4gICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdzb2NrZXRFcnJvcicsIENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCAnRVRJTUVPVVQnKSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlcXVlc3RUaW1lb3V0KCkge1xuICAgIHRoaXMucmVxdWVzdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3QhO1xuICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgY29uc3QgdGltZW91dCA9IChyZXF1ZXN0LnRpbWVvdXQgIT09IHVuZGVmaW5lZCkgPyByZXF1ZXN0LnRpbWVvdXQgOiB0aGlzLmNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSAnVGltZW91dDogUmVxdWVzdCBmYWlsZWQgdG8gY29tcGxldGUgaW4gJyArIHRpbWVvdXQgKyAnbXMnO1xuICAgIHJlcXVlc3QuZXJyb3IgPSBSZXF1ZXN0RXJyb3IobWVzc2FnZSwgJ0VUSU1FT1VUJyk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJldHJ5VGltZW91dCgpIHtcbiAgICB0aGlzLnJldHJ5VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbWl0KCdyZXRyeScpO1xuICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuQ09OTkVDVElORyk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyQ29ubmVjdFRpbWVyKCkge1xuICAgIGlmICh0aGlzLmNvbm5lY3RUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY29ubmVjdFRpbWVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyQ2FuY2VsVGltZXIoKSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNhbmNlbFRpbWVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyUmVxdWVzdFRpbWVyKCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3RUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVyKTtcbiAgICAgIHRoaXMucmVxdWVzdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYXJSZXRyeVRpbWVyKCkge1xuICAgIGlmICh0aGlzLnJldHJ5VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZXIpO1xuICAgICAgdGhpcy5yZXRyeVRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJhbnNpdGlvblRvKG5ld1N0YXRlOiBTdGF0ZSkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBuZXdTdGF0ZSkge1xuICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1N0YXRlIGlzIGFscmVhZHkgJyArIG5ld1N0YXRlLm5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlICYmIHRoaXMuc3RhdGUuZXhpdCkge1xuICAgICAgdGhpcy5zdGF0ZS5leGl0LmNhbGwodGhpcywgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIHRoaXMuZGVidWcubG9nKCdTdGF0ZSBjaGFuZ2U6ICcgKyAodGhpcy5zdGF0ZSA/IHRoaXMuc3RhdGUubmFtZSA6ICd1bmRlZmluZWQnKSArICcgLT4gJyArIG5ld1N0YXRlLm5hbWUpO1xuICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmVudGVyKSB7XG4gICAgICB0aGlzLnN0YXRlLmVudGVyLmFwcGx5KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0RXZlbnRIYW5kbGVyPFQgZXh0ZW5kcyBrZXlvZiBTdGF0ZVsnZXZlbnRzJ10+KGV2ZW50TmFtZTogVCk6IE5vbk51bGxhYmxlPFN0YXRlWydldmVudHMnXVtUXT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnN0YXRlLmV2ZW50c1tldmVudE5hbWVdO1xuXG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGV2ZW50ICcke2V2ZW50TmFtZX0nIGluIHN0YXRlICcke3RoaXMuc3RhdGUubmFtZX0nYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXIhO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkaXNwYXRjaEV2ZW50PFQgZXh0ZW5kcyBrZXlvZiBTdGF0ZVsnZXZlbnRzJ10+KGV2ZW50TmFtZTogVCwgLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTxTdGF0ZVsnZXZlbnRzJ11bVF0+Pikge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnN0YXRlLmV2ZW50c1tldmVudE5hbWVdIGFzICgodGhpczogQ29ubmVjdGlvbiwgLi4uYXJnczogYW55W10pID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKGBObyBldmVudCAnJHtldmVudE5hbWV9JyBpbiBzdGF0ZSAnJHt0aGlzLnN0YXRlLm5hbWV9J2ApKTtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldEVycm9yKGVycm9yOiBFcnJvcikge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLkNPTk5FQ1RJTkcgfHwgdGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5TRU5UX1RMU1NTTE5FR09USUFUSU9OKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEZhaWxlZCB0byBjb25uZWN0IHRvICR7dGhpcy5jb25maWcuc2VydmVyfToke3RoaXMuY29uZmlnLm9wdGlvbnMucG9ydH0gLSAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UsICdFU09DS0VUJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYENvbm5lY3Rpb24gbG9zdCAtICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UsICdFU09DS0VUJykpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3NvY2tldEVycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzb2NrZXRDb25uZWN0KCkge1xuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5kZWJ1Zy5sb2coJ2Nvbm5lY3RlZCB0byAnICsgdGhpcy5jb25maWcuc2VydmVyICsgJzonICsgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0KTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3NvY2tldENvbm5lY3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc29ja2V0RW5kKCkge1xuICAgIHRoaXMuZGVidWcubG9nKCdzb2NrZXQgZW5kZWQnKTtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5TVEFURS5GSU5BTCkge1xuICAgICAgY29uc3QgZXJyb3I6IEVycm9yV2l0aENvZGUgPSBuZXcgRXJyb3IoJ3NvY2tldCBoYW5nIHVwJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgICAgdGhpcy5zb2NrZXRFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzb2NrZXRDbG9zZSgpIHtcbiAgICB0aGlzLmRlYnVnLmxvZygnY29ubmVjdGlvbiB0byAnICsgdGhpcy5jb25maWcuc2VydmVyICsgJzonICsgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ICsgJyBjbG9zZWQnKTtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5SRVJPVVRJTkcpIHtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdSZXJvdXRpbmcgdG8gJyArIHRoaXMucm91dGluZ0RhdGEhLnNlcnZlciArICc6JyArIHRoaXMucm91dGluZ0RhdGEhLnBvcnQpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3JlY29ubmVjdCcpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5UUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSkge1xuICAgICAgY29uc3Qgc2VydmVyID0gdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEuc2VydmVyIDogdGhpcy5jb25maWcuc2VydmVyO1xuICAgICAgY29uc3QgcG9ydCA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnBvcnQgOiB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQ7XG4gICAgICB0aGlzLmRlYnVnLmxvZygnUmV0cnkgYWZ0ZXIgdHJhbnNpZW50IGZhaWx1cmUgY29ubmVjdGluZyB0byAnICsgc2VydmVyICsgJzonICsgcG9ydCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgncmV0cnknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kUHJlTG9naW4oKSB7XG4gICAgY29uc3QgWyAsIG1ham9yLCBtaW5vciwgYnVpbGQgXSA9IC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspLy5leGVjKHZlcnNpb24pID8/IFsgJzAuMC4wJywgJzAnLCAnMCcsICcwJyBdO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBQcmVsb2dpblBheWxvYWQoe1xuICAgICAgZW5jcnlwdDogdGhpcy5jb25maWcub3B0aW9ucy5lbmNyeXB0LFxuICAgICAgdmVyc2lvbjogeyBtYWpvcjogTnVtYmVyKG1ham9yKSwgbWlub3I6IE51bWJlcihtaW5vciksIGJ1aWxkOiBOdW1iZXIoYnVpbGQpLCBzdWJidWlsZDogMCB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLlBSRUxPR0lOLCBwYXlsb2FkLmRhdGEpO1xuICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbXB0eU1lc3NhZ2VCdWZmZXIoKSB7XG4gICAgdGhpcy5tZXNzYWdlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhZGRUb01lc3NhZ2VCdWZmZXIoZGF0YTogQnVmZmVyKSB7XG4gICAgdGhpcy5tZXNzYWdlQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbdGhpcy5tZXNzYWdlQnVmZmVyLCBkYXRhXSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRMb2dpbjdQYWNrZXQoKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBMb2dpbjdQYXlsb2FkKHtcbiAgICAgIHRkc1ZlcnNpb246IHZlcnNpb25zW3RoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbl0sXG4gICAgICBwYWNrZXRTaXplOiB0aGlzLmNvbmZpZy5vcHRpb25zLnBhY2tldFNpemUsXG4gICAgICBjbGllbnRQcm9nVmVyOiAwLFxuICAgICAgY2xpZW50UGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIGNvbm5lY3Rpb25JZDogMCxcbiAgICAgIGNsaWVudFRpbWVab25lOiBuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAgICBjbGllbnRMY2lkOiAweDAwMDAwNDA5XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0aW9uIH0gPSB0aGlzLmNvbmZpZztcbiAgICBzd2l0Y2ggKGF1dGhlbnRpY2F0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnOlxuICAgICAgICBwYXlsb2FkLmZlZEF1dGggPSB7XG4gICAgICAgICAgdHlwZTogJ0FEQUwnLFxuICAgICAgICAgIGVjaG86IHRoaXMuZmVkQXV0aFJlcXVpcmVkLFxuICAgICAgICAgIHdvcmtmbG93OiAnZGVmYXVsdCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJzpcbiAgICAgICAgcGF5bG9hZC5mZWRBdXRoID0ge1xuICAgICAgICAgIHR5cGU6ICdTRUNVUklUWVRPS0VOJyxcbiAgICAgICAgICBlY2hvOiB0aGlzLmZlZEF1dGhSZXF1aXJlZCxcbiAgICAgICAgICBmZWRBdXRoVG9rZW46IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudG9rZW5cbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJzpcbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJzpcbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0JzpcbiAgICAgICAgcGF5bG9hZC5mZWRBdXRoID0ge1xuICAgICAgICAgIHR5cGU6ICdBREFMJyxcbiAgICAgICAgICBlY2hvOiB0aGlzLmZlZEF1dGhSZXF1aXJlZCxcbiAgICAgICAgICB3b3JrZmxvdzogJ2ludGVncmF0ZWQnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdudGxtJzpcbiAgICAgICAgcGF5bG9hZC5zc3BpID0gY3JlYXRlTlRMTVJlcXVlc3QoeyBkb21haW46IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuZG9tYWluIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGF5bG9hZC51c2VyTmFtZSA9IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWU7XG4gICAgICAgIHBheWxvYWQucGFzc3dvcmQgPSBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkO1xuICAgIH1cblxuICAgIHBheWxvYWQuaG9zdG5hbWUgPSB0aGlzLmNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgfHwgb3MuaG9zdG5hbWUoKTtcbiAgICBwYXlsb2FkLnNlcnZlck5hbWUgPSB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5zZXJ2ZXIgOiB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgcGF5bG9hZC5hcHBOYW1lID0gdGhpcy5jb25maWcub3B0aW9ucy5hcHBOYW1lIHx8ICdUZWRpb3VzJztcbiAgICBwYXlsb2FkLmxpYnJhcnlOYW1lID0gbGlicmFyeU5hbWU7XG4gICAgcGF5bG9hZC5sYW5ndWFnZSA9IHRoaXMuY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgcGF5bG9hZC5kYXRhYmFzZSA9IHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0YWJhc2U7XG4gICAgcGF5bG9hZC5jbGllbnRJZCA9IEJ1ZmZlci5mcm9tKFsxLCAyLCAzLCA0LCA1LCA2XSk7XG5cbiAgICBwYXlsb2FkLnJlYWRPbmx5SW50ZW50ID0gdGhpcy5jb25maWcub3B0aW9ucy5yZWFkT25seUludGVudDtcbiAgICBwYXlsb2FkLmluaXREYkZhdGFsID0gIXRoaXMuY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYjtcblxuICAgIHRoaXMucm91dGluZ0RhdGEgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tZXNzYWdlSW8uc2VuZE1lc3NhZ2UoVFlQRS5MT0dJTjcsIHBheWxvYWQudG9CdWZmZXIoKSk7XG5cbiAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcGF5bG9hZC50b1N0cmluZygnICAnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2VuZEZlZEF1dGhUb2tlbk1lc3NhZ2UodG9rZW46IHN0cmluZykge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuTGVuID0gQnVmZmVyLmJ5dGVMZW5ndGgodG9rZW4sICd1Y3MyJyk7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4ICsgYWNjZXNzVG9rZW5MZW4pO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIG9mZnNldCA9IGRhdGEud3JpdGVVSW50MzJMRShhY2Nlc3NUb2tlbkxlbiArIDQsIG9mZnNldCk7XG4gICAgb2Zmc2V0ID0gZGF0YS53cml0ZVVJbnQzMkxFKGFjY2Vzc1Rva2VuTGVuLCBvZmZzZXQpO1xuICAgIGRhdGEud3JpdGUodG9rZW4sIG9mZnNldCwgJ3VjczInKTtcbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLkZFREFVVEhfVE9LRU4sIGRhdGEpO1xuICAgIC8vIHNlbnQgdGhlIGZlZEF1dGggdG9rZW4gbWVzc2FnZSwgdGhlIHJlc3QgaXMgc2ltaWxhciB0byBzdGFuZGFyZCBsb2dpbiA3XG4gICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2VuZEluaXRpYWxTcWwoKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBTcWxCYXRjaFBheWxvYWQodGhpcy5nZXRJbml0aWFsU3FsKCksIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zKTtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7IHR5cGU6IFRZUEUuU1FMX0JBVENIIH0pO1xuICAgIHRoaXMubWVzc2FnZUlvLm91dGdvaW5nTWVzc2FnZVN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICBSZWFkYWJsZS5mcm9tKHBheWxvYWQpLnBpcGUobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldEluaXRpYWxTcWwoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfbnVsbHMgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxzIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9udWxsX2RmbHRfb24gb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9udWxsX2RmbHRfb24gb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfcGFkZGluZyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfcGFkZGluZyBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfd2FybmluZ3Mgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV93YXJuaW5ncyBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhcml0aGFib3J0IG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhcml0aGFib3J0IG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBjb25jYXRfbnVsbF95aWVsZHNfbnVsbCBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGNvbmNhdF9udWxsX3lpZWxkc19udWxsIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGN1cnNvcl9jbG9zZV9vbl9jb21taXQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGN1cnNvcl9jbG9zZV9vbl9jb21taXQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCBkYXRlZmlyc3QgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCBkYXRlZm9ybWF0ICR7dGhpcy5jb25maWcub3B0aW9ucy5kYXRlRm9ybWF0fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBpbXBsaWNpdF90cmFuc2FjdGlvbnMgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBpbXBsaWNpdF90cmFuc2FjdGlvbnMgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGxhbmd1YWdlICR7dGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZX1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgbnVtZXJpY19yb3VuZGFib3J0IG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgbnVtZXJpY19yb3VuZGFib3J0IG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXIgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHF1b3RlZF9pZGVudGlmaWVyIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXIgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBxdW90ZWRfaWRlbnRpZmllciBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy50ZXh0c2l6ZSAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGBzZXQgdGV4dHNpemUgJHt0aGlzLmNvbmZpZy5vcHRpb25zLnRleHRzaXplfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGBzZXQgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsICR7dGhpcy5nZXRJc29sYXRpb25MZXZlbFRleHQodGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwpfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCB4YWN0X2Fib3J0IG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgeGFjdF9hYm9ydCBvZmYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJvY2Vzc2VkSW5pdGlhbFNxbCgpIHtcbiAgICB0aGlzLmNsZWFyQ29ubmVjdFRpbWVyKCk7XG4gICAgdGhpcy5lbWl0KCdjb25uZWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgU1FMIGJhdGNoIHJlcHJlc2VudGVkIGJ5IFtbUmVxdWVzdF1dLlxuICAgKiBUaGVyZSBpcyBubyBwYXJhbSBzdXBwb3J0LCBhbmQgdW5saWtlIFtbUmVxdWVzdC5leGVjU3FsXV0sXG4gICAqIGl0IGlzIG5vdCBsaWtlbHkgdGhhdCBTUUwgU2VydmVyIHdpbGwgcmV1c2UgdGhlIGV4ZWN1dGlvbiBwbGFuIGl0IGdlbmVyYXRlcyBmb3IgdGhlIFNRTC5cbiAgICpcbiAgICogSW4gYWxtb3N0IGFsbCBjYXNlcywgW1tSZXF1ZXN0LmV4ZWNTcWxdXSB3aWxsIGJlIGEgYmV0dGVyIGNob2ljZS5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgZXhlY1NxbEJhdGNoKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuU1FMX0JBVENILCBuZXcgU3FsQmF0Y2hQYXlsb2FkKHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlISwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgRXhlY3V0ZSB0aGUgU1FMIHJlcHJlc2VudGVkIGJ5IFtbUmVxdWVzdF1dLlxuICAgKlxuICAgKiBBcyBgc3BfZXhlY3V0ZXNxbGAgaXMgdXNlZCB0byBleGVjdXRlIHRoZSBTUUwsIGlmIHRoZSBzYW1lIFNRTCBpcyBleGVjdXRlZCBtdWx0aXBsZXMgdGltZXNcbiAgICogdXNpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIFNRTCBTZXJ2ZXIgcXVlcnkgb3B0aW1pemVyIGlzIGxpa2VseSB0byByZXVzZSB0aGUgZXhlY3V0aW9uIHBsYW4gaXQgZ2VuZXJhdGVzXG4gICAqIGZvciB0aGUgZmlyc3QgZXhlY3V0aW9uLiBUaGlzIG1heSBhbHNvIHJlc3VsdCBpbiBTUUwgc2VydmVyIHRyZWF0aW5nIHRoZSByZXF1ZXN0IGxpa2UgYSBzdG9yZWQgcHJvY2VkdXJlXG4gICAqIHdoaWNoIGNhbiByZXN1bHQgaW4gdGhlIFtbRXZlbnRfZG9uZUluUHJvY11dIG9yIFtbRXZlbnRfZG9uZVByb2NdXSBldmVudHMgYmVpbmcgZW1pdHRlZCBpbnN0ZWFkIG9mIHRoZVxuICAgKiBbW0V2ZW50X2RvbmVdXSBldmVudCB5b3UgbWlnaHQgZXhwZWN0LiBVc2luZyBbW2V4ZWNTcWxCYXRjaF1dIHdpbGwgcHJldmVudCB0aGlzIGZyb20gb2NjdXJyaW5nIGJ1dCBtYXkgaGF2ZSBhIG5lZ2F0aXZlIHBlcmZvcm1hbmNlIGltcGFjdC5cbiAgICpcbiAgICogQmV3YXJlIG9mIHRoZSB3YXkgdGhhdCBzY29waW5nIHJ1bGVzIGFwcGx5LCBhbmQgaG93IHRoZXkgbWF5IFthZmZlY3QgbG9jYWwgdGVtcCB0YWJsZXNdKGh0dHA6Ly93ZWJsb2dzLnNxbHRlYW0uY29tL21sYWRlbnAvYXJjaGl2ZS8yMDA2LzExLzAzLzE3MTk3LmFzcHgpXG4gICAqIElmIHlvdSdyZSBydW5uaW5nIGluIHRvIHNjb3BpbmcgaXNzdWVzLCB0aGVuIFtbZXhlY1NxbEJhdGNoXV0gbWF5IGJlIGEgYmV0dGVyIGNob2ljZS5cbiAgICogU2VlIGFsc28gW2lzc3VlICMyNF0oaHR0cHM6Ly9naXRodWIuY29tL3Bla2ltL3RlZGlvdXMvaXNzdWVzLzI0KVxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBleGVjU3FsKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0cnkge1xuICAgICAgcmVxdWVzdC52YWxpZGF0ZVBhcmFtZXRlcnModGhpcy5kYXRhYmFzZUNvbGxhdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmVxdWVzdC5lcnJvciA9IGVycm9yO1xuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5kZWJ1Zy5sb2coZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2soZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgbmFtZTogJ3N0YXRlbWVudCcsXG4gICAgICB2YWx1ZTogcmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIGlmIChyZXF1ZXN0LnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgICAgbmFtZTogJ3BhcmFtcycsXG4gICAgICAgIHZhbHVlOiByZXF1ZXN0Lm1ha2VQYXJhbXNQYXJhbWV0ZXIocmVxdWVzdC5wYXJhbWV0ZXJzKSxcbiAgICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgICB9KTtcblxuICAgICAgcGFyYW1ldGVycy5wdXNoKC4uLnJlcXVlc3QucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQoJ3NwX2V4ZWN1dGVzcWwnLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQnVsa0xvYWQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gYnVsay1pbnNlcnQgaW50by5cbiAgICogQHBhcmFtIG9wdGlvbnMgQSBzZXQgb2YgYnVsayBsb2FkIG9wdGlvbnMuXG4gICAqL1xuICBuZXdCdWxrTG9hZCh0YWJsZTogc3RyaW5nLCBjYWxsYmFjazogQnVsa0xvYWRDYWxsYmFjayk6IEJ1bGtMb2FkXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIG9wdGlvbnM6IEJ1bGtMb2FkT3B0aW9ucywgY2FsbGJhY2s6IEJ1bGtMb2FkQ2FsbGJhY2spOiBCdWxrTG9hZFxuICBuZXdCdWxrTG9hZCh0YWJsZTogc3RyaW5nLCBjYWxsYmFja09yT3B0aW9uczogQnVsa0xvYWRPcHRpb25zIHwgQnVsa0xvYWRDYWxsYmFjaywgY2FsbGJhY2s/OiBCdWxrTG9hZENhbGxiYWNrKSB7XG4gICAgbGV0IG9wdGlvbnM6IEJ1bGtMb2FkT3B0aW9ucztcblxuICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrT3JPcHRpb25zIGFzIEJ1bGtMb2FkQ2FsbGJhY2s7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBjYWxsYmFja09yT3B0aW9ucyBhcyBCdWxrTG9hZE9wdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJvcHRpb25zXCIgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCdWxrTG9hZCh0YWJsZSwgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbiwgdGhpcy5jb25maWcub3B0aW9ucywgb3B0aW9ucywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBbW0J1bGtMb2FkXV0uXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIC8vIFdlIHdhbnQgdG8gcGVyZm9ybSBhIGJ1bGsgbG9hZCBpbnRvIGEgdGFibGUgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAgICogLy8gQ1JFQVRFIFRBQkxFIGVtcGxveWVlcyAoZmlyc3RfbmFtZSBudmFyY2hhcigyNTUpLCBsYXN0X25hbWUgbnZhcmNoYXIoMjU1KSwgZGF5X29mX2JpcnRoIGRhdGUpO1xuICAgKlxuICAgKiBjb25zdCBidWxrTG9hZCA9IGNvbm5lY3Rpb24ubmV3QnVsa0xvYWQoJ2VtcGxveWVlcycsIChlcnIsIHJvd0NvdW50KSA9PiB7XG4gICAqICAgLy8gLi4uXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBGaXJzdCwgd2UgbmVlZCB0byBzcGVjaWZ5IHRoZSBjb2x1bW5zIHRoYXQgd2Ugd2FudCB0byB3cml0ZSB0byxcbiAgICogLy8gYW5kIHRoZWlyIGRlZmluaXRpb25zLiBUaGVzZSBkZWZpbml0aW9ucyBtdXN0IG1hdGNoIHRoZSBhY3R1YWwgdGFibGUsXG4gICAqIC8vIG90aGVyd2lzZSB0aGUgYnVsayBsb2FkIHdpbGwgZmFpbC5cbiAgICogYnVsa0xvYWQuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgVFlQRVMuTlZhcmNoYXIsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsIFRZUEVTLk5WYXJjaGFyLCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICogYnVsa0xvYWQuYWRkQ29sdW1uKCdkYXRlX29mX2JpcnRoJywgVFlQRVMuRGF0ZSwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqXG4gICAqIC8vIE5vdywgd2UgY2FuIHNwZWNpZnkgZWFjaCByb3cgdG8gYmUgd3JpdHRlbi5cbiAgICogLy9cbiAgICogLy8gTm90ZSB0aGF0IHRoZXNlIHJvd3MgYXJlIGhlbGQgaW4gbWVtb3J5IHVudGlsIHRoZVxuICAgKiAvLyBidWxrIGxvYWQgd2FzIHBlcmZvcm1lZCwgc28gaWYgeW91IG5lZWQgdG8gd3JpdGUgYSBsYXJnZVxuICAgKiAvLyBudW1iZXIgb2Ygcm93cyAoZS5nLiBieSByZWFkaW5nIGZyb20gYSBDU1YgZmlsZSksXG4gICAqIC8vIHVzaW5nIGEgc3RyZWFtaW5nIGJ1bGsgbG9hZCBpcyBhZHZpc2FibGUgdG8ga2VlcCBtZW1vcnkgdXNhZ2UgbG93LlxuICAgKiBidWxrTG9hZC5hZGRSb3coeyAnZmlyc3RfbmFtZSc6ICdTdGV2ZScsICdsYXN0X25hbWUnOiAnSm9icycsICdkYXlfb2ZfYmlydGgnOiBuZXcgRGF0ZSgnMDItMjQtMTk1NScpIH0pO1xuICAgKiBidWxrTG9hZC5hZGRSb3coeyAnZmlyc3RfbmFtZSc6ICdCaWxsJywgJ2xhc3RfbmFtZSc6ICdHYXRlcycsICdkYXlfb2ZfYmlydGgnOiBuZXcgRGF0ZSgnMTAtMjgtMTk1NScpIH0pO1xuICAgKlxuICAgKiBjb25uZWN0aW9uLmV4ZWNCdWxrTG9hZChidWxrTG9hZCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYnVsa0xvYWQgQSBwcmV2aW91c2x5IGNyZWF0ZWQgW1tCdWxrTG9hZF1dLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBBZGRpbmcgcm93cyB0byBhIFtbQnVsa0xvYWRdXSB2aWEgW1tCdWxrTG9hZC5hZGRSb3ddXSBvciBbW0J1bGtMb2FkLmdldFJvd1N0cmVhbV1dXG4gICAqICAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuIFlvdSBzaG91bGQgbWlncmF0ZSB0byBjYWxsaW5nIFtbQ29ubmVjdGlvbi5leGVjQnVsa0xvYWRdXVxuICAgKiAgIHdpdGggYSBgSXRlcmFibGVgIG9yIGBBc3luY0l0ZXJhYmxlYCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGluc3RlYWQuXG4gICAqL1xuICBleGVjQnVsa0xvYWQoYnVsa0xvYWQ6IEJ1bGtMb2FkKTogdm9pZFxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgW1tCdWxrTG9hZF1dLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBXZSB3YW50IHRvIHBlcmZvcm0gYSBidWxrIGxvYWQgaW50byBhIHRhYmxlIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAqIC8vIENSRUFURSBUQUJMRSBlbXBsb3llZXMgKGZpcnN0X25hbWUgbnZhcmNoYXIoMjU1KSwgbGFzdF9uYW1lIG52YXJjaGFyKDI1NSksIGRheV9vZl9iaXJ0aCBkYXRlKTtcbiAgICpcbiAgICogY29uc3QgYnVsa0xvYWQgPSBjb25uZWN0aW9uLm5ld0J1bGtMb2FkKCdlbXBsb3llZXMnLCAoZXJyLCByb3dDb3VudCkgPT4ge1xuICAgKiAgIC8vIC4uLlxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gRmlyc3QsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgY29sdW1ucyB0aGF0IHdlIHdhbnQgdG8gd3JpdGUgdG8sXG4gICAqIC8vIGFuZCB0aGVpciBkZWZpbml0aW9ucy4gVGhlc2UgZGVmaW5pdGlvbnMgbXVzdCBtYXRjaCB0aGUgYWN0dWFsIHRhYmxlLFxuICAgKiAvLyBvdGhlcndpc2UgdGhlIGJ1bGsgbG9hZCB3aWxsIGZhaWwuXG4gICAqIGJ1bGtMb2FkLmFkZENvbHVtbignZmlyc3RfbmFtZScsIFRZUEVTLk5WYXJjaGFyLCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICogYnVsa0xvYWQuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCBUWVBFUy5OVmFyY2hhciwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGJ1bGtMb2FkLmFkZENvbHVtbignZGF0ZV9vZl9iaXJ0aCcsIFRZUEVTLkRhdGUsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICAgKlxuICAgKiAvLyBFeGVjdXRlIGEgYnVsayBsb2FkIHdpdGggYSBwcmVkZWZpbmVkIGxpc3Qgb2Ygcm93cy5cbiAgICogLy9cbiAgICogLy8gTm90ZSB0aGF0IHRoZXNlIHJvd3MgYXJlIGhlbGQgaW4gbWVtb3J5IHVudGlsIHRoZVxuICAgKiAvLyBidWxrIGxvYWQgd2FzIHBlcmZvcm1lZCwgc28gaWYgeW91IG5lZWQgdG8gd3JpdGUgYSBsYXJnZVxuICAgKiAvLyBudW1iZXIgb2Ygcm93cyAoZS5nLiBieSByZWFkaW5nIGZyb20gYSBDU1YgZmlsZSksXG4gICAqIC8vIHBhc3NpbmcgYW4gYEFzeW5jSXRlcmFibGVgIGlzIGFkdmlzYWJsZSB0byBrZWVwIG1lbW9yeSB1c2FnZSBsb3cuXG4gICAqIGNvbm5lY3Rpb24uZXhlY0J1bGtMb2FkKGJ1bGtMb2FkLCBbXG4gICAqICAgeyAnZmlyc3RfbmFtZSc6ICdTdGV2ZScsICdsYXN0X25hbWUnOiAnSm9icycsICdkYXlfb2ZfYmlydGgnOiBuZXcgRGF0ZSgnMDItMjQtMTk1NScpIH0sXG4gICAqICAgeyAnZmlyc3RfbmFtZSc6ICdCaWxsJywgJ2xhc3RfbmFtZSc6ICdHYXRlcycsICdkYXlfb2ZfYmlydGgnOiBuZXcgRGF0ZSgnMTAtMjgtMTk1NScpIH1cbiAgICogXSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYnVsa0xvYWQgQSBwcmV2aW91c2x5IGNyZWF0ZWQgW1tCdWxrTG9hZF1dLlxuICAgKiBAcGFyYW0gcm93cyBBIFtbSXRlcmFibGVdXSBvciBbW0FzeW5jSXRlcmFibGVdXSB0aGF0IGNvbnRhaW5zIHRoZSByb3dzIHRoYXQgc2hvdWxkIGJlIGJ1bGsgbG9hZGVkLlxuICAgKi9cbiAgZXhlY0J1bGtMb2FkKGJ1bGtMb2FkOiBCdWxrTG9hZCwgcm93czogQXN5bmNJdGVyYWJsZTx1bmtub3duW10gfCB7IFtjb2x1bW5OYW1lOiBzdHJpbmddOiB1bmtub3duIH0+IHwgSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9Pik6IHZvaWRcblxuICBleGVjQnVsa0xvYWQoYnVsa0xvYWQ6IEJ1bGtMb2FkLCByb3dzPzogQXN5bmNJdGVyYWJsZTx1bmtub3duW10gfCB7IFtjb2x1bW5OYW1lOiBzdHJpbmddOiB1bmtub3duIH0+IHwgSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9Pikge1xuICAgIGJ1bGtMb2FkLmV4ZWN1dGlvblN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKHJvd3MpIHtcbiAgICAgIGlmIChidWxrTG9hZC5zdHJlYW1pbmdNb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24uZXhlY0J1bGtMb2FkIGNhbid0IGJlIGNhbGxlZCB3aXRoIGEgQnVsa0xvYWQgdGhhdCB3YXMgcHV0IGluIHN0cmVhbWluZyBtb2RlLlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1bGtMb2FkLmZpcnN0Um93V3JpdHRlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZCBjYW4ndCBiZSBjYWxsZWQgd2l0aCBhIEJ1bGtMb2FkIHRoYXQgYWxyZWFkeSBoYXMgcm93cyB3cml0dGVuIHRvIGl0LlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93U3RyZWFtID0gUmVhZGFibGUuZnJvbShyb3dzKTtcblxuICAgICAgLy8gRGVzdHJveSB0aGUgcGFja2V0IHRyYW5zZm9ybSBpZiBhbiBlcnJvciBoYXBwZW5zIGluIHRoZSByb3cgc3RyZWFtLFxuICAgICAgLy8gZS5nLiBpZiBhbiBlcnJvciBpcyB0aHJvd24gZnJvbSB3aXRoaW4gYSBnZW5lcmF0b3Igb3Igc3RyZWFtLlxuICAgICAgcm93U3RyZWFtLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm0uZGVzdHJveShlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIERlc3Ryb3kgdGhlIHJvdyBzdHJlYW0gaWYgYW4gZXJyb3IgaGFwcGVucyBpbiB0aGUgcGFja2V0IHRyYW5zZm9ybSxcbiAgICAgIC8vIGUuZy4gaWYgdGhlIGJ1bGsgbG9hZCBpcyBjYW5jZWxsZWQuXG4gICAgICBidWxrTG9hZC5yb3dUb1BhY2tldFRyYW5zZm9ybS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJvd1N0cmVhbS5kZXN0cm95KGVycik7XG4gICAgICB9KTtcblxuICAgICAgcm93U3RyZWFtLnBpcGUoYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm0pO1xuICAgIH0gZWxzZSBpZiAoIWJ1bGtMb2FkLnN0cmVhbWluZ01vZGUpIHtcbiAgICAgIC8vIElmIHRoZSBidWxrbG9hZCB3YXMgbm90IHB1dCBpbnRvIHN0cmVhbWluZyBtb2RlIGJ5IHRoZSB1c2VyLFxuICAgICAgLy8gd2UgZW5kIHRoZSByb3dUb1BhY2tldFRyYW5zZm9ybSBoZXJlIGZvciB0aGVtLlxuICAgICAgLy9cbiAgICAgIC8vIElmIGl0IHdhcyBwdXQgaW50byBzdHJlYW1pbmcgbW9kZSwgaXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5XG4gICAgICAvLyB0byBlbmQgdGhlIHN0cmVhbS5cbiAgICAgIGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtLmVuZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgcmVxdWVzdC5jYW5jZWwoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBCdWxrTG9hZFBheWxvYWQoYnVsa0xvYWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGJ1bGtMb2FkLmdldEJ1bGtJbnNlcnRTcWwoKSwgKGVycm9yOiAoRXJyb3IgJiB7IGNvZGU/OiBzdHJpbmcgfSkgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBidWxrTG9hZC5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgb25DYW5jZWwpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdVTktOT1dOJykge1xuICAgICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gJyBUaGlzIGlzIGxpa2VseSBiZWNhdXNlIHRoZSBzY2hlbWEgb2YgdGhlIEJ1bGtMb2FkIGRvZXMgbm90IG1hdGNoIHRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBpbnNlcnQgaW50by4nO1xuICAgICAgICB9XG4gICAgICAgIGJ1bGtMb2FkLmVycm9yID0gZXJyb3I7XG4gICAgICAgIGJ1bGtMb2FkLmNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1ha2VSZXF1ZXN0KGJ1bGtMb2FkLCBUWVBFLkJVTEtfTE9BRCwgcGF5bG9hZCk7XG4gICAgfSk7XG5cbiAgICBidWxrTG9hZC5vbmNlKCdjYW5jZWwnLCBvbkNhbmNlbCk7XG5cbiAgICB0aGlzLmV4ZWNTcWxCYXRjaChyZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIHRoZSBTUUwgcmVwcmVzZW50ZWQgYnkgdGhlIHJlcXVlc3QuXG4gICAqXG4gICAqIFRoZSByZXF1ZXN0IGNhbiB0aGVuIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscyB0b1xuICAgKiBbW2V4ZWN1dGVdXSBhbmQgW1t1bnByZXBhcmVdXVxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqICAgUGFyYW1ldGVycyBvbmx5IHJlcXVpcmUgYSBuYW1lIGFuZCB0eXBlLiBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBpZ25vcmVkLlxuICAgKi9cbiAgcHJlcGFyZShyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogUGFyYW1ldGVyW10gPSBbXTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5JbnQsXG4gICAgICBuYW1lOiAnaGFuZGxlJyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXQ6IHRydWUsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgbmFtZTogJ3BhcmFtcycsXG4gICAgICB2YWx1ZTogcmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCA/IHJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpIDogbnVsbCxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgbmFtZTogJ3N0bXQnLFxuICAgICAgdmFsdWU6IHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlLFxuICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICByZXF1ZXN0LnByZXBhcmluZyA9IHRydWU7XG4gICAgLy8gVE9ETzogV2UgbmVlZCB0byBjbGVhbiB1cCB0aGlzIGV2ZW50IGhhbmRsZXIsIG90aGVyd2lzZSB0aGlzIGxlYWtzIG1lbW9yeVxuICAgIHJlcXVlc3Qub24oJ3JldHVyblZhbHVlJywgKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKG5hbWUgPT09ICdoYW5kbGUnKSB7XG4gICAgICAgIHJlcXVlc3QuaGFuZGxlID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0LmVycm9yID0gUmVxdWVzdEVycm9yKGBUZWRpb3VzID4gVW5leHBlY3RlZCBvdXRwdXQgcGFyYW1ldGVyICR7bmFtZX0gZnJvbSBzcF9wcmVwYXJlYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZCgnc3BfcHJlcGFyZScsIHBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSB0aGUgU1FMIFNlcnZlciByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcHJldmlvdXNseSBwcmVwYXJlZCByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqICAgUGFyYW1ldGVycyBvbmx5IHJlcXVpcmUgYSBuYW1lIGFuZCB0eXBlLlxuICAgKiAgIFBhcmFtZXRlciB2YWx1ZXMgYXJlIGlnbm9yZWQuXG4gICAqL1xuICB1bnByZXBhcmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuSW50LFxuICAgICAgbmFtZTogJ2hhbmRsZScsXG4gICAgICAvLyBUT0RPOiBBYm9ydCBpZiBgcmVxdWVzdC5oYW5kbGVgIGlzIG5vdCBzZXRcbiAgICAgIHZhbHVlOiByZXF1ZXN0LmhhbmRsZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQoJ3NwX3VucHJlcGFyZScsIHBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBwcmV2aW91c2x5IHByZXBhcmVkIFNRTCwgdXNpbmcgdGhlIHN1cHBsaWVkIHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgcHJldmlvdXNseSBwcmVwYXJlZCBbW1JlcXVlc3RdXS5cbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgIEFuIG9iamVjdCB3aG9zZSBuYW1lcyBjb3JyZXNwb25kIHRvIHRoZSBuYW1lcyBvZlxuICAgKiAgIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBbW1JlcXVlc3RdXSBiZWZvcmUgaXQgd2FzIHByZXBhcmVkLlxuICAgKiAgIFRoZSBvYmplY3QncyB2YWx1ZXMgYXJlIHBhc3NlZCBhcyB0aGUgcGFyYW1ldGVycycgdmFsdWVzIHdoZW4gdGhlXG4gICAqICAgcmVxdWVzdCBpcyBleGVjdXRlZC5cbiAgICovXG4gIGV4ZWN1dGUocmVxdWVzdDogUmVxdWVzdCwgcGFyYW1ldGVycz86IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KSB7XG4gICAgY29uc3QgZXhlY3V0ZVBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBleGVjdXRlUGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLkludCxcbiAgICAgIG5hbWU6ICdoYW5kbGUnLFxuICAgICAgLy8gVE9ETzogQWJvcnQgaWYgYHJlcXVlc3QuaGFuZGxlYCBpcyBub3Qgc2V0XG4gICAgICB2YWx1ZTogcmVxdWVzdC5oYW5kbGUsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHJlcXVlc3QucGFyYW1ldGVyc1tpXTtcblxuICAgICAgICBleGVjdXRlUGFyYW1ldGVycy5wdXNoKHtcbiAgICAgICAgICAuLi5wYXJhbWV0ZXIsXG4gICAgICAgICAgdmFsdWU6IHBhcmFtZXRlci50eXBlLnZhbGlkYXRlKHBhcmFtZXRlcnMgPyBwYXJhbWV0ZXJzW3BhcmFtZXRlci5uYW1lXSA6IG51bGwsIHRoaXMuZGF0YWJhc2VDb2xsYXRpb24pXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHJlcXVlc3QuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVidWcubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQoJ3NwX2V4ZWN1dGUnLCBleGVjdXRlUGFyYW1ldGVycywgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMsIHRoaXMuZGF0YWJhc2VDb2xsYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIGEgc3RvcmVkIHByb2NlZHVyZSByZXByZXNlbnRlZCBieSBbW1JlcXVlc3RdXS5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgY2FsbFByb2NlZHVyZShyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcXVlc3QudmFsaWRhdGVQYXJhbWV0ZXJzKHRoaXMuZGF0YWJhc2VDb2xsYXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHJlcXVlc3QuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVidWcubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQocmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUhLCByZXF1ZXN0LnBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEBwYXJhbSBuYW1lIEEgc3RyaW5nIHJlcHJlc2VudGluZyBhIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxuICAgKiAgIE9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gYW4gZW1wdHkgc3RyaW5nLiBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGBcbiAgICogICBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0gaXNvbGF0aW9uTGV2ZWwgVGhlIGlzb2xhdGlvbiBsZXZlbCB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyB0byBiZSBydW4gd2l0aC5cbiAgICpcbiAgICogICBUaGUgaXNvbGF0aW9uIGxldmVscyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5JU09MQVRJT05fTEVWRUxgLlxuICAgKiAgICogYFJFQURfVU5DT01NSVRURURgXG4gICAqICAgKiBgUkVBRF9DT01NSVRURURgXG4gICAqICAgKiBgUkVQRUFUQUJMRV9SRUFEYFxuICAgKiAgICogYFNFUklBTElaQUJMRWBcbiAgICogICAqIGBTTkFQU0hPVGBcbiAgICpcbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHRoZSBDb25uZWN0aW9uJ3MgaXNvbGF0aW9uIGxldmVsLlxuICAgKi9cbiAgYmVnaW5UcmFuc2FjdGlvbihjYWxsYmFjazogQmVnaW5UcmFuc2FjdGlvbkNhbGxiYWNrLCBuYW1lID0gJycsIGlzb2xhdGlvbkxldmVsID0gdGhpcy5jb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbCkge1xuICAgIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwoaXNvbGF0aW9uTGV2ZWwsICdpc29sYXRpb25MZXZlbCcpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSwgaXNvbGF0aW9uTGV2ZWwpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1NFVCBUUkFOU0FDVElPTiBJU09MQVRJT04gTEVWRUwgJyArICh0cmFuc2FjdGlvbi5pc29sYXRpb25MZXZlbFRvVFNRTCgpKSArICc7QkVHSU4gVFJBTiAnICsgdHJhbnNhY3Rpb24ubmFtZSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRGVwdGgrKztcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25EZXB0aCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCAoZXJyKSA9PiB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5iZWdpblBheWxvYWQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXQgYSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhlcmUgc2hvdWxkIGJlIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiAtIHRoYXQgaXMsIFtbYmVnaW5UcmFuc2FjdGlvbl1dXG4gICAqIHNob3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy4gUmVxdWlyZWQgd2hlbiBgaXNvbGF0aW9uTGV2ZWxgaXMgcHJlc2VudC5cbiAgICovXG4gIGNvbW1pdFRyYW5zYWN0aW9uKGNhbGxiYWNrOiBDb21taXRUcmFuc2FjdGlvbkNhbGxiYWNrLCBuYW1lID0gJycpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihuYW1lKTtcbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWNTcWxCYXRjaChuZXcgUmVxdWVzdCgnQ09NTUlUIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1bmRlZmluZWQsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlRSQU5TQUNUSU9OX01BTkFHRVIsIHRyYW5zYWN0aW9uLmNvbW1pdFBheWxvYWQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xsYmFjayBhIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBUaGVyZSBzaG91bGQgYmUgYW4gYWN0aXZlIHRyYW5zYWN0aW9uIC0gdGhhdCBpcywgW1tiZWdpblRyYW5zYWN0aW9uXV1cbiAgICogc2hvdWxkIGhhdmUgYmVlbiBwcmV2aW91c2x5IGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEBwYXJhbSBuYW1lIEEgc3RyaW5nIHJlcHJlc2VudGluZyBhIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxuICAgKiAgIE9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gYW4gZW1wdHkgc3RyaW5nLlxuICAgKiAgIFJlcXVpcmVkIHdoZW4gYGlzb2xhdGlvbkxldmVsYCBpcyBwcmVzZW50LlxuICAgKi9cbiAgcm9sbGJhY2tUcmFuc2FjdGlvbihjYWxsYmFjazogUm9sbGJhY2tUcmFuc2FjdGlvbkNhbGxiYWNrLCBuYW1lID0gJycpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihuYW1lKTtcbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWNTcWxCYXRjaChuZXcgUmVxdWVzdCgnUk9MTEJBQ0sgVFJBTiAnICsgdHJhbnNhY3Rpb24ubmFtZSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRGVwdGgtLTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25EZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1bmRlZmluZWQsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlRSQU5TQUNUSU9OX01BTkFHRVIsIHRyYW5zYWN0aW9uLnJvbGxiYWNrUGF5bG9hZCh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHNhdmVwb2ludCB3aXRoaW4gYSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhlcmUgc2hvdWxkIGJlIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiAtIHRoYXQgaXMsIFtbYmVnaW5UcmFuc2FjdGlvbl1dXG4gICAqIHNob3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cXFxuICAgKiAgIE9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gYW4gZW1wdHkgc3RyaW5nLlxuICAgKiAgIFJlcXVpcmVkIHdoZW4gYGlzb2xhdGlvbkxldmVsYCBpcyBwcmVzZW50LlxuICAgKi9cbiAgc2F2ZVRyYW5zYWN0aW9uKGNhbGxiYWNrOiBTYXZlVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1NBVkUgVFJBTiAnICsgdHJhbnNhY3Rpb24ubmFtZSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRGVwdGgrKztcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVuZGVmaW5lZCwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuVFJBTlNBQ1RJT05fTUFOQUdFUiwgdHJhbnNhY3Rpb24uc2F2ZVBheWxvYWQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGdpdmVuIGNhbGxiYWNrIGFmdGVyIHN0YXJ0aW5nIGEgdHJhbnNhY3Rpb24sIGFuZCBjb21taXQgb3JcbiAgICogcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGFmdGVyd2FyZHMuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBoZWxwZXIgdGhhdCBlbXBsb3lzIFtbYmVnaW5UcmFuc2FjdGlvbl1dLCBbW2NvbW1pdFRyYW5zYWN0aW9uXV0sXG4gICAqIFtbcm9sbGJhY2tUcmFuc2FjdGlvbl1dLCBhbmQgW1tzYXZlVHJhbnNhY3Rpb25dXSB0byBncmVhdGx5IHNpbXBsaWZ5IHRoZVxuICAgKiB1c2Ugb2YgZGF0YWJhc2UgdHJhbnNhY3Rpb25zIGFuZCBhdXRvbWF0aWNhbGx5IGhhbmRsZSB0cmFuc2FjdGlvbiBuZXN0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2JcbiAgICogQHBhcmFtIGlzb2xhdGlvbkxldmVsXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbCB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyB0byBiZSBydW4gd2l0aC5cbiAgICpcbiAgICogICBUaGUgaXNvbGF0aW9uIGxldmVscyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5JU09MQVRJT05fTEVWRUxgLlxuICAgKiAgICogYFJFQURfVU5DT01NSVRURURgXG4gICAqICAgKiBgUkVBRF9DT01NSVRURURgXG4gICAqICAgKiBgUkVQRUFUQUJMRV9SRUFEYFxuICAgKiAgICogYFNFUklBTElaQUJMRWBcbiAgICogICAqIGBTTkFQU0hPVGBcbiAgICpcbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHRoZSBDb25uZWN0aW9uJ3MgaXNvbGF0aW9uIGxldmVsLlxuICAgKi9cbiAgdHJhbnNhY3Rpb24oY2I6IChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgdHhEb25lPzogPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbkRvbmVDYWxsYmFjaz4oZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIGRvbmU6IFQsIC4uLmFyZ3M6IENhbGxiYWNrUGFyYW1ldGVyczxUPikgPT4gdm9pZCkgPT4gdm9pZCwgaXNvbGF0aW9uTGV2ZWw/OiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMW2tleW9mIHR5cGVvZiBJU09MQVRJT05fTEVWRUxdKSB7XG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGNiYCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VTYXZlcG9pbnQgPSB0aGlzLmluVHJhbnNhY3Rpb247XG4gICAgY29uc3QgbmFtZSA9ICdfdGVkaW91c18nICsgKGNyeXB0by5yYW5kb21CeXRlcygxMCkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBjb25zdCB0eERvbmU6IDxUIGV4dGVuZHMgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2s+KGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCBkb25lOiBULCAuLi5hcmdzOiBDYWxsYmFja1BhcmFtZXRlcnM8VD4pID0+IHZvaWQgPSAoZXJyLCBkb25lLCAuLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGlmICh0aGlzLmluVHJhbnNhY3Rpb24gJiYgdGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5MT0dHRURfSU4pIHtcbiAgICAgICAgICB0aGlzLnJvbGxiYWNrVHJhbnNhY3Rpb24oKHR4RXJyKSA9PiB7XG4gICAgICAgICAgICBkb25lKHR4RXJyIHx8IGVyciwgLi4uYXJncyk7XG4gICAgICAgICAgfSwgbmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9uZShlcnIsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVzZVNhdmVwb2ludCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBkb25lKG51bGwsIC4uLmFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb21taXRUcmFuc2FjdGlvbigodHhFcnIpID0+IHtcbiAgICAgICAgICBkb25lKHR4RXJyLCAuLi5hcmdzKTtcbiAgICAgICAgfSwgbmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICh1c2VTYXZlcG9pbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNhdmVUcmFuc2FjdGlvbigoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmV4ZWNTcWxCYXRjaChuZXcgUmVxdWVzdCgnU0VUIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCAnICsgdGhpcy5nZXRJc29sYXRpb25MZXZlbFRleHQoaXNvbGF0aW9uTGV2ZWwpLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZXJyLCB0eERvbmUpO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2IobnVsbCwgdHhEb25lKTtcbiAgICAgICAgfVxuICAgICAgfSwgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmJlZ2luVHJhbnNhY3Rpb24oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2IobnVsbCwgdHhEb25lKTtcbiAgICAgIH0sIG5hbWUsIGlzb2xhdGlvbkxldmVsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1ha2VSZXF1ZXN0KHJlcXVlc3Q6IFJlcXVlc3QgfCBCdWxrTG9hZCwgcGFja2V0VHlwZTogbnVtYmVyLCBwYXlsb2FkOiAoSXRlcmFibGU8QnVmZmVyPiB8IEFzeW5jSXRlcmFibGU8QnVmZmVyPikgJiB7IHRvU3RyaW5nOiAoaW5kZW50Pzogc3RyaW5nKSA9PiBzdHJpbmcgfSkge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSB0aGlzLlNUQVRFLkxPR0dFRF9JTikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdSZXF1ZXN0cyBjYW4gb25seSBiZSBtYWRlIGluIHRoZSAnICsgdGhpcy5TVEFURS5MT0dHRURfSU4ubmFtZSArICcgc3RhdGUsIG5vdCB0aGUgJyArIHRoaXMuc3RhdGUubmFtZSArICcgc3RhdGUnO1xuICAgICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgICByZXF1ZXN0LmNhbGxiYWNrKFJlcXVlc3RFcnJvcihtZXNzYWdlLCAnRUlOVkFMSURTVEFURScpKTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKFJlcXVlc3RFcnJvcignQ2FuY2VsZWQuJywgJ0VDQU5DRUwnKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhY2tldFR5cGUgPT09IFRZUEUuU1FMX0JBVENIKSB7XG4gICAgICAgIHRoaXMuaXNTcWxCYXRjaCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzU3FsQmF0Y2ggPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgIHJlcXVlc3QuY29ubmVjdGlvbiEgPSB0aGlzO1xuICAgICAgcmVxdWVzdC5yb3dDb3VudCEgPSAwO1xuICAgICAgcmVxdWVzdC5yb3dzISA9IFtdO1xuICAgICAgcmVxdWVzdC5yc3QhID0gW107XG5cbiAgICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBwYXlsb2FkU3RyZWFtLnVucGlwZShtZXNzYWdlKTtcblxuICAgICAgICAvLyBzZXQgdGhlIGlnbm9yZSBiaXQgYW5kIGVuZCB0aGUgbWVzc2FnZS5cbiAgICAgICAgbWVzc2FnZS5pZ25vcmUgPSB0cnVlO1xuICAgICAgICBtZXNzYWdlLmVuZCgpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCAmJiByZXF1ZXN0LnBhdXNlZCkge1xuICAgICAgICAgIC8vIHJlc3VtZSB0aGUgcmVxdWVzdCBpZiBpdCB3YXMgcGF1c2VkIHNvIHdlIGNhbiByZWFkIHRoZSByZW1haW5pbmcgdG9rZW5zXG4gICAgICAgICAgcmVxdWVzdC5yZXN1bWUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmNlKCdjYW5jZWwnLCBvbkNhbmNlbCk7XG5cbiAgICAgIHRoaXMuY3JlYXRlUmVxdWVzdFRpbWVyKCk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7IHR5cGU6IHBhY2tldFR5cGUsIHJlc2V0Q29ubmVjdGlvbjogdGhpcy5yZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0IH0pO1xuICAgICAgdGhpcy5tZXNzYWdlSW8ub3V0Z29pbmdNZXNzYWdlU3RyZWFtLndyaXRlKG1lc3NhZ2UpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0NMSUVOVF9SRVFVRVNUKTtcblxuICAgICAgbWVzc2FnZS5vbmNlKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5vbmNlKCdjYW5jZWwnLCB0aGlzLl9jYW5jZWxBZnRlclJlcXVlc3RTZW50KTtcblxuICAgICAgICB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWJ1Zy5wYXlsb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBwYXlsb2FkIS50b1N0cmluZygnICAnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcGF5bG9hZFN0cmVhbSA9IFJlYWRhYmxlLmZyb20ocGF5bG9hZCk7XG4gICAgICBwYXlsb2FkU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHBheWxvYWRTdHJlYW0udW5waXBlKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIE9ubHkgc2V0IGEgcmVxdWVzdCBlcnJvciBpZiBubyBlcnJvciB3YXMgc2V0IHlldC5cbiAgICAgICAgcmVxdWVzdC5lcnJvciA/Pz0gZXJyb3I7XG5cbiAgICAgICAgcGF5bG9hZFN0cmVhbS51bnBpcGUobWVzc2FnZSk7XG5cbiAgICAgICAgbWVzc2FnZS5pZ25vcmUgPSB0cnVlO1xuICAgICAgICBtZXNzYWdlLmVuZCgpO1xuICAgICAgfSk7XG4gICAgICBwYXlsb2FkU3RyZWFtLnBpcGUobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBjdXJyZW50bHkgZXhlY3V0ZWQgcmVxdWVzdC5cbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcXVlc3QuY2FuY2VsKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIGNvbm5lY3Rpb24gdG8gaXRzIGluaXRpYWwgc3RhdGUuXG4gICAqIENhbiBiZSB1c2VmdWwgZm9yIGNvbm5lY3Rpb24gcG9vbCBpbXBsZW1lbnRhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKi9cbiAgcmVzZXQoY2FsbGJhY2s6IFJlc2V0Q2FsbGJhY2spIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodGhpcy5nZXRJbml0aWFsU3FsKCksIChlcnIpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0ID0gdHJ1ZTtcbiAgICB0aGlzLmV4ZWNTcWxCYXRjaChyZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzW3RoaXMudHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SXNvbGF0aW9uTGV2ZWxUZXh0KGlzb2xhdGlvbkxldmVsOiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMW2tleW9mIHR5cGVvZiBJU09MQVRJT05fTEVWRUxdKSB7XG4gICAgc3dpdGNoIChpc29sYXRpb25MZXZlbCkge1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuUkVBRF9VTkNPTU1JVFRFRDpcbiAgICAgICAgcmV0dXJuICdyZWFkIHVuY29tbWl0dGVkJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlJFUEVBVEFCTEVfUkVBRDpcbiAgICAgICAgcmV0dXJuICdyZXBlYXRhYmxlIHJlYWQnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuU0VSSUFMSVpBQkxFOlxuICAgICAgICByZXR1cm4gJ3NlcmlhbGl6YWJsZSc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5TTkFQU0hPVDpcbiAgICAgICAgcmV0dXJuICdzbmFwc2hvdCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ3JlYWQgY29tbWl0dGVkJztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29ubmVjdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gQ29ubmVjdGlvbjtcblxuQ29ubmVjdGlvbi5wcm90b3R5cGUuU1RBVEUgPSB7XG4gIElOSVRJQUxJWkVEOiB7XG4gICAgbmFtZTogJ0luaXRpYWxpemVkJyxcbiAgICBldmVudHM6IHt9XG4gIH0sXG4gIENPTk5FQ1RJTkc6IHtcbiAgICBuYW1lOiAnQ29ubmVjdGluZycsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5pbml0aWFsaXNlQ29ubmVjdGlvbigpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgc29ja2V0Q29ubmVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2VuZFByZUxvZ2luKCk7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9QUkVMT0dJTik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX1BSRUxPR0lOOiB7XG4gICAgbmFtZTogJ1NlbnRQcmVsb2dpbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5lbXB0eU1lc3NhZ2VCdWZmZXIoKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZS5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRUb01lc3NhZ2VCdWZmZXIoZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lc3NhZ2Uub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZWxvZ2luUGF5bG9hZCA9IG5ldyBQcmVsb2dpblBheWxvYWQodGhpcy5tZXNzYWdlQnVmZmVyKTtcbiAgICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJlbG9naW5QYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHByZWxvZ2luUGF5bG9hZC5mZWRBdXRoUmVxdWlyZWQgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZmVkQXV0aFJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJlbG9naW5QYXlsb2FkLmVuY3J5cHRpb25TdHJpbmcgPT09ICdPTicgfHwgcHJlbG9naW5QYXlsb2FkLmVuY3J5cHRpb25TdHJpbmcgPT09ICdSRVEnKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLm9wdGlvbnMuZW5jcnlwdCkge1xuICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBDb25uZWN0aW9uRXJyb3IoXCJTZXJ2ZXIgcmVxdWlyZXMgZW5jcnlwdGlvbiwgc2V0ICdlbmNyeXB0JyBjb25maWcgb3B0aW9uIHRvIHRydWUuXCIsICdFRU5DUllQVCcpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW8uc3RhcnRUbHModGhpcy5zZWN1cmVDb250ZXh0LCB0aGlzLnJvdXRpbmdEYXRhPy5zZXJ2ZXIgPz8gdGhpcy5jb25maWcuc2VydmVyLCB0aGlzLmNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX1RMU1NTTE5FR09USUFUSU9OKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZW5kTG9naW43UGFja2V0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgYXV0aGVudGljYXRpb24gfSA9IHRoaXMuY29uZmlnO1xuICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdudGxtJykge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfTlRMTSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBSRVJPVVRJTkc6IHtcbiAgICBuYW1lOiAnUmVSb3V0aW5nJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmNsZWFudXBDb25uZWN0aW9uKENMRUFOVVBfVFlQRS5SRURJUkVDVCk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgfSxcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICByZWNvbm5lY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkNPTk5FQ1RJTkcpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlk6IHtcbiAgICBuYW1lOiAnVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlknLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuY3VyVHJhbnNpZW50UmV0cnlDb3VudCsrO1xuICAgICAgdGhpcy5jbGVhbnVwQ29ubmVjdGlvbihDTEVBTlVQX1RZUEUuUkVUUlkpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgIH0sXG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgcmV0cnk6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZVJldHJ5VGltZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFNFTlRfVExTU1NMTkVHT1RJQVRJT046IHtcbiAgICBuYW1lOiAnU2VudFRMU1NTTE5lZ290aWF0aW9uJyxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2Uub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUlvLnRsc0hhbmRzaGFrZURhdGEoZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lc3NhZ2Uub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VJby50bHNOZWdvdGlhdGlvbkNvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRMb2dpbjdQYWNrZXQoKTtcblxuICAgICAgICAgICAgY29uc3QgeyBhdXRoZW50aWNhdGlvbiB9ID0gdGhpcy5jb25maWc7XG5cbiAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcpIHtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0xPR0lON19XSVRIX0ZFREFVVEgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhdXRoZW50aWNhdGlvbi50eXBlID09PSAnbnRsbScpIHtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0xPR0lON19XSVRIX05UTE0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9MT0dJTjdfV0lUSF9TVEFOREFSRF9MT0dJTjoge1xuICAgIG5hbWU6ICdTZW50TG9naW43V2l0aFN0YW5kYXJkTG9naW4nLFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGZlYXR1cmVFeHRBY2s6IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IHsgYXV0aGVudGljYXRpb24gfSA9IHRoaXMuY29uZmlnO1xuICAgICAgICBpZiAoYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcpIHtcbiAgICAgICAgICBpZiAodG9rZW4uZmVkQXV0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3IgPSBDb25uZWN0aW9uRXJyb3IoJ0RpZCBub3QgcmVjZWl2ZSBBY3RpdmUgRGlyZWN0b3J5IGF1dGhlbnRpY2F0aW9uIGFja25vd2xlZGdlbWVudCcpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZWRJbiA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9naW5FcnJvciA9IENvbm5lY3Rpb25FcnJvcihgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiBhY2tub3dsZWRnbWVudCBmb3IgJHthdXRoZW50aWNhdGlvbi50eXBlfSBhdXRoZW50aWNhdGlvbiBtZXRob2QgaW5jbHVkZXMgZXh0cmEgZGF0YWApO1xuICAgICAgICAgICAgdGhpcy5sb2dnZWRJbiA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5mZWRBdXRoID09PSB1bmRlZmluZWQgJiYgdG9rZW4udXRmOFN1cHBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9naW5FcnJvciA9IENvbm5lY3Rpb25FcnJvcignUmVjZWl2ZWQgYWNrbm93bGVkZ2VtZW50IGZvciB1bmtub3duIGZlYXR1cmUnKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlZEluID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aCkge1xuICAgICAgICAgIHRoaXMubG9naW5FcnJvciA9IENvbm5lY3Rpb25FcnJvcignRGlkIG5vdCByZXF1ZXN0IEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24sIGJ1dCByZWNlaXZlZCB0aGUgYWNrbm93bGVkZ21lbnQnKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlZEluID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlKTtcblxuICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VkSW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdXRpbmdEYXRhKSB7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuUkVST1VUSU5HKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpbkVycm9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dpbkVycm9yLmlzVHJhbnNpZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuZGVidWcubG9nKCdJbml0aWF0aW5nIHJldHJ5IG9uIHRyYW5zaWVudCBlcnJvcicpO1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIHRoaXMubG9naW5FcnJvcik7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBDb25uZWN0aW9uRXJyb3IoJ0xvZ2luIGZhaWxlZC4nLCAnRUxPR0lOJykpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFNFTlRfTE9HSU43X1dJVEhfTlRMTToge1xuICAgIG5hbWU6ICdTZW50TG9naW43V2l0aE5UTE1Mb2dpbicsXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSk7XG5cbiAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm50bG1wYWNrZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uID0gdGhpcy5jb25maWcuYXV0aGVudGljYXRpb24gYXMgTnRsbUF1dGhlbnRpY2F0aW9uO1xuXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gbmV3IE5UTE1SZXNwb25zZVBheWxvYWQoe1xuICAgICAgICAgICAgICBkb21haW46IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuZG9tYWluLFxuICAgICAgICAgICAgICB1c2VyTmFtZTogYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgICAgcGFzc3dvcmQ6IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmQsXG4gICAgICAgICAgICAgIG50bG1wYWNrZXQ6IHRoaXMubnRsbXBhY2tldFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuTlRMTUFVVEhfUEtULCBwYXlsb2FkLmRhdGEpO1xuICAgICAgICAgICAgdGhpcy5kZWJ1Zy5wYXlsb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50b1N0cmluZygnICAnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLm50bG1wYWNrZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2dlZEluKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3V0aW5nRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlJFUk9VVElORyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9naW5FcnJvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9naW5FcnJvci5pc1RyYW5zaWVudCkge1xuICAgICAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnSW5pdGlhdGluZyByZXRyeSBvbiB0cmFuc2llbnQgZXJyb3InKTtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5UUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgQ29ubmVjdGlvbkVycm9yKCdMb2dpbiBmYWlsZWQuJywgJ0VMT0dJTicpKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX0ZFREFVVEg6IHtcbiAgICBuYW1lOiAnU2VudExvZ2luN1dpdGhmZWRhdXRoJyxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBmZWRBdXRoSW5mbzogZnVuY3Rpb24odG9rZW4pIHtcbiAgICAgICAgdGhpcy5mZWRBdXRoSW5mb1Rva2VuID0gdG9rZW47XG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSk7XG5cbiAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmxvZ2dlZEluKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3V0aW5nRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlJFUk9VVElORyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZlZEF1dGhJbmZvVG9rZW4gPSB0aGlzLmZlZEF1dGhJbmZvVG9rZW47XG5cbiAgICAgICAgICBpZiAoZmVkQXV0aEluZm9Ub2tlbiAmJiBmZWRBdXRoSW5mb1Rva2VuLnN0c3VybCAmJiBmZWRBdXRoSW5mb1Rva2VuLnNwbikge1xuICAgICAgICAgICAgY29uc3QgYXV0aGVudGljYXRpb24gPSB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvbiBhcyBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldDtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuU2NvcGUgPSBuZXcgVVJMKCcvLmRlZmF1bHQnLCBmZWRBdXRoSW5mb1Rva2VuLnNwbikudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgY29uc3QgZ2V0VG9rZW4gPSAoY2FsbGJhY2s6IChlcnJvcjogRXJyb3IgfCBudWxsLCB0b2tlbj86IHN0cmluZykgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBnZXRUb2tlbkZyb21DcmVkZW50aWFscyA9IChjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFsKSA9PiB7XG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHMuZ2V0VG9rZW4odG9rZW5TY29wZSkudGhlbigodG9rZW5SZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdG9rZW5SZXNwb25zZT8udG9rZW4pO1xuICAgICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWwoXG4gICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmRvbWFpbiA/PyAnY29tbW9uJywgIC8vIHRlbmFudElkXG4gICAgICAgICAgICAgICAgICAnN2Y5OGNiMDQtY2QxZS00MGRmLTkxNDAtM2JmN2UyY2VhNGRiJywgICAgIC8vIGNsaWVudElkXG4gICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBnZXRUb2tlbkZyb21DcmVkZW50aWFscyhjcmVkZW50aWFscyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNpQXJncyA9IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQgPyBbIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQsIHt9IF0gOiBbIHt9IF07XG4gICAgICAgICAgICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBuZXcgTWFuYWdlZElkZW50aXR5Q3JlZGVudGlhbCguLi5tc2lBcmdzKTtcblxuICAgICAgICAgICAgICAgIGdldFRva2VuRnJvbUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBuZXcgQ2xpZW50U2VjcmV0Q3JlZGVudGlhbChcbiAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudGVuYW50SWQsXG4gICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRTZWNyZXRcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZ2V0VG9rZW5Gcm9tQ3JlZGVudGlhbHMoY3JlZGVudGlhbHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBnZXRUb2tlbigoZXJyLCB0b2tlbikgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yID0gQ29ubmVjdGlvbkVycm9yKCdTZWN1cml0eSB0b2tlbiBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCBvciBhdXRob3JpemVkLicsICdFRkVEQVVUSCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIHRoaXMubG9naW5FcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5zZW5kRmVkQXV0aFRva2VuTWVzc2FnZSh0b2tlbiEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luRXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ2luRXJyb3IuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5sb2coJ0luaXRpYXRpbmcgcmV0cnkgb24gdHJhbnNpZW50IGVycm9yJyk7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgdGhpcy5sb2dpbkVycm9yKTtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIENvbm5lY3Rpb25FcnJvcignTG9naW4gZmFpbGVkLicsICdFTE9HSU4nKSk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUw6IHtcbiAgICBuYW1lOiAnTG9nZ2VkSW5TZW5kaW5nSW5pdGlhbFNxbCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5zZW5kSW5pdGlhbFNxbCgpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24gc29ja2V0RXJyb3IoKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSk7XG5cbiAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOKTtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZEluaXRpYWxTcWwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBMT0dHRURfSU46IHtcbiAgICBuYW1lOiAnTG9nZ2VkSW4nLFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFNFTlRfQ0xJRU5UX1JFUVVFU1Q6IHtcbiAgICBuYW1lOiAnU2VudENsaWVudFJlcXVlc3QnLFxuICAgIGV4aXQ6IGZ1bmN0aW9uKG5leHRTdGF0ZSkge1xuICAgICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIGNvbnN0IHNxbFJlcXVlc3QgPSB0aGlzLnJlcXVlc3QhO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuXG4gICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soZXJyKTtcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIC8vIHJlcXVlc3QgdGltZXIgaXMgc3RvcHBlZCBvbiBmaXJzdCBkYXRhIHBhY2thZ2VcbiAgICAgICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlKTtcblxuICAgICAgICBjb25zdCBvblJlc3VtZSA9ICgpID0+IHsgdG9rZW5TdHJlYW1QYXJzZXIucmVzdW1lKCk7IH07XG4gICAgICAgIGNvbnN0IG9uUGF1c2UgPSAoKSA9PiB7XG4gICAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIucGF1c2UoKTtcblxuICAgICAgICAgIHRoaXMucmVxdWVzdD8ub25jZSgncmVzdW1lJywgb25SZXN1bWUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucmVxdWVzdD8ub24oJ3BhdXNlJywgb25QYXVzZSk7XG5cbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QgJiYgdGhpcy5yZXF1ZXN0LnBhdXNlZCkge1xuICAgICAgICAgIG9uUGF1c2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgIHRva2VuU3RyZWFtUGFyc2VyLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbkVuZE9mTWVzc2FnZSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5yZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCAmJiB0aGlzLnJlcXVlc3QucGF1c2VkKSB7XG4gICAgICAgICAgICAvLyByZXN1bWUgdGhlIHJlcXVlc3QgaWYgaXQgd2FzIHBhdXNlZCBzbyB3ZSBjYW4gcmVhZCB0aGUgcmVtYWluaW5nIHRva2Vuc1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LnJlc3VtZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3BhdXNlJywgb25QYXVzZSk7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcigncmVzdW1lJywgb25SZXN1bWUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9uRW5kT2ZNZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdwYXVzZScsIG9uUGF1c2UpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3Jlc3VtZScsIG9uUmVzdW1lKTtcblxuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOKTtcbiAgICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0IGFzIFJlcXVlc3Q7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJyAmJiBzcWxSZXF1ZXN0LmVycm9yICYmIHRoaXMuaXNTcWxCYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soc3FsUmVxdWVzdC5lcnJvciwgc3FsUmVxdWVzdC5yb3dDb3VudCwgc3FsUmVxdWVzdC5yb3dzKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5vbmNlKCdlbmQnLCBvbkVuZE9mTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucmVxdWVzdD8ub25jZSgnY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9BVFRFTlRJT046IHtcbiAgICBuYW1lOiAnU2VudEF0dGVudGlvbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5hdHRlbnRpb25SZWNlaXZlZCA9IGZhbHNlO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIGNvbnN0IHNxbFJlcXVlc3QgPSB0aGlzLnJlcXVlc3QhO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG5cbiAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhlcnIpO1xuICAgICAgfSxcbiAgICAgIGF0dGVudGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYXR0ZW50aW9uUmVjZWl2ZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgdG9rZW5TdHJlYW1QYXJzZXIgPSB0aGlzLmNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2UpO1xuXG4gICAgICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAvLyAzLjIuNS43IFNlbnQgQXR0ZW50aW9uIFN0YXRlXG4gICAgICAgICAgLy8gRGlzY2FyZCBhbnkgZGF0YSBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLCB1bnRpbCB3ZSByZWNlaXZlIHRoZSBhdHRlbnRpb24gcmVzcG9uc2VcbiAgICAgICAgICBpZiAodGhpcy5hdHRlbnRpb25SZWNlaXZlZCkge1xuICAgICAgICAgICAgdGhpcy5hdHRlbnRpb25SZWNlaXZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2FuY2VsVGltZXIoKTtcblxuICAgICAgICAgICAgY29uc3Qgc3FsUmVxdWVzdCA9IHRoaXMucmVxdWVzdCE7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTik7XG5cbiAgICAgICAgICAgIGlmIChzcWxSZXF1ZXN0LmVycm9yICYmIHNxbFJlcXVlc3QuZXJyb3IgaW5zdGFuY2VvZiBSZXF1ZXN0RXJyb3IgJiYgc3FsUmVxdWVzdC5lcnJvci5jb2RlID09PSAnRVRJTUVPVVQnKSB7XG4gICAgICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soc3FsUmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzcWxSZXF1ZXN0LmNhbGxiYWNrKFJlcXVlc3RFcnJvcignQ2FuY2VsZWQuJywgJ0VDQU5DRUwnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIEZJTkFMOiB7XG4gICAgbmFtZTogJ0ZpbmFsJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmNsZWFudXBDb25uZWN0aW9uKENMRUFOVVBfVFlQRS5OT1JNQUwpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBsb2dpbkZhaWxlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcuIFRoZSBjb25uZWN0aW9uIHdhcyBwcm9iYWJseSBjbG9zZWQgYnkgdGhlIGNsaWVudCBjb2RlLlxuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZywgYXMgdGhlIHRpbWVyIHNob3VsZCBiZSBjbGVhbmVkIHVwLlxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgICB9LFxuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuIl19
|
|
2879
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbInRydXN0U2VydmVyV2FybmluZ0VtaXR0ZWQiLCJlbWl0VHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZVdhcm5pbmciLCJwcm9jZXNzIiwiZW1pdFdhcm5pbmciLCJLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkiLCJERUZBVUxUX0NPTk5FQ1RfVElNRU9VVCIsIkRFRkFVTFRfQ0xJRU5UX1JFUVVFU1RfVElNRU9VVCIsIkRFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQiLCJERUZBVUxUX0NPTk5FQ1RfUkVUUllfSU5URVJWQUwiLCJERUZBVUxUX1BBQ0tFVF9TSVpFIiwiREVGQVVMVF9URVhUU0laRSIsIkRFRkFVTFRfREFURUZJUlNUIiwiREVGQVVMVF9QT1JUIiwiREVGQVVMVF9URFNfVkVSU0lPTiIsIkRFRkFVTFRfTEFOR1VBR0UiLCJERUZBVUxUX0RBVEVGT1JNQVQiLCJDTEVBTlVQX1RZUEUiLCJOT1JNQUwiLCJSRURJUkVDVCIsIlJFVFJZIiwiQ29ubmVjdGlvbiIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwiZmVkQXV0aFJlcXVpcmVkIiwic2VjdXJlQ29udGV4dCIsImluVHJhbnNhY3Rpb24iLCJ0cmFuc2FjdGlvbkRlc2NyaXB0b3JzIiwidHJhbnNhY3Rpb25EZXB0aCIsImlzU3FsQmF0Y2giLCJjdXJUcmFuc2llbnRSZXRyeUNvdW50IiwidHJhbnNpZW50RXJyb3JMb29rdXAiLCJjbG9zZWQiLCJsb2dpbkVycm9yIiwiZGVidWciLCJudGxtcGFja2V0IiwibnRsbXBhY2tldEJ1ZmZlciIsInJvdXRpbmdEYXRhIiwibWVzc2FnZUlvIiwic3RhdGUiLCJyZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0IiwicmVxdWVzdCIsInByb2NSZXR1cm5TdGF0dXNWYWx1ZSIsInNvY2tldCIsIm1lc3NhZ2VCdWZmZXIiLCJjb25uZWN0VGltZXIiLCJjYW5jZWxUaW1lciIsInJlcXVlc3RUaW1lciIsInJldHJ5VGltZXIiLCJfY2FuY2VsQWZ0ZXJSZXF1ZXN0U2VudCIsImRhdGFiYXNlQ29sbGF0aW9uIiwiVHlwZUVycm9yIiwic2VydmVyIiwiYXV0aGVudGljYXRpb24iLCJ1bmRlZmluZWQiLCJ0eXBlIiwib3B0aW9ucyIsImRvbWFpbiIsInVzZXJOYW1lIiwicGFzc3dvcmQiLCJ0b1VwcGVyQ2FzZSIsInRva2VuIiwiY2xpZW50SWQiLCJjbGllbnRTZWNyZXQiLCJ0ZW5hbnRJZCIsImFib3J0VHJhbnNhY3Rpb25PbkVycm9yIiwiYXBwTmFtZSIsImNhbWVsQ2FzZUNvbHVtbnMiLCJjYW5jZWxUaW1lb3V0IiwiY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMIiwiY29sdW1uRW5jcnlwdGlvblNldHRpbmciLCJjb2x1bW5OYW1lUmVwbGFjZXIiLCJjb25uZWN0aW9uUmV0cnlJbnRlcnZhbCIsImNvbm5lY3RUaW1lb3V0IiwiY29ubmVjdGlvbklzb2xhdGlvbkxldmVsIiwiSVNPTEFUSU9OX0xFVkVMIiwiUkVBRF9DT01NSVRURUQiLCJjcnlwdG9DcmVkZW50aWFsc0RldGFpbHMiLCJkYXRhYmFzZSIsImRhdGVmaXJzdCIsImRhdGVGb3JtYXQiLCJkYXRhIiwicGFja2V0IiwicGF5bG9hZCIsImVuYWJsZUFuc2lOdWxsIiwiZW5hYmxlQW5zaU51bGxEZWZhdWx0IiwiZW5hYmxlQW5zaVBhZGRpbmciLCJlbmFibGVBbnNpV2FybmluZ3MiLCJlbmFibGVBcml0aEFib3J0IiwiZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwiLCJlbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0IiwiZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMiLCJlbmFibGVOdW1lcmljUm91bmRhYm9ydCIsImVuYWJsZVF1b3RlZElkZW50aWZpZXIiLCJlbmNyeXB0IiwiZmFsbGJhY2tUb0RlZmF1bHREYiIsImVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVycyIsImluc3RhbmNlTmFtZSIsImlzb2xhdGlvbkxldmVsIiwibGFuZ3VhZ2UiLCJsb2NhbEFkZHJlc3MiLCJtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMiLCJtdWx0aVN1Ym5ldEZhaWxvdmVyIiwicGFja2V0U2l6ZSIsInBvcnQiLCJyZWFkT25seUludGVudCIsInJlcXVlc3RUaW1lb3V0Iiwicm93Q29sbGVjdGlvbk9uRG9uZSIsInJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uIiwic2VydmVyTmFtZSIsInNlcnZlclN1cHBvcnRzQ29sdW1uRW5jcnlwdGlvbiIsInRkc1ZlcnNpb24iLCJ0ZXh0c2l6ZSIsInRydXN0ZWRTZXJ2ZXJOYW1lQUUiLCJ0cnVzdFNlcnZlckNlcnRpZmljYXRlIiwidXNlQ29sdW1uTmFtZXMiLCJ1c2VVVEMiLCJ3b3Jrc3RhdGlvbklkIiwibG93ZXJDYXNlR3VpZHMiLCJFcnJvciIsIlJhbmdlRXJyb3IiLCJjcmVkZW50aWFsc0RldGFpbHMiLCJzZWN1cmVPcHRpb25zIiwiT2JqZWN0IiwiY3JlYXRlIiwidmFsdWUiLCJjb25zdGFudHMiLCJTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIiwiY3JlYXRlRGVidWciLCJCdWZmZXIiLCJmcm9tIiwiYWxsb2MiLCJUcmFuc2llbnRFcnJvckxvb2t1cCIsIlNUQVRFIiwiSU5JVElBTElaRUQiLCJzZW5kTWVzc2FnZSIsIlRZUEUiLCJBVFRFTlRJT04iLCJjcmVhdGVDYW5jZWxUaW1lciIsImNvbm5lY3QiLCJjb25uZWN0TGlzdGVuZXIiLCJDb25uZWN0aW9uRXJyb3IiLCJuYW1lIiwib25Db25uZWN0IiwiZXJyIiwicmVtb3ZlTGlzdGVuZXIiLCJvbkVycm9yIiwib25jZSIsInRyYW5zaXRpb25UbyIsIkNPTk5FQ1RJTkciLCJvbiIsImV2ZW50IiwibGlzdGVuZXIiLCJlbWl0IiwiYXJncyIsImNsb3NlIiwiRklOQUwiLCJpbml0aWFsaXNlQ29ubmVjdGlvbiIsInNpZ25hbCIsImNyZWF0ZUNvbm5lY3RUaW1lciIsImNvbm5lY3RPblBvcnQiLCJJbnN0YW5jZUxvb2t1cCIsImluc3RhbmNlTG9va3VwIiwidGltZW91dCIsIm1lc3NhZ2UiLCJjbGVhbnVwQ29ubmVjdGlvbiIsImNsZWFudXBUeXBlIiwiY2xlYXJDb25uZWN0VGltZXIiLCJjbGVhclJlcXVlc3RUaW1lciIsImNsZWFyUmV0cnlUaW1lciIsImNsb3NlQ29ubmVjdGlvbiIsIm5leHRUaWNrIiwiUmVxdWVzdEVycm9yIiwiY2FsbGJhY2siLCJEZWJ1ZyIsImNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyIiwiaGFuZGxlciIsIlRva2VuU3RyZWFtUGFyc2VyIiwiY29ubmVjdE9wdHMiLCJob3N0IiwiQ29ubmVjdG9yIiwiZXhlY3V0ZSIsInNvY2tldEVycm9yIiwiZXJyb3IiLCJzb2NrZXRDbG9zZSIsInNvY2tldEVuZCIsInNldEtlZXBBbGl2ZSIsIk1lc3NhZ2VJTyIsImNsZWFydGV4dCIsImxvZyIsInNlbmRQcmVMb2dpbiIsIlNFTlRfUFJFTE9HSU4iLCJkZXN0cm95IiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsInNldFRpbWVvdXQiLCJhYm9ydCIsImNsZWFyQ2FuY2VsVGltZXIiLCJjcmVhdGVSZXF1ZXN0VGltZXIiLCJjcmVhdGVSZXRyeVRpbWVyIiwicmV0cnlUaW1lb3V0IiwiZGlzcGF0Y2hFdmVudCIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsIm5ld1N0YXRlIiwiZXhpdCIsImNhbGwiLCJlbnRlciIsImFwcGx5IiwiZ2V0RXZlbnRIYW5kbGVyIiwiZXZlbnROYW1lIiwiZXZlbnRzIiwiU0VOVF9UTFNTU0xORUdPVElBVElPTiIsImNvZGUiLCJSRVJPVVRJTkciLCJUUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSIsIm1ham9yIiwibWlub3IiLCJidWlsZCIsImV4ZWMiLCJ2ZXJzaW9uIiwiUHJlbG9naW5QYXlsb2FkIiwiTnVtYmVyIiwic3ViYnVpbGQiLCJQUkVMT0dJTiIsInRvU3RyaW5nIiwiZW1wdHlNZXNzYWdlQnVmZmVyIiwiYWRkVG9NZXNzYWdlQnVmZmVyIiwiY29uY2F0Iiwic2VuZExvZ2luN1BhY2tldCIsIkxvZ2luN1BheWxvYWQiLCJ2ZXJzaW9ucyIsImNsaWVudFByb2dWZXIiLCJjbGllbnRQaWQiLCJwaWQiLCJjb25uZWN0aW9uSWQiLCJjbGllbnRUaW1lWm9uZSIsIkRhdGUiLCJnZXRUaW1lem9uZU9mZnNldCIsImNsaWVudExjaWQiLCJmZWRBdXRoIiwiZWNobyIsIndvcmtmbG93IiwiZmVkQXV0aFRva2VuIiwic3NwaSIsImhvc3RuYW1lIiwib3MiLCJsaWJyYXJ5TmFtZSIsImluaXREYkZhdGFsIiwiTE9HSU43IiwidG9CdWZmZXIiLCJzZW5kRmVkQXV0aFRva2VuTWVzc2FnZSIsImFjY2Vzc1Rva2VuTGVuIiwiYnl0ZUxlbmd0aCIsIm9mZnNldCIsIndyaXRlVUludDMyTEUiLCJ3cml0ZSIsIkZFREFVVEhfVE9LRU4iLCJTRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOIiwic2VuZEluaXRpYWxTcWwiLCJTcWxCYXRjaFBheWxvYWQiLCJnZXRJbml0aWFsU3FsIiwiY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvciIsIk1lc3NhZ2UiLCJTUUxfQkFUQ0giLCJvdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJSZWFkYWJsZSIsInBpcGUiLCJwdXNoIiwiZ2V0SXNvbGF0aW9uTGV2ZWxUZXh0Iiwiam9pbiIsInByb2Nlc3NlZEluaXRpYWxTcWwiLCJleGVjU3FsQmF0Y2giLCJtYWtlUmVxdWVzdCIsInNxbFRleHRPclByb2NlZHVyZSIsImV4ZWNTcWwiLCJ2YWxpZGF0ZVBhcmFtZXRlcnMiLCJwYXJhbWV0ZXJzIiwiVFlQRVMiLCJOVmFyQ2hhciIsIm91dHB1dCIsImxlbmd0aCIsInByZWNpc2lvbiIsInNjYWxlIiwibWFrZVBhcmFtc1BhcmFtZXRlciIsIlJQQ19SRVFVRVNUIiwiUnBjUmVxdWVzdFBheWxvYWQiLCJuZXdCdWxrTG9hZCIsInRhYmxlIiwiY2FsbGJhY2tPck9wdGlvbnMiLCJCdWxrTG9hZCIsImV4ZWNCdWxrTG9hZCIsImJ1bGtMb2FkIiwicm93cyIsImV4ZWN1dGlvblN0YXJ0ZWQiLCJzdHJlYW1pbmdNb2RlIiwiZmlyc3RSb3dXcml0dGVuIiwicm93U3RyZWFtIiwicm93VG9QYWNrZXRUcmFuc2Zvcm0iLCJlbmQiLCJvbkNhbmNlbCIsIkJ1bGtMb2FkUGF5bG9hZCIsIlJlcXVlc3QiLCJnZXRCdWxrSW5zZXJ0U3FsIiwiQlVMS19MT0FEIiwicHJlcGFyZSIsIkludCIsInByZXBhcmluZyIsImhhbmRsZSIsInVucHJlcGFyZSIsImV4ZWN1dGVQYXJhbWV0ZXJzIiwiaSIsImxlbiIsInBhcmFtZXRlciIsInZhbGlkYXRlIiwiY2FsbFByb2NlZHVyZSIsImJlZ2luVHJhbnNhY3Rpb24iLCJ0cmFuc2FjdGlvbiIsIlRyYW5zYWN0aW9uIiwiaXNvbGF0aW9uTGV2ZWxUb1RTUUwiLCJUUkFOU0FDVElPTl9NQU5BR0VSIiwiYmVnaW5QYXlsb2FkIiwiY29tbWl0VHJhbnNhY3Rpb24iLCJjb21taXRQYXlsb2FkIiwicm9sbGJhY2tUcmFuc2FjdGlvbiIsInJvbGxiYWNrUGF5bG9hZCIsInNhdmVUcmFuc2FjdGlvbiIsInNhdmVQYXlsb2FkIiwiY2IiLCJ1c2VTYXZlcG9pbnQiLCJjcnlwdG8iLCJyYW5kb21CeXRlcyIsInR4RG9uZSIsImRvbmUiLCJMT0dHRURfSU4iLCJ0eEVyciIsInBhY2tldFR5cGUiLCJjYW5jZWxlZCIsImNvbm5lY3Rpb24iLCJyb3dDb3VudCIsInJzdCIsInBheWxvYWRTdHJlYW0iLCJ1bnBpcGUiLCJpZ25vcmUiLCJwYXVzZWQiLCJyZXN1bWUiLCJyZXNldENvbm5lY3Rpb24iLCJTRU5UX0NMSUVOVF9SRVFVRVNUIiwicmVzZXQiLCJSRUFEX1VOQ09NTUlUVEVEIiwiUkVQRUFUQUJMRV9SRUFEIiwiU0VSSUFMSVpBQkxFIiwiU05BUFNIT1QiLCJtb2R1bGUiLCJleHBvcnRzIiwicHJvdG90eXBlIiwicmVhZE1lc3NhZ2UiLCJ0aGVuIiwicHJlbG9naW5QYXlsb2FkIiwiZW5jcnlwdGlvblN0cmluZyIsInN0YXJ0VGxzIiwiU0VOVF9MT0dJTjdfV0lUSF9OVExNIiwicmVjb25uZWN0IiwicmV0cnkiLCJ0bHNIYW5kc2hha2VEYXRhIiwidGxzTmVnb3RpYXRpb25Db21wbGV0ZSIsIlNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSCIsIkxvZ2luN1Rva2VuSGFuZGxlciIsInRva2VuU3RyZWFtUGFyc2VyIiwibG9naW5BY2tSZWNlaXZlZCIsIkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMIiwiaXNUcmFuc2llbnQiLCJOVExNUmVzcG9uc2VQYXlsb2FkIiwiTlRMTUFVVEhfUEtUIiwiZmVkQXV0aEluZm9Ub2tlbiIsInN0c3VybCIsInNwbiIsInRva2VuU2NvcGUiLCJVUkwiLCJnZXRUb2tlbiIsImdldFRva2VuRnJvbUNyZWRlbnRpYWxzIiwiY3JlZGVudGlhbHMiLCJ0b2tlblJlc3BvbnNlIiwiVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWwiLCJtc2lBcmdzIiwiTWFuYWdlZElkZW50aXR5Q3JlZGVudGlhbCIsIkNsaWVudFNlY3JldENyZWRlbnRpYWwiLCJJbml0aWFsU3FsVG9rZW5IYW5kbGVyIiwibmV4dFN0YXRlIiwic3FsUmVxdWVzdCIsIlJlcXVlc3RUb2tlbkhhbmRsZXIiLCJTRU5UX0FUVEVOVElPTiIsIm9uUmVzdW1lIiwib25QYXVzZSIsInBhdXNlIiwib25FbmRPZk1lc3NhZ2UiLCJBdHRlbnRpb25Ub2tlbkhhbmRsZXIiLCJhdHRlbnRpb25SZWNlaXZlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOztBQUVBOztBQUVBOztBQU9BOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUdBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOzs7O0FBRUEsSUFBSUEseUJBQXlCLEdBQUcsS0FBaEM7O0FBRUEsTUFB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Q0FBN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnbmV0JztcblxuaW1wb3J0IGNvbnN0YW50cyBmcm9tICdjb25zdGFudHMnO1xuaW1wb3J0IHsgY3JlYXRlU2VjdXJlQ29udGV4dCwgU2VjdXJlQ29udGV4dCwgU2VjdXJlQ29udGV4dE9wdGlvbnMgfSBmcm9tICd0bHMnO1xuXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5cbmltcG9ydCB7XG4gIENsaWVudFNlY3JldENyZWRlbnRpYWwsXG4gIE1hbmFnZWRJZGVudGl0eUNyZWRlbnRpYWwsXG4gIFRva2VuQ3JlZGVudGlhbCxcbiAgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWwsXG59IGZyb20gJ0BhenVyZS9pZGVudGl0eSc7XG5cbmltcG9ydCBCdWxrTG9hZCwgeyBPcHRpb25zIGFzIEJ1bGtMb2FkT3B0aW9ucywgQ2FsbGJhY2sgYXMgQnVsa0xvYWRDYWxsYmFjayB9IGZyb20gJy4vYnVsay1sb2FkJztcbmltcG9ydCBEZWJ1ZyBmcm9tICcuL2RlYnVnJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBJbnN0YW5jZUxvb2t1cCB9IGZyb20gJy4vaW5zdGFuY2UtbG9va3VwJztcbmltcG9ydCB7IFRyYW5zaWVudEVycm9yTG9va3VwIH0gZnJvbSAnLi90cmFuc2llbnQtZXJyb3ItbG9va3VwJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuL3BhY2tldCc7XG5pbXBvcnQgUHJlbG9naW5QYXlsb2FkIGZyb20gJy4vcHJlbG9naW4tcGF5bG9hZCc7XG5pbXBvcnQgTG9naW43UGF5bG9hZCBmcm9tICcuL2xvZ2luNy1wYXlsb2FkJztcbmltcG9ydCBOVExNUmVzcG9uc2VQYXlsb2FkIGZyb20gJy4vbnRsbS1wYXlsb2FkJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgUnBjUmVxdWVzdFBheWxvYWQgZnJvbSAnLi9ycGNyZXF1ZXN0LXBheWxvYWQnO1xuaW1wb3J0IFNxbEJhdGNoUGF5bG9hZCBmcm9tICcuL3NxbGJhdGNoLXBheWxvYWQnO1xuaW1wb3J0IE1lc3NhZ2VJTyBmcm9tICcuL21lc3NhZ2UtaW8nO1xuaW1wb3J0IHsgUGFyc2VyIGFzIFRva2VuU3RyZWFtUGFyc2VyIH0gZnJvbSAnLi90b2tlbi90b2tlbi1zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBJU09MQVRJT05fTEVWRUwsIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgQ29ubmVjdG9yIH0gZnJvbSAnLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgbmFtZSBhcyBsaWJyYXJ5TmFtZSB9IGZyb20gJy4vbGlicmFyeSc7XG5pbXBvcnQgeyB2ZXJzaW9ucyB9IGZyb20gJy4vdGRzLXZlcnNpb25zJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vbWVzc2FnZSc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4vbWV0YWRhdGEtcGFyc2VyJztcbmltcG9ydCB7IGNyZWF0ZU5UTE1SZXF1ZXN0IH0gZnJvbSAnLi9udGxtJztcbmltcG9ydCB7IENvbHVtbkVuY3J5cHRpb25BenVyZUtleVZhdWx0UHJvdmlkZXIgfSBmcm9tICcuL2Fsd2F5cy1lbmNyeXB0ZWQva2V5c3RvcmUtcHJvdmlkZXItYXp1cmUta2V5LXZhdWx0JztcblxuaW1wb3J0IHsgQWJvcnRDb250cm9sbGVyLCBBYm9ydFNpZ25hbCB9IGZyb20gJ25vZGUtYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQgeyBQYXJhbWV0ZXIsIFRZUEVTIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgQnVsa0xvYWRQYXlsb2FkIH0gZnJvbSAnLi9idWxrLWxvYWQtcGF5bG9hZCc7XG5pbXBvcnQgeyBDb2xsYXRpb24gfSBmcm9tICcuL2NvbGxhdGlvbic7XG5cbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IEF0dGVudGlvblRva2VuSGFuZGxlciwgSW5pdGlhbFNxbFRva2VuSGFuZGxlciwgTG9naW43VG9rZW5IYW5kbGVyLCBSZXF1ZXN0VG9rZW5IYW5kbGVyLCBUb2tlbkhhbmRsZXIgfSBmcm9tICcuL3Rva2VuL2hhbmRsZXInO1xuXG5sZXQgdHJ1c3RTZXJ2ZXJXYXJuaW5nRW1pdHRlZCA9IGZhbHNlO1xuXG5jb25zdCBlbWl0VHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZVdhcm5pbmcgPSAoKSA9PiB7XG4gIGlmICghdHJ1c3RTZXJ2ZXJXYXJuaW5nRW1pdHRlZCkge1xuICAgIHRydXN0U2VydmVyV2FybmluZ0VtaXR0ZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoJ2Bjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlYCB3aWxsIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIGZ1dHVyZS4gVG8gc2lsZW5jZSB0aGlzIG1lc3NhZ2UsIHNwZWNpZnkgYSB2YWx1ZSBleHBsaWNpdGx5IGluIHRoZSBjb25maWcgb3B0aW9ucycpO1xuICB9XG59O1xuXG50eXBlIEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbkRlc2NyaXB0b3IgQSBCdWZmZXIgdGhhdCBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgdHJhbnNhY3Rpb25EZXNjcmlwdG9yPzogQnVmZmVyKSA9PiB2b2lkXG5cbnR5cGUgU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHRvIHNldCBhIHNhdmVwb2ludCB3aXRoaW4gdGhlXG4gICAqIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbnR5cGUgQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLFxuICAgKiBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggYW4gZXJyb3IuXG4gICAqIElmIGFuIGVycm9yIG9jY3VycmVkIHRoZW4gYGVycmAgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGhhc1xuICAgKiBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBlcnIgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJlc2V0Q2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHJlc2V0IGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICpcbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlclxuICAgKiByZXF1ZXN0IHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgSWYgYW4gZXJyb3Igb2NjdXJyZWQsIGFuIFtbRXJyb3JdXSBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xudHlwZSBUcmFuc2FjdGlvbkNhbGxiYWNrPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgYSB0cmFuc2FjdGlvbiAob3IgY3JlYXRlIGEgc2F2ZXBvaW50LCBpblxuICAgKiB0aGUgY2FzZSBvZiBhIG5lc3RlZCB0cmFuc2FjdGlvbikgaGFzIGNvbXBsZXRlZCwgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICogSWYgbm8gZXJyb3Igb2NjdXJyZWQsIHRoZSBjYWxsYmFjayBzaG91bGQgcGVyZm9ybSBpdHMgd29yayBhbmQgZXZlbnR1YWxseSBjYWxsXG4gICAqIGBkb25lYCB3aXRoIGFuIGVycm9yIG9yIG51bGwgKHRvIHRyaWdnZXIgYSB0cmFuc2FjdGlvbiByb2xsYmFjayBvciBhXG4gICAqIHRyYW5zYWN0aW9uIGNvbW1pdCkgYW5kIGFuIGFkZGl0aW9uYWwgY29tcGxldGlvbiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3RcbiAgICogdG8gcm9sbGJhY2sgb3IgY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgZ2l2ZW4gdG8gYGRvbmVgIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhpcyBjYWxsYmFjay5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gdHhEb25lIElmIG5vIGVycm9yIG9jY3VycmVkLCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBjb21taXQgb3Igcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCB0eERvbmU/OiBUcmFuc2FjdGlvbkRvbmU8VD4pID0+IHZvaWQ7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2sgPSAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xudHlwZSBDYWxsYmFja1BhcmFtZXRlcnM8VCBleHRlbmRzIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pID0+IGFueT4gPSBUIGV4dGVuZHMgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBpbmZlciBQKSA9PiBhbnkgPyBQIDogbmV2ZXI7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBJZiBubyBlcnJvciBvY2N1cnJlZCwgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gY29tbWl0IG9yIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnIgb2NjdXJyZWQsIGEgc3RyaW5nIHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIGRvbmU6IFQsIC4uLmFyZ3M6IENhbGxiYWNrUGFyYW1ldGVyczxUPikgPT4gdm9pZDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkgPSAzMCAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUID0gMTUgKiAxMDAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0NMSUVOVF9SRVFVRVNUX1RJTUVPVVQgPSAxNSAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQgPSA1ICogMTAwMDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9DT05ORUNUX1JFVFJZX0lOVEVSVkFMID0gNTAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX1BBQ0tFVF9TSVpFID0gNCAqIDEwMjQ7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVEVYVFNJWkUgPSAyMTQ3NDgzNjQ3O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0RBVEVGSVJTVCA9IDc7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IDE0MzM7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVERTX1ZFUlNJT04gPSAnN180Jztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRSA9ICd1c19lbmdsaXNoJztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9EQVRFRk9STUFUID0gJ21keSc7XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgdXNlciB3YW50IHRvIGNvbm5lY3QgdG8gYW4gQXp1cmUgYXBwIHNlcnZpY2UgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzY29pYXRlIHRvIHRoZWlyIGNyZWF0ZWQgaWRuZXRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9wdGlvbmFsIGZvciByZXRyaWV2ZSB0b2tlbiBmcm9tIGF6dXJlIHdlYiBhcHAgc2VydmljZVxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB1c2VyIHdhbnQgdG8gY29ubmVjdCB0byBhbiBBenVyZSBhcHAgc2VydmljZSB1c2luZyBhIHNwZWNpZmljIGNsaWVudCBhY2NvdW50XG4gICAgICogdGhleSBuZWVkIHRvIHByb3ZpZGUgYGNsaWVudElkYCBhc3Njb2lhdGUgdG8gdGhlaXIgY3JlYXRlZCBpZG5ldGl0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb3B0aW9uYWwgZm9yIHJldHJpZXZlIHRva2VuIGZyb20gYXp1cmUgd2ViIGFwcCBzZXJ2aWNlXG4gICAgICovXG4gICAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeUFjY2Vzc1Rva2VuQXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogQSB1c2VyIG5lZWQgdG8gcHJvdmlkZSBgdG9rZW5gIHdoaWNoIHRoZXkgcmV0cml2ZWQgZWxzZSB3aGVyZVxuICAgICAqIHRvIGZvcm1pbmcgdGhlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgdG9rZW46IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5UGFzc3dvcmRBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIEEgdXNlciBuZWVkIHRvIHByb3ZpZGUgYHVzZXJOYW1lYCBhc3Njb2lhdGUgdG8gdGhlaXIgYWNjb3VudC5cbiAgICAgKi9cbiAgICB1c2VyTmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlciBuZWVkIHRvIHByb3ZpZGUgYHBhc3N3b3JkYCBhc3Njb2lhdGUgdG8gdGhlaXIgYWNjb3VudC5cbiAgICAgKi9cbiAgICBwYXNzd29yZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgcGFyYW1ldGVyIGZvciBzcGVjaWZpYyBBenVyZSB0ZW5hbnQgSURcbiAgICAgKi9cbiAgICBkb21haW46IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBBcHBsaWNhdGlvbiAoYGNsaWVudGApIElEIGZyb20geW91ciByZWdpc3RlcmVkIEF6dXJlIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlYXRlZCBgY2xpZW50IHNlY3JldGAgZm9yIHRoaXMgcmVnaXN0ZXJlZCBBenVyZSBhcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERpcmVjdG9yeSAoYHRlbmFudGApIElEIGZyb20geW91ciByZWdpc3RlcmVkIEF6dXJlIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIE50bG1BdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdudGxtJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIFVzZXIgbmFtZSBmcm9tIHlvdXIgd2luZG93cyBhY2NvdW50LlxuICAgICAqL1xuICAgIHVzZXJOYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGFzc3dvcmQgZnJvbSB5b3VyIHdpbmRvd3MgYWNjb3VudC5cbiAgICAgKi9cbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE9uY2UgeW91IHNldCBkb21haW4gZm9yIG50bG0gYXV0aGVudGljYXRpb24gdHlwZSwgZHJpdmVyIHdpbGwgY29ubmVjdCB0byBTUUwgU2VydmVyIHVzaW5nIGRvbWFpbiBsb2dpbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBmb3JtaW5nIGEgY29ubmVjdGlvbiB1c2luZyBudGxtIHR5cGVcbiAgICAgKi9cbiAgICBkb21haW46IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIERlZmF1bHRBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdkZWZhdWx0JztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIFVzZXIgbmFtZSB0byB1c2UgZm9yIHNxbCBzZXJ2ZXIgbG9naW4uXG4gICAgICovXG4gICAgdXNlck5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogUGFzc3dvcmQgdG8gdXNlIGZvciBzcWwgc2VydmVyIGxvZ2luLlxuICAgICAqL1xuICAgIHBhc3N3b3JkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgRXJyb3JXaXRoQ29kZSBleHRlbmRzIEVycm9yIHtcbiAgY29kZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludGVybmFsQ29ubmVjdGlvbkNvbmZpZyB7XG4gIHNlcnZlcjogc3RyaW5nO1xuICBhdXRoZW50aWNhdGlvbjogRGVmYXVsdEF1dGhlbnRpY2F0aW9uIHwgTnRsbUF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lBcHBTZXJ2aWNlQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeUFjY2Vzc1Rva2VuQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQ7XG4gIG9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyB7XG4gIGFib3J0VHJhbnNhY3Rpb25PbkVycm9yOiBib29sZWFuO1xuICBhcHBOYW1lOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGNhbWVsQ2FzZUNvbHVtbnM6IGJvb2xlYW47XG4gIGNhbmNlbFRpbWVvdXQ6IG51bWJlcjtcbiAgY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMOiBudW1iZXI7XG4gIGNvbHVtbkVuY3J5cHRpb25TZXR0aW5nOiBib29sZWFuO1xuICBjb2x1bW5OYW1lUmVwbGFjZXI6IHVuZGVmaW5lZCB8ICgoY29sTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBtZXRhZGF0YTogTWV0YWRhdGEpID0+IHN0cmluZyk7XG4gIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiBudW1iZXI7XG4gIGNvbm5lY3RUaW1lb3V0OiBudW1iZXI7XG4gIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbDogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXTtcbiAgY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzOiBTZWN1cmVDb250ZXh0T3B0aW9ucztcbiAgZGF0YWJhc2U6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgZGF0ZWZpcnN0OiBudW1iZXI7XG4gIGRhdGVGb3JtYXQ6IHN0cmluZztcbiAgZGVidWc6IHtcbiAgICBkYXRhOiBib29sZWFuO1xuICAgIHBhY2tldDogYm9vbGVhbjtcbiAgICBwYXlsb2FkOiBib29sZWFuO1xuICAgIHRva2VuOiBib29sZWFuO1xuICB9O1xuICBlbmFibGVBbnNpTnVsbDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lOdWxsRGVmYXVsdDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lQYWRkaW5nOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQW5zaVdhcm5pbmdzOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQXJpdGhBYm9ydDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVRdW90ZWRJZGVudGlmaWVyOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5jcnlwdDogYm9vbGVhbjtcbiAgZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzOiBLZXlTdG9yZVByb3ZpZGVyTWFwIHwgdW5kZWZpbmVkO1xuICBmYWxsYmFja1RvRGVmYXVsdERiOiBib29sZWFuO1xuICBpbnN0YW5jZU5hbWU6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgaXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF07XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIGxvY2FsQWRkcmVzczogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM6IG51bWJlcjtcbiAgbXVsdGlTdWJuZXRGYWlsb3ZlcjogYm9vbGVhbjtcbiAgcGFja2V0U2l6ZTogbnVtYmVyO1xuICBwb3J0OiB1bmRlZmluZWQgfCBudW1iZXI7XG4gIHJlYWRPbmx5SW50ZW50OiBib29sZWFuO1xuICByZXF1ZXN0VGltZW91dDogbnVtYmVyO1xuICByb3dDb2xsZWN0aW9uT25Eb25lOiBib29sZWFuO1xuICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjogYm9vbGVhbjtcbiAgc2VydmVyTmFtZTogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb246IGJvb2xlYW47XG4gIHRkc1ZlcnNpb246IHN0cmluZztcbiAgdGV4dHNpemU6IG51bWJlcjtcbiAgdHJ1c3RlZFNlcnZlck5hbWVBRTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnVzdFNlcnZlckNlcnRpZmljYXRlOiBib29sZWFuO1xuICB1c2VDb2x1bW5OYW1lczogYm9vbGVhbjtcbiAgdXNlVVRDOiBib29sZWFuO1xuICB3b3Jrc3RhdGlvbklkOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGxvd2VyQ2FzZUd1aWRzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgS2V5U3RvcmVQcm92aWRlck1hcCB7XG4gIFtrZXk6IHN0cmluZ106IENvbHVtbkVuY3J5cHRpb25BenVyZUtleVZhdWx0UHJvdmlkZXI7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW50ZXJmYWNlIFN0YXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbnRlcj8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gIGV4aXQ/KHRoaXM6IENvbm5lY3Rpb24sIG5ld1N0YXRlOiBTdGF0ZSk6IHZvaWQ7XG4gIGV2ZW50czoge1xuICAgIHNvY2tldEVycm9yPyh0aGlzOiBDb25uZWN0aW9uLCBlcnI6IEVycm9yKTogdm9pZDtcbiAgICBjb25uZWN0VGltZW91dD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gICAgbWVzc2FnZT8odGhpczogQ29ubmVjdGlvbiwgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWQ7XG4gICAgcmV0cnk/KHRoaXM6IENvbm5lY3Rpb24pOiB2b2lkO1xuICAgIHJlY29ubmVjdD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gIH07XG59XG5cbnR5cGUgQXV0aGVudGljYXRpb24gPSBEZWZhdWx0QXV0aGVudGljYXRpb24gfFxuICBOdGxtQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldDtcblxudHlwZSBBdXRoZW50aWNhdGlvblR5cGUgPSBBdXRoZW50aWNhdGlvblsndHlwZSddO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEhvc3RuYW1lIHRvIGNvbm5lY3QgdG8uXG4gICAqL1xuICBzZXJ2ZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgZm9ybWluZyB0aGUgY29ubmVjdGlvbi5cbiAgICovXG4gIG9wdGlvbnM/OiBDb25uZWN0aW9uT3B0aW9ucztcbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIHJlYWx0ZWQgb3B0aW9ucyBmb3IgY29ubmVjdGlvbi5cbiAgICovXG4gIGF1dGhlbnRpY2F0aW9uPzogQXV0aGVudGljYXRpb25PcHRpb25zO1xufVxuXG5pbnRlcmZhY2UgRGVidWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciBbW2RlYnVnXV0gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB3aXRoIHRleHQgZGVzY3JpYmluZyBwYWNrZXQgZGF0YSBkZXRhaWxzXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZGF0YTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciBbW2RlYnVnXV0gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB3aXRoIHRleHQgZGVzY3JpYmluZyBwYWNrZXQgZGV0YWlsc1xuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIHBhY2tldDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciBbW2RlYnVnXV0gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB3aXRoIHRleHQgZGVzY3JpYmluZyBwYWNrZXQgcGF5bG9hZCBkZXRhaWxzXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgcGF5bG9hZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciBbW2RlYnVnXV0gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB3aXRoIHRleHQgZGVzY3JpYmluZyB0b2tlbiBzdHJlYW0gdG9rZW5zXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgdG9rZW46IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBdXRoZW50aWNhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVHlwZSBvZiB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kLCB2YWxpZCB0eXBlcyBhcmUgYGRlZmF1bHRgLCBgbnRsbWAsXG4gICAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkYCwgYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuYCxcbiAgICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtYCwgYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlYCxcbiAgICogb3IgYGF6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0YFxuICAgKi9cbiAgdHlwZT86IEF1dGhlbnRpY2F0aW9uVHlwZTtcbiAgLyoqXG4gICAqIERpZmZlcmVudCBvcHRpb25zIGZvciBhdXRoZW50aWNhdGlvbiB0eXBlczpcbiAgICpcbiAgICogKiBgZGVmYXVsdGA6IFtbRGVmYXVsdEF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBudGxtYCA6W1tOdGxtQXV0aGVudGljYXRpb25dXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkYCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbmAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm1gIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlYCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lBcHBTZXJ2aWNlQXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0YCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlUHJpbmNpcGFsU2VjcmV0Lm9wdGlvbnNdXVxuICAgKi9cbiAgb3B0aW9ucz86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byByb2xsYmFjayBhIHRyYW5zYWN0aW9uIGF1dG9tYXRpY2FsbHkgaWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkXG4gICAqIGR1cmluZyB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24ncyBleGVjdXRpb24uIFRoaXMgc2V0cyB0aGUgdmFsdWUgZm9yIGBTRVQgWEFDVF9BQk9SVGAgZHVyaW5nIHRoZVxuICAgKiBpbml0aWFsIFNRTCBwaGFzZSBvZiBhIGNvbm5lY3Rpb24gW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC14YWN0LWFib3J0LXRyYW5zYWN0LXNxbCkuXG4gICAqL1xuICBhYm9ydFRyYW5zYWN0aW9uT25FcnJvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIG5hbWUgdXNlZCBmb3IgaWRlbnRpZnlpbmcgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiBpbiBwcm9maWxpbmcsIGxvZ2dpbmcgb3IgdHJhY2luZyB0b29scyBvZiBTUUxTZXJ2ZXIuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgVGVkaW91c2ApXG4gICAqL1xuICBhcHBOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xsaW5nIHdoZXRoZXIgdGhlIGNvbHVtbiBuYW1lcyByZXR1cm5lZCB3aWxsIGhhdmUgdGhlIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZVxuICAgKiAoYHRydWVgKSBvciBub3QuIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBpZiB5b3UgcHJvdmlkZSBhIFtbY29sdW1uTmFtZVJlcGxhY2VyXV0uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIGNhbWVsQ2FzZUNvbHVtbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIFtbUmVxdWVzdC5jYW5jZWxdXSAoYWJvcnQpIG9mIGEgcmVxdWVzdCBpcyBjb25zaWRlcmVkIGZhaWxlZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYDUwMDBgKS5cbiAgICovXG4gIGNhbmNlbFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGAoY29sdW1uTmFtZSwgaW5kZXgsIGNvbHVtbk1ldGFEYXRhKWAgYW5kIHJldHVybmluZyBhIHN0cmluZy4gSWYgcHJvdmlkZWQsXG4gICAqIHRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXIgY29sdW1uIHBlciByZXN1bHQtc2V0LiBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIFNRTC1wcm92aWRlZFxuICAgKiBjb2x1bW4gbmFtZSBvbiByb3cgYW5kIG1ldGEgZGF0YSBvYmplY3RzLiBUaGlzIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgY29udmVydCBiZXR3ZWVuIG5hbWluZyBjb252ZW50aW9ucy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBudWxsYClcbiAgICovXG4gIGNvbHVtbk5hbWVSZXBsYWNlcj86IChjb2xOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIG1ldGFkYXRhOiBNZXRhZGF0YSkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSByZXRyeWluZyB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiwgaW4gY2FzZSBvZiB0cmFuc2llbnQgZmFpbHVyZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6YDUwMGApXG4gICAqL1xuICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBhdHRlbXB0IHRvIGNvbm5lY3QgaXMgY29uc2lkZXJlZCBmYWlsZWRcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAxNTAwMGApLlxuICAgKi9cbiAgY29ubmVjdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbCBmb3IgbmV3IGNvbm5lY3Rpb25zLiBBbGwgb3V0LW9mLXRyYW5zYWN0aW9uIHF1ZXJpZXMgYXJlIGV4ZWN1dGVkIHdpdGggdGhpcyBzZXR0aW5nLlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIGxldmVscyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5JU09MQVRJT05fTEVWRUxgLlxuICAgKiAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAqIGBSRUFEX0NPTU1JVFRFRGBcbiAgICogKiBgUkVQRUFUQUJMRV9SRUFEYFxuICAgKiAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICogYFNOQVBTSE9UYFxuICAgKlxuICAgKiAoZGVmYXVsdDogYFJFQURfQ09NTUlURURgKS5cbiAgICovXG4gIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBlbmNyeXB0aW9uIGlzIHVzZWQsIGFuIG9iamVjdCBtYXkgYmUgc3VwcGxpZWQgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICogZm9yIHRoZSBmaXJzdCBhcmd1bWVudCB3aGVuIGNhbGxpbmcgW2B0bHMuY3JlYXRlU2VjdXJlUGFpcmBdKGh0dHA6Ly9ub2RlanMub3JnL2RvY3MvbGF0ZXN0L2FwaS90bHMuaHRtbCN0bHNfdGxzX2NyZWF0ZXNlY3VyZXBhaXJfY3JlZGVudGlhbHNfaXNzZXJ2ZXJfcmVxdWVzdGNlcnRfcmVqZWN0dW5hdXRob3JpemVkKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHt9YClcbiAgICovXG4gIGNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscz86IFNlY3VyZUNvbnRleHRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSB0byBjb25uZWN0IHRvIChkZWZhdWx0OiBkZXBlbmRlbnQgb24gc2VydmVyIGNvbmZpZ3VyYXRpb24pLlxuICAgKi9cbiAgZGF0YWJhc2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayB0byBhIG51bWJlciBmcm9tIDEgdGhyb3VnaCA3LlxuICAgKi9cbiAgZGF0ZWZpcnN0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgcG9zaXRpb24gb2YgbW9udGgsIGRheSBhbmQgeWVhciBpbiB0ZW1wb3JhbCBkYXRhdHlwZXMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgbWR5YClcbiAgICovXG4gIGRhdGVGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgZGVidWc/OiBEZWJ1Z09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbHMgdGhlIHdheSBudWxsIHZhbHVlcyBzaG91bGQgYmUgdXNlZCBkdXJpbmcgY29tcGFyaXNvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVBbnNpTnVsbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGBTRVQgQU5TSV9OVUxMX0RGTFRfT04gT05gIHdpbGwgYmUgc2V0IGluIHRoZSBpbml0aWFsIHNxbC4gVGhpcyBtZWFucyBuZXcgY29sdW1ucyB3aWxsIGJlXG4gICAqIG51bGxhYmxlIGJ5IGRlZmF1bHQuIFNlZSB0aGUgW1QtU1FMIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODczNzUuYXNweClcbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYCkuXG4gICAqL1xuICBlbmFibGVBbnNpTnVsbERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xzIGlmIHBhZGRpbmcgc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHZhbHVlcyBzaG9ydGVyIHRoYW4gdGhlIHNpemUgb2YgZGVmaW5lZCBjb2x1bW4uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVBbnNpUGFkZGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIFNRTCBTZXJ2ZXIgd2lsbCBmb2xsb3cgSVNPIHN0YW5kYXJkIGJlaGF2aW9yIGR1cmluZyB2YXJpb3VzIGVycm9yIGNvbmRpdGlvbnMuIEZvciBkZXRhaWxzLFxuICAgKiBzZWUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1hbnNpLXdhcm5pbmdzLXRyYW5zYWN0LXNxbClcbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFuc2lXYXJuaW5ncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuZHMgYSBxdWVyeSB3aGVuIGFuIG92ZXJmbG93IG9yIGRpdmlkZS1ieS16ZXJvIGVycm9yIG9jY3VycyBkdXJpbmcgcXVlcnkgZXhlY3V0aW9uLlxuICAgKiBTZWUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1hcml0aGFib3J0LXRyYW5zYWN0LXNxbD92aWV3PXNxbC1zZXJ2ZXItMjAxNylcbiAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFyaXRoQWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGRldGVybWluZXMgaWYgY29uY2F0ZW5hdGlvbiB3aXRoIE5VTEwgc2hvdWxkIHJlc3VsdCBpbiBOVUxMIG9yIGVtcHR5IHN0cmluZyB2YWx1ZSwgbW9yZSBkZXRhaWxzIGluXG4gICAqIFtkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9zcWwvdC1zcWwvc3RhdGVtZW50cy9zZXQtY29uY2F0LW51bGwteWllbGRzLW51bGwtdHJhbnNhY3Qtc3FsKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xzIHdoZXRoZXIgY3Vyc29yIHNob3VsZCBiZSBjbG9zZWQsIGlmIHRoZSB0cmFuc2FjdGlvbiBvcGVuaW5nIGl0IGdldHMgY29tbWl0dGVkIG9yIHJvbGxlZFxuICAgKiBiYWNrLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYG51bGxgKVxuICAgKi9cbiAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdD86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIHNldHMgdGhlIGNvbm5lY3Rpb24gdG8gZWl0aGVyIGltcGxpY2l0IG9yIGF1dG9jb21taXQgdHJhbnNhY3Rpb24gbW9kZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBlbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBlcnJvciBpcyBub3QgZ2VuZXJhdGVkIGR1cmluZyBsb3NzIG9mIHByZWNlc3Npb24uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBjaGFyYWN0ZXJzIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMgYXJlIHRyZWF0ZWQgYXMgbGl0ZXJhbHMgYW5kIHRob3NlIGVuY2xvc2VkIGRvdWJsZSBxdW90ZXMgYXJlIHRyZWF0ZWQgYXMgaWRlbnRpZmllcnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVRdW90ZWRJZGVudGlmaWVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZW5jcnlwdGVkLiBTZXQgdG8gYHRydWVgIGlmIHlvdSdyZSBvbiBXaW5kb3dzIEF6dXJlLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGVuY3J5cHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBpZiB0aGUgZGF0YWJhc2UgcmVxdWVzdGVkIGJ5IFtbZGF0YWJhc2VdXSBjYW5ub3QgYmUgYWNjZXNzZWQsXG4gICAqIHRoZSBjb25uZWN0aW9uIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLiBIb3dldmVyLCBpZiBbW2ZhbGxiYWNrVG9EZWZhdWx0RGJdXSBpc1xuICAgKiBzZXQgdG8gYHRydWVgLCB0aGVuIHRoZSB1c2VyJ3MgZGVmYXVsdCBkYXRhYmFzZSB3aWxsIGJlIHVzZWQgaW5zdGVhZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGZhbGxiYWNrVG9EZWZhdWx0RGI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UgbmFtZSB0byBjb25uZWN0IHRvLlxuICAgKiBUaGUgU1FMIFNlcnZlciBCcm93c2VyIHNlcnZpY2UgbXVzdCBiZSBydW5uaW5nIG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIsXG4gICAqIGFuZCBVRFAgcG9ydCAxNDM0IG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgbXVzdCBiZSByZWFjaGFibGUuXG4gICAqXG4gICAqIChubyBkZWZhdWx0KVxuICAgKlxuICAgKiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBbW3BvcnRdXS5cbiAgICovXG4gIGluc3RhbmNlTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsIHRoYXQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgcnVuIHdpdGguXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gbGV2ZWxzIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLklTT0xBVElPTl9MRVZFTGAuXG4gICAqICogYFJFQURfVU5DT01NSVRURURgXG4gICAqICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAqIGBSRVBFQVRBQkxFX1JFQURgXG4gICAqICogYFNFUklBTElaQUJMRWBcbiAgICogKiBgU05BUFNIT1RgXG4gICAqXG4gICAqIChkZWZhdWx0OiBgUkVBRF9DT01NSVRFRGApLlxuICAgKi9cbiAgaXNvbGF0aW9uTGV2ZWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgZm9yIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBsYW5ndWFnZSBkZXRlcm1pbmVzIHRoZSBkYXRldGltZSBmb3JtYXRzIGFuZCBzeXN0ZW0gbWVzc2FnZXMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdXNfZW5nbGlzaGApLlxuICAgKi9cbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggbmV0d29yayBpbnRlcmZhY2UgKGlwIGFkZHJlc3MpIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gU1FMIFNlcnZlci5cbiAgICovXG4gIGxvY2FsQWRkcmVzcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmV0cmllcyBmb3IgdHJhbnNpZW50IGVycm9ycy7jgIFcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAzYCkuXG4gICAqL1xuICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIE11bHRpU3VibmV0RmFpbG92ZXIgPSBUcnVlIHBhcmFtZXRlciwgd2hpY2ggY2FuIGhlbHAgbWluaW1pemUgdGhlIGNsaWVudCByZWNvdmVyeSBsYXRlbmN5IHdoZW4gZmFpbG92ZXJzIG9jY3VyLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICBtdWx0aVN1Ym5ldEZhaWxvdmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgVERTIHBhY2tldHMgKHN1YmplY3QgdG8gbmVnb3RpYXRpb24gd2l0aCB0aGUgc2VydmVyKS5cbiAgICogU2hvdWxkIGJlIGEgcG93ZXIgb2YgMi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGA0MDk2YCkuXG4gICAqL1xuICBwYWNrZXRTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQb3J0IHRvIGNvbm5lY3QgdG8gKGRlZmF1bHQ6IGAxNDMzYCkuXG4gICAqXG4gICAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFtbaW5zdGFuY2VOYW1lXV1cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgY29ubmVjdGlvbiB3aWxsIHJlcXVlc3QgcmVhZCBvbmx5IGFjY2VzcyBmcm9tIGEgU1FMIFNlcnZlciBBdmFpbGFiaWxpdHlcbiAgICogR3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW2hlcmVdKGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDcxMDA1NC5hc3B4IFwiTWljcm9zb2Z0OiBDb25maWd1cmUgUmVhZC1Pbmx5IFJvdXRpbmcgZm9yIGFuIEF2YWlsYWJpbGl0eSBHcm91cCAoU1FMIFNlcnZlcilcIilcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgcmVhZE9ubHlJbnRlbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgZmFpbGVkLCBvciBgMGAgZm9yIG5vIHRpbWVvdXRcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAxNTAwMGApLlxuICAgKi9cbiAgcmVxdWVzdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgdGhhdCB3aGVuIHRydWUgd2lsbCBleHBvc2UgcmVjZWl2ZWQgcm93cyBpbiBSZXF1ZXN0cyBkb25lIHJlbGF0ZWQgZXZlbnRzOlxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lSW5Qcm9jXV1cbiAgICogKiBbW1JlcXVlc3QuRXZlbnRfZG9uZVByb2NdXVxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lXV1cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqXG4gICAqIENhdXRpb246IElmIG1hbnkgcm93IGFyZSByZWNlaXZlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gY291bGQgcmVzdWx0IGluXG4gICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UuXG4gICAqL1xuICByb3dDb2xsZWN0aW9uT25Eb25lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuLCB0aGF0IHdoZW4gdHJ1ZSB3aWxsIGV4cG9zZSByZWNlaXZlZCByb3dzIGluIFJlcXVlc3RzJyBjb21wbGV0aW9uIGNhbGxiYWNrLlNlZSBbW1JlcXVlc3QuY29uc3RydWN0b3JdXS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqXG4gICAqIENhdXRpb246IElmIG1hbnkgcm93IGFyZSByZWNlaXZlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gY291bGQgcmVzdWx0IGluXG4gICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UuXG4gICAqL1xuICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIFREUyB0byB1c2UuIElmIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgc3BlY2lmaWVkIHZlcnNpb24sIG5lZ290aWF0ZWQgdmVyc2lvbiBpcyB1c2VkIGluc3RlYWQuXG4gICAqXG4gICAqIFRoZSB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5URFNfVkVSU0lPTmAuXG4gICAqICogYDdfMWBcbiAgICogKiBgN18yYFxuICAgKiAqIGA3XzNfQWBcbiAgICogKiBgN18zX0JgXG4gICAqICogYDdfNGBcbiAgICpcbiAgICogKGRlZmF1bHQ6IGA3XzRgKVxuICAgKi9cbiAgdGRzVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHZhcmNoYXIobWF4KSwgbnZhcmNoYXIobWF4KSwgdmFyYmluYXJ5KG1heCksIHRleHQsIG50ZXh0LCBhbmQgaW1hZ2UgZGF0YSByZXR1cm5lZCBieSBhIFNFTEVDVCBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgMjE0NzQ4MzY0N2ApXG4gICAqL1xuICB0ZXh0c2l6ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgXCJ0cnVlXCIsIHRoZSBTUUwgU2VydmVyIFNTTCBjZXJ0aWZpY2F0ZSBpcyBhdXRvbWF0aWNhbGx5IHRydXN0ZWQgd2hlbiB0aGUgY29tbXVuaWNhdGlvbiBsYXllciBpcyBlbmNyeXB0ZWQgdXNpbmcgU1NMLlxuICAgKlxuICAgKiBJZiBcImZhbHNlXCIsIHRoZSBTUUwgU2VydmVyIHZhbGlkYXRlcyB0aGUgc2VydmVyIFNTTCBjZXJ0aWZpY2F0ZS4gSWYgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIGZhaWxzLFxuICAgKiB0aGUgZHJpdmVyIHJhaXNlcyBhbiBlcnJvciBhbmQgdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbi4gTWFrZSBzdXJlIHRoZSB2YWx1ZSBwYXNzZWQgdG8gc2VydmVyTmFtZSBleGFjdGx5XG4gICAqIG1hdGNoZXMgdGhlIENvbW1vbiBOYW1lIChDTikgb3IgRE5TIG5hbWUgaW4gdGhlIFN1YmplY3QgQWx0ZXJuYXRlIE5hbWUgaW4gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmb3IgYW4gU1NMIGNvbm5lY3Rpb24gdG8gc3VjY2VlZC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIHRydXN0U2VydmVyQ2VydGlmaWNhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byByZXR1cm4gcm93cyBhcyBhcnJheXMgb3Iga2V5LXZhbHVlIGNvbGxlY3Rpb25zLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICB1c2VDb2x1bW5OYW1lcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHBhc3MgdGltZSB2YWx1ZXMgaW4gVVRDIG9yIGxvY2FsIHRpbWUuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApLlxuICAgKi9cbiAgdXNlVVRDPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHdvcmtzdGF0aW9uIElEIChXU0lEKSBvZiB0aGUgY2xpZW50LCBkZWZhdWx0IG9zLmhvc3RuYW1lKCkuXG4gICAqIFVzZWQgZm9yIGlkZW50aWZ5aW5nIGEgc3BlY2lmaWMgY2xpZW50IGluIHByb2ZpbGluZywgbG9nZ2luZyBvclxuICAgKiB0cmFjaW5nIGNsaWVudCBhY3Rpdml0eSBpbiBTUUxTZXJ2ZXIuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyByZXBvcnRlZCBieSB0aGUgVFNRTCBmdW5jdGlvbiBIT1NUX05BTUUoKS5cbiAgICovXG4gIHdvcmtzdGF0aW9uSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHBhcnNlIHVuaXF1ZSBpZGVudGlmaWVyIHR5cGUgd2l0aCBsb3dlcmNhc2UgY2FzZSBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICBsb3dlckNhc2VHdWlkcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgQ0xFQU5VUF9UWVBFID0ge1xuICBOT1JNQUw6IDAsXG4gIFJFRElSRUNUOiAxLFxuICBSRVRSWTogMlxufTtcblxuaW50ZXJmYWNlIFJvdXRpbmdEYXRhIHtcbiAgc2VydmVyOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFtbQ29ubmVjdGlvbl1dIGluc3RhbmNlIHJlcHJlc2VudHMgYSBzaW5nbGUgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlIHNlcnZlci5cbiAqXG4gKiBgYGBqc1xuICogdmFyIENvbm5lY3Rpb24gPSByZXF1aXJlKCd0ZWRpb3VzJykuQ29ubmVjdGlvbjtcbiAqIHZhciBjb25maWcgPSB7XG4gKiAgXCJhdXRoZW50aWNhdGlvblwiOiB7XG4gKiAgICAuLi4sXG4gKiAgICBcIm9wdGlvbnNcIjogey4uLn1cbiAqICB9LFxuICogIFwib3B0aW9uc1wiOiB7Li4ufVxuICogfTtcbiAqIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oY29uZmlnKTtcbiAqIGBgYFxuICpcbiAqIE9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24uIE9uY2UgYSBbW1JlcXVlc3RdXVxuICogaGFzIGJlZW4gaW5pdGlhdGVkICh3aXRoIFtbQ29ubmVjdGlvbi5jYWxsUHJvY2VkdXJlXV0sIFtbQ29ubmVjdGlvbi5leGVjU3FsXV0sXG4gKiBvciBbW0Nvbm5lY3Rpb24uZXhlY1NxbEJhdGNoXV0pLCBhbm90aGVyIHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoZVxuICogW1tSZXF1ZXN0XV0ncyBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAqL1xuY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZmVkQXV0aFJlcXVpcmVkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbmZpZzogSW50ZXJuYWxDb25uZWN0aW9uQ29uZmlnO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlY3VyZUNvbnRleHQ6IFNlY3VyZUNvbnRleHQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5UcmFuc2FjdGlvbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzOiBCdWZmZXJbXTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmFuc2FjdGlvbkRlcHRoOiBudW1iZXI7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNTcWxCYXRjaDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjdXJUcmFuc2llbnRSZXRyeUNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJhbnNpZW50RXJyb3JMb29rdXA6IFRyYW5zaWVudEVycm9yTG9va3VwO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsb3NlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBsb2dpbkVycm9yOiB1bmRlZmluZWQgfCBDb25uZWN0aW9uRXJyb3I7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVidWc6IERlYnVnO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG50bG1wYWNrZXQ6IHVuZGVmaW5lZCB8IGFueTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBudGxtcGFja2V0QnVmZmVyOiB1bmRlZmluZWQgfCBCdWZmZXI7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIFNUQVRFOiB7XG4gICAgSU5JVElBTElaRUQ6IFN0YXRlO1xuICAgIENPTk5FQ1RJTkc6IFN0YXRlO1xuICAgIFNFTlRfUFJFTE9HSU46IFN0YXRlO1xuICAgIFJFUk9VVElORzogU3RhdGU7XG4gICAgVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlk6IFN0YXRlO1xuICAgIFNFTlRfVExTU1NMTkVHT1RJQVRJT046IFN0YXRlO1xuICAgIFNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU46IFN0YXRlO1xuICAgIFNFTlRfTE9HSU43X1dJVEhfTlRMTTogU3RhdGU7XG4gICAgU0VOVF9MT0dJTjdfV0lUSF9GRURBVVRIOiBTdGF0ZTtcbiAgICBMT0dHRURfSU5fU0VORElOR19JTklUSUFMX1NRTDogU3RhdGU7XG4gICAgTE9HR0VEX0lOOiBTdGF0ZTtcbiAgICBTRU5UX0NMSUVOVF9SRVFVRVNUOiBTdGF0ZTtcbiAgICBTRU5UX0FUVEVOVElPTjogU3RhdGU7XG4gICAgRklOQUw6IFN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByb3V0aW5nRGF0YTogdW5kZWZpbmVkIHwgUm91dGluZ0RhdGE7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtZXNzYWdlSW8hOiBNZXNzYWdlSU87XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGU6IFN0YXRlO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3Q6IHVuZGVmaW5lZCB8IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXF1ZXN0OiB1bmRlZmluZWQgfCBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJvY1JldHVyblN0YXR1c1ZhbHVlOiB1bmRlZmluZWQgfCBhbnk7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc29ja2V0OiB1bmRlZmluZWQgfCBTb2NrZXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWVzc2FnZUJ1ZmZlcjogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29ubmVjdFRpbWVyOiB1bmRlZmluZWQgfCBOb2RlSlMuVGltZW91dDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVxdWVzdFRpbWVyOiB1bmRlZmluZWQgfCBOb2RlSlMuVGltZW91dDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXRyeVRpbWVyOiB1bmRlZmluZWQgfCBOb2RlSlMuVGltZW91dDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jYW5jZWxBZnRlclJlcXVlc3RTZW50OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGF0YWJhc2VDb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogTm90ZTogYmUgYXdhcmUgb2YgdGhlIGRpZmZlcmVudCBvcHRpb25zIGZpZWxkOlxuICAgKiAxLiBjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9uc1xuICAgKiAyLiBjb25maWcub3B0aW9uc1xuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCB7IENvbm5lY3Rpb24gfSA9IHJlcXVpcmUoJ3RlZGlvdXMnKTtcbiAgICpcbiAgICogY29uc3QgY29uZmlnID0ge1xuICAgKiAgXCJhdXRoZW50aWNhdGlvblwiOiB7XG4gICAqICAgIC4uLixcbiAgICogICAgXCJvcHRpb25zXCI6IHsuLi59XG4gICAqICB9LFxuICAgKiAgXCJvcHRpb25zXCI6IHsuLi59XG4gICAqIH07XG4gICAqXG4gICAqIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihjb25maWcpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZ1xuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb25uZWN0aW9uQ29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcgfHwgY29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWdcIiBhcmd1bWVudCBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5zZXJ2ZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuc2VydmVyXCIgcHJvcGVydHkgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5mZWRBdXRoUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIGxldCBhdXRoZW50aWNhdGlvbjogSW50ZXJuYWxDb25uZWN0aW9uQ29uZmlnWydhdXRoZW50aWNhdGlvbiddO1xuICAgIGlmIChjb25maWcuYXV0aGVudGljYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcuYXV0aGVudGljYXRpb24gIT09ICdvYmplY3QnIHx8IGNvbmZpZy5hdXRoZW50aWNhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb25cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgT2JqZWN0LicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlID0gY29uZmlnLmF1dGhlbnRpY2F0aW9uLnR5cGU7XG4gICAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHt9IDogY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnM7XG5cbiAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLnR5cGVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSAhPT0gJ2RlZmF1bHQnICYmIHR5cGUgIT09ICdudGxtJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZScgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ0eXBlXCIgcHJvcGVydHkgbXVzdCBvbmUgb2YgXCJkZWZhdWx0XCIsIFwibnRsbVwiLCBcImF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmRcIiwgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlblwiLCBcImF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtXCIgb3IgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZVwiIG9yIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXRcIi4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0JyB8fCBvcHRpb25zID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG9iamVjdC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09ICdudGxtJykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZG9tYWluICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmRvbWFpblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy51c2VyTmFtZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnVzZXJOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMucGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ250bG0nLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHVzZXJOYW1lOiBvcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc3dvcmQsXG4gICAgICAgICAgICBkb21haW46IG9wdGlvbnMuZG9tYWluICYmIG9wdGlvbnMuZG9tYWluLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJykge1xuICAgICAgICBpZiAob3B0aW9ucy51c2VyTmFtZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnVzZXJOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMucGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHVzZXJOYW1lOiBvcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc3dvcmQsXG4gICAgICAgICAgICBkb21haW46IG9wdGlvbnMuZG9tYWluLFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudG9rZW5cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB0b2tlbjogb3B0aW9ucy50b2tlblxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJykge1xuICAgICAgICBpZiAob3B0aW9ucy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZScpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5jbGllbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jbGllbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuY2xpZW50U2VjcmV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudFNlY3JldFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudGVuYW50SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudGVuYW50SWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgICAgIGNsaWVudFNlY3JldDogb3B0aW9ucy5jbGllbnRTZWNyZXQsXG4gICAgICAgICAgICB0ZW5hbnRJZDogb3B0aW9ucy50ZW5hbnRJZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcHRpb25zLnVzZXJOYW1lICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMudXNlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGFzc3dvcmQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5wYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHVzZXJOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgcGFzc3dvcmQ6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgc2VydmVyOiBjb25maWcuc2VydmVyLFxuICAgICAgYXV0aGVudGljYXRpb246IGF1dGhlbnRpY2F0aW9uLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBhYm9ydFRyYW5zYWN0aW9uT25FcnJvcjogZmFsc2UsXG4gICAgICAgIGFwcE5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgY2FtZWxDYXNlQ29sdW1uczogZmFsc2UsXG4gICAgICAgIGNhbmNlbFRpbWVvdXQ6IERFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQsXG4gICAgICAgIGNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTDogMiAqIDYwICogNjAgKiAxMDAwLCAgLy8gVW5pdHM6IG1pbGlzZWNvbmRzXG4gICAgICAgIGNvbHVtbkVuY3J5cHRpb25TZXR0aW5nOiBmYWxzZSxcbiAgICAgICAgY29sdW1uTmFtZVJlcGxhY2VyOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiBERUZBVUxUX0NPTk5FQ1RfUkVUUllfSU5URVJWQUwsXG4gICAgICAgIGNvbm5lY3RUaW1lb3V0OiBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVCxcbiAgICAgICAgY29ubmVjdGlvbklzb2xhdGlvbkxldmVsOiBJU09MQVRJT05fTEVWRUwuUkVBRF9DT01NSVRURUQsXG4gICAgICAgIGNyeXB0b0NyZWRlbnRpYWxzRGV0YWlsczoge30sXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGVmaXJzdDogREVGQVVMVF9EQVRFRklSU1QsXG4gICAgICAgIGRhdGVGb3JtYXQ6IERFRkFVTFRfREFURUZPUk1BVCxcbiAgICAgICAgZGVidWc6IHtcbiAgICAgICAgICBkYXRhOiBmYWxzZSxcbiAgICAgICAgICBwYWNrZXQ6IGZhbHNlLFxuICAgICAgICAgIHBheWxvYWQ6IGZhbHNlLFxuICAgICAgICAgIHRva2VuOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBlbmFibGVBbnNpTnVsbDogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQW5zaU51bGxEZWZhdWx0OiB0cnVlLFxuICAgICAgICBlbmFibGVBbnNpUGFkZGluZzogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQW5zaVdhcm5pbmdzOiB0cnVlLFxuICAgICAgICBlbmFibGVBcml0aEFib3J0OiB0cnVlLFxuICAgICAgICBlbmFibGVDb25jYXROdWxsWWllbGRzTnVsbDogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDogbnVsbCxcbiAgICAgICAgZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnM6IGZhbHNlLFxuICAgICAgICBlbmFibGVOdW1lcmljUm91bmRhYm9ydDogZmFsc2UsXG4gICAgICAgIGVuYWJsZVF1b3RlZElkZW50aWZpZXI6IHRydWUsXG4gICAgICAgIGVuY3J5cHQ6IHRydWUsXG4gICAgICAgIGZhbGxiYWNrVG9EZWZhdWx0RGI6IGZhbHNlLFxuICAgICAgICBlbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zdGFuY2VOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGlzb2xhdGlvbkxldmVsOiBJU09MQVRJT05fTEVWRUwuUkVBRF9DT01NSVRURUQsXG4gICAgICAgIGxhbmd1YWdlOiBERUZBVUxUX0xBTkdVQUdFLFxuICAgICAgICBsb2NhbEFkZHJlc3M6IHVuZGVmaW5lZCxcbiAgICAgICAgbWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzOiAzLFxuICAgICAgICBtdWx0aVN1Ym5ldEZhaWxvdmVyOiBmYWxzZSxcbiAgICAgICAgcGFja2V0U2l6ZTogREVGQVVMVF9QQUNLRVRfU0laRSxcbiAgICAgICAgcG9ydDogREVGQVVMVF9QT1JULFxuICAgICAgICByZWFkT25seUludGVudDogZmFsc2UsXG4gICAgICAgIHJlcXVlc3RUaW1lb3V0OiBERUZBVUxUX0NMSUVOVF9SRVFVRVNUX1RJTUVPVVQsXG4gICAgICAgIHJvd0NvbGxlY3Rpb25PbkRvbmU6IGZhbHNlLFxuICAgICAgICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjogZmFsc2UsXG4gICAgICAgIHNlcnZlck5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VydmVyU3VwcG9ydHNDb2x1bW5FbmNyeXB0aW9uOiBmYWxzZSxcbiAgICAgICAgdGRzVmVyc2lvbjogREVGQVVMVF9URFNfVkVSU0lPTixcbiAgICAgICAgdGV4dHNpemU6IERFRkFVTFRfVEVYVFNJWkUsXG4gICAgICAgIHRydXN0ZWRTZXJ2ZXJOYW1lQUU6IHVuZGVmaW5lZCxcbiAgICAgICAgdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZTogdHJ1ZSxcbiAgICAgICAgdXNlQ29sdW1uTmFtZXM6IGZhbHNlLFxuICAgICAgICB1c2VVVEM6IHRydWUsXG4gICAgICAgIHdvcmtzdGF0aW9uSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgbG93ZXJDYXNlR3VpZHM6IGZhbHNlXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChjb25maWcub3B0aW9ucykge1xuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnBvcnQgJiYgY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUG9ydCBhbmQgaW5zdGFuY2VOYW1lIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIGJ1dCAnICsgY29uZmlnLm9wdGlvbnMucG9ydCArICcgYW5kICcgKyBjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgKyAnIHByb3ZpZGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciA9IGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuYXBwTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuYXBwTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5hcHBOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuYXBwTmFtZSA9IGNvbmZpZy5vcHRpb25zLmFwcE5hbWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMgPSBjb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dCA9IGNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXIgPSBjb25maWcub3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCA9IGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0VmFsaWRJc29sYXRpb25MZXZlbChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwsICdjb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCA9IGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscyAhPT0gJ29iamVjdCcgfHwgY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzID0gY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0YWJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRhdGFiYXNlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGFiYXNlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0YWJhc2UgPSBjb25maWcub3B0aW9ucy5kYXRhYmFzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSAnbnVtYmVyJyAmJiBjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kYXRlZmlyc3RcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gbnVsbCAmJiAoY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0IDwgMSB8fCBjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgPiA3KSkge1xuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kYXRlZmlyc3RcIiBwcm9wZXJ0eSBtdXN0IGJlID49IDEgYW5kIDw9IDcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ID0gY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCAhPT0gJ3N0cmluZycgJiYgY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgPSBjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhID0gY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLnBhY2tldFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0ID0gY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkID0gY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGVidWcudG9rZW4gPSBjb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmdcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3NcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgPSBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGxcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgPSBjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmNyeXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmNyeXB0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmNyeXB0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQgPSBjb25maWcub3B0aW9ucy5lbmNyeXB0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYlwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiID0gY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSA9IGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZTtcbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsLCAnY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsID0gY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgIT09ICdzdHJpbmcnICYmIGNvbmZpZy5vcHRpb25zLmxhbmd1YWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2VcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlID0gY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3NcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3MgPSBjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIgPSBjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5wYWNrZXRTaXplXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSA9IGNvbmZpZy5vcHRpb25zLnBhY2tldFNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5wb3J0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnBvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnBvcnQgPD0gMCB8fCBjb25maWcub3B0aW9ucy5wb3J0ID49IDY1NTM2KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnBvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlID4gMCBhbmQgPCA2NTUzNicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID0gY29uZmlnLm9wdGlvbnMucG9ydDtcbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yZWFkT25seUludGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50ID0gY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dCA9IGNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzXCIgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gMC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzID0gY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWxcIiBwcm9wZXJ0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCA9IGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lID0gY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb25cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24gPSBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPSBjb25maWcub3B0aW9ucy50ZHNWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudGV4dHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSAnbnVtYmVyJyAmJiBjb25maWcub3B0aW9ucy50ZXh0c2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRleHRzaXplXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlciBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRleHRzaXplID4gMjE0NzQ4MzY0Nykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRleHRzaXplXCIgY2FuXFwndCBiZSBncmVhdGVyIHRoYW4gMjE0NzQ4MzY0Ny4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcub3B0aW9ucy50ZXh0c2l6ZSA8IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGV4dHNpemVcIiBjYW5cXCd0IGJlIHNtYWxsZXIgdGhhbiAtMS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudGV4dHNpemUgPSBjb25maWcub3B0aW9ucy50ZXh0c2l6ZSB8IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUgPSBjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdFRydXN0U2VydmVyQ2VydGlmaWNhdGVXYXJuaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzID0gY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy51c2VVVEMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnVzZVVUQyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudXNlVVRDXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnVzZVVUQyA9IGNvbmZpZy5vcHRpb25zLnVzZVVUQztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgPSBjb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkcyA9IGNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjcmVkZW50aWFsc0RldGFpbHMgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscztcbiAgICBpZiAoY3JlZGVudGlhbHNEZXRhaWxzLnNlY3VyZU9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgdGhlIGNhbGxlciBoYXMgbm90IHNwZWNpZmllZCB0aGVpciBvd24gYHNlY3VyZU9wdGlvbnNgLFxuICAgICAgLy8gd2Ugc2V0IGBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTYCBoZXJlLlxuICAgICAgLy8gT2xkZXIgU1FMIFNlcnZlciBpbnN0YW5jZXMgcnVubmluZyBvbiBvbGRlciBXaW5kb3dzIHZlcnNpb25zIGhhdmVcbiAgICAgIC8vIHRyb3VibGUgd2l0aCB0aGUgQkVBU1Qgd29ya2Fyb3VuZCBpbiBPcGVuU1NMLlxuICAgICAgLy8gQXMgQkVBU1QgaXMgYSBicm93c2VyIHNwZWNpZmljIGV4cGxvaXQsIHdlIGNhbiBqdXN0IGRpc2FibGUgdGhpcyBvcHRpb24gaGVyZS5cbiAgICAgIGNyZWRlbnRpYWxzRGV0YWlscyA9IE9iamVjdC5jcmVhdGUoY3JlZGVudGlhbHNEZXRhaWxzLCB7XG4gICAgICAgIHNlY3VyZU9wdGlvbnM6IHtcbiAgICAgICAgICB2YWx1ZTogY29uc3RhbnRzLlNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWN1cmVDb250ZXh0ID0gY3JlYXRlU2VjdXJlQ29udGV4dChjcmVkZW50aWFsc0RldGFpbHMpO1xuXG4gICAgdGhpcy5kZWJ1ZyA9IHRoaXMuY3JlYXRlRGVidWcoKTtcbiAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMgPSBbQnVmZmVyLmZyb20oWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKV07XG5cbiAgICAvLyAnYmVnaW5UcmFuc2FjdGlvbicsICdjb21taXRUcmFuc2FjdGlvbicgYW5kICdyb2xsYmFja1RyYW5zYWN0aW9uJ1xuICAgIC8vIGV2ZW50cyBhcmUgdXRpbGl6ZWQgdG8gbWFpbnRhaW4gaW5UcmFuc2FjdGlvbiBwcm9wZXJ0eSBzdGF0ZSB3aGljaCBpblxuICAgIC8vIHR1cm4gaXMgdXNlZCBpbiBtYW5hZ2luZyB0cmFuc2FjdGlvbnMuIFRoZXNlIGV2ZW50cyBhcmUgb25seSBmaXJlZCBmb3JcbiAgICAvLyBURFMgdmVyc2lvbiA3LjIgYW5kIGJleW9uZC4gVGhlIHByb3BlcnRpZXMgYmVsb3cgYXJlIHVzZWQgdG8gZW11bGF0ZVxuICAgIC8vIGVxdWl2YWxlbnQgYmVoYXZpb3IgZm9yIFREUyB2ZXJzaW9ucyBiZWZvcmUgNy4yLlxuICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aCA9IDA7XG4gICAgdGhpcy5pc1NxbEJhdGNoID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG5cbiAgICB0aGlzLmN1clRyYW5zaWVudFJldHJ5Q291bnQgPSAwO1xuICAgIHRoaXMudHJhbnNpZW50RXJyb3JMb29rdXAgPSBuZXcgVHJhbnNpZW50RXJyb3JMb29rdXAoKTtcblxuICAgIHRoaXMuc3RhdGUgPSB0aGlzLlNUQVRFLklOSVRJQUxJWkVEO1xuXG4gICAgdGhpcy5fY2FuY2VsQWZ0ZXJSZXF1ZXN0U2VudCA9ICgpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuQVRURU5USU9OKTtcbiAgICAgIHRoaXMuY3JlYXRlQ2FuY2VsVGltZXIoKTtcbiAgICB9O1xuICB9XG5cbiAgY29ubmVjdChjb25uZWN0TGlzdGVuZXI/OiAoZXJyPzogRXJyb3IpID0+IHZvaWQpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5TVEFURS5JTklUSUFMSVpFRCkge1xuICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcignYC5jb25uZWN0YCBjYW4gbm90IGJlIGNhbGxlZCBvbiBhIENvbm5lY3Rpb24gaW4gYCcgKyB0aGlzLnN0YXRlLm5hbWUgKyAnYCBzdGF0ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdExpc3RlbmVyKSB7XG4gICAgICBjb25zdCBvbkNvbm5lY3QgPSAoZXJyPzogRXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgY29ubmVjdExpc3RlbmVyKGVycik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uQ29ubmVjdCk7XG4gICAgICAgIGNvbm5lY3RMaXN0ZW5lcihlcnIpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5vbmNlKCdjb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICAgIHRoaXMub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkNPTk5FQ1RJTkcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIHJlcG9ydGVkIHRoYXQgdGhlIGNoYXJzZXQgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBvbihldmVudDogJ2NoYXJzZXRDaGFuZ2UnLCBsaXN0ZW5lcjogKGNoYXJzZXQ6IHN0cmluZykgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgdG8gY29ubmVjdCBhbmQgdmFsaWRhdGUgaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIG9uKFxuICAgIGV2ZW50OiAnY29ubmVjdCcsXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGVyciBJZiBzdWNjZXNzZnVsbHkgY29ubmVjdGVkLCB3aWxsIGJlIGZhbHNleS4gSWYgdGhlcmUgd2FzIGFcbiAgICAgKiAgIHByb2JsZW0gKHdpdGggZWl0aGVyIGNvbm5lY3Rpbmcgb3IgdmFsaWRhdGlvbiksIHdpbGwgYmUgYW4gW1tFcnJvcl1dIG9iamVjdC5cbiAgICAgKi9cbiAgICBsaXN0ZW5lcjogKGVycjogRXJyb3IgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyByZXBvcnRlZCB0aGF0IHRoZSBhY3RpdmUgZGF0YWJhc2UgaGFzIGNoYW5nZWQuXG4gICAqIFRoaXMgbWF5IGJlIGFzIGEgcmVzdWx0IG9mIGEgc3VjY2Vzc2Z1bCBsb2dpbiwgb3IgYSBgdXNlYCBzdGF0ZW1lbnQuXG4gICAqL1xuICBvbihldmVudDogJ2RhdGFiYXNlQ2hhbmdlJywgbGlzdGVuZXI6IChkYXRhYmFzZU5hbWU6IHN0cmluZykgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogQSBkZWJ1ZyBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gSXQgbWF5IGJlIGxvZ2dlZCBvciBpZ25vcmVkLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdkZWJ1ZycsIGxpc3RlbmVyOiAobWVzc2FnZVRleHQ6IHN0cmluZykgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogSW50ZXJuYWwgZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdlcnJvcicsIGxpc3RlbmVyOiAoZXJyOiBFcnJvcikgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgaXNzdWVkIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBvbihldmVudDogJ2Vycm9yTWVzc2FnZScsIGxpc3RlbmVyOiAobWVzc2FnZTogaW1wb3J0KCcuL3Rva2VuL3Rva2VuJykuRXJyb3JNZXNzYWdlVG9rZW4pID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBjb25uZWN0aW9uIGhhcyBlbmRlZC5cbiAgICpcbiAgICogVGhpcyBtYXkgYmUgYXMgYSByZXN1bHQgb2YgdGhlIGNsaWVudCBjYWxsaW5nIFtbY2xvc2VdXSwgdGhlIHNlcnZlclxuICAgKiBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLCBvciBhIG5ldHdvcmsgZXJyb3IuXG4gICAqL1xuICBvbihldmVudDogJ2VuZCcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyBpc3N1ZWQgYW4gaW5mb3JtYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIG9uKGV2ZW50OiAnaW5mb01lc3NhZ2UnLCBsaXN0ZW5lcjogKG1lc3NhZ2U6IGltcG9ydCgnLi90b2tlbi90b2tlbicpLkluZm9NZXNzYWdlVG9rZW4pID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIHJlcG9ydGVkIHRoYXQgdGhlIGxhbmd1YWdlIGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdsYW5ndWFnZUNoYW5nZScsIGxpc3RlbmVyOiAobGFuZ3VhZ2VOYW1lOiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBjb25uZWN0aW9uIHdhcyByZXNldC5cbiAgICovXG4gIG9uKGV2ZW50OiAncmVzZXRDb25uZWN0aW9uJywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIEEgc2VjdXJlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gICAqL1xuICBvbihldmVudDogJ3NlY3VyZScsIGxpc3RlbmVyOiAoY2xlYXJ0ZXh0OiBpbXBvcnQoJ3RscycpLlRMU1NvY2tldCkgPT4gdm9pZCk6IHRoaXNcblxuICBvbihldmVudDogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgcmV0dXJuIHN1cGVyLm9uKGV2ZW50LCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdjaGFyc2V0Q2hhbmdlJywgY2hhcnNldDogc3RyaW5nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdjb25uZWN0JywgZXJyb3I/OiBFcnJvcik6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZGF0YWJhc2VDaGFuZ2UnLCBkYXRhYmFzZU5hbWU6IHN0cmluZyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZGVidWcnLCBtZXNzYWdlVGV4dDogc3RyaW5nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdlcnJvcicsIGVycm9yOiBFcnJvcik6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZXJyb3JNZXNzYWdlJywgbWVzc2FnZTogaW1wb3J0KCcuL3Rva2VuL3Rva2VuJykuRXJyb3JNZXNzYWdlVG9rZW4pOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2VuZCcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2luZm9NZXNzYWdlJywgbWVzc2FnZTogaW1wb3J0KCcuL3Rva2VuL3Rva2VuJykuSW5mb01lc3NhZ2VUb2tlbik6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnbGFuZ3VhZ2VDaGFuZ2UnLCBsYW5ndWFnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnc2VjdXJlJywgY2xlYXJ0ZXh0OiBpbXBvcnQoJ3RscycpLlRMU1NvY2tldCk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncmVyb3V0aW5nJyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncmVzZXRDb25uZWN0aW9uJyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncmV0cnknKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyb2xsYmFja1RyYW5zYWN0aW9uJyk6IGJvb2xlYW5cblxuICBlbWl0KGV2ZW50OiBzdHJpbmcgfCBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAqXG4gICAqIFRoZSBbW0V2ZW50X2VuZF1dIHdpbGwgYmUgZW1pdHRlZCBvbmNlIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC5cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0aWFsaXNlQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLmNyZWF0ZUNvbm5lY3RUaW1lcigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdE9uUG9ydCh0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQsIHRoaXMuY29uZmlnLm9wdGlvbnMubXVsdGlTdWJuZXRGYWlsb3Zlciwgc2lnbmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBJbnN0YW5jZUxvb2t1cCgpLmluc3RhbmNlTG9va3VwKHtcbiAgICAgICAgc2VydmVyOiB0aGlzLmNvbmZpZy5zZXJ2ZXIsXG4gICAgICAgIGluc3RhbmNlTmFtZTogdGhpcy5jb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUhLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0LFxuICAgICAgICBzaWduYWw6IHNpZ25hbFxuICAgICAgfSwgKGVyciwgcG9ydCkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKGVyci5tZXNzYWdlLCAnRUlOU1RMT09LVVAnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb25uZWN0T25Qb3J0KHBvcnQhLCB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIsIHNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYW51cENvbm5lY3Rpb24oY2xlYW51cFR5cGU6IHR5cGVvZiBDTEVBTlVQX1RZUEVba2V5b2YgdHlwZW9mIENMRUFOVVBfVFlQRV0pIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmNsZWFyQ29ubmVjdFRpbWVyKCk7XG4gICAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7XG4gICAgICB0aGlzLmNsZWFyUmV0cnlUaW1lcigpO1xuICAgICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcbiAgICAgIGlmIChjbGVhbnVwVHlwZSA9PT0gQ0xFQU5VUF9UWVBFLlJFRElSRUNUKSB7XG4gICAgICAgIHRoaXMuZW1pdCgncmVyb3V0aW5nJyk7XG4gICAgICB9IGVsc2UgaWYgKGNsZWFudXBUeXBlICE9PSBDTEVBTlVQX1RZUEUuUkVUUlkpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3Q7XG4gICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgUmVxdWVzdEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgcmVxdWVzdCBjb21wbGV0ZWQuJywgJ0VDTE9TRScpO1xuICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKGVycik7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgdGhpcy5sb2dpbkVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRGVidWcoKSB7XG4gICAgY29uc3QgZGVidWcgPSBuZXcgRGVidWcodGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zyk7XG4gICAgZGVidWcub24oJ2RlYnVnJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnZGVidWcnLCBtZXNzYWdlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVidWc7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2U6IE1lc3NhZ2UsIGhhbmRsZXI6IFRva2VuSGFuZGxlcikge1xuICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgdGhpcy5kZWJ1ZywgaGFuZGxlciwgdGhpcy5jb25maWcub3B0aW9ucyk7XG4gIH1cblxuICBjb25uZWN0T25Qb3J0KHBvcnQ6IG51bWJlciwgbXVsdGlTdWJuZXRGYWlsb3ZlcjogYm9vbGVhbiwgc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IGNvbm5lY3RPcHRzID0ge1xuICAgICAgaG9zdDogdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEuc2VydmVyIDogdGhpcy5jb25maWcuc2VydmVyLFxuICAgICAgcG9ydDogdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEucG9ydCA6IHBvcnQsXG4gICAgICBsb2NhbEFkZHJlc3M6IHRoaXMuY29uZmlnLm9wdGlvbnMubG9jYWxBZGRyZXNzXG4gICAgfTtcblxuICAgIG5ldyBDb25uZWN0b3IoY29ubmVjdE9wdHMsIHNpZ25hbCwgbXVsdGlTdWJuZXRGYWlsb3ZlcikuZXhlY3V0ZSgoZXJyLCBzb2NrZXQpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgfVxuXG4gICAgICBzb2NrZXQgPSBzb2NrZXQhO1xuICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcikgPT4geyB0aGlzLnNvY2tldEVycm9yKGVycm9yKTsgfSk7XG4gICAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4geyB0aGlzLnNvY2tldENsb3NlKCk7IH0pO1xuICAgICAgc29ja2V0Lm9uKCdlbmQnLCAoKSA9PiB7IHRoaXMuc29ja2V0RW5kKCk7IH0pO1xuICAgICAgc29ja2V0LnNldEtlZXBBbGl2ZSh0cnVlLCBLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkpO1xuXG4gICAgICB0aGlzLm1lc3NhZ2VJbyA9IG5ldyBNZXNzYWdlSU8oc29ja2V0LCB0aGlzLmNvbmZpZy5vcHRpb25zLnBhY2tldFNpemUsIHRoaXMuZGVidWcpO1xuICAgICAgdGhpcy5tZXNzYWdlSW8ub24oJ3NlY3VyZScsIChjbGVhcnRleHQpID0+IHsgdGhpcy5lbWl0KCdzZWN1cmUnLCBjbGVhcnRleHQpOyB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmRlYnVnLmxvZygnY29ubmVjdGVkIHRvICcgKyB0aGlzLmNvbmZpZy5zZXJ2ZXIgKyAnOicgKyB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQpO1xuXG4gICAgICB0aGlzLnNlbmRQcmVMb2dpbigpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX1BSRUxPR0lOKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xvc2VDb25uZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlQ29ubmVjdFRpbWVyKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5jb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHRoaXMuY29ubmVjdFRpbWVvdXQoKTtcbiAgICB9LCB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0KTtcbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZUNhbmNlbFRpbWVyKCkge1xuICAgIHRoaXMuY2xlYXJDYW5jZWxUaW1lcigpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXQ7XG4gICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICB0aGlzLmNhbmNlbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsVGltZW91dCgpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVSZXF1ZXN0VGltZXIoKSB7XG4gICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpOyAvLyByZWxlYXNlIG9sZCB0aW1lciwganVzdCB0byBiZSBzYWZlXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCBhcyBSZXF1ZXN0O1xuICAgIGNvbnN0IHRpbWVvdXQgPSAocmVxdWVzdC50aW1lb3V0ICE9PSB1bmRlZmluZWQpID8gcmVxdWVzdC50aW1lb3V0IDogdGhpcy5jb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dDtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5yZXF1ZXN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGltZW91dCgpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVSZXRyeVRpbWVyKCkge1xuICAgIHRoaXMuY2xlYXJSZXRyeVRpbWVyKCk7XG4gICAgdGhpcy5yZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJldHJ5VGltZW91dCgpO1xuICAgIH0sIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25uZWN0VGltZW91dCgpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYEZhaWxlZCB0byBjb25uZWN0IHRvICR7dGhpcy5jb25maWcuc2VydmVyfSR7dGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID8gYDoke3RoaXMuY29uZmlnLm9wdGlvbnMucG9ydH1gIDogYFxcXFwke3RoaXMuY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lfWB9IGluICR7dGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dH1tc2A7XG4gICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCAnRVRJTUVPVVQnKSk7XG4gICAgdGhpcy5jb25uZWN0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjb25uZWN0VGltZW91dCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxUaW1lb3V0KCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIGNhbmNlbCByZXF1ZXN0IGluICR7dGhpcy5jb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0fW1zYDtcbiAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3NvY2tldEVycm9yJywgbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCAnRVRJTUVPVVQnKSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlcXVlc3RUaW1lb3V0KCkge1xuICAgIHRoaXMucmVxdWVzdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3QhO1xuICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgY29uc3QgdGltZW91dCA9IChyZXF1ZXN0LnRpbWVvdXQgIT09IHVuZGVmaW5lZCkgPyByZXF1ZXN0LnRpbWVvdXQgOiB0aGlzLmNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSAnVGltZW91dDogUmVxdWVzdCBmYWlsZWQgdG8gY29tcGxldGUgaW4gJyArIHRpbWVvdXQgKyAnbXMnO1xuICAgIHJlcXVlc3QuZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKG1lc3NhZ2UsICdFVElNRU9VVCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXRyeVRpbWVvdXQoKSB7XG4gICAgdGhpcy5yZXRyeVRpbWVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW1pdCgncmV0cnknKTtcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkNPTk5FQ1RJTkcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhckNvbm5lY3RUaW1lcigpIHtcbiAgICBpZiAodGhpcy5jb25uZWN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNvbm5lY3RUaW1lcik7XG4gICAgICB0aGlzLmNvbm5lY3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyQ2FuY2VsVGltZXIoKSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNhbmNlbFRpbWVyKTtcbiAgICAgIHRoaXMuY2FuY2VsVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhclJlcXVlc3RUaW1lcigpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlcXVlc3RUaW1lcik7XG4gICAgICB0aGlzLnJlcXVlc3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyUmV0cnlUaW1lcigpIHtcbiAgICBpZiAodGhpcy5yZXRyeVRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVyKTtcbiAgICAgIHRoaXMucmV0cnlUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyYW5zaXRpb25UbyhuZXdTdGF0ZTogU3RhdGUpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gbmV3U3RhdGUpIHtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdTdGF0ZSBpcyBhbHJlYWR5ICcgKyBuZXdTdGF0ZS5uYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLmV4aXQpIHtcbiAgICAgIHRoaXMuc3RhdGUuZXhpdC5jYWxsKHRoaXMsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlYnVnLmxvZygnU3RhdGUgY2hhbmdlOiAnICsgKHRoaXMuc3RhdGUgPyB0aGlzLnN0YXRlLm5hbWUgOiAndW5kZWZpbmVkJykgKyAnIC0+ICcgKyBuZXdTdGF0ZS5uYW1lKTtcbiAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5lbnRlcikge1xuICAgICAgdGhpcy5zdGF0ZS5lbnRlci5hcHBseSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldEV2ZW50SGFuZGxlcjxUIGV4dGVuZHMga2V5b2YgU3RhdGVbJ2V2ZW50cyddPihldmVudE5hbWU6IFQpOiBOb25OdWxsYWJsZTxTdGF0ZVsnZXZlbnRzJ11bVF0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zdGF0ZS5ldmVudHNbZXZlbnROYW1lXTtcblxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBldmVudCAnJHtldmVudE5hbWV9JyBpbiBzdGF0ZSAnJHt0aGlzLnN0YXRlLm5hbWV9J2ApO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVyITtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGlzcGF0Y2hFdmVudDxUIGV4dGVuZHMga2V5b2YgU3RhdGVbJ2V2ZW50cyddPihldmVudE5hbWU6IFQsIC4uLmFyZ3M6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8U3RhdGVbJ2V2ZW50cyddW1RdPj4pIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zdGF0ZS5ldmVudHNbZXZlbnROYW1lXSBhcyAoKHRoaXM6IENvbm5lY3Rpb24sIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihgTm8gZXZlbnQgJyR7ZXZlbnROYW1lfScgaW4gc3RhdGUgJyR7dGhpcy5zdGF0ZS5uYW1lfSdgKSk7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzb2NrZXRFcnJvcihlcnJvcjogRXJyb3IpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5DT05ORUNUSU5HIHx8IHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuU0VOVF9UTFNTU0xORUdPVElBVElPTikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBGYWlsZWQgdG8gY29ubmVjdCB0byAke3RoaXMuY29uZmlnLnNlcnZlcn06JHt0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnR9IC0gJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VTT0NLRVQnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ29ubmVjdGlvbiBsb3N0IC0gJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UsICdFU09DS0VUJykpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3NvY2tldEVycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzb2NrZXRFbmQoKSB7XG4gICAgdGhpcy5kZWJ1Zy5sb2coJ3NvY2tldCBlbmRlZCcpO1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSB0aGlzLlNUQVRFLkZJTkFMKSB7XG4gICAgICBjb25zdCBlcnJvcjogRXJyb3JXaXRoQ29kZSA9IG5ldyBFcnJvcignc29ja2V0IGhhbmcgdXAnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnRUNPTk5SRVNFVCc7XG4gICAgICB0aGlzLnNvY2tldEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldENsb3NlKCkge1xuICAgIHRoaXMuZGVidWcubG9nKCdjb25uZWN0aW9uIHRvICcgKyB0aGlzLmNvbmZpZy5zZXJ2ZXIgKyAnOicgKyB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQgKyAnIGNsb3NlZCcpO1xuICAgIGlmICh0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLlJFUk9VVElORykge1xuICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1Jlcm91dGluZyB0byAnICsgdGhpcy5yb3V0aW5nRGF0YSEuc2VydmVyICsgJzonICsgdGhpcy5yb3V0aW5nRGF0YSEucG9ydCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgncmVjb25uZWN0Jyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZKSB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5zZXJ2ZXIgOiB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgICBjb25zdCBwb3J0ID0gdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEucG9ydCA6IHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydDtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdSZXRyeSBhZnRlciB0cmFuc2llbnQgZmFpbHVyZSBjb25uZWN0aW5nIHRvICcgKyBzZXJ2ZXIgKyAnOicgKyBwb3J0KTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZXRyeScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRQcmVMb2dpbigpIHtcbiAgICBjb25zdCBbICwgbWFqb3IsIG1pbm9yLCBidWlsZCBdID0gL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvLmV4ZWModmVyc2lvbikgPz8gWyAnMC4wLjAnLCAnMCcsICcwJywgJzAnIF07XG5cbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFByZWxvZ2luUGF5bG9hZCh7XG4gICAgICBlbmNyeXB0OiB0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQsXG4gICAgICB2ZXJzaW9uOiB7IG1ham9yOiBOdW1iZXIobWFqb3IpLCBtaW5vcjogTnVtYmVyKG1pbm9yKSwgYnVpbGQ6IE51bWJlcihidWlsZCksIHN1YmJ1aWxkOiAwIH1cbiAgICB9KTtcblxuICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuUFJFTE9HSU4sIHBheWxvYWQuZGF0YSk7XG4gICAgdGhpcy5kZWJ1Zy5wYXlsb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBheWxvYWQudG9TdHJpbmcoJyAgJyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtcHR5TWVzc2FnZUJ1ZmZlcigpIHtcbiAgICB0aGlzLm1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFkZFRvTWVzc2FnZUJ1ZmZlcihkYXRhOiBCdWZmZXIpIHtcbiAgICB0aGlzLm1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLm1lc3NhZ2VCdWZmZXIsIGRhdGFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2VuZExvZ2luN1BhY2tldCgpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IExvZ2luN1BheWxvYWQoe1xuICAgICAgdGRzVmVyc2lvbjogdmVyc2lvbnNbdGhpcy5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uXSxcbiAgICAgIHBhY2tldFNpemU6IHRoaXMuY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSxcbiAgICAgIGNsaWVudFByb2dWZXI6IDAsXG4gICAgICBjbGllbnRQaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgY29ubmVjdGlvbklkOiAwLFxuICAgICAgY2xpZW50VGltZVpvbmU6IG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSxcbiAgICAgIGNsaWVudExjaWQ6IDB4MDAwMDA0MDlcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRpb24gfSA9IHRoaXMuY29uZmlnO1xuICAgIHN3aXRjaCAoYXV0aGVudGljYXRpb24udHlwZSkge1xuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCc6XG4gICAgICAgIHBheWxvYWQuZmVkQXV0aCA9IHtcbiAgICAgICAgICB0eXBlOiAnQURBTCcsXG4gICAgICAgICAgZWNobzogdGhpcy5mZWRBdXRoUmVxdWlyZWQsXG4gICAgICAgICAgd29ya2Zsb3c6ICdkZWZhdWx0J1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nOlxuICAgICAgICBwYXlsb2FkLmZlZEF1dGggPSB7XG4gICAgICAgICAgdHlwZTogJ1NFQ1VSSVRZVE9LRU4nLFxuICAgICAgICAgIGVjaG86IHRoaXMuZmVkQXV0aFJlcXVpcmVkLFxuICAgICAgICAgIGZlZEF1dGhUb2tlbjogYXV0aGVudGljYXRpb24ub3B0aW9ucy50b2tlblxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nOlxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnOlxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnOlxuICAgICAgICBwYXlsb2FkLmZlZEF1dGggPSB7XG4gICAgICAgICAgdHlwZTogJ0FEQUwnLFxuICAgICAgICAgIGVjaG86IHRoaXMuZmVkQXV0aFJlcXVpcmVkLFxuICAgICAgICAgIHdvcmtmbG93OiAnaW50ZWdyYXRlZCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ250bG0nOlxuICAgICAgICBwYXlsb2FkLnNzcGkgPSBjcmVhdGVOVExNUmVxdWVzdCh7IGRvbWFpbjogYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW4gfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYXlsb2FkLnVzZXJOYW1lID0gYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZTtcbiAgICAgICAgcGF5bG9hZC5wYXNzd29yZCA9IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmQ7XG4gICAgfVxuXG4gICAgcGF5bG9hZC5ob3N0bmFtZSA9IHRoaXMuY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZCB8fCBvcy5ob3N0bmFtZSgpO1xuICAgIHBheWxvYWQuc2VydmVyTmFtZSA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBwYXlsb2FkLmFwcE5hbWUgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmFwcE5hbWUgfHwgJ1RlZGlvdXMnO1xuICAgIHBheWxvYWQubGlicmFyeU5hbWUgPSBsaWJyYXJ5TmFtZTtcbiAgICBwYXlsb2FkLmxhbmd1YWdlID0gdGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZTtcbiAgICBwYXlsb2FkLmRhdGFiYXNlID0gdGhpcy5jb25maWcub3B0aW9ucy5kYXRhYmFzZTtcbiAgICBwYXlsb2FkLmNsaWVudElkID0gQnVmZmVyLmZyb20oWzEsIDIsIDMsIDQsIDUsIDZdKTtcblxuICAgIHBheWxvYWQucmVhZE9ubHlJbnRlbnQgPSB0aGlzLmNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50O1xuICAgIHBheWxvYWQuaW5pdERiRmF0YWwgPSAhdGhpcy5jb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiO1xuXG4gICAgdGhpcy5yb3V0aW5nRGF0YSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLkxPR0lONywgcGF5bG9hZC50b0J1ZmZlcigpKTtcblxuICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kRmVkQXV0aFRva2VuTWVzc2FnZSh0b2tlbjogc3RyaW5nKSB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW5MZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aCh0b2tlbiwgJ3VjczInKTtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDggKyBhY2Nlc3NUb2tlbkxlbik7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgb2Zmc2V0ID0gZGF0YS53cml0ZVVJbnQzMkxFKGFjY2Vzc1Rva2VuTGVuICsgNCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgPSBkYXRhLndyaXRlVUludDMyTEUoYWNjZXNzVG9rZW5MZW4sIG9mZnNldCk7XG4gICAgZGF0YS53cml0ZSh0b2tlbiwgb2Zmc2V0LCAndWNzMicpO1xuICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuRkVEQVVUSF9UT0tFTiwgZGF0YSk7XG4gICAgLy8gc2VudCB0aGUgZmVkQXV0aCB0b2tlbiBtZXNzYWdlLCB0aGUgcmVzdCBpcyBzaW1pbGFyIHRvIHN0YW5kYXJkIGxvZ2luIDdcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kSW5pdGlhbFNxbCgpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFNxbEJhdGNoUGF5bG9hZCh0aGlzLmdldEluaXRpYWxTcWwoKSwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogVFlQRS5TUUxfQkFUQ0ggfSk7XG4gICAgdGhpcy5tZXNzYWdlSW8ub3V0Z29pbmdNZXNzYWdlU3RyZWFtLndyaXRlKG1lc3NhZ2UpO1xuICAgIFJlYWRhYmxlLmZyb20ocGF5bG9hZCkucGlwZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SW5pdGlhbFNxbCgpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW107XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9udWxscyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfbnVsbHMgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxfZGZsdF9vbiBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxfZGZsdF9vbiBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9wYWRkaW5nIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9wYWRkaW5nIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV93YXJuaW5ncyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX3dhcm5pbmdzIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFyaXRoYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFyaXRoYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGNvbmNhdF9udWxsX3lpZWxkc19udWxsIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY29uY2F0X251bGxfeWllbGRzX251bGwgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY3Vyc29yX2Nsb3NlX29uX2NvbW1pdCBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY3Vyc29yX2Nsb3NlX29uX2NvbW1pdCBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGRhdGVmaXJzdCAke3RoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGRhdGVmb3JtYXQgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXR9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGltcGxpY2l0X3RyYW5zYWN0aW9ucyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGltcGxpY2l0X3RyYW5zYWN0aW9ucyBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGBzZXQgbGFuZ3VhZ2UgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBudW1lcmljX3JvdW5kYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBudW1lcmljX3JvdW5kYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgcXVvdGVkX2lkZW50aWZpZXIgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHF1b3RlZF9pZGVudGlmaWVyIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCB0ZXh0c2l6ZSAke3RoaXMuY29uZmlnLm9wdGlvbnMudGV4dHNpemV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgJHt0aGlzLmdldElzb2xhdGlvbkxldmVsVGV4dCh0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCl9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHhhY3RfYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCB4YWN0X2Fib3J0IG9mZicpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcm9jZXNzZWRJbml0aWFsU3FsKCkge1xuICAgIHRoaXMuY2xlYXJDb25uZWN0VGltZXIoKTtcbiAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBTUUwgYmF0Y2ggcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqIFRoZXJlIGlzIG5vIHBhcmFtIHN1cHBvcnQsIGFuZCB1bmxpa2UgW1tSZXF1ZXN0LmV4ZWNTcWxdXSxcbiAgICogaXQgaXMgbm90IGxpa2VseSB0aGF0IFNRTCBTZXJ2ZXIgd2lsbCByZXVzZSB0aGUgZXhlY3V0aW9uIHBsYW4gaXQgZ2VuZXJhdGVzIGZvciB0aGUgU1FMLlxuICAgKlxuICAgKiBJbiBhbG1vc3QgYWxsIGNhc2VzLCBbW1JlcXVlc3QuZXhlY1NxbF1dIHdpbGwgYmUgYSBiZXR0ZXIgY2hvaWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBleGVjU3FsQmF0Y2gocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5TUUxfQkFUQ0gsIG5ldyBTcWxCYXRjaFBheWxvYWQocmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUhLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqICBFeGVjdXRlIHRoZSBTUUwgcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqXG4gICAqIEFzIGBzcF9leGVjdXRlc3FsYCBpcyB1c2VkIHRvIGV4ZWN1dGUgdGhlIFNRTCwgaWYgdGhlIHNhbWUgU1FMIGlzIGV4ZWN1dGVkIG11bHRpcGxlcyB0aW1lc1xuICAgKiB1c2luZyB0aGlzIGZ1bmN0aW9uLCB0aGUgU1FMIFNlcnZlciBxdWVyeSBvcHRpbWl6ZXIgaXMgbGlrZWx5IHRvIHJldXNlIHRoZSBleGVjdXRpb24gcGxhbiBpdCBnZW5lcmF0ZXNcbiAgICogZm9yIHRoZSBmaXJzdCBleGVjdXRpb24uIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIFNRTCBzZXJ2ZXIgdHJlYXRpbmcgdGhlIHJlcXVlc3QgbGlrZSBhIHN0b3JlZCBwcm9jZWR1cmVcbiAgICogd2hpY2ggY2FuIHJlc3VsdCBpbiB0aGUgW1tFdmVudF9kb25lSW5Qcm9jXV0gb3IgW1tFdmVudF9kb25lUHJvY11dIGV2ZW50cyBiZWluZyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlXG4gICAqIFtbRXZlbnRfZG9uZV1dIGV2ZW50IHlvdSBtaWdodCBleHBlY3QuIFVzaW5nIFtbZXhlY1NxbEJhdGNoXV0gd2lsbCBwcmV2ZW50IHRoaXMgZnJvbSBvY2N1cnJpbmcgYnV0IG1heSBoYXZlIGEgbmVnYXRpdmUgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgKlxuICAgKiBCZXdhcmUgb2YgdGhlIHdheSB0aGF0IHNjb3BpbmcgcnVsZXMgYXBwbHksIGFuZCBob3cgdGhleSBtYXkgW2FmZmVjdCBsb2NhbCB0ZW1wIHRhYmxlc10oaHR0cDovL3dlYmxvZ3Muc3FsdGVhbS5jb20vbWxhZGVucC9hcmNoaXZlLzIwMDYvMTEvMDMvMTcxOTcuYXNweClcbiAgICogSWYgeW91J3JlIHJ1bm5pbmcgaW4gdG8gc2NvcGluZyBpc3N1ZXMsIHRoZW4gW1tleGVjU3FsQmF0Y2hdXSBtYXkgYmUgYSBiZXR0ZXIgY2hvaWNlLlxuICAgKiBTZWUgYWxzbyBbaXNzdWUgIzI0XShodHRwczovL2dpdGh1Yi5jb20vcGVraW0vdGVkaW91cy9pc3N1ZXMvMjQpXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGV4ZWNTcWwocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnZhbGlkYXRlUGFyYW1ldGVycyh0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuTlZhckNoYXIsXG4gICAgICBuYW1lOiAnc3RhdGVtZW50JyxcbiAgICAgIHZhbHVlOiByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgICBuYW1lOiAncGFyYW1zJyxcbiAgICAgICAgdmFsdWU6IHJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpLFxuICAgICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuXG4gICAgICBwYXJhbWV0ZXJzLnB1c2goLi4ucmVxdWVzdC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZCgnc3BfZXhlY3V0ZXNxbCcsIHBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCdWxrTG9hZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBidWxrLWluc2VydCBpbnRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBIHNldCBvZiBidWxrIGxvYWQgb3B0aW9ucy5cbiAgICovXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrOiBCdWxrTG9hZENhbGxiYWNrKTogQnVsa0xvYWRcbiAgbmV3QnVsa0xvYWQodGFibGU6IHN0cmluZywgb3B0aW9uczogQnVsa0xvYWRPcHRpb25zLCBjYWxsYmFjazogQnVsa0xvYWRDYWxsYmFjayk6IEJ1bGtMb2FkXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrT3JPcHRpb25zOiBCdWxrTG9hZE9wdGlvbnMgfCBCdWxrTG9hZENhbGxiYWNrLCBjYWxsYmFjaz86IEJ1bGtMb2FkQ2FsbGJhY2spIHtcbiAgICBsZXQgb3B0aW9uczogQnVsa0xvYWRPcHRpb25zO1xuXG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tPck9wdGlvbnMgYXMgQnVsa0xvYWRDYWxsYmFjaztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGNhbGxiYWNrT3JPcHRpb25zIGFzIEJ1bGtMb2FkT3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIm9wdGlvbnNcIiBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJ1bGtMb2FkKHRhYmxlLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uLCB0aGlzLmNvbmZpZy5vcHRpb25zLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIFtbQnVsa0xvYWRdXS5cbiAgICpcbiAgICogYGBganNcbiAgICogLy8gV2Ugd2FudCB0byBwZXJmb3JtIGEgYnVsayBsb2FkIGludG8gYSB0YWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAgKiAvLyBDUkVBVEUgVEFCTEUgZW1wbG95ZWVzIChmaXJzdF9uYW1lIG52YXJjaGFyKDI1NSksIGxhc3RfbmFtZSBudmFyY2hhcigyNTUpLCBkYXlfb2ZfYmlydGggZGF0ZSk7XG4gICAqXG4gICAqIGNvbnN0IGJ1bGtMb2FkID0gY29ubmVjdGlvbi5uZXdCdWxrTG9hZCgnZW1wbG95ZWVzJywgKGVyciwgcm93Q291bnQpID0+IHtcbiAgICogICAvLyAuLi5cbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIGNvbHVtbnMgdGhhdCB3ZSB3YW50IHRvIHdyaXRlIHRvLFxuICAgKiAvLyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMuIFRoZXNlIGRlZmluaXRpb25zIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCB0YWJsZSxcbiAgICogLy8gb3RoZXJ3aXNlIHRoZSBidWxrIGxvYWQgd2lsbCBmYWlsLlxuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCBUWVBFUy5OVmFyY2hhciwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGJ1bGtMb2FkLmFkZENvbHVtbignbGFzdF9uYW1lJywgVFlQRVMuTlZhcmNoYXIsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2RhdGVfb2ZfYmlydGgnLCBUWVBFUy5EYXRlLCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICpcbiAgICogLy8gRXhlY3V0ZSBhIGJ1bGsgbG9hZCB3aXRoIGEgcHJlZGVmaW5lZCBsaXN0IG9mIHJvd3MuXG4gICAqIC8vXG4gICAqIC8vIE5vdGUgdGhhdCB0aGVzZSByb3dzIGFyZSBoZWxkIGluIG1lbW9yeSB1bnRpbCB0aGVcbiAgICogLy8gYnVsayBsb2FkIHdhcyBwZXJmb3JtZWQsIHNvIGlmIHlvdSBuZWVkIHRvIHdyaXRlIGEgbGFyZ2VcbiAgICogLy8gbnVtYmVyIG9mIHJvd3MgKGUuZy4gYnkgcmVhZGluZyBmcm9tIGEgQ1NWIGZpbGUpLFxuICAgKiAvLyBwYXNzaW5nIGFuIGBBc3luY0l0ZXJhYmxlYCBpcyBhZHZpc2FibGUgdG8ga2VlcCBtZW1vcnkgdXNhZ2UgbG93LlxuICAgKiBjb25uZWN0aW9uLmV4ZWNCdWxrTG9hZChidWxrTG9hZCwgW1xuICAgKiAgIHsgJ2ZpcnN0X25hbWUnOiAnU3RldmUnLCAnbGFzdF9uYW1lJzogJ0pvYnMnLCAnZGF5X29mX2JpcnRoJzogbmV3IERhdGUoJzAyLTI0LTE5NTUnKSB9LFxuICAgKiAgIHsgJ2ZpcnN0X25hbWUnOiAnQmlsbCcsICdsYXN0X25hbWUnOiAnR2F0ZXMnLCAnZGF5X29mX2JpcnRoJzogbmV3IERhdGUoJzEwLTI4LTE5NTUnKSB9XG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGJ1bGtMb2FkIEEgcHJldmlvdXNseSBjcmVhdGVkIFtbQnVsa0xvYWRdXS5cbiAgICogQHBhcmFtIHJvd3MgQSBbW0l0ZXJhYmxlXV0gb3IgW1tBc3luY0l0ZXJhYmxlXV0gdGhhdCBjb250YWlucyB0aGUgcm93cyB0aGF0IHNob3VsZCBiZSBidWxrIGxvYWRlZC5cbiAgICovXG4gIGV4ZWNCdWxrTG9hZChidWxrTG9hZDogQnVsa0xvYWQsIHJvd3M6IEFzeW5jSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9PiB8IEl0ZXJhYmxlPHVua25vd25bXSB8IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106IHVua25vd24gfT4pOiB2b2lkXG5cbiAgZXhlY0J1bGtMb2FkKGJ1bGtMb2FkOiBCdWxrTG9hZCwgcm93cz86IEFzeW5jSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9PiB8IEl0ZXJhYmxlPHVua25vd25bXSB8IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106IHVua25vd24gfT4pIHtcbiAgICBidWxrTG9hZC5leGVjdXRpb25TdGFydGVkID0gdHJ1ZTtcblxuICAgIGlmIChyb3dzKSB7XG4gICAgICBpZiAoYnVsa0xvYWQuc3RyZWFtaW5nTW9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZCBjYW4ndCBiZSBjYWxsZWQgd2l0aCBhIEJ1bGtMb2FkIHRoYXQgd2FzIHB1dCBpbiBzdHJlYW1pbmcgbW9kZS5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWxrTG9hZC5maXJzdFJvd1dyaXR0ZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbi5leGVjQnVsa0xvYWQgY2FuJ3QgYmUgY2FsbGVkIHdpdGggYSBCdWxrTG9hZCB0aGF0IGFscmVhZHkgaGFzIHJvd3Mgd3JpdHRlbiB0byBpdC5cIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd1N0cmVhbSA9IFJlYWRhYmxlLmZyb20ocm93cyk7XG5cbiAgICAgIC8vIERlc3Ryb3kgdGhlIHBhY2tldCB0cmFuc2Zvcm0gaWYgYW4gZXJyb3IgaGFwcGVucyBpbiB0aGUgcm93IHN0cmVhbSxcbiAgICAgIC8vIGUuZy4gaWYgYW4gZXJyb3IgaXMgdGhyb3duIGZyb20gd2l0aGluIGEgZ2VuZXJhdG9yIG9yIHN0cmVhbS5cbiAgICAgIHJvd1N0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtLmRlc3Ryb3koZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEZXN0cm95IHRoZSByb3cgc3RyZWFtIGlmIGFuIGVycm9yIGhhcHBlbnMgaW4gdGhlIHBhY2tldCB0cmFuc2Zvcm0sXG4gICAgICAvLyBlLmcuIGlmIHRoZSBidWxrIGxvYWQgaXMgY2FuY2VsbGVkLlxuICAgICAgYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByb3dTdHJlYW0uZGVzdHJveShlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHJvd1N0cmVhbS5waXBlKGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtKTtcbiAgICB9IGVsc2UgaWYgKCFidWxrTG9hZC5zdHJlYW1pbmdNb2RlKSB7XG4gICAgICAvLyBJZiB0aGUgYnVsa2xvYWQgd2FzIG5vdCBwdXQgaW50byBzdHJlYW1pbmcgbW9kZSBieSB0aGUgdXNlcixcbiAgICAgIC8vIHdlIGVuZCB0aGUgcm93VG9QYWNrZXRUcmFuc2Zvcm0gaGVyZSBmb3IgdGhlbS5cbiAgICAgIC8vXG4gICAgICAvLyBJZiBpdCB3YXMgcHV0IGludG8gc3RyZWFtaW5nIG1vZGUsIGl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eVxuICAgICAgLy8gdG8gZW5kIHRoZSBzdHJlYW0uXG4gICAgICBidWxrTG9hZC5yb3dUb1BhY2tldFRyYW5zZm9ybS5lbmQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbkNhbmNlbCA9ICgpID0+IHtcbiAgICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgQnVsa0xvYWRQYXlsb2FkKGJ1bGtMb2FkKTtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChidWxrTG9hZC5nZXRCdWxrSW5zZXJ0U3FsKCksIChlcnJvcjogKEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH0pIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgYnVsa0xvYWQucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnVU5LTk9XTicpIHtcbiAgICAgICAgICBlcnJvci5tZXNzYWdlICs9ICcgVGhpcyBpcyBsaWtlbHkgYmVjYXVzZSB0aGUgc2NoZW1hIG9mIHRoZSBCdWxrTG9hZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2NoZW1hIG9mIHRoZSB0YWJsZSB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zZXJ0IGludG8uJztcbiAgICAgICAgfVxuICAgICAgICBidWxrTG9hZC5lcnJvciA9IGVycm9yO1xuICAgICAgICBidWxrTG9hZC5jYWxsYmFjayhlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYWtlUmVxdWVzdChidWxrTG9hZCwgVFlQRS5CVUxLX0xPQUQsIHBheWxvYWQpO1xuICAgIH0pO1xuXG4gICAgYnVsa0xvYWQub25jZSgnY2FuY2VsJywgb25DYW5jZWwpO1xuXG4gICAgdGhpcy5leGVjU3FsQmF0Y2gocmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSB0aGUgU1FMIHJlcHJlc2VudGVkIGJ5IHRoZSByZXF1ZXN0LlxuICAgKlxuICAgKiBUaGUgcmVxdWVzdCBjYW4gdGhlbiBiZSB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMgdG9cbiAgICogW1tleGVjdXRlXV0gYW5kIFtbdW5wcmVwYXJlXV1cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKiAgIFBhcmFtZXRlcnMgb25seSByZXF1aXJlIGEgbmFtZSBhbmQgdHlwZS4gUGFyYW1ldGVyIHZhbHVlcyBhcmUgaWdub3JlZC5cbiAgICovXG4gIHByZXBhcmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuSW50LFxuICAgICAgbmFtZTogJ2hhbmRsZScsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgb3V0cHV0OiB0cnVlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdwYXJhbXMnLFxuICAgICAgdmFsdWU6IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGggPyByZXF1ZXN0Lm1ha2VQYXJhbXNQYXJhbWV0ZXIocmVxdWVzdC5wYXJhbWV0ZXJzKSA6IG51bGwsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdzdG10JyxcbiAgICAgIHZhbHVlOiByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgcmVxdWVzdC5wcmVwYXJpbmcgPSB0cnVlO1xuICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gY2xlYW4gdXAgdGhpcyBldmVudCBoYW5kbGVyLCBvdGhlcndpc2UgdGhpcyBsZWFrcyBtZW1vcnlcbiAgICByZXF1ZXN0Lm9uKCdyZXR1cm5WYWx1ZScsIChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGlmIChuYW1lID09PSAnaGFuZGxlJykge1xuICAgICAgICByZXF1ZXN0LmhhbmRsZSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWVzdC5lcnJvciA9IG5ldyBSZXF1ZXN0RXJyb3IoYFRlZGlvdXMgPiBVbmV4cGVjdGVkIG91dHB1dCBwYXJhbWV0ZXIgJHtuYW1lfSBmcm9tIHNwX3ByZXBhcmVgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKCdzcF9wcmVwYXJlJywgcGFyYW1ldGVycywgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMsIHRoaXMuZGF0YWJhc2VDb2xsYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBTUUwgU2VydmVyIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwcmV2aW91c2x5IHByZXBhcmVkIHJlcXVlc3QuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICogICBQYXJhbWV0ZXJzIG9ubHkgcmVxdWlyZSBhIG5hbWUgYW5kIHR5cGUuXG4gICAqICAgUGFyYW1ldGVyIHZhbHVlcyBhcmUgaWdub3JlZC5cbiAgICovXG4gIHVucHJlcGFyZShyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogUGFyYW1ldGVyW10gPSBbXTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5JbnQsXG4gICAgICBuYW1lOiAnaGFuZGxlJyxcbiAgICAgIC8vIFRPRE86IEFib3J0IGlmIGByZXF1ZXN0LmhhbmRsZWAgaXMgbm90IHNldFxuICAgICAgdmFsdWU6IHJlcXVlc3QuaGFuZGxlLFxuICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZCgnc3BfdW5wcmVwYXJlJywgcGFyYW1ldGVycywgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMsIHRoaXMuZGF0YWJhc2VDb2xsYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHByZXZpb3VzbHkgcHJlcGFyZWQgU1FMLCB1c2luZyB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBwcmV2aW91c2x5IHByZXBhcmVkIFtbUmVxdWVzdF1dLlxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAgQW4gb2JqZWN0IHdob3NlIG5hbWVzIGNvcnJlc3BvbmQgdG8gdGhlIG5hbWVzIG9mXG4gICAqICAgcGFyYW1ldGVycyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIFtbUmVxdWVzdF1dIGJlZm9yZSBpdCB3YXMgcHJlcGFyZWQuXG4gICAqICAgVGhlIG9iamVjdCdzIHZhbHVlcyBhcmUgcGFzc2VkIGFzIHRoZSBwYXJhbWV0ZXJzJyB2YWx1ZXMgd2hlbiB0aGVcbiAgICogICByZXF1ZXN0IGlzIGV4ZWN1dGVkLlxuICAgKi9cbiAgZXhlY3V0ZShyZXF1ZXN0OiBSZXF1ZXN0LCBwYXJhbWV0ZXJzPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pIHtcbiAgICBjb25zdCBleGVjdXRlUGFyYW1ldGVyczogUGFyYW1ldGVyW10gPSBbXTtcblxuICAgIGV4ZWN1dGVQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuSW50LFxuICAgICAgbmFtZTogJ2hhbmRsZScsXG4gICAgICAvLyBUT0RPOiBBYm9ydCBpZiBgcmVxdWVzdC5oYW5kbGVgIGlzIG5vdCBzZXRcbiAgICAgIHZhbHVlOiByZXF1ZXN0LmhhbmRsZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByZXF1ZXN0LnBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyID0gcmVxdWVzdC5wYXJhbWV0ZXJzW2ldO1xuXG4gICAgICAgIGV4ZWN1dGVQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICAgIC4uLnBhcmFtZXRlcixcbiAgICAgICAgICB2YWx1ZTogcGFyYW1ldGVyLnR5cGUudmFsaWRhdGUocGFyYW1ldGVycyA/IHBhcmFtZXRlcnNbcGFyYW1ldGVyLm5hbWVdIDogbnVsbCwgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbilcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmVxdWVzdC5lcnJvciA9IGVycm9yO1xuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5kZWJ1Zy5sb2coZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2soZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZCgnc3BfZXhlY3V0ZScsIGV4ZWN1dGVQYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgYSBzdG9yZWQgcHJvY2VkdXJlIHJlcHJlc2VudGVkIGJ5IFtbUmVxdWVzdF1dLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBjYWxsUHJvY2VkdXJlKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0cnkge1xuICAgICAgcmVxdWVzdC52YWxpZGF0ZVBhcmFtZXRlcnModGhpcy5kYXRhYmFzZUNvbGxhdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmVxdWVzdC5lcnJvciA9IGVycm9yO1xuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5kZWJ1Zy5sb2coZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2soZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZChyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSEsIHJlcXVlc3QucGFyYW1ldGVycywgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMsIHRoaXMuZGF0YWJhc2VDb2xsYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuIFJlcXVpcmVkIHdoZW4gYGlzb2xhdGlvbkxldmVsYFxuICAgKiAgIGlzIHByZXNlbnQuXG4gICAqIEBwYXJhbSBpc29sYXRpb25MZXZlbCBUaGUgaXNvbGF0aW9uIGxldmVsIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIHRvIGJlIHJ1biB3aXRoLlxuICAgKlxuICAgKiAgIFRoZSBpc29sYXRpb24gbGV2ZWxzIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLklTT0xBVElPTl9MRVZFTGAuXG4gICAqICAgKiBgUkVBRF9VTkNPTU1JVFRFRGBcbiAgICogICAqIGBSRUFEX0NPTU1JVFRFRGBcbiAgICogICAqIGBSRVBFQVRBQkxFX1JFQURgXG4gICAqICAgKiBgU0VSSUFMSVpBQkxFYFxuICAgKiAgICogYFNOQVBTSE9UYFxuICAgKlxuICAgKiAgIE9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gdGhlIENvbm5lY3Rpb24ncyBpc29sYXRpb24gbGV2ZWwuXG4gICAqL1xuICBiZWdpblRyYW5zYWN0aW9uKGNhbGxiYWNrOiBCZWdpblRyYW5zYWN0aW9uQ2FsbGJhY2ssIG5hbWUgPSAnJywgaXNvbGF0aW9uTGV2ZWwgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsKSB7XG4gICAgYXNzZXJ0VmFsaWRJc29sYXRpb25MZXZlbChpc29sYXRpb25MZXZlbCwgJ2lzb2xhdGlvbkxldmVsJyk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihuYW1lLCBpc29sYXRpb25MZXZlbCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWNTcWxCYXRjaChuZXcgUmVxdWVzdCgnU0VUIFRSQU5TQUNUSU9OIElTT0xBVElPTiBMRVZFTCAnICsgKHRyYW5zYWN0aW9uLmlzb2xhdGlvbkxldmVsVG9UU1FMKCkpICsgJztCRUdJTiBUUkFOICcgKyB0cmFuc2FjdGlvbi5uYW1lLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aCsrO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRlcHRoID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1bmRlZmluZWQsIChlcnIpID0+IHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlRSQU5TQUNUSU9OX01BTkFHRVIsIHRyYW5zYWN0aW9uLmJlZ2luUGF5bG9hZCh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBUaGVyZSBzaG91bGQgYmUgYW4gYWN0aXZlIHRyYW5zYWN0aW9uIC0gdGhhdCBpcywgW1tiZWdpblRyYW5zYWN0aW9uXV1cbiAgICogc2hvdWxkIGhhdmUgYmVlbiBwcmV2aW91c2x5IGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEBwYXJhbSBuYW1lIEEgc3RyaW5nIHJlcHJlc2VudGluZyBhIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxuICAgKiAgIE9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gYW4gZW1wdHkgc3RyaW5nLiBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGBpcyBwcmVzZW50LlxuICAgKi9cbiAgY29tbWl0VHJhbnNhY3Rpb24oY2FsbGJhY2s6IENvbW1pdFRyYW5zYWN0aW9uQ2FsbGJhY2ssIG5hbWUgPSAnJykge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdDT01NSVQgVFJBTiAnICsgdHJhbnNhY3Rpb24ubmFtZSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRGVwdGgtLTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25EZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVuZGVmaW5lZCwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuVFJBTlNBQ1RJT05fTUFOQUdFUiwgdHJhbnNhY3Rpb24uY29tbWl0UGF5bG9hZCh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuXG4gICAqICAgUmVxdWlyZWQgd2hlbiBgaXNvbGF0aW9uTGV2ZWxgIGlzIHByZXNlbnQuXG4gICAqL1xuICByb2xsYmFja1RyYW5zYWN0aW9uKGNhbGxiYWNrOiBSb2xsYmFja1RyYW5zYWN0aW9uQ2FsbGJhY2ssIG5hbWUgPSAnJykge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdST0xMQkFDSyBUUkFOICcgKyB0cmFuc2FjdGlvbi5uYW1lLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aC0tO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRlcHRoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVuZGVmaW5lZCwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuVFJBTlNBQ1RJT05fTUFOQUdFUiwgdHJhbnNhY3Rpb24ucm9sbGJhY2tQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgc2F2ZXBvaW50IHdpdGhpbiBhIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBUaGVyZSBzaG91bGQgYmUgYW4gYWN0aXZlIHRyYW5zYWN0aW9uIC0gdGhhdCBpcywgW1tiZWdpblRyYW5zYWN0aW9uXV1cbiAgICogc2hvdWxkIGhhdmUgYmVlbiBwcmV2aW91c2x5IGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEBwYXJhbSBuYW1lIEEgc3RyaW5nIHJlcHJlc2VudGluZyBhIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxcXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuXG4gICAqICAgUmVxdWlyZWQgd2hlbiBgaXNvbGF0aW9uTGV2ZWxgIGlzIHByZXNlbnQuXG4gICAqL1xuICBzYXZlVHJhbnNhY3Rpb24oY2FsbGJhY2s6IFNhdmVUcmFuc2FjdGlvbkNhbGxiYWNrLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihuYW1lKTtcbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWNTcWxCYXRjaChuZXcgUmVxdWVzdCgnU0FWRSBUUkFOICcgKyB0cmFuc2FjdGlvbi5uYW1lLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aCsrO1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5zYXZlUGF5bG9hZCh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgZ2l2ZW4gY2FsbGJhY2sgYWZ0ZXIgc3RhcnRpbmcgYSB0cmFuc2FjdGlvbiwgYW5kIGNvbW1pdCBvclxuICAgKiByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24gYWZ0ZXJ3YXJkcy5cbiAgICpcbiAgICogVGhpcyBpcyBhIGhlbHBlciB0aGF0IGVtcGxveXMgW1tiZWdpblRyYW5zYWN0aW9uXV0sIFtbY29tbWl0VHJhbnNhY3Rpb25dXSxcbiAgICogW1tyb2xsYmFja1RyYW5zYWN0aW9uXV0sIGFuZCBbW3NhdmVUcmFuc2FjdGlvbl1dIHRvIGdyZWF0bHkgc2ltcGxpZnkgdGhlXG4gICAqIHVzZSBvZiBkYXRhYmFzZSB0cmFuc2FjdGlvbnMgYW5kIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHRyYW5zYWN0aW9uIG5lc3RpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYlxuICAgKiBAcGFyYW0gaXNvbGF0aW9uTGV2ZWxcbiAgICogICBUaGUgaXNvbGF0aW9uIGxldmVsIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIHRvIGJlIHJ1biB3aXRoLlxuICAgKlxuICAgKiAgIFRoZSBpc29sYXRpb24gbGV2ZWxzIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLklTT0xBVElPTl9MRVZFTGAuXG4gICAqICAgKiBgUkVBRF9VTkNPTU1JVFRFRGBcbiAgICogICAqIGBSRUFEX0NPTU1JVFRFRGBcbiAgICogICAqIGBSRVBFQVRBQkxFX1JFQURgXG4gICAqICAgKiBgU0VSSUFMSVpBQkxFYFxuICAgKiAgICogYFNOQVBTSE9UYFxuICAgKlxuICAgKiAgIE9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gdGhlIENvbm5lY3Rpb24ncyBpc29sYXRpb24gbGV2ZWwuXG4gICAqL1xuICB0cmFuc2FjdGlvbihjYjogKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCB0eERvbmU/OiA8VCBleHRlbmRzIFRyYW5zYWN0aW9uRG9uZUNhbGxiYWNrPihlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgZG9uZTogVCwgLi4uYXJnczogQ2FsbGJhY2tQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkKSA9PiB2b2lkLCBpc29sYXRpb25MZXZlbD86IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF0pIHtcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgY2JgIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZVNhdmVwb2ludCA9IHRoaXMuaW5UcmFuc2FjdGlvbjtcbiAgICBjb25zdCBuYW1lID0gJ190ZWRpb3VzXycgKyAoY3J5cHRvLnJhbmRvbUJ5dGVzKDEwKS50b1N0cmluZygnaGV4JykpO1xuICAgIGNvbnN0IHR4RG9uZTogPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbkRvbmVDYWxsYmFjaz4oZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIGRvbmU6IFQsIC4uLmFyZ3M6IENhbGxiYWNrUGFyYW1ldGVyczxUPikgPT4gdm9pZCA9IChlcnIsIGRvbmUsIC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5UcmFuc2FjdGlvbiAmJiB0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLkxPR0dFRF9JTikge1xuICAgICAgICAgIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbigodHhFcnIpID0+IHtcbiAgICAgICAgICAgIGRvbmUodHhFcnIgfHwgZXJyLCAuLi5hcmdzKTtcbiAgICAgICAgICB9LCBuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb25lKGVyciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodXNlU2F2ZXBvaW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aC0tO1xuICAgICAgICB9XG4gICAgICAgIGRvbmUobnVsbCwgLi4uYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbW1pdFRyYW5zYWN0aW9uKCh0eEVycikgPT4ge1xuICAgICAgICAgIGRvbmUodHhFcnIsIC4uLmFyZ3MpO1xuICAgICAgICB9LCBuYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHVzZVNhdmVwb2ludCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2F2ZVRyYW5zYWN0aW9uKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTRVQgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsICcgKyB0aGlzLmdldElzb2xhdGlvbkxldmVsVGV4dChpc29sYXRpb25MZXZlbCksIChlcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYihlcnIsIHR4RG9uZSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCB0eERvbmUpO1xuICAgICAgICB9XG4gICAgICB9LCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuYmVnaW5UcmFuc2FjdGlvbigoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYihudWxsLCB0eERvbmUpO1xuICAgICAgfSwgbmFtZSwgaXNvbGF0aW9uTGV2ZWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWFrZVJlcXVlc3QocmVxdWVzdDogUmVxdWVzdCB8IEJ1bGtMb2FkLCBwYWNrZXRUeXBlOiBudW1iZXIsIHBheWxvYWQ6IChJdGVyYWJsZTxCdWZmZXI+IHwgQXN5bmNJdGVyYWJsZTxCdWZmZXI+KSAmIHsgdG9TdHJpbmc6IChpbmRlbnQ/OiBzdHJpbmcpID0+IHN0cmluZyB9KSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IHRoaXMuU1RBVEUuTE9HR0VEX0lOKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ1JlcXVlc3RzIGNhbiBvbmx5IGJlIG1hZGUgaW4gdGhlICcgKyB0aGlzLlNUQVRFLkxPR0dFRF9JTi5uYW1lICsgJyBzdGF0ZSwgbm90IHRoZSAnICsgdGhpcy5zdGF0ZS5uYW1lICsgJyBzdGF0ZSc7XG4gICAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICAgIHJlcXVlc3QuY2FsbGJhY2sobmV3IFJlcXVlc3RFcnJvcihtZXNzYWdlLCAnRUlOVkFMSURTVEFURScpKTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKG5ldyBSZXF1ZXN0RXJyb3IoJ0NhbmNlbGVkLicsICdFQ0FOQ0VMJykpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYWNrZXRUeXBlID09PSBUWVBFLlNRTF9CQVRDSCkge1xuICAgICAgICB0aGlzLmlzU3FsQmF0Y2ggPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc1NxbEJhdGNoID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0LmNvbm5lY3Rpb24hID0gdGhpcztcbiAgICAgIHJlcXVlc3Qucm93Q291bnQhID0gMDtcbiAgICAgIHJlcXVlc3Qucm93cyEgPSBbXTtcbiAgICAgIHJlcXVlc3QucnN0ISA9IFtdO1xuXG4gICAgICBjb25zdCBvbkNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS51bnBpcGUobWVzc2FnZSk7XG4gICAgICAgIHBheWxvYWRTdHJlYW0uZGVzdHJveShuZXcgUmVxdWVzdEVycm9yKCdDYW5jZWxlZC4nLCAnRUNBTkNFTCcpKTtcblxuICAgICAgICAvLyBzZXQgdGhlIGlnbm9yZSBiaXQgYW5kIGVuZCB0aGUgbWVzc2FnZS5cbiAgICAgICAgbWVzc2FnZS5pZ25vcmUgPSB0cnVlO1xuICAgICAgICBtZXNzYWdlLmVuZCgpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCAmJiByZXF1ZXN0LnBhdXNlZCkge1xuICAgICAgICAgIC8vIHJlc3VtZSB0aGUgcmVxdWVzdCBpZiBpdCB3YXMgcGF1c2VkIHNvIHdlIGNhbiByZWFkIHRoZSByZW1haW5pbmcgdG9rZW5zXG4gICAgICAgICAgcmVxdWVzdC5yZXN1bWUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmNlKCdjYW5jZWwnLCBvbkNhbmNlbCk7XG5cbiAgICAgIHRoaXMuY3JlYXRlUmVxdWVzdFRpbWVyKCk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7IHR5cGU6IHBhY2tldFR5cGUsIHJlc2V0Q29ubmVjdGlvbjogdGhpcy5yZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0IH0pO1xuICAgICAgdGhpcy5tZXNzYWdlSW8ub3V0Z29pbmdNZXNzYWdlU3RyZWFtLndyaXRlKG1lc3NhZ2UpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0NMSUVOVF9SRVFVRVNUKTtcblxuICAgICAgbWVzc2FnZS5vbmNlKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5vbmNlKCdjYW5jZWwnLCB0aGlzLl9jYW5jZWxBZnRlclJlcXVlc3RTZW50KTtcblxuICAgICAgICB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWJ1Zy5wYXlsb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBwYXlsb2FkIS50b1N0cmluZygnICAnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcGF5bG9hZFN0cmVhbSA9IFJlYWRhYmxlLmZyb20ocGF5bG9hZCk7XG4gICAgICBwYXlsb2FkU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHBheWxvYWRTdHJlYW0udW5waXBlKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIE9ubHkgc2V0IGEgcmVxdWVzdCBlcnJvciBpZiBubyBlcnJvciB3YXMgc2V0IHlldC5cbiAgICAgICAgcmVxdWVzdC5lcnJvciA/Pz0gZXJyb3I7XG5cbiAgICAgICAgbWVzc2FnZS5pZ25vcmUgPSB0cnVlO1xuICAgICAgICBtZXNzYWdlLmVuZCgpO1xuICAgICAgfSk7XG4gICAgICBwYXlsb2FkU3RyZWFtLnBpcGUobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBjdXJyZW50bHkgZXhlY3V0ZWQgcmVxdWVzdC5cbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcXVlc3QuY2FuY2VsKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIGNvbm5lY3Rpb24gdG8gaXRzIGluaXRpYWwgc3RhdGUuXG4gICAqIENhbiBiZSB1c2VmdWwgZm9yIGNvbm5lY3Rpb24gcG9vbCBpbXBsZW1lbnRhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKi9cbiAgcmVzZXQoY2FsbGJhY2s6IFJlc2V0Q2FsbGJhY2spIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodGhpcy5nZXRJbml0aWFsU3FsKCksIChlcnIpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0ID0gdHJ1ZTtcbiAgICB0aGlzLmV4ZWNTcWxCYXRjaChyZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzW3RoaXMudHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SXNvbGF0aW9uTGV2ZWxUZXh0KGlzb2xhdGlvbkxldmVsOiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMW2tleW9mIHR5cGVvZiBJU09MQVRJT05fTEVWRUxdKSB7XG4gICAgc3dpdGNoIChpc29sYXRpb25MZXZlbCkge1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuUkVBRF9VTkNPTU1JVFRFRDpcbiAgICAgICAgcmV0dXJuICdyZWFkIHVuY29tbWl0dGVkJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlJFUEVBVEFCTEVfUkVBRDpcbiAgICAgICAgcmV0dXJuICdyZXBlYXRhYmxlIHJlYWQnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuU0VSSUFMSVpBQkxFOlxuICAgICAgICByZXR1cm4gJ3NlcmlhbGl6YWJsZSc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5TTkFQU0hPVDpcbiAgICAgICAgcmV0dXJuICdzbmFwc2hvdCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ3JlYWQgY29tbWl0dGVkJztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29ubmVjdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gQ29ubmVjdGlvbjtcblxuQ29ubmVjdGlvbi5wcm90b3R5cGUuU1RBVEUgPSB7XG4gIElOSVRJQUxJWkVEOiB7XG4gICAgbmFtZTogJ0luaXRpYWxpemVkJyxcbiAgICBldmVudHM6IHt9XG4gIH0sXG4gIENPTk5FQ1RJTkc6IHtcbiAgICBuYW1lOiAnQ29ubmVjdGluZycsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5pbml0aWFsaXNlQ29ubmVjdGlvbigpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX1BSRUxPR0lOOiB7XG4gICAgbmFtZTogJ1NlbnRQcmVsb2dpbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5lbXB0eU1lc3NhZ2VCdWZmZXIoKTtcblxuICAgICAgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKS50aGVuKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZS5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRUb01lc3NhZ2VCdWZmZXIoZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lc3NhZ2Uub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZWxvZ2luUGF5bG9hZCA9IG5ldyBQcmVsb2dpblBheWxvYWQodGhpcy5tZXNzYWdlQnVmZmVyKTtcbiAgICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJlbG9naW5QYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHByZWxvZ2luUGF5bG9hZC5mZWRBdXRoUmVxdWlyZWQgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZmVkQXV0aFJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJlbG9naW5QYXlsb2FkLmVuY3J5cHRpb25TdHJpbmcgPT09ICdPTicgfHwgcHJlbG9naW5QYXlsb2FkLmVuY3J5cHRpb25TdHJpbmcgPT09ICdSRVEnKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLm9wdGlvbnMuZW5jcnlwdCkge1xuICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKFwiU2VydmVyIHJlcXVpcmVzIGVuY3J5cHRpb24sIHNldCAnZW5jcnlwdCcgY29uZmlnIG9wdGlvbiB0byB0cnVlLlwiLCAnRUVOQ1JZUFQnKSk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUlvLnN0YXJ0VGxzKHRoaXMuc2VjdXJlQ29udGV4dCwgdGhpcy5yb3V0aW5nRGF0YT8uc2VydmVyID8/IHRoaXMuY29uZmlnLnNlcnZlciwgdGhpcy5jb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9UTFNTU0xORUdPVElBVElPTik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZExvZ2luN1BhY2tldCgpO1xuXG4gICAgICAgICAgICBjb25zdCB7IGF1dGhlbnRpY2F0aW9uIH0gPSB0aGlzLmNvbmZpZztcbiAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGlvbi50eXBlID09PSAnbnRsbScpIHtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0xPR0lON19XSVRIX05UTE0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgUkVST1VUSU5HOiB7XG4gICAgbmFtZTogJ1JlUm91dGluZycsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jbGVhbnVwQ29ubmVjdGlvbihDTEVBTlVQX1RZUEUuUkVESVJFQ1QpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgIH0sXG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgcmVjb25uZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5DT05ORUNUSU5HKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZOiB7XG4gICAgbmFtZTogJ1RSQU5TSUVOVF9GQUlMVVJFX1JFVFJZJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmN1clRyYW5zaWVudFJldHJ5Q291bnQrKztcbiAgICAgIHRoaXMuY2xlYW51cENvbm5lY3Rpb24oQ0xFQU5VUF9UWVBFLlJFVFJZKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgbWVzc2FnZTogZnVuY3Rpb24oKSB7XG4gICAgICB9LFxuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIHJldHJ5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVSZXRyeVRpbWVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX1RMU1NTTE5FR09USUFUSU9OOiB7XG4gICAgbmFtZTogJ1NlbnRUTFNTU0xOZWdvdGlhdGlvbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKS50aGVuKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZS5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlSW8udGxzSGFuZHNoYWtlRGF0YShkYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbWVzc2FnZS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubWVzc2FnZUlvLnRsc05lZ290aWF0aW9uQ29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZExvZ2luN1BhY2tldCgpO1xuXG4gICAgICAgICAgICBjb25zdCB7IGF1dGhlbnRpY2F0aW9uIH0gPSB0aGlzLmNvbmZpZztcblxuICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZScgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0Jykge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdudGxtJykge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfTlRMTSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpLnRoZW4oKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOOiB7XG4gICAgbmFtZTogJ1NlbnRMb2dpbjdXaXRoU3RhbmRhcmRMb2dpbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKS50aGVuKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBMb2dpbjdUb2tlbkhhbmRsZXIodGhpcyk7XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBoYW5kbGVyKTtcblxuICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIubG9naW5BY2tSZWNlaXZlZCkge1xuICAgICAgICAgICAgaWYgKGhhbmRsZXIucm91dGluZ0RhdGEpIHtcbiAgICAgICAgICAgICAgdGhpcy5yb3V0aW5nRGF0YSA9IGhhbmRsZXIucm91dGluZ0RhdGE7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuUkVST1VUSU5HKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpbkVycm9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dpbkVycm9yLmlzVHJhbnNpZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuZGVidWcubG9nKCdJbml0aWF0aW5nIHJldHJ5IG9uIHRyYW5zaWVudCBlcnJvcicpO1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIHRoaXMubG9naW5FcnJvcik7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKCdMb2dpbiBmYWlsZWQuJywgJ0VMT0dJTicpKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX05UTE06IHtcbiAgICBuYW1lOiAnU2VudExvZ2luN1dpdGhOVExNTG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCkudGhlbigobWVzc2FnZSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ21lc3NhZ2UnLCBtZXNzYWdlKTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTG9naW43VG9rZW5IYW5kbGVyKHRoaXMpO1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG5cbiAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGlmIChoYW5kbGVyLmxvZ2luQWNrUmVjZWl2ZWQpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyLnJvdXRpbmdEYXRhKSB7XG4gICAgICAgICAgICAgIHRoaXMucm91dGluZ0RhdGEgPSBoYW5kbGVyLnJvdXRpbmdEYXRhO1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlJFUk9VVElORyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubnRsbXBhY2tldCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aGVudGljYXRpb24gPSB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvbiBhcyBOdGxtQXV0aGVudGljYXRpb247XG5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgTlRMTVJlc3BvbnNlUGF5bG9hZCh7XG4gICAgICAgICAgICAgIGRvbWFpbjogYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW4sXG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgICBwYXNzd29yZDogYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgICAgbnRsbXBhY2tldDogdGhpcy5udGxtcGFja2V0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW8uc2VuZE1lc3NhZ2UoVFlQRS5OVExNQVVUSF9QS1QsIHBheWxvYWQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubnRsbXBhY2tldCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKS50aGVuKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9naW5FcnJvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9naW5FcnJvci5pc1RyYW5zaWVudCkge1xuICAgICAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnSW5pdGlhdGluZyByZXRyeSBvbiB0cmFuc2llbnQgZXJyb3InKTtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5UUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcignTG9naW4gZmFpbGVkLicsICdFTE9HSU4nKSk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9MT0dJTjdfV0lUSF9GRURBVVRIOiB7XG4gICAgbmFtZTogJ1NlbnRMb2dpbjdXaXRoZmVkYXV0aCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKS50aGVuKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBMb2dpbjdUb2tlbkhhbmRsZXIodGhpcyk7XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBoYW5kbGVyKTtcblxuICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIubG9naW5BY2tSZWNlaXZlZCkge1xuICAgICAgICAgICAgaWYgKGhhbmRsZXIucm91dGluZ0RhdGEpIHtcbiAgICAgICAgICAgICAgdGhpcy5yb3V0aW5nRGF0YSA9IGhhbmRsZXIucm91dGluZ0RhdGE7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuUkVST1VUSU5HKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZmVkQXV0aEluZm9Ub2tlbiA9IGhhbmRsZXIuZmVkQXV0aEluZm9Ub2tlbjtcblxuICAgICAgICAgIGlmIChmZWRBdXRoSW5mb1Rva2VuICYmIGZlZEF1dGhJbmZvVG9rZW4uc3RzdXJsICYmIGZlZEF1dGhJbmZvVG9rZW4uc3BuKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoZW50aWNhdGlvbiA9IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uIGFzIEF6dXJlQWN0aXZlRGlyZWN0b3J5UGFzc3dvcmRBdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpQXBwU2VydmljZUF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlUHJpbmNpcGFsU2VjcmV0O1xuICAgICAgICAgICAgY29uc3QgdG9rZW5TY29wZSA9IG5ldyBVUkwoJy8uZGVmYXVsdCcsIGZlZEF1dGhJbmZvVG9rZW4uc3BuKS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICBjb25zdCBnZXRUb2tlbiA9IChjYWxsYmFjazogKGVycm9yOiBFcnJvciB8IG51bGwsIHRva2VuPzogc3RyaW5nKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGdldFRva2VuRnJvbUNyZWRlbnRpYWxzID0gKGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWwpID0+IHtcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFscy5nZXRUb2tlbih0b2tlblNjb3BlKS50aGVuKCh0b2tlblJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0b2tlblJlc3BvbnNlPy50b2tlbik7XG4gICAgICAgICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVkZW50aWFscyA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbChcbiAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuZG9tYWluID8/ICdjb21tb24nLCAgLy8gdGVuYW50SWRcbiAgICAgICAgICAgICAgICAgICc3Zjk4Y2IwNC1jZDFlLTQwZGYtOTE0MC0zYmY3ZTJjZWE0ZGInLCAgICAgLy8gY2xpZW50SWRcbiAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGdldFRva2VuRnJvbUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2lBcmdzID0gYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCA/IFsgYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCwge30gXSA6IFsge30gXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVkZW50aWFscyA9IG5ldyBNYW5hZ2VkSWRlbnRpdHlDcmVkZW50aWFsKC4uLm1zaUFyZ3MpO1xuXG4gICAgICAgICAgICAgICAgZ2V0VG9rZW5Gcm9tQ3JlZGVudGlhbHMoY3JlZGVudGlhbHMpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVkZW50aWFscyA9IG5ldyBDbGllbnRTZWNyZXRDcmVkZW50aWFsKFxuICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy50ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQsXG4gICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudFNlY3JldFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBnZXRUb2tlbkZyb21DcmVkZW50aWFscyhjcmVkZW50aWFscyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGdldFRva2VuKChlcnIsIHRva2VuKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdTZWN1cml0eSB0b2tlbiBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCBvciBhdXRob3JpemVkLicsICdFRkVEQVVUSCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIHRoaXMubG9naW5FcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5zZW5kRmVkQXV0aFRva2VuTWVzc2FnZSh0b2tlbiEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luRXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ2luRXJyb3IuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5sb2coJ0luaXRpYXRpbmcgcmV0cnkgb24gdHJhbnNpZW50IGVycm9yJyk7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgdGhpcy5sb2dpbkVycm9yKTtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoJ0xvZ2luIGZhaWxlZC4nLCAnRUxPR0lOJykpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIExPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMOiB7XG4gICAgbmFtZTogJ0xvZ2dlZEluU2VuZGluZ0luaXRpYWxTcWwnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuc2VuZEluaXRpYWxTcWwoKTtcblxuICAgICAgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKS50aGVuKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uIHNvY2tldEVycm9yKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgdG9rZW5TdHJlYW1QYXJzZXIgPSB0aGlzLmNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2UsIG5ldyBJbml0aWFsU3FsVG9rZW5IYW5kbGVyKHRoaXMpKTtcblxuICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU4pO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkSW5pdGlhbFNxbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIExPR0dFRF9JTjoge1xuICAgIG5hbWU6ICdMb2dnZWRJbicsXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9DTElFTlRfUkVRVUVTVDoge1xuICAgIG5hbWU6ICdTZW50Q2xpZW50UmVxdWVzdCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5lbXB0eU1lc3NhZ2VCdWZmZXIoKTtcblxuICAgICAgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKS50aGVuKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV4aXQ6IGZ1bmN0aW9uKG5leHRTdGF0ZSkge1xuICAgICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIGNvbnN0IHNxbFJlcXVlc3QgPSB0aGlzLnJlcXVlc3QhO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuXG4gICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soZXJyKTtcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIC8vIHJlcXVlc3QgdGltZXIgaXMgc3RvcHBlZCBvbiBmaXJzdCBkYXRhIHBhY2thZ2VcbiAgICAgICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBuZXcgUmVxdWVzdFRva2VuSGFuZGxlcih0aGlzLCB0aGlzLnJlcXVlc3QhKSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkIGFuZCB3ZSBoYXZlIGEgYGNhbmNlbFRpbWVyYFxuICAgICAgICAvLyBkZWZpbmVkLCB3ZSBzZW5kIGEgYXR0ZW50aW9uIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIHJlcXVlc3QgbWVzc2FnZSB3YXMgZnVsbHkgc2VudCBvZmYuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIGFscmVhZHkgc3RhcnRlZCBjb25zdW1pbmcgdGhlIGN1cnJlbnQgbWVzc2FnZVxuICAgICAgICAvLyAoYnV0IGFsbCB0aGUgdG9rZW4gaGFuZGxlcnMgc2hvdWxkIGJlIG5vLW9wcyksIGFuZFxuICAgICAgICAvLyBuZWVkIHRvIGVuc3VyZSB0aGUgbmV4dCBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICAgIC8vIGBTRU5UX0FUVEVOVElPTmAgc3RhdGUuXG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3Q/LmNhbmNlbGVkICYmIHRoaXMuY2FuY2VsVGltZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0FUVEVOVElPTik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvblJlc3VtZSA9ICgpID0+IHtcbiAgICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5yZXN1bWUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25QYXVzZSA9ICgpID0+IHtcbiAgICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5wYXVzZSgpO1xuXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5vbmNlKCdyZXN1bWUnLCBvblJlc3VtZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0Py5vbigncGF1c2UnLCBvblBhdXNlKTtcblxuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCAmJiB0aGlzLnJlcXVlc3QucGF1c2VkKSB7XG4gICAgICAgICAgb25QYXVzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb25DYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uRW5kT2ZNZXNzYWdlKTtcblxuICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHRoaXMucmVxdWVzdC5wYXVzZWQpIHtcbiAgICAgICAgICAgIC8vIHJlc3VtZSB0aGUgcmVxdWVzdCBpZiBpdCB3YXMgcGF1c2VkIHNvIHdlIGNhbiByZWFkIHRoZSByZW1haW5pbmcgdG9rZW5zXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QucmVzdW1lKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdyZXN1bWUnLCBvblJlc3VtZSk7XG5cbiAgICAgICAgICAvLyBUaGUgYF9jYW5jZWxBZnRlclJlcXVlc3RTZW50YCBjYWxsYmFjayB3aWxsIGhhdmUgc2VudCBhXG4gICAgICAgICAgLy8gYXR0ZW50aW9uIG1lc3NhZ2UsIHNvIG5vdyB3ZSBuZWVkIHRvIGFsc28gc3dpdGNoIHRvXG4gICAgICAgICAgLy8gdGhlIGBTRU5UX0FUVEVOVElPTmAgc3RhdGUgdG8gbWFrZSBzdXJlIHRoZSBhdHRlbnRpb24gYWNrXG4gICAgICAgICAgLy8gbWVzc2FnZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LlxuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9BVFRFTlRJT04pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9uRW5kT2ZNZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdwYXVzZScsIG9uUGF1c2UpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3Jlc3VtZScsIG9uUmVzdW1lKTtcblxuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOKTtcbiAgICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0IGFzIFJlcXVlc3Q7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJyAmJiBzcWxSZXF1ZXN0LmVycm9yICYmIHRoaXMuaXNTcWxCYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soc3FsUmVxdWVzdC5lcnJvciwgc3FsUmVxdWVzdC5yb3dDb3VudCwgc3FsUmVxdWVzdC5yb3dzKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5vbmNlKCdlbmQnLCBvbkVuZE9mTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucmVxdWVzdD8ub25jZSgnY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9BVFRFTlRJT046IHtcbiAgICBuYW1lOiAnU2VudEF0dGVudGlvbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5lbXB0eU1lc3NhZ2VCdWZmZXIoKTtcblxuICAgICAgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKS50aGVuKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKGVycikge1xuICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuXG4gICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soZXJyKTtcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgQXR0ZW50aW9uVG9rZW5IYW5kbGVyKHRoaXMsIHRoaXMucmVxdWVzdCEpO1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG5cbiAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIC8vIDMuMi41LjcgU2VudCBBdHRlbnRpb24gU3RhdGVcbiAgICAgICAgICAvLyBEaXNjYXJkIGFueSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UsIHVudGlsIHdlIHJlY2VpdmUgdGhlIGF0dGVudGlvbiByZXNwb25zZVxuICAgICAgICAgIGlmIChoYW5kbGVyLmF0dGVudGlvblJlY2VpdmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2FuY2VsVGltZXIoKTtcblxuICAgICAgICAgICAgY29uc3Qgc3FsUmVxdWVzdCA9IHRoaXMucmVxdWVzdCE7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTik7XG5cbiAgICAgICAgICAgIGlmIChzcWxSZXF1ZXN0LmVycm9yICYmIHNxbFJlcXVlc3QuZXJyb3IgaW5zdGFuY2VvZiBSZXF1ZXN0RXJyb3IgJiYgc3FsUmVxdWVzdC5lcnJvci5jb2RlID09PSAnRVRJTUVPVVQnKSB7XG4gICAgICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soc3FsUmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzcWxSZXF1ZXN0LmNhbGxiYWNrKG5ldyBSZXF1ZXN0RXJyb3IoJ0NhbmNlbGVkLicsICdFQ0FOQ0VMJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBGSU5BTDoge1xuICAgIG5hbWU6ICdGaW5hbCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jbGVhbnVwQ29ubmVjdGlvbihDTEVBTlVQX1RZUEUuTk9STUFMKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nLCBhcyB0aGUgdGltZXIgc2hvdWxkIGJlIGNsZWFuZWQgdXAuXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgIH0sXG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iXX0=
|