@rljson/io 0.0.62 → 0.0.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/io.js CHANGED
@@ -608,6 +608,36 @@ class PeerSocketMock {
608
608
  connected = false;
609
609
  disconnected = true;
610
610
  // ............................................................................
611
+ /**
612
+ * Removes a specific listener for the specified event.
613
+ * @param eventName - The name of the event.
614
+ * @param listener - The callback function to remove.
615
+ * @returns The PeerSocketMock instance for chaining.
616
+ */
617
+ off(eventName, listener) {
618
+ const listeners = this._listenersMap.get(eventName) || [];
619
+ const index = listeners.indexOf(listener);
620
+ if (index !== -1) {
621
+ listeners.splice(index, 1);
622
+ this._listenersMap.set(eventName, listeners);
623
+ }
624
+ return this;
625
+ }
626
+ // ............................................................................
627
+ /**
628
+ * Removes all listeners for the specified event, or all listeners if no event is specified.
629
+ * @param eventName - (Optional) The name of the event.
630
+ * @returns The PeerSocketMock instance for chaining.
631
+ */
632
+ removeAllListeners(eventName) {
633
+ if (eventName) {
634
+ this._listenersMap.delete(eventName);
635
+ } else {
636
+ this._listenersMap.clear();
637
+ }
638
+ return this;
639
+ }
640
+ // ............................................................................
611
641
  /**
612
642
  * Registers an event listener for the specified event.
613
643
  * @param eventName - The name of the event to listen for.
@@ -689,7 +719,16 @@ class IoPeer {
689
719
  this.isOpen = false;
690
720
  });
691
721
  this._socket.connect();
692
- return;
722
+ return new Promise((resolve) => {
723
+ if (this._socket.connected) {
724
+ this.isOpen = true;
725
+ resolve();
726
+ } else {
727
+ this._socket.on("connect", () => {
728
+ resolve();
729
+ });
730
+ }
731
+ });
693
732
  }
694
733
  // ...........................................................................
695
734
  /**
@@ -698,8 +737,12 @@ class IoPeer {
698
737
  */
699
738
  async close() {
700
739
  if (!this._socket.connected) return;
701
- this._socket.disconnect();
702
- return;
740
+ return new Promise((resolve) => {
741
+ this._socket.on("disconnect", () => {
742
+ resolve();
743
+ });
744
+ this._socket.disconnect();
745
+ });
703
746
  }
704
747
  // ...........................................................................
705
748
  /**
@@ -707,7 +750,9 @@ class IoPeer {
707
750
  * @returns
708
751
  */
709
752
  async isReady() {
710
- return this._socket.connected ? Promise.resolve() : Promise.reject();
753
+ if (!!this._socket && this._socket.connected === true) this.isOpen = true;
754
+ else this.isOpen = false;
755
+ return !!this.isOpen ? Promise.resolve() : Promise.reject();
711
756
  }
712
757
  // ...........................................................................
713
758
  /**
@@ -863,12 +908,14 @@ class IoMulti {
863
908
  * @returns
864
909
  */
865
910
  async init() {
866
- for (const ioMultiIo of this._ios) {
867
- if (!ioMultiIo.io.isOpen) {
911
+ for (let idx = 0; idx < this._ios.length; idx++) {
912
+ const { io } = this._ios[idx];
913
+ if (io.isOpen === false) {
868
914
  throw new Error(
869
915
  "All underlying Io instances must be initialized before initializing IoMulti"
870
916
  );
871
917
  }
918
+ this._ios[idx] = { ...this._ios[idx], id: `io-${idx}` };
872
919
  }
873
920
  this.isOpen = true;
874
921
  return Promise.resolve();
@@ -900,10 +947,10 @@ class IoMulti {
900
947
  */
901
948
  async dump() {
902
949
  if (this.dumpables.length === 0) {
903
- return Promise.reject(new Error("No dumpable Io available"));
950
+ throw new Error("No dumpable Io available");
904
951
  }
905
952
  const dumps = await Promise.all(
906
- this.dumpables.map((dumpable) => dumpable.dump())
953
+ this.dumpables.map(({ io: dumpable }) => dumpable.dump())
907
954
  );
908
955
  return merge(...dumps);
909
956
  }
@@ -915,21 +962,21 @@ class IoMulti {
915
962
  */
916
963
  async dumpTable(request) {
917
964
  if (this.dumpables.length === 0) {
918
- return Promise.reject(new Error("No dumpable Io available"));
965
+ throw new Error("No dumpable Io available");
919
966
  }
920
967
  const dumps = [];
921
- for (const dumpable of this.dumpables) {
922
- const tableExists = await dumpable.tableExists(request.table);
923
- if (tableExists) {
968
+ for (const { io: dumpable } of this.dumpables) {
969
+ try {
924
970
  const dump = await dumpable.dumpTable(request);
925
971
  dumps.push(dump);
972
+ } catch {
973
+ continue;
926
974
  }
927
975
  }
928
- if (dumps.length > 0) {
929
- return merge(...dumps);
930
- } else {
931
- return Promise.reject(new Error(`Table "${request.table}" not found`));
976
+ if (dumps.length === 0) {
977
+ throw new Error(`Table "${request.table}" not found`);
932
978
  }
979
+ return merge(...dumps);
933
980
  }
934
981
  // ...........................................................................
935
982
  /**
@@ -939,15 +986,12 @@ class IoMulti {
939
986
  */
940
987
  async contentType(request) {
941
988
  if (this.readables.length === 0) {
942
- return Promise.reject(new Error("No readable Io available"));
989
+ throw new Error("No readable Io available");
943
990
  }
944
- for (const readable of this.readables) {
945
- const tableExists = await readable.tableExists(request.table);
946
- if (tableExists) {
947
- return readable.contentType(request);
948
- }
991
+ for (const { io: readable } of this.readables) {
992
+ return readable.contentType(request);
949
993
  }
950
- return Promise.reject(new Error(`Table "${request.table}" not found`));
994
+ throw new Error(`Table "${request.table}" not found`);
951
995
  }
952
996
  // ...........................................................................
953
997
  /**
@@ -957,9 +1001,10 @@ class IoMulti {
957
1001
  */
958
1002
  async tableExists(tableKey) {
959
1003
  if (this.readables.length === 0) {
960
- return Promise.reject(new Error("No readable Io available"));
1004
+ throw new Error("No readable Io available");
961
1005
  }
962
- for (const readable of this.readables) {
1006
+ for (let i = 0; i < this.readables.length; i++) {
1007
+ const readable = this.readables[i].io;
963
1008
  const exists = await readable.tableExists(tableKey);
964
1009
  if (exists) {
965
1010
  return true;
@@ -975,10 +1020,10 @@ class IoMulti {
975
1020
  */
976
1021
  createOrExtendTable(request) {
977
1022
  if (this.writables.length === 0) {
978
- return Promise.reject(new Error("No writable Io available"));
1023
+ throw new Error("No writable Io available");
979
1024
  }
980
1025
  const creations = this.writables.map(
981
- (writable) => writable.createOrExtendTable(request)
1026
+ ({ io: writable }) => writable.createOrExtendTable(request)
982
1027
  );
983
1028
  return Promise.all(creations).then(() => Promise.resolve());
984
1029
  }
@@ -987,12 +1032,22 @@ class IoMulti {
987
1032
  * Retrieves the raw table configurations from the highest priority underlying readable Io instance.
988
1033
  * @returns A promise that resolves to an array of table configurations.
989
1034
  */
990
- rawTableCfgs() {
1035
+ async rawTableCfgs() {
991
1036
  if (this.readables.length === 0) {
992
- return Promise.reject(new Error("No readable Io available"));
1037
+ throw new Error("No readable Io available");
1038
+ }
1039
+ const rawTableCfgs = /* @__PURE__ */ new Map();
1040
+ for (const { io: readable } of this.readables) {
1041
+ const cfgs = await readable.rawTableCfgs();
1042
+ if (cfgs.length > 0) {
1043
+ for (const tableCfg of cfgs) {
1044
+ if (!rawTableCfgs.has(tableCfg.key)) {
1045
+ rawTableCfgs.set(tableCfg.key, tableCfg);
1046
+ }
1047
+ }
1048
+ }
993
1049
  }
994
- const readable = this.readables[0];
995
- return readable.rawTableCfgs();
1050
+ return Array.from(rawTableCfgs.values());
996
1051
  }
997
1052
  // ...........................................................................
998
1053
  /**
@@ -1002,38 +1057,85 @@ class IoMulti {
1002
1057
  */
1003
1058
  write(request) {
1004
1059
  if (this.writables.length === 0) {
1005
- return Promise.reject(new Error("No writable Io available"));
1060
+ throw new Error("No writable Io available");
1006
1061
  }
1007
- const writes = this.writables.map((writable) => writable.write(request));
1062
+ const writes = this.writables.map(
1063
+ ({ io: writable }) => writable.write(request)
1064
+ );
1008
1065
  return Promise.all(writes).then(() => Promise.resolve());
1009
1066
  }
1010
1067
  // ...........................................................................
1011
1068
  /**
1012
- * Reads rows from the first underlying readable Io instance that contains the requested table and has matching rows.
1069
+ * Reads rows from a specific table by merging rows from all underlying readable Io instances.
1013
1070
  * @param request An object containing the table name and where clause.
1014
1071
  * @returns A promise that resolves to the read rows.
1015
1072
  */
1016
1073
  async readRows(request) {
1017
1074
  if (this.readables.length === 0) {
1018
- return Promise.reject(new Error("No readable Io available"));
1075
+ throw new Error("No readable Io available");
1019
1076
  }
1020
1077
  let tableExistsAny = false;
1021
- const rows = [];
1078
+ const rows = /* @__PURE__ */ new Map();
1079
+ let type = void 0;
1080
+ let readFrom = "";
1081
+ const errors = [];
1022
1082
  for (const readable of this.readables) {
1023
- const tableExists = await readable.tableExists(request.table);
1024
- tableExistsAny = tableExistsAny || tableExists;
1025
- if (tableExists) {
1026
- const readRows = await readable.readRows(request);
1027
- const tableData = readRows[request.table];
1028
- if (tableData) {
1029
- rows.push(readRows);
1030
- }
1083
+ let tableRows = [];
1084
+ let tableType;
1085
+ try {
1086
+ const { [request.table]: tableData } = await readable.io.readRows(
1087
+ request
1088
+ );
1089
+ tableRows = tableData._data;
1090
+ tableType = tableData._type;
1091
+ tableExistsAny = true;
1092
+ readFrom = readable.id ?? "";
1093
+ } catch (e) {
1094
+ errors.push(e);
1095
+ continue;
1096
+ }
1097
+ type ??= tableType;
1098
+ if (tableRows.length === 0) {
1099
+ continue;
1031
1100
  }
1101
+ for (const tableRow of tableRows) {
1102
+ const ref = tableRow._hash;
1103
+ rows.set(ref, tableRow);
1104
+ }
1105
+ break;
1032
1106
  }
1033
1107
  if (!tableExistsAny) {
1034
- return Promise.reject(new Error(`Table "${request.table}" not found`));
1108
+ if (errors.length === 0) {
1109
+ throw new Error(`Table "${request.table}" not found`);
1110
+ } else {
1111
+ const preciseErrors = errors.filter(
1112
+ (err) => !err.message.includes(`Table "${request.table}" not found`)
1113
+ );
1114
+ if (preciseErrors.length > 0) {
1115
+ throw preciseErrors[0];
1116
+ } else {
1117
+ throw errors[0];
1118
+ }
1119
+ }
1035
1120
  } else {
1036
- return merge(...rows);
1121
+ const rljson = {
1122
+ [request.table]: hip({ _data: Array.from(rows.values()), _type: type })
1123
+ };
1124
+ if (this.writables.length > 0 && rows.size > 0) {
1125
+ for (const writeable of this.writables) {
1126
+ if (writeable.id === readFrom) {
1127
+ continue;
1128
+ }
1129
+ try {
1130
+ await writeable.io.write({
1131
+ data: rljson
1132
+ });
1133
+ } catch {
1134
+ continue;
1135
+ }
1136
+ }
1137
+ }
1138
+ return rljson;
1037
1139
  }
1038
1140
  }
1039
1141
  // ...........................................................................
@@ -1044,12 +1146,12 @@ class IoMulti {
1044
1146
  */
1045
1147
  async rowCount(table) {
1046
1148
  if (this.dumpables.length === 0) {
1047
- return Promise.reject(new Error("No dumpable Io available"));
1149
+ throw new Error("No dumpable Io available");
1048
1150
  }
1049
1151
  const dumpTable = await this.dumpTable({ table });
1050
1152
  const tableData = dumpTable[table];
1051
1153
  if (!tableData) {
1052
- return Promise.reject(new Error(`Table "${table}" not found`));
1154
+ throw new Error(`Table "${table}" not found`);
1053
1155
  }
1054
1156
  return Promise.resolve(tableData._data.length);
1055
1157
  }
@@ -1058,21 +1160,21 @@ class IoMulti {
1058
1160
  * Gets the list of underlying readable Io instances, sorted by priority.
1059
1161
  */
1060
1162
  get readables() {
1061
- return this._ios.filter((ioMultiIo) => ioMultiIo.read).sort((a, b) => a.priority - b.priority).map((ioMultiIo) => ioMultiIo.io);
1163
+ return this._ios.filter((ioMultiIo) => ioMultiIo.read).sort((a, b) => a.priority - b.priority);
1062
1164
  }
1063
1165
  // ...........................................................................
1064
1166
  /**
1065
1167
  * Gets the list of underlying writable Io instances, sorted by priority.
1066
1168
  */
1067
1169
  get writables() {
1068
- return this._ios.filter((ioMultiIo) => ioMultiIo.write).sort((a, b) => a.priority - b.priority).map((ioMultiIo) => ioMultiIo.io);
1170
+ return this._ios.filter((ioMultiIo) => ioMultiIo.write).sort((a, b) => a.priority - b.priority);
1069
1171
  }
1070
1172
  // ...........................................................................
1071
1173
  /**
1072
1174
  * Gets the list of underlying dumpable Io instances, sorted by priority.
1073
1175
  */
1074
1176
  get dumpables() {
1075
- return this._ios.filter((ioMultiIo) => ioMultiIo.dump).sort((a, b) => a.priority - b.priority).map((ioMultiIo) => ioMultiIo.io);
1177
+ return this._ios.filter((ioMultiIo) => ioMultiIo.dump).sort((a, b) => a.priority - b.priority);
1076
1178
  }
1077
1179
  // ...........................................................................
1078
1180
  static example = async () => {
@@ -1092,6 +1194,233 @@ class IoMulti {
1092
1194
  return ioMulti;
1093
1195
  };
1094
1196
  }
1197
+ class IoPeerBridge {
1198
+ constructor(_io, _socket) {
1199
+ this._io = _io;
1200
+ this._socket = _socket;
1201
+ }
1202
+ _eventHandlers = /* @__PURE__ */ new Map();
1203
+ /**
1204
+ * Starts the bridge by setting up connection event handlers and
1205
+ * automatically registering all Io methods.
1206
+ */
1207
+ start() {
1208
+ this._socket.on("connect", () => this._handleConnect());
1209
+ this._socket.on("disconnect", () => this._handleDisconnect());
1210
+ this._registerIoMethods();
1211
+ }
1212
+ /**
1213
+ * Stops the bridge by removing all event handlers.
1214
+ */
1215
+ stop() {
1216
+ this._socket.off("connect", () => this._handleConnect());
1217
+ this._socket.off("disconnect", () => this._handleDisconnect());
1218
+ for (const [eventName, handler] of this._eventHandlers) {
1219
+ this._socket.off(eventName, handler);
1220
+ }
1221
+ this._eventHandlers.clear();
1222
+ }
1223
+ /**
1224
+ * Automatically registers all Io interface methods as socket event handlers.
1225
+ */
1226
+ _registerIoMethods() {
1227
+ const ioMethods = [
1228
+ "init",
1229
+ "isReady",
1230
+ "close",
1231
+ "tableExists",
1232
+ "createOrExtendTable",
1233
+ "write",
1234
+ "readRows",
1235
+ "rowCount",
1236
+ "dumpTable",
1237
+ "dump",
1238
+ "contentType",
1239
+ "rawTableCfgs"
1240
+ ];
1241
+ for (const methodName of ioMethods) {
1242
+ this.registerEvent(methodName);
1243
+ }
1244
+ }
1245
+ /**
1246
+ * Registers a socket event to be translated to an Io method call.
1247
+ *
1248
+ * @param eventName - The socket event name (should match an Io method name)
1249
+ * @param ioMethodName - (Optional) The Io method name if different from eventName
1250
+ */
1251
+ registerEvent(eventName, ioMethodName) {
1252
+ const methodName = ioMethodName || eventName;
1253
+ const handler = (...args) => {
1254
+ const callback = args[args.length - 1];
1255
+ const methodArgs = args.slice(0, -1);
1256
+ const ioMethod = this._io[methodName];
1257
+ if (typeof ioMethod !== "function") {
1258
+ const error = new Error(
1259
+ `Method "${methodName}" not found on Io instance`
1260
+ );
1261
+ if (typeof callback === "function") {
1262
+ callback(null, error);
1263
+ }
1264
+ return;
1265
+ }
1266
+ ioMethod.apply(this._io, methodArgs).then((result) => {
1267
+ if (typeof callback === "function") {
1268
+ callback(result, null);
1269
+ }
1270
+ }).catch((error) => {
1271
+ if (typeof callback === "function") {
1272
+ callback(null, error);
1273
+ }
1274
+ });
1275
+ };
1276
+ this._eventHandlers.set(eventName, handler);
1277
+ this._socket.on(eventName, handler);
1278
+ }
1279
+ /**
1280
+ * Registers multiple socket events at once.
1281
+ *
1282
+ * @param eventNames - Array of event names to register
1283
+ */
1284
+ registerEvents(eventNames) {
1285
+ for (const eventName of eventNames) {
1286
+ this.registerEvent(eventName);
1287
+ }
1288
+ }
1289
+ /**
1290
+ * Unregisters a socket event handler.
1291
+ *
1292
+ * @param eventName - The event name to unregister
1293
+ */
1294
+ unregisterEvent(eventName) {
1295
+ const handler = this._eventHandlers.get(eventName);
1296
+ if (handler) {
1297
+ this._socket.off(eventName, handler);
1298
+ this._eventHandlers.delete(eventName);
1299
+ }
1300
+ }
1301
+ /**
1302
+ * Emits a result back through the socket.
1303
+ *
1304
+ * @param eventName - The event name to emit
1305
+ * @param data - The data to send
1306
+ */
1307
+ emitToSocket(eventName, ...data) {
1308
+ this._socket.emit(eventName, ...data);
1309
+ }
1310
+ /**
1311
+ * Calls an Io method directly and emits the result through the socket.
1312
+ *
1313
+ * @param ioMethodName - The Io method to call
1314
+ * @param socketEventName - The socket event to emit with the result
1315
+ * @param args - Arguments to pass to the Io method
1316
+ */
1317
+ async callIoAndEmit(ioMethodName, socketEventName, ...args) {
1318
+ try {
1319
+ const ioMethod = this._io[ioMethodName];
1320
+ if (typeof ioMethod !== "function") {
1321
+ throw new Error(`Method "${ioMethodName}" not found on Io instance`);
1322
+ }
1323
+ const result = await ioMethod.apply(this._io, args);
1324
+ this._socket.emit(socketEventName, result, null);
1325
+ } catch (error) {
1326
+ this._socket.emit(socketEventName, null, error);
1327
+ }
1328
+ }
1329
+ /* v8 ignore next -- @preserve */
1330
+ _handleConnect() {
1331
+ }
1332
+ /* v8 ignore next -- @preserve */
1333
+ _handleDisconnect() {
1334
+ }
1335
+ /**
1336
+ * Gets the current socket instance.
1337
+ */
1338
+ get socket() {
1339
+ return this._socket;
1340
+ }
1341
+ /**
1342
+ * Gets the current Io instance.
1343
+ */
1344
+ get io() {
1345
+ return this._io;
1346
+ }
1347
+ /**
1348
+ * Returns whether the socket is currently connected.
1349
+ */
1350
+ get isConnected() {
1351
+ return this._socket.connected;
1352
+ }
1353
+ }
1354
+ class IoServer {
1355
+ constructor(_io) {
1356
+ this._io = _io;
1357
+ }
1358
+ _sockets = [];
1359
+ // ...........................................................................
1360
+ /**
1361
+ * Adds a socket to the IoServer instance.
1362
+ * @param socket - The socket to add.
1363
+ */
1364
+ async addSocket(socket) {
1365
+ await this._addTransportLayer(socket);
1366
+ this._sockets.push(socket);
1367
+ }
1368
+ // ...........................................................................
1369
+ /**
1370
+ * Removes a transport layer from the given socket.
1371
+ * @param socket - The socket to remove the transport layer from.
1372
+ */
1373
+ removeSocket(socket) {
1374
+ this._sockets = this._sockets.filter((s) => s !== socket);
1375
+ }
1376
+ // ...........................................................................
1377
+ /**
1378
+ * Adds a transport layer to the given socket.
1379
+ * @param socket - The socket to add the transport layer to.
1380
+ */
1381
+ async _addTransportLayer(socket) {
1382
+ const crud = this._generateTransportLayerCRUD(this._io);
1383
+ for (const [key, fn] of Object.entries(crud)) {
1384
+ socket.on(key, (...args) => {
1385
+ const cb = args[args.length - 1];
1386
+ fn.apply(this, args.slice(0, -1)).then((result) => {
1387
+ cb(result, null);
1388
+ }).catch((err) => {
1389
+ cb(null, err);
1390
+ });
1391
+ });
1392
+ }
1393
+ }
1394
+ // ...........................................................................
1395
+ /**
1396
+ * Creates or extends a table with the given configuration.
1397
+ * @param request - An object containing the table configuration.
1398
+ */
1399
+ async createOrExtendTable(request) {
1400
+ return this._io.createOrExtendTable(request);
1401
+ }
1402
+ // ...........................................................................
1403
+ /**
1404
+ * Generates a transport layer object for the given Io instance.
1405
+ * @param io - The Io instance to generate the transport layer for.
1406
+ * @returns An object containing methods that correspond to the Io interface.
1407
+ */
1408
+ _generateTransportLayerCRUD = (io) => ({
1409
+ init: () => io.init(),
1410
+ close: () => io.close(),
1411
+ isOpen: () => new Promise((resolve) => resolve(io.isOpen)),
1412
+ isReady: () => io.isReady(),
1413
+ dump: () => io.dump(),
1414
+ dumpTable: (request) => io.dumpTable(request),
1415
+ contentType: (request) => io.contentType(request),
1416
+ tableExists: (tableKey) => io.tableExists(tableKey),
1417
+ createOrExtendTable: (request) => this.createOrExtendTable(request),
1418
+ rawTableCfgs: () => io.rawTableCfgs(),
1419
+ write: (request) => io.write(request),
1420
+ readRows: (request) => io.readRows(request),
1421
+ rowCount: (table) => io.rowCount(table)
1422
+ });
1423
+ }
1095
1424
  const exampleTestSetup = () => {
1096
1425
  return {
1097
1426
  io: new IoMem(),
@@ -1362,6 +1691,14 @@ const socketExample = () => ({
1362
1691
  /* v8 ignore next -- @preserve */
1363
1692
  emit() {
1364
1693
  return true;
1694
+ },
1695
+ /* v8 ignore next -- @preserve */
1696
+ off() {
1697
+ return this;
1698
+ },
1699
+ /* v8 ignore next -- @preserve */
1700
+ removeAllListeners() {
1701
+ return this;
1365
1702
  }
1366
1703
  });
1367
1704
  export {
@@ -1369,6 +1706,8 @@ export {
1369
1706
  IoMem,
1370
1707
  IoMulti,
1371
1708
  IoPeer,
1709
+ IoPeerBridge,
1710
+ IoServer,
1372
1711
  IoTools,
1373
1712
  PeerSocketMock,
1374
1713
  SocketMock,
@@ -1377,4 +1716,4 @@ export {
1377
1716
  exampleTestSetup,
1378
1717
  socketExample
1379
1718
  };
1380
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby1kYi1uYW1lLW1hcHBpbmcudHMiLCIuLi9zcmMvaW8tdG9vbHMudHMiLCIuLi9zcmMvaW8tbWVtLnRzIiwiLi4vc3JjL3BlZXItc29ja2V0LW1vY2sudHMiLCIuLi9zcmMvaW8tcGVlci50cyIsIi4uL3NyYy9pby1tdWx0aS50cyIsIi4uL3NyYy9pby10ZXN0LXNldHVwLnRzIiwiLi4vc3JjL2lvLnRzIiwiLi4vc3JjL3JldmVyc2UtcmVmLnRzIiwiLi4vc3JjL3NvY2tldC1tb2NrLnRzIiwiLi4vc3JjL3NvY2tldC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuZXhwb3J0IGNsYXNzIElvRGJOYW1lTWFwcGluZyB7XG4gIC8vIFRoZSBwcmltYXJ5IGtleSBjb2x1bW4gaXMgYWx3YXlzIG5hbWVkICdfaGFzaCdcbiAgcHVibGljIHByaW1hcnlLZXlDb2x1bW46IHN0cmluZyA9ICdfaGFzaCc7XG4gIHB1YmxpYyBkYXRhU2VjdGlvbjogc3RyaW5nID0gJ19kYXRhJztcbiAgcHVibGljIHR5cGVDb2x1bW46IHN0cmluZyA9ICd0eXBlJztcbiAgcHVibGljIGtleUNvbHVtbjogc3RyaW5nID0gJ2tleSc7XG5cbiAgLy8gTmFtZXMgZm9yIHRoZSBtYWluIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2VcbiAgcHVibGljIHRhYmxlTmFtZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgbWFpbjogJ3RhYmxlQ2ZncycsXG4gICAgcmV2aXNpb246ICdyZXZpc2lvbnMnLFxuICB9O1xuXG4gIC8vLyBTdWZmaXggaGFuZGxpbmcgZm9yIHRoZSBkYXRhYmFzZVxuICBwcml2YXRlIF9zdWZmaXg6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgY29sOiAnX2NvbCcsXG4gICAgdGJsOiAnX3RibCcsXG4gICAgdG1wOiAnX3RtcCcsXG4gIH07XG5cbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgLy8gYWRkIGFuZCByZW1vdmUgc3VmZml4ZXMgZm9yIHVzZSBpbiBTUUwgc3RhdGVtZW50c1xuICBwcml2YXRlIF9hZGRGaXgobmFtZTogc3RyaW5nLCBmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoZml4KSA/IG5hbWUgOiBuYW1lICsgZml4O1xuICB9XG5cbiAgcHVibGljIGFkZFRhYmxlU3VmZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZEZpeChuYW1lLCB0aGlzLl9zdWZmaXgudGJsKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRDb2x1bW5TdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkRml4KG5hbWUsIHRoaXMuX3N1ZmZpeC5jb2wpO1xuICB9XG5cbiAgcHVibGljIGFkZFRtcFN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hZGRGaXgobmFtZSwgdGhpcy5fc3VmZml4LnRtcCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVGaXgobmFtZTogc3RyaW5nLCBmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoZml4KSA/IG5hbWUuc2xpY2UoMCwgLWZpeC5sZW5ndGgpIDogbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVUYWJsZVN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdmVGaXgobmFtZSwgdGhpcy5fc3VmZml4LnRibCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29sdW1uU3VmZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZUZpeChuYW1lLCB0aGlzLl9zdWZmaXguY29sKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVUbXBTdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlRml4KG5hbWUsIHRoaXMuX3N1ZmZpeC50bXApO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG4gIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuZXhwb3J0IHR5cGUgSW9PYnNlcnZlciA9IChkYXRhOiBSbGpzb24pID0+IHZvaWQ7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpbyBUaGUgSW8gaW50ZXJmYWNlIHRvIHVzZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlvOiBJbykge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGVDZmdzIHRhYmxlLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZUNmZ3NUYWJsZUNmZygpIHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGhpcDxUYWJsZUNmZz4oe1xuICAgICAgX2hhc2g6ICcnLFxuICAgICAga2V5OiAndGFibGVDZmdzJyxcbiAgICAgIHR5cGU6ICd0YWJsZUNmZ3MnLFxuICAgICAgaXNIZWFkOiBmYWxzZSxcbiAgICAgIGlzUm9vdDogZmFsc2UsXG4gICAgICBpc1NoYXJlZDogdHJ1ZSxcbiAgICAgIHByZXZpb3VzOiAnJyxcblxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAga2V5OiAnX2hhc2gnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdIYXNoJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdSb3cgSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdrZXknLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdLZXknLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1RhYmxlIEtleScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICd0eXBlJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnVHlwZScsXG4gICAgICAgICAgdGl0bGVMb25nOiAnQ29udGVudCBUeXBlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzSGVhZCcsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdJcyBIZWFkJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdJcyBIZWFkIFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzUm9vdCcsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdJcyBSb290JyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdJcyBSb290IFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzU2hhcmVkJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ0lzIFNoYXJlZCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnSXMgU2hhcmVkIFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ3ByZXZpb3VzJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnUHJldmlvdXMnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1ByZXZpb3VzIFRhYmxlIENvbmZpZ3VyYXRpb24gSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdjb2x1bW5zJyxcbiAgICAgICAgICB0eXBlOiAnanNvbkFycmF5JyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnQ29sdW1ucycsXG4gICAgICAgICAgdGl0bGVMb25nOiAnQ29sdW1uIENvbmZpZ3VyYXRpb25zJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGFibGVDZmc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHJldmlzaW9ucyB0YWJsZS5cbiAgICovXG4gIGluaXRSZXZpc2lvbnNUYWJsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZzogVGFibGVDZmcgPSB7XG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ3JldmlzaW9ucycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ19oYXNoJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnSGFzaCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnUm93IEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAndGFibGUnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdUYWJsZScsXG4gICAgICAgICAgdGl0bGVMb25nOiAnVGFibGUgS2V5JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ3ByZWRlY2Vzc29yJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnUHJlZGVjZXNzb3InLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1ByZWRlY2Vzc29yIFJldmlzaW9uIEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAnc3VjY2Vzc29yJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnU3VjY2Vzc29yJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdTdWNjZXNzb3IgUmV2aXNpb24gSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICd0aW1lc3RhbXAnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdUaW1lc3RhbXAnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1JldmlzaW9uIFRpbWVzdGFtcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdpZCcsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ0lEJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdSZXZpc2lvbiBJRCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLmlvLmNyZWF0ZU9yRXh0ZW5kVGFibGUoeyB0YWJsZUNmZyB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRXhhbXBsZSBvYmplY3QgZm9yIHRlc3QgcHVycG9zZXNcbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgaW8gdG9vbHNcbiAgICovXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICBhd2FpdCBpby5pc1JlYWR5KCk7XG4gICAgcmV0dXJuIG5ldyBJb1Rvb2xzKGlvKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdFxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZSk7XG4gICAgaWYgKCFleGlzdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgYW55IG9mIHRoZSB0YWJsZXMgaW4gcmxqc29uIGRvIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gcmxqc29uIC0gVGhlIFJsanNvbiBvYmplY3QgdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlc0RvTm90RXhpc3Qocmxqc29uOiBSbGpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhybGpzb24sIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlS2V5KTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZUtleX1cIiBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbWlzc2luZ1RhYmxlcyA9IChlIGFzIEFycmF5PGFueT4pLm1hcCgoZSkgPT4gZS50YWJsZUtleSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgdGFibGVzIGRvIG5vdCBleGlzdDogJHttaXNzaW5nVGFibGVzLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGFibGUgY2ZncyBvZiBhbGwgdGFibGVzXG4gICAqIEByZXR1cm5zIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIGFsbCB0YWJsZXNcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSBhd2FpdCB0aGlzLmlvLnJhd1RhYmxlQ2ZncygpO1xuXG4gICAgLy8gVGFrZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCB0eXBlIGtleVxuICAgIGNvbnN0IG5ld2VzdFZlcnNpb246IFJlY29yZDxUYWJsZUtleSwgVGFibGVDZmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IHRhYmxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXNbaV07XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ld2VzdFZlcnNpb25bdGFibGUua2V5XTtcbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPCB0YWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV0gPSB0YWJsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSB0YWJsZXMgYnkga2V5XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IE9iamVjdC52YWx1ZXMobmV3ZXN0VmVyc2lvbikuc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKGEua2V5IDwgYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEua2V5ID4gYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IHdpdGggYWxsIHRhYmxlIG5hbWVzXG4gICAqL1xuICBhc3luYyBhbGxUYWJsZUtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB0aGlzLnRhYmxlQ2ZncygpKS5tYXAoKGUpID0+IGUua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmcodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZz4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh0YWJsZSk7XG4gICAgaWYgKCF0YWJsZUNmZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnITtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGUgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cblxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmdPck51bGwodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZyB8IG51bGw+IHtcbiAgICBjb25zdCB0YWJsZUNmZ3MgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZncygpO1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gdGFibGVDZmdzLmZpbmQoKGUpID0+IGUua2V5ID09PSB0YWJsZSk7XG4gICAgcmV0dXJuIHRhYmxlQ2ZnID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbHVtbiBuYW1lcyBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyBhbGxDb2x1bW5LZXlzKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gY2hlY2tcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgdGFibGU6IFRhYmxlS2V5LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcbiAgICApO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGNvbHVtbnMgZG8gbm90IGV4aXN0IGluIHRhYmxlIFwiJHt0YWJsZX1cIjogJHttaXNzaW5nQ29sdW1ucy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICAgIGlmIChkZWxldGVkQ29sdW1uS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZGVsZXRlZENvbHVtbnMgPSBkZWxldGVkQ29sdW1uS2V5cy5qb2luKCcsICcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IENvbHVtbnMgbXVzdCBub3QgYmUgZGVsZXRlZC4gYCArXG4gICAgICAgICAgICAgIGBEZWxldGVkIGNvbHVtbnM6ICR7ZGVsZXRlZENvbHVtbnN9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiBrZXlzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIGtleXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBcIiR7YmVmb3JlfVwiIHdhcyByZW5hbWVkIGludG8gXCIke2FmdGVyfVwiLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiB0eXBlcyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiB0eXBlcyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgVHlwZSBvZiBjb2x1bW4gXCIke2NvbHVtbn1cIiB3YXMgY2hhbmdlZCBmcm9tIFwiJHtiZWZvcmV9XCIgdG8gJHthZnRlcn0uYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgZGF0YSBpbiB0aGUgdGFibGUgZG8gbm90IG1hdGNoIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcoZGF0YTogUmxqc29uKSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhkYXRhLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZUtleSk7XG4gICAgICBjb25zdCB0YWJsZSA9IGRhdGFbdGFibGVLZXldO1xuXG4gICAgICAvLyBJZ25vcmUgdGFibGVDZmdzIHRhYmxlXG4gICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICAgIGlmICh0YWJsZS5fdHlwZSA9PT0gJ3RhYmxlQ2ZncycpIHJldHVybjtcblxuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVSbGpzb25BZ2FpbnN0VGFibGVDZmcodGFibGUuX2RhdGEsIHRhYmxlQ2ZnKSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRhYmxlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbmZpZ3VyYXRpb24uXFxuXFxuRXJyb3JzOlxcbiR7ZXJyb3JzXG4gICAgICAgICAgLm1hcCgoZSkgPT4gYC0gJHtlfWApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgZGF0YSBvZiBhIHRhYmxlIGJ5IHRoZSBoYXNoIGFuZCB1cGRhdGVzIHRoZSB0YWJsZSBoYXNoIGluIHBsYWNlXG4gICAqL1xuICBzb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZTogVGFibGVUeXBlKTogdm9pZCB7XG4gICAgdGFibGUuX2RhdGEuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgaGFzaEEgPSBhLl9oYXNoIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGhhc2hCID0gYi5faGFzaCBhcyBzdHJpbmc7XG4gICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICAgIGlmIChoYXNoQSA8IGhhc2hCKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgaWYgKGhhc2hBID4gaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwge1xuICAgICAgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlLFxuICAgICAgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IGhpcCwgaHNoIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7IElzUmVhZHkgfSBmcm9tICdAcmxqc29uL2lzLXJlYWR5JztcbmltcG9ydCB7IGNvcHksIGVxdWFscywgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIENvbnRlbnRUeXBlLFxuICBpdGVyYXRlVGFibGVzU3luYyxcbiAgUmxqc29uLFxuICBUYWJsZUNmZyxcbiAgVGFibGVLZXksXG4gIFRhYmxlVHlwZSxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb1Rvb2xzIH0gZnJvbSAnLi9pby10b29scy50cyc7XG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuXG4vKipcbiAqIEluLU1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmxqc29uIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvTWVtIGltcGxlbWVudHMgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gQ29uc3RydWN0b3IgJiBleGFtcGxlXG5cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IG5ldyBJb01lbSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICByZXR1cm4gaW87XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWFkeS5wcm9taXNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXAoKTtcbiAgfVxuXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXBUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBNZXRhIERhdGFcblxuICBhc3luYyBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudFR5cGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XG4gICAgcmV0dXJuIHRhYmxlcztcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfdHlwZTogJ3RhYmxlQ2ZncycsXG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiBuZXdDb25maWcudHlwZSxcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGhpcy5fbWVtLnRhYmxlQ2Zncyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtuZXdDb25maWcua2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX3RhYmxlQ2ZnID0gbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZztcblxuICAgIC8vIFVwZGF0ZSB0aGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIHJldHVybiAodGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZSkuX3R5cGU7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2gob2xkVGFibGUpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsYyBtYWluIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICAgIHJlcXVlc3QudGFibGUsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0LndoZXJlKSxcbiAgICApO1xuXG4gICAgLy8gUmVhZCB0YWJsZSBmcm9tIGRhdGFcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAvLyBGaWx0ZXIgdGFibGUgZGF0YVxuICAgIGNvbnN0IHRhYmxlRGF0YUZpbHRlcmVkID0gdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgY29uc3QgYSA9IHJvd1tjb2x1bW5dO1xuICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICBpZiAoYiA9PT0gbnVsbCAmJiBhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiB0YWJsZVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQ6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiB0YWJsZS5fdHlwZSxcbiAgICAgIF9kYXRhOiB0YWJsZURhdGFGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZUZpbHRlcmVkKTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB0YWJsZUZpbHRlcmVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQudHMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQZWVyU29ja2V0TW9jayBpbXBsZW1lbnRzIFNvY2tldCB7XG4gIHByaXZhdGUgX2xpc3RlbmVyc01hcDogTWFwPHN0cmluZyB8IHN5bWJvbCwgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPj4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBjb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzY29ubmVjdGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pbzogSW8pIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgZXZlbnQgaXMgZW1pdHRlZC5cbiAgICogQHJldHVybnMgVGhlIFBlZXJTb2NrZXRNb2NrIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICovXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNNYXAuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVyc01hcC5zZXQoZXZlbnROYW1lLCBbXSk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyc01hcC5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFNpbXVsYXRlcyBhIGNvbm5lY3Rpb24gZXZlbnQuXG4gICAqXG4gICAqIEVtaXRzIHRoZSAnY29ubmVjdCcgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICAgKi9cbiAgY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc01hcC5nZXQoJ2Nvbm5lY3QnKSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNiIG9mIGxpc3RlbmVycykge1xuICAgICAgY2Ioe30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogU2ltdWxhdGVzIGEgZGlzY29ubmVjdGlvbiBldmVudC5cbiAgICpcbiAgICogRW1pdHMgdGhlICdkaXNjb25uZWN0JyBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXG4gICAqL1xuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzTWFwLmdldCgnZGlzY29ubmVjdCcpIHx8IFtdO1xuICAgIGZvciAoY29uc3QgY2Igb2YgbGlzdGVuZXJzKSB7XG4gICAgICBjYih7fSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQsIGludm9raW5nIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgSW8gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZW1pdC5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZW1pdChldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBib29sZWFuIHtcbiAgICBjb25zdCBmbiA9ICh0aGlzLl9pbyBhcyBhbnkpW2V2ZW50TmFtZV0gYXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT47XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50TmFtZS50b1N0cmluZygpfSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IGNiID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGZuLmFwcGx5KHRoaXMuX2lvLCBhcmdzLnNsaWNlKDAsIC0xKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgY2IocmVzdWx0LCBudWxsKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjYihudWxsLCBlcnIpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBDb250ZW50VHlwZSwgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcbmltcG9ydCB7IFBlZXJTb2NrZXRNb2NrIH0gZnJvbSAnLi9wZWVyLXNvY2tldC1tb2NrLnRzJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4vc29ja2V0LnRzJztcblxuZXhwb3J0IGNsYXNzIElvUGVlciBpbXBsZW1lbnRzIElvIHtcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc29ja2V0OiBTb2NrZXQpIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKlxuICAgKiBJbml0aWFsaXplcyB0aGUgUGVlciBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBVcGRhdGUgaXNPcGVuIG9uIGNvbm5lY3QvZGlzY29ubmVjdFxuICAgIHRoaXMuX3NvY2tldC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLl9zb2NrZXQub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgLy8gQ29ubmVjdCB0aGUgc29ja2V0XG4gICAgdGhpcy5fc29ja2V0LmNvbm5lY3QoKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBQZWVyIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIERpc2Nvbm5lY3QgdGhlIHNvY2tldFxuICAgIGlmICghdGhpcy5fc29ja2V0LmNvbm5lY3RlZCkgcmV0dXJuO1xuICAgIHRoaXMuX3NvY2tldC5kaXNjb25uZWN0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIFBlZXIgY29ubmVjdGlvbiBpcyByZWFkeS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvY2tldC5jb25uZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVqZWN0KCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIER1bXBzIHRoZSBlbnRpcmUgZGF0YWJhc2UgY29udGVudC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGR1bXBlZCBkYXRhYmFzZSBjb250ZW50LlxuICAgKi9cbiAgYXN5bmMgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCBkdW1wLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCdkdW1wJywgKGRhdGE6IFJsanNvbikgPT4ge1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIER1bXBzIGEgc3BlY2lmaWMgdGFibGUgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBuYW1lIHRvIGR1bXAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkdW1wZWQgdGFibGUgZGF0YS5cbiAgICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgZHVtcFRhYmxlLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCdkdW1wVGFibGUnLCByZXF1ZXN0LCAoZGF0YTogUmxqc29uLCBlcnJvcj86IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZW50IHR5cGUgb2YgYSBzcGVjaWZpYyB0YWJsZS5cbiAgICogQHBhcmFtIHJlcXVlc3QgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgdG8gZ2V0IHRoZSBjb250ZW50IHR5cGUgZm9yLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUuXG4gICAqL1xuICBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCBjb250ZW50VHlwZSwgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgKGRhdGE6IENvbnRlbnRUeXBlLCBlcnJvcj86IEVycm9yKSA9PiB7XG4gICAgICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICAgICAgaWYgKGVycm9yKSByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzcGVjaWZpYyB0YWJsZSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gdGFibGVLZXkgVGhlIGtleSBvZiB0aGUgdGFibGUgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdGFibGUgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgdGFibGVFeGlzdHMsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3RhYmxlRXhpc3RzJywgdGFibGVLZXksIChleGlzdHM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgcmVzb2x2ZShleGlzdHMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIENyZWF0ZXMgb3IgZXh0ZW5kcyBhIHRhYmxlIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB0YWJsZSBpcyBjcmVhdGVkIG9yIGV4dGVuZGVkLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgY3JlYXRlT3JFeHRlbmRUYWJsZSwgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ2NyZWF0ZU9yRXh0ZW5kVGFibGUnLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICAoXz86IGJvb2xlYW4sIGVycm9yPzogRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByYXcgdGFibGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHRhYmxlIGNvbmZpZ3VyYXRpb25zLlxuICAgKi9cbiAgcmF3VGFibGVDZmdzKCk6IFByb21pc2U8VGFibGVDZmdbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCByYXdUYWJsZUNmZ3MsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3Jhd1RhYmxlQ2ZncycsIChkYXRhOiBUYWJsZUNmZ1tdKSA9PiB7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogV3JpdGVzIGRhdGEgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZGF0YSBpcyB3cml0dGVuLlxuICAgKi9cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBSZXF1ZXN0IHdyaXRlLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCd3cml0ZScsIHJlcXVlc3QsIChfPzogYm9vbGVhbiwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBSZWFkcyByb3dzIGZyb20gYSBzcGVjaWZpYyB0YWJsZSB0aGF0IG1hdGNoIHRoZSBnaXZlbiBjcml0ZXJpYS5cbiAgICogQHBhcmFtIHJlcXVlc3QgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgYW5kIHRoZSBjcml0ZXJpYSBmb3Igc2VsZWN0aW5nIHJvd3MuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzZWxlY3RlZCByb3dzLlxuICAgKi9cbiAgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCByZWFkUm93cywgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ3JlYWRSb3dzJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgKHJlc3VsdD86IFJsanNvbiwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCEpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIHNwZWNpZmljIHRhYmxlLlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGNvdW50IHJvd3MgaW4uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlLlxuICAgKi9cbiAgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3Qgcm93Q291bnQsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3Jvd0NvdW50JywgdGFibGUsIChjb3VudD86IG51bWJlciwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJlc29sdmUoY291bnQhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvTWVtID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGNvbnN0IHNvY2tldCA9IG5ldyBQZWVyU29ja2V0TW9jayhpb01lbSk7XG4gICAgY29uc3QgaW8gPSBuZXcgSW9QZWVyKHNvY2tldCk7XG4gICAgYXdhaXQgaW8uaW5pdCgpO1xuICAgIHJldHVybiBpbztcbiAgfTtcbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUsIG1lcmdlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIENvbnRlbnRUeXBlLFxuICBSbGpzb24sXG4gIFRhYmxlQ2ZnLFxuICBUYWJsZUtleSxcbiAgVGFibGVUeXBlLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW9QZWVyIH0gZnJvbSAnLi9pby1wZWVyLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5pbXBvcnQgeyBQZWVyU29ja2V0TW9jayB9IGZyb20gJy4vcGVlci1zb2NrZXQtbW9jay50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyBhbiBJbyBpbnN0YW5jZSBhbG9uZyB3aXRoIGl0cyBjYXBhYmlsaXRpZXMgYW5kIHByaW9yaXR5LlxuICovXG5leHBvcnQgdHlwZSBJb011bHRpSW8gPSB7XG4gIGlvOiBJbztcbiAgcHJpb3JpdHk6IG51bWJlcjtcbiAgcmVhZDogYm9vbGVhbjtcbiAgd3JpdGU6IGJvb2xlYW47XG4gIGR1bXA6IGJvb2xlYW47XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogTXVsdGkgSW8gaW1wbGVtZW50YXRpb24gdGhhdCBjb21iaW5lcyBtdWx0aXBsZSB1bmRlcmx5aW5nIElvIGluc3RhbmNlc1xuICogd2l0aCBkaWZmZXJlbnQgY2FwYWJpbGl0aWVzIChyZWFkLCB3cml0ZSwgZHVtcCkgYW5kIHByaW9yaXRpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb011bHRpIGltcGxlbWVudHMgSW8ge1xuICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pb3M6IEFycmF5PElvTXVsdGlJbz4pIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKlxuICAgKiBJbml0aWFsaXplcyBhbGwgdW5kZXJseWluZyBJbyBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgaW9NdWx0aUlvIG9mIHRoaXMuX2lvcykge1xuICAgICAgaWYgKCFpb011bHRpSW8uaW8uaXNPcGVuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQWxsIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGluaXRpYWxpemluZyBJb011bHRpJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDbG9zZXMgYWxsIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5faW9zLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8uY2xvc2UoKSkpO1xuXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIGFsbCB1bmRlcmx5aW5nIElvIGluc3RhbmNlcyBhcmUgcmVhZHkuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBpc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX2lvcy5tYXAoKGlvTXVsdGlJbykgPT4gaW9NdWx0aUlvLmlvLmlzUmVhZHkoKSksXG4gICAgKS50aGVuKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRHVtcHMgdGhlIGVudGlyZSBkYXRhYmFzZSBjb250ZW50IGJ5IG1lcmdpbmcgZHVtcHMgZnJvbSBhbGwgZHVtcGFibGUgdW5kZXJseWluZyBJbyBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMuZHVtcGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gZHVtcGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1bXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLmR1bXBhYmxlcy5tYXAoKGR1bXBhYmxlKSA9PiBkdW1wYWJsZS5kdW1wKCkpLFxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoLi4uZHVtcHMpIGFzIFJsanNvbjtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRHVtcHMgYSBzcGVjaWZpYyB0YWJsZSBieSBtZXJnaW5nIGR1bXBzIGZyb20gYWxsIGR1bXBhYmxlIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzIHRoYXQgY29udGFpbiB0aGUgdGFibGUuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBuYW1lIHRvIGR1bXAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkdW1wZWQgdGFibGUgZGF0YS5cbiAgICovXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMuZHVtcGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gZHVtcGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1bXBzOiBSbGpzb25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkdW1wYWJsZSBvZiB0aGlzLmR1bXBhYmxlcykge1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCBkdW1wYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIGlmICh0YWJsZUV4aXN0cykge1xuICAgICAgICBjb25zdCBkdW1wID0gYXdhaXQgZHVtcGFibGUuZHVtcFRhYmxlKHJlcXVlc3QpO1xuICAgICAgICBkdW1wcy5wdXNoKGR1bXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkdW1wcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbWVyZ2UoLi4uZHVtcHMpIGFzIFJsanNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVGFibGUgXCIke3JlcXVlc3QudGFibGV9XCIgbm90IGZvdW5kYCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHR5cGUgb2YgYSBzcGVjaWZpYyB0YWJsZSBmcm9tIHRoZSBmaXJzdCB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHRhYmxlLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgdGFibGUgbmFtZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWFkYWJsZSBvZiB0aGlzLnJlYWRhYmxlcykge1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCByZWFkYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbHNlIC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgaWYgKHRhYmxlRXhpc3RzKSB7XG4gICAgICAgIHJldHVybiByZWFkYWJsZS5jb250ZW50VHlwZShyZXF1ZXN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVGFibGUgXCIke3JlcXVlc3QudGFibGV9XCIgbm90IGZvdW5kYCkpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzcGVjaWZpYyB0YWJsZSBleGlzdHMgaW4gYW55IG9mIHRoZSB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHRhYmxlS2V5IFRoZSBrZXkgb2YgdGhlIHRhYmxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSB0YWJsZSBleGlzdHMgaW4gYW55IHJlYWRhYmxlIElvLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWFkYWJsZSBvZiB0aGlzLnJlYWRhYmxlcykge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgcmVhZGFibGUudGFibGVFeGlzdHModGFibGVLZXkpO1xuICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDcmVhdGVzIG9yIGV4dGVuZHMgYSB0YWJsZSBpbiBhbGwgdW5kZXJseWluZyB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB0YWJsZSBoYXMgYmVlbiBjcmVhdGVkIG9yIGV4dGVuZGVkIGluIGFsbCB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqL1xuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy53cml0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyB3cml0YWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuICAgIC8vQ3JlYXRlIG9yIGV4dGVuZCB0YWJsZSBpbiBhbGwgd3JpdGFibGVzIGluIHBhcmFsbGVsIGFuZCByZXNvbHZlIHdoZW4gYWxsIGhhdmUgY29tcGxldGVkXG4gICAgY29uc3QgY3JlYXRpb25zID0gdGhpcy53cml0YWJsZXMubWFwKCh3cml0YWJsZSkgPT5cbiAgICAgIHdyaXRhYmxlLmNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCksXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoY3JlYXRpb25zKS50aGVuKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByYXcgdGFibGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgaGlnaGVzdCBwcmlvcml0eSB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB0YWJsZSBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgLy9TaW1wbGUgc3RyYXRlZ3k6IHVzZSB0aGUgaGlnaGVzdCBwcmlvcml0eSByZWFkYWJsZSBJb1xuICAgIGNvbnN0IHJlYWRhYmxlID0gdGhpcy5yZWFkYWJsZXNbMF07XG5cbiAgICByZXR1cm4gcmVhZGFibGUucmF3VGFibGVDZmdzKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFdyaXRlcyBkYXRhIHRvIGFsbCB1bmRlcmx5aW5nIHdyaXRhYmxlIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHJlcXVlc3QgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIGFsbCB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqL1xuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMud3JpdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gd3JpdGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIC8vIFdyaXRlIHRvIGFsbCB3cml0YWJsZXMgaW4gcGFyYWxsZWwgYW5kIHJlc29sdmUgd2hlbiBhbGwgaGF2ZSBjb21wbGV0ZWRcbiAgICBjb25zdCB3cml0ZXMgPSB0aGlzLndyaXRhYmxlcy5tYXAoKHdyaXRhYmxlKSA9PiB3cml0YWJsZS53cml0ZShyZXF1ZXN0KSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHdyaXRlcykudGhlbigoKSA9PiBQcm9taXNlLnJlc29sdmUoKSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFJlYWRzIHJvd3MgZnJvbSB0aGUgZmlyc3QgdW5kZXJseWluZyByZWFkYWJsZSBJbyBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgdGFibGUgYW5kIGhhcyBtYXRjaGluZyByb3dzLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgdGFibGUgbmFtZSBhbmQgd2hlcmUgY2xhdXNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVhZCByb3dzLlxuICAgKi9cbiAgYXN5bmMgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlRXhpc3RzQW55ID0gZmFsc2U7XG4gICAgY29uc3Qgcm93czogUmxqc29uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlYWRhYmxlIG9mIHRoaXMucmVhZGFibGVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0YWJsZSBleGlzdHMgaW4gdGhpcyByZWFkYWJsZSBJb1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCByZWFkYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIHRhYmxlRXhpc3RzQW55ID0gdGFibGVFeGlzdHNBbnkgfHwgdGFibGVFeGlzdHM7XG5cbiAgICAgIGlmICh0YWJsZUV4aXN0cykge1xuICAgICAgICAvLyBSZWFkIHJvd3MgZnJvbSB0aGlzIHJlYWRhYmxlIElvXG4gICAgICAgIGNvbnN0IHJlYWRSb3dzID0gYXdhaXQgcmVhZGFibGUucmVhZFJvd3MocmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YTogVGFibGVUeXBlID0gcmVhZFJvd3NbcmVxdWVzdC50YWJsZV07XG4gICAgICAgIC8qIHY4IGlnbm9yZSBlbHNlIC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgICBpZiAodGFibGVEYXRhKSB7XG4gICAgICAgICAgcm93cy5wdXNoKHJlYWRSb3dzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGFibGVFeGlzdHNBbnkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFRhYmxlIFwiJHtyZXF1ZXN0LnRhYmxlfVwiIG5vdCBmb3VuZGApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1lcmdlKC4uLnJvd3MpIGFzIFJsanNvbjtcbiAgICB9XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcm93IGNvdW50IG9mIGEgc3BlY2lmaWMgdGFibGUgYnkgYWdncmVnYXRpbmcgcm93IGNvdW50cyBmcm9tIGFsbCBkdW1wYWJsZSB1bmRlcmx5aW5nIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHRhYmxlIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJvdyBjb3VudCBvZiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5kdW1wYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBkdW1wYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVtcFRhYmxlID0gYXdhaXQgdGhpcy5kdW1wVGFibGUoeyB0YWJsZSB9KTtcbiAgICBjb25zdCB0YWJsZURhdGE6IFRhYmxlVHlwZSA9IGR1bXBUYWJsZVt0YWJsZV07XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdW5kZXJseWluZyByZWFkYWJsZSBJbyBpbnN0YW5jZXMsIHNvcnRlZCBieSBwcmlvcml0eS5cbiAgICovXG4gIGdldCByZWFkYWJsZXMoKTogQXJyYXk8SW8+IHtcbiAgICByZXR1cm4gdGhpcy5faW9zXG4gICAgICAuZmlsdGVyKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5yZWFkKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHVuZGVybHlpbmcgd3JpdGFibGUgSW8gaW5zdGFuY2VzLCBzb3J0ZWQgYnkgcHJpb3JpdHkuXG4gICAqL1xuICBnZXQgd3JpdGFibGVzKCk6IEFycmF5PElvPiB7XG4gICAgcmV0dXJuIHRoaXMuX2lvc1xuICAgICAgLmZpbHRlcigoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8ud3JpdGUpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpXG4gICAgICAubWFwKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5pbyk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdW5kZXJseWluZyBkdW1wYWJsZSBJbyBpbnN0YW5jZXMsIHNvcnRlZCBieSBwcmlvcml0eS5cbiAgICovXG4gIGdldCBkdW1wYWJsZXMoKTogQXJyYXk8SW8+IHtcbiAgICByZXR1cm4gdGhpcy5faW9zXG4gICAgICAuZmlsdGVyKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5kdW1wKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvUGVlck1lbSA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpb1BlZXJNZW0uaW5pdCgpO1xuXG4gICAgY29uc3QgaW9QZWVyU29ja2V0ID0gbmV3IFBlZXJTb2NrZXRNb2NrKGlvUGVlck1lbSk7XG4gICAgY29uc3QgaW9QZWVyID0gbmV3IElvUGVlcihpb1BlZXJTb2NrZXQpO1xuICAgIGF3YWl0IGlvUGVlci5pbml0KCk7XG5cbiAgICBjb25zdCBpb01lbSA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpb01lbS5pbml0KCk7XG5cbiAgICBjb25zdCBpb3M6IEFycmF5PElvTXVsdGlJbz4gPSBbXG4gICAgICB7IGlvOiBpb1BlZXIsIHByaW9yaXR5OiAxLCByZWFkOiB0cnVlLCB3cml0ZTogZmFsc2UsIGR1bXA6IGZhbHNlIH0sXG4gICAgICB7IGlvOiBpb01lbSwgcHJpb3JpdHk6IDAsIHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlLCBkdW1wOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGlvTXVsdGkgPSBuZXcgSW9NdWx0aShpb3MpO1xuICAgIGF3YWl0IGlvTXVsdGkuaW5pdCgpO1xuXG4gICAgcmV0dXJuIGlvTXVsdGk7XG4gIH07XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSW8sIElvTWVtIH0gZnJvbSAnLi9pbmRleC50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIElvIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlIHVzZWQgaW5cbiAqIGNvbmZvcm1hbmNlIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElvVGVzdFNldHVwIHtcbiAgLyoqIHNldHVwIGJlZm9yZSB0aGUgc2luZ2xlIHNldHVwcyAqL1xuICBiZWZvcmVBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYmVmb3JlRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGVhcnMgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIGFmdGVyRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKiogY2xlYW51cCBhZnRlciBhbGwgdGVzdHMgKi9cbiAgYWZ0ZXJBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBpbyBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHRoZSBjb25mb3JtYW5jZSB0ZXN0cy5cbiAgICovXG4gIGlvOiBJbztcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElvVGVzdFNldHVwIGludGVyZmFjZVxuZXhwb3J0IGNvbnN0IGV4YW1wbGVUZXN0U2V0dXAgPSAoKTogSW9UZXN0U2V0dXAgPT4ge1xuICByZXR1cm4ge1xuICAgIGlvOiBuZXcgSW9NZW0oKSxcbiAgICBiZWZvcmVBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBzZXR1cCByZXF1aXJlZCBiZWZvcmUgaW5pdC5cbiAgICAgIC8vIEN1cnJlbnRseSwgaXQgZG9lcyBub3RoaW5nLlxuICAgIH0sXG5cbiAgICBiZWZvcmVFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gICAgYWZ0ZXJFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUZWFyIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcblxuICAgIGFmdGVyQWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgYW55IGFkZGl0aW9uYWwgY2xlYW51cCBhZnRlciB0ZWFyRG93bi5cbiAgICB9LFxuICB9O1xufTtcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHsgQ29udGVudFR5cGUsIFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5IH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcblxuICAvKiogU3RhcnRzIHRoZSBpbml0aWFsaXphdGlvbiAqL1xuICBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENsb3NlcyB0aGUgaW8gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogUmV0dXJucyB0cnVlIGlmIGlvIGlzIG9wZW5lZCAqL1xuICBpc09wZW46IGJvb2xlYW47XG5cbiAgLyoqIEEgcHJvbWlzZSByZXNvbHZpbmcgb25jZSB0aGUgSW8gaW50ZXJmYWNlIGlzIHJlYWR5XG4gICAqXG4gICAqIPCfkqEgVXNlIEBybGpzb24vaXMtcmVhZHlcbiAgICovXG4gIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBkYiBjb250ZW50IGFzIFJsanNvbiAqL1xuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgZHVtcCBvZiBhIGNvbXBsZXRlIHRhYmxlICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG4gIGNvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSZWFkIHJvd3NcblxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xuICByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGNvbnN0IGV4YW1wbGVJbyA9XG4gICdDaGVja291dCBAcmxqc29uL2lvLW1lbSBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbic7XG4iLCIvKiB2OCBpZ25vcmUgZmlsZSAtLSBAcHJlc2VydmUgKi9cbi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIEJ1ZmZldCxcbiAgQ2FrZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIExheWVyLFxuICBSZWYsXG4gIFJsanNvbixcbiAgVGFibGVLZXksXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIGEgcm93IHRoYXQgcmVmZXJlbmNlcyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRhYmxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgdGFibGVcbiAgICovXG4gIFtwYXJlbnRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcbiAgICAgKi9cbiAgICBbcGFyZW50Um93OiBSZWZdOiB7XG4gICAgICAvKipcbiAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIHJlZmVyZW5jZSwgZS5nLiBhbiBhcnJheSBpbmRleCBldGMuXG4gICAgICAgKi9cbiAgICAgIGRldGFpbHM/OiBKc29uO1xuICAgIH07XG4gIH07XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcGFyZW50IHRhYmxlIHJvd3MgcmVmZXJlbmNpbmcgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGQgdGFibGUgd2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICovXG4gIFtjaGlsZFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgICAqL1xuICAgIFtjaGlsZFJvdzogUmVmXTogUGFyZW50UmVmO1xuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcmV2ZXJzZSByZWZlcmVuY2VzIGZvciBhIGdpdmVuIHJsanNvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbGNSZXZlcnNlUmVmcyA9IChybGpzb246IFJsanNvbik6IFJldmVyc2VSZWZzID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZXZlcnNlUmVmcyA9IHt9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUHJlcGFyZSBkYXRhIHN0cnVjdHVyZVxuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChjaGlsZFRhYmxlS2V5LCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkVGFibGU6IHsgW2NoaWxkUm93SGFzaDogc3RyaW5nXTogUGFyZW50UmVmIH0gPSB7fTtcbiAgICByZXN1bHRbY2hpbGRUYWJsZUtleV0gPSBjaGlsZFRhYmxlO1xuICAgIGZvciAoY29uc3QgY2hpbGRSb3cgb2YgdGFibGUuX2RhdGEpIHtcbiAgICAgIGNoaWxkVGFibGVbY2hpbGRSb3cuX2hhc2hdID0ge307XG4gICAgfVxuICB9KTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYXRlIHJldmVyc2UgcmVmZXJlbmNlc1xuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGUpID0+IHtcbiAgICAvLyBJdGVyYXRlIGFsbCByb3dzIG9mIGVhY2ggdGFibGVcbiAgICBmb3IgKGNvbnN0IHBhcmVudFRhYmxlUm93IG9mIHBhcmVudFRhYmxlLl9kYXRhKSB7XG4gICAgICAvLyBGaW5kIG91dCB3aGUgb3RoZXIgdGFibGVzICYgcm93cyBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIHJvd1xuICAgICAgLy8gV3JpdGUgdGhlc2UgaW5mb3JtYXRpb24gaW50dG8gcmVzdWx0XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhYmxlLl90eXBlKSB7XG4gICAgICAgIGNhc2UgJ2NvbXBvbmVudHMnOlxuICAgICAgICAgIF93cml0ZUNvbXBvbmVudFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2xheWVycyc6IHtcbiAgICAgICAgICBfd3JpdGVMYXllclJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xpY2VJZHMnOiB7XG4gICAgICAgICAgLy8gU2xpY2UgaWRzIGRvIG5vdCByZWZlcmVuY2Ugb3RoZXIgdGFibGVzXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdjYWtlcyc6IHtcbiAgICAgICAgICBfd3JpdGVDYWtlUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdidWZmZXRzJzoge1xuICAgICAgICAgIF93cml0ZUJ1ZmZldFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogdjggaWdub3JlIGVuZCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ29tcG9uZW50UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBKc29uLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Q29sdW1uTmFtZSBpbiBwYXJlbnRSb3cpIHtcbiAgICBpZiAocGFyZW50Q29sdW1uTmFtZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Q29sdW1uTmFtZS5zbGljZSgwLCAtMyk7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93W3BhcmVudENvbHVtbk5hbWVdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IExheWVyLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmNvbXBvbmVudHNUYWJsZTtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBzbGljZUlkIGluIHBhcmVudFJvdy5hZGQpIHtcbiAgICBpZiAoc2xpY2VJZC5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlSGFzaCA9IHBhcmVudFJvdy5hZGRbc2xpY2VJZF0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKHJlc3VsdCwgY2hpbGRUYWJsZU5hbWUsIHNsaWNlSGFzaCwgcGFyZW50VGFibGVOYW1lLCBwYXJlbnRSb3dIYXNoKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUNha2VSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IENha2UsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBsYXllciBpbiBwYXJlbnRSb3cubGF5ZXJzKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBsYXllcjtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3cubGF5ZXJzW2xheWVyXSBhcyBzdHJpbmc7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVCdWZmZXRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEJ1ZmZldCxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50Um93Lml0ZW1zKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBpdGVtLnRhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IGl0ZW0ucmVmO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlID0gKFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuICBjaGlsZFRhYmxlTmFtZTogc3RyaW5nLFxuICBjaGlsZFJvd0hhc2g6IHN0cmluZyxcbiAgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcsXG4gIHBhcmVudFJvd0hhc2g6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZSA9IChyZXN1bHRbY2hpbGRUYWJsZU5hbWVdID8/PSB7fSk7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93ID0gKHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlW2NoaWxkUm93SGFzaF0gPz89XG4gICAge30pO1xuXG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV0gPz89IHt9O1xuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdW3BhcmVudFJvd0hhc2hdID8/PSB7fTtcbn07XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cbi8qIHY4IGlnbm9yZSBmaWxlIC0tIEBwcmVzZXJ2ZSAqL1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQudHMnO1xuXG5leHBvcnQgY2xhc3MgU29ja2V0TW9jayBpbXBsZW1lbnRzIFNvY2tldCB7XG4gIHB1YmxpYyBjb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGRpc2Nvbm5lY3RlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBNYXA8c3RyaW5nIHwgc3ltYm9sLCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+PiA9XG4gICAgbmV3IE1hcCgpO1xuICBwcml2YXRlIF9vbmNlTGlzdGVuZXJzOiBNYXA8XG4gICAgc3RyaW5nIHwgc3ltYm9sLFxuICAgIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD5cbiAgPiA9IG5ldyBNYXAoKTtcblxuICBjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdCgnZGlzY29ubmVjdCcpO1xuICAgIH1cbiAgfVxuXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBbXSk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvbmNlKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9vbmNlTGlzdGVuZXJzLmhhcyhldmVudE5hbWUpKSB7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLnNldChldmVudE5hbWUsIFtdKTtcbiAgICB9XG4gICAgdGhpcy5fb25jZUxpc3RlbmVycy5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmYoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyPzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgbGlzdGVuZXJcbiAgICAgIGNvbnN0IHJlZ3VsYXJMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICBpZiAocmVndWxhckxpc3RlbmVycykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHJlZ3VsYXJMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgcmVndWxhckxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uY2VMaXN0ZW5lcnMgPSB0aGlzLl9vbmNlTGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgaWYgKG9uY2VMaXN0ZW5lcnMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvbmNlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIG9uY2VMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgYWxsIGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0xpc3RlbmVycyA9IGZhbHNlO1xuXG4gICAgLy8gRW1pdCB0byByZWd1bGFyIGxpc3RlbmVyc1xuICAgIGNvbnN0IHJlZ3VsYXJMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgaWYgKHJlZ3VsYXJMaXN0ZW5lcnMgJiYgcmVndWxhckxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXNMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgLy8gQ3JlYXRlIGEgY29weSB0byBhdm9pZCBpc3N1ZXMgaWYgbGlzdGVuZXJzIGFyZSByZW1vdmVkIGR1cmluZyBlbWlzc2lvblxuICAgICAgWy4uLnJlZ3VsYXJMaXN0ZW5lcnNdLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSW4gYSByZWFsIEV2ZW50RW1pdHRlciwgdGhpcyB3b3VsZCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBpbiBsaXN0ZW5lciBmb3IgZXZlbnQgJHtTdHJpbmcoZXZlbnROYW1lKX06YCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgdG8gb25jZSBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGVtXG4gICAgY29uc3Qgb25jZUxpc3RlbmVycyA9IHRoaXMuX29uY2VMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgaWYgKG9uY2VMaXN0ZW5lcnMgJiYgb25jZUxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXNMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgLy8gQ3JlYXRlIGEgY29weSBhbmQgY2xlYXIgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgICBjb25zdCBsaXN0ZW5lcnNUb0NhbGwgPSBbLi4ub25jZUxpc3RlbmVyc107XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuXG4gICAgICBsaXN0ZW5lcnNUb0NhbGwuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsaXN0ZW5lciguLi5hcmdzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEVycm9yIGluIG9uY2UgbGlzdGVuZXIgZm9yIGV2ZW50ICR7U3RyaW5nKGV2ZW50TmFtZSl9OmAsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzTGlzdGVuZXJzO1xuICB9XG5cbiAgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZT86IHN0cmluZyB8IHN5bWJvbCk6IHRoaXMge1xuICAgIGlmIChldmVudE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgdGhpcy5fb25jZUxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJDb3VudChldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVndWxhckNvdW50ID0gdGhpcy5fbGlzdGVuZXJzLmdldChldmVudE5hbWUpPy5sZW5ndGggfHwgMDtcbiAgICBjb25zdCBvbmNlQ291bnQgPSB0aGlzLl9vbmNlTGlzdGVuZXJzLmdldChldmVudE5hbWUpPy5sZW5ndGggfHwgMDtcbiAgICByZXR1cm4gcmVndWxhckNvdW50ICsgb25jZUNvdW50O1xuICB9XG5cbiAgbGlzdGVuZXJzKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sKTogQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiB7XG4gICAgY29uc3QgcmVndWxhckxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnROYW1lKSB8fCBbXTtcbiAgICBjb25zdCBvbmNlTGlzdGVuZXJzID0gdGhpcy5fb25jZUxpc3RlbmVycy5nZXQoZXZlbnROYW1lKSB8fCBbXTtcbiAgICByZXR1cm4gWy4uLnJlZ3VsYXJMaXN0ZW5lcnMsIC4uLm9uY2VMaXN0ZW5lcnNdO1xuICB9XG5cbiAgZXZlbnROYW1lcygpOiBBcnJheTxzdHJpbmcgfCBzeW1ib2w+IHtcbiAgICBjb25zdCBhbGxFdmVudHMgPSBuZXcgU2V0KFtcbiAgICAgIC4uLnRoaXMuX2xpc3RlbmVycy5rZXlzKCksXG4gICAgICAuLi50aGlzLl9vbmNlTGlzdGVuZXJzLmtleXMoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhbGxFdmVudHMpO1xuICB9XG5cbiAgLy8gVGVzdCBoZWxwZXIgbWV0aG9kc1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgc2ltdWxhdGVFcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgc2ltdWxhdGVNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLy8gR2V0IGludGVybmFsIHN0YXRlIGZvciB0ZXN0aW5nXG4gIGdldExpc3RlbmVycygpOiBNYXA8c3RyaW5nIHwgc3ltYm9sLCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+PiB7XG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5fbGlzdGVuZXJzKTtcbiAgfVxuXG4gIGdldE9uY2VMaXN0ZW5lcnMoKTogTWFwPHN0cmluZyB8IHN5bWJvbCwgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPj4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuX29uY2VMaXN0ZW5lcnMpO1xuICB9XG59XG5cbi8vIC4uLmV4aXN0aW5nIGNvZGUuLi5cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG4vL0ludGVyZmFjZSBmb3IgYSBnZW5lcmljIFNvY2tldCwgc2ltaWxhciB0byBOb2RlLmpzIEV2ZW50RW1pdHRlclxuLy9UaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIGFuZCBtYXkgbm90IGNvdmVyIGFsbCBmZWF0dXJlcyBvZiBhIGZ1bGwgRXZlbnRFbWl0dGVyXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldCB7XG4gIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgZGlzY29ubmVjdGVkOiBib29sZWFuO1xuICBjb25uZWN0KCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3QoKTogdm9pZDtcbiAgb24oZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzO1xuICBlbWl0KGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBzb2NrZXRFeGFtcGxlID0gKCk6IFNvY2tldCA9PiAoe1xuICBjb25uZWN0ZWQ6IGZhbHNlLFxuICBkaXNjb25uZWN0ZWQ6IHRydWUsXG4gIGNvbm5lY3QoKSB7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdjb25uZWN0Jyk7XG4gIH0sXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0Jyk7XG4gIH0sXG4gIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICBvbigpIHtcbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBldmVudCBsaXN0ZW5lciByZWdpc3RyYXRpb25cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gIGVtaXQoKSB7XG4gICAgLy8gSW1wbGVtZW50YXRpb24gb2YgZXZlbnQgZW1pc3Npb25cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbn0pO1xuIl0sIm5hbWVzIjpbImUiXSwibWFwcGluZ3MiOiI7Ozs7QUFNTyxNQUFNLGdCQUFnQjtBQUFBO0FBQUEsRUFFcEIsbUJBQTJCO0FBQUEsRUFDM0IsY0FBc0I7QUFBQSxFQUN0QixhQUFxQjtBQUFBLEVBQ3JCLFlBQW9CO0FBQUE7QUFBQSxFQUdwQixhQUF3QztBQUFBLElBQzdDLE1BQU07QUFBQSxJQUNOLFVBQVU7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQUlKLFVBQXFDO0FBQUEsSUFDM0MsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQyxRQUFRLE1BQWMsS0FBcUI7QUFDakQsV0FBTyxLQUFLLFNBQVMsR0FBRyxJQUFJLE9BQU8sT0FBTztBQUFBLEVBQzVDO0FBQUEsRUFFTyxlQUFlLE1BQXNCO0FBQzFDLFdBQU8sS0FBSyxRQUFRLE1BQU0sS0FBSyxRQUFRLEdBQUc7QUFBQSxFQUM1QztBQUFBLEVBRU8sZ0JBQWdCLE1BQXNCO0FBQzNDLFdBQU8sS0FBSyxRQUFRLE1BQU0sS0FBSyxRQUFRLEdBQUc7QUFBQSxFQUM1QztBQUFBLEVBRU8sYUFBYSxNQUFzQjtBQUN4QyxXQUFPLEtBQUssUUFBUSxNQUFNLEtBQUssUUFBUSxHQUFHO0FBQUEsRUFDNUM7QUFBQSxFQUVRLFdBQVcsTUFBYyxLQUFxQjtBQUNwRCxXQUFPLEtBQUssU0FBUyxHQUFHLElBQUksS0FBSyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sSUFBSTtBQUFBLEVBQzNEO0FBQUEsRUFFTyxr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
1719
+ //# sourceMappingURL=io.js.map