sf-reglanegociom3 1.0.12-beta9 → 1.0.12-beta90

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.
Files changed (50) hide show
  1. package/bundles/sf-reglanegociom3.umd.js +467 -54
  2. package/bundles/sf-reglanegociom3.umd.js.map +1 -1
  3. package/bundles/sf-reglanegociom3.umd.min.js +1 -1
  4. package/bundles/sf-reglanegociom3.umd.min.js.map +1 -1
  5. package/esm2015/lib/ConexionSQL/posts.service.js +4 -1
  6. package/esm2015/lib/rnm3/Miscelanea/MathTF.class.js +19 -1
  7. package/esm2015/lib/rnm3/Offline/service-m3-proceso-offline.js +9 -4
  8. package/esm2015/lib/rnm3/Promociones/promociones.service.js +96 -20
  9. package/esm2015/lib/rnm3/Registro/m3-procesos.js +5 -1
  10. package/esm2015/lib/rnm3/Services/M3Maestro.service.js +100 -2
  11. package/esm2015/lib/rnm3/Services/m3-fe.service.js +37 -1
  12. package/esm2015/lib/rnm3/Services/m3-load-l-precio.service.js +3 -4
  13. package/esm2015/lib/rnm3/Services/m3-reg-masivo.service.js +58 -10
  14. package/esm2015/lib/rnm3/Services/m3-reg-service.js +39 -16
  15. package/esm5/lib/ConexionSQL/posts.service.js +4 -1
  16. package/esm5/lib/rnm3/Miscelanea/MathTF.class.js +29 -1
  17. package/esm5/lib/rnm3/Offline/service-m3-proceso-offline.js +9 -4
  18. package/esm5/lib/rnm3/Promociones/promociones.service.js +110 -21
  19. package/esm5/lib/rnm3/Registro/m3-procesos.js +5 -1
  20. package/esm5/lib/rnm3/Services/M3Maestro.service.js +141 -2
  21. package/esm5/lib/rnm3/Services/m3-fe.service.js +53 -1
  22. package/esm5/lib/rnm3/Services/m3-load-l-precio.service.js +3 -4
  23. package/esm5/lib/rnm3/Services/m3-reg-masivo.service.js +75 -11
  24. package/esm5/lib/rnm3/Services/m3-reg-service.js +40 -17
  25. package/fesm2015/sf-reglanegociom3.js +352 -51
  26. package/fesm2015/sf-reglanegociom3.js.map +1 -1
  27. package/fesm5/sf-reglanegociom3.js +454 -55
  28. package/fesm5/sf-reglanegociom3.js.map +1 -1
  29. package/lib/rnm3/Miscelanea/MathTF.class.d.ts +2 -0
  30. package/lib/rnm3/Offline/service-m3-proceso-offline.d.ts +1 -1
  31. package/lib/rnm3/Promociones/promociones.service.d.ts +5 -4
  32. package/lib/rnm3/Registro/m3-procesos.d.ts +2 -0
  33. package/lib/rnm3/Services/M3Maestro.service.d.ts +5 -0
  34. package/lib/rnm3/Services/m3-fe.service.d.ts +2 -0
  35. package/lib/rnm3/Services/m3-reg-masivo.service.d.ts +5 -3
  36. package/lib/rnm3/Services/m3-reg-service.d.ts +2 -2
  37. package/package.json +1 -1
  38. package/sf-reglanegociom3.metadata.json +1 -1
  39. package/lib/rnm3/Maestro/Ubicacion/M3UbiAdicionales.type.d.ts +0 -4
  40. package/lib/rnm3/Maestro/Ubicacion/M3Ubicacion.type.d.ts +0 -17
  41. package/lib/rnm3/Maestro/Ubicacion/m3-hubs.type.d.ts +0 -12
  42. package/lib/rnm3/Maestro/Ubicacion/m3-teclas-rapidas.d.ts +0 -6
  43. package/lib/rnm3/Offline/Service/bd-offline-log.service.d.ts +0 -27
  44. package/lib/rnm3/Offline/Service/bd-offline.service.d.ts +0 -17
  45. package/lib/rnm3/Offline/Service/filtros-diario.service.d.ts +0 -5
  46. package/lib/rnm3/Promociones/Models/M3CONDIAGRUPACION.class.d.ts +0 -8
  47. package/lib/rnm3/Promociones/Models/M3CONDIPROMO.class.d.ts +0 -9
  48. package/lib/rnm3/Promociones/Models/M3DETCONDIPROMO.class.d.ts +0 -7
  49. package/lib/rnm3/Promociones/Models/M3ENCPROMO.class.d.ts +0 -17
  50. package/lib/rnm3/Promociones/Models/M3PromoProcesada.class.d.ts +0 -32
@@ -958,20 +958,50 @@ var promocionesService = /** @class */ (function () {
958
958
  * @param {?} JPromociones
959
959
  * @param {?} oTypeM3PrdGrp
960
960
  * @param {?} oM3ENCPROMO
961
+ * @param {?=} gsIdKatios
961
962
  * @return {?}
962
963
  */
963
964
  promocionesService.prototype.ProcesarPromocion = /**
964
965
  * @param {?} JPromociones
965
966
  * @param {?} oTypeM3PrdGrp
966
967
  * @param {?} oM3ENCPROMO
968
+ * @param {?=} gsIdKatios
967
969
  * @return {?}
968
970
  */
969
- function (JPromociones, oTypeM3PrdGrp, oM3ENCPROMO) {
971
+ function (JPromociones, oTypeM3PrdGrp, oM3ENCPROMO, gsIdKatios) {
972
+ if (gsIdKatios === void 0) { gsIdKatios = null; }
970
973
  /** @type {?} */
971
974
  var oPromocionProcesada = new PromocionProcesada();
975
+ /** @type {?} */
976
+ var splitPrecio = this.goDataUser.UsuarioSistema.IDLPrecio.split("-");
977
+ /** @type {?} */
978
+ var oListaFinded = oTypeM3PrdGrp.LoM3PrdGeneral[0].LoM3ListaPrecio.find(function (lPre) { return lPre.IDLISTA == splitPrecio[0]; });
979
+ /** @type {?} */
980
+ var precioMonedero = 0;
981
+ /** @type {?} */
982
+ var listaAplicada = "Valor";
983
+ if (oListaFinded && splitPrecio && splitPrecio.length > 1) {
984
+ switch (splitPrecio[1]) {
985
+ case "LB":
986
+ listaAplicada = "LB";
987
+ oTypeM3PrdGrp.LoM3PrdGeneral[0].LoM3PrdLista.PRECIO = oListaFinded.LB;
988
+ break;
989
+ case "LC":
990
+ listaAplicada = "LC";
991
+ oTypeM3PrdGrp.LoM3PrdGeneral[0].LoM3PrdLista.PRECIO = oListaFinded.LC;
992
+ break;
993
+ case "LD":
994
+ listaAplicada = "LD";
995
+ oTypeM3PrdGrp.LoM3PrdGeneral[0].LoM3PrdLista.PRECIO = oListaFinded.LD;
996
+ break;
997
+ }
998
+ }
972
999
  oPromocionProcesada.PrecioTotal = oTypeM3PrdGrp.LoM3PrdGeneral[0].LoM3PrdLista.PRECIO;
973
1000
  oPromocionProcesada.PrecioTotalPromocion = 0;
974
- return this.ProcesarPromoGeneral(JPromociones, oTypeM3PrdGrp.LoM3PrdGeneral[0].LoM3PrdLista.PRECIO, oPromocionProcesada, oM3ENCPROMO);
1001
+ if (gsIdKatios != null && gsIdKatios == "CTN") {
1002
+ precioMonedero = oTypeM3PrdGrp.LoM3PrdGeneral[0].LoM3ListaPrecio.find(function (x) { return x.IDLISTA == "2"; }).PRECIO;
1003
+ }
1004
+ return this.ProcesarPromoGeneral(JPromociones, oTypeM3PrdGrp.LoM3PrdGeneral[0].LoM3PrdLista.PRECIO, oPromocionProcesada, oM3ENCPROMO, precioMonedero, listaAplicada);
975
1005
  };
976
1006
  /**
977
1007
  * Procesamiento de promocion que se hacen validas despues de registrar todos los productos.
@@ -1005,6 +1035,8 @@ var promocionesService = /** @class */ (function () {
1005
1035
  * @param {?} nPrecio
1006
1036
  * @param {?} oPromocionProcesada
1007
1037
  * @param {?} oM3ENCPROMO
1038
+ * @param {?=} precioMonedero
1039
+ * @param {?=} listaAplicada
1008
1040
  * @return {?}
1009
1041
  */
1010
1042
  promocionesService.prototype.ProcesarPromoGeneral = /**
@@ -1013,22 +1045,31 @@ var promocionesService = /** @class */ (function () {
1013
1045
  * @param {?} nPrecio
1014
1046
  * @param {?} oPromocionProcesada
1015
1047
  * @param {?} oM3ENCPROMO
1048
+ * @param {?=} precioMonedero
1049
+ * @param {?=} listaAplicada
1016
1050
  * @return {?}
1017
1051
  */
1018
- function (JPromociones, nPrecio, oPromocionProcesada, oM3ENCPROMO) {
1052
+ function (JPromociones, nPrecio, oPromocionProcesada, oM3ENCPROMO, precioMonedero, listaAplicada) {
1053
+ if (precioMonedero === void 0) { precioMonedero = 0; }
1054
+ if (listaAplicada === void 0) { listaAplicada = "Valor"; }
1019
1055
  /** @type {?} */
1020
1056
  var oPromocionesAsociadas;
1021
1057
  /** @type {?} */
1022
1058
  var oListaPromosAsoc = new Array();
1059
+ /** @type {?} */
1060
+ var precioAsignado = nPrecio;
1023
1061
  for (var _i = 0; _i < JPromociones.length; _i++) {
1024
1062
  /** @type {?} */
1025
1063
  var promocion = JPromociones[_i];
1026
- oPromocionesAsociadas = this.ProcesarPromoByTipo(promocion, nPrecio, oPromocionProcesada, oM3ENCPROMO);
1064
+ // if (promocion.Accion != null && promocion.Accion.Tipo2 != null && promocion.Accion.Tipo2 == "MONEDERO" && precioMonedero > 0) {
1065
+ // oPromocionProcesada.PrecioTotal = precioMonedero;
1066
+ // }
1067
+ oPromocionesAsociadas = this.ProcesarPromoByTipo(promocion, precioAsignado, oPromocionProcesada, oM3ENCPROMO, listaAplicada);
1027
1068
  if (oPromocionesAsociadas) {
1028
1069
  oListaPromosAsoc.push(oPromocionesAsociadas);
1029
1070
  }
1030
1071
  }
1031
- this.ValidarMejorPromocion(oListaPromosAsoc, oPromocionProcesada, nPrecio);
1072
+ this.ValidarMejorPromocion(oListaPromosAsoc, oPromocionProcesada, precioMonedero);
1032
1073
  // if (oPromocionesAsociadas != null) {
1033
1074
  // oPromocionProcesada.ListPromocionesAsociadas.push(oPromocionesAsociadas);
1034
1075
  // oPromocionProcesada.PrecioTotal = Math.round(((+oPromocionProcesada.PrecioTotal) - oPromocionesAsociadas.Valor) * 100) / 100;
@@ -1047,17 +1088,17 @@ var promocionesService = /** @class */ (function () {
1047
1088
  * Validacion de mejor opcion, teniendo en cuenta las promociones procesadas.
1048
1089
  * @param {?} oListaPromosAsoc Lista de promociones procesadas
1049
1090
  * @param {?} oPromocionProcesada Promocion procesada, que retornará a flujo.
1050
- * @param {?} precio
1091
+ * @param {?} monedero
1051
1092
  * @return {?}
1052
1093
  */
1053
1094
  promocionesService.prototype.ValidarMejorPromocion = /**
1054
1095
  * Validacion de mejor opcion, teniendo en cuenta las promociones procesadas.
1055
1096
  * @param {?} oListaPromosAsoc Lista de promociones procesadas
1056
1097
  * @param {?} oPromocionProcesada Promocion procesada, que retornará a flujo.
1057
- * @param {?} precio
1098
+ * @param {?} monedero
1058
1099
  * @return {?}
1059
1100
  */
1060
- function (oListaPromosAsoc, oPromocionProcesada, precio) {
1101
+ function (oListaPromosAsoc, oPromocionProcesada, monedero) {
1061
1102
  var e_2, _a;
1062
1103
  /** @type {?} */
1063
1104
  var promoAsociadaRestringido = oListaPromosAsoc.find(function (x) { return x.Tipo == "RESTRICCION"; });
@@ -1081,10 +1122,18 @@ var promocionesService = /** @class */ (function () {
1081
1122
  var promo = _c.value;
1082
1123
  promo.Aplicada = true;
1083
1124
  if (promo.ValorPorcentaje > 0) {
1084
- /** @type {?} */
1085
- var nuevoValorDescuento = ((+oPromocionProcesada.PrecioTotal) * promo.ValorPorcentaje / 100);
1086
- oPromocionProcesada.PrecioTotal = (+oPromocionProcesada.PrecioTotal) - nuevoValorDescuento;
1087
- oPromocionProcesada.PrecioTotalPromocion = (+oPromocionProcesada.PrecioTotalPromocion) + nuevoValorDescuento;
1125
+ if (monedero != 0 && promo.Tipo == "MONEDERO") {
1126
+ /** @type {?} */
1127
+ var nuevoValorDescuento = ((+monedero) * promo.ValorPorcentaje / 100);
1128
+ oPromocionProcesada.PrecioTotal = (+monedero) - nuevoValorDescuento;
1129
+ oPromocionProcesada.PrecioTotalPromocion = (+oPromocionProcesada.PrecioTotalPromocion) + nuevoValorDescuento;
1130
+ }
1131
+ else {
1132
+ /** @type {?} */
1133
+ var nuevoValorDescuento = ((+oPromocionProcesada.PrecioTotal) * promo.ValorPorcentaje / 100);
1134
+ oPromocionProcesada.PrecioTotal = (+oPromocionProcesada.PrecioTotal) - nuevoValorDescuento;
1135
+ oPromocionProcesada.PrecioTotalPromocion = (+oPromocionProcesada.PrecioTotalPromocion) + nuevoValorDescuento;
1136
+ }
1088
1137
  }
1089
1138
  else {
1090
1139
  oPromocionProcesada.PrecioTotal = ((+oPromocionProcesada.PrecioTotal) - promo.Valor);
@@ -1250,6 +1299,7 @@ var promocionesService = /** @class */ (function () {
1250
1299
  * @param {?} Precio
1251
1300
  * @param {?} oPromocionProcesada
1252
1301
  * @param {?} oM3ENCPROMO
1302
+ * @param {?=} listaAplicada
1253
1303
  * @return {?}
1254
1304
  */
1255
1305
  promocionesService.prototype.ProcesarPromoByTipo = /**
@@ -1257,9 +1307,11 @@ var promocionesService = /** @class */ (function () {
1257
1307
  * @param {?} Precio
1258
1308
  * @param {?} oPromocionProcesada
1259
1309
  * @param {?} oM3ENCPROMO
1310
+ * @param {?=} listaAplicada
1260
1311
  * @return {?}
1261
1312
  */
1262
- function (promocion, Precio, oPromocionProcesada, oM3ENCPROMO) {
1313
+ function (promocion, Precio, oPromocionProcesada, oM3ENCPROMO, listaAplicada) {
1314
+ if (listaAplicada === void 0) { listaAplicada = "Valor"; }
1263
1315
  try {
1264
1316
  /** @type {?} */
1265
1317
  var Accion;
@@ -1276,19 +1328,24 @@ var promocionesService = /** @class */ (function () {
1276
1328
  oPromocionesAsociadas.Regla = "EXC";
1277
1329
  }
1278
1330
  oPromocionesAsociadas.Tipo = Accion.Tipo2;
1331
+ /** @type {?} */
1332
+ var valorAplicar = Accion.Valor;
1333
+ if (Accion[listaAplicada]) {
1334
+ valorAplicar = Accion[listaAplicada];
1335
+ }
1279
1336
  switch (Accion.Tipo2.trim().toUpperCase()) {
1280
1337
  case "DTO_%":
1281
1338
  oPromocionesAsociadas.ListObsSKU = null;
1282
- oPromocionesAsociadas.ValorPorcentaje = +Accion.Valor;
1283
- oPromocionesAsociadas.Valor = (+Precio) * ((+Accion.Valor) / 100);
1339
+ oPromocionesAsociadas.ValorPorcentaje = +valorAplicar;
1340
+ oPromocionesAsociadas.Valor = (+Precio) * ((+valorAplicar) / 100);
1284
1341
  break;
1285
1342
  case "DTO_VALOR":
1286
1343
  oPromocionesAsociadas.ListObsSKU = null;
1287
- oPromocionesAsociadas.Valor = Accion.Valor;
1344
+ oPromocionesAsociadas.Valor = valorAplicar;
1288
1345
  break;
1289
1346
  case "DTO_EXACT":
1290
1347
  oPromocionesAsociadas.ListObsSKU = null;
1291
- oPromocionesAsociadas.Valor = (+Precio) - (+Accion.Valor);
1348
+ oPromocionesAsociadas.Valor = (+Precio) - (+valorAplicar);
1292
1349
  break;
1293
1350
  case "OBSEQ":
1294
1351
  oPromocionesAsociadas.Valor = 0;
@@ -2291,7 +2348,9 @@ var promocionesService = /** @class */ (function () {
2291
2348
  }
2292
2349
  finally { if (e_9) throw e_9.error; }
2293
2350
  }
2294
- if (productosHijosDelCombo.length > 0) {
2351
+ if (!combi.Accion.Codigo)
2352
+ console.error('El código del combo no esta configurado en M3DETCONDIPROMO');
2353
+ if (productosHijosDelCombo.length > 0 && combi.Accion.Codigo) {
2295
2354
  /** @type {?} */
2296
2355
  var productoCombo = m3RegService.loadM3PEncItemsFromPromocionCombo(ioM3Proceso, productosHijosDelCombo, combi.Accion.Codigo, valorCombo, 1);
2297
2356
  m3RegService.armarListaObsequiosCombiSKU(combi, productoCombo, cantidadObsequios);
@@ -2455,7 +2514,7 @@ var promocionesService = /** @class */ (function () {
2455
2514
  while (iy < y && j >= i) {
2456
2515
  if (residuoX == 0) {
2457
2516
  bEntro = true;
2458
- lPrecios[j].PUNITNETO = 0;
2517
+ lPrecios[j].PUNITNETO = 0.01;
2459
2518
  }
2460
2519
  else {
2461
2520
  bEntro = true;
@@ -3216,6 +3275,11 @@ var promocionesService = /** @class */ (function () {
3216
3275
  listPromosAplicadas = [];
3217
3276
  detalleIdPromoc = item.M3DET.find(function (x) { return x.NombreConcepto == "ID_PROMOC"; });
3218
3277
  precioProducto = +item.M3DET.find(function (det) { return det.NombreConcepto == "PRECIOTOTAL"; }).Valor;
3278
+ /** @type {?} */
3279
+ var precioSR = item.M3DET.find(function (det) { return det.NombreConcepto == "PRECIOSR"; });
3280
+ if (precioSR != null && precioSR.Valor != null) {
3281
+ precioProducto = +precioSR.Valor;
3282
+ }
3219
3283
  if (detalleIdPromoc && detalleIdPromoc.Valor) {
3220
3284
  listPromosAplicadas = detalleIdPromoc.Valor.split(",");
3221
3285
  }
@@ -3223,7 +3287,9 @@ var promocionesService = /** @class */ (function () {
3223
3287
  if (listPromosAplicadas.find(function (x) { return +x == promoApl.IdPromocion; })) {
3224
3288
  /** @type {?} */
3225
3289
  var promo = list_enc_promo.find(function (x) { return x.IdPromocion == promoApl.IdPromocion; });
3226
- valorFidelizacion += (precioProducto * this_4.getPorcentajeFidelizacionFromEncPromo(promo) / 100) * (percent_forma_pago);
3290
+ /** @type {?} */
3291
+ var valor = this_4.validarRedondeo(promo, precioProducto * this_4.getPorcentajeFidelizacionFromEncPromo(promo) / 100) * (percent_forma_pago);
3292
+ valorFidelizacion += valor;
3227
3293
  return "break";
3228
3294
  }
3229
3295
  };
@@ -3274,6 +3340,29 @@ var promocionesService = /** @class */ (function () {
3274
3340
  }
3275
3341
  return 0;
3276
3342
  };
3343
+ /**
3344
+ * @param {?} promo
3345
+ * @param {?} valor
3346
+ * @return {?}
3347
+ */
3348
+ promocionesService.prototype.validarRedondeo = /**
3349
+ * @param {?} promo
3350
+ * @param {?} valor
3351
+ * @return {?}
3352
+ */
3353
+ function (promo, valor) {
3354
+ try {
3355
+ /** @type {?} */
3356
+ var jAdicionales = JSON.parse(promo.JAdicionales);
3357
+ if (jAdicionales.ROOT && jAdicionales.ROOT.Accion && jAdicionales.ROOT.Accion.Redondeo) {
3358
+ return this.oMathTF.round(valor, +jAdicionales.ROOT.Accion.Redondeo);
3359
+ }
3360
+ }
3361
+ catch (_a) {
3362
+ return valor;
3363
+ }
3364
+ return valor;
3365
+ };
3277
3366
  /**
3278
3367
  * Adiciona una dinamica con el valor de la fidelización de dicho proceso y retorna dicho proceso
3279
3368
  * @param {?} proceso
@@ -3447,4 +3536,4 @@ function promocionesService_tsickle_Closure_declarations() {
3447
3536
  promocionesService.prototype.operators;
3448
3537
  }
3449
3538
 
3450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbW9jaW9uZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NmLXJlZ2xhbmVnb2Npb20zLyIsInNvdXJjZXMiOlsibGliL3JubTMvUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQU1BLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSy9HLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFFbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBELE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFHMUQsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLElBQUE7SUFNSSw0QkFBWSxTQUFjLEVBQUUsY0FBMkI7dUJBTDlCLElBQUksTUFBTSxFQUFFO3lCQVVsQjtZQUNmLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEVBQUU7WUFDckMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUEsRUFBRTtZQUNyQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO1lBQ3ZDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBLEVBQUU7WUFDdkMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMs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QUFJLE9BQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEVBQWhDLENBQWdDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQXBFLENBQW9FLENBQUM7Z0JBQ3JHLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxHQUFHLElBQUssT0FBQSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxFQUFoQyxDQUFnQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQXhFLENBQXdFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEcsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFO2dCQUNoQixPQUFPLENBQUMsQ0FBQzthQUNaO2lCQUFNO2dCQUNILE9BQU8sU0FBUyxDQUFDO2FBQ3BCO1NBQ0o7YUFBTTtZQUNILE9BQU8sQ0FBQyxDQUFDO1NBQ1o7OzZCQTdoRlQ7SUEraEZDLENBQUE7QUF2Z0ZELDhCQXVnRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNM0VOQ1BST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzcyc7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSAnLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZSc7XHJcbmltcG9ydCB7IE0zQ09ORElBR1JVUEFDSU9OIH0gZnJvbSAnLi9Nb2RlbHMvTTNDT05ESUFHUlVQQUNJT04uY2xhc3MnO1xyXG5pbXBvcnQgeyBNM0NPTkRJUFJPTU8gfSBmcm9tICcuL01vZGVscy9NM0NPTkRJUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tICcuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGUnO1xyXG5pbXBvcnQgeyBNM0RFVENPTkRJUFJPTU8gfSBmcm9tICcuL01vZGVscy9NM0RFVENPTkRJUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25lc0Fzb2NpYWRhcywgUHJvbW9jaW9uUHJvY2VzYWRhLCBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tICcuL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzJztcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXByb2Nlc29zJztcclxuaW1wb3J0IHsgTTNQcm9tQ29tYmluYWRhWFByb2Nlc28gfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9tLWNvbWInO1xyXG5pbXBvcnQgeyBNM1BFbmNJdGVtcyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXBlbmMtaXRlbXMnO1xyXG5pbXBvcnQgeyBNM1BFbmNGUCB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXBlbmMtZnAnO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzJztcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gJy4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBfaXRlcmFibGVEaWZmZXJzRmFjdG9yeSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvc3JjL2FwcGxpY2F0aW9uX21vZHVsZSc7XHJcbmltcG9ydCB7IE0zUERldGFsbGVJdGVtcywgTTNQSXRlbXNXRUIgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtcyc7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgTTNQcmRHZW5lcmFsIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZSc7XHJcbmltcG9ydCB7IE1hdGhURiB9IGZyb20gJy4uL01pc2NlbGFuZWEvTWF0aFRGLmNsYXNzJztcclxuaW1wb3J0IHsgTTNQZXJYUHJvY2VzbyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXBlci14LXByb2Nlc28nO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgTTNSZWdTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvbTMtcmVnLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNM1ByZExpc3RhIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZExpc3RhLnR5cGUnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuZXhwb3J0IGNsYXNzIHByb21vY2lvbmVzU2VydmljZSB7XHJcbiAgICBwdWJsaWMgb01hdGhURjogTWF0aFRGID0gbmV3IE1hdGhURigpO1xyXG4gICAgcHVibGljIGdvRGF0YVVzZXI6IGFueTtcclxuICAgIHB1YmxpYyBnb0RhdGFBZGljaW9uYWw6IE0zUEl0ZW1zV0VCO1xyXG4gICAgcHVibGljIGdvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz47XHJcblxyXG4gICAgY29uc3RydWN0b3Iob0RhdGFVc2VyOiBhbnksIG9EYXRhQWRpY2lvbmFsOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIHRoaXMuZ29EYXRhVXNlciA9IG9EYXRhVXNlcjtcclxuICAgICAgICB0aGlzLmdvRGF0YUFkaWNpb25hbCA9IG9EYXRhQWRpY2lvbmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVyYXRvcnMgPSB7XHJcbiAgICAgICAgJzwnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA8IGIgfSxcclxuICAgICAgICAnPic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID4gYiB9LFxyXG4gICAgICAgICc8PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIDw9IGIgfSxcclxuICAgICAgICAnPj0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+PSBiIH0sXHJcbiAgICAgICAgJ0lHVUFMJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPT0gYiB9LFxyXG4gICAgICAgICdESUZGJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgIT0gYiB9LFxyXG4gICAgICAgICdFTic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09PSBiIH0sXHJcbiAgICAgICAgJ0FORCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICYmIGIgfSxcclxuICAgICAgICAnT1InOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSB8fCBiIH0sXHJcbiAgICAgICAgJyonOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gdHJ1ZSB9LFxyXG4gICAgICAgICdNT0QnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAlIGIgPT0gMCB9LFxyXG4gICAgICAgIC8vIC4uLlxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy9WZXJpZmljYXIgcHJvbW9jaW9uZXMsIGluZ3Jlc2FuZG8gY29tbyBwYXJhbWV0cm8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgdmFsaWRhciwgVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBsVGlwb3NQcm9tbzogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICB2YXIgYVByb21vY2lvbmVzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICB2YXIgaG95ID0gbmV3IERhdGUoKTtcclxuICAgICAgICB0aGlzLmdvTTNFTkNQUk9NTyA9IG9NM0VOQ1BST01PO1xyXG4gICAgICAgIGlmIChvTTNFTkNQUk9NTykge1xyXG4gICAgICAgICAgICBvTTNFTkNQUk9NTy5maWx0ZXIoeCA9PiBsVGlwb3NQcm9tby5maW5kKHByb21vID0+IHguVGlwbyA9PSBwcm9tbykpLmZvckVhY2goZW5jYWJlemFkb1Byb21vID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBkVmlnZW5jaWEgPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uVmlnZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRJbmljaW8gPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uSW5pY2lvKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTEwMjMsIHNlIHF1aXRhIFRpcG8gTWFudWFsLCB5IHNlIGRlamEgZWwgbnVldm8gcGFyYW1ldHJvLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhckVzdGFkb3NFbmNQcm9tbyhlbmNhYmV6YWRvUHJvbW8pICYmIChlbmNhYmV6YWRvUHJvbW8uRXN0YWRvICYmIGRWaWdlbmNpYSA+PSBob3kgJiYgZEluaWNpbyA8PSBob3kpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8vLy8vLyBWYWxpZGFjaW9uOiAxLiBTaSBlcyBkaWZlcmVudGUgYSBNYW51YWwsIG5vIHZhbGlkYSBWYXJpYWJsZSBlc3RhZG9zIG1hbnVhbGVzLiBEZSBsbyBjb250cmFyaW8gbG8gdmFsaWRhLiAtLS0gMi4gU2kgZWwgZXN0YWRvIGVsIGVzdGFkbyBlcyB2ZXJkYWRlcm8geSBsYSB2aWdlbmNpYSBlcyBtYXlvciBvIGlndWFsIGEgbGEgZmVjaGEgZGVsIG1vbWVudG9cclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKGFncnVwYWNpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FyQWdydXBhY2lvblByb21vKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGFncnVwYWNpb24sIGVuY2FiZXphZG9Qcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZXRKUmVzcEZyb21BcnJheShhUmVzcHMsIGVuY2FiZXphZG9Qcm9tby5UaXBvLCBlbmNhYmV6YWRvUHJvbW8uVGlwbzIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChqUmVzcC5BUExDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9WYWxpZGFjaW9uIGRlIGFjY2lvbiwgc2kgZXhpc3RlLCBzaW5vIGV4aXN0ZSBzZSBhZ3JlZ2EgZGVsIHBhcGEuIFNlIGVudmlhIGNvbW8gcmVmZXJlbmNpYSBqcmVzcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJBY2Npb24oalJlc3AsIGVuY2FiZXphZG9Qcm9tby5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJldG9tYXJWYWxvcmVzUHJvbW9jaW9uKGVuY2FiZXphZG9Qcm9tbywgalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhUHJvbW9jaW9uZXMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBhUHJvbW9jaW9uZXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGFyRXN0YWRvc0VuY1Byb21vKGVuY2FiZXphZG9Qcm9tbzogTTNFTkNQUk9NTyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBlc3RhZG8gPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoZW5jYWJlemFkb1Byb21vLkVzTWFudWFsICYmICFlbmNhYmV6YWRvUHJvbW8uRXN0YWRvTWFudWFsZXMpIHtcclxuICAgICAgICAgICAgZXN0YWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW5jYWJlemFkb1Byb21vLkVzQXBsQ3Vwb24gJiYgIWVuY2FiZXphZG9Qcm9tby5Fc3RhZG9BcGxDdXBvbikge1xyXG4gICAgICAgICAgICBlc3RhZG8gPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlc3RhZG87XHJcbiAgICB9XHJcblxyXG4gICAgLy9WZXJpZmljYXIgYWdydXBhY2lvbiBkZSBwcm9tb2Npb25lcywgaW5ncmVzYW5kbyBjb21vIHBhcmFtZXRybyBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvZHVjdG8gYSB2YWxpZGFyLCBVYmljYWNpb25cclxuICAgIHB1YmxpYyBWZXJpZmljYXJBZ3J1cGFjaW9uUHJvbW8ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgYWdydXBhY2lvbjogTTNDT05ESUFHUlVQQUNJT04sIG9NM0VuY1Byb21vOiBNM0VOQ1BST01PKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHZhciBhUmVzcHMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWdydXBhY2lvbi5NM0NPTkRJUFJPTU8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNvbmRpY2lvbjogTTNDT05ESVBST01PO1xyXG4gICAgICAgICAgICB2YXIgakFkaWNpb25hbGVzO1xyXG4gICAgICAgICAgICBjb25kaWNpb24gPSBhZ3J1cGFjaW9uLk0zQ09ORElQUk9NT1tpXTtcclxuICAgICAgICAgICAgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKCFqQWRpY2lvbmFsZXMuUk9PVC5BQ1RJVklEQUQgfHwgakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEID09IFwiUkVHSVNUUk9cIikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNvbmRpY2lvbmVzUHJvbW8ob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob00zRW5jUHJvbW8uVGlwbyA9PSBcIkNPTUJJTkFEQVwiICYmIG9NM0VuY1Byb21vLlRpcG8yID09IFwiQ09NQk9cIiAmJiBqUmVzcC5BUExDb25kaWNpb24gJiYgYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIk9SXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBTkRcIiAmJiAhalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MYSBjb25kaWNpb24gTk8gc2UgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiT1JcIiAmJiBqUmVzcC5BUExDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAvL0xhIGNvbmRpY2lvbiBzZSBjdW1wbGVcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgZGViZSBndWFyZGFyIGxhIGluZm9ybWFjacOzbi4gU2kgc2llbXByZSBmdWVyb24gT1IgeSBGQUxTRSwgc2UgZGViZSBjb21wYXJhciBjb21vIHVuIEFORC5cclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRKUmVzcEZyb21BcnJheShhUmVzcHMsIG9NM0VuY1Byb21vLlRpcG8sIG9NM0VuY1Byb21vLlRpcG8yKTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbmRpY2lvbiBkZSBwcm9tb2Npb25lcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PKSB7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWVzO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqQWRpY2lvbmFlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLCBqQWRpY2lvbmFlcyk7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICB0aGlzLkFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uKTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGEganNvbiBkZSByZXNwdWVzdGEgc2kgc2UgZ2VuZXJvIE9LIGxhIGluZm9ybWFjaW9uIGRlIGxhIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpSZXNwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLklEQ29uZGljaW9uID0gY29uZGljaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WZXJpZmljYSBjb25kaWNpb24sIGNvbnRyYSBkYXRhIGluZ3Jlc2FkYS5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25Db250cmFEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpOiBhbnkge1xyXG4gICAgICAgIHZhciBvYmplY3RGaW5kZWQ7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuRXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL1ZhIGEgZXN0cnVjdHVyYSBkZSBwcm9kdWN0byBhZGljaW9uYWxcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMb00zUHJkQWRpY2lvbmFsZXNcIjpcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RGaW5kZWQgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaWMgPT4gYWRpYy5BVFJJQlVUTy50cmltKCkgPT0gY29uZGljaW9uLkNvbmNlcHRvLnRyaW0oKSAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oYWRpYy5WQUxPUi50cmltKCksIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZC5KQWRpY2lvbmFsZXMgPSBKU09OLnN0cmluZ2lmeShqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9iamVjdEZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJEVE9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0sIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRHUlBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnAsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJNM0RFVENPTkRJUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGNvbmRpY2lvbi5Db25jZXB0bywgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJQcm9jZXNvRm9ybWFQYWdvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfTElTVEFQXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLnZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESUNJT05BTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQ0FSQUNURVJJU1RJQ0FTXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vRXN0YSBwcm9tb2Npw7NuIGVzdGEgZGlzZcOxYWRhIHBhcmEgcXVlIHNlYSBwcm9jZXNhZGEgYWwgZmluYWwgZGUgbGEgdHJhbnNhY2Npw7NuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24uTTNERVRDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRKUmVzcEZyb21BcnJheShhUmVzcHM6IEFycmF5PGFueT4sIHRpcG8sIHRpcG8yKSB7XHJcbiAgICAgICAgdmFyIGJBUExDb25kaWNpb247XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGlmIChhUmVzcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL0xMZWdhIGEgZXN0ZSBwdW50bywgcG9yIGFsZ3VuYSBkZSAyIHJhem9uZXM6IFxyXG4gICAgICAgICAgICAvLzEuIExhIGNvbmRpY2nDs24gZXMgdW4gT1IgeSB0b2RvcyBzb24gRkFMU0VcclxuICAgICAgICAgICAgLy8yLiBMYSBjb25kaWNpw7NuIGVzIHVuIEFORCB5IHRvZG9zIHNvbiBUUlVFXHJcbiAgICAgICAgICAgIGJBUExDb25kaWNpb24gPSBhUmVzcHMuZmlsdGVyKHJlc3AgPT4gcmVzcC5BUExDb25kaWNpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWJBUExDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpcG8gPT0gXCJDT01CSU5BREFcIiAmJiB0aXBvMiA9PSBcIkNPTUJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJyZWdsb0NvbmRpY2lvbmVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgYkFQTENvbmRpY2lvbi5mb3JFYWNoKGNvbmRpY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb24uSURDb25kaWNpb24ubGVuZ3RoID49IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbi5JRENvbmRpY2lvbi5mb3JFYWNoKGlkQ29uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmVnbG9Db25kaWNpb25lcy5maW5kKHggPT4geCA9PSBpZENvbikpIGFycmVnbG9Db25kaWNpb25lcy5wdXNoKGlkQ29uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJlZ2xvQ29uZGljaW9uZXMuZmluZCh4ID0+IHggPT0gY29uZGljaW9uLklEQ29uZGljaW9uKSkgYXJyZWdsb0NvbmRpY2lvbmVzLnB1c2goY29uZGljaW9uLklEQ29uZGljaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IEFQTENvbmRpY2lvbjogdHJ1ZSwgQWNjaW9uOiBudWxsLCBJRENvbmRpY2lvbjogYXJyZWdsb0NvbmRpY2lvbmVzIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYVJlc3BUTVAgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vVmVyaWZpY2FyIHNpIGFsZ3VubyBkZSBsb3MgYXJyZWdsb3MgdGllbmUgYWNjaW9uIGRpZmVyZW50ZSBhIG51bGxcclxuICAgICAgICAgICAgICAgICAgICBhUmVzcFRNUCA9IGFSZXNwcy5maWx0ZXIocmVzcCA9PiByZXNwLkFjY2lvbiAhPSBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYVJlc3BUTVAubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1VzYXIgZWwgdWx0aW1vIGl0ZW0sIHF1ZSB0ZW5nYSBsYSBhY2Npw7NuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gYVJlc3BUTVBbYVJlc3BUTVAubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcHNbYVJlc3BzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGEgcHJvbW8gZGVwZW5kZSBkZSBsYSBmb3JtYSBkZSBwYWdvIGHDsWFkZSBlc3RhIGluZm9ybWFjacOzblxyXG4gICAgICAgICAgICBpZiAoYVJlc3BzLmZpbmQoeCA9PiB4LkZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwW1wiRm9ybWFQYWdvXCJdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvL0dlbmVyYXIgUmVzcHVlc3RhIGRlIGNvbmRpY2lvbi5cclxuICAgIHB1YmxpYyBHZW5lcmFyUmVzcHVlc3RhKGJBUExQcm9tbzogYm9vbGVhbiwgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGpSZXNwID0geyBcIkFQTENvbmRpY2lvblwiOiBiQVBMUHJvbW8sIFwiQWNjaW9uXCI6IG51bGwgfTtcclxuICAgICAgICBpZiAoakFkaWNpb25hbGVzICE9IG51bGwgJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgalJlc3AuQWNjaW9uID0gakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGNsYXNpZmljYWNpb25lcyBwb3IgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBQcm9jZXNvcyBkZSBNM1xyXG4gICAgICogQHBhcmFtIGRldENvbmRpY2lvbmVzIENvbmRpY2lvbmVzIGRlIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgbFByZWNpb3M6IEFycmF5PGFueT4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueSA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yZXM6IEFycmF5PGFueT4gPSBjb21iaS5BY2Npb24uVmFsb3JlcztcclxuICAgICAgICAgICAgLy92YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyID0gbFByZWNpb3MubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgYkVudHJvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhbG9yZXMgPSB2YWxvcmVzLnNvcnQoKGEsIGIpID0+IChhLkNhbnRpZGFkIDwgYi5DYW50aWRhZCkgPyAxIDogKChiLkNhbnRpZGFkIDwgYS5DYW50aWRhZCkgPyAtMSA6IDApKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuQXBsaWNhclByb21vQnlWYWxvcmVzKHZhbG9yZXMsIGxQcmVjaW9zLCBsUHJlY2lvcy5sZW5ndGgpOy8vSkFHTSAyMDE5MDczMSwgZnVuY2lvbiByZWN1cnNpdmEgcGFyYSBjYWxjdWxhciBsb3MgcHJlY2lvcyBudWV2b3MuXHJcblxyXG4gICAgICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCAmJiBsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbyA9PSB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBmYWxzZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlZlcmlmaWNhckNsYXNpZmljYWNpb25lc1Byb2Nlc29cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGNsYXNpZmljYWNpb25lcyBwb3IgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBQcm9jZXNvcyBkZSBNM1xyXG4gICAgICogQHBhcmFtIGRldENvbmRpY2lvbmVzIENvbmRpY2lvbmVzIGRlIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcm9jZXNhckNhcmFjdGVyaXN0aWNhUGFyY2lhbChvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGxQcmVjaW9zOiBBcnJheTxhbnk+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvcmVzOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLlZhbG9yZXM7XHJcbiAgICAgICAgICAgIHZhbG9yZXMgPSB2YWxvcmVzLnNvcnQoKGEsIGIpID0+IGEuQ2FudGlkYWQgLSBiLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsUHJlY2lvcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbG9yUHJvbW8gPSBpIDwgdmFsb3Jlcy5sZW5ndGggPyB2YWxvcmVzW2ldLlZhbG9yIDogMFxyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2ldLlBVTklUTkVUTyAtICgoK2xQcmVjaW9zW2ldLlBVTklUTkVUTykgKiAoKCt2YWxvclByb21vKSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCAmJiBsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbyA9PSB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBmYWxzZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlZlcmlmaWNhckNsYXNpZmljYWNpb25lc1Byb2Nlc29cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzOiBBcnJheTxhbnk+LCBsUHJlY2lvczogQXJyYXk8YW55PiwgcmVzaWR1b0VudHJhbnRlOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyID0gcmVzaWR1b0VudHJhbnRlOy8vIEpBR00gMjAxOTA3MzEgbnVldm8gcGFyYW1ldHJvID0gbFByZWNpb3MubGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbG9yZXMubGVuZ3RoOyBpKyspIHsvL0pBR00gMjAxOTA3MzAgc2UgYWdyZWdhIGZ1bmNpb25hbGlkYWQgcGFyYSBxdWUgc2UgcHVlZGEgdGVuZXIgdmFyaW9zIHZhbG9yZXMuXHJcbiAgICAgICAgICAgIHZhciBpQ2FudGlkYWRQcm9tbzogbnVtYmVyID0gdmFsb3Jlc1tpXS5DYW50aWRhZDtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUHJvbW86IG51bWJlciA9IHZhbG9yZXNbaV0uVmFsb3I7XHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWRSZWFsID49IGlDYW50aWRhZFByb21vKSB7IC8vSkFHTSAyMDE5MDQyNiBTRSBDQU1CSUEsIEFOVEVTIEVTVEFCQSBMQSBGVU5DSU9OQUxJREFEIERFIENBTlRJREFEIFJFQUwgVlMgQ0FOVElEQUQgUFJPTU9DSU9OLlxyXG4gICAgICAgICAgICAgICAgdmFyIFJlc2lkdW86IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCAlIGlDYW50aWRhZFByb21vID09IDApIHtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgUmVzaWR1byA9IGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzLCBsUHJlY2lvcywgUmVzaWR1byk7XHJcbiAgICAgICAgICAgICAgICAgICAgaUNhbnRpZGFkUmVhbCA9IGlDYW50aWRhZFJlYWwgLSBSZXNpZHVvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9ICtsUHJlY2lvcy5sZW5ndGggLSArcmVzaWR1b0VudHJhbnRlOyBpIDwgK2xQcmVjaW9zLmxlbmd0aCAtICtSZXNpZHVvOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaV0uUFVOSVRORVRPIC0gKCgrbFByZWNpb3NbaV0uUFVOSVRORVRPKSAqICgoK3ZhbG9yUHJvbW8pIC8gMTAwKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJtYXIgbnVldm8gYXJyZWdsbywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIGFycmVnbG8gZW50cmFudGUuIFNlIHJlY29ycmUgZGUgYXRyYXMgaGFjaWEgYWRlbGFudGUgeSBzZSB2YSBjcmVhbmRvIGVsIG51ZXZvIGFycmVnbG9cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBcclxuICAgICAqIEBwYXJhbSByZXNpZHVvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQXJtYXJOdWV2b0FycmF5RGVzZGVSZXNpZHVvKGxQcmVjaW9zOiBBcnJheTxhbnk+LCByZXNpZHVvKSB7XHJcbiAgICAgICAgdmFyIGxQcmVjaW9zUmVzaWR1byA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBsUHJlY2lvcy5sZW5ndGggLSAxOyBpID4gcmVzaWR1bzsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1Jlc2lkdW8ucHVzaChsUHJlY2lvc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkFybWFyTnVldm9BcnJhdERlc2RlUmVzaWR1b1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zUmVzaWR1bztcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBwcm9tb2Npb25lcyBwb3IgcHJvY2Vzb3MsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZWwgTTMgcHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBNMyBQcm9jZXNvcyBPYmpldG8sIGNvbiBsYSBpbmZvcm1hY2lvbiBkZSB0b2RvcyBsb3MgTTNQcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBPYmpldG8gY29uIGluZm9ybWFjaW9uIGRlIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIGRlIGluZm9ybWFjaW9uIGFkaWNpb25hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbY29uZGljaW9uLkNvbmNlcHRvXSAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob00zUHJvY2Vzb3NbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgZWwgcHJvY2VzbyB0aWVuZSB1bmEgZm9ybWEgZGUgcGFnbyBxdWUgY3VtcGxhIGNvbiBsYSBjb25kaWNpb24gZW50cmFudGUsIGhhY2UgdW4gIHBhc3MgdHJ1ZSwgbGEgbG9naWNhIHNlIGhhY2UgZGVzZGUgbGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcm9jZXNvRm9ybWFQYWdvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgbGV0IGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgalJlc3BbXCJGb3JtYVBhZ29cIl0gPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICB2ZXJpZmljYXJQcm9jZXNvTGlzdGFQcmVjaW8ob0xpc3RhUHJlY2lvOiBNM1ByZExpc3RhLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKXtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvTGlzdGFQcmVjaW9bY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBwcm9tb2Npb25lcyBwb3IgcHJvY2Vzb3MsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZWwgTTMgcHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBNMyBQcm9jZXNvcyBPYmpldG8sIGNvbiBsYSBpbmZvcm1hY2lvbiBkZSB0b2RvcyBsb3MgTTNQcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBPYmpldG8gY29uIGluZm9ybWFjaW9uIGRlIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIGRlIGluZm9ybWFjaW9uIGFkaWNpb25hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1ByZEdlbmVyYWxbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gZGUgcHJvZHVjdG8gYWdydXBhZG8uXHJcbiAgICAgKiBAcGFyYW0gb1R5cGVNM1ByZEdycCBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9UeXBlTTNQcmRHcnBbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gYWRpY2lvbmFsLCBlc3RhIGluZm9ybWFjaW9uIGFkaWNpb25hbCBlc3RhIGVuIHVuYSB2YXJpYWJsZSBnbG9iYWw6IGdvRGF0YUFkaWNpb25hbFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBPYmpldG8gY29uIGluZm9ybWFjaW9uIGRlIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIGRlIGluZm9ybWFjaW9uIGFkaWNpb25hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb0FkaWNpb25hbChjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ29EYXRhQWRpY2lvbmFsW2NvbmRpY2lvbi5Db25jZXB0b10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0odGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJNT0RcIiAmJiArdGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSA+ICtjb25kaWNpb24uVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGluZm9ybWFjaW9uIGNvbnRyYSB1c3VhcmlvIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Vc2VyRGF0YShjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dICYmIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLmluY2x1ZGVzKCcsJykpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLnNwbGl0KCcsJykpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZWxlbWVudCwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBjb250cmEgZWwgZGV0YWxsZSBkZSBsYSBjb25kaWNpw7NuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sXHJcbiAgICAgICAgZGV0Q29uZGljaW9uZXM6IEFycmF5PE0zREVUQ09ORElQUk9NTz4sIGNvbmNlcHRvQ29uZGljaW9uOiBzdHJpbmcsIGpBZGljaW9uYWxlc0NvbmRpY2lvbikge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgb2RldENvbmRpY2lvbmVzRmluZGVkO1xyXG4gICAgICAgIHN3aXRjaCAoY29uY2VwdG9Db25kaWNpb24udHJpbSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tQMVwiOlxyXG5cclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDErMlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb1R5cGVNM1ByZEdycC5TS1AxICsgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5TS1AyKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tVXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tVLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfRElTUFwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRS50b1N0cmluZygpLCBkZXQuVmFsb3IudG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9USVBPXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuVElQTy50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgXCJQRVJfUFJPQ0VTT1wiOi8vKiBTb2xvIHZhbGlkYSB1bmEgZGV0Q29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICBsZXQgcGVyWFByb2Nlc286IE0zUGVyWFByb2Nlc287XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBwZXJYUHJvY2VzbyA9IG9NM1Byb2Nlc29zLk0zUGVyWFByb2Nlc28uZmluZCh4ID0+IHguVGlwb1BlcnNvbmEgPT0gZGV0Q29uZGljaW9uZXNbMF0uVmFsb3IudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkVOXCIgJiYgcGVyWFByb2Nlc28pIHtcclxuICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIgJiYgIXBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBTE1BQ0VOXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJIT1JBUklPX0hPUkFcIjpcclxuICAgICAgICAgICAgICAgIHZhciBvVGltZU5vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UaW1lTm93LmdldEhvdXJzKCkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiTG9NM1ByZEFkaWNpb25hbGVzXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0byAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFZsckFkaSA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLkNvbmNlcHRvKS5WQUxPUlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBWbHJBZGkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAvL1Byb2Nlc29zXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVswXS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUFJPQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvTTNQcm9jZXNvc1twcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW3Byb3BlcnR5XSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8vVmFsaWRhciByZXNwdWVzdGEsIGNvbiBvYmpldG8gYSB2YWxpZGFyXHJcbiAgICBwdWJsaWMgVmFsaWRhclJlc3B1ZXN0YShvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgakFkaWNpb25hbGVzO1xyXG4gICAgICAgIGlmIChvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgICAgICBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKG9iamVjdFZhbGlkYXRlLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNSBBZ3JlZ2FyIHNlY2Npb24gZGUgdmFsaWRhY2lvbmVzLlxyXG4gICAgICAgICAgICB2YXIgYlJlc3AgPSB0aGlzLlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzKGpBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgaWYgKGJSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NlIGVudmlhIGVuIGFkaWNpb25hbGVzLCBlbCBqc29uIGRlIGxhIGluZm9ybWFjaW9uIGVuY29udHJhZGEgZGVsIGRldGFsbGUuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciByZWdsYXMgY29uZmlndXJhZGFzIGRlc2RlIEpTT04gZGUgQWRpY2lvbmFsZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXM6IGFueSkge1xyXG4gICAgICAgIHZhciBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXNcIilcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMgJiYgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVklHRU5DSUFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLlZhbGlkYXJWaWdlbmNpYShqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMuVkFMMSwgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipFcnJvclwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZhbGlkYXJWaWdlbmNpYSh2YWwxOiBEYXRlLCB2YWwyOiBEYXRlKSB7XHJcblxyXG4gICAgICAgIHZhciBGZWNoYUFjdHVhbCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMSlcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh2YWwyKVxyXG5cclxuICAgICAgICAvLyB2YXIgZFZhbDEgPSBuZXcgRGF0ZSh2YWwxKTtcclxuICAgICAgICAvLyB2YXIgZFZhbDIgPSBuZXcgRGF0ZSh2YWwyKTtcclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDIpXHJcblxyXG5cclxuICAgICAgICB2YXIgbkZlY2hhQWN0dWFsOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcihGZWNoYUFjdHVhbCk7IC8vKyhGZWNoYUFjdHVhbC5nZXRGdWxsWWVhcigpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldE1vbnRoKCkgKyBcIlwiICsgRmVjaGFBY3R1YWwuZ2V0RGF0ZSgpKTtcclxuICAgICAgICB2YXIgblZhbDE6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDEpOyAvLysoZFZhbDEuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMS5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDEuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICB2YXIgblZhbDI6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDIpIC8vKyhkVmFsMi5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRWYWwyLmdldE1vbnRoKCkgKyBcIlwiICsgKCtkVmFsMi5nZXREYXRlKCkgKyAxKSApO1xyXG4gICAgICAgIGlmIChuRmVjaGFBY3R1YWwgPj0gblZhbDEgJiYgbkZlY2hhQWN0dWFsIDw9IG5WYWwyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRGZWNoYU51bWJlcihkYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgYWNjaW9uLCBzaSBubyB0aWVuZSBjYXJnYWRhIHVuYS4gRXN0YSBhY2Npb24gc2UgY2FyZ2EgamVyYXJxdWljYW1lbnRlLlxyXG4gICAgcHVibGljIFZhbGlkYXJBY2Npb24oalJlc3AsIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqc29uQWRpYyA9IEpTT04ucGFyc2UoakFkaWNpb25hbGVzKTtcclxuICAgICAgICBpZiAoalJlc3AuQWNjaW9uID09IG51bGwgJiYganNvbkFkaWMuUk9PVC5BY2Npb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSBqc29uQWRpYy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvbWFyIGluZm9ybWFjacOzbiBcclxuICAgIHB1YmxpYyBSZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihvTTNFTkNQUk9NTzogTTNFTkNQUk9NTywgalJlc3ApIHtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24gPSB7fTtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24uTm9tYnJlID0gb00zRU5DUFJPTU8uTm9tYnJlO1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5JRCA9IG9NM0VOQ1BST01PLklkUHJvbW9jaW9uO1xyXG4gICAgICAgIC8vU2kgbm8gdHV2byBuaW5ndW5hIGFjY2lvblxyXG4gICAgICAgIGlmIChqUmVzcC5BY2Npb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSB7IFwiVGlwbzJcIjogb00zRU5DUFJPTU8uVGlwbzIsIFwiVGlwb1wiOiBvTTNFTkNQUk9NTy5UaXBvIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vIFJldG9tYXIgZGVzZGUgZWwgZW5jYWJlemFkbyBwcm9tbywgc2kgbm8gZXhpc3RlIGVsIHRpcG8geSBUaXBvMlxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8yID0gb00zRU5DUFJPTU8uVGlwbzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFqUmVzcC5BY2Npb24uVGlwbykge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8gPSBvTTNFTkNQUk9NTy5UaXBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIHByb21vY2nDs24sIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvZHVjdG8gYSBhcGxpY2FyIGxhIHByb21vY2lvbiB5IGxhcyBwcm9tb2Npb25lcyBhIGFwbGljYXJcclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vY2lvbihKUHJvbW9jaW9uZXM6IEFycmF5PGFueT4sIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBxdWUgc2UgaGFjZW4gdmFsaWRhcyBkZXNwdWVzIGRlIHJlZ2lzdHJhciB0b2RvcyBsb3MgcHJvZHVjdG9zLlxyXG4gICAgICogQHBhcmFtIEpQcm9tb2Npb25lcyBcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9BZnRlcihKUHJvbW9jaW9uZXM6IEFycmF5PGFueT4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4pOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb00zUHJvY2Vzb3MuVmFsb3JOZXRvO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuUHJvY2VzYXJQcm9tb0dlbmVyYWwoSlByb21vY2lvbmVzLCBvTTNQcm9jZXNvcy5WYWxvck5ldG8sIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01PKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIGVuIGdlbmVyYWxcclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gblByZWNpbyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb0dlbmVyYWwoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBuUHJlY2lvOiBudW1iZXIsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB2YXIgb0xpc3RhUHJvbW9zQXNvYyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IEpQcm9tb2Npb25lcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgLy9KUHJvbW9jaW9uZXMuZm9yRWFjaChwcm9tb2Npb24gPT4ge1xyXG4gICAgICAgICAgICB2YXIgcHJvbW9jaW9uID0gSlByb21vY2lvbmVzW19pXTtcclxuICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gdGhpcy5Qcm9jZXNhclByb21vQnlUaXBvKHByb21vY2lvbiwgblByZWNpbywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8pO1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBvTGlzdGFQcm9tb3NBc29jLnB1c2gob1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgblByZWNpbyk7XHJcblxyXG4gICAgICAgIC8vIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPCAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9kbmVvIGRlIGxvcyB2YWxvcmVzIHRvdGFsZXNcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgbWVqb3Igb3BjaW9uLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHByb21vY2lvbmVzIHByb2Nlc2FkYXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBMaXN0YSBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBQcm9tb2Npb24gcHJvY2VzYWRhLCBxdWUgcmV0b3JuYXLDoSBhIGZsdWpvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhck1lam9yUHJvbW9jaW9uKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW86IG51bWJlcik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgbGV0IHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgIC8vU2kgZWwgcHJvZHVjdG8gZXN0YSByZXN0cmluZ2lkbyBsZSBkYSBtYXlvciBwcmlvcmlkYWQgYSBlc3RhIHByb21vY2nDs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tbyBvZiBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIiAmJiAheC5mbGFncy5mb3JtYVBhZ28pKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW8uVmFsb3JQb3JjZW50YWplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBudWV2b1ZhbG9yRGVzY3VlbnRvID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBwcm9tby5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgcHJvbW8uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW8uVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8vLy8vL0ZVTkNJT05BTElEQUQgUFJPRFJJQSBGVU5DSU9OQVIgTcOBUyBBREVMQU5URSwgU0kgU0UgUVVJRVJFIEFHUlVQQVIgTEFTIFBST01PQ0lPTkVTIEFDTSBZIEVYQ1xyXG4gICAgICAgICAgICAvLyBpZihkUHJvbW9BQ00gPT0gMCAmJiBkUHJvbW9FWEMgPT0gMCl7XHJcbiAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlIGVuY29udHJhcm9uIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgaWYoZFByb21vQUNNID4gZFByb21vRVhDKXtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvL0dhbmEgcHJvbW9jaW9uZXMgYWN1bXVsYXRpdmFzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5mb3JFYWNoKHggPT4geC5BcGxpY2FkYSA9IHRydWUpOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jOy8vLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIilcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgZFByb21vQUNNKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3JNb25lZGVybyksIDApO1xyXG4gICAgICAgICAgICAvLyAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGV4Y2x1eWVudGVzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5BcGxpY2FkYSA9IHRydWU7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0VYQykgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4ocHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIHZhbG9yUHJvbW9FWEM6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9tb0V4YzogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9FWEMgPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21vRXhjID0gb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSB2YWxvclByb21vRVhDIHx8IHguVmFsb3JNb25lZGVybyA9PSB2YWxvclByb21vRVhDKTtcclxuICAgICAgICAgICAgcHJvbW9FeGMuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgcHJvbW9FeGMuVmFsb3IpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tb0V4Yy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFwbGljYVByb21vQUNNRElOKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vQUNNRElOOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodmFsb3JQcm9tb0FDTURJTiA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcHJvbW8gb2Ygb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhID09IFwiQUNNRElOXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHZhbG9yUHJvbW9BQ01ESU4pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyB2YWxvclByb21vQUNNRElOKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBtYXhpbW8gdmFsb3Igc2VndW4gbGEgcmVnbGEgYSBjb21wYXJhclxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgXHJcbiAgICAgKiBAcGFyYW0gc1JlZ2xhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgc1JlZ2xhOiBzdHJpbmcsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc3dpdGNoIChzUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJBQ01cIjpcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXN1bHQgPSBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gc1JlZ2xhICYmICF4LmZsYWdzLmZvcm1hUGFnbykucmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5WYWxvciksIDApO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFDTURJTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVjaW9BY3R1YWwgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclRvdGFsRGVzY3VlbnRvID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTURJTlwiICYmICgheC5mbGFncy5mb3JtYVBhZ28gfHwgeC5UaXBvID09IFwiTU9ORURFUk9cIikpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVldm9WYWxvckRlc2N1ZW50byA9IChwcmVjaW9BY3R1YWwgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9BY3R1YWwgLT0gcHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbG9yVG90YWxEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiRVhDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKS5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8uVmFsb3IgPiBvLlZhbG9yTW9uZWRlcm8gPyBvLlZhbG9yIDogby5WYWxvck1vbmVkZXJvOyB9KSlcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbiBzZWd1biBlbCB0aXBvIFxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9CeVRpcG8ocHJvbW9jaW9uOiBhbnksIFByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgQWNjaW9uO1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbmV3IFByb21vY2lvbmVzQXNvY2lhZGFzKCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLlByb21vY2lvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbiA9IHByb21vY2lvbi5Qcm9tb2Npb24uSUQ7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTm9tYnJlID0gcHJvbW9jaW9uLlByb21vY2lvbi5Ob21icmU7XHJcbiAgICAgICAgICAgICAgICBBY2Npb24gPSBwcm9tb2Npb24uQWNjaW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2lvbi5SZWdsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IEFjY2lvbi5SZWdsYTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhID0gXCJFWENcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMjtcclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fJVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvclBvcmNlbnRhamUgPSArQWNjaW9uLlZhbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAqICgoK0FjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX1ZBTE9SXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX0VYQUNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pIC0gKCtBY2Npb24uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBBY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGFPYnNlcSA9IEFjY2lvbi5SZWdsYU9ic2VxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTywgQWNjaW9uLk9CU0VRVUlPUywgb1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YWxpZGFyIGNhbnRpZGFkIHZzIGNhbnRpZGFkIGRlIG9ic3F1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNT05FREVST1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9GUyAyMDE5MDgyNyBZYSBubyBzZSBndWFyZGEgZWwgdmFsb3IgdG90YWwgZGVsIG1vbmVkZXJvIHNpIG5vIHVuaWNhbWVudGUgZWwgcG9yY2VudGFqZS4uLiBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNVUE9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklkQ3Vwb24gPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkFfUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMubElkQWN0aXZhUHJvbW8gPSBBY2Npb24uVmFsb3Iuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvL3RoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQob1Byb21vY2lvbmVzQXNvY2lhZGFzLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlRpcG8gPT0gXCJDT01CSU5BREFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEgPSBuZXcgUHJvbW9jaW9uQ29tYmluYWRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5UaXBvMiA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuTm9tYnJlID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uID0gQWNjaW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbXBvc0FkaWNpb25hbGVzKG9NM0VOQ1BST01PLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLCBwcm9tb2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLkZvcm1hUGFnbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5mbGFncy5mb3JtYVBhZ28gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPixcclxuICAgICAgICBvYnNlcXVpb3M6IEFycmF5PGFueT4sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkQ6IG51bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEUmVhbDogbnVtYmVyID0gdGhpcy5nb0RhdGFBZGljaW9uYWwuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIHByb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSAreC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5DYW50aWRhZE9ic2VxID0gVmFsb3JDYW50UFJEXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBjYW1wb3MgYWRpY2lvbmFsZXMgZW4gcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNFTkNQUk9NTyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uQ29tYmluYWRhIFxyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uOiBhbnkpIHtcclxuICAgICAgICBzd2l0Y2ggKG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIpIHtcclxuICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgLy9BZ3JlZ2FyIENhbnRpZGFkLlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNWYWxvckNhbnRpZGFkOiBzdHJpbmcgPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNhbnRpZGFkT2JzcSA9IHNWYWxvckNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgIC8vIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIC8vIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgakFkaWM6YW55ID0gSlNPTi5wYXJzZShwcm9tby5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uQ2xhc2lmaWNhY2lvbiA9IGpBZGljLlJPT1QuQWNjaW9uLkNhcmFjdGVyaXN0aWNhO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5OdW1Db25kaWNpb25lcyA9IHByb21vLk0zQ09ORElBR1JVUEFDSU9OWzBdLk0zQ09ORElQUk9NTy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLklEQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uSWRDb25kaWNpb24gPSBwcm9tb2Npb24uSURDb25kaWNpb25cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEZpbiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIFByb2Nlc2FtaWVudG8gQ29tYmluYWRhIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vUHJvY2VzYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5Qcm9tb0NvbWJpbmFkYXNWMihvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb2Nlc2FyQ29tYmluYWRhXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vVjIgQ09NQklOQURBXHJcbiAgICAvKipcclxuICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbmVzIGNvbWJpbmFkYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzIGRlIE0zUHJvY2Vzb3NcclxuICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gT2JqZXRvIE0zIFByb2Nlc29zLCBlbCBjdWFsIHNlIHJlY29ycmVyw6EgbGEgaW5mb3JtYWNpb24gZGUgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAqL1xyXG4gICAgcHVibGljIFByb21vQ29tYmluYWRhc1YyKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICBsZXQgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsID0gXy5jbG9uZURlZXAoaW9NM1Byb2Nlc28uTTNFTkMpO1xyXG5cclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIHZhciBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhc1tpXTtcclxuICAgICAgICAgICAgdmFyIGVzQWN1bXVsYWJsZSA9IHRoaXMuR2V0RXNBY3VtdWxhYmxlUHJvbW8oY29tYmkpXHJcbiAgICAgICAgICAgIC8vL09idGVuZXIgdG9kb3MgbG9zIEVuY2FiZXphZG9zIHF1ZSBhcGxpY2FuIGEgbGEgcHJvbW9jaW9uIGEgbGEgcXVlIHNlIGVzdGEgaXRlcmFuZG9cclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IHRoaXMuR2V0RW5jYWJlemFkb0J5Q29tYmkoY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgc3dpdGNoIChjb21iaS5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlczogMyBnYXNlb3NhcyBwb3IgJDUwMFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Qcm9jZXNhclByb21vT2JzcUNpZXJyZShsUHJlY2lvcywgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX1NVTVRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhck9ic2VxU3VtVG90YWwob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiLCBjb21iaSwgbFByZWNpb3MsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBUEFSQ0lBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3JkZW5hckxpc3RhRW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyQ2FyYWN0ZXJpc3RpY2FQYXJjaWFsKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGxDb21ibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFwbENvbWJvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwbENvbWJvID0gdGhpcy5Qcm9tb2Npb25Db21iaW5hZGFDb21ibyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fVkFMT1JUT1RBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9EX0FQTERFU0NcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWIsIGNvbWJpLCBpb00zUHJvY2VzbywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlcyBwYXJhIDJ4MSwgM3gxLCA0eDIsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTGlzdEVuY2FiICYmIG9MaXN0RW5jYWIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vU2UgcmVlc3RhYmxlY2UgbGEgY2FudGlkYWQgb3JpZ2luYWwgcGFyYSBxdWUgbm8gc2UgcXVlZGUgZW4gdW4gYnV2bGUgaW5maW5pdG9cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1BFbmNPcmlnaW5hbGVzIG9mIGVuY0NvbkxhQ2FudGlkYWRPcmlnaW5hbCkge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRPcmlnaW5hbCA9IG9NM1BFbmNPcmlnaW5hbGVzLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0FjdHVhbCA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNPcmlnaW5hbGVzLklEKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGNhbnRpZGFkT3JpZ2luYWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9yZGVuYXJMaXN0YUVuYyhvbGlzdGFFbmM6IE0zUEVuY0l0ZW1zW10sIGVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgIGlmIChlc0FjdW11bGFibGUpIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUTkVUTycpLlZhbG9yKSAtICgrYS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpKTtcclxuICAgICAgICBlbHNlIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVCcpLlZhbG9yKSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG4gICAgICAgIHZhciBjYW50aWRhZERlc2NQcm9tbzogbnVtYmVyID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxDb21wcmE6IG51bWJlciA9IGxQcmVjaW9zLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSArIE51bWJlcihiLlBVTklUTkVUTyk7IH0sIDApO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcocHJlY2lvVG90YWxDb21wcmEpO1xyXG4gICAgICAgIGxldCBkZXNjQWN1bSA9IDA7XHJcbiAgICAgICAgbGV0IGRlc2NQcm9kQWN0dWFsO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxQcmVjaW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRlc2NQcm9kQWN0dWFsID0gKGxQcmVjaW9zW2ldLlBVTklUTkVUTyAvIHByZWNpb1RvdGFsQ29tcHJhKSAqIGNhbnRpZGFkRGVzY1Byb21vIC8vNDBcclxuICAgICAgICAgICAgZGVzY0FjdW0gKz0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gbFByZWNpb3NbaV0uUFVOSVRORVRPIC0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIC8vIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gICAgIGlmIChsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPCBjYW50aWRhZERlc2NQcm9tbykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGNhbnRpZGFkRGVzY1Byb21vIC09IGxQcmVjaW9zW2ldLlBVTklUTkVUTztcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLT0gY2FudGlkYWREZXNjUHJvbW87XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IGRlc2NBY3VtIHx8IGNhbnRpZGFkRGVzY1Byb21vIDwgZGVzY0FjdW0pIHtcclxuICAgICAgICAgICAgLy9maW5kIGRlbCB1bHRpbW8gXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJFbmNvbnRyZSBkaWZlcmVuY2lhIGVuIHByb21vcyBjb21iaW5hZGFzOiBcIiArIGNhbnRpZGFkRGVzY1Byb21vICsgXCIgdnMgXCIgKyBkZXNjQWN1bSk7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyA9IGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyAtIChjYW50aWRhZERlc2NQcm9tbyAtIGRlc2NBY3VtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJPYnNlcVN1bVRvdGFsKHByb2R1Y3Rvc0FwbGljYVByb21vOiBNM1BFbmNJdGVtc1tdLCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB2YWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZFByb2R1Y3RvQWN0dWFsID0gMTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBlbmNJdGVtIG9mIHByb2R1Y3Rvc0FwbGljYVByb21vKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgICAgICBsZXQgcFVuaXRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB3aGlsZSAoY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA8PSBjYW50aWRhZEFjdHVhbCkge1xyXG4gICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zICs9IHBVbml0QWN0dWFsO1xyXG4gICAgICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCsrO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0b1JldmlzYWRvID0gcHJvZHVjdG9zUmV2aXNhZG9zLmZpbmQoeCA9PiB4LklkID09IGVuY0l0ZW0uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RvUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBlbmNJdGVtLklELCBDYW50aWRhZDogMSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdW1hVmFsb3JQcm9kdWN0b3MgKyBkaWZlcmVuY2lhID49IHZhbG9yUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckNvbWJvICs9IHN1bWFWYWxvclByb2R1Y3RvcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIG9NM1Byb2Nlc29zLCBwcm9kdWN0b3NSZXZpc2Fkb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IHN1bWFWYWxvclByb2R1Y3RvcyAtIHZhbG9yUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIHZhbG9yQ29tYm8sIDEpO1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBvTTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcykge1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgcHJvZEhpam86IE0zUEVuY0l0ZW1zO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBwcm9kUmV2aXNhZG8gb2YgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9kUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IHByb2RSZXZpc2Fkby5JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kSGlqbyA9IF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ocHJvZEhpam8sIHByb2RSZXZpc2Fkby5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChwcm9kSGlqbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhckFQcm9kdWN0b3NRdWl0YXJDb21iaShvTTNQcm9jZXNvLCBwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm9TdW1Ub3RhbChwcm9kdWN0b3NFbk0zUHJvY2VzbzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRMaXN0YVByZWNpb3MobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc0ZpbHRlciA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih5ID0+IHkuSUQgPT0gb0xpc3RFbmNhYltpXS5JRCkuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zRmlsdGVyLnB1c2goeCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbW9jaW9uIGRlIGNvbWJvLCB4IHByb2R1Y3RvcywgeSBwcm9kdWN0b3MsIC4uLiBuIHByb2R1Y3RvcyBcclxuICAgICAqIHBvciAkMTAwMFxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKiBAcGFyYW0gYkVzQWN1bXVsYWJsZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4sIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGxldCBmbGFnQXBsaWNvUHJvbW8gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgbk51bWVyb0NvbmRpY2lvbmVzOiBudW1iZXIgPSArY29tYmkuQWNjaW9uLk51bUNvbmRpY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JQcm9tbyA9ICtjb21iaS5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBMaXN0Q29uZGljaW9uZXMgPSBuZXcgQXJyYXk8QXJyYXk8YW55Pj4oKTtcclxuICAgICAgICAgICAgdmFyIG1pbmltb0l0ZW1zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBsZXQgcG9yY2VudGFqZVByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxTaW5Qcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZTogTTNSZWdTZXJ2aWNlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG5OdW1lcm9Db25kaWNpb25lczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBjb25kaWNpb24gMS5cclxuICAgICAgICAgICAgICAgIHZhciBMaXN0UHJvbW9Db21iaTogQXJyYXk8TTNQRW5jSXRlbXM+ID0gdGhpcy5CdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYiwgaS50b1N0cmluZygpLCBjb21iaS5JZFByb21vY2lvbkNvbWJpbmFkYS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIExpc3RDb25kaWNpb25lcy5wdXNoKHRoaXMuR2V0TGlzdGFQcmVjaW9zKGxQcmVjaW9zLCBMaXN0UHJvbW9Db21iaSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbHRyYXJMaXN0YUNvbmRpY2lvbmVzQ29tYm8oTGlzdENvbmRpY2lvbmVzLCBvTGlzdEVuY2FiKTtcclxuICAgICAgICAgICAgaWYgKExpc3RDb25kaWNpb25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBlbCB2YWxvciBtZW5vciBkZSBsYXMgaXRlbXMgYWdyZWdhZGFzXHJcbiAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IExpc3RDb25kaWNpb25lc1swXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGorKykgey8vQ29taWVuemEgZGVzZGUgMSBwb3JxdWUgZWwgMCB5YSBzZSB2YWxpZG8gZW4gbGEgYW50ZXJpb3IgbGluZWFcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXNQcmVjaW9zOiBBcnJheTxhbnk+ID0gTGlzdENvbmRpY2lvbmVzW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdNaW4gPSBpdGVtc1ByZWNpb3MubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdNaW4gPCBtaW5pbW9JdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IG5ld01pbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL0xvcyBjb21ib3MgZGViZW4gcHJvY2VzYXJzZSBkZSBhIHVubyBwYXJhIHN1IGNvcnJlY3RvIGZ1bmNpb25hbWllbnRvXHJcbiAgICAgICAgICAgICAgICBpZiAobWluaW1vSXRlbXMgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1vSXRlbXMgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vUmVjb3JyZSB0b2RvcyBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zIGRlIGxhIHByb21vIHBhcmEgc2FiZXIgY3VhbCBlcyBlbCB2YWxvciByb2FsIGRlIGxhIHByb21vXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5Qcm9tbyArPSArbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9DYWxjdWxhIGVsIHZhbG9yIGRlbCBwb3JjZW50YWplIGRlIGxhIHByb21vIGEgcGFydGlyIGRlbCBjYWxvciBkZWwgY29tYm8geSBkZSBsYSBzdW1hIGRlIGxvcyBwcmVjaW9zIG9yaWdpbmFsZXMgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICAgICAgICAgICAgcG9yY2VudGFqZVByb21vID0gMTAwIC0gKCtWYWxvclByb21vICogMTAwIC8gdmFsb3JUb3RhbFNpblByb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5mb3JFYWNoKHByZWNpbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlY2lvLkluZGljZSA9PSBlbmMuSW5kaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVjaW8uUHJvbW9BcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3IgPSBwcmVjaW8uUFVOSVRORVRPO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Nb2RpZmljYSBlbCBwcmVjaW8gZGUgbG9zIHByb2R1Y3RvcyBhIHN1IG51ZXZvIHZhbG9yIGNvbiBsYSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IHZhbG9yIC0gKHZhbG9yICogcG9yY2VudGFqZVByb21vIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlByb21vQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJlY2lvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRW4gbGFzIHByb21vcyBwb3IgY29tYm8gbm8gYXBsaWNhbiBlbCBwcmVjaW8gZGUgbG9zIG90cm9zIHByb2R1Y3RvcyBxdWUgbm8gaGFjZW4gcGFydGUgZGVsIGNvbWJvIDopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xQcmVjaW9zLmZpbmQoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LkluZGljZSA9PSBlbmMuSW5kaWNlKS5QVU5JVE5FVE8gPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ0FwbGljb1Byb21vID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdBcGxpY29Qcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbGV0IHByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gY29tYmkuQWNjaW9uLkNvZGlnbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFwcm9kdWN0b1Byb21vQ29tYmlFeGlzdGVudGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8oaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIGNvbWJpLkFjY2lvbi5WYWxvciwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGltcGlhckVuY0l0ZW1QcmRDb25kaShvTGlzdEVuY2FiKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9tb2Npb25Db21iaW5hZGFDb21ib1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWdBcGxpY29Qcm9tbztcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhsaXN0Q29uZGljaW9uZXM6IEFycmF5PGFueT4sIG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0Q29uZGljaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBudWV2YUNvbmRpY2lvbiA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmRpY2lvbiBvZiBsaXN0Q29uZGljaW9uZXNbX2ldKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5jSXRlbSA9IG9NM1BFbmNJdGVtc0xpc3QuZmluZCh4ID0+IHguSUQgPT0gY29uZGljaW9uLklEKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA9IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA/IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldENhbnRpZGFkID4gZW5jSXRlbVtcIlByZENvbmRpXCJdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51ZXZhQ29uZGljaW9uID0gW2NvbmRpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGlzdENvbmRpY2lvbmVzW19pXSA9IG51ZXZhQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsaW1waWFyRW5jSXRlbVByZENvbmRpKG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIG9NM1BFbmNJdGVtc0xpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGVsZW1lbnRbXCJQcmRDb25kaVwiXTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkID0gMSkge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b1F1aXRhcjtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0gPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByb2R1Y3RvUXVpdGFyID0gb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9RdWl0YXIpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9RdWl0YXIuQ2FudGlkYWQgKz0gKC0xICogY2FudGlkYWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLnB1c2goeyBJRDogb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8sIENhbnRpZGFkOiAoLTEgKiBjYW50aWRhZCkgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZ3JlZ2EgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGUgZW50cmFkYSBhIHVuIGFycmVnbG8gZGUgcHJvZHVjdG9zIHF1ZSBwb3N0ZXJpb3JtZW50ZSBzZXJhIGxvcyBwcm9kdWN0b3MgaGlqb3MgZGVsIHByb2R1Y3RvIENvbWJvXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3MocHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gdGhpcy5nZXRQcm9kdXRvUHJvbW9Db21ibyhvTTNQcm9jZXNvLk0zRU5DLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAvL0xhIGNhbnRpZGFkIGRpc21pbnV5ZSBwZXJvIGVzdGUgbW92aW1pZW50byBzZSByZXZlcnNhIGFsIHRlcm1pbmFyIGRlIHZhbGlkYXIgZXN0YSBwcm9tb1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXMsIDEpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0Rpc21pbnV5ZSBlbiB1bm8gbGEgY2FudGlkYWQgZGVsIHByb2R1Y3RvIHkgcmV0b3JuYSB1biBjbG9uIGRlIGVzdGVcclxuICAgIGdldFByb2R1dG9Qcm9tb0NvbWJvKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBlbiBoYXNobWFwIGRlIHByZWNpb3NcclxuICAgICAqIEBwYXJhbSBobWxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIElEIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkdG9IbVByZWNpb3MoaG1sUHJlY2lvczogQXJyYXk8YW55PiwgSUQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBmaW5kZWQ6IGFueSA9IGhtbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gSUQpO1xyXG4gICAgICAgIGlmIChmaW5kZWQpIHtcclxuICAgICAgICAgICAgZmluZGVkLkluZGljZSA9ICtmaW5kZWQuSW5kaWNlICsgKzE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmluZGVkID0geyBcIklEXCI6IElELCBcIkluZGljZVwiOiAwIH07XHJcbiAgICAgICAgICAgIGhtbFByZWNpb3MucHVzaChmaW5kZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmluZGVkLkluZGljZTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1c2NhciBlbmNhYmV6YWRvcyBxdWUgdGVuZ2EgbGEgcHJvbW9jaW9uIHkgY29uZGljaW9uIGVudmlhZGEgY29tbyBwYXJhbWV0cm9cclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIFxyXG4gICAgICogQHBhcmFtIElkQ29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGlkUHJvbW9jaW9uZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBCdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBJZENvbmRpY2lvbjogc3RyaW5nLCBpZFByb21vY2lvbmVzOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0VuY0ZpbmRlZCA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUpXHJcbiAgICAgICAgICAgICAgICBpZiAoIW9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlIHx8ICEob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXQgJiYgZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9zOiBBcnJheTxhbnk+ID0gSlNPTi5wYXJzZShkZXQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9GaW5kZWQgPSBwcm9tb3MuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gaWRQcm9tb2Npb25lcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGljaW9uRmluZGVkID0gcHJvbW9GaW5kZWQuQWNjaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQuZmluZCh4ID0+IHggPT0gSWRDb25kaWNpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCA9PSBJZENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0VuY0ZpbmRlZC5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvRW5jRmluZGVkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpw7NuIHNpIGxhIHByb21vY2nDs24gcXVlIGxsZWdhIGNvbW8gcGFyYW1ldHJvLCBlcyBhY3VtdWxhYmxlIG8gbm9cclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRFc0FjdW11bGFibGVQcm9tbyhwcm9tb2Npb246IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uLlJlZ2xhICYmIHByb21vY2lvbi5BY2Npb24uUmVnbGEgPT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldEVzQWN1bXVsYWJsZVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgbGV0IHByb2RzQXBsRGVzY3VlbnRvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgc2t1QXBsRGVzY3VlbnRvczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5za3VBcGxEZXNjOyAvL1t7U0tVOlwiWFhYWFhYXCJ9LCB7U0tVOlwiWVlZWVlZWVwifV1cclxuICAgICAgICBsZXQgbWF4TnVtRGVzY3VlbnRvcyA9ICtjb21iaS5BY2Npb24ubWF4TnVtRGVzYztcclxuICAgICAgICBsZXQgY29udERlc2NBcGxpY2Fkb3MgPSAwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL0NhbGN1bGEgZWwgbnVtZXJvIG1heGltbyBkZSBkZXNjaW5ldG9zIHF1ZSBwdWVkZSBhcGxpY2FyIGxhIHByb21vIHF1ZSBlcyBjb21iaS5BY2Npb24ubWF4TnVtRGVzYyBtdWx0aXBsaWNhZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgcGFsaWNhbiBsYSBwcm9tbyBlbiBlbCBwcm9jZXNvXHJcbiAgICAgICAgICAgIG1heE51bURlc2N1ZW50b3MgPSBvTGlzdEVuY2FiLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyArY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB9LCAwKSAqIG1heE51bURlc2N1ZW50b3M7XHJcblxyXG4gICAgICAgICAgICAvL0RlIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gZmlsdHJvIGxvcyBwcm9kdWN0b3MgcXVlIGFwbGljYXJhbiBlbCBkZXNjdWVudG8gc2VndW4gbG9zIFNLVSBjb25maWd1cmFkb3MgZW4gY29tYmkuQWNjaW9uLnNrdUFwbERlc2NcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28uTTNFTkMuZm9yRWFjaChvTTNQRW5jSXRlbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNrdUFwbERlc2N1ZW50b3MuZmluZCh4ID0+IHguU0tVID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RzQXBsRGVzY3VlbnRvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL0PDoWxjdWxvIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcyBkZSBsb3MgcHJvZHVjdG9zIGEgbG9zIHF1ZSBsYSBwcm9tbyBhcGxpY2FyYSBkZXNjdWVudG9cclxuICAgICAgICAgICAgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhwcm9kc0FwbERlc2N1ZW50bywgZXNBY3VtdWxhYmxlKTtcclxuXHJcbiAgICAgICAgICAgIC8vQXBsaWNhIHRhbnRvcyBkZXNjdWVudG9zIHNlIHB1ZWRhbiBhIHBsYWljYXIgYSBjYWRhIHZhbG9yIGRlIGxQcmVjaW9cclxuICAgICAgICAgICAgd2hpbGUgKGNvbnREZXNjQXBsaWNhZG9zIDwgbWF4TnVtRGVzY3VlbnRvcyAmJiBjb250RGVzY0FwbGljYWRvcyA8IGxQcmVjaW9zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTyAtPSAoK2xQcmVjaW9zW2NvbnREZXNjQXBsaWNhZG9zXS5QVU5JVE5FVE8pICogKCgrY29tYmkuQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICBjb250RGVzY0FwbGljYWRvcysrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1JlY2FsY3VsYSBsb3MgdmFsb3JlcyBkZWwgcHJvZHVjdG8gYXBsaWNhbmRvIGVsIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHNBcGxEZXNjdWVudG8sIGNvbWJpLCB0cnVlLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBvYnNlcXVpb3MgZW4gZWwgY2llcnJlXHJcbiAgICAgKiBWYWxpZGEgdG9kYSBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYSBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAqIFZhbGlkYSBsYSBwcm9tb2Npw7NuLCBwb3IgY2FkYSBjdWFudG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zLCBjdcOhbnRvcyBvYnNlcXVpb3Mgc2UgcHVlZGVuIGRhci5cclxuICAgICAqIFRyYWUgdG9kb3MgbG9zIG9ic2VxdWlvcyBxdWUgc2UgaW5ncmVzYXJvbiBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXMsIGxvcyBsaXN0YVxyXG4gICAgICogY29sb2NhIGVuIHZhbG9yIDAgbG9zIG9ic2VxdWlvcyBxdWUgc2VsZWNjaW9ubyBhdXRvbWF0aWNhbWVudGUgZWwgYWxnb3JpdG1vXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcywgaW1wdWVzdG9zIHkgZGVtYXMgdmFsb3JlcyB0b3RhbGVzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgbG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zIGFsIGNhcnJpdG8gcXVlIHRpZW5lbiBvYnNlcXVpb1xyXG4gICAgICogQHBhcmFtIGNvbWJpIEluZm9ybWFjacOzbiBkZSBwcm9tb2Npw7NuIGRlIG9ic2VxdWlvc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFByb2Nlc28gY29uIHRvZG9zIGxvcyBwcm9kdWN0b3MgZSBpbmZvcm1hY2nDs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vT2JzcUNpZXJyZShvTGlzdEVuY2FiOiBBcnJheTxhbnk+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29bJ1Byb2R1Y3Rvc0NvbWJpJ10gPSBbXTtcclxuICAgICAgICBsZXQgY2FudFBvck9icyA9ICtjb21iaS5BY2Npb24uQ2FudGlkYWRPYnNxOyAvL1BvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGNvbiBsYSBwcm9tb2Npw7NuIHNlIGRhcsOhIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgIGxldCBjYW50QWdyZWdhZGEgPSAwO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9yQ29tYm8gPSAwO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IG0zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9MaXN0YU9ic2VxdWlvcyA9IGNvbWJpLkFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9ic2VxdWlvc0NhbnRpZGFkID0gMFxyXG4gICAgICAgIC8vIHZhciBjYW50T2JzZXF1aW9zOiBudW1iZXIgPSAwOyAvL0NhbnRpZGFkIGRlIG9ic2VxdWlvcyBxdWUgc2UgZGFyw6EgcG9yIGVzdGEgY29tcHJhLlxyXG5cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWN0byBvZiBvTGlzdEVuY2FiKSB7XHJcbiAgICAgICAgICAgIHN1bWFWYWxvclByb2R1Y3RvcyArPSBwcm9kdWN0by5QVU5JVE5FVE87XHJcbiAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSsrO1xyXG4gICAgICAgICAgICBsZXQgcHJvZHVjdG9SZXZpc2FkbyA9IHByb2R1Y3Rvc1JldmlzYWRvcy5maW5kKHggPT4geC5JZCA9PSBwcm9kdWN0by5JRCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9kdWN0b1JldmlzYWRvKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBwcm9kdWN0by5JRCwgQ2FudGlkYWQ6IDEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjYW50QWdyZWdhZGEgPT09IGNhbnRQb3JPYnMpIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJvZHVjdG9zUmV2aXNhZG9zKTtcclxuICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBtM1JlZ1NlcnZpY2UubG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaS5BY2Npb24uQ29kaWdvLCB2YWxvckNvbWJvLCAxKTtcclxuICAgICAgICAgICAgbTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzb1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBtM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBsaWNhciByZWdsYXMsIHJlc3BlY3RvIGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhLlxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvbmVzQXNvY2lhZGFzIFxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcblxyXG4gICAgICAgIHZhciBpQ2FudGlkYWRQcm9tbzogbnVtYmVyID0gQWNjaW9uLkNhbnRpZGFkOyAvL0VqZW1wbG8gOiAzXHJcbiAgICAgICAgLy92YXIgaUNhbnRpZGFkQVBMUHJvbW86IG51bWJlcjsgLy9OdW1lcm8gcmVhbCBkZSBhcGxpY2FjaW9uIGRlIHByb21vY2lvbmVzLCBTaSBhcGxpY2EgcmVzdGEgZWwgcmVzaWR1by5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyOyAvL0NhbnRpZGFkIHJlYWwgaW5ncmVzYWRhLlxyXG4gICAgICAgIHZhciBWYWxvclByb21vOiBudW1iZXIgPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgdmFyIHZhbG9yUHJvbW9Vbml0OiBudW1iZXIgPSAoK1ZhbG9yUHJvbW8pIC8gKCtpQ2FudGlkYWRQcm9tbylcclxuICAgICAgICBpQ2FudGlkYWRSZWFsID0gbFByZWNpb3MubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIFJlc2lkdW86IG51bWJlciA9IGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIC8vaUNhbnRpZGFkQVBMUHJvbW8gPSBpQ2FudGlkYWRSZWFsIC8gaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaUNhbnRpZGFkUmVhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobFByZWNpb3NbaV0uUFVOSVRORVRPID4gdmFsb3JQcm9tb1VuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSB2YWxvclByb21vVW5pdDtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGNvbWJpbmFkYXMgZGVzZGUgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBzQ29tYmluYWRhID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBvQ29tYmluYWRhID0gSlNPTi5wYXJzZShzQ29tYmluYWRhKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMgPSBvQ29tYmluYWRhO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByb21vY2lvbmVzLCBzZWd1biBsYSBsaXN0YSBkZSBwcmVjaW9zIGRpdmlkaWRhLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MsIGNvbnRyYSBlc3RlIG9iamV0byBzZSBpdGVyYXLDoSB5IHNlIG9yZGVuYXLDoSBkZSBtYXlvciBhIG1lbm9yXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgICAgIHZhciBpeDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgaXk6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAgICAgdmFyIHk6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzBdIC0gKCt4KTtcclxuICAgICAgICB2YXIgcmVzaWR1b1g6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHJlc2lkdW9YID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAgICAgICAgIHggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vL1NlIGl0ZXJhIGVsIGFycmVnbG8gZGUgcHJpbmNpcGlvIGEgZmluIHkgZGUgZmluIGEgcHJpbmNpcGlvLi4uIFxyXG4gICAgICAgIC8vL0NvbmZvcm1lIHNlIHJlY29ycmUgZWwgYXJyZWdsbyBkZSBmaW4gYSBwcmluaWNpbywgc2UgdmEgZGFuZG8gbGEgcHJvbW9jacOzbiBhIGxvcyBwcm9kdWN0b3MgZGUgbWVub3IgdmFsb3IuXHJcbiAgICAgICAgLy8vU2kgbGEgcHJvbW9jacOzbiBlc3RhIGluY29tcGxldGEsIGxvcyBwcm9kdWN0b3MgZGUgbGEgbWl0YWQgcXVlZGFuIHNpbiBwcm9tb2Npw7NuIFxyXG4gICAgICAgIHZhciBpOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxQcmVjaW9zID0gbFByZWNpb3Muc29ydCgoYSwgYikgPT4gYS5QVU5JVE5FVE8gPCBiLlBVTklUTkVUTyA/IDEgOiBhLlBVTklUTkVUTyA+IGIuUFVOSVRORVRPID8gLTEgOiAwKVxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBqID0gK2xQcmVjaW9zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbFByZWNpb3MubGVuZ3RoICYmIGogPj0gaSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGl4ID0gMDtcclxuICAgICAgICAgICAgICAgIGl5ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXggPCB4KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGl4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl5IDwgeSAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3Nbal0uUFVOSVRORVRPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiRW50cm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9QYXJhIGxhcyBwcm9tb2Npb24gY29tbzogMlgxLjUsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0VzdGEgc29wb3J0YW5kbyBzb2xvIHBhcmE6IDJYMS41XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tqXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpeSsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGotLTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgICAgICAvL0pHQU0gMjAxOTEwMjMsIGZ1bmNpb25hbGlkYWQgZGUgcXVlIHNvbG8gZW50cmEgYWPDoSBjdWFuZG8gc2UgY2FtYmlvIGFsZ3VuIHByZWNpb1xyXG4gICAgICAgICAgICBpZiAoYkVudHJvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMpO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXIgcHJlY2lvIHRvdGFsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgZGUgcHJlY2lvcyBhIHRlbmVyIGVuIGN1ZW50YVxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBjb21iaSBQcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkFwbFZhbGlkYTogYm9vbGVhbiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgIHZhciBkVmFsb3JQcm9tb0FudDogbnVtYmVyID0gMDtcclxuICAgICAgICAvL3ZhciBkVmFsb3JQcm9tb0FudEFjdW06IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRWYWxvckFjdDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb051ZXZvID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAgICAgICAgIHZhciBwcmVjaW9Ub3RhbEFudGVyaW9yO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbEFudGVyaW9yID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE4IFNFIFFVSVRBIFZBTElEQUNJT04sIFBPUiBGTFVKTyBRVUUgU0kgU0UgREVWVUVMVkUgVFJBRSBMQSBQUk9NTywgUEVSTyBTSSBTRSBCT1JSQS4gaWYgKGRQcmVjaW9OdWV2byA8IHByZWNpb1RvdGFsQW50ZXJpb3IpIHsgLy8gU2UgYWdyZWdhIHZhbGlkYWNpb24gZGUgcHJlY2lvLCBwYXJhIGVzY29nZXIgZWwgbWVqb3IuIE5vIHB1ZWRlbiBhIHZlciAyIHByb21vY2lvbmVzLlxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMUkVBTFwiKS5WYWxvciA9IGRQcmVjaW9OdWV2bztcclxuICAgICAgICAgICAgLy9MaW1waWFyIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIGlmICgodGhpcy5WYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zLCBlbmMpIHx8ICFiQXBsVmFsaWRhKSAmJiAhYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gdGhpcy5HZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3MsIGVuYyk7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JBY3QgPSB0aGlzLkdldFZhbG9yUHJvbW9BQ3QoZW5jLCBkVmFsb3JQcm9tb0FudCwgZFByZWNpb051ZXZvLCBwcmVjaW9Ub3RhbEFudGVyaW9yLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgcGFyYSBwcm9tb2Npb25lcyBhY3VtdWxhYmxlcy4gYWN1bXVsYWJcclxuICAgICAgICAgICAgICAgIGlmICghYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gZFZhbG9yUHJvbW9BbnQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FcyBhY3VtdWxhYmxlLCB1dGlsaXphciBsYSBpbmZvcm1hY2nDs24gXHJcbiAgICAgICAgICAgICAgICAgICAgZFZhbG9yUHJvbW9BbnQgPSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvciAtIHByZWNpb1RvdGFsQW50ZXJpb3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMsIGRWYWxvckFjdCArIGRWYWxvclByb21vQW50KTtcclxuICAgICAgICAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpLCBkVmFsb3JBY3QpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYywgZFByZWNpb051ZXZvKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maWx0ZXIoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlZBTF9QUk9NT0NfXCIpKS5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST19DT01CSV9cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW8gdW5pdGFyaW8sIGEgcGFydGlyIGRlIHVuIG51ZXZvIHByZWNpbyBUb3RhbC5cclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gbmV3UHJpY2UgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvVW5pdEZyb21Ub3RhbChlbmM6IE0zUEVuY0l0ZW1zLCBuZXdQcmljZTogbnVtYmVyKSB7XHJcbiAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA9ICgrbmV3UHJpY2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSB0b2RvcyBsb3MgcHJlY2lvcyBkZSB1biBwcm9kdWN0byBzZSBjYW1iaWFyb24gbyBuby5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBjb24gdG9kb3MgbG9zIGl0ZW1zXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvczogQXJyYXk8YW55PiwgZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIC8vQ2hlY2ssIHNpIGFsZ3VubyBkZSBsYSBsaXN0YSBkZSBwcmVjaW8gZXMgaWd1YWwgYWwgcHJlY2lvIGFudGVyaW9yXHJcbiAgICAgICAgdmFyIHByZWNpb0FudGVyaW9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZpbmQoeCA9PiB4LlBVTklUTkVUTyA9PSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIGlmIChwcmVjaW9BbnRlcmlvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvcmVzIGRlIHByb21vY2lvbmVzIGRlcGVuZGllbmRvIGRlbCBudW1lcm8gZGUgaXRlbXMgcXVlIG5vIHNlIG1vZGlmaWNhcm9uXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRWYWxvciA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIG51bWVyb0l0ZW1zID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciBkVW5pdFByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtudW1lcm9JdGVtcyAqICtkVW5pdFByb21vO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIGRlIGxhIHByb21vY2lvbiBxdWUgc2UgZXN0YSBwcm9jZXNhbmRvIGFjdHVhbG1lbnRlXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIHZhbG9yUHJvbW9BbnQgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3RUb3RhbE51ZXZvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FDdChlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vQW50OiBudW1iZXIsIHZhbG90VG90YWxOdWV2bzogbnVtYmVyLCBwcmVjaW9Ub3RhbEFudDogbnVtYmVyLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yVG90YWxTaW5EdG86IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUHJvbW9BY3Q6IG51bWJlcjtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHNpIHZpZW5lIGFjdW11bGFibGUgdXRpbGl6YXIgZWwgcHJlY2lvIGFudGVyaW9yLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgZHRvLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9IHByZWNpb1RvdGFsQW50O1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG90VG90YWxOdWV2bztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5EdG8gPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG9yUHJvbW9BbnQgLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbG9yUHJvbW9BY3Q7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRWYWxvclByb21vQUN0OiBcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXMoZW5jOiBNM1BFbmNJdGVtcywgdmFsb3JQcm9tbzogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9lbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vRlMgMjAxOTA3MjUgUmVkb25kZW8gZGVsIHZhbG9yIGRlIHByb21vY2lvblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IChNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MTggU2UgYWdyZWdhIGVsIHZhbG9yIHVuaXRhcmlvIGRlIGxhIHByb21vY2nDs25cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZVTklUUFJPTU9cIikuVmFsb3IgPSAoKyhNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAgLyoqXHJcbiAgICAvLyAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAvLyAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXNGcm9tTGlzdGFQcmVjaW9zKGVuYzogTTNQRW5jSXRlbXMsIGxQcmVjaW9zOiBBcnJheTxhbnk+KSB7XHJcbiAgICAvLyAgICAgdHJ5IHtcclxuICAgIC8vICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LlBVTklUTkVUTyA9PSBkVmFsb3IpXHJcbiAgICAvLyAgICAgfSBjYXRjaHtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8vIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWNCZXRhKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgIC8vICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICB2YXIgVGlwb1Byb21vID0gY29tYmkuVGlwbzI7XHJcbiAgICAvLyAgICAgICAgIHZhciBpU2l6ZVByZWM6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgIC8vICAgICAgICAgdmFyIGlNaXRhZDogbnVtYmVyO1xyXG5cclxuICAgIC8vICAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgICAgICB2YXIgeDogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMV1cclxuICAgIC8vICAgICAgICAgdmFyIHk6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzBdIC0gKCt4KTtcclxuICAgIC8vICAgICAgICAgdmFyIGlEdG86IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmICh4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEpIHtcclxuICAgIC8vICAgICAgICAgICAgIHJlc2lkdW9YID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIGlNaXRhZCA9ICgreSkgLyAoK2lTaXplUHJlYyk7XHJcbiAgICAvLyAgICAgICAgIGlNaXRhZCA9IE1hdGguY2VpbCgoK2lNaXRhZCkgKiAoK3gpKSAtIDE7XHJcblxyXG4gICAgLy8gICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciBpWCA9IDA7XHJcbiAgICAvLyAgICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpRHRvID0gaU1pdGFkO1xyXG4gICAgLy8gICAgICAgICAgICAgd2hpbGUgKGlEdG8gPCBpU2l6ZVByZWMpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAocmVzaWR1b1ggPT0gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUoaVggPCB4KXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgaVgrKztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlEdG8rKztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBpWCA9IDA7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgIC8vICAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgIC8vICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgbGlzdGEgZGUgZGV0YWxsZSBlbDogIE5PTUJfUFJPTU9DLCBWQUxfUFJPTU9DIHkgSURfUFJPTU9DXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIGNvbWJpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWdyZWdhckxpc3RhUHJvbW8oZW5jOiBNM1BFbmNJdGVtcywgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgZFZhbG9yUHJvbW9Db21iaTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRldE5vbWJyZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0VmFsb3Jlczogc3RyaW5nO1xyXG4gICAgICAgIHZhciBkZXRJZHM6IHN0cmluZztcclxuXHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNOYW1lczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNWYWxzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc0lkczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKTtcclxuXHJcbiAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXNOYW1lcykge1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuTm9tYnJlQ29uY2VwdG8gPSBcIk5PTUJfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuTm9tYnJlQ29uY2VwdG8gPSBcIlZBTF9QUk9fQ09NQklcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLk5vbWJyZUNvbmNlcHRvID0gXCJJRF9QUk9fQ09NQklcIlxyXG5cclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciA9IFwiXCJcclxuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNOYW1lcylcclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc1ZhbHMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNJZHMpXHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciArIGNvbWJpLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yICsgY29tYmkuSWRQcm9tb2Npb25Db21iaW5hZGEgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yICsgZFZhbG9yUHJvbW9Db21iaS50b1N0cmluZygpICsgXCIsXCI7XHJcblxyXG4gICAgICAgIC8vQWhvcmEgc2UgYWdyZWdhIHVuYSBkaW5hbWljYSBwb3IgYXRyaWJ1dG8gZGUgbGEgcHJvbW8gcGFyYSBmYWNpbGl0YXIgbGEgcmV0b21hIGRlIGVzdGEgaW5mb3JtYWNpw7NuXHJcbiAgICAgICAgbGV0IGxpc3ROb21icmUgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RJZCA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RWYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiSURfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJWQUxfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGFycmF5RGluYW1pY2FzOiBBcnJheTxNM1BEZXRhbGxlSXRlbXM+LCBub21icmVEaW5hbWljYTogc3RyaW5nLCBWYWxvckRpbmFtaWNhOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgb00zUERldGFsbGVJdGVtcyA9IGFycmF5RGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IG5vbWJyZURpbmFtaWNhKTtcclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gVmFsb3JEaW5hbWljYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBub21icmVEaW5hbWljYTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgICAgIGFycmF5RGluYW1pY2FzLnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgcXVlIGFwbGljYW4gYSBsYSBsaXN0YSBjb21iaW5hZGEgcXVlIHRpZW5lXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBPYmpldG8gZGUgcHJvbW9jaW9uIGNvbWJpYW5kYVxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBkZSBNM1Byb2Nlc29cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRFbmNhYmV6YWRvQnlDb21iaShvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbHRlcihlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0UHJvbW9Db21iaW5hZGFFTkMoZW5jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghKGVuYy5JZEVuY1BhZHJlID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5jLlByb21vQ29tYmluYWRhcyAmJiArZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTIwOCBzZSBjYW1iaWEgdmFsaWRhY2lvbiwgcGFyYSBxdWUgdGVuZ2EgZW4gY3VlbnRhIGN1YWxxdWllciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9MaXN0RW5jYWI7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0UHJvbW9Db21iaW5hZGFFTkMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzID0gSlNPTi5wYXJzZShvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgLy8gICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAvLyAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklEIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBsUHJlY2lvcztcclxuXHJcbiAgICAvLyB9XHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vRklOIFYyIENPTUJJTkFEQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogUHJvY2VzYXJDb21iaW5hZGFYcG9yWVxyXG4gICAgKiBQcm9jZXNhciBwcm9tb2Npb24gY29tYmluYWRhIHF1ZSBzZSBsbGV2YW4geCBwcm9kdWN0b3MgcG9yIGVsIHByZWNpb24gZGUgeSBwcm9kdWN0b3MuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhWHBvclkob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG86IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdmFyIG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgdmFyIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvO1xyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBhZ3JlZ2FkbywgdGllbmUgdW5hIG1pc21hIHByb21vY2lvbiBhY3RpdmEgZW4gbGEgZmFjdHVyYS5cclxuICAgICAgICAvLyBpZiAob00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSAhPSBudWxsICYmIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvID0gb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYS5maW5kKGNvbWJpbmFkYXMgPT4gY29tYmluYWRhcy5JZFByb21vY2lvbiA9PSBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSAmJiBjb21iaW5hZGFzLlRlcm1pbmFkYSA9PSBmYWxzZSk7XHJcbiAgICAgICAgLy8gICAgIC8vVmFsaWRhIHNpIHlhIGV4aXN0ZSB1biBwcm9jZXNvLlxyXG4gICAgICAgIC8vICAgICBpZiAobTNDb21iaW5hZGF4UHJvY2VzbyAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvblhQcm9jZXNvID0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvO1xyXG4gICAgICAgIC8vICAgICAgICAgLy9UcmFlIGxvcyBFbmNhYmV6YWRvcyBjb24gbGEgcHJvbW9jaW9uIFxyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jcyA9PiBlbmNzLlByb21vQ29tYmluYWRhcyAhPSBudWxsICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jcy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9PSBtM0NvbWJpbmFkYXhQcm9jZXNvLklkUHJvbW9jaW9uWFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbywgbTNDb21iaW5hZGF4UHJvY2Vzbyk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkFncmVnYXJQcm9tb2Npb25Db21iaW5hZGFBUHJvY2VzbyhvTTNQcm9jZXNvcywgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSA9IG5ldyBBcnJheTxNM1Byb21Db21iaW5hZGFYUHJvY2Vzbz4oKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcmVjYWxjdWxhciBwcm9tb2Npb24sIGRlcGVuZGllbmRvIGRlIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIC8vMS5WYWxpZGFyIHNpIHlhIGVzdGFuIHRvZG9zIGxvcyBpdGVtcyBwYXJhIHJlY2FsY3VsYXIgbGEgcHJvbW9jaW9uXHJcbiAgICAvLzIuIE9yZGVuYXIgbG9zIGVuY2FiZXphZG9zIGRlIG1heW9yIGEgbWVub3IgcHJlY2lvLlxyXG4gICAgLy8zLiBEZWphciBlbCBwcmVjaW8gZGUgbG9zIGl0ZW1zIGRlIG1lbm9yIHByZWNpb24gZW4gMFxyXG4gICAgLy8gcHVibGljIFJlY2FsY3VsYXJQcm9tb1hQb3JZKG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz4sIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvKSB7XHJcbiAgICAvLyAgICAgdmFyIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYTtcclxuICAgIC8vICAgICB2YXIgdmFyeDogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciB2YXJ5OiBudW1iZXI7XHJcbiAgICAvLyAgICAgdmFyIHBhcnRlRGVjWTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvUHJvbW9jaW9uQ29tYmluYWRhID0gbTNFbmNzQ29uUHJvbW9bMF0uUHJvbW9Db21iaW5hZGFzWzBdO1xyXG5cclxuICAgIC8vICAgICB2YXJ4ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMF0pO1xyXG4gICAgLy8gICAgIHZhcnkgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChTdHJpbmcodmFyeSkuaW5jbHVkZXMoXCIuXCIpKSB7XHJcbiAgICAvLyAgICAgICAgIHBhcnRlRGVjWSA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzFdLnNwbGl0KFwiLlwiKVsxXSk7XHJcbiAgICAvLyAgICAgICAgIHZhcnkgPSBwYXJzZUZsb2F0KFN0cmluZyh2YXJ5KS5zcGxpdChcIi5cIilbMF0pO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgaWYgKHZhcnggPT0gbTNFbmNzQ29uUHJvbW8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIG0zQ29tYmluYWRheFByb2Nlc28uVGVybWluYWRhID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgLy9PcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBwb3IgcHJlY2lvIG1heW9yIGEgbWVub3JcclxuICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBtM0VuY3NDb25Qcm9tby5zb3J0KChhLCBiKSA9PlxyXG4gICAgLy8gICAgICAgICAgICAgKGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yIDwgYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpID8gMSA6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKChiLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IC0xIDogMCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtM0VuY3NDb25Qcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgLy9WYWxpZGEgc2kgeWEgXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGFydGVEZWNZICE9IDAgJiYgKCtpKSA9PSAoK3ZhcnkpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFydGVEZWNZKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoKCttM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpICogKCsoK3BhcnRlRGVjWSkgLyAxMDApKS50b1N0cmluZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIGlmICgoK2kpICsgMSA+IHZhcnkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBcIjBcIjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRvdGFsIGRlIHB1bnRvcyBkZSBmaWRlbGl6YWNpb24gZW4gbGEgdHJhbnNhY2Npw7NuIHJlZG9uZGVhZG9zIGhhY8OtYSBhYmFqb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X3RvdGFsX2ZpZGVsaXphY2lvbihvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB0b3RhbF9maWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdG90YWxfZmlkZWxpemFjaW9uID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJGSURFTElaQUNJT05cIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgoKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiRklERUxJWkFDSU9OXCIpLlZhbG9yKSAvIDEwMCkgKiAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLCAwKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1NlIHJlZG9uZGVhcmEgbm8gYWNhIHNpbm8gZW4gbGEgc3VtYSB0b3RhbCBkZWwgZmlkZWxpemFjaW9uIGRlIGNhZGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICAgIHJldHVybiB0b3RhbF9maWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRpZW5lIGVsIHZhbG9yIGRlbCBmaWRlbGl6YWNpb24gZGUgdW4gcHJvY2VzbywgZXZhbHVhbmRvIGNhZGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICogQHBhcmFtIHByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gbGlzdF9lbmNfcHJvbW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfdmFsdWVfZmlkZWxpemFjaW9uX2J5X3Byb2Nlc28ocHJvY2VzbzogTTNQcm9jZXNvcywgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcblxyXG4gICAgICAgIHZhciBwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciA9IHByb2Nlc28uVmFsb3JOZXRvO1xyXG4gICAgICAgIC8vdmFyIG1heF92YWx1ZV9maWRlbGl6YWNpb246IG51bWJlciA9IHRoaXMuZ2V0X3RvdGFsX2ZpZGVsaXphY2lvbihwcm9jZXNvKTtcclxuICAgICAgICB2YXIgcmVhbF92YWx1ZV9maWRlbGl6YWNpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIHZhciBsaXN0X2NvbmRpX3Byb21vID0gdGhpcy5nZXRfbGlzdF9jb25kaV9wcm9tb19ieV9hY3RpdmlkYWQobGlzdF9lbmNfcHJvbW8sIFwiUEFHT1wiLCBcIk1PTkVERVJPXCIpO1xyXG5cclxuICAgICAgICBpZiAocHJvY2Vzby5sTTNQRW5jRlApIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHByb2Nlc28ubE0zUEVuY0ZQLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hX3BhZ286IE0zUEVuY0ZQID0gcHJvY2Vzby5sTTNQRW5jRlBbX2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21vQXBsaWNhZGE6IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgICAgIGxldCBhcGxpY2FfZmlkZWxpemFjaW9uID0gdGhpcy52YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ28sIGxpc3RfY29uZGlfcHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcGxpY2FfZmlkZWxpemFjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JQYWdvID0gZm9ybWFfcGFnby5WYWxvciAtIGZvcm1hX3BhZ28uVmFsQ2FtYmlvO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uICs9IHRoaXMuY2FsY3VsYXRlX2ZpZGVsaXphY2lvbl9ieV9mb3JtYV9wYWdvKHBhZ29fdG90YWxfcHJvY2VzbywgcHJvY2Vzby5NM0VOQywgdmFsb3JQYWdvLCBhcGxpY2FfZmlkZWxpemFjaW9uLCBsaXN0X2VuY19wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA+IG1heF92YWx1ZV9maWRlbGl6YWNpb24pIHtcclxuICAgICAgICAvLyAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSB0aGlzLm9NYXRoVEYucm91bmQocmVhbF92YWx1ZV9maWRlbGl6YWNpb24sIDIpO1xyXG4gICAgICAgIHJldHVybiByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBkZSB0aXBvIGRlIHBhZ28gYSBwYXJ0aXIgZGUgQXJyYXk8TTNDT05ESVBST01PPlxyXG4gICAgICogQHBhcmFtIGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyAuXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0TTNFbmNJdGVtOiBBcnJheTxNM1BFbmNJdGVtcz4pOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICBsZXQgcmVzdHJpY2Npb25lc0FjdGl2YXMgPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIGlmIChsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdE0zRW5jSXRlbS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBsaXN0TTNEZXQgPSBsaXN0TTNFbmNJdGVtW19pXS5NM0RFVDtcclxuICAgICAgICAgICAgICAgIGlmICgrbGlzdE0zRW5jSXRlbVtfaV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW9jaW9uZXMgPSBsaXN0TTNEZXQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9NT0NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkUHJvbW9jaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW8gPSBpZFByb21vY2lvbmVzLlZhbG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGlkUHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSAraWRQcm9tb1tfa107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlQcm9tbyA9IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlQcm9tbyAmJiAhcmVzdHJpY2Npb25lc0FjdGl2YXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gcHJvbW8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY2Npb25lc0FjdGl2YXMucHVzaChjb25kaVByb21vKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN0cmljY2lvbmVzQWN0aXZhcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBwYXJhIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gYWN0dWFsXHJcbiAgICAgKiBAcGFyYW0gbGlzdEVuY1Byb21vIFxyXG4gICAgICogQHBhcmFtIGxpc3RNM0VuY0l0ZW0gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSZXN0cmljY2lvbmVzVGlwb1BhZ29BY3RpdmFzRnJvbUVuY1Byb21vKGxpc3RFbmNQcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGxldCBsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8gPSB0aGlzLmdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0RW5jUHJvbW8sIFwiUEFHT1wiLCBcIlJFU1RSSUNDSU9OX1BBR09cIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLCBsaXN0TTNFbmNJdGVtKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBtb3ZpbWllbnRvcyByZWFsaXphZG9zIHBvciB1biBtM3NhbGRvc3hjdWVudGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZF9tM1wiOiBpZG0zLCBcImlkX3Byb2Nlc29cIjogcHJvY2VzbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL20zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgbW92cyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIHJlc3BfbW92czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgaWYgKCFtb3ZzLk1PVlMuTU9WLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgIHJlc3BfbW92cy5wdXNoKG1vdnMuTU9WUy5NT1YpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbW92cy5NT1ZTLk1PVjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3BfbW92cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGxhIGZvcm1hIGRlIHBhZ28gY3VtcGxlIGFsZ3VuYSBjb25kaWNpb24gZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKiBAcGFyYW0gZm9ybWFfcGFnbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2NvbmRpX3Byb21vOiBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIGRlIGZpZGVsaXphY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvOiBNM1BFbmNGUCwgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPikge1xyXG4gICAgICAgIC8vcmV0dXJuIGxpc3RfY29uZGlfcHJvbW9bMF07XHJcbiAgICAgICAgbGV0IHByb21vc0FwbGljYWRhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RfY29uZGlfcHJvbW8ubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaV9wcm9tbyA9IGxpc3RfY29uZGlfcHJvbW9bX2ldO1xyXG4gICAgICAgICAgICB2YXIgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShjb25kaV9wcm9tby5KQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChjb25kaV9wcm9tby5Db25jZXB0by50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlbCBvcGVyYWRvciBlcyBESUZGIGNyZWEgdW5hIGV4cHJlc2lvbiByZWd1bGEgcGFyYSBleGNsdWlyIGxvIHRpcG9kZXBhZ28gY29uZmlndXJhZG9zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEgJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oPyEoXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKVxcXFxiKVxcXFx3KyRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpX3Byb21vLlZhbG9yID0gXCJeKFwiICsgY29uZGlfcHJvbW8uVmFsb3IgKyBcIikkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoY29uZGlfcHJvbW8uVmFsb3IsIFwiaVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUudGVzdChmb3JtYV9wYWdvLklkVGlwb1BhZ28udG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW9zQXBsaWNhZGFzLnB1c2goY29uZGlfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvbW9zQXBsaWNhZGFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIHZhbGlkYXMgcGFyYSB1bmEgYWN0aXZpZGFkIGRhZGFcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGFjdGl2aWRhZDogc3RyaW5nLCB0aXBvMjogc3RyaW5nKTogQXJyYXk8TTNDT05ESVBST01PPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY29uZGlfcHJvbW86IEFycmF5PE0zQ09ORElQUk9NTz4gPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIHZhciBob3kgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAobGlzdF9lbmNfcHJvbW8pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGxpc3RfZW5jX3Byb21vLmxlbmd0aDsgX2srKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuY2FiZXphZG9Qcm9tbyA9IGxpc3RfZW5jX3Byb21vW19rXTtcclxuICAgICAgICAgICAgICAgIHZhciBkVmlnZW5jaWEgPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uVmlnZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRJbmljaW8gPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uSW5pY2lvKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXN0YWRvICYmIGRWaWdlbmNpYSA+PSBob3kgJiYgZEluaWNpbyA8PSBob3kgJiYgZW5jYWJlemFkb1Byb21vLlRpcG8yID09IHRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX2FncnVwYWNpb24gPSBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT05bX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2ogPSAwOyBfaiA8IGNvbmRpX2FncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgX2orKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX3Byb21vID0gY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9bX2pdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BQ1RJVklEQUQgPT0gYWN0aXZpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfY29uZGlfcHJvbW8ucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jb25kaV9wcm9tbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGEgZWwgdmFsb3IgZGVsIGZpZGVsaXphY2lvbiBkZSB1bmEgZm9ybWEgZGUgcGFnbyBkZSBhY3VlcmRvIGEgc3UgcG9yY2VudGFqZSByZXNwZWN0byBlbCB2YWxvciB0b3RhbCBkZWwgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHBhZ29fdG90YWxfcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uIFxyXG4gICAgICogQHBhcmFtIHZhbHVlX2Zvcm1hX3BhZ28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVfZmlkZWxpemFjaW9uX2J5X2Zvcm1hX3BhZ28ocGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIsIGxpc3RNM0VuYzogTTNQRW5jSXRlbXNbXSwgdmFsdWVfZm9ybWFfcGFnbzogbnVtYmVyLCBwcm9tb3NBcGxpY2FkYTogQXJyYXk8TTNDT05ESVBST01PPiwgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RQcm9tb3NBcGxpY2FkYXM7XHJcbiAgICAgICAgbGV0IGRldGFsbGVJZFByb21vYztcclxuICAgICAgICBsZXQgdmFsb3JGaWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGxldCBwZXJjZW50X2Zvcm1hX3BhZ286IG51bWJlciA9IHZhbHVlX2Zvcm1hX3BhZ28gLyBwYWdvX3RvdGFsX3Byb2Nlc287XHJcbiAgICAgICAgdmFyIHByZWNpb1Byb2R1Y3RvID0gMDtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdE0zRW5jKSB7XHJcbiAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBbXTtcclxuICAgICAgICAgICAgZGV0YWxsZUlkUHJvbW9jID0gaXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSAraXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgaWYgKGRldGFsbGVJZFByb21vYyAmJiBkZXRhbGxlSWRQcm9tb2MuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBkZXRhbGxlSWRQcm9tb2MuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW9BcGwgb2YgcHJvbW9zQXBsaWNhZGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChsaXN0UHJvbW9zQXBsaWNhZGFzLmZpbmQoeCA9PiAreCA9PSBwcm9tb0FwbC5JZFByb21vY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSBsaXN0X2VuY19wcm9tby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tb0FwbC5JZFByb21vY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsb3JGaWRlbGl6YWNpb24gKz0gKHByZWNpb1Byb2R1Y3RvICogdGhpcy5nZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSAvIDEwMCkgKiAocGVyY2VudF9mb3JtYV9wYWdvKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsb3JGaWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UG9yY2VudGFqZUZpZGVsaXphY2lvbkZyb21FbmNQcm9tbyhwcm9tbykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmEgdW5hIGRpbmFtaWNhIGNvbiBlbCB2YWxvciBkZSBsYSBmaWRlbGl6YWNpw7NuIGRlIGRpY2hvIHByb2Nlc28geSByZXRvcm5hIGRpY2hvIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkX2RpbmFtaWNhX2ZpZGVsaXphY2lvbl90b19wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPik6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIHZhciB2YWx1ZV9maWRlbGl6YWNpb24gPSAwXHJcbiAgICAgICAgaWYgKGxpc3RfZW5jX3Byb21vKSB7XHJcbiAgICAgICAgICAgIHZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMuZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc28sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZV9maWRlbGl6YWNpb24gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYV9maWRlbGl6YWNpb246IE0zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLk5vbWJyZSA9IFwiRklERUxJWkFDSU9OXCJcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLlZhbG9yID0gdmFsdWVfZmlkZWxpemFjaW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChkaW5hbWljYV9maWRlbGl6YWNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBkb2N1bWVudG8gZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRhYmxhIE0zU2FsZG9zWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRvIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9kb2NfZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzYWxkb194X2N1ZW50YTtcclxuICAgICAgICAgICAgc2FsZG9feF9jdWVudGEgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLk0zU2FsZG9zWEN1ZW50YTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHNhbGRvX3hfY3VlbnRhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgZWwgc2FsZG8gc3VtYW5kb2xlIGVsIHZhbG9yIGVudmlhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbGl6YXJfc2FsZG9fZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0ge1wiZG9jdW1lbnRvXCI6ZG9jdW1lbnRvLCBcInZhbG9yX21vdmltaWVudG9cIjp2YWxvcl9tb3ZpZW50bywgXCJwYWdvXCI6cGFnbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9hY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEucGFnby5pZERpYXJpbyA9IHJlc3BbXCJfYm9keVwiXS5yZXBsYWNlKCdcIicsICcnKS5yZXBsYWNlKCdcIicsICcnKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEucGFnbyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBVbiBib25vIGRlIGRldm9sdWNpb24gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3J9XHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9ib25vX2Rldm9sdWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gbnVldm8gcmVnaXN0cm8gZW4gbGEgdGFibGEgU2FsZG9YQ3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM0luc2VydFNhbGRvWEN1ZW50YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7ICdEb2N1bWVudG8nOiB0aGlzLmRvY3VtZW50bywgJ1REb2NUaXR1bGFyJzogJzUnLCAnTkRvY1RpdHVsYXInOiB0aGlzLm5kb2NfY2xpZW50ZSwgJ05vbUN1ZW50YSc6ICdGSURFTElaQUNJT04nLCAnVmFsQ3VlbnRhJzogMCB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM0luc2VydFNhbGRvWEN1ZW50YS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKE0zRU5DOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICBpZiAoTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IE0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
3539
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbW9jaW9uZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NmLXJlZ2xhbmVnb2Npb20zLyIsInNvdXJjZXMiOlsibGliL3JubTMvUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQU1BLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSy9HLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFFbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBELE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFHMUQsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLElBQUE7SUFNSSw0QkFBWSxTQUFjLEVBQUUsY0FBMkI7dUJBTDlCLElBQUksTUFBTSxFQUFFO3lCQVVsQjtZQUNmLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEVBQUU7WUFDckMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUEsRUFBRTtZQUNyQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO1lBQ3ZDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBLEVBQUU7WUFDdkMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMs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QUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsRUFBaEMsQ0FBZ0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUF4RSxDQUF3RSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RHLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTtnQkFDaEIsT0FBTyxDQUFDLENBQUM7YUFDWjtpQkFBTTtnQkFDSCxPQUFPLFNBQVMsQ0FBQzthQUNwQjtTQUNKO2FBQU07WUFDSCxPQUFPLENBQUMsQ0FBQztTQUNaOzs2QkFobEZUO0lBa2xGQyxDQUFBO0FBMWpGRCw4QkEwakZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zRU5DUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gJy4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGUnO1xyXG5pbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzJztcclxuaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlJztcclxuaW1wb3J0IHsgTTNERVRDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSAnLi9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvbS1jb21iJztcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zJztcclxuaW1wb3J0IHsgTTNQRW5jRlAgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWZwJztcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhcyc7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tICcuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGUnO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tICcuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlJztcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbmV4cG9ydCBjbGFzcyBwcm9tb2Npb25lc1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHB1YmxpYyBnb0RhdGFVc2VyOiBhbnk7XHJcbiAgICBwdWJsaWMgZ29EYXRhQWRpY2lvbmFsOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBnb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9EYXRhVXNlcjogYW55LCBvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0aGlzLmdvRGF0YVVzZXIgPSBvRGF0YVVzZXI7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFBZGljaW9uYWwgPSBvRGF0YUFkaWNpb25hbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPCBiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA8PSBiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPj0gYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJSBiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vVmVyaWZpY2FyIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgbFRpcG9zUHJvbW86IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGFQcm9tb2Npb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5nb00zRU5DUFJPTU8gPSBvTTNFTkNQUk9NTztcclxuICAgICAgICBpZiAob00zRU5DUFJPTU8pIHtcclxuICAgICAgICAgICAgb00zRU5DUFJPTU8uZmlsdGVyKHggPT4gbFRpcG9zUHJvbW8uZmluZChwcm9tbyA9PiB4LlRpcG8gPT0gcHJvbW8pKS5mb3JFYWNoKGVuY2FiZXphZG9Qcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZFZpZ2VuY2lhID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLlZpZ2VuY2lhKTtcclxuICAgICAgICAgICAgICAgIHZhciBkSW5pY2lvID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLkluaWNpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDIzLCBzZSBxdWl0YSBUaXBvIE1hbnVhbCwgeSBzZSBkZWphIGVsIG51ZXZvIHBhcmFtZXRyby5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vKSAmJiAoZW5jYWJlemFkb1Byb21vLkVzdGFkbyAmJiBkVmlnZW5jaWEgPj0gaG95ICYmIGRJbmljaW8gPD0gaG95KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8gVmFsaWRhY2lvbjogMS4gU2kgZXMgZGlmZXJlbnRlIGEgTWFudWFsLCBubyB2YWxpZGEgVmFyaWFibGUgZXN0YWRvcyBtYW51YWxlcy4gRGUgbG8gY29udHJhcmlvIGxvIHZhbGlkYS4gLS0tIDIuIFNpIGVsIGVzdGFkbyBlbCBlc3RhZG8gZXMgdmVyZGFkZXJvIHkgbGEgdmlnZW5jaWEgZXMgbWF5b3IgbyBpZ3VhbCBhIGxhIGZlY2hhIGRlbCBtb21lbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaChhZ3J1cGFjaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uLCBlbmNhYmV6YWRvUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzLCBlbmNhYmV6YWRvUHJvbW8uVGlwbywgZW5jYWJlemFkb1Byb21vLlRpcG8yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhY2lvbiBkZSBhY2Npb24sIHNpIGV4aXN0ZSwgc2lubyBleGlzdGUgc2UgYWdyZWdhIGRlbCBwYXBhLiBTZSBlbnZpYSBjb21vIHJlZmVyZW5jaWEganJlc3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBlbmNhYmV6YWRvUHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihlbmNhYmV6YWRvUHJvbW8sIGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYVByb21vY2lvbmVzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYVByb21vY2lvbmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhckVzdGFkb3NFbmNQcm9tbyhlbmNhYmV6YWRvUHJvbW86IE0zRU5DUFJPTU8pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZXN0YWRvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc01hbnVhbCAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb01hbnVhbGVzKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc0FwbEN1cG9uICYmICFlbmNhYmV6YWRvUHJvbW8uRXN0YWRvQXBsQ3Vwb24pIHtcclxuICAgICAgICAgICAgZXN0YWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXN0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGFncnVwYWNpb24gZGUgcHJvbW9jaW9uZXMsIGluZ3Jlc2FuZG8gY29tbyBwYXJhbWV0cm8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgdmFsaWRhciwgVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQWdydXBhY2lvblByb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGFncnVwYWNpb246IE0zQ09ORElBR1JVUEFDSU9OLCBvTTNFbmNQcm9tbzogTTNFTkNQUk9NTykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaWNpb246IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICAgICAgY29uZGljaW9uID0gYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9baV07XHJcbiAgICAgICAgICAgIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmICghakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEIHx8IGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBcIlJFR0lTVFJPXCIpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9NM0VuY1Byb21vLlRpcG8gPT0gXCJDT01CSU5BREFcIiAmJiBvTTNFbmNQcm9tby5UaXBvMiA9PSBcIkNPTUJPXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uICYmIGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQU5EXCIgJiYgIWpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIE5PIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIk9SXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MYSBjb25kaWNpb24gc2UgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGRlYmUgZ3VhcmRhciBsYSBpbmZvcm1hY2nDs24uIFNpIHNpZW1wcmUgZnVlcm9uIE9SIHkgRkFMU0UsIHNlIGRlYmUgY29tcGFyYXIgY29tbyB1biBBTkQuXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzLCBvTTNFbmNQcm9tby5UaXBvLCBvTTNFbmNQcm9tby5UaXBvMik7XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBjb25kaWNpb24gZGUgcHJvbW9jaW9uZXMuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ29uZGljaW9uZXNQcm9tbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBjb25kaWNpb246IE0zQ09ORElQUk9NTykge1xyXG4gICAgICAgIHZhciBqQWRpY2lvbmFlcztcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgakFkaWNpb25hZXMgPSBKU09OLnBhcnNlKGNvbmRpY2lvbi5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDb25kaWNpb25Db250cmFEYXRhKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbiwgakFkaWNpb25hZXMpO1xyXG4gICAgICAgIHRoaXMuVmFsaWRhckFjY2lvbihqUmVzcCwgY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgdGhpcy5BZ3JlZ2FyQ29uZGljaW9uT0soalJlc3AsIGNvbmRpY2lvbik7XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBhIGpzb24gZGUgcmVzcHVlc3RhIHNpIHNlIGdlbmVybyBPSyBsYSBpbmZvcm1hY2lvbiBkZSBsYSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqUmVzcCBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZ3JlZ2FyQ29uZGljaW9uT0soalJlc3AsIGNvbmRpY2lvbjogTTNDT05ESVBST01PKSB7XHJcbiAgICAgICAgaWYgKGpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICBqUmVzcC5JRENvbmRpY2lvbiA9IGNvbmRpY2lvbi5JZENvbmRpY2lvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vVmVyaWZpY2EgY29uZGljaW9uLCBjb250cmEgZGF0YSBpbmdyZXNhZGEuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ29uZGljaW9uQ29udHJhRGF0YShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKTogYW55IHtcclxuICAgICAgICB2YXIgb2JqZWN0RmluZGVkO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLkVzdCkge1xyXG4gICAgICAgICAgICAgICAgLy9WYSBhIGVzdHJ1Y3R1cmEgZGUgcHJvZHVjdG8gYWRpY2lvbmFsXHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTG9NM1ByZEFkaWNpb25hbGVzXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0RmluZGVkID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGljID0+IGFkaWMuQVRSSUJVVE8udHJpbSgpID09IGNvbmRpY2lvbi5Db25jZXB0by50cmltKCkgJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGFkaWMuVkFMT1IudHJpbSgpLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSlcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RGaW5kZWQuSkFkaWNpb25hbGVzID0gSlNPTi5zdHJpbmdpZnkoakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvYmplY3RGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBSRFRPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9kdWN0byhvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJER1JQXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9kdWN0b1BSREdSUChvVHlwZU0zUHJkR3JwLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTTNERVRDT05ESVBST01PXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhY2lvbk0zRGV0YWxsZUNvbmRpY2lvbihvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBjb25kaWNpb24uTTNERVRDT05ESVBST01PLCBjb25kaWNpb24uQ29uY2VwdG8sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJPQ0VTT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvUHJvY2VzbyhvTTNQcm9jZXNvcywgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIklEX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FyUHJvY2Vzb0Zvcm1hUGFnbyhvTTNQcm9jZXNvcywgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIklEX0xJU1RBUFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy52ZXJpZmljYXJQcm9jZXNvTGlzdGFQcmVjaW8ob1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJVU0VSXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Vc2VyRGF0YShjb25kaWNpb24sIGpBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJBRElDSU9OQUxcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb0FkaWNpb25hbChjb25kaWNpb24sIGpBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBcIkNBUkFDVEVSSVNUSUNBU1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvL0VzdGEgcHJvbW9jacOzbiBlc3RhIGRpc2XDsWFkYSBwYXJhIHF1ZSBzZWEgcHJvY2VzYWRhIGFsIGZpbmFsIGRlIGxhIHRyYW5zYWNjacOzblxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTTNQcm9jZXNvcywgY29uZGljaW9uLk0zREVUQ09ORElQUk9NTywgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJObyBFbnRybyBwb3IgRGV0YWxsZSFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzOiBBcnJheTxhbnk+LCB0aXBvLCB0aXBvMikge1xyXG4gICAgICAgIHZhciBiQVBMQ29uZGljaW9uO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBpZiAoYVJlc3BzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy9MTGVnYSBhIGVzdGUgcHVudG8sIHBvciBhbGd1bmEgZGUgMiByYXpvbmVzOiBcclxuICAgICAgICAgICAgLy8xLiBMYSBjb25kaWNpw7NuIGVzIHVuIE9SIHkgdG9kb3Mgc29uIEZBTFNFXHJcbiAgICAgICAgICAgIC8vMi4gTGEgY29uZGljacOzbiBlcyB1biBBTkQgeSB0b2RvcyBzb24gVFJVRVxyXG4gICAgICAgICAgICBiQVBMQ29uZGljaW9uID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQVBMQ29uZGljaW9uKTtcclxuICAgICAgICAgICAgaWYgKCFiQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvID09IFwiQ09NQklOQURBXCIgJiYgdGlwbzIgPT0gXCJDT01CT1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmVnbG9Db25kaWNpb25lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJBUExDb25kaWNpb24uZm9yRWFjaChjb25kaWNpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uLklEQ29uZGljaW9uLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb24uSURDb25kaWNpb24uZm9yRWFjaChpZENvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJlZ2xvQ29uZGljaW9uZXMuZmluZCh4ID0+IHggPT0gaWRDb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChpZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGNvbmRpY2lvbi5JRENvbmRpY2lvbikpIGFycmVnbG9Db25kaWNpb25lcy5wdXNoKGNvbmRpY2lvbi5JRENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBBUExDb25kaWNpb246IHRydWUsIEFjY2lvbjogbnVsbCwgSURDb25kaWNpb246IGFycmVnbG9Db25kaWNpb25lcyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFSZXNwVE1QID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmaWNhciBzaSBhbGd1bm8gZGUgbG9zIGFycmVnbG9zIHRpZW5lIGFjY2lvbiBkaWZlcmVudGUgYSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BUTVAgPSBhUmVzcHMuZmlsdGVyKHJlc3AgPT4gcmVzcC5BY2Npb24gIT0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFSZXNwVE1QLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc2FyIGVsIHVsdGltbyBpdGVtLCBxdWUgdGVuZ2EgbGEgYWNjacOzblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IGFSZXNwVE1QW2FSZXNwVE1QLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gYVJlc3BzW2FSZXNwcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxhIHByb21vIGRlcGVuZGUgZGUgbGEgZm9ybWEgZGUgcGFnbyBhw7FhZGUgZXN0YSBpbmZvcm1hY2nDs25cclxuICAgICAgICAgICAgaWYgKGFSZXNwcy5maW5kKHggPT4geC5Gb3JtYVBhZ28pKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9HZW5lcmFyIFJlc3B1ZXN0YSBkZSBjb25kaWNpb24uXHJcbiAgICBwdWJsaWMgR2VuZXJhclJlc3B1ZXN0YShiQVBMUHJvbW86IGJvb2xlYW4sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqUmVzcCA9IHsgXCJBUExDb25kaWNpb25cIjogYkFQTFByb21vLCBcIkFjY2lvblwiOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGpBZGljaW9uYWxlcyAhPSBudWxsICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGxQcmVjaW9zOiBBcnJheTxhbnk+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvcmVzOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLlZhbG9yZXM7XHJcbiAgICAgICAgICAgIC8vdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiAoYS5DYW50aWRhZCA8IGIuQ2FudGlkYWQpID8gMSA6ICgoYi5DYW50aWRhZCA8IGEuQ2FudGlkYWQpID8gLTEgOiAwKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzLCBsUHJlY2lvcywgbFByZWNpb3MubGVuZ3RoKTsvL0pBR00gMjAxOTA3MzEsIGZ1bmNpb24gcmVjdXJzaXZhIHBhcmEgY2FsY3VsYXIgbG9zIHByZWNpb3MgbnVldm9zLlxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiBhLkNhbnRpZGFkIC0gYi5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWxvclByb21vID0gaSA8IHZhbG9yZXMubGVuZ3RoID8gdmFsb3Jlc1tpXS5WYWxvciA6IDBcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBBcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlczogQXJyYXk8YW55PiwgbFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW9FbnRyYW50ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IHJlc2lkdW9FbnRyYW50ZTsvLyBKQUdNIDIwMTkwNzMxIG51ZXZvIHBhcmFtZXRybyA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxvcmVzLmxlbmd0aDsgaSsrKSB7Ly9KQUdNIDIwMTkwNzMwIHNlIGFncmVnYSBmdW5jaW9uYWxpZGFkIHBhcmEgcXVlIHNlIHB1ZWRhIHRlbmVyIHZhcmlvcyB2YWxvcmVzLlxyXG4gICAgICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IHZhbG9yZXNbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlc2lkdW8gPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIFJlc2lkdW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSArbFByZWNpb3MubGVuZ3RoIC0gK3Jlc2lkdW9FbnRyYW50ZTsgaSA8ICtsUHJlY2lvcy5sZW5ndGggLSArUmVzaWR1bzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2ldLlBVTklUTkVUTyAtICgoK2xQcmVjaW9zW2ldLlBVTklUTkVUTykgKiAoKCt2YWxvclByb21vKSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFybWFyIG51ZXZvIGFycmVnbG8sIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBhcnJlZ2xvIGVudHJhbnRlLiBTZSByZWNvcnJlIGRlIGF0cmFzIGhhY2lhIGFkZWxhbnRlIHkgc2UgdmEgY3JlYW5kbyBlbCBudWV2byBhcnJlZ2xvXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gcmVzaWR1byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFybWFyTnVldm9BcnJheURlc2RlUmVzaWR1byhsUHJlY2lvczogQXJyYXk8YW55PiwgcmVzaWR1bykge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc1Jlc2lkdW8gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbFByZWNpb3MubGVuZ3RoIC0gMTsgaSA+IHJlc2lkdW87IGktLSkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NSZXNpZHVvLnB1c2gobFByZWNpb3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBcm1hck51ZXZvQXJyYXREZXNkZVJlc2lkdW9cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsUHJlY2lvc1Jlc2lkdW87XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIHByb2Nlc28gdGllbmUgdW5hIGZvcm1hIGRlIHBhZ28gcXVlIGN1bXBsYSBjb24gbGEgY29uZGljaW9uIGVudHJhbnRlLCBoYWNlIHVuICBwYXNzIHRydWUsIGxhIGxvZ2ljYSBzZSBoYWNlIGRlc2RlIGxhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJvY2Vzb0Zvcm1hUGFnbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIGxldCBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGpSZXNwW1wiRm9ybWFQYWdvXCJdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgdmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9MaXN0YVByZWNpbzogTTNQcmRMaXN0YSwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9MaXN0YVByZWNpb1tjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHByb21vY2lvbmVzIHBvciBwcm9jZXNvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIE0zIFByb2Nlc29zIE9iamV0bywgY29uIGxhIGluZm9ybWFjaW9uIGRlIHRvZG9zIGxvcyBNM1Byb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG8ob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob00zUHJkR2VuZXJhbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBkZSBwcm9kdWN0byBhZ3J1cGFkby5cclxuICAgICAqIEBwYXJhbSBvVHlwZU0zUHJkR3JwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG9QUkRHUlAob1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob1R5cGVNM1ByZEdycFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBhZGljaW9uYWwsIGVzdGEgaW5mb3JtYWNpb24gYWRpY2lvbmFsIGVzdGEgZW4gdW5hIHZhcmlhYmxlIGdsb2JhbDogZ29EYXRhQWRpY2lvbmFsXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXSh0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIk1PRFwiICYmICt0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dID4gK2NvbmRpY2lvbi5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gY29udHJhIHVzdWFyaW8gZGF0YS5cclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0odGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uaW5jbHVkZXMoJywnKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uc3BsaXQoJywnKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShlbGVtZW50LCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbnRyYSBlbCBkZXRhbGxlIGRlIGxhIGNvbmRpY2nDs25cclxuICAgIHB1YmxpYyBWZXJpZmljYWNpb25NM0RldGFsbGVDb25kaWNpb24ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbixcclxuICAgICAgICBkZXRDb25kaWNpb25lczogQXJyYXk8TTNERVRDT05ESVBST01PPiwgY29uY2VwdG9Db25kaWNpb246IHN0cmluZywgakFkaWNpb25hbGVzQ29uZGljaW9uKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHZhciBvZGV0Q29uZGljaW9uZXNGaW5kZWQ7XHJcbiAgICAgICAgc3dpdGNoIChjb25jZXB0b0NvbmRpY2lvbi50cmltKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9TS1AxXCI6XHJcblxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb1R5cGVNM1ByZEdycC5TS1AxKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tQMSsyXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvVHlwZU0zUHJkR3JwLlNLUDEgKyBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLlNLUDIpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9TS1VcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IudG9TdHJpbmcoKSwgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5TS1UudG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9ESVNQXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFLnRvU3RyaW5nKCksIGRldC5WYWxvci50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1RJUE9cIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IudG9TdHJpbmcoKSwgb1R5cGVNM1ByZEdycC5USVBPLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBcIlBFUl9QUk9DRVNPXCI6Ly8qIFNvbG8gdmFsaWRhIHVuYSBkZXRDb25kaWNpb25cclxuICAgICAgICAgICAgICAgIGxldCBwZXJYUHJvY2VzbzogTTNQZXJYUHJvY2VzbztcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHBlclhQcm9jZXNvID0gb00zUHJvY2Vzb3MuTTNQZXJYUHJvY2Vzby5maW5kKHggPT4geC5UaXBvUGVyc29uYSA9PSBkZXRDb25kaWNpb25lc1swXS5WYWxvci50b1N0cmluZygpKVxyXG4gICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uID09IFwiRU5cIiAmJiBwZXJYUHJvY2Vzbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzWzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkRJRkZcIiAmJiAhcGVyWFByb2Nlc28pIHtcclxuICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lc1swXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkFMTUFDRU5cIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IudG9TdHJpbmcoKSwgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkhPUkFSSU9fSE9SQVwiOlxyXG4gICAgICAgICAgICAgICAgdmFyIG9UaW1lTm93OiBEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IudG9TdHJpbmcoKSwgb1RpbWVOb3cuZ2V0SG91cnMoKS50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJMb00zUHJkQWRpY2lvbmFsZXNcIjpcclxuICAgICAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLkNvbmNlcHRvICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgVmxyQWRpID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuQ29uY2VwdG8pLlZBTE9SXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIFZsckFkaS50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIC8vUHJvY2Vzb3NcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzBdLnRyaW0oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVsxXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9NM1Byb2Nlc29zW3Byb3BlcnR5XSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVVNFUlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbcHJvcGVydHldKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm8gRW50cm8gcG9yIERldGFsbGUhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIHJlc3B1ZXN0YSwgY29uIG9iamV0byBhIHZhbGlkYXJcclxuICAgIHB1YmxpYyBWYWxpZGFyUmVzcHVlc3RhKG9iamVjdFZhbGlkYXRlKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHZhciBqQWRpY2lvbmFsZXM7XHJcbiAgICAgICAgaWYgKG9iamVjdFZhbGlkYXRlKSB7XHJcbiAgICAgICAgICAgIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2Uob2JqZWN0VmFsaWRhdGUuSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjI1IEFncmVnYXIgc2VjY2lvbiBkZSB2YWxpZGFjaW9uZXMuXHJcbiAgICAgICAgICAgIHZhciBiUmVzcCA9IHRoaXMuVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXMoakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICBpZiAoYlJlc3ApIHtcclxuICAgICAgICAgICAgICAgIC8vU2UgZW52aWEgZW4gYWRpY2lvbmFsZXMsIGVsIGpzb24gZGUgbGEgaW5mb3JtYWNpb24gZW5jb250cmFkYSBkZWwgZGV0YWxsZS5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHJlZ2xhcyBjb25maWd1cmFkYXMgZGVzZGUgSlNPTiBkZSBBZGljaW9uYWxlc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzKGpBZGljaW9uYWxlczogYW55KSB7XHJcbiAgICAgICAgdmFyIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipWYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlc1wiKVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGpBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUyAmJiBqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMuVElQTykge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMuVElQTykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJWSUdFTkNJQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuVmFsaWRhclZpZ2VuY2lhKGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5WQUwxLCBqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMuVkFMMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkVycm9yXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsaWRhclZpZ2VuY2lhKHZhbDE6IERhdGUsIHZhbDI6IERhdGUpIHtcclxuXHJcbiAgICAgICAgdmFyIEZlY2hhQWN0dWFsID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh2YWwxKVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHZhbDIpXHJcblxyXG4gICAgICAgIC8vIHZhciBkVmFsMSA9IG5ldyBEYXRlKHZhbDEpO1xyXG4gICAgICAgIC8vIHZhciBkVmFsMiA9IG5ldyBEYXRlKHZhbDIpO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhkVmFsMSlcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhkVmFsMilcclxuXHJcblxyXG4gICAgICAgIHZhciBuRmVjaGFBY3R1YWw6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKEZlY2hhQWN0dWFsKTsgLy8rKEZlY2hhQWN0dWFsLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgRmVjaGFBY3R1YWwuZ2V0TW9udGgoKSArIFwiXCIgKyBGZWNoYUFjdHVhbC5nZXREYXRlKCkpO1xyXG4gICAgICAgIHZhciBuVmFsMTogbnVtYmVyID0gK3RoaXMuR2V0RmVjaGFOdW1iZXIodmFsMSk7IC8vKyhkVmFsMS5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRWYWwxLmdldE1vbnRoKCkgKyBcIlwiICsgKCtkVmFsMS5nZXREYXRlKCkgKyAxKSApO1xyXG4gICAgICAgIHZhciBuVmFsMjogbnVtYmVyID0gK3RoaXMuR2V0RmVjaGFOdW1iZXIodmFsMikgLy8rKGRWYWwyLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgZFZhbDIuZ2V0TW9udGgoKSArIFwiXCIgKyAoK2RWYWwyLmdldERhdGUoKSArIDEpICk7XHJcbiAgICAgICAgaWYgKG5GZWNoYUFjdHVhbCA+PSBuVmFsMSAmJiBuRmVjaGFBY3R1YWwgPD0gblZhbDIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEZlY2hhTnVtYmVyKGRhdGU6IERhdGUpIHtcclxuICAgICAgICB2YXIgZCA9IG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVlNTUREJyk7XHJcbiAgICAgICAgcmV0dXJuIGQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vVmFsaWRhciBhY2Npb24sIHNpIG5vIHRpZW5lIGNhcmdhZGEgdW5hLiBFc3RhIGFjY2lvbiBzZSBjYXJnYSBqZXJhcnF1aWNhbWVudGUuXHJcbiAgICBwdWJsaWMgVmFsaWRhckFjY2lvbihqUmVzcCwgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpzb25BZGljID0gSlNPTi5wYXJzZShqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGlmIChqUmVzcC5BY2Npb24gPT0gbnVsbCAmJiBqc29uQWRpYy5ST09ULkFjY2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IGpzb25BZGljLlJPT1QuQWNjaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1JldG9tYXIgaW5mb3JtYWNpw7NuIFxyXG4gICAgcHVibGljIFJldG9tYXJWYWxvcmVzUHJvbW9jaW9uKG9NM0VOQ1BST01POiBNM0VOQ1BST01PLCBqUmVzcCkge1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbiA9IHt9O1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5Ob21icmUgPSBvTTNFTkNQUk9NTy5Ob21icmU7XHJcbiAgICAgICAgalJlc3AuUHJvbW9jaW9uLklEID0gb00zRU5DUFJPTU8uSWRQcm9tb2Npb247XHJcbiAgICAgICAgLy9TaSBubyB0dXZvIG5pbmd1bmEgYWNjaW9uXHJcbiAgICAgICAgaWYgKGpSZXNwLkFjY2lvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IHsgXCJUaXBvMlwiOiBvTTNFTkNQUk9NTy5UaXBvMiwgXCJUaXBvXCI6IG9NM0VOQ1BST01PLlRpcG8gfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLy8gUmV0b21hciBkZXNkZSBlbCBlbmNhYmV6YWRvIHByb21vLCBzaSBubyBleGlzdGUgZWwgdGlwbyB5IFRpcG8yXHJcbiAgICAgICAgICAgIGlmICghalJlc3AuQWNjaW9uLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcC5BY2Npb24uVGlwbzIgPSBvTTNFTkNQUk9NTy5UaXBvMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcC5BY2Npb24uVGlwbyA9IG9NM0VOQ1BST01PLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcbiAgICAvL1Byb2Nlc2FtaWVudG8gZGUgcHJvbW9jacOzbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIGFwbGljYXIgbGEgcHJvbW9jaW9uIHkgbGFzIHByb21vY2lvbmVzIGEgYXBsaWNhclxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9jaW9uKEpQcm9tb2Npb25lczogQXJyYXk8YW55Piwgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGdzSWRLYXRpb3MgPSBudWxsKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICBsZXQgc3BsaXRQcmVjaW8gPSB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICB2YXIgb0xpc3RhRmluZGVkID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgbGV0IHByZWNpb01vbmVkZXJvID0gMDtcclxuICAgICAgICBsZXQgbGlzdGFBcGxpY2FkYSA9IFwiVmFsb3JcIjtcclxuICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChzcGxpdFByZWNpb1sxXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxCXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGFBcGxpY2FkYSA9IFwiTEJcIjtcclxuICAgICAgICAgICAgICAgICAgICBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTENcIjpcclxuICAgICAgICAgICAgICAgICAgICBsaXN0YUFwbGljYWRhID0gXCJMQ1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RhQXBsaWNhZGEgPSBcIkxEXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKGdzSWRLYXRpb3MgIT0gbnVsbCAmJiBnc0lkS2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgcHJlY2lvTW9uZWRlcm8gPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgcHJlY2lvTW9uZWRlcm8sIGxpc3RhQXBsaWNhZGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgcHJlY2lvTW9uZWRlcm8gPSAwLCBsaXN0YUFwbGljYWRhID0gXCJWYWxvclwiKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB2YXIgb0xpc3RhUHJvbW9zQXNvYyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxuICAgICAgICBsZXQgcHJlY2lvQXNpZ25hZG8gPSBuUHJlY2lvO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIC8vIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLkFjY2lvbi5UaXBvMiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgPT0gXCJNT05FREVST1wiICYmIHByZWNpb01vbmVkZXJvID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByZWNpb01vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIHByZWNpb0FzaWduYWRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgbGlzdGFBcGxpY2FkYSk7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW9Nb25lZGVybyk7XHJcblxyXG4gICAgICAgIC8vIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPCAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9kbmVvIGRlIGxvcyB2YWxvcmVzIHRvdGFsZXNcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgbWVqb3Igb3BjaW9uLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHByb21vY2lvbmVzIHByb2Nlc2FkYXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBMaXN0YSBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBQcm9tb2Npb24gcHJvY2VzYWRhLCBxdWUgcmV0b3JuYXLDoSBhIGZsdWpvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhck1lam9yUHJvbW9jaW9uKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBtb25lZGVybzogbnVtYmVyKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICBsZXQgcHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvID0gb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5UaXBvID09IFwiUkVTVFJJQ0NJT05cIik7XHJcbiAgICAgICAgLy9TaSBlbCBwcm9kdWN0byBlc3RhIHJlc3RyaW5naWRvIGxlIGRhIG1heW9yIHByaW9yaWRhZCBhIGVzdGEgcHJvbW9jacOzblxyXG4gICAgICAgIGlmICghcHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvKSB7XHJcbiAgICAgICAgICAgIC8vMS4gU3VtYSBkZSB0b2RhcyBsYXMgcHJvbW9jaW9uZXMgQWN1bXVsYWJsZXNcclxuICAgICAgICAgICAgLy92YXIgZFByb21vQUNNOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAvL2RQcm9tb0FDTSA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiQUNNXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vRVhDID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJFWENcIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIGxldCBkUHJvbW9BQ01ESU4gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTURJTlwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgLy9Qcm9tb2Npb25lcyBObyBBY3VtdWxhYmxlc1xyXG5cclxuICAgICAgICAgICAgaWYgKGRQcm9tb0FDTURJTiA8IGRQcm9tb0VYQykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcGxpY2FQcm9tb0VYQyhvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBkUHJvbW9FWEMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcGxpY2FQcm9tb0FDTURJTihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBkUHJvbW9BQ01ESU4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYy8vLnB1c2gob0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpKTtcclxuXHJcbiAgICAgICAgICAgIC8vUmVjb3JyZXIgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW8gb2Ygb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIgJiYgIXguZmxhZ3MuZm9ybWFQYWdvKSkge1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vLlZhbG9yUG9yY2VudGFqZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9uZWRlcm8gIT0gMCAmJiBwcm9tby5UaXBvID09IFwiTU9ORURFUk9cIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVldm9WYWxvckRlc2N1ZW50byA9ICgoK21vbmVkZXJvKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK21vbmVkZXJvKSAtIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVldm9WYWxvckRlc2N1ZW50byA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpICogcHJvbW8uVmFsb3JQb3JjZW50YWplIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gcHJvbW8uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vLy8vLy9GVU5DSU9OQUxJREFEIFBST0RSSUEgRlVOQ0lPTkFSIE3DgVMgQURFTEFOVEUsIFNJIFNFIFFVSUVSRSBBR1JVUEFSIExBUyBQUk9NT0NJT05FUyBBQ00gWSBFWENcclxuICAgICAgICAgICAgLy8gaWYoZFByb21vQUNNID09IDAgJiYgZFByb21vRVhDID09IDApe1xyXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZSBlbmNvbnRyYXJvbiBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICAvLyB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgIGlmKGRQcm9tb0FDTSA+IGRQcm9tb0VYQyl7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGFjdW11bGF0aXZhcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIikuZm9yRWFjaCh4ID0+IHguQXBsaWNhZGEgPSB0cnVlKTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYzsvLy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9BQ00pICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLlZhbG9yTW9uZWRlcm8pLCAwKTtcclxuICAgICAgICAgICAgLy8gICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vR2FuYSBwcm9tb2Npb25lcyBleGNsdXllbnRlcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jLy8ucHVzaChvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykpO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gZFByb21vRVhDKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSAwO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgfVxyXG5cclxuICAgIGFwbGljYVByb21vRVhDKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vRVhDOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHJvbW9FeGM6IFByb21vY2lvbmVzQXNvY2lhZGFzO1xyXG4gICAgICAgIGlmICh2YWxvclByb21vRVhDID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tb0V4YyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gdmFsb3JQcm9tb0VYQyB8fCB4LlZhbG9yTW9uZWRlcm8gPT0gdmFsb3JQcm9tb0VYQyk7XHJcbiAgICAgICAgICAgIHByb21vRXhjLkFwbGljYWRhID0gdHJ1ZTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBwcm9tb0V4Yy5WYWxvcik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW9FeGMuVmFsb3JNb25lZGVybztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhcGxpY2FQcm9tb0FDTURJTihvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgdmFsb3JQcm9tb0FDTURJTjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9BQ01ESU4gPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYSA9PSBcIkFDTURJTlwiKSkge1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW8uVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSB2YWxvclByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgdmFsb3JQcm9tb0FDTURJTik7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgbWF4aW1vIHZhbG9yIHNlZ3VuIGxhIHJlZ2xhIGEgY29tcGFyYXJcclxuICAgICAqIEBwYXJhbSBvTGlzdGFQcm9tb3NBc29jIFxyXG4gICAgICogQHBhcmFtIHNSZWdsYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIHNSZWdsYTogc3RyaW5nLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB2YXIgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoc1JlZ2xhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQUNNXCI6XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVzdWx0ID0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAheC5mbGFncy5mb3JtYVBhZ28pLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3IpLCAwKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJBQ01ESU5cIjpcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlY2lvQWN0dWFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JUb3RhbERlc2N1ZW50byA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tbyBvZiBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01ESU5cIiAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uVmFsb3JQb3JjZW50YWplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAocHJlY2lvQWN0dWFsICogcHJvbW8uVmFsb3JQb3JjZW50YWplIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb0FjdHVhbCAtPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxvclRvdGFsRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkVYQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBzUmVnbGEgJiYgKCF4LmZsYWdzLmZvcm1hUGFnbyB8fCB4LlRpcG8gPT0gXCJNT05FREVST1wiKSkubWFwKGZ1bmN0aW9uIChvKSB7IHJldHVybiBvLlZhbG9yID4gby5WYWxvck1vbmVkZXJvID8gby5WYWxvciA6IG8uVmFsb3JNb25lZGVybzsgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhciBwcm9tb2Npb24gc2VndW4gZWwgdGlwbyBcclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQnlUaXBvKHByb21vY2lvbjogYW55LCBQcmVjaW86IG51bWJlciwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGxpc3RhQXBsaWNhZGEgPSBcIlZhbG9yXCIpOiBQcm9tb2Npb25lc0Fzb2NpYWRhcyB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIEFjY2lvbjtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBQcm9tb2Npb25lc0Fzb2NpYWRhcygpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbiAhPSBudWxsICYmIHByb21vY2lvbi5Qcm9tb2Npb24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb24gPSBwcm9tb2Npb24uUHJvbW9jaW9uLklEO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZSA9IHByb21vY2lvbi5Qcm9tb2Npb24uTm9tYnJlO1xyXG4gICAgICAgICAgICAgICAgQWNjaW9uID0gcHJvbW9jaW9uLkFjY2lvbjtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Npb24uUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGEgPSBBY2Npb24uUmVnbGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IFwiRVhDXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlRpcG8gPSBBY2Npb24uVGlwbzI7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsb3JBcGxpY2FyID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2lvbltsaXN0YUFwbGljYWRhXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQXBsaWNhciA9IEFjY2lvbltsaXN0YUFwbGljYWRhXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fJVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yUG9yY2VudGFqZSA9ICt2YWxvckFwbGljYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pICogKCgrdmFsb3JBcGxpY2FyKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fVkFMT1JcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSB2YWxvckFwbGljYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fRVhBQ1RcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAoK1ByZWNpbykgLSAoK3ZhbG9yQXBsaWNhcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJPQlNFUVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IEFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYU9ic2VxID0gQWNjaW9uLlJlZ2xhT2JzZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01PLCBBY2Npb24uT0JTRVFVSU9TLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbGlkYXIgY2FudGlkYWQgdnMgY2FudGlkYWQgZGUgb2JzcXVpb3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1PTkVERVJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yTW9uZWRlcm8gPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0ZTIDIwMTkwODI3IFlhIG5vIHNlIGd1YXJkYSBlbCB2YWxvciB0b3RhbCBkZWwgbW9uZWRlcm8gc2kgbm8gdW5pY2FtZW50ZSBlbCBwb3JjZW50YWplLi4uIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqICgoK0FjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ1VQT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSWRDdXBvbiA9IEFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkFDVElWQV9QUk9NT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5sSWRBY3RpdmFQcm9tbyA9IEFjY2lvbi5WYWxvci5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05fUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJSRVNUUklDQ0lPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5UaXBvID0gQWNjaW9uLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChvUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIEFjY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBY2Npb24uVGlwbyA9PSBcIkNPTUJJTkFEQVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYSA9IG5ldyBQcm9tb2Npb25Db21iaW5hZGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEgPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yID0gQWNjaW9uLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5Ob21icmUgPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTm9tYnJlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5BY2Npb24gPSBBY2Npb247XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQ2FtcG9zQWRpY2lvbmFsZXMob00zRU5DUFJPTU8sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEsIHByb21vY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb2Npb24uRm9ybWFQYWdvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLmZsYWdzLmZvcm1hUGFnbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvbmVzQXNvY2lhZGFzO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWYWxpZGFyQ2FudGlkYWRPYnNlcXVpb3Mob00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LFxyXG4gICAgICAgIG9ic2VxdWlvczogQXJyYXk8YW55Piwgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgdmFyIFZhbG9yQ2FudFBSRDogbnVtYmVyID0gLTE7XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkRSZWFsOiBudW1iZXIgPSB0aGlzLmdvRGF0YUFkaWNpb25hbC5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgcHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIFZhbG9yQ2FudFBSRCA9ICt4Lk0zQ09ORElQUk9NTy5maW5kKHggPT4geC5Db25jZXB0byA9PSBcImRDYW50aWRhZFwiKS5WYWxvclxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkNhbnRpZGFkT2JzZXEgPSBWYWxvckNhbnRQUkRcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIGNhbXBvcyBhZGljaW9uYWxlcyBlbiBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIG9NM0VOQ1BST01PIFxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Db21iaW5hZGEgXHJcbiAgICAgKiBAcGFyYW0gcHJvbW9jaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhckNhbXBvc0FkaWNpb25hbGVzKG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhLCBwcm9tb2Npb246IGFueSkge1xyXG4gICAgICAgIHN3aXRjaCAob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMikge1xyXG4gICAgICAgICAgICBjYXNlIFwiT0JTRVFfQ0lFUlJFXCI6XHJcbiAgICAgICAgICAgICAgICAvL0FncmVnYXIgQ2FudGlkYWQuXHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgICAgICB2YXIgc1ZhbG9yQ2FudGlkYWQ6IHN0cmluZyA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIHByb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc1ZhbG9yQ2FudGlkYWQgPSB4Lk0zQ09ORElQUk9NTy5maW5kKHggPT4geC5Db25jZXB0byA9PSBcImRDYW50aWRhZFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uQ2FudGlkYWRPYnNxID0gc1ZhbG9yQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgLy8gdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgLy8gcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIC8vIHZhciBqQWRpYzphbnkgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5DbGFzaWZpY2FjaW9uID0gakFkaWMuUk9PVC5BY2Npb24uQ2FyYWN0ZXJpc3RpY2E7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5OdW1Db25kaWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLk51bUNvbmRpY2lvbmVzID0gcHJvbW8uTTNDT05ESUFHUlVQQUNJT05bMF0uTTNDT05ESVBST01PLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb2Npb24uSURDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5JZENvbmRpY2lvbiA9IHByb21vY2lvbi5JRENvbmRpY2lvblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBJbmljaW8gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLy9Qcm9jZXNhciBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJDb21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLlByb21vQ29tYmluYWRhc1YyKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUHJvY2VzYXJDb21iaW5hZGFcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9WMiBDT01CSU5BREFcclxuICAgIC8qKlxyXG4gICAqIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxpc3RhIGRlIHByb21vY2lvbmVzIGNvbWJpbmFkYXMgZGUgTTNQcm9jZXNvc1xyXG4gICAqIEBwYXJhbSBpb00zUHJvY2VzbyBPYmpldG8gTTMgUHJvY2Vzb3MsIGVsIGN1YWwgc2UgcmVjb3JyZXLDoSBsYSBpbmZvcm1hY2lvbiBkZSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzVjIoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIGxldCBlbmNDb25MYUNhbnRpZGFkT3JpZ2luYWwgPSBfLmNsb25lRGVlcChpb00zUHJvY2Vzby5NM0VOQyk7XHJcblxyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgdmFyIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzW2ldO1xyXG4gICAgICAgICAgICB2YXIgZXNBY3VtdWxhYmxlID0gdGhpcy5HZXRFc0FjdW11bGFibGVQcm9tbyhjb21iaSlcclxuICAgICAgICAgICAgLy8vT2J0ZW5lciB0b2RvcyBsb3MgRW5jYWJlemFkb3MgcXVlIGFwbGljYW4gYSBsYSBwcm9tb2Npb24gYSBsYSBxdWUgc2UgZXN0YSBpdGVyYW5kb1xyXG4gICAgICAgICAgICBvTGlzdEVuY2FiID0gdGhpcy5HZXRFbmNhYmV6YWRvQnlDb21iaShjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzOiAzIGdhc2Vvc2FzIHBvciAkNTAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfQ0lFUlJFXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKGxQcmVjaW9zLCBjb21iaSwgaW9NM1Byb2Nlc28sIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfU1VNVE9UQUxcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyT2JzZXFTdW1Ub3RhbChvTGlzdEVuY2FiLCBjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FQQVJDSUFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlbmFyTGlzdGFFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYiwgY29tYmksIGxQcmVjaW9zLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwbENvbWJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXBsQ29tYm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsQ29tYm8gPSB0aGlzLlByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlLCBpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0RfQVBMREVTQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzIHBhcmEgMngxLCAzeDEsIDR4MiwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9MaXN0RW5jYWIgJiYgb0xpc3RFbmNhYi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWVzdGFibGVjZSBsYSBjYW50aWRhZCBvcmlnaW5hbCBwYXJhIHF1ZSBubyBzZSBxdWVkZSBlbiB1biBidXZsZSBpbmZpbml0b1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUEVuY09yaWdpbmFsZXMgb2YgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsKSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZE9yaWdpbmFsID0gb00zUEVuY09yaWdpbmFsZXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY09yaWdpbmFsZXMuSUQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gY2FudGlkYWRPcmlnaW5hbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3JkZW5hckxpc3RhRW5jKG9saXN0YUVuYzogTTNQRW5jSXRlbXNbXSwgZXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgaWYgKGVzQWN1bXVsYWJsZSkgb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVE5FVE8nKS5WYWxvcikpO1xyXG4gICAgICAgIGVsc2Ugb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVQnKS5WYWxvcikgLSAoK2EuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkRGVzY1Byb21vOiBudW1iZXIgPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbENvbXByYTogbnVtYmVyID0gbFByZWNpb3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgTnVtYmVyKGIuUFVOSVRORVRPKTsgfSwgMCk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmVjaW9Ub3RhbENvbXByYSk7XHJcbiAgICAgICAgbGV0IGRlc2NBY3VtID0gMDtcclxuICAgICAgICBsZXQgZGVzY1Byb2RBY3R1YWw7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGVzY1Byb2RBY3R1YWwgPSAobFByZWNpb3NbaV0uUFVOSVRORVRPIC8gcHJlY2lvVG90YWxDb21wcmEpICogY2FudGlkYWREZXNjUHJvbW8gLy80MFxyXG4gICAgICAgICAgICBkZXNjQWN1bSArPSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgLy8gaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA8IGNhbnRpZGFkRGVzY1Byb21vKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gLT0gbFByZWNpb3NbaV0uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICBlbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyAtPSBjYW50aWRhZERlc2NQcm9tbztcclxuICAgICAgICAgICAgLy8gICAgICAgICBjYW50aWRhZERlc2NQcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gZGVzY0FjdW0gfHwgY2FudGlkYWREZXNjUHJvbW8gPCBkZXNjQWN1bSkge1xyXG4gICAgICAgICAgICAvL2ZpbmQgZGVsIHVsdGltbyBcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVuY29udHJlIGRpZmVyZW5jaWEgZW4gcHJvbW9zIGNvbWJpbmFkYXM6IFwiICsgY2FudGlkYWREZXNjUHJvbW8gKyBcIiB2cyBcIiArIGRlc2NBY3VtKTtcclxuICAgICAgICAgICAgbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPID0gbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPIC0gKGNhbnRpZGFkRGVzY1Byb21vIC0gZGVzY0FjdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWRcIilcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhck9ic2VxU3VtVG90YWwocHJvZHVjdG9zQXBsaWNhUHJvbW86IE0zUEVuY0l0ZW1zW10sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yUHJvbW8gPSArY29tYmkuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGVuY0l0ZW0gb2YgcHJvZHVjdG9zQXBsaWNhUHJvbW8pIHtcclxuICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA9IDE7XHJcbiAgICAgICAgICAgIGxldCBwVW5pdEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHdoaWxlIChjYW50aWRhZFByb2R1Y3RvQWN0dWFsIDw9IGNhbnRpZGFkQWN0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcFVuaXRBY3R1YWw7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZFByb2R1Y3RvQWN0dWFsKys7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gZW5jSXRlbS5JRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IGVuY0l0ZW0uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN1bWFWYWxvclByb2R1Y3RvcyArIGRpZmVyZW5jaWEgPj0gdmFsb3JQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgb00zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gc3VtYVZhbG9yUHJvZHVjdG9zIC0gdmFsb3JQcm9tbztcclxuICAgICAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBwcm9kdWN0b0NvbWJvLCBjYW50aWRhZE9ic2VxdWlvcyk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wib00zUmVnU2VydmljZVwiXSA9IG9NM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJvY2VzbzogTTNQcm9jZXNvcywgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCBwcm9kSGlqbzogTTNQRW5jSXRlbXM7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHByb2RSZXZpc2FkbyBvZiBwcm9kdWN0b3NSZXZpc2Fkb3MpIHtcclxuICAgICAgICAgICAgaWYgKHByb2RSZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gcHJvZFJldmlzYWRvLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9ICgrb00zUERldGFsbGVJdGVtcy5WYWxvciAtIHByb2RSZXZpc2Fkby5DYW50aWRhZCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIaWpvID0gXy5jbG9uZURlZXAob00zUEVuY0l0ZW1zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzbyhwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5wdXNoKHByb2RIaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIHByb2RIaWpvLCBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9kdXRvUHJvbW9Db21ib1N1bVRvdGFsKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExpc3RhUHJlY2lvcyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGxQcmVjaW9zRmlsdGVyID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHkgPT4geS5JRCA9PSBvTGlzdEVuY2FiW2ldLklEKS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NGaWx0ZXIucHVzaCh4KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb24gZGUgY29tYm8sIHggcHJvZHVjdG9zLCB5IHByb2R1Y3RvcywgLi4uIG4gcHJvZHVjdG9zIFxyXG4gICAgICogcG9yICQxMDAwXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqIEBwYXJhbSBiRXNBY3VtdWxhYmxlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9jaW9uQ29tYmluYWRhQ29tYm8obFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbiwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGZsYWdBcGxpY29Qcm9tbyA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBuTnVtZXJvQ29uZGljaW9uZXM6IG51bWJlciA9ICtjb21iaS5BY2Npb24uTnVtQ29uZGljaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBWYWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIExpc3RDb25kaWNpb25lcyA9IG5ldyBBcnJheTxBcnJheTxhbnk+PigpO1xyXG4gICAgICAgICAgICB2YXIgbWluaW1vSXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwb3JjZW50YWplUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFNpblByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2U7XHJcblxyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbk51bWVyb0NvbmRpY2lvbmVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGNvbmRpY2lvbiAxLlxyXG4gICAgICAgICAgICAgICAgdmFyIExpc3RQcm9tb0NvbWJpOiBBcnJheTxNM1BFbmNJdGVtcz4gPSB0aGlzLkJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiLCBpLnRvU3RyaW5nKCksIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgTGlzdENvbmRpY2lvbmVzLnB1c2godGhpcy5HZXRMaXN0YVByZWNpb3MobFByZWNpb3MsIExpc3RQcm9tb0NvbWJpKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhMaXN0Q29uZGljaW9uZXMsIG9MaXN0RW5jYWIpO1xyXG4gICAgICAgICAgICBpZiAoTGlzdENvbmRpY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGVsIHZhbG9yIG1lbm9yIGRlIGxhcyBpdGVtcyBhZ3JlZ2FkYXNcclxuICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gTGlzdENvbmRpY2lvbmVzWzBdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaisrKSB7Ly9Db21pZW56YSBkZXNkZSAxIHBvcnF1ZSBlbCAwIHlhIHNlIHZhbGlkbyBlbiBsYSBhbnRlcmlvciBsaW5lYVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtc1ByZWNpb3M6IEFycmF5PGFueT4gPSBMaXN0Q29uZGljaW9uZXNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01pbiA9IGl0ZW1zUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01pbiA8IG1pbmltb0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gbmV3TWluO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vTG9zIGNvbWJvcyBkZWJlbiBwcm9jZXNhcnNlIGRlIGEgdW5vIHBhcmEgc3UgY29ycmVjdG8gZnVuY2lvbmFtaWVudG9cclxuICAgICAgICAgICAgICAgIGlmIChtaW5pbW9JdGVtcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9SZWNvcnJlIHRvZG9zIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3MgZGUgbGEgcHJvbW8gcGFyYSBzYWJlciBjdWFsIGVzIGVsIHZhbG9yIHJvYWwgZGUgbGEgcHJvbW9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpblByb21vICs9ICtsUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5JbmRpY2UgPT0gZW5jLkluZGljZSkuUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgbGEgcHJvbW8gYSBwYXJ0aXIgZGVsIGNhbG9yIGRlbCBjb21ibyB5IGRlIGxhIHN1bWEgZGUgbG9zIHByZWNpb3Mgb3JpZ2luYWxlcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBwb3JjZW50YWplUHJvbW8gPSAxMDAgLSAoK1ZhbG9yUHJvbW8gKiAxMDAgLyB2YWxvclRvdGFsU2luUHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZvckVhY2gocHJlY2lvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjaW8uSW5kaWNlID09IGVuYy5JbmRpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWNpby5Qcm9tb0FwbGljYWRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxvciA9IHByZWNpby5QVU5JVE5FVE87XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01vZGlmaWNhIGVsIHByZWNpbyBkZSBsb3MgcHJvZHVjdG9zIGEgc3UgbnVldm8gdmFsb3IgY29uIGxhIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gdmFsb3IgLSAodmFsb3IgKiBwb3JjZW50YWplUHJvbW8gLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUHJvbW9BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcmVjaW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FbiBsYXMgcHJvbW9zIHBvciBjb21ibyBubyBhcGxpY2FuIGVsIHByZWNpbyBkZSBsb3Mgb3Ryb3MgcHJvZHVjdG9zIHF1ZSBubyBoYWNlbiBwYXJ0ZSBkZWwgY29tYm8gOilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTyA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnQXBsaWNvUHJvbW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ0FwbGljb1Byb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvZHVjdG9Qcm9tb0NvbWJpRXhpc3RlbnRlID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBjb21iaS5BY2Npb24uQ29kaWdvKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgY29tYmkuQWNjaW9uLlZhbG9yLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saW1waWFyRW5jSXRlbVByZENvbmRpKG9MaXN0RW5jYWIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb21vY2lvbkNvbWJpbmFkYUNvbWJvXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZ0FwbGljb1Byb21vO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmaWx0cmFyTGlzdGFDb25kaWNpb25lc0NvbWJvKGxpc3RDb25kaWNpb25lczogQXJyYXk8YW55Piwgb00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RDb25kaWNpb25lcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgbGV0IG51ZXZhQ29uZGljaW9uID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGljaW9uIG9mIGxpc3RDb25kaWNpb25lc1tfaV0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbmNJdGVtID0gb00zUEVuY0l0ZW1zTGlzdC5maW5kKHggPT4geC5JRCA9PSBjb25kaWNpb24uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY0l0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdID0gZW5jSXRlbVtcIlByZENvbmRpXCJdID8gZW5jSXRlbVtcIlByZENvbmRpXCJdIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0Q2FudGlkYWQgPiBlbmNJdGVtW1wiUHJkQ29uZGlcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVldmFDb25kaWNpb24gPSBbY29uZGljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaXN0Q29uZGljaW9uZXNbX2ldID0gbnVldmFDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxpbXBpYXJFbmNJdGVtUHJkQ29uZGkob00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgZWxlbWVudFtcIlByZENvbmRpXCJdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2VzbzogTTNQcm9jZXNvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQgPSAxKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvUXVpdGFyO1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvZHVjdG9RdWl0YXIgPSBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0uZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b1F1aXRhcikge1xyXG4gICAgICAgICAgICBwcm9kdWN0b1F1aXRhci5DYW50aWRhZCArPSAoLTEgKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0ucHVzaCh7IElEOiBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bywgQ2FudGlkYWQ6ICgtMSAqIGNhbnRpZGFkKSB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FncmVnYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZSBlbnRyYWRhIGEgdW4gYXJyZWdsbyBkZSBwcm9kdWN0b3MgcXVlIHBvc3Rlcmlvcm1lbnRlIHNlcmEgbG9zIHByb2R1Y3RvcyBoaWpvcyBkZWwgcHJvZHVjdG8gQ29tYm9cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSB0aGlzLmdldFByb2R1dG9Qcm9tb0NvbWJvKG9NM1Byb2Nlc28uTTNFTkMsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgIC8vTGEgY2FudGlkYWQgZGlzbWludXllIHBlcm8gZXN0ZSBtb3ZpbWllbnRvIHNlIHJldmVyc2EgYWwgdGVybWluYXIgZGUgdmFsaWRhciBlc3RhIHByb21vXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgMSk7XHJcbiAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2Vzbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vRGlzbWludXllIGVuIHVubyBsYSBjYW50aWRhZCBkZWwgcHJvZHVjdG8geSByZXRvcm5hIHVuIGNsb24gZGUgZXN0ZVxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm8ocHJvZHVjdG9zRW5NM1Byb2Nlc286IEFycmF5PE0zUEVuY0l0ZW1zPiwgb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NEZWxDb21ibyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGVuIGhhc2htYXAgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGhtbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gSUQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGR0b0htUHJlY2lvcyhobWxQcmVjaW9zOiBBcnJheTxhbnk+LCBJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGZpbmRlZDogYW55ID0gaG1sUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBJRCk7XHJcbiAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICBmaW5kZWQuSW5kaWNlID0gK2ZpbmRlZC5JbmRpY2UgKyArMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaW5kZWQgPSB7IFwiSURcIjogSUQsIFwiSW5kaWNlXCI6IDAgfTtcclxuICAgICAgICAgICAgaG1sUHJlY2lvcy5wdXNoKGZpbmRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5kZWQuSW5kaWNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVzY2FyIGVuY2FiZXphZG9zIHF1ZSB0ZW5nYSBsYSBwcm9tb2Npb24geSBjb25kaWNpb24gZW52aWFkYSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gSWRDb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaWRQcm9tb2Npb25lcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIElkQ29uZGljaW9uOiBzdHJpbmcsIGlkUHJvbW9jaW9uZXM6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRW5jRmluZGVkID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSlcclxuICAgICAgICAgICAgICAgIGlmICghb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgfHwgIShvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldCAmJiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb3M6IEFycmF5PGFueT4gPSBKU09OLnBhcnNlKGRldC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb0ZpbmRlZCA9IHByb21vcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBpZFByb21vY2lvbmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW9GaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaWNpb25GaW5kZWQgPSBwcm9tb0ZpbmRlZC5BY2Npb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5maW5kKHggPT4geCA9PSBJZENvbmRpY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9FbmNGaW5kZWQucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkID09IElkQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9FbmNGaW5kZWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDs24gc2kgbGEgcHJvbW9jacOzbiBxdWUgbGxlZ2EgY29tbyBwYXJhbWV0cm8sIGVzIGFjdW11bGFibGUgbyBub1xyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEVzQWN1bXVsYWJsZVByb21vKHByb21vY2lvbjogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHByb21vY2lvbi5BY2Npb24uUmVnbGEgJiYgcHJvbW9jaW9uLkFjY2lvbi5SZWdsYSA9PSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgR2V0RXNBY3VtdWxhYmxlXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IGxQcmVjaW9zID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBsZXQgcHJvZHNBcGxEZXNjdWVudG86IEFycmF5PE0zUEVuY0l0ZW1zPiA9IFtdO1xyXG4gICAgICAgIGxldCBza3VBcGxEZXNjdWVudG9zOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLnNrdUFwbERlc2M7IC8vW3tTS1U6XCJYWFhYWFhcIn0sIHtTS1U6XCJZWVlZWVlZXCJ9XVxyXG4gICAgICAgIGxldCBtYXhOdW1EZXNjdWVudG9zID0gK2NvbWJpLkFjY2lvbi5tYXhOdW1EZXNjO1xyXG4gICAgICAgIGxldCBjb250RGVzY0FwbGljYWRvcyA9IDA7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vQ2FsY3VsYSBlbCBudW1lcm8gbWF4aW1vIGRlIGRlc2NpbmV0b3MgcXVlIHB1ZWRlIGFwbGljYXIgbGEgcHJvbW8gcXVlIGVzIGNvbWJpLkFjY2lvbi5tYXhOdW1EZXNjIG11bHRpcGxpY2FkbyBwb3IgbGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSBwYWxpY2FuIGxhIHByb21vIGVuIGVsIHByb2Nlc29cclxuICAgICAgICAgICAgbWF4TnVtRGVzY3VlbnRvcyA9IG9MaXN0RW5jYWIucmVkdWNlKChhY2MsIGN1cikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYyArICtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIH0sIDApICogbWF4TnVtRGVzY3VlbnRvcztcclxuXHJcbiAgICAgICAgICAgIC8vRGUgbG9zIHByb2R1Y3RvcyBkZWwgcHJvY2VzbyBmaWx0cm8gbG9zIHByb2R1Y3RvcyBxdWUgYXBsaWNhcmFuIGVsIGRlc2N1ZW50byBzZWd1biBsb3MgU0tVIGNvbmZpZ3VyYWRvcyBlbiBjb21iaS5BY2Npb24uc2t1QXBsRGVzY1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5NM0VOQy5mb3JFYWNoKG9NM1BFbmNJdGVtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2t1QXBsRGVzY3VlbnRvcy5maW5kKHggPT4geC5TS1UgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHNBcGxEZXNjdWVudG8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vQ8OhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKHByb2RzQXBsRGVzY3VlbnRvLCBlc0FjdW11bGFibGUpO1xyXG5cclxuICAgICAgICAgICAgLy9BcGxpY2EgdGFudG9zIGRlc2N1ZW50b3Mgc2UgcHVlZGFuIGEgcGxhaWNhciBhIGNhZGEgdmFsb3IgZGUgbFByZWNpb1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udERlc2NBcGxpY2Fkb3MgPCBtYXhOdW1EZXNjdWVudG9zICYmIGNvbnREZXNjQXBsaWNhZG9zIDwgbFByZWNpb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tjb250RGVzY0FwbGljYWRvc10uUFVOSVRORVRPIC09ICgrbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTykgKiAoKCtjb21iaS5BY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgIGNvbnREZXNjQXBsaWNhZG9zKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kc0FwbERlc2N1ZW50bywgY29tYmksIHRydWUsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvcyBlbiBlbCBjaWVycmVcclxuICAgICAqIFZhbGlkYSB0b2RhIGxhIGxpc3RhIGRlIGVuY2FiZXphZG9zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICogVmFsaWRhIGxhIHByb21vY2nDs24sIHBvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGluZ3Jlc2Fkb3MsIGN1w6FudG9zIG9ic2VxdWlvcyBzZSBwdWVkZW4gZGFyLlxyXG4gICAgICogVHJhZSB0b2RvcyBsb3Mgb2JzZXF1aW9zIHF1ZSBzZSBpbmdyZXNhcm9uIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhcywgbG9zIGxpc3RhXHJcbiAgICAgKiBjb2xvY2EgZW4gdmFsb3IgMCBsb3Mgb2JzZXF1aW9zIHF1ZSBzZWxlY2Npb25vIGF1dG9tYXRpY2FtZW50ZSBlbCBhbGdvcml0bW9cclxuICAgICAqIFJlY2FsY3VsbyBkZSBwcmVjaW9zLCBpbXB1ZXN0b3MgeSBkZW1hcyB2YWxvcmVzIHRvdGFsZXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBsb3MgcHJvZHVjdG9zIGluZ3Jlc2Fkb3MgYWwgY2Fycml0byBxdWUgdGllbmVuIG9ic2VxdWlvXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgSW5mb3JtYWNpw7NuIGRlIHByb21vY2nDs24gZGUgb2JzZXF1aW9zXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gUHJvY2VzbyBjb24gdG9kb3MgbG9zIHByb2R1Y3RvcyBlIGluZm9ybWFjacOzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKG9MaXN0RW5jYWI6IEFycmF5PGFueT4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBlc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpb00zUHJvY2Vzb1snUHJvZHVjdG9zQ29tYmknXSA9IFtdO1xyXG4gICAgICAgIGxldCBjYW50UG9yT2JzID0gK2NvbWJpLkFjY2lvbi5DYW50aWRhZE9ic3E7IC8vUG9yIGNhZGEgY3VhbnRvcyBwcm9kdWN0b3MgY29uIGxhIHByb21vY2nDs24gc2UgZGFyw6EgZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgbGV0IGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgbGV0IHN1bWFWYWxvclByb2R1Y3RvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkT2JzZXF1aW9zID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgbTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub0xpc3RhT2JzZXF1aW9zID0gY29tYmkuQWNjaW9uLk9CU0VRVUlPUztcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zQ2FudGlkYWQgPSAwXHJcbiAgICAgICAgLy8gdmFyIGNhbnRPYnNlcXVpb3M6IG51bWJlciA9IDA7IC8vQ2FudGlkYWQgZGUgb2JzZXF1aW9zIHF1ZSBzZSBkYXLDoSBwb3IgZXN0YSBjb21wcmEuXHJcblxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y3RvIG9mIG9MaXN0RW5jYWIpIHtcclxuICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zICs9IHByb2R1Y3RvLlBVTklUTkVUTztcclxuICAgICAgICAgICAgY2FudEFncmVnYWRhKys7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b1JldmlzYWRvID0gcHJvZHVjdG9zUmV2aXNhZG9zLmZpbmQoeCA9PiB4LklkID09IHByb2R1Y3RvLklEKTtcclxuICAgICAgICAgICAgaWYgKHByb2R1Y3RvUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IHByb2R1Y3RvLklELCBDYW50aWRhZDogMSB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNhbnRBZ3JlZ2FkYSA9PT0gY2FudFBvck9icykge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JDb21ibyArPSBzdW1hVmFsb3JQcm9kdWN0b3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NSZXZpc2Fkb3MpO1xyXG4gICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY2FudEFncmVnYWRhID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvbWJpLkFjY2lvbi5Db2RpZ28pIGNvbnNvbGUuZXJyb3IoJ0VsIGPDs2RpZ28gZGVsIGNvbWJvIG5vIGVzdGEgY29uZmlndXJhZG8gZW4gTTNERVRDT05ESVBST01PJylcclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwICYmIGNvbWJpLkFjY2lvbi5Db2RpZ28pIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBtM1JlZ1NlcnZpY2UubG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaS5BY2Npb24uQ29kaWdvLCB2YWxvckNvbWJvLCAxKTtcclxuICAgICAgICAgICAgbTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzb1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBtM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBsaWNhciByZWdsYXMsIHJlc3BlY3RvIGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhLlxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvbmVzQXNvY2lhZGFzIFxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcblxyXG4gICAgICAgIHZhciBpQ2FudGlkYWRQcm9tbzogbnVtYmVyID0gQWNjaW9uLkNhbnRpZGFkOyAvL0VqZW1wbG8gOiAzXHJcbiAgICAgICAgLy92YXIgaUNhbnRpZGFkQVBMUHJvbW86IG51bWJlcjsgLy9OdW1lcm8gcmVhbCBkZSBhcGxpY2FjaW9uIGRlIHByb21vY2lvbmVzLCBTaSBhcGxpY2EgcmVzdGEgZWwgcmVzaWR1by5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyOyAvL0NhbnRpZGFkIHJlYWwgaW5ncmVzYWRhLlxyXG4gICAgICAgIHZhciBWYWxvclByb21vOiBudW1iZXIgPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgdmFyIHZhbG9yUHJvbW9Vbml0OiBudW1iZXIgPSAoK1ZhbG9yUHJvbW8pIC8gKCtpQ2FudGlkYWRQcm9tbylcclxuICAgICAgICBpQ2FudGlkYWRSZWFsID0gbFByZWNpb3MubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIFJlc2lkdW86IG51bWJlciA9IGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIC8vaUNhbnRpZGFkQVBMUHJvbW8gPSBpQ2FudGlkYWRSZWFsIC8gaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaUNhbnRpZGFkUmVhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobFByZWNpb3NbaV0uUFVOSVRORVRPID4gdmFsb3JQcm9tb1VuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSB2YWxvclByb21vVW5pdDtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGNvbWJpbmFkYXMgZGVzZGUgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBzQ29tYmluYWRhID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBvQ29tYmluYWRhID0gSlNPTi5wYXJzZShzQ29tYmluYWRhKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMgPSBvQ29tYmluYWRhO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByb21vY2lvbmVzLCBzZWd1biBsYSBsaXN0YSBkZSBwcmVjaW9zIGRpdmlkaWRhLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MsIGNvbnRyYSBlc3RlIG9iamV0byBzZSBpdGVyYXLDoSB5IHNlIG9yZGVuYXLDoSBkZSBtYXlvciBhIG1lbm9yXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgICAgIHZhciBpeDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgaXk6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAgICAgdmFyIHk6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzBdIC0gKCt4KTtcclxuICAgICAgICB2YXIgcmVzaWR1b1g6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHJlc2lkdW9YID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAgICAgICAgIHggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vL1NlIGl0ZXJhIGVsIGFycmVnbG8gZGUgcHJpbmNpcGlvIGEgZmluIHkgZGUgZmluIGEgcHJpbmNpcGlvLi4uIFxyXG4gICAgICAgIC8vL0NvbmZvcm1lIHNlIHJlY29ycmUgZWwgYXJyZWdsbyBkZSBmaW4gYSBwcmluaWNpbywgc2UgdmEgZGFuZG8gbGEgcHJvbW9jacOzbiBhIGxvcyBwcm9kdWN0b3MgZGUgbWVub3IgdmFsb3IuXHJcbiAgICAgICAgLy8vU2kgbGEgcHJvbW9jacOzbiBlc3RhIGluY29tcGxldGEsIGxvcyBwcm9kdWN0b3MgZGUgbGEgbWl0YWQgcXVlZGFuIHNpbiBwcm9tb2Npw7NuIFxyXG4gICAgICAgIHZhciBpOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxQcmVjaW9zID0gbFByZWNpb3Muc29ydCgoYSwgYikgPT4gYS5QVU5JVE5FVE8gPCBiLlBVTklUTkVUTyA/IDEgOiBhLlBVTklUTkVUTyA+IGIuUFVOSVRORVRPID8gLTEgOiAwKVxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBqID0gK2xQcmVjaW9zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbFByZWNpb3MubGVuZ3RoICYmIGogPj0gaSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGl4ID0gMDtcclxuICAgICAgICAgICAgICAgIGl5ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXggPCB4KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGl4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl5IDwgeSAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3Nbal0uUFVOSVRORVRPID0gMC4wMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiRW50cm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9QYXJhIGxhcyBwcm9tb2Npb24gY29tbzogMlgxLjUsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0VzdGEgc29wb3J0YW5kbyBzb2xvIHBhcmE6IDJYMS41XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tqXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpeSsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGotLTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgICAgICAvL0pHQU0gMjAxOTEwMjMsIGZ1bmNpb25hbGlkYWQgZGUgcXVlIHNvbG8gZW50cmEgYWPDoSBjdWFuZG8gc2UgY2FtYmlvIGFsZ3VuIHByZWNpb1xyXG4gICAgICAgICAgICBpZiAoYkVudHJvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMpO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXIgcHJlY2lvIHRvdGFsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgZGUgcHJlY2lvcyBhIHRlbmVyIGVuIGN1ZW50YVxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBjb21iaSBQcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkFwbFZhbGlkYTogYm9vbGVhbiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgIHZhciBkVmFsb3JQcm9tb0FudDogbnVtYmVyID0gMDtcclxuICAgICAgICAvL3ZhciBkVmFsb3JQcm9tb0FudEFjdW06IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRWYWxvckFjdDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb051ZXZvID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAgICAgICAgIHZhciBwcmVjaW9Ub3RhbEFudGVyaW9yO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbEFudGVyaW9yID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE4IFNFIFFVSVRBIFZBTElEQUNJT04sIFBPUiBGTFVKTyBRVUUgU0kgU0UgREVWVUVMVkUgVFJBRSBMQSBQUk9NTywgUEVSTyBTSSBTRSBCT1JSQS4gaWYgKGRQcmVjaW9OdWV2byA8IHByZWNpb1RvdGFsQW50ZXJpb3IpIHsgLy8gU2UgYWdyZWdhIHZhbGlkYWNpb24gZGUgcHJlY2lvLCBwYXJhIGVzY29nZXIgZWwgbWVqb3IuIE5vIHB1ZWRlbiBhIHZlciAyIHByb21vY2lvbmVzLlxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMUkVBTFwiKS5WYWxvciA9IGRQcmVjaW9OdWV2bztcclxuICAgICAgICAgICAgLy9MaW1waWFyIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIGlmICgodGhpcy5WYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zLCBlbmMpIHx8ICFiQXBsVmFsaWRhKSAmJiAhYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gdGhpcy5HZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3MsIGVuYyk7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JBY3QgPSB0aGlzLkdldFZhbG9yUHJvbW9BQ3QoZW5jLCBkVmFsb3JQcm9tb0FudCwgZFByZWNpb051ZXZvLCBwcmVjaW9Ub3RhbEFudGVyaW9yLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgcGFyYSBwcm9tb2Npb25lcyBhY3VtdWxhYmxlcy4gYWN1bXVsYWJcclxuICAgICAgICAgICAgICAgIGlmICghYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gZFZhbG9yUHJvbW9BbnQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FcyBhY3VtdWxhYmxlLCB1dGlsaXphciBsYSBpbmZvcm1hY2nDs24gXHJcbiAgICAgICAgICAgICAgICAgICAgZFZhbG9yUHJvbW9BbnQgPSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvciAtIHByZWNpb1RvdGFsQW50ZXJpb3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMsIGRWYWxvckFjdCArIGRWYWxvclByb21vQW50KTtcclxuICAgICAgICAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpLCBkVmFsb3JBY3QpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYywgZFByZWNpb051ZXZvKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maWx0ZXIoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlZBTF9QUk9NT0NfXCIpKS5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST19DT01CSV9cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW8gdW5pdGFyaW8sIGEgcGFydGlyIGRlIHVuIG51ZXZvIHByZWNpbyBUb3RhbC5cclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gbmV3UHJpY2UgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvVW5pdEZyb21Ub3RhbChlbmM6IE0zUEVuY0l0ZW1zLCBuZXdQcmljZTogbnVtYmVyKSB7XHJcbiAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA9ICgrbmV3UHJpY2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSB0b2RvcyBsb3MgcHJlY2lvcyBkZSB1biBwcm9kdWN0byBzZSBjYW1iaWFyb24gbyBuby5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBjb24gdG9kb3MgbG9zIGl0ZW1zXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvczogQXJyYXk8YW55PiwgZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIC8vQ2hlY2ssIHNpIGFsZ3VubyBkZSBsYSBsaXN0YSBkZSBwcmVjaW8gZXMgaWd1YWwgYWwgcHJlY2lvIGFudGVyaW9yXHJcbiAgICAgICAgdmFyIHByZWNpb0FudGVyaW9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZpbmQoeCA9PiB4LlBVTklUTkVUTyA9PSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIGlmIChwcmVjaW9BbnRlcmlvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvcmVzIGRlIHByb21vY2lvbmVzIGRlcGVuZGllbmRvIGRlbCBudW1lcm8gZGUgaXRlbXMgcXVlIG5vIHNlIG1vZGlmaWNhcm9uXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRWYWxvciA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIG51bWVyb0l0ZW1zID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciBkVW5pdFByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtudW1lcm9JdGVtcyAqICtkVW5pdFByb21vO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIGRlIGxhIHByb21vY2lvbiBxdWUgc2UgZXN0YSBwcm9jZXNhbmRvIGFjdHVhbG1lbnRlXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIHZhbG9yUHJvbW9BbnQgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3RUb3RhbE51ZXZvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FDdChlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vQW50OiBudW1iZXIsIHZhbG90VG90YWxOdWV2bzogbnVtYmVyLCBwcmVjaW9Ub3RhbEFudDogbnVtYmVyLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yVG90YWxTaW5EdG86IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUHJvbW9BY3Q6IG51bWJlcjtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHNpIHZpZW5lIGFjdW11bGFibGUgdXRpbGl6YXIgZWwgcHJlY2lvIGFudGVyaW9yLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgZHRvLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9IHByZWNpb1RvdGFsQW50O1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG90VG90YWxOdWV2bztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5EdG8gPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG9yUHJvbW9BbnQgLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbG9yUHJvbW9BY3Q7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRWYWxvclByb21vQUN0OiBcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXMoZW5jOiBNM1BFbmNJdGVtcywgdmFsb3JQcm9tbzogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9lbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vRlMgMjAxOTA3MjUgUmVkb25kZW8gZGVsIHZhbG9yIGRlIHByb21vY2lvblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IChNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MTggU2UgYWdyZWdhIGVsIHZhbG9yIHVuaXRhcmlvIGRlIGxhIHByb21vY2nDs25cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZVTklUUFJPTU9cIikuVmFsb3IgPSAoKyhNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAgLyoqXHJcbiAgICAvLyAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAvLyAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXNGcm9tTGlzdGFQcmVjaW9zKGVuYzogTTNQRW5jSXRlbXMsIGxQcmVjaW9zOiBBcnJheTxhbnk+KSB7XHJcbiAgICAvLyAgICAgdHJ5IHtcclxuICAgIC8vICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LlBVTklUTkVUTyA9PSBkVmFsb3IpXHJcbiAgICAvLyAgICAgfSBjYXRjaHtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8vIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWNCZXRhKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgIC8vICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICB2YXIgVGlwb1Byb21vID0gY29tYmkuVGlwbzI7XHJcbiAgICAvLyAgICAgICAgIHZhciBpU2l6ZVByZWM6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgIC8vICAgICAgICAgdmFyIGlNaXRhZDogbnVtYmVyO1xyXG5cclxuICAgIC8vICAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgICAgICB2YXIgeDogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMV1cclxuICAgIC8vICAgICAgICAgdmFyIHk6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzBdIC0gKCt4KTtcclxuICAgIC8vICAgICAgICAgdmFyIGlEdG86IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmICh4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEpIHtcclxuICAgIC8vICAgICAgICAgICAgIHJlc2lkdW9YID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIGlNaXRhZCA9ICgreSkgLyAoK2lTaXplUHJlYyk7XHJcbiAgICAvLyAgICAgICAgIGlNaXRhZCA9IE1hdGguY2VpbCgoK2lNaXRhZCkgKiAoK3gpKSAtIDE7XHJcblxyXG4gICAgLy8gICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciBpWCA9IDA7XHJcbiAgICAvLyAgICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpRHRvID0gaU1pdGFkO1xyXG4gICAgLy8gICAgICAgICAgICAgd2hpbGUgKGlEdG8gPCBpU2l6ZVByZWMpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAocmVzaWR1b1ggPT0gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUoaVggPCB4KXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgaVgrKztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlEdG8rKztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBpWCA9IDA7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgIC8vICAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgIC8vICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgbGlzdGEgZGUgZGV0YWxsZSBlbDogIE5PTUJfUFJPTU9DLCBWQUxfUFJPTU9DIHkgSURfUFJPTU9DXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIGNvbWJpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWdyZWdhckxpc3RhUHJvbW8oZW5jOiBNM1BFbmNJdGVtcywgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgZFZhbG9yUHJvbW9Db21iaTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRldE5vbWJyZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0VmFsb3Jlczogc3RyaW5nO1xyXG4gICAgICAgIHZhciBkZXRJZHM6IHN0cmluZztcclxuXHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNOYW1lczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNWYWxzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc0lkczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKTtcclxuXHJcbiAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXNOYW1lcykge1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuTm9tYnJlQ29uY2VwdG8gPSBcIk5PTUJfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuTm9tYnJlQ29uY2VwdG8gPSBcIlZBTF9QUk9fQ09NQklcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLk5vbWJyZUNvbmNlcHRvID0gXCJJRF9QUk9fQ09NQklcIlxyXG5cclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciA9IFwiXCJcclxuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNOYW1lcylcclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc1ZhbHMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNJZHMpXHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciArIGNvbWJpLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yICsgY29tYmkuSWRQcm9tb2Npb25Db21iaW5hZGEgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yICsgZFZhbG9yUHJvbW9Db21iaS50b1N0cmluZygpICsgXCIsXCI7XHJcblxyXG4gICAgICAgIC8vQWhvcmEgc2UgYWdyZWdhIHVuYSBkaW5hbWljYSBwb3IgYXRyaWJ1dG8gZGUgbGEgcHJvbW8gcGFyYSBmYWNpbGl0YXIgbGEgcmV0b21hIGRlIGVzdGEgaW5mb3JtYWNpw7NuXHJcbiAgICAgICAgbGV0IGxpc3ROb21icmUgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RJZCA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RWYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiSURfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJWQUxfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGFycmF5RGluYW1pY2FzOiBBcnJheTxNM1BEZXRhbGxlSXRlbXM+LCBub21icmVEaW5hbWljYTogc3RyaW5nLCBWYWxvckRpbmFtaWNhOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgb00zUERldGFsbGVJdGVtcyA9IGFycmF5RGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IG5vbWJyZURpbmFtaWNhKTtcclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gVmFsb3JEaW5hbWljYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBub21icmVEaW5hbWljYTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgICAgIGFycmF5RGluYW1pY2FzLnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgcXVlIGFwbGljYW4gYSBsYSBsaXN0YSBjb21iaW5hZGEgcXVlIHRpZW5lXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBPYmpldG8gZGUgcHJvbW9jaW9uIGNvbWJpYW5kYVxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBkZSBNM1Byb2Nlc29cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRFbmNhYmV6YWRvQnlDb21iaShvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbHRlcihlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0UHJvbW9Db21iaW5hZGFFTkMoZW5jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghKGVuYy5JZEVuY1BhZHJlID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5jLlByb21vQ29tYmluYWRhcyAmJiArZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTIwOCBzZSBjYW1iaWEgdmFsaWRhY2lvbiwgcGFyYSBxdWUgdGVuZ2EgZW4gY3VlbnRhIGN1YWxxdWllciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9MaXN0RW5jYWI7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0UHJvbW9Db21iaW5hZGFFTkMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzID0gSlNPTi5wYXJzZShvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgLy8gICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAvLyAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklEIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBsUHJlY2lvcztcclxuXHJcbiAgICAvLyB9XHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vRklOIFYyIENPTUJJTkFEQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogUHJvY2VzYXJDb21iaW5hZGFYcG9yWVxyXG4gICAgKiBQcm9jZXNhciBwcm9tb2Npb24gY29tYmluYWRhIHF1ZSBzZSBsbGV2YW4geCBwcm9kdWN0b3MgcG9yIGVsIHByZWNpb24gZGUgeSBwcm9kdWN0b3MuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhWHBvclkob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG86IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdmFyIG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgdmFyIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvO1xyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBhZ3JlZ2FkbywgdGllbmUgdW5hIG1pc21hIHByb21vY2lvbiBhY3RpdmEgZW4gbGEgZmFjdHVyYS5cclxuICAgICAgICAvLyBpZiAob00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSAhPSBudWxsICYmIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvID0gb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYS5maW5kKGNvbWJpbmFkYXMgPT4gY29tYmluYWRhcy5JZFByb21vY2lvbiA9PSBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSAmJiBjb21iaW5hZGFzLlRlcm1pbmFkYSA9PSBmYWxzZSk7XHJcbiAgICAgICAgLy8gICAgIC8vVmFsaWRhIHNpIHlhIGV4aXN0ZSB1biBwcm9jZXNvLlxyXG4gICAgICAgIC8vICAgICBpZiAobTNDb21iaW5hZGF4UHJvY2VzbyAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvblhQcm9jZXNvID0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvO1xyXG4gICAgICAgIC8vICAgICAgICAgLy9UcmFlIGxvcyBFbmNhYmV6YWRvcyBjb24gbGEgcHJvbW9jaW9uIFxyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jcyA9PiBlbmNzLlByb21vQ29tYmluYWRhcyAhPSBudWxsICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jcy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9PSBtM0NvbWJpbmFkYXhQcm9jZXNvLklkUHJvbW9jaW9uWFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbywgbTNDb21iaW5hZGF4UHJvY2Vzbyk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkFncmVnYXJQcm9tb2Npb25Db21iaW5hZGFBUHJvY2VzbyhvTTNQcm9jZXNvcywgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSA9IG5ldyBBcnJheTxNM1Byb21Db21iaW5hZGFYUHJvY2Vzbz4oKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcmVjYWxjdWxhciBwcm9tb2Npb24sIGRlcGVuZGllbmRvIGRlIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIC8vMS5WYWxpZGFyIHNpIHlhIGVzdGFuIHRvZG9zIGxvcyBpdGVtcyBwYXJhIHJlY2FsY3VsYXIgbGEgcHJvbW9jaW9uXHJcbiAgICAvLzIuIE9yZGVuYXIgbG9zIGVuY2FiZXphZG9zIGRlIG1heW9yIGEgbWVub3IgcHJlY2lvLlxyXG4gICAgLy8zLiBEZWphciBlbCBwcmVjaW8gZGUgbG9zIGl0ZW1zIGRlIG1lbm9yIHByZWNpb24gZW4gMFxyXG4gICAgLy8gcHVibGljIFJlY2FsY3VsYXJQcm9tb1hQb3JZKG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz4sIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvKSB7XHJcbiAgICAvLyAgICAgdmFyIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYTtcclxuICAgIC8vICAgICB2YXIgdmFyeDogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciB2YXJ5OiBudW1iZXI7XHJcbiAgICAvLyAgICAgdmFyIHBhcnRlRGVjWTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvUHJvbW9jaW9uQ29tYmluYWRhID0gbTNFbmNzQ29uUHJvbW9bMF0uUHJvbW9Db21iaW5hZGFzWzBdO1xyXG5cclxuICAgIC8vICAgICB2YXJ4ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMF0pO1xyXG4gICAgLy8gICAgIHZhcnkgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChTdHJpbmcodmFyeSkuaW5jbHVkZXMoXCIuXCIpKSB7XHJcbiAgICAvLyAgICAgICAgIHBhcnRlRGVjWSA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzFdLnNwbGl0KFwiLlwiKVsxXSk7XHJcbiAgICAvLyAgICAgICAgIHZhcnkgPSBwYXJzZUZsb2F0KFN0cmluZyh2YXJ5KS5zcGxpdChcIi5cIilbMF0pO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgaWYgKHZhcnggPT0gbTNFbmNzQ29uUHJvbW8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIG0zQ29tYmluYWRheFByb2Nlc28uVGVybWluYWRhID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgLy9PcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBwb3IgcHJlY2lvIG1heW9yIGEgbWVub3JcclxuICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBtM0VuY3NDb25Qcm9tby5zb3J0KChhLCBiKSA9PlxyXG4gICAgLy8gICAgICAgICAgICAgKGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yIDwgYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpID8gMSA6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKChiLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IC0xIDogMCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtM0VuY3NDb25Qcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgLy9WYWxpZGEgc2kgeWEgXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGFydGVEZWNZICE9IDAgJiYgKCtpKSA9PSAoK3ZhcnkpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFydGVEZWNZKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoKCttM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpICogKCsoK3BhcnRlRGVjWSkgLyAxMDApKS50b1N0cmluZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIGlmICgoK2kpICsgMSA+IHZhcnkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBcIjBcIjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRvdGFsIGRlIHB1bnRvcyBkZSBmaWRlbGl6YWNpb24gZW4gbGEgdHJhbnNhY2Npw7NuIHJlZG9uZGVhZG9zIGhhY8OtYSBhYmFqb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X3RvdGFsX2ZpZGVsaXphY2lvbihvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB0b3RhbF9maWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdG90YWxfZmlkZWxpemFjaW9uID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJGSURFTElaQUNJT05cIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgoKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiRklERUxJWkFDSU9OXCIpLlZhbG9yKSAvIDEwMCkgKiAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLCAwKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1NlIHJlZG9uZGVhcmEgbm8gYWNhIHNpbm8gZW4gbGEgc3VtYSB0b3RhbCBkZWwgZmlkZWxpemFjaW9uIGRlIGNhZGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICAgIHJldHVybiB0b3RhbF9maWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRpZW5lIGVsIHZhbG9yIGRlbCBmaWRlbGl6YWNpb24gZGUgdW4gcHJvY2VzbywgZXZhbHVhbmRvIGNhZGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICogQHBhcmFtIHByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gbGlzdF9lbmNfcHJvbW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfdmFsdWVfZmlkZWxpemFjaW9uX2J5X3Byb2Nlc28ocHJvY2VzbzogTTNQcm9jZXNvcywgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcblxyXG4gICAgICAgIHZhciBwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciA9IHByb2Nlc28uVmFsb3JOZXRvO1xyXG4gICAgICAgIC8vdmFyIG1heF92YWx1ZV9maWRlbGl6YWNpb246IG51bWJlciA9IHRoaXMuZ2V0X3RvdGFsX2ZpZGVsaXphY2lvbihwcm9jZXNvKTtcclxuICAgICAgICB2YXIgcmVhbF92YWx1ZV9maWRlbGl6YWNpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIHZhciBsaXN0X2NvbmRpX3Byb21vID0gdGhpcy5nZXRfbGlzdF9jb25kaV9wcm9tb19ieV9hY3RpdmlkYWQobGlzdF9lbmNfcHJvbW8sIFwiUEFHT1wiLCBcIk1PTkVERVJPXCIpO1xyXG5cclxuICAgICAgICBpZiAocHJvY2Vzby5sTTNQRW5jRlApIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHByb2Nlc28ubE0zUEVuY0ZQLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hX3BhZ286IE0zUEVuY0ZQID0gcHJvY2Vzby5sTTNQRW5jRlBbX2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21vQXBsaWNhZGE6IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgICAgIGxldCBhcGxpY2FfZmlkZWxpemFjaW9uID0gdGhpcy52YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ28sIGxpc3RfY29uZGlfcHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcGxpY2FfZmlkZWxpemFjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JQYWdvID0gZm9ybWFfcGFnby5WYWxvciAtIGZvcm1hX3BhZ28uVmFsQ2FtYmlvO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uICs9IHRoaXMuY2FsY3VsYXRlX2ZpZGVsaXphY2lvbl9ieV9mb3JtYV9wYWdvKHBhZ29fdG90YWxfcHJvY2VzbywgcHJvY2Vzby5NM0VOQywgdmFsb3JQYWdvLCBhcGxpY2FfZmlkZWxpemFjaW9uLCBsaXN0X2VuY19wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA+IG1heF92YWx1ZV9maWRlbGl6YWNpb24pIHtcclxuICAgICAgICAvLyAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMub01hdGhURi5yb3VuZChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiwgMik7XHJcbiAgICAgICAgcmV0dXJuIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIGRlIHRpcG8gZGUgcGFnbyBhIHBhcnRpciBkZSBBcnJheTxNM0NPTkRJUFJPTU8+XHJcbiAgICAgKiBAcGFyYW0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvIC5cclxuICAgICAqIEBwYXJhbSBsaXN0TTNFbmNJdGVtIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG86IEFycmF5PE0zQ09ORElQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPik6IEFycmF5PE0zQ09ORElQUk9NTz4ge1xyXG4gICAgICAgIGxldCByZXN0cmljY2lvbmVzQWN0aXZhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgaWYgKGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0TTNFbmNJdGVtLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpc3RNM0RldCA9IGxpc3RNM0VuY0l0ZW1bX2ldLk0zREVUO1xyXG4gICAgICAgICAgICAgICAgaWYgKCtsaXN0TTNFbmNJdGVtW19pXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tb2Npb25lcyA9IGxpc3RNM0RldC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRQcm9tb2Npb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tbyA9IGlkUHJvbW9jaW9uZXMuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgaWRQcm9tby5sZW5ndGg7IF9rKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9ICtpZFByb21vW19rXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaVByb21vID0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaVByb21vICYmICFyZXN0cmljY2lvbmVzQWN0aXZhcy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljY2lvbmVzQWN0aXZhcy5wdXNoKGNvbmRpUHJvbW8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3RyaWNjaW9uZXNBY3RpdmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIHBhcmEgbG9zIHByb2R1Y3RvcyBkZWwgcHJvY2VzbyBhY3R1YWxcclxuICAgICAqIEBwYXJhbSBsaXN0RW5jUHJvbW8gXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXNGcm9tRW5jUHJvbW8obGlzdEVuY1Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgbGlzdE0zRW5jSXRlbTogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RFbmNQcm9tbywgXCJQQUdPXCIsIFwiUkVTVFJJQ0NJT05fUEFHT1wiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8sIGxpc3RNM0VuY0l0ZW0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIG1vdmltaWVudG9zIHJlYWxpemFkb3MgcG9yIHVuIG0zc2FsZG9zeGN1ZW50YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkX20zXCI6IGlkbTMsIFwiaWRfcHJvY2Vzb1wiOiBwcm9jZXNvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBtb3ZzID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcF9tb3ZzOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICBpZiAoIW1vdnMuTU9WUy5NT1YubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzLnB1c2gobW92cy5NT1ZTLk1PVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBtb3ZzLk1PVlMuTU9WO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcF9tb3ZzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgbGEgZm9ybWEgZGUgcGFnbyBjdW1wbGUgYWxndW5hIGNvbmRpY2lvbiBkZSBmaWRlbGl6YWNpb25cclxuICAgICAqIEBwYXJhbSBmb3JtYV9wYWdvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfY29uZGlfcHJvbW86IGxpc3RhZG8gZGUgY29uZGljaW9uZXMgZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ286IE0zUEVuY0ZQLCBsaXN0X2NvbmRpX3Byb21vOiBBcnJheTxNM0NPTkRJUFJPTU8+KSB7XHJcbiAgICAgICAgLy9yZXR1cm4gbGlzdF9jb25kaV9wcm9tb1swXTtcclxuICAgICAgICBsZXQgcHJvbW9zQXBsaWNhZGFzID0gbmV3IEFycmF5PE0zQ09ORElQUk9NTz4oKTtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdF9jb25kaV9wcm9tby5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdmFyIGNvbmRpX3Byb21vID0gbGlzdF9jb25kaV9wcm9tb1tfaV07XHJcbiAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbmRpX3Byb21vLkNvbmNlcHRvLnRyaW0oKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIklEX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICAvL1NpIGVsIG9wZXJhZG9yIGVzIERJRkYgY3JlYSB1bmEgZXhwcmVzaW9uIHJlZ3VsYSBwYXJhIGV4Y2x1aXIgbG8gdGlwb2RlcGFnbyBjb25maWd1cmFkb3NcclxuICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYSAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkRJRkZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaV9wcm9tby5WYWxvciA9IFwiXig/IShcIiArIGNvbmRpX3Byb21vLlZhbG9yICsgXCIpXFxcXGIpXFxcXHcrJFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKSRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChjb25kaV9wcm9tby5WYWxvciwgXCJpXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS50ZXN0KGZvcm1hX3BhZ28uSWRUaXBvUGFnby50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3NBcGxpY2FkYXMucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9tb3NBcGxpY2FkYXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIGxpc3RhZG8gZGUgY29uZGljaW9uZXMgdmFsaWRhcyBwYXJhIHVuYSBhY3RpdmlkYWQgZGFkYVxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgYWN0aXZpZGFkOiBzdHJpbmcsIHRpcG8yOiBzdHJpbmcpOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPiA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAgIGlmIChsaXN0X2VuY19wcm9tbykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGlzdF9lbmNfcHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5jYWJlemFkb1Byb21vID0gbGlzdF9lbmNfcHJvbW9bX2tdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRWaWdlbmNpYSA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5WaWdlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZEluaWNpbyA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5JbmljaW8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc3RhZG8gJiYgZFZpZ2VuY2lhID49IGhveSAmJiBkSW5pY2lvIDw9IGhveSAmJiBlbmNhYmV6YWRvUHJvbW8uVGlwbzIgPT0gdGlwbzIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgZW5jYWJlemFkb1Byb21vLk0zQ09ORElBR1JVUEFDSU9OLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfYWdydXBhY2lvbiA9IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTltfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaiA9IDA7IF9qIDwgY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU8ubGVuZ3RoOyBfaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfcHJvbW8gPSBjb25kaV9hZ3J1cGFjaW9uLk0zQ09ORElQUk9NT1tfal07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEICYmIGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBhY3RpdmlkYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9jb25kaV9wcm9tby5wdXNoKGNvbmRpX3Byb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2NvbmRpX3Byb21vO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuYSBmb3JtYSBkZSBwYWdvIGRlIGFjdWVyZG8gYSBzdSBwb3JjZW50YWplIHJlc3BlY3RvIGVsIHZhbG9yIHRvdGFsIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcGFnb190b3RhbF9wcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIG1heF92YWx1ZV9maWRlbGl6YWNpb24gXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVfZm9ybWFfcGFnbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciwgbGlzdE0zRW5jOiBNM1BFbmNJdGVtc1tdLCB2YWx1ZV9mb3JtYV9wYWdvOiBudW1iZXIsIHByb21vc0FwbGljYWRhOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuICAgICAgICBsZXQgbGlzdFByb21vc0FwbGljYWRhcztcclxuICAgICAgICBsZXQgZGV0YWxsZUlkUHJvbW9jO1xyXG4gICAgICAgIGxldCB2YWxvckZpZGVsaXphY2lvbiA9IDA7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRfZm9ybWFfcGFnbzogbnVtYmVyID0gdmFsdWVfZm9ybWFfcGFnbyAvIHBhZ29fdG90YWxfcHJvY2VzbztcclxuICAgICAgICB2YXIgcHJlY2lvUHJvZHVjdG8gPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0TTNFbmMpIHtcclxuICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IFtdO1xyXG4gICAgICAgICAgICBkZXRhbGxlSWRQcm9tb2MgPSBpdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPTU9DXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Qcm9kdWN0byA9ICtpdGVtLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBsZXQgcHJlY2lvU1IgPSBpdGVtLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1NSXCIpO1xyXG4gICAgICAgICAgICBpZiAocHJlY2lvU1IgIT0gbnVsbCAmJiBwcmVjaW9TUi5WYWxvciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwcmVjaW9Qcm9kdWN0byA9ICtwcmVjaW9TUi5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZUlkUHJvbW9jICYmIGRldGFsbGVJZFByb21vYy5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IGRldGFsbGVJZFByb21vYy5WYWxvci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tb0FwbCBvZiBwcm9tb3NBcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RQcm9tb3NBcGxpY2FkYXMuZmluZCh4ID0+ICt4ID09IHByb21vQXBsLklkUHJvbW9jaW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9IGxpc3RfZW5jX3Byb21vLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vQXBsLklkUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3IgPSB0aGlzLnZhbGlkYXJSZWRvbmRlbyhwcm9tbywgcHJlY2lvUHJvZHVjdG8gKiB0aGlzLmdldFBvcmNlbnRhamVGaWRlbGl6YWNpb25Gcm9tRW5jUHJvbW8ocHJvbW8pIC8gMTAwKSAqIChwZXJjZW50X2Zvcm1hX3BhZ28pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yRmlkZWxpemFjaW9uICs9IHZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvckZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09UICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhclJlZG9uZGVvKHByb21vLCB2YWxvcjogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09UICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uUmVkb25kZW8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQodmFsb3IsICtqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uUmVkb25kZW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWxvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmEgdW5hIGRpbmFtaWNhIGNvbiBlbCB2YWxvciBkZSBsYSBmaWRlbGl6YWNpw7NuIGRlIGRpY2hvIHByb2Nlc28geSByZXRvcm5hIGRpY2hvIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkX2RpbmFtaWNhX2ZpZGVsaXphY2lvbl90b19wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPik6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIHZhciB2YWx1ZV9maWRlbGl6YWNpb24gPSAwXHJcbiAgICAgICAgaWYgKGxpc3RfZW5jX3Byb21vKSB7XHJcbiAgICAgICAgICAgIHZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMuZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc28sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZV9maWRlbGl6YWNpb24gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYV9maWRlbGl6YWNpb246IE0zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLk5vbWJyZSA9IFwiRklERUxJWkFDSU9OXCJcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLlZhbG9yID0gdmFsdWVfZmlkZWxpemFjaW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChkaW5hbWljYV9maWRlbGl6YWNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBkb2N1bWVudG8gZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRhYmxhIE0zU2FsZG9zWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRvIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9kb2NfZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzYWxkb194X2N1ZW50YTtcclxuICAgICAgICAgICAgc2FsZG9feF9jdWVudGEgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLk0zU2FsZG9zWEN1ZW50YTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHNhbGRvX3hfY3VlbnRhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgZWwgc2FsZG8gc3VtYW5kb2xlIGVsIHZhbG9yIGVudmlhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbGl6YXJfc2FsZG9fZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0ge1wiZG9jdW1lbnRvXCI6ZG9jdW1lbnRvLCBcInZhbG9yX21vdmltaWVudG9cIjp2YWxvcl9tb3ZpZW50bywgXCJwYWdvXCI6cGFnbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9hY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEucGFnby5pZERpYXJpbyA9IHJlc3BbXCJfYm9keVwiXS5yZXBsYWNlKCdcIicsICcnKS5yZXBsYWNlKCdcIicsICcnKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEucGFnbyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBVbiBib25vIGRlIGRldm9sdWNpb24gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3J9XHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9ib25vX2Rldm9sdWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gbnVldm8gcmVnaXN0cm8gZW4gbGEgdGFibGEgU2FsZG9YQ3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM0luc2VydFNhbGRvWEN1ZW50YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7ICdEb2N1bWVudG8nOiB0aGlzLmRvY3VtZW50bywgJ1REb2NUaXR1bGFyJzogJzUnLCAnTkRvY1RpdHVsYXInOiB0aGlzLm5kb2NfY2xpZW50ZSwgJ05vbUN1ZW50YSc6ICdGSURFTElaQUNJT04nLCAnVmFsQ3VlbnRhJzogMCB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM0luc2VydFNhbGRvWEN1ZW50YS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKE0zRU5DOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICBpZiAoTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IE0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19