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.
- package/bundles/sf-reglanegociom3.umd.js +467 -54
- package/bundles/sf-reglanegociom3.umd.js.map +1 -1
- package/bundles/sf-reglanegociom3.umd.min.js +1 -1
- package/bundles/sf-reglanegociom3.umd.min.js.map +1 -1
- package/esm2015/lib/ConexionSQL/posts.service.js +4 -1
- package/esm2015/lib/rnm3/Miscelanea/MathTF.class.js +19 -1
- package/esm2015/lib/rnm3/Offline/service-m3-proceso-offline.js +9 -4
- package/esm2015/lib/rnm3/Promociones/promociones.service.js +96 -20
- package/esm2015/lib/rnm3/Registro/m3-procesos.js +5 -1
- package/esm2015/lib/rnm3/Services/M3Maestro.service.js +100 -2
- package/esm2015/lib/rnm3/Services/m3-fe.service.js +37 -1
- package/esm2015/lib/rnm3/Services/m3-load-l-precio.service.js +3 -4
- package/esm2015/lib/rnm3/Services/m3-reg-masivo.service.js +58 -10
- package/esm2015/lib/rnm3/Services/m3-reg-service.js +39 -16
- package/esm5/lib/ConexionSQL/posts.service.js +4 -1
- package/esm5/lib/rnm3/Miscelanea/MathTF.class.js +29 -1
- package/esm5/lib/rnm3/Offline/service-m3-proceso-offline.js +9 -4
- package/esm5/lib/rnm3/Promociones/promociones.service.js +110 -21
- package/esm5/lib/rnm3/Registro/m3-procesos.js +5 -1
- package/esm5/lib/rnm3/Services/M3Maestro.service.js +141 -2
- package/esm5/lib/rnm3/Services/m3-fe.service.js +53 -1
- package/esm5/lib/rnm3/Services/m3-load-l-precio.service.js +3 -4
- package/esm5/lib/rnm3/Services/m3-reg-masivo.service.js +75 -11
- package/esm5/lib/rnm3/Services/m3-reg-service.js +40 -17
- package/fesm2015/sf-reglanegociom3.js +352 -51
- package/fesm2015/sf-reglanegociom3.js.map +1 -1
- package/fesm5/sf-reglanegociom3.js +454 -55
- package/fesm5/sf-reglanegociom3.js.map +1 -1
- package/lib/rnm3/Miscelanea/MathTF.class.d.ts +2 -0
- package/lib/rnm3/Offline/service-m3-proceso-offline.d.ts +1 -1
- package/lib/rnm3/Promociones/promociones.service.d.ts +5 -4
- package/lib/rnm3/Registro/m3-procesos.d.ts +2 -0
- package/lib/rnm3/Services/M3Maestro.service.d.ts +5 -0
- package/lib/rnm3/Services/m3-fe.service.d.ts +2 -0
- package/lib/rnm3/Services/m3-reg-masivo.service.d.ts +5 -3
- package/lib/rnm3/Services/m3-reg-service.d.ts +2 -2
- package/package.json +1 -1
- package/sf-reglanegociom3.metadata.json +1 -1
- package/lib/rnm3/Maestro/Ubicacion/M3UbiAdicionales.type.d.ts +0 -4
- package/lib/rnm3/Maestro/Ubicacion/M3Ubicacion.type.d.ts +0 -17
- package/lib/rnm3/Maestro/Ubicacion/m3-hubs.type.d.ts +0 -12
- package/lib/rnm3/Maestro/Ubicacion/m3-teclas-rapidas.d.ts +0 -6
- package/lib/rnm3/Offline/Service/bd-offline-log.service.d.ts +0 -27
- package/lib/rnm3/Offline/Service/bd-offline.service.d.ts +0 -17
- package/lib/rnm3/Offline/Service/filtros-diario.service.d.ts +0 -5
- package/lib/rnm3/Promociones/Models/M3CONDIAGRUPACION.class.d.ts +0 -8
- package/lib/rnm3/Promociones/Models/M3CONDIPROMO.class.d.ts +0 -9
- package/lib/rnm3/Promociones/Models/M3DETCONDIPROMO.class.d.ts +0 -7
- package/lib/rnm3/Promociones/Models/M3ENCPROMO.class.d.ts +0 -17
- package/lib/rnm3/Promociones/Models/M3PromoProcesada.class.d.ts +0 -32
|
@@ -409,10 +409,8 @@ export class M3RegService {
|
|
|
409
409
|
// console.log(x);
|
|
410
410
|
// console.log(oData);
|
|
411
411
|
oM3Data.AddToPouchBDCarritoComprasAsync(sKeyCarrito, oM3Procesos).then(x => {
|
|
412
|
-
console.debug("Entro1");
|
|
413
412
|
funcionOK();
|
|
414
413
|
}).catch(x => {
|
|
415
|
-
console.debug("Entro2");
|
|
416
414
|
funcionOK();
|
|
417
415
|
});
|
|
418
416
|
}).catch(x => {
|
|
@@ -871,7 +869,7 @@ export class M3RegService {
|
|
|
871
869
|
productoCombo.Lote = "1";
|
|
872
870
|
productoCombo.ID = +this.GetMaxAtributoFromLista(oM3Procesos.M3ENC, "ID") + 1; //JAGM, cambio de ID, caso cuando se agrega prd:1, prd:2 y de nuevo prd:1. En este caso en lógica anterior, se hace remove de item. y los ID quedaban repetidos.
|
|
873
871
|
productoCombo.Orden = +this.GetMaxAtributoFromLista(oM3Procesos.M3ENC, "Orden") + 1;
|
|
874
|
-
productoCombo.Nombre =
|
|
872
|
+
productoCombo.Nombre = `Combo - ${productosHijosDelCombo.map(x => x.IdProducto).join('-')}`;
|
|
875
873
|
productoCombo.M3DET.push(this.LoadM3PDetalle(moment(new Date()).format('YYYY-MM-DDTHH:mm:ss'), "FECHAIN"));
|
|
876
874
|
productoCombo.M3DET.push(this.LoadM3PDetalle("true", "ESPRODPROMOCOMBO"));
|
|
877
875
|
productoCombo.M3DET.push(this.LoadM3PDetalle("true", "ESPRODPROMO")); // TRUE-> SI ES UN PRODUCTO POR PROMOCION, FALSE-> DE OTRO MODO
|
|
@@ -989,6 +987,13 @@ export class M3RegService {
|
|
|
989
987
|
oM3PEncItems.DISPONIBLE = oM3PrdGeneral.DISPONIBLE;
|
|
990
988
|
oM3PEncItems.PathImage = oM3PItemsWEB.PathImagen;
|
|
991
989
|
oM3PEncItems.CodigoBarras = oM3PItemsWEB.CodigoBarras;
|
|
990
|
+
if (oM3Ubicacion && oM3Ubicacion.M3UbiAdicionales) {
|
|
991
|
+
/** @type {?} */
|
|
992
|
+
let ubiImpFijo = oM3Ubicacion.M3UbiAdicionales.find(x => x.Atributo == "IMPFIJO");
|
|
993
|
+
if (ubiImpFijo && ubiImpFijo.Valor != "") {
|
|
994
|
+
oM3PrdGeneral.CTBLDIMPPRD = ubiImpFijo.Valor;
|
|
995
|
+
}
|
|
996
|
+
}
|
|
992
997
|
/** @type {?} */
|
|
993
998
|
let pTotalBase = this.CalculatePrecioBase(oM3PrdGeneral.CTBLDIMPPRD, this.oMathTF.round(bigDecimal.multiply(oPromocionProcesada.PrecioTotal, oM3PItemsWEB.dCantidad), 2));
|
|
994
999
|
if (oM3PItemsWEB.dCantidad != 0) {
|
|
@@ -1025,11 +1030,18 @@ export class M3RegService {
|
|
|
1025
1030
|
oM3PEncItems.M3DET.push(this.LoadM3PDetalle(dTotalImpuestosTotal.toString(), "TOTALIMPUESTOS"));
|
|
1026
1031
|
oM3PEncItems.M3DET.push(this.LoadM3PDetalle((this.oMathTF.round(this.GetUnitarioByTotal(oM3PItemsWEB.dCantidad, oM3PEncItems, "TOTALIMPUESTOS"), 2)).toString(), "TOTALIMPUNIT"));
|
|
1027
1032
|
//oM3PEncItems.M3DET.push(this.LoadM3PDetalle((+oM3PrdGeneral.LoM3PrdLista.PRECIO - +dTotalImpuestosUnitario).toString(), "PUNITSINIMPUESTO"));//Sin descuento incluido Y sin Impuestos //------ Nunca Cambia
|
|
1028
|
-
oM3PEncItems.M3DET.push(this.LoadM3PDetalle((+dPRECIOUnitBase + dUnitarioPromo).toString(), "PUNITSINIMPUESTO")); //Sin descuento incluido Y sin Impuestos //------ Nunca Cambia //FS 20190725 Correccion en la fomra de calcularlo
|
|
1033
|
+
oM3PEncItems.M3DET.push(this.LoadM3PDetalle((+dPRECIOUnitBase + +dUnitarioPromo).toString(), "PUNITSINIMPUESTO")); //Sin descuento incluido Y sin Impuestos //------ Nunca Cambia //FS 20190725 Correccion en la fomra de calcularlo
|
|
1029
1034
|
oM3PEncItems.M3DET.push(this.LoadM3PDetalle(oM3PrdGeneral.LoM3PrdLista.PRECIO.toString(), "PUNIT")); //Sin descuento incluido ------ Nunca Cambia
|
|
1030
1035
|
oM3PEncItems.M3DET.push(this.LoadM3PDetalle(oPromocionProcesada.PrecioTotal.toString(), "PUNITNETO")); //Con descuento incluido------ Nunca Cambia
|
|
1031
1036
|
oM3PEncItems.M3DET.push(this.LoadM3PDetalle(dUnitarioMonedero.toString(), "UNITFIDEL")); //Unitario fidelizacion ------ Nunca Cambia
|
|
1032
1037
|
oM3PEncItems.M3DET.push(this.LoadM3PDetalle(dUnitarioPromo.toString(), "VUNITPROMO")); //Unitario Promocion ------ Nunca Cambia
|
|
1038
|
+
if (this.gsIdkatios == "CTN") {
|
|
1039
|
+
/** @type {?} */
|
|
1040
|
+
let listaSR = prodGRPSelected.LoM3PrdGeneral[0].LoM3ListaPrecio.find(x => x.IDLISTA == "2");
|
|
1041
|
+
if (listaSR) {
|
|
1042
|
+
oM3PEncItems.M3DET.push(this.LoadM3PDetalle(prodGRPSelected.LoM3PrdGeneral[0].LoM3ListaPrecio.find(x => x.IDLISTA == "2").PRECIO.toString(), "PRECIOSR"));
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1033
1045
|
//** FIN VALORES UNITARIOS */
|
|
1034
1046
|
// *** Informacion de acciones en el cliente ***
|
|
1035
1047
|
if (prodGRPSelected.encontradoLocal) {
|
|
@@ -1068,7 +1080,7 @@ export class M3RegService {
|
|
|
1068
1080
|
return false;
|
|
1069
1081
|
}
|
|
1070
1082
|
/**
|
|
1071
|
-
*
|
|
1083
|
+
* Excluye todos los impuestos dejando solo el FIJO si es de la ubicacion dada
|
|
1072
1084
|
* @param {?} lista
|
|
1073
1085
|
* @param {?} atributo
|
|
1074
1086
|
* @return {?}
|
|
@@ -1126,6 +1138,10 @@ export class M3RegService {
|
|
|
1126
1138
|
this.InsUpdDetItem(oM3PEncItems, (this.oMathTF.round(+this.GetTotalByUnitario(dCantidad, oM3PEncItems, "PRECIOUNITBASE"), 2)).toString(), "PRECIOTOTALBASE"); //Precio Sin impuestos
|
|
1127
1139
|
this.InsUpdDetItem(oM3PEncItems, (this.oMathTF.round((subTotal + +oM3PEncItems.M3DET.find(det => det.NombreConcepto == "TOTALIMPUESTOS").Valor - +oM3PEncItems.M3DET.find(det => det.NombreConcepto == "TOTALPROMO").Valor), 2)).toString(), "PRECIOTOTAL");
|
|
1128
1140
|
/** FIN VALORES DINAMICOS */
|
|
1141
|
+
if (oM3PEncItems.M3PImpuestos.length > 0 && dCantidad == 0) { //Si la cantidad es 0 significa que se está borrando el item o es un obsequio, por lo que no tiene sentido que tenga M3PImpuesto
|
|
1142
|
+
//Si la cantidad es 0 significa que se está borrando el item o es un obsequio, por lo que no tiene sentido que tenga M3PImpuesto
|
|
1143
|
+
oM3PEncItems.M3PImpuestos = [];
|
|
1144
|
+
}
|
|
1129
1145
|
}
|
|
1130
1146
|
/**
|
|
1131
1147
|
* Retorna la sumatoria de los valores de un atributo dado del arreglo de impuestos
|
|
@@ -1141,7 +1157,7 @@ export class M3RegService {
|
|
|
1141
1157
|
const impuesto = oM3PEncItems.M3PImpuestos[_i];
|
|
1142
1158
|
sumatoria = sumatoria + (+impuesto[atributo]);
|
|
1143
1159
|
}
|
|
1144
|
-
return sumatoria;
|
|
1160
|
+
return this.oMathTF.round(sumatoria, 2);
|
|
1145
1161
|
}
|
|
1146
1162
|
/**
|
|
1147
1163
|
* @param {?} oM3PEncItems
|
|
@@ -1158,7 +1174,7 @@ export class M3RegService {
|
|
|
1158
1174
|
if (det_ctbld_imp_prd && det_precio_unit_base) {
|
|
1159
1175
|
valorTotalImpuestos = this.LoadM3PImpuestosFromPrdGrl(det_ctbld_imp_prd.Valor, oM3PEncItems, +bigDecimal.multiply(det_precio_unit_base.Valor, cantidad), cantidad, +oM3PEncItems.M3DET.find(det => det.NombreConcepto == "PUNITNETO").Valor);
|
|
1160
1176
|
}
|
|
1161
|
-
return valorTotalImpuestos;
|
|
1177
|
+
return this.oMathTF.round(valorTotalImpuestos, 2);
|
|
1162
1178
|
}
|
|
1163
1179
|
/**
|
|
1164
1180
|
* @param {?} oM3PEncItems
|
|
@@ -1516,7 +1532,7 @@ export class M3RegService {
|
|
|
1516
1532
|
/** @type {?} */
|
|
1517
1533
|
var opromocionesService = new promocionesService(oDataUser, oM3PItemsWEB);
|
|
1518
1534
|
arrPromo = opromocionesService.VerificarPromociones(oM3Procesos, prodGRPSelected, oM3Ubicacion, oM3ENCPROMO, lTipos);
|
|
1519
|
-
oPromocionProcesada = opromocionesService.ProcesarPromocion(arrPromo, prodGRPSelected, oM3ENCPROMO);
|
|
1535
|
+
oPromocionProcesada = opromocionesService.ProcesarPromocion(arrPromo, prodGRPSelected, oM3ENCPROMO, this.gsIdkatios);
|
|
1520
1536
|
return oPromocionProcesada;
|
|
1521
1537
|
}
|
|
1522
1538
|
else {
|
|
@@ -1848,7 +1864,7 @@ export class M3RegService {
|
|
|
1848
1864
|
/** @type {?} */
|
|
1849
1865
|
var oM3PImpuestos;
|
|
1850
1866
|
/** @type {?} */
|
|
1851
|
-
let valorBaseTotal = this.oMathTF.round(dValorNeto,
|
|
1867
|
+
let valorBaseTotal = this.oMathTF.round(dValorNeto, 4);
|
|
1852
1868
|
/** @type {?} */
|
|
1853
1869
|
let valorNetoTotal = valorBaseTotal;
|
|
1854
1870
|
/** @type {?} */
|
|
@@ -1891,10 +1907,10 @@ export class M3RegService {
|
|
|
1891
1907
|
// }
|
|
1892
1908
|
}
|
|
1893
1909
|
//JAGM 20180912 Nuevo concepto de base
|
|
1894
|
-
oM3PImpuestos.Base = valorNetoTotal;
|
|
1895
|
-
dTotalImpuesto = (+dTotalImpuesto) + (+oM3PImpuestos.Valor);
|
|
1910
|
+
oM3PImpuestos.Base = this.oMathTF.round(valorNetoTotal, 2);
|
|
1911
|
+
dTotalImpuesto = this.oMathTF.round((+dTotalImpuesto), 2) + this.oMathTF.round((+oM3PImpuestos.Valor), 2);
|
|
1896
1912
|
//JAGM 20180912 Suma de Valor Neto
|
|
1897
|
-
valorNetoTotal = (+valorNetoTotal) + (+oM3PImpuestos.Valor);
|
|
1913
|
+
valorNetoTotal = this.oMathTF.round((+this.oMathTF.round(valorNetoTotal, 2)) + this.oMathTF.round((+oM3PImpuestos.Valor), 2), 2);
|
|
1898
1914
|
/** @type {?} */
|
|
1899
1915
|
var impExiste;
|
|
1900
1916
|
impExiste = oM3PEncItems.M3PImpuestos.find(imp => imp.CodImpuesto == oM3PImpuestos.CodImpuesto);
|
|
@@ -1912,12 +1928,15 @@ export class M3RegService {
|
|
|
1912
1928
|
//Diferencia redondeada a dos decimales
|
|
1913
1929
|
dTotalImpuesto = this.oMathTF.round(dTotalImpuesto, 2);
|
|
1914
1930
|
/** @type {?} */
|
|
1915
|
-
let diferencia = this.oMathTF.round((valorTotalProductoTotal - valorBaseTotal - dTotalImpuesto), 2);
|
|
1931
|
+
let diferencia = this.oMathTF.round((+valorTotalProductoTotal - +this.oMathTF.round(valorBaseTotal, 2) - +dTotalImpuesto), 2);
|
|
1932
|
+
if (isNaN(diferencia)) {
|
|
1933
|
+
diferencia = this.oMathTF.round(+(+valorTotalProductoTotal - +this.oMathTF.round(valorBaseTotal, 2) - +dTotalImpuesto).toFixed(4), 2);
|
|
1934
|
+
}
|
|
1916
1935
|
if (diferencia != 0) {
|
|
1917
1936
|
this.ajustadorDeImpuestos(oM3PEncItems, diferencia);
|
|
1918
1937
|
}
|
|
1919
1938
|
// "TOTALIMPUESTOS"
|
|
1920
|
-
return this.oMathTF.round((valorTotalProductoTotal - valorBaseTotal), 2);
|
|
1939
|
+
return this.oMathTF.round((valorTotalProductoTotal - this.oMathTF.round(valorBaseTotal, 2)), 2);
|
|
1921
1940
|
}
|
|
1922
1941
|
else {
|
|
1923
1942
|
return 0;
|
|
@@ -2130,7 +2149,11 @@ export class M3RegService {
|
|
|
2130
2149
|
else {
|
|
2131
2150
|
// JAGM 20191021, no hacer lógica de promociones y varios, cuándo se borra el item.
|
|
2132
2151
|
if (iCantidad == 0) {
|
|
2133
|
-
|
|
2152
|
+
//Se toma en cuenta el prd y sus hijos con el IdEncPadre
|
|
2153
|
+
oM3Procesos.M3ENC.filter(enc => (enc.IdProducto == idProducto && enc.Lote == Lote && enc.ID == IDEnc) || enc.IdEncPadre == IDEnc).forEach(prd => {
|
|
2154
|
+
prd.M3DET.find(det => det.NombreConcepto == "CANTIDAD").Valor = iCantidad;
|
|
2155
|
+
});
|
|
2156
|
+
//oM3Procesos.M3ENC.find(enc => enc.IdProducto == idProducto && enc.Lote == Lote && enc.ID == IDEnc).M3DET.find(det => det.NombreConcepto == "CANTIDAD").Valor = iCantidad;//Antigua logica
|
|
2134
2157
|
this.UpdateM3ProcesosWithData(oM3Procesos, oM3Data, oDataUser, sIDKatios, tipoUbicacion, funcionOK, funcionError, m3Ubicacion);
|
|
2135
2158
|
}
|
|
2136
2159
|
else {
|
|
@@ -2605,4 +2628,4 @@ function M3RegService_tsickle_Closure_declarations() {
|
|
|
2605
2628
|
M3RegService.prototype.gsIdkatios;
|
|
2606
2629
|
}
|
|
2607
2630
|
|
|
2608
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibTMtcmVnLXNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy8iLCJzb3VyY2VzIjpbImxpYi9ybm0zL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUk5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBNEMsTUFBTSw4Q0FBOEMsQ0FBQztBQUU1SCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUdwRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7O0FBQ3ZCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTNDLE1BQU07Ozs7OztJQVdGLFlBQVksZ0JBQWdDLEVBQUUsZUFBOEIsRUFBRSxTQUFpQjt1QkFWdEUsSUFBSSxNQUFNLEVBQUU7K0JB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QUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQzs7Q0FHZCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVuYy1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUERldGFsbGVJdGVtcywgTTNQSXRlbXNXRUIsIE0zUERldGFsbGVDdXBvbiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNEYXRhIH0gZnJvbSBcIi4uL0RhdGEvbTMtZGF0YVwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3JcIjtcclxuaW1wb3J0IHsgeG1sVG9Kc29uVEYgfSBmcm9tIFwiLi4vLi4vQ29udmVydC94bWxUb0pTb24uY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQSW1wdWVzdG9zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXAtaW1wdWVzdG9zXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzc1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IHByb21vY2lvbmVzU2VydmljZSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9wcm9tb2Npb25lcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxpc3RhLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgYSB9IGZyb20gXCJAYW5ndWxhci9jb3JlL3NyYy9yZW5kZXIzXCI7XHJcbmltcG9ydCB7IE0zUHJlc2VudGFjaW9uZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVzZW50YWNpb25lc1wiO1xyXG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL3V0aWxcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrRGV0IH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRQYWNrRGV0XCI7XHJcbmltcG9ydCB7IE0zUHJkQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNPdENsYXNpZmljYWNpb25lcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1vdC1jbGFzaWZpY2FjaW9uZXNcIjtcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tIFwiLi4vTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3NcIjtcclxuaW1wb3J0IHsgRUNBTkNFTEVEIH0gZnJvbSBcImNvbnN0YW50c1wiO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxudmFyIGJpZ0RlY2ltYWwgPSByZXF1aXJlKCdqcy1iaWctZGVjaW1hbCcpO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnU2VydmljZSB7XHJcbiAgICBwdWJsaWMgb01hdGhURjogTWF0aFRGID0gbmV3IE1hdGhURigpO1xyXG4gICAgcHJpdmF0ZSBvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvO1xyXG4gICAgcHVibGljIG9MaXN0YU9ic2VxdWlvczogQXJyYXk8YW55PiA9IG51bGw7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zRXhjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9PUHJvbW86IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIG9ic2VxdWlvc0NhbnRpZGFkOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxJZEFjdGl2YVByb21vID0gW107XHJcbiAgICBwcml2YXRlIEdvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMztcclxuICAgIHByaXZhdGUgZ3NJZGthdGlvcztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihpb00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgSXNQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSWRrYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvID0gaW9NM0NvdWNoTWFlc3RybztcclxuICAgICAgICB0aGlzLkdvUG9zdFNlcnZpY2VNMyA9IElzUG9zdFNlcnZpY2VNMztcclxuICAgICAgICB0aGlzLmdzSWRrYXRpb3MgPSBzSWRrYXRpb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogVmFsaWRhciBudW1lcm8gZGUgaXRlbXMgYWdyZWdhZG9zLiBzaSBlcyBtYXlvciBhIDEuMDAwIHByZW5kZSBwYXJhbWV0cm8gXHJcbiAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhck51bWVyb0l0ZW1zKG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvbE0zUHJvY2Vzb3MuTTNFTkMubGVuZ3RoID4gMTAwMCkge1xyXG4gICAgICAgICAgICBvbE0zUHJvY2Vzb3MuQXBsRGVzZGVTZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICBvbE0zUHJvY2Vzb3MuTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZShzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuVmFsaWRhck51bWVyb0l0ZW1zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB0aGlzLlJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbyk7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NMy9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSWRNMyA9IG9Kc29uLlJFU1BVRVNUQS5JRE0zO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpbyA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJTztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU9DSUVSUkVcclxuXHJcbiAgICAgICAgICAgIC8vQWN0dWFsaXphY2lvbiBkZSBlc3RhZG9zLlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLkVzdGFkb0RlcztcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb0pzb24uUkVTUFVFU1RBKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBwcm9jZXNhbWllbnRvX3NlcnZpY2VfYXN5bmMoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLlJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NMy9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIFJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogQXJyYXk8TTNQcm9jZXNvcz4sIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZS9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLy9SZXRvbWFyIGluZm9ybWFjaW9uIHBhcmEgZWwgcHJvY2Vzby5cclxuICAgIHB1YmxpYyBSZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyOiBhbnksIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChvRGF0YVVzZXIgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuSWRNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChhcGxSZXRvbWFySW5mbykge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQjtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSB1bmRlZmluZWQgfHwgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmVcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUHJvY2VzYW1pZW50byBkZSBkYXRvcyBlbiBiYXNlIGRlIGRhdG9zIHBvdWNoREIuXHJcbiAgICBwdWJsaWMgUHJvY2VzYW1pZW50b1NlcnZpY2VQb3VjaERCKG9NM0RhdGE6IE0zRGF0YSwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAvL0NhcmdhciBkZXRhbGxlIGRlIGl0ZW1zXHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKGFzeW5jIHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gcmVzdWx0O1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy52YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zUHJvY2Vzb3MuTTNFTkMsIHByb2R1Y3RVbml0U2VsZWN0ZWQsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGlmIChjYW50aWRhZF9hY3R1YWwgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy5nZXRDYW50aWRhZChvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gKCtjYW50aWRhZF9hY3R1YWwpICsgK29NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZXQgTTNFbmMgPSB0aGlzLmdldF9NM0VOQ19ieV9pZHByZF9sb3RlKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSwgcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFKTtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVICYmIHByb2QuTG90ZSA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUgJiYgIShwcm9kLklkRW5jUGFkcmUgPiAwKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhvRGF0YUNhcnJpdG9Db21wcmFzKTtcclxuICAgICAgICB9LCBhc3luYyBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvRGF0YVVzZXIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGlvTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWdyZWdhciBhIGNhcnJpdG8gcHJvZHVjdG8uXHJcbiAgICBwdWJsaWMgYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsLCB2YWxvckRlc2N1ZW50byA9IDApIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuICAgICAgICAvL0pBR00gMjAxOTA3MjIgc2UgYWdyZWdhIHBhcmEgY3VhbmRvIGVzIGVsIHByaW1lciBwcm9kdWN0byBxdWUgc2UgYWdyZWdhcsOhXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRU5DLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCwgdmFsb3JEZXNjdWVudG8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLCB2YWxvckRlc2N1ZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL1ZhbGlkYSBxdWUgZXhpc3RhIHByb2R1Y3RvIGVuIGxvcyBlbmNhYmV6YWRvcy4gVHJ1ZTogU2kgZXhpc3RlLCBGYWxzZSBkZSBvdHJvIG1vZG9cclxuICAgIC8vIFNlIGNhbWJpYSBmdW5jaW9uYWxpZGFkIGRlIHJldHVybi5cclxuICAgIHB1YmxpYyB2YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zTGlzdGFFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJkR3JsOiBNM1ByZEdlbmVyYWwsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBvRW5jOiBNM1BFbmNJdGVtcyA9IG51bGw7XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gLTE7XHJcbiAgICAgICAgaWYgKG9NM0xpc3RhRW5jICE9PSB1bmRlZmluZWQgJiYgb00zUHJkR3JsICE9PSB1bmRlZmluZWQgJiYgb00zTGlzdGFFbmMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgb0VuYyA9IG9NM0xpc3RhRW5jLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IG9NM1ByZEdybC5TS1UgJiYgIWVuYy5JZEVuY1BhZHJlICYmIHRoaXMuZ2V0Q2FudGlkYWRQb3NpdGl2YShlbmMpKTtcclxuICAgICAgICAgICAgaWYgKG9FbmMgIT09IHVuZGVmaW5lZCAmJiBvRW5jICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcxNyBWYWxpZGFyIGFob3JhIGVsIHByZWNpby5cclxuICAgICAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzR2VuZXJhbChvTTNQcmRHcmwsICtvRW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuVmFsaWRhclByZWNpb3NQcmRzKG9FbmMsIG9NM1ByZEdybC5Mb00zUHJkTGlzdGEpICYmICF0aGlzLlZhbGlkYXJFc3RhUGFxdWV0ZShvRW5jLCBvTTNMaXN0YUVuYykpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9IG9FbmMuSUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWQgPSArb0VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FudGlkYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2FudGlkYWRQb3NpdGl2YShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkID0gMDtcclxuICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKVxyXG5cclxuICAgICAgICBpZiAoZGV0Q2FudGlkYWQpIHtcclxuICAgICAgICAgICAgY2FudGlkYWQgPSArZGV0Q2FudGlkYWQuVmFsb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FudGlkYWQgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgcXVlIGVsIGVuY2FiZXphZG8gY29uIGVsIHByb2R1Y3RvIGFncmVnYWRvLCBzZWEgdW4gcGFxdWV0ZVxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBvTTNMaXN0YUVuYyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJFc3RhUGFxdWV0ZShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvTTNMaXN0YUVuYzogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG9NM0xpc3RhRW5jLmZpbmQoeCA9PiB4LklkRW5jUGFkcmUgPT0gb00zUEVuY0l0ZW1zLklEKSkge1xyXG4gICAgICAgICAgICAgICAgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3NcclxuICAgICAqIEBwYXJhbSBvRW5jIFxyXG4gICAgICogQHBhcmFtIG9NM1ByZExpc3RhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclByZWNpb3NQcmRzKG9FbmM6IE0zUEVuY0l0ZW1zLCBvTTNQcmRMaXN0YTogTTNQcmRMaXN0YSkge1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkUHJlY2lvRW5jOiBudW1iZXIgPSArb0VuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb0xpc3Q6IG51bWJlciA9IG9NM1ByZExpc3RhLlBSRUNJTztcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJlY2lvTGlzdCA9PSBkUHJlY2lvRW5jKSB7XHJcbiAgICAgICAgICAgICAgICBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgVmFsaWRhclByZWNpb3NQcmRzXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIFVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgdGlwb1ViaWNhY2lvbjogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uXHJcbiAgICAgICAgLCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCID0gbnVsbCkge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvL0lESFVCXHJcbiAgICAgICAgaWYgKHRpcG9VYmljYWNpb24udG9VcHBlckNhc2UoKSA9PSBcIldFQlwiKSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIG0zVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgbTNVYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIGlmIChtM1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICB2YXIgbG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIgPSBvTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXModGhpcy5nc0lka2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHRoaXMuUHJvY1Byb21vQWZ0ZXJBZGRUb0NhcnQob00zUHJvY2Vzb3MsIG9EYXRhVXNlciwgbG9NM1BJdGVtc1dFQiwgbTNVYmljYWNpb24sIHRydWUpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh4KTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG9EYXRhKTtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXNBc3luYyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVudHJvMVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJFbnRybzJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4KVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvIGVuIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9Pa1wiKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLm9FbmNhYmV6YWRvTTNDb21wb25lbnQuUmVjYXJnYXJDYXJyaXRvKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuTG9hZENhcnQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIHVwZGF0ZUFQb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgdGlwb1ViaWNhY2lvbjogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vSURIVUJcclxuICAgICAgICBpZiAodGlwb1ViaWNhY2lvbi50b1VwcGVyQ2FzZSgpID09IFwiV0VCXCIpIHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICBhd2FpdCBvTTNEYXRhLkRlbGV0ZShzS2V5Q2Fycml0byk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL0VsaW1pbmFyIGRvY3VtZW50byBkZSBjb3VjaC9wb3VjaCwgaW5pY2lvIHkgYWN0dWFsXHJcbiAgICBwdWJsaWMgRGVsRG9jc1N0YXJ0QW5kQ3VycmVudChvTTNEYXRhOiBNM0RhdGEsIHNJREthdGlvczogc3RyaW5nLCBvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFViaWNhY2lvbkN1cnJlbnQsIEh1YkN1cnJlbnQpIHtcclxuICAgICAgICAvL0VsaW1pbmFyIEluaWNpYWxcclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlICE9PSB1bmRlZmluZWQgJiYgb2xNM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhVXNlciA9IHsgXCJVc3VhcmlvU2lzdGVtYVwiOiB7IFwiVERPQ1wiOiBvbE0zUHJvY2Vzb3MuVERvYywgXCJORE9DXCI6IG9sTTNQcm9jZXNvcy5ORG9jLCBcIlVCSUNBQ0lPTlwiOiBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBvbE0zUHJvY2Vzb3MuSURIdWIgfSB9XHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWxldGUgc3RhcnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAvL0VsaW1pbmFyIGFjdHVhbFxyXG4gICAgICAgICAgICBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogVWJpY2FjaW9uQ3VycmVudC50b1N0cmluZygpLCBcIklESFVCXCI6IEh1YkN1cnJlbnQgfSB9XHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWxldGUgY3VycmVudFwiKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDYXJyaXRvQ29tcHJhc1BvdWNoREIob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9UcmFzbGFkYXIgaW5mb3JtYWNpw7NuIGRlIGNhcnJpdG8sIGRvcyB1c3Vhcmlvc1xyXG4gICAgcHVibGljIGFzeW5jIE1vdmVDYXJ0SW50b1VzZXIoc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyT3JpZ2VuOiBhbnksIG9EYXRhVXNlckRlc3Rpbm86IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b09yaWdlbjtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9EZXN0aW5vO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b09yaWdlbiA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvRGVzdGlubyA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBsZXQgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG9PcmlnZW4pO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzby5URG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLk5Eb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvW1wiX3JldlwiXTtcclxuICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0b0Rlc3Rpbm8sIG9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpb3MgdG90YWxlcyB5IGRlIGJhc2VcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxCYXNlO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3I6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvck5ldG86IG51bWJlciA9IDA7XHJcblxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbCA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciAvLygrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSAqICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbEJhc2UgPSB0aGlzLkNhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKGVuYywgZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMQkFTRVwiKS5WYWxvciA9IFN0cmluZyhNYXRoLnJvdW5kKGRQcmVjaW9Ub3RhbEJhc2UgKiAxMDApIC8gMTAwKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yID0gKCtkVmFsb3IpICsgKCtkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yTmV0byA9ICgrZFZhbG9yTmV0bykgKyAoK2RQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuUmVjYWxjdWxvSW1wdWVzdG9zKGVuYywgZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gLy9vTTNQcm9jZXNvcy5WYWxvciA9IGRWYWxvcjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1JlY2FsY3VsYXIgcHJlY2lvcy4gcmVjb3JyaWVuZG8gbG9zIGVuY2FiZXphZG9zLlxyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIHZhbG9yID0gMDtcclxuICAgICAgICB2YXIgVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MTAxMCBzZSBjYW1iaWEgZWwgdmFsb3IgZGVsIHByZWNpbyB1bml0YXJpbyBiYXNlLCB5YSBxdWUgYWwgbW9tZW50byBkZSBsbGFtYXIgbGEgZnVuY2nDs24gVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvXHJcbiAgICAgICAgICAgIC8vIHNlIHJlY2FsY3VsbyBlbCBwcmVjaW8gdG90YWwsIGRlcGVuZGllbmRvIGRlIGVzdGUgdmFsb3IuXHJcbiAgICAgICAgICAgIGxldCBwVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhdGVQcmVjaW9CYXNlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVEJMRElNUFBSRFwiKS5WYWxvcixcclxuICAgICAgICAgICAgICAgIHRoaXMub01hdGhURi5yb3VuZChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IsIDIpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWRFbmMgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoK2RDYW50aWRhZEVuYyAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSAoK3BUb3RhbEJhc2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICB0aGlzLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhlbmMsICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxhciBwcmVjaW8gYmFzZSBkZSB1biBwcmVjaW8sIHRlbmllbmRvIGVsIHZhbG9yIHRvdGFsIG8gbmV0by5cclxuICAgIHB1YmxpYyBDYWxjdWxhclByZWNpb0Jhc2VGcm9tUHJvY2VzbyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkUHJlY2lvTmV0bzogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRWYWxvckltcHVlc3RvOiBudW1iZXIgPSAxO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgZFZhbG9ySW1wdWVzdG8gPSAoK2RWYWxvckltcHVlc3RvKSArICgraW1wLlBvcmNlbnRhamUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKCtkUHJlY2lvTmV0bykgLyAoK2RWYWxvckltcHVlc3RvKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZWNhbGN1bG8gZGUgdmFsb3IgZGUgaW1wdWVzdG9zLCBjdWFuZG8gY2FtYmlhIGVsIHZhbG9yLiBTZWEgcG9yIGNhbnRpZGFkLCBlbGltaW5hY2nDs24uLi5cclxuICAgIC8vIHB1YmxpYyBSZWNhbGN1bG9JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZFByZWNpb0Jhc2U6IG51bWJlcikge1xyXG4gICAgLy8gICAgIHZhciBkVG90YWxJbXB1ZXN0bzogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgIC8vICAgICAgICAgaW1wLlZhbG9yID0gKCtkUHJlY2lvQmFzZSkgKiAoK2ltcC5Qb3JjZW50YWplKTtcclxuICAgIC8vICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIG51ZXZvIGNvbmNlcHRvXHJcbiAgICAvLyAgICAgICAgIGltcC5CYXNlID0gZFByZWNpb0Jhc2U7XHJcbiAgICAvLyAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gKCtkVG90YWxJbXB1ZXN0bykgKyAoK2ltcC5WYWxvcik7XHJcbiAgICAvLyAgICAgICAgIC8vU3VtYSBkZSBwcmVjaW8gYmFzZSBcclxuICAgIC8vICAgICAgICAgZFByZWNpb0Jhc2UgPSAoK2RQcmVjaW9CYXNlKSArICgraW1wLlZhbG9yKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICBkVG90YWxJbXB1ZXN0byA9IE1hdGgucm91bmQoZFRvdGFsSW1wdWVzdG8gKiAxMDApIC8gMTAwO1xyXG4gICAgLy8gICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTElNUFVFU1RPU1wiKS5WYWxvciA9IGRUb3RhbEltcHVlc3RvLnRvU3RyaW5nKCk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYWNpb24gbnVldm8gTTMgcHJvY2Vzb3MsIGVzdGUgdmEgdmFjaW8gc2luIG5pc2lxdWllcmEgTTNQRW5jSXRlbXMuIFxyXG4gICAgICogU2UgdXRpbGl6YSBwcmluY2lwYWxtZW50ZSBwYXJhIGxhcyBjcmVhY2lvbiBkZXNkZSAwIHVuIE0zIFByb2Nlc28uIFF1ZSBwYXNhIGRlIGVzdGFkb3MgJycgYWwgcHJpbWVyIGVzdGFkb1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBpZHByb2Nlc29fZGVzdGlubyBcclxuICAgICAqIEBwYXJhbSB0ZG9jIFxyXG4gICAgICogQHBhcmFtIG5kb2MgXHJcbiAgICAgKiBAcGFyYW0gZXN0YWRvc19mdXR1cm9zIFxyXG4gICAgICogQHBhcmFtIGlkSHViIFxyXG4gICAgICogQHBhcmFtIGlkVWJpY2FjaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ3JlYXRlTTNOZXdQcm9jZXNvRW1wdHkoaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZHByb2Nlc29fZGVzdGlubzogc3RyaW5nLCB0ZG9jOiBzdHJpbmcsIG5kb2M6IHN0cmluZyxcclxuICAgICAgICBlc3RhZG9zX2Z1dHVyb3M6IEFycmF5PGFueT4sIGlkSHViOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gaWRwcm9jZXNvX2Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IGVzdGFkb3NfZnV0dXJvc1swXS5FX0Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IGVzdGFkb3NfZnV0dXJvc1swXS5TRV9EZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gK2lkSHViO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9ICtpZFViaWNhY2lvbjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuSURIdWIgPSAraWRIdWI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlViaWMxID0gK2lkVWJpY2FjaW9uO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5URG9jID0gdGRvYztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTkRvYyA9IG5kb2M7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlRpcG9UZXJjZXJvID0gMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVWJpYzIgPSAtMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZSA9IC0xO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZSA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ3VhbmRvIHNlIGFncmVnYSBwb3IgcHJpbWVyYSB2ZXogYWwgY2Fycml0byBkZSBjb21wcmEuXHJcbiAgICBwdWJsaWMgTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvRGF0YVVzZXI6IGFueSwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIC8vc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT05cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgaWYgKGlvTTNQcm9jZXNvcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlRpcG9UZXJjZXJvID0gMTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5URG9jID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0M7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTkRvYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlViaWMxID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5VYmljMiA9IC0xO1xyXG4gICAgICAgIC8vL0FHUkVHQVIgTlVFVkEgRlVOQ0lPTkFMSURBRCBERSBIVUJTLiBGTFVKTyBERSBUUkFCQUpPXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuSURIdWIgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUI7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLklESHViO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb00zUHJvY2Vzb3MuVWJpYzE7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmUgPSAtMTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZSA9IC0xO1xyXG5cclxuICAgICAgICAvLy9GSU4gQUdSRUdBUiBOVUVWQSBGVU5DSU9OQUxJREFEIERFIEhVQlMuIEZMVUpPIERFIFRSQUJBSk9cclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBcIlwiO1xyXG5cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID09IFwiXCIgJiYgaW9NM1Byb2Nlc29zID09IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gXCJSZWdpc3Ryb1wiO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBcIkFjdGl2b1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5TdWJFc3RhZG9fbyAhPSBcIlwiICYmIG9NM1BJdGVtc1dFQi5Fc3RhZG9fbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IG9NM1BJdGVtc1dFQi5TdWJFc3RhZG9fbztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gb00zUEl0ZW1zV0VCLkVzdGFkb19vO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSWRQcm9jZXNvID09IFwiXCIgJiYgaW9NM1Byb2Nlc29zID09IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBcIk0zRUNDXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IG9NM1BJdGVtc1dFQi5JZFByb2Nlc287XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMucHVzaCh0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKSk7XHJcbiAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgbnVsbCwgMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKVxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvciA9IG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIC8vdGhpcy5Qcm9jZXNhbWllbnRvU2VydmljZShQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvcywgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0NhcmdhciBudWV2b3MgYWRpY2lvbmFsZXMgYWRpY2lvbmFsZXNcclxuICAgIHB1YmxpYyBMb2FkQWRpY2lvbmFsZXMob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgcHJvZHVjdDogVHlwZU0zUHJkR3JwKTogTTNQSXRlbXNXRUIge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5DbGF2ZVByZFNSViA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIkNMQVZFUFJPRFNFUlZcIikuVkFMT1I7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5DbGF2ZVByZFVuaWRhZCA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIkNMQVZFVU5JREFEXCIpLlZBTE9SO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuVW5pZGFkID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiVU5JREFEXCIpLlZBTE9SO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9NM1BJdGVtc1dFQjtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBwcm9jZXNvcywgcmV0b21hbmRvIGRlc2RlIGRhdGFcclxuICAgIHB1YmxpYyBMb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCwgdmFsb3JEZXNjdWVudG8gPSAwKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3IgPSAoK29NM1Byb2Nlc29zLlZhbG9yKSArICgrb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb00zUHJvY2Vzb3MuVmFsb3I7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID09IFwiXCIgJiYgb00zUEl0ZW1zV0VCLklkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gb00zUEl0ZW1zV0VCLklkUHJvY2VzbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMucHVzaCh0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKSk7XHJcbiAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgbnVsbCwgdmFsb3JEZXNjdWVudG8sIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZClcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBMb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvZW5jYWJlemFkb0l0ZW1zOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb1BhZHJlTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCB2YWxvckRlc2N1ZW50byA9IDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICAvL1ZhbGlkYWNpb24gZGUgSW52ZW50YXJpby5cclxuICAgICAgICBsZXQgYWRpVmVudGFOZWcgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkFUUklCVVRPID09IFwiVkVOVEFORUdcIilcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuVE1JZFByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIk0zRUNDXCIgJiYgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkICYmIG9NM1ViaWNhY2lvbi5NM0hVQlNbMF0uVGlwbyA9PSBcIldFQlwiICYmICEoYWRpVmVudGFOZWcgJiYgYWRpVmVudGFOZWcuVkFMT1IpKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdID0gJ05vIGhheSBpbnZlbnRhcmlvIHBhcmEgYWdyZWdhciAnICsgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCArICcgSXRlbXMnO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEU7XHJcbiAgICAgICAgfSAvL2Vsc2Uge1xyXG5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zID0gdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsSXRlbShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9QYWRyZU0zUEVuY0l0ZW1zLCB2YWxvckRlc2N1ZW50byk7XHJcblxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXSkge1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvUGFkcmVNM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICAvL1RpZW5lIHVuIGVuY2FiZXphZG8gcGFkcmUuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlID0gb1BhZHJlTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXSkge1xyXG4gICAgICAgICAgICB2YXIgb2xNM1ByZFBhY2tEZXQ6IEFycmF5PE0zUHJkUGFja0RldD47XHJcbiAgICAgICAgICAgIG9sTTNQcmRQYWNrRGV0ID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLk0zUEFDS1xyXG4gICAgICAgICAgICBpZiAob2xNM1ByZFBhY2tEZXQgJiYgb2xNM1ByZFBhY2tEZXQubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vbGV0IHZhbG9yRGVzY3VlbnRvUGFjayA9IHRoaXMuY2FsY3VsYXJQb3JjZW50YWplRGVzY3VlbnRvQ29tYm8ocHJvZEdSUFNlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9sTTNQcmRQYWNrRGV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1ByZFBhY2tEZXQ6IE0zUHJkUGFja0RldCA9IG9sTTNQcmRQYWNrRGV0W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYWNrTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUHJkUGFja0RldC5vTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCID0gb00zUHJkUGFja0RldC5vTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIgPSBPYmplY3QuYXNzaWduKHt9LCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb00zUHJkUGFja0RldC5DYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvTTNQcmRQYWNrRGV0LmdzUGF0aEltYWdlbjtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCAqIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLkNhbGN1bGFyUHJlY2lvc1BDS0cob00zUHJkUGFja0RldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIGkgKyAyOyAvL0VzdG8gZnVuY2lvbmEgc2kgdGllbmUgc29sbyAyIG5pdmVsZXNcclxuICAgICAgICAgICAgICAgICAgICAvL1NpIGVzdG8gc2UgY3VtcGxlIGVzdGUgcHJvZHVjdG8gZXMgdW4gcGFjayB5IHRpZW5lIHByb2R1Y3RvcyBhc29jaWFkb3MuXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJkR2VuZXJhbCA9IG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTTNDb2RzLmZpbmQoeCA9PiB4LklkQ29kaWdvID09IFwiVVBDXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJkR2VuZXJhbCAmJiBwcmRHZW5lcmFsLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuQ29kaWdvQmFycmFzID0gcHJkR2VuZXJhbC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIm5vIGHDsWFkaSBjb2RpZ28gZGUgYmFycmFzIGEgcHJvZHVjdG8gaGlqbzogXCIgKyBvTTNQcmRQYWNrRGV0LlNLVUhJSk8pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgb00zUHJkUGFja0RldC5NM0dSUCwgb00zUHJvY2Vzb3MuTTNFTkMsIHBhY2tNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRW5jSXRlbXMsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyMywgZXN0byBlcyBjdWFuZG8gc2UgbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgcHJvZGN1dG9zIGV4aXN0ZW50ZXMuXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklEID0gb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkgZW52aW8gZGUgcGFkcmUgZGVzZGUgaW5zdHJ1Y2Npb24gbWFzIGFycmliYVxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklERW5jUGFkcmUgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlID0gb00zUEl0ZW1zV0VCLklERW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuVGlwb0FncnVwYWNpb24gPSBvTTNQSXRlbXNXRUIuVGlwb0FncnVwYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCAmJiBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLmZvckVhY2goZGluID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQRGluYW1CeUFjdGl2aWRhZC5wdXNoKHsuLi4gZGlufSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChvTTNQRW5jSXRlbXMpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdID0gb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQcm9jZXNhZG8gPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgLy99XHJcbiAgICB9XHJcblxyXG4gICAgY2FsY3VsYXJQb3JjZW50YWplRGVzY3VlbnRvQ29tYm8ocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgdmFsb3JEZXNjdWVudG9QYWNrID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JJdGVtc0NvbWJvU3VtYSA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9yRmluYWxDb21ibyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG5cclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTTNQQUNLLmZvckVhY2gocHJkUGFjayA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZCA9IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgPyBwcmRQYWNrLk0zR1JQLkNhbnRpZGFkIDogMTtcclxuICAgICAgICAgICAgbGV0IGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByZFBhY2suTTNHUlAsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5JRExJU1RBKVxyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTylcclxuICAgICAgICAgICAgdmFsb3JJdGVtc0NvbWJvU3VtYSArPSAocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPICogY2FudGlkYWQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodmFsb3JJdGVtc0NvbWJvU3VtYSA+IHZhbG9yRmluYWxDb21ibykge1xyXG4gICAgICAgICAgICB2YWxvckRlc2N1ZW50b1BhY2sgPSAxMDAgLSAodmFsb3JGaW5hbENvbWJvICogMTAwIC8gdmFsb3JJdGVtc0NvbWJvU3VtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodmFsb3JEZXNjdWVudG9QYWNrKVxyXG4gICAgICAgIHJldHVybiB2YWxvckRlc2N1ZW50b1BhY2s7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxvIGRlIHByZWNpb3MgZGUgaGlqb3MgZGVsIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQcmRQYWNrRGV0IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcmVjaW9zUENLRyhvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQpIHtcclxuICAgICAgICBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29kaWdvOiBzdHJpbmcsIHZhbG9yLCBkQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcblxyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklkUHJvZHVjdG8gPSBjb2RpZ287XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Mb3RlID0gXCIxXCI7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTm9tYnJlID0gXCJDb21ib1wiO1xyXG5cclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpLCBcIkZFQ0hBSU5cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwidHJ1ZVwiLCBcIkVTUFJPRFBST01PQ09NQk9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwidHJ1ZVwiLCBcIkVTUFJPRFBST01PXCIpKTsgLy8gVFJVRS0+IFNJIEVTIFVOIFBST0RVQ1RPIFBPUiBQUk9NT0NJT04sIEZBTFNFLT4gREUgT1RSTyBNT0RPXHJcbiAgICAgICAgLy9EZXRhbGxlcyBkZSBmYWN0dXJhIGVsZWN0cm9uaWNhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJFTkNQUk9NT1wiLCBcIlRJUE9fUFJEXCIpKTtcclxuICAgICAgICAvKipGSU4gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG5cclxuICAgICAgICAvLyoqIElOSUNJTyBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBSRUNJT1VOSVRCQVNFXCIpKTsgLy9QcmVjaW8gU2luIGltcHVlc3Rvc1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3NcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVFwiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvICAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRORVRPXCIpKTsvL0NvbiBkZXNjdWVudG8gaW5jbHVpZG8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVlVOSVRQUk9NT1wiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlVOSVRGSURFTFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAvLyoqIEZJTiBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDQU5USURBRFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIkZJREVMSVpBQ0lPTlwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxQUk9NT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiQ1RCTERJTVBQUkRcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiU1VCVE9UQUxcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxCQVNFXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpKTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChwcm9kdWN0b0NvbWJvKTtcclxuICAgICAgICBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmZvckVhY2gocHJvZHVjdG8gPT4ge1xyXG4gICAgICAgICAgICBwcm9kdWN0by5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgcHJvZHVjdG8uSWRFbmNQYWRyZSA9IHByb2R1Y3RvQ29tYm8uSUQ7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gocHJvZHVjdG8pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0b0NvbWJvO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zQXBsU3VtYVZhbG9yID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKG9NM0VOQyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRDYW50aWRhZCA9IG9NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGV0RXNQcmRDb21ibyA9IG9NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkVTUFJPRFBST01PQ09NQk9cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwICYmICEoZGV0RXNQcmRDb21ibyAmJiBkZXRFc1ByZENvbWJvLlZhbG9yID09IFwidHJ1ZVwiKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yID0gMDtcclxuXHJcbiAgICAgICAgLy9mb3IgKGNvbnN0IG9NM0VOQyBvZiB0aGlzLm9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIWVuYy5JZEVuY1BhZHJlIHx8IGVuYy5JZEVuY1BhZHJlIDw9IDApKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBvTTNFTkMgb2YgcHJvZHVjdG9zQXBsU3VtYVZhbG9yKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byArPSArb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yICs9ICtvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJTVUJUT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgTTNQcm9jZXNvIGVuY2FiZXphZG8gaXRlbXMsIGRlc2RlIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsSXRlbShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyA9IHVuZGVmaW5lZCwgdmFsb3JEZXNjdWVudG8gPSAwKTogTTNQRW5jSXRlbXMge1xyXG5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICB2YXIgZFBSRUNJT1VuaXRCYXNlID0gMDtcclxuICAgICAgICB2YXIgaW5mTml2ZWxlc1ByY2lvO1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgdmFyIGRUb3RhbEltcHVlc3Rvc1RvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVW5pdGFyaW9Nb25lZGVybzogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFVuaXRhcmlvUHJvbW86IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIC8vVmVyaWZpY2FyIGVsIHByZWNpbyBhIHVzYXIsIHVzYW5kbyBsYSBsb2dpY2EgZGUgbml2ZWxlcyBkZSBwcmVjaW9zLlxyXG4gICAgICAgIGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcbiAgICAgICAgaWYgKHZhbG9yRGVzY3VlbnRvID4gMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiB2YWxvckRlc2N1ZW50byAvIDEwMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9WYWxpZGEgc2kgZWwgcHJvZHVjdG8gZXN0w6EgcmVzdGluZ2lkb1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhKSkge1xyXG4gICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGVsIHRvdGFsIGRlIHB1bnRvcyB5IGVsIHZhbG9yIHRvdGFsIGRlIGxhIHByb21vY2nDs24gcG9yIGxhIGNxYW50aWRhZCBkZSBwcm9kdWN0b3MgZGUgbGEgbWlzbWEgcmVmZXJlbmNpYVxyXG4gICAgICAgICAgICBkVW5pdGFyaW9Nb25lZGVybyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvOyAvL1VuaXRhcmlvIE1vbmVkZXJvXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8sIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvL05vIHNlIHV0aWxpemEsIHNlIGRlamEgcGFyYSB1c29zIGFkZWxhbnRlXHJcblxyXG4gICAgICAgICAgICBkVW5pdGFyaW9Qcm9tbyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247IC8vUHJvbW9jaW9uIHVuaXRhcmlvXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy9ObyBzZSB1dGlsaXphLCBzZSBkZWphIHBhcmEgdXNvcyBhZGVsYW50ZVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNEZXRDdXBvbmVzID0gdGhpcy5nZXRfbGlzdF9jdXBvbmVzX2Zyb21fcHJvbW8ob1Byb21vY2lvblByb2Nlc2FkYSwgK29NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9DYWxjdWxvIGRlIHByZWNpbyB0b3RhbCwgZGVzcHVlcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL0NhcmdhciBwcm9kdWN0byBcclxuICAgICAgICAgICAgb00zUHJkR2VuZXJhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvID0gb00zUHJkR2VuZXJhbC5TS1U7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Mb3RlID0gb00zUHJkR2VuZXJhbC5MT1RFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvZW5jYWJlemFkb0l0ZW1zLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Ob21icmUgPSBvTTNQcmRHZW5lcmFsLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFID0gb00zUHJkR2VuZXJhbC5ESVNQT05JQkxFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuUGF0aEltYWdlID0gb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW47XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Db2RpZ29CYXJyYXMgPSBvTTNQSXRlbXNXRUIuQ29kaWdvQmFycmFzO1xyXG4gICAgICAgICAgICBsZXQgcFRvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXRlUHJlY2lvQmFzZShvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCB0aGlzLm9NYXRoVEYucm91bmQoYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKSwgMikpO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLmRDYW50aWRhZCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSBwVG90YWxCYXNlIC8gb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRUb3RhbEltcHVlc3Rvc1RvdGFsID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCBvTTNQRW5jSXRlbXMsIHBUb3RhbEJhc2UsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpO1xyXG5cclxuICAgICAgICAgICAgLyoqIElOSUNJTyBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpLCBcIkZFQ0hBSU5cIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc09ic2VxdWlvLnRvU3RyaW5nKCksIFwiRVNPQlNFUVVJT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5TS1AxLCBcIlBSRF9FU1RJTE9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIFwiQ1RCTERJTVBQUkRcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5vYnNlcnZhY2lvbi50b1N0cmluZygpLCBcIk9CU0VSVkFDSU9OXCIpKTsgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuLCBcIlBBVEhJTUFHRU5cIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc1Byb2R1Y3RvUHJvbW8udG9TdHJpbmcoKSwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShwcm9kR1JQU2VsZWN0ZWQuVElQTywgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlVuaWRhZCwgXCJVTklEQURcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFNSViwgXCJDTEFWRVBST0RTRVJWXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQsIFwiQ0xBVkVVTklEQURcIikpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEl0ZW1zSW50ZXJmYXoob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgdGhpcy5BZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICB0aGlzLmNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQilcclxuICAgICAgICAgICAgdGhpcy5Mb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vIExpc3RhIGRlIFByb21vY2lvbmVzIFxyXG4gICAgICAgICAgICAvKipGSU4gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG5cclxuICAgICAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkUFJFQ0lPVW5pdEJhc2UudG9TdHJpbmcoKSwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVG90YWxJbXB1ZXN0b3NUb3RhbC50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgodGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVFU1RPU1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gK2RUb3RhbEltcHVlc3Rvc1VuaXRhcmlvKS50b1N0cmluZygpLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3MgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtkUFJFQ0lPVW5pdEJhc2UgKyBkVW5pdGFyaW9Qcm9tbykudG9TdHJpbmcoKSwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zIC8vLS0tLS0tIE51bmNhIENhbWJpYSAvL0ZTIDIwMTkwNzI1IENvcnJlY2Npb24gZW4gbGEgZm9tcmEgZGUgY2FsY3VsYXJsb1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTy50b1N0cmluZygpLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLnRvU3RyaW5nKCksIFwiUFVOSVRORVRPXCIpKTsvL0NvbiBkZXNjdWVudG8gaW5jbHVpZG8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvTW9uZWRlcm8udG9TdHJpbmcoKSwgXCJVTklURklERUxcIikpOy8vVW5pdGFyaW8gZmlkZWxpemFjaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVW5pdGFyaW9Qcm9tby50b1N0cmluZygpLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuXHJcbiAgICAgICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgICAgICAvLyAqKiogSW5mb3JtYWNpb24gZGUgYWNjaW9uZXMgZW4gZWwgY2xpZW50ZSAqKipcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5lbmNvbnRyYWRvTG9jYWwpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJMT0NBTFwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJTRVJWSURPUlwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL2lmICghb1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAoK29NM1Byb2Nlc29zLlZhbG9yKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yKSAvLyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAoK29NM1Byb2Nlc29zLlZhbG9yTmV0bykgKyAoK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgLy9WZXJpZmljYXIgb2JzZXF1aW9zIGRlbCBwcm9kdWN0byBxdWUgc2UgaW5ncmVzbyBhbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJPYnNlcXVpb3Mob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy50dXJuT25Qcm9tb3Mob1Byb21vY2lvblByb2Nlc2FkYSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXSA9IFwiUHJvZHVjdG8gUmVzdHJpbmdpZG9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRW5jSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHRydWUgc2kgZXN0ZSBwcm9kdWN0byBzZSBlbmN1ZW50cmEgcmVzdHJpbmdpZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhclByb2R1Y3RvUmVzdHJpbmdpZG8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9tb1Jlc3RyaW5naWRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9SZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBtw6F4aW1vIHZhbG9yIGRlIHVuIGF0cmlidXRvIGRlbnRybyBkZSBsYSBsaXN0YSBjdWFscXVpZXJhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEobGlzdGEsIGF0cmlidXRvKSB7XHJcbiAgICAgICAgaWYgKGxpc3RhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGxpc3RJRCA9IGxpc3RhLm1hcCh4ID0+IHhbYXRyaWJ1dG9dKTtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIGxpc3RJRCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZXMgQ2FsY3VsYWRvcyBwb3IgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gZENhbnRpZGFkIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgLyoqIElOSUNJTyBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG4gICAgICAgIC8vIHZhciBkVG90YWxJbXB1ZXN0b3MgPSAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbFNpbkR0byA9IHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUXCIpXHJcbiAgICAgICAgLy8gdmFyIGRTdWJUb3RhbCA9IE1hdGgucm91bmQoKCtkUHJlY2lvVG90YWxTaW5EdG8gLSArZFRvdGFsSW1wdWVzdG9zKSAqIDEwMCkgLyAxMDA7XHJcblxyXG4gICAgICAgIGxldCBzdWJUb3RhbCA9IDA7XHJcbiAgICAgICAgbGV0IHByZWNpb1RvdGFsU2luRHRvID0gMDtcclxuICAgICAgICBsZXQgdG90YWxJbXB1ZXN0b3NcclxuICAgICAgICAvL0FncmVnYXIgSW1wdWVzdG9zXHJcbiAgICAgICAgdG90YWxJbXB1ZXN0b3MgPSB0aGlzLmFncmVnYXJJbXB1ZXN0byhvTTNQRW5jSXRlbXMsIGRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgIC8vRlMgMjAxOTA3MjUgQXJyZWdsbyBlbiBlbCBjYWxjdWxvIGRlIHRvdGFsZXMgZW4gY2FzbyBkZSBoYWJlciBpbXB1ZXN0b3NcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vU3VidG90YWwgU3VtYXMgZGUgbGFzIGJhc2VzXHJcbiAgICAgICAgICAgIHN1YlRvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpICsgKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJWVU5JVFBST01PXCIpKSksIDIpO1xyXG4gICAgICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEZyb21JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zLCBcIlZhbG9yXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbFNpbkR0byA9IHN1YlRvdGFsICsgdG90YWxJbXB1ZXN0b3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL1NlIGFzdW1lIHF1ZSBubyBoYXkgaW1wdWVzdG9zIGVudG9uY2VzIGVsIHN1YlRvdGFsIGVzIGlndWFsIGFsIHByZWNpb1RvdGFsU2luRHRvXHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUXCIpLCAyKTtcclxuICAgICAgICAgICAgc3ViVG90YWwgPSBwcmVjaW9Ub3RhbFNpbkR0bztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQodG90YWxJbXB1ZXN0b3MsIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIik7XHJcblxyXG4gICAgICAgIC8vTGEgZmlkZWxpemFjaW9uIGVzIHVuIHBvcmNhbnRhamUgcG9yIGVuZGUgbm8gZGViZSBtdWx0aXBsaWNhcnNlIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlVOSVRGSURFTFwiKS50b1N0cmluZygpLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVU5JVEZJREVMXCIpLlZhbG9yLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIik7XHJcbiAgICAgICAgLy90aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFJFQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgcHJlY2lvVG90YWxTaW5EdG8udG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBzdWJUb3RhbC50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgXCJGVVRcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVlVOSVRQUk9NT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxCQVNFXCIpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zICAgICAgICBcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKChzdWJUb3RhbCArICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgLSArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuXHJcbiAgICAgICAgLyoqIEZJTiBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBzdW1hdG9yaWEgZGUgbG9zIHZhbG9yZXMgZGUgdW4gYXRyaWJ1dG8gZGFkbyBkZWwgYXJyZWdsbyBkZSBpbXB1ZXN0b3NcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gYXRyaWJ1dG8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBhdHJpYnV0bzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc3VtYXRvcmlhID0gMDtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wdWVzdG8gPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zW19pXTtcclxuICAgICAgICAgICAgc3VtYXRvcmlhID0gc3VtYXRvcmlhICsgKCtpbXB1ZXN0b1thdHJpYnV0b10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VtYXRvcmlhO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGV0X2N0YmxkX2ltcF9wcmQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1RCTERJTVBQUkRcIik7XHJcbiAgICAgICAgbGV0IGRldF9wcmVjaW9fdW5pdF9iYXNlID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpO1xyXG4gICAgICAgIGxldCB2YWxvclRvdGFsSW1wdWVzdG9zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGlmIChkZXRfY3RibGRfaW1wX3ByZCAmJiBkZXRfcHJlY2lvX3VuaXRfYmFzZSkge1xyXG4gICAgICAgICAgICB2YWxvclRvdGFsSW1wdWVzdG9zID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChkZXRfY3RibGRfaW1wX3ByZC5WYWxvciwgb00zUEVuY0l0ZW1zLCArYmlnRGVjaW1hbC5tdWx0aXBseShkZXRfcHJlY2lvX3VuaXRfYmFzZS5WYWxvciwgY2FudGlkYWQpLCBjYW50aWRhZCwgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsb3JUb3RhbEltcHVlc3RvcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3I6IHN0cmluZywgc0NvbmNlcHRvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RldDogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIG9EZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IHNDb25jZXB0byk7XHJcbiAgICAgICAgaWYgKG9EZXQpIHtcclxuICAgICAgICAgICAgLy8gRXhpc3RlIEFjdHVhbGl6YVxyXG4gICAgICAgICAgICBvRGV0LlZhbG9yID0gdmFsb3I7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9ObyBleGlzdGUgYWdyZWdhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IudG9TdHJpbmcoKSwgc0NvbmNlcHRvKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciB0b3RhbFxyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIE51ZXZhIENhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBEZXNjVW5pdGFyaW8gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0VG90YWxCeVVuaXRhcmlvKGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIERlc2NVbml0YXJpbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHVuaXRhcmlvID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBEZXNjVW5pdGFyaW8pLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK2JpZ0RlY2ltYWwubXVsdGlwbHkodW5pdGFyaW8sIGNhbnRpZGFkKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciB1bml0YXJpb1xyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBEZXNjVG90YWwgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0VW5pdGFyaW9CeVRvdGFsKGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIERlc2NUb3RhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCtjYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdG90YWwgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NUb3RhbCkuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArdG90YWwgLyArY2FudGlkYWQ7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlcyByZWxhY2lvbmFkb3MgY29uIGxhIGluZm9ybWFjaW9uIGRlIHN3IGV4dGVybm8uXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw6EgbG9zIG51ZXZvcyBhdHJpYnV0b3MuXHJcbiAgICAgKiBAcGFyYW0gb0FkaWNpb25hbGVzIERlc2RlIGRvbmRlIHNlIHNhY2Fyw6EgbGEgaW5mb3JtYWNpw7NuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSXRlbXNJbnRlcmZheihvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvQWRpY2lvbmFsZXM6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9BZGljaW9uYWxlc0ZpbHRlcjogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz47XHJcbiAgICAgICAgICAgIG9BZGljaW9uYWxlc0ZpbHRlciA9IG9BZGljaW9uYWxlcy5maWx0ZXIoYSA9PiBhLkFUUklCVVRPLnN0YXJ0c1dpdGgoXCJDU0lBX1wiKSk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0FkaWNpb25hbGVzRmlsdGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9BZGljaW9uYWxlc0ZpbHRlcltpXS5WQUxPUiwgb0FkaWNpb25hbGVzRmlsdGVyW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgZ3VhcmRhcsOhIGxvcyBudWV2b3MgYXRyaWJ1dG9zLlxyXG4gICAgICogQHBhcmFtIG9BZGljaW9uYWxlcyBEZXNkZSBkb25kZSBzZSBzYWNhcsOhIGxhIGluZm9ybWFjacOzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvQWRpY2lvbmFsZXM6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzW2ldLlZBTE9SLCBcIkFEQ19cIiArIG9BZGljaW9uYWxlc1tpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLlZBTE9SLCBcIkNBTUFEQ19cIiArIG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlc1tpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgTm9tYnJlLCBJRC4gYSBkZXRhbGxlIGRlbCBlbmNhYmV6YWRvIGRlIHByb2R1Y3RvIGFncmVnYWRvXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBJbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkOiBudW1iZXIsIGFwbGljYWRhcyA9IHRydWUpIHtcclxuICAgICAgICB2YXIgc05vbWJyZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIHNJZHM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIHNWYWxvcmVzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGFwbGljYWRhcykge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4geC5BcGxpY2FkYSkuZmlsdGVyKHggPT4geC5Qcm9tb2Npb25Db21iaW5hZGEgPT0gbnVsbCkuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc05vbWJyZXMgPSBzTm9tYnJlcyArIHByb21vLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNJZHMgPSBzSWRzICsgcHJvbW8uSURQcm9tb2Npb24gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JlcyA9IHNWYWxvcmVzICsgYmlnRGVjaW1hbC5tdWx0aXBseShwcm9tby5WYWxvciwgaUNhbnRpZGFkKSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiAheC5BcGxpY2FkYSkuZmlsdGVyKHggPT4geC5Qcm9tb2Npb25Db21iaW5hZGEgPT0gbnVsbCkuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc05vbWJyZXMgPSBzTm9tYnJlcyArIHByb21vLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNJZHMgPSBzSWRzICsgcHJvbW8uSURQcm9tb2Npb24gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JlcyA9IHNWYWxvcmVzICsgYmlnRGVjaW1hbC5tdWx0aXBseShwcm9tby5WYWxvciwgaUNhbnRpZGFkKSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YSA9IHsgXCJOT01CUkVTXCI6IHNOb21icmVzLCBcIklEXCI6IHNJZHMsIFwiVkFMT1JFU1wiOiBzVmFsb3JlcyB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGUgZGUgcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gc05vbWJyZXMgXHJcbiAgICAgKiBAcGFyYW0gc0lkcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkKVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5OT01CUkVTLCBcIk5PTUJfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLklELCBcIklEX1BST01PQ1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5WQUxPUkVTLCBcIlZBTF9QUk9NT0NcIikpO1xyXG5cclxuICAgICAgICAgICAgLy9BaG9yYSBzZSBhZ3JlZ2EgdW5hIGRpbmFtaWNhIHBvciBhdHJpYnV0byBkZSBsYSBwcm9tbyBwYXJhIGZhY2lsaXRhciBsYSByZXRvbWEgZGUgZXN0YSBpbmZvcm1hY2nDs25cclxuICAgICAgICAgICAgbGV0IGxpc3ROb21icmUgPSBkYXRhLk5PTUJSRVMucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0SWQgPSBkYXRhLklELnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGlzdFZhbG9yID0gZGF0YS5WQUxPUkVTLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RJZC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdE5vbWJyZVtfaV0sIFwiTk9NQl9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0SWRbX2ldLCBcIklEX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3RWYWxvcltfaV0sIFwiVkFMX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZCwgZmFsc2UpXHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLk5PTUJSRVMsIFwiTk9NQl9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuSUQsIFwiSURfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLlZBTE9SRVMsIFwiVkFMX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhcmdhciBhIGRldGFsbGUgaW5mb3JtYWNpb24gZGUgbml2ZWxlcyBkZSBwcmVjaW9cclxuICAgICAqIEBwYXJhbSBpbmZOaXZlbGVzUHJjaW8gSW5mb3JtYWNpb24gZGUgbml2ZWxlcyBkZSBwcmVjaW9cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGNhcmdhcsOhIGxhIGluZm9ybWFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBMb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKGluZk5pdmVsZXNQcmNpbyAmJiBpbmZOaXZlbGVzUHJjaW8uTklWRUwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGluZk5pdmVsZXNQcmNpby5OSVZFTCwgXCJOSVZFTFBSRUNJT1wiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGNvbiBxdWUgbml2ZWwgZGUgcHJlY2lvIHZhIGEgdHJhYmFqYXJcclxuICAgICAqIEBwYXJhbSBwcm9kR1JQU2VsZWN0ZWQgRWwgcHJvZHVjdG8gaW5ncmVzYWRvXHJcbiAgICAgKiBAcGFyYW0gaUNhbnRpZGFkIExhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgdmEgYSBpbmdyZXNhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcmVzZW50YWNpb25lczogTTNQcmVzZW50YWNpb25lcztcclxuICAgICAgICAgICAgdmFyIGpSZXNwTml2ZWxlcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAocHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzICYmXHJcbiAgICAgICAgICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZpbmQoeCA9PiBpQ2FudGlkYWQgPj0geC5UT1BFKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcmVzZW50YWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb00zUHJlc2VudGFjaW9uZXMuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3BOaXZlbGVzID0geyBcIlBSRUNJT1wiOiBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiwgXCJOSVZFTFwiOiBvTTNQcmVzZW50YWNpb25lcy5OSVZFTFBSUyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqUmVzcE5pdmVsZXM7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzR2VuZXJhbChvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWwsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1ByZXNlbnRhY2lvbmVzOiBNM1ByZXNlbnRhY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgalJlc3BOaXZlbGVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzICYmIG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzID0gb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5maW5kKHggPT4gaUNhbnRpZGFkID49IHguVE9QRSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJlc2VudGFjaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTTNQcmVzZW50YWNpb25lcy5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcE5pdmVsZXMgPSB7IFwiUFJFQ0lPXCI6IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SLCBcIk5JVkVMXCI6IG9NM1ByZXNlbnRhY2lvbmVzLk5JVkVMUFJTIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGpSZXNwTml2ZWxlcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsb3MgY3Vwb25lcyBnZW5lcmFkb3MgZGUgbGEgbGlzdGEgZGUgcHJvbW9wcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2N1cG9uZXNfZnJvbV9wcm9tbyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIpOiBBcnJheTxNM1BEZXRhbGxlQ3Vwb24+IHtcclxuICAgICAgICB2YXIgbGlzdF9jdXBvbmVzID0gQXJyYXk8TTNQRGV0YWxsZUN1cG9uPigpO1xyXG5cclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vX2Fzb2NpYWRhID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXNbX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb19hc29jaWFkYS5JZEN1cG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cG9uID0gbmV3IE0zUERldGFsbGVDdXBvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cG9uLklkQ3Vwb24gPSBwcm9tb19hc29jaWFkYS5JZEN1cG9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cG9uLkNhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdF9jdXBvbmVzLnB1c2goY3Vwb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jdXBvbmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQXNpZ25hciBhIHByb21vY2lvbmVzIGNvbWJpYW5hcyBkZXNkZSBsbyBxdWUgc2UgZW5jb250csOzIGFsIGVuY2FiZXphZG8gaXRlbSwgZGVsIHByb2R1Y3RvIHNlbGVjY2lvbmFkb1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICE9IG51bGwgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vQXNvID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgYWdyZWdhIHByb21vY2lvbiBjb21iaW5hZGEgYSBlbmNhYmV6YWRvIGRlIGl0ZW1zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMucHVzaChwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vL0FncmVnYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIilcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKEpTT04uc3RyaW5naWZ5KG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMpLCBcIlBST01PQ09NQklcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zLCBwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc2lnbmFyIHByb21vY2lvbmVzIGNvbWJpYW5kYXMgYSBNMyBQcm9jZXNvLCBlc3RlLCB2YWxpZGEgcXVlIG5vIGV4aXN0YSB1biBwcm9tb2Npb24gYW50ZXJpb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzQU0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAgICAgaWYgKCFvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKSkge1xyXG4gICAgICAgICAgICAvLy8vLy8vIGV4aXN0ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vLy8vLyBObyBFeGlzdGVcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcy5wdXNoKG9Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcykge1xyXG4gICAgICAgICAgICB0aGlzLkFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bG8gZGUgcHJvbW9jaW9uZXNcclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICB2YXIgbFRpcG9zID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkRJUkVDVEFcIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJNT05FREVST1wiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1BTlVBTFwiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG9NM0VOQ1BST01PICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQik7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW8gPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvcyk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vY2lvbihhcnJQcm9tbywgcHJvZEdSUFNlbGVjdGVkLCBvTTNFTkNQUk9NTyk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGhheSBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgeSBhZ3JlZ2FybG9zLlxyXG4gICAgcHVibGljIFZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcihwcm9tbyA9PiBwcm9tby5MaXN0T2JzU0tVICE9IG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb21vLkxpc3RPYnNTS1UubGVuZ3RoKSBwcm9tby5MaXN0T2JzU0tVID0gW3Byb21vLkxpc3RPYnNTS1VdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tbywgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gcHJvbW8uSURQcm9tb2Npb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vLCBvTTNQRW5jSXRlbXMsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLmxJZEFjdGl2YVByb21vICYmIHByb21vLmxJZEFjdGl2YVByb21vLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAmJiBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubElkQWN0aXZhUHJvbW8gPSB0aGlzLmxJZEFjdGl2YVByb21vLmNvbmNhdChwcm9tby5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEdXBsaWNhdGVzKHRoaXMubElkQWN0aXZhUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVEdXBsaWNhdGVzKGFycjogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciB1bmlxdWUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pcXVlLmluZGV4T2YoYXJyW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHVuaXF1ZS5wdXNoKGFycltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc1NLVShwcm9tbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgY2FudGlkYWRSZWFsID0gTWF0aC5mbG9vcihjYW50aWRhZCAvIHByb21vLkNhbnRpZGFkT2JzZXEpO1xyXG4gICAgICAgIGlmIChwcm9tby5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSBjYW50aWRhZFJlYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHByb21vLkxpc3RPYnNTS1UuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZFJlYWwgKiArZWxlbWVudC5DYW50aWRhZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gcHJvbW8uTGlzdE9ic1NLVTtcclxuICAgIH1cclxuXHJcbiAgICBhc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChwcm9tby5MaXN0T2JzU0tVLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGNvbWJpLkFjY2lvbi5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8ob2JzZXF1aW9zLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9ic2VxdWlvcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvcm5hIHRydWUgc2kgaGF5IG90cmEgcHJvbW8gYXBsaWNhZGEgZG9uZGUgbmkgbGEgcHJvbW8gZGUgb2JzZXF1aW8gbyBsYSBhcGxpY2FkYSBzb24gZmlqYXMgeSB1bmEgZGUgbGFzIGRvcyBlcyBFWENcclxuICAgIHZhbGlkYVNpVGllbmVPdHJhUHJvbW8ocHJvbW9PYnNlcXVpbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAocHJvbW9PYnNlcXVpby5SZWdsYSAhPSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgIGxldCBvUHJvbW9zTm9PYnNlcXVpb3MgPSBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LklEUHJvbW9jaW9uICE9IHByb21vT2JzZXF1aW8uSURQcm9tb2Npb24pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9Qcm9tb3NOb09ic2VxdWlvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uQXBsaWNhZGEgJiYgKHByb21vLlJlZ2xhID09IFwiRVhDXCIgfHwgcHJvbW9PYnNlcXVpby5SZWdsYSA9PSBcIkVYQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9wcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvc1xyXG4gICAgcHVibGljIGFzeW5jIFByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9IC0xO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3MgIT0gbnVsbCAmJiB0aGlzLm9MaXN0YU9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLlNLVSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA4MTAgdmFsaWRhLCBjdWFudG9zIHByb2R1Y3RvcyBzZSBhZ3JlZ2EgZW4gZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5DYW50aWRhZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTExMiBzZSBhZ3JlZyBmdW5jaW9uYWxpZGFkIGRlIG9ic2VxdWlvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLmlkRW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbiA9IFwiT0JTUVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkd1YXJkYXJQcm9tb2Npb24odGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9HdWFyZGFyIHByb21vY2lvbiBzZWd1biB1biBza3VcclxuICAgIC8vMS4gQnVzY2FyIGVsIHByb2R1Y3RvIHNlZ3VuIGVsIHNrdVxyXG4gICAgLy8yLiBBZ3JlZ2FyIGVsIHByb2R1Y3RvIGEgbTNwcm9jZXNvc1xyXG4gICAgLy8zLiBBZ3JlZ2FyIGFsIGNhcnJpdG8gZGUgY29tcHJhcy5cclxuICAgIHB1YmxpYyBhc3luYyBHdWFyZGFyUHJvbW9jaW9uKHByb21vLCBvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vIDIwMTgxMTIxICB2YXIgc0tleUNhcnJpdG87XHJcbiAgICAgICAgLy8gMjAxODExMjEgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBwcm9jZXNvUHJvbW87XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvLyAyMDE4MTEyMSBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG5cclxuICAgICAgICAvLyAyMDE4MTEyMSBvTTNQcm9jZXNvcyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHByb2Nlc29Qcm9tbyA9IGF3YWl0IHRoaXMuQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb0RhdGFVc2VyKTtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gcG91Y2ggREJcclxuICAgICAgICAvLyAyMDE4MTEyMSAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgcHJvY2Vzb1Byb21vKTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgbG9zIHByb2R1Y3RvIHNlZ3VuIHN1IFNLVSwgc2FjYW5kbyBsYSBpbmZvcm1hY2lvbiBkZXNkZSBwb3VjaERCLlxyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hclByb21vY2lvbkFQcm9jZXNvKHByb21vLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IHRoaXMuR2V0UHJvZHVjdG9CeVNLVShwcm9tby5TS1UsIEVuTGluZWEsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcob1Byb2R1Y3RvKTtcclxuICAgICAgICBpZiAob1Byb2R1Y3RvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy9ZYSBubyBzZSBkZWphIHByZWNpbyBjZXJvIHNpbm8gcXVlIGNvbW8gZXMgb2JzZXF1aW8gc2ltdWxhIHVuIGRlc2N1ZW50byBkZWwgMTAwJSBcclxuICAgICAgICAgICAgLy9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgICAgICAgICAgLy9BZ3JlZ2FyIGEgbTNwcm9jZXNvcyBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgLy9vTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBvUHJvZHVjdG8sIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5hZGR0b2NhcnQob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8sIG51bGwsIG51bGwsIG9EYXRhVXNlciwgdGhpcy5nc0lka2F0aW9zLCBvTTNVYmljYWNpb24sIG51bGwsIG9NM1Byb2Nlc29zLCBudWxsLCAxMDApOy8vKlNlIG1hbmRhIHZhbG9yIGRlIGRlc2N1ZW5udG8gMTAwICVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBzZWd1biBlbCBTS1VcclxuICAgIHB1YmxpYyBhc3luYyBHZXRQcm9kdWN0b0J5U0tVKHNTS1UsIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSwgZGlzcG9uaWJsZU0zRW5jID0gbnVsbCkge1xyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RvcztcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHRoaXMuZ3NJZGthdGlvcyk7XHJcblxyXG4gICAgICAgIC8vb1NlcnZpY2VMaXN0YVByZWNpby5HZW5lcmF0ZURhdGFWYWxpZGFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28pO1xyXG4gICAgICAgIGlmICghRW5MaW5lYSAmJiAhb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSB7XHJcbiAgICAgICAgICAgIHZhciBzSURQcm9kdWN0b3MgPSB0aGlzLmdzSWRrYXRpb3MgKyBcIj9QUkRcIjtcclxuICAgICAgICAgICAgcHJvZHVjdG9zID0gYXdhaXQgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRFByb2R1Y3Rvcyk7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0byA9IG9TZXJ2aWNlTTNNYWVzdHJvLkdldE0zUHJkR3JwRnJvbUxpc3QocHJvZHVjdG9zLk0zTGlzdFByb2R1Y3Rvcy5NM0dSUCwgc1NLVSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmModGhpcy5Hb1Bvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZGthdGlvcywgc1NLVSwgb0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDw9IDAgJiYgZGlzcG9uaWJsZU0zRW5jKSB7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFID0gZGlzcG9uaWJsZU0zRW5jO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCB0aGlzLkdvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLlZhbGlkYXJMaXN0YVByZWNpb3Mob1Byb2R1Y3RvLCB0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsYXIgcHJlY2lvIHNpbiBpbXB1ZXN0b3MuIExhIGZvcm1hIGVzIGNhbGN1bGFyIHRvZG8gZWwgdmFsb3IgZGVsIGltcHVlc3RvLiBFSjogMTIwLjA5IC8gMS4xNi4gU2kgZWwgdmFsb3IgZGVsIGltcHVlc3RvIGVzOiAxNiVcclxuICAgIHB1YmxpYyBDYWxjdWxhdGVQcmVjaW9CYXNlKENUQkxESU1QUFJEOiBzdHJpbmcsIGRWYWxvck5ldG86IG51bWJlcikge1xyXG4gICAgICAgIC8vdmFyIGRWYWxvckltcHVlc3RvOiBudW1iZXIgPSAxO1xyXG4gICAgICAgIHZhciBkVmFsb3JCYXNlOiBudW1iZXIgPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIGpJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAgMjAxOTA2MjYgQ2FtYmlvIGRlIGNhbGN1bG8gZGUgYmFzZSBkZSBsb3MgaW1wdWVzdG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkVmFsb3JCYXNlID0gKCtkVmFsb3JCYXNlKSAvICgxICsgK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC0gKCtpbXAuJC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhvTTNQRW5jSXRlbXMuTTNJbXB1ZXN0b3MpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhdGNoXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3JldHVybiAoKCtkVmFsb3JOZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgICAgICByZXR1cm4gZFZhbG9yQmFzZTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBpbmZvcm1hY2nDs24gZGUgaW1wdWVzdG9zLCBkZXNkZSBlbCBwcm9kdWN0byBnZW5lcmFsXHJcbiAgICBwdWJsaWMgTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwoQ1RCTERJTVBQUkQ6IHN0cmluZywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyxcclxuICAgICAgICBkVmFsb3JOZXRvOiBudW1iZXIsIGNhbnRpZGFkOiBudW1iZXIsIHZhbG9yVG90YWxQcm9kdWN0b1VuaXQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIG9NM1BJbXB1ZXN0b3M6IE0zUEltcHVlc3RvcztcclxuICAgICAgICAgICAgbGV0IHZhbG9yQmFzZVRvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKGRWYWxvck5ldG8sIDIpO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JOZXRvVG90YWwgPSB2YWxvckJhc2VUb3RhbDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JUb3RhbFByb2R1Y3RvVW5pdCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgdmFyIGRUb3RhbEltcHVlc3RvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBpZiAoQ1RCTERJTVBQUkQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3RvcyA9IG94bWxUb0pzb25URi5jb252ZXJ0WG1sVG9Kc29uKENUQkxESU1QUFJEKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA2MjYgQ2FtYmlvIGVuIG9yZGVuIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JSZWFsSW1wID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wID0gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE9baV07XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3RvcyA9IG5ldyBNM1BJbXB1ZXN0b3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvID0gaW1wLiQuQ29kSW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuUG9yY2VudGFqZSA9IGltcC4kLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikgey8vUE9SQ0VOVEFKRVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvclJlYWxJbXAgPSArYmlnRGVjaW1hbC5tdWx0aXBseShpbXAuJC5WYWxvciwgdmFsb3JOZXRvVG90YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlZhbG9yID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yUmVhbEltcCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvTTNQSW1wdWVzdG9zLlZhbG9yIDwgdmFsb3JSZWFsSW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5jZWlsKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5mbG9vcigrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Ugey8vRklKT1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvclJlYWxJbXAgPSAraW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxODA5MTIgTnVldm8gY29uY2VwdG8gZGUgYmFzZVxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQmFzZSA9IHZhbG9yTmV0b1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gKCtkVG90YWxJbXB1ZXN0bykgKyAoK29NM1BJbXB1ZXN0b3MuVmFsb3IpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxODA5MTIgU3VtYSBkZSBWYWxvciBOZXRvXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsb3JOZXRvVG90YWwgPSAoK3ZhbG9yTmV0b1RvdGFsKSArICgrb00zUEltcHVlc3Rvcy5WYWxvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vL1NvbG8gYWRpY2lvbmUgYSBpbXB1ZXN0b3MsIGN1YW5kbyBlcyB0b3RhbCBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wRXhpc3RlOiBNM1BJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wRXhpc3RlID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5maW5kKGltcCA9PiBpbXAuQ29kSW1wdWVzdG8gPT0gb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcEV4aXN0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0JvcnJhIGVuIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3RvcyA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZmlsdGVyKGltcCA9PiBpbXAuQ29kSW1wdWVzdG8gIT0gb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MucHVzaChvTTNQSW1wdWVzdG9zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmZvckVhY2goaW1wID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzI2IHNlIGFncmVnYSB2YWxpZGFjaW9uLCB5YSBxdWUgZXN0YWJhIHF1ZWRhbmRvIGxhIHJlc3RhLCBjb24gdmFsb3JlcyBjb21vOiAwLjAwMDAwMDAwMDAxID0gMS4xNTY0NTY0NTY0ZTg0NSBFSlxyXG4gICAgICAgICAgICBpZiAoZFRvdGFsSW1wdWVzdG8gIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9EaWZlcmVuY2lhIHJlZG9uZGVhZGEgYSBkb3MgZGVjaW1hbGVzXHJcbiAgICAgICAgICAgICAgICBkVG90YWxJbXB1ZXN0byA9IHRoaXMub01hdGhURi5yb3VuZChkVG90YWxJbXB1ZXN0bywgMik7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZCgodmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSB2YWxvckJhc2VUb3RhbCAtIGRUb3RhbEltcHVlc3RvKSwgMik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JEZUltcHVlc3RvcyhvTTNQRW5jSXRlbXMsIGRpZmVyZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFwiVE9UQUxJTVBVRVNUT1NcIlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub01hdGhURi5yb3VuZCgodmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSB2YWxvckJhc2VUb3RhbCksIDIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRlMgMjAxOTA3MjVcclxuICAgICAqIENvcnJpZ2UgZWwgdmFsb3IgcXVlIHRvbW8gZWwgaW1wdWVzdG8gZGVzcHVlcyBkZSBoYWJlcnNlIHJlZG9uZGVhZG9cclxuICAgICAqIFNpIGFsIHJlY29ycmVyIHRvZG9zIGxvcyBpbXB1ZXN0b3MgbGEgZGlmZXJlbmNpYSBubyBzZSB6YW5qYSwgTkkgTU9ET1MgZWwgZXJyb3IgZXN0w6EgZW4gb3RyYSBwYXJ0ZVxyXG4gICAgICogU2UgY3JlYSBlc3RhIGZ1bmNpw7NuIHBhcmEgcmVzb2x2ZXIgbG9zIGVycm9yZXMgZGUgdGltYnJhZG8gZGUgZmFjdHVyYSBlbGVjdHLDs25pY2FcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBEaWZlcmVuY2lhIHF1ZSBzZSBkZWJlIHNhbGRhciBwYXJhIGNvbnNlZ3VpciBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgcmVxdWVyaWRvXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRpZmVyZW5jaWE6IG51bWJlcikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG5cclxuICAgICAgICAgICAgLy9TaSBsYSBkaWZlcmVuY2lhIGVzIHBvc2l0aXZhIHF1aWVyZSBkZWNpciBxdWUgbGEgc3VtYSBkZSBsb3MgaW1wdWVzdG9zIGVzIG1lbm9yIGEgbGEgcmVhbFxyXG4gICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vU2kgZWwgaW1wdWVzdG8gc2UgcmVkb25kZW8gaGFjaWEgYWJham8gcXVpZXJlIGRlY2lyIHF1ZSBzZSBwdWRvIHJlZG9uZGVhciBoYWNpYSBhcnJpYmFcclxuICAgICAgICAgICAgICAgIC8vRW50b25jZXMgbG8gXCJyZWRvbmRlYSBoYWNpYSBhcnJpYmFcIiB5IHJlc3RhIHVuYSBjZW50ZXNpbWEgYSBsYSBkaWZlcmVuY2lhXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1wdWVzdG8uVmFsb3IgPCBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uVmFsb3IgPSBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQoaW1wdWVzdG8uVmFsb3IgLyBpbXB1ZXN0by5Qb3JjZW50YWplLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gZGlmZXJlbmNpYSAtIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1NpIFZhbG9yPlZhbG9yUmVhbCBxdWllcmUgZGVjaXIgcXVlIHJlZG9uZGVvIGhhY2lhIGFycmliYSB5IG5vIGRlYmUgbW9kaWZpY2FyIGVzZSB2YWxvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vU2kgbGEgZGlmZXJlbmNpYSBlcyBuZWdhdGl2YSBxdWllcmUgZGVjaXIgcXVlIGxhIHN1bWEgZGUgbG9zIGltcHVlc3RvcyBlcyBtYXlvciBhIGxhIHJlYWxcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL1NpIGVsIGltcHVlc3RvIHNlIHJlZG9uZGVvIGhhY2lhIGFycmliYSBxdWllcmUgZGVjaXIgcXVlIHNlIHB1ZG8gcmVkb25kZWFyIGhhY2lhIGFiYWpvXHJcbiAgICAgICAgICAgICAgICAvL0VudG9uY2VzIGxvIFwicmVkb25kZWEgaGFjaWEgYWJham9cIiB5IHN1bWEgdW5hIGNlbnRlc2ltYSBhIGxhIGRpZmVyZW5jaWFcclxuICAgICAgICAgICAgICAgIGlmIChpbXB1ZXN0by5WYWxvciA+IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5WYWxvciA9IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG87XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZChpbXB1ZXN0by5WYWxvciAvIGltcHVlc3RvLlBvcmNlbnRhamUsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSBkaWZlcmVuY2lhICsgMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vU2kgVmFsb3I8VmFsb3JSZWFsIHF1aWVyZSBkZWNpciBxdWUgcmVkb25kZW8gaGFjaWEgYWJham8geSBubyBkZWJlIG1vZGlmaWNhciBlc2UgdmFsb3JcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSB5YSBzZSBzYWxkbyBsYSBkaWZlcmVuY2lhIHJvbXBlIGVsIGNpY2xvIGRhbmRvIHBvciBjb25jbHVpZG8gZWwgYWp1c3RlXHJcbiAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID09IDApIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vTG9hZCBwb3IgdW5pZGFkIGRldGFsbGUgZGVsIG0zcHJvY2VzbyBpdGVtcy5cclxuICAgIHB1YmxpYyBMb2FkTTNQRGV0YWxsZShzVmFsb3I6IHN0cmluZywgc0NvbmNlcHRvOiBzdHJpbmcpOiBNM1BEZXRhbGxlSXRlbXMge1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBzQ29uY2VwdG87XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IHNWYWxvcjtcclxuICAgICAgICByZXR1cm4gb00zUERldGFsbGVJdGVtcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9HZW5lcmFyIHByb21vY2lvbiBjb21iaW5hZGFcclxuICAgIHB1YmxpYyBhc3luYyBHZW5lcmFyUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgaWYgKCFvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzIHx8IChvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzICYmICFvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIlBVRU5URV9ESUFSSU9cIikpKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG51bGwpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJDb21iaW5hZGEob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQ29tcGFyZSBNM1Byb2Nlc29zLiAoRmlyc3Q6IEBQYXJhbTogaWxNM1Byb2Nlc29zU1FMIFZTIFNlY29uZDogR2V0IEZyb20gQ291Y2hEQi9Qb3VjaERCKVxyXG4gICAgcHVibGljIGFzeW5jIENvbXBhcmVNM1Byb2Nlc28oc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIGlsTTNQcm9jZXNvc1NRTDogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvUmVzcDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL0dldCBkYXRhLCBmcm9tIFBvdWNoREIvQ291Y2hEQlxyXG4gICAgICAgICAgICB2YXIgUHJvcGVydHlDb21wYXJlID0gW1wiVmFsb3JOZXRvXCIsIFwiVmFsb3JcIl07XHJcbiAgICAgICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3NDT1VDSDogTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgLy9HZXQgZGF0YSwgZnJvbSBQb3VjaERCL0NvdWNoREJcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSCA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG5cclxuICAgICAgICAgICAgLy9TdGFydCBDb21wYXJlXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUHJvcGVydHlDb21wYXJlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWxNM1Byb2Nlc29zU1FMW1Byb3BlcnR5Q29tcGFyZVtpXV0gIT0gb00zUHJvY2Vzb3NDT1VDSFtQcm9wZXJ0eUNvbXBhcmVbaV1dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0NvbXBhcmU6IElELCBJZFByb2R1Y3RvIHkgQ0FOVElEQURcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaWxNM1Byb2Nlc29zU1FMLk0zRU5DLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uSUQgIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLklEIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uSWRQcm9kdWN0byAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uSWRQcm9kdWN0byB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvUmVzcCA9IHsgXCJiUmVzcFwiOiBiUmVzcCwgXCJNM1Byb2Nlc29zXCI6IG9NM1Byb2Nlc29zQ09VQ0ggfTtcclxuICAgICAgICAgICAgcmV0dXJuIG9SZXNwO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgQ29tcGFyZU0zUHJvY2Vzb1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICBvUmVzcCA9IHsgXCJiUmVzcFwiOiB0cnVlLCBcIk0zUHJvY2Vzb3NcIjogbnVsbCB9O1xyXG4gICAgICAgICAgICByZXR1cm4gb1Jlc3A7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZGljaW9uYXIgY29tZXJjaWFsIGFsIHByb2Nlc28sIGxvIGFkaWNpb25hIGFsIGFycmVnbG8gZGUgZGluYW1pY29zIGFzb2NpYWRvIGFsIHByb2Nlc28uXHJcbiAgICBwdWJsaWMgQWRkQ29tZXJjaWFsVG9NM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFRkb2NDb21lcmNpYWw6IHN0cmluZywgTmRvY0NvbWVyY2lhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIlRDT01FUkNJQUxcIiwgVGRvY0NvbWVyY2lhbCkpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaCh0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJOQ09NRVJDSUFMXCIsIE5kb2NDb21lcmNpYWwpKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NyZWFjaW9uIHkgcmV0b3JubyBkZSB0dXBsYSBkZSBkaW5hbWljb3MsIGF0YWRvcyBhIHByb2Nlc28gbTMuXHJcbiAgICBwdWJsaWMgQ3JlYXRlVHVwbGFEaW5hbWljYShub21icmUsIHZhbG9yKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBub21icmU7XHJcbiAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IHZhbG9yO1xyXG5cclxuICAgICAgICByZXR1cm4gb00zUERpbmFtaWNhcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vQWN0dWFsaXphIGxhIGNhbnRpZGFkIGRlIFxyXG4gICAgcHVibGljIHNldENhbnRpZGFkQUxMWVVQRENvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBpQ2FudGlkYWQpIHtcclxuXHJcbiAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwICYmIG9NM1Byb2Nlc29zLklERGlhcmlvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8vQXVuIG5vIGVzdGEgcmVnaXN0cmFkbyBlbCBwcm9jZXNvIGNvbW8gdGFsLCBzZSBwdWVkZSBib3JyYXIgZGUgcmFpelxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBcIldFQlwiLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5HZXRDYXJyaXRvQ29tcHJhc1BvdWNoREIob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBuZXcgTTNQcm9jZXNvcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gaUNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIFwiV0VCXCIsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy9TZSBjYW50aWRhZCBkZSB1biBwcm9kdWN0byBlc3BlY2lmaWNvXHJcbiAgICBwdWJsaWMgc2V0Q2FudGlkYWRZVVBEQ291Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sXHJcbiAgICAgICAgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCB0aXBvVWJpY2FjaW9uLCBJREVuYyxcclxuICAgICAgICBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgZm9yemFyQm9ycmFkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKChpQ2FudGlkYWQgPT0gMCAmJiBvTTNQcm9jZXNvcy5JRERpYXJpbyA9PT0gdW5kZWZpbmVkICYmIHRpcG9VYmljYWNpb24gPT0gXCJXRUJcIikgfHwgZm9yemFyQm9ycmFkKSB7XHJcbiAgICAgICAgICAgIC8vL0F1biBubyBlc3RhIHJlZ2lzdHJhZG8gZWwgcHJvY2VzbyBjb21vIHRhbCwgc2UgcHVlZGUgYm9ycmFyIGRlIHJhaXpcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIHByb2QuSUQgPT0gSURFbmMpICYmICEocHJvZC5JZEVuY1BhZHJlID09IElERW5jKSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgICAgICBsb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBKQUdNIDIwMTkxMDIxLCBubyBoYWNlciBsw7NnaWNhIGRlIHByb21vY2lvbmVzIHkgdmFyaW9zLCBjdcOhbmRvIHNlIGJvcnJhIGVsIGl0ZW0uXHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYykuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhbnRpZGFkVjIob00zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgSURFbmMsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBtM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8pLnRoZW4ocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24sIHJlc3AuTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYW1iaWFyIGNhbnRpZGFkIGRlIG0zcHJvY2Vzb1xyXG4gICAgLy9KQUdNIDIwMTkxMDE4IFNlIGFncmVnYSBudWV2YSBmdW5jaW9uYWxpZGFkIGEgbGEgY2FudGlkYWQ6IFxyXG4gICAgLy8xLlNlIGJvcnJhIGVsIHByb2R1Y3RvIGRlIGxhIGxpc3RhIGRlbCBwcm9jZXNvXHJcbiAgICAvLzIuIFNlIGFncmVnYSBkZSBudWV2byBlbCBwcm9kdWN0byBjb24gbGEgbnVldmEgY2FudGlkYWQuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyOiBhbnlcclxuICAgICAgICAsIHNJREthdGlvczogc3RyaW5nLCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPikge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgLy9KQUdNIDIwMTkxMTE0LCBBZ3JlZ2FyIGltYWdlblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKTtcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUEVuY0l0ZW1zLlBhdGhJbWFnZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIShlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgKGVuYy5JRCA9PSBJREVuYyB8fCBlbmMuSWRFbmNQYWRyZSA9PSBJREVuYykpKTtcclxuXHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKGlkUHJvZHVjdG8sIHRydWUsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSB0aGlzLkxvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0byk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiB7IFwiTTNQcm9jZXNvXCI6IG9NM1Byb2Nlc29zLCBcIk0zUEl0ZW1zV0VCXCI6IG9NM1BJdGVtc1dFQiB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldF9NM0VOQ19ieV9pZHByZF9sb3RlKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUpXHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGNhbnRpZGFkIGRlIHVuIGVuY2FiZXphZG8sIHByb2R1Y3RvIGVzcGVjaWZpY28uXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9kdWN0bzogTTNQcmRHZW5lcmFsKSB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IG9Qcm9kdWN0by5TS1UgJiYgZW5jLkxvdGUgPT0gb1Byb2R1Y3RvLkxPVEUpLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vL1JFR0lPTiBERSBSRUNFUENJT05cclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgcmVjZXBjaW9uXHJcbiAgICBwdWJsaWMgTWVyZ2VSZWNlcFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUmVjZXBjaW9uOiBudW1iZXIpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5maWx0ZXIocmVjZXAgPT4gcmVjZXAuSWRSZWNlcGNpb24gPT0gaWRSZWNlcGNpb24pLmZvckVhY2gocmVjID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JRCA9PSByZWMuSWRFbmMpLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShyZWMuQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDVVJDUkVDXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0RlamFyIGxvcyBkZSB0YWxsZXMgZGUgbGEgdmFyaWFibGU6IENVUkNSRUMgZW49MCwgRXN0byBwYXJhIGZsdWpvcywgZG9uZGUgYWdyZWdhIGluZm8gcHJvY2VzYSB5IGFow60gbWlzbW8gYWdyZWdhIG3DoXMuXHJcbiAgICBwdWJsaWMgUmVtb3ZlQ3VyQ1JlYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPSBudWxsKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RldGFsbGU6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgIG9EZXRhbGxlID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNVUkNSRUNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RldGFsbGUgIT09IHVuZGVmaW5lZCAmJiBvRGV0YWxsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RldGFsbGUuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vRklOIFJFR0lPTiBERSBSRUNFUENJT05cclxuXHJcbiAgICAvLy8vLy8vUkVHSU9OIEVOVFJFR0FcclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgZW52aW9cclxuICAgIHB1YmxpYyBNZXJnZUVudHBZRW5jKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM1BFbnZpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM1BFbnZpb3MuZm9yRWFjaChlbnYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgICAgIGxFbmMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+IGVuYy5JZEVudmlvID09IGVudi5JZEVudmlvKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobEVuYyAhPT0gdW5kZWZpbmVkICYmIGxFbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxFbmMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciwgXCJDVVJDRU5UXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDrSBtaXNtbyBhZ3JlZ2EgbcOhcy5cclxuICAgIHB1YmxpYyBSZW1vdmVDdXJDRW50KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9IG51bGwpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGV0YWxsZTogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgb0RldGFsbGUgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1VSQ0VOVFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGV0YWxsZSAhPT0gdW5kZWZpbmVkICYmIG9EZXRhbGxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGV0YWxsZS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuICAgIC8vLy8vLy9GSU4gUkVHSU9OIEVOVFJFR0FcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb25lcyBxdWUgc2UgcHJvY2VzYW4gZGVzcHVlcyBkZSBhZ3JlZ2FyIGFsIGNhcnJpdG9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvRGF0YVVzZXIgXHJcbiAgICAgKiBAcGFyYW0gb00zUEl0ZW1zV0VCIFxyXG4gICAgICogQHBhcmFtIG9NM1ViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBFbkxpbmVhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY1Byb21vQWZ0ZXJBZGRUb0NhcnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5Qcm9jZXNhck9ic2VxdWlvcyhvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhciBwcm9tb2Npb25lcyBkZXNwdWVzIGRlIGZpbmFsaXphciBlbCByZWdpc3Ryb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY1Byb21vQWZ0ZXJGaW5hbGl6YXIob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuXHJcbiAgICAgICAgdGhpcy5HZW5lcmFyUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgdGhpcy5Qcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUHJvbW9BZnRlclByb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBudWxsKTtcclxuICAgICAgICAgICAgdmFyIGxUaXBvc1Byb21vID0gbmV3IEFycmF5PFN0cmluZz4oKTtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgbFRpcG9zUHJvbW8ucHVzaChcIkFGVEVSXCIpO1xyXG4gICAgICAgICAgICBhcnJQcm9tbyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIG51bGwsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvc1Byb21vKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJQcm9tb0FmdGVyKGFyclByb21vLCBvTTNQcm9jZXNvcywgb00zRU5DUFJPTU8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBhIGluZm9ybWFjaW9uIGRpbmFtaWNhIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEluZm9Qcm9tb2Npb25lc0FEaW5hbWljYXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCAwKTtcclxuICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVkFMX1BST01PQ1wiLCBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJOT01CX1BST01PQ1wiLCBkYXRhLk5PTUJSRVMpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJJRF9QUk9NT0NcIiwgZGF0YS5JRClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGllbmUgZWwgcHJvY2VzbyBhc29zaWFkbyBhIHVuIGlkcHJlc3RhbW9zXHJcbiAgICBhc3luYyBnZXRfbTNfcHJvY2Vzb19ieV9pZF9wcmVzdGFtb19hc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRfcHJlc3RhbW86IHN0cmluZykge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBpZF9rYXRpb3MgKyAnLycgKyBpZF9wcmVzdGFtbykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmNlcHRvTTNTYWxkb3NJdGVtVWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYi8nICsgc0lES2F0aW9zLCBqRGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSBvIG1vZGlmaWNhIGxhIGNhbnRpZGFkIGRlIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIGRlbnRybyBkZWxhIGxpc3RhIGRlIHVuIFByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9kdWN0IFxyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRQcm9kdWN0b1RvT3RyYXNDbGFzKHByb2R1Y3Q6IFR5cGVNM1ByZEdycCwgY2FudGlkYWQ6IG51bWJlciwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBmdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBvTTNPdENsYXNpZmljYWNpb25lczogTTNPdENsYXNpZmljYWNpb25lcztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdO1xyXG5cclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSB0aGlzLnZhbGlkYXJFeGlzdGFPdHJhQ2xhc2lmKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIHByb2R1Y3QpO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0V4aXN0ZSkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCA9IHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkICsgY2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLk9yZGVuID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcyA9IG5ldyBNM090Q2xhc2lmaWNhY2lvbmVzKCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLkNhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8gPSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuTm9tYnJlID0gcHJvZHVjdFVuaXRTZWxlY3RlZC5OT01CUkUxO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvciA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHByb2R1Y3RVbml0U2VsZWN0ZWQuTG9NM1ByZExpc3RhLlBSRUNJTywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5JRCA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJJRFwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLk9yZGVuID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIk9yZGVuXCIpICsgMTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMucHVzaChvTTNPdENsYXNpZmljYWNpb25lcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlvTTNQcm9jZXNvcyA9IHRoaXMucmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3MoaW9NM1Byb2Nlc29zKTtcclxuICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxpbWluYSB1biBvYmpldG8gTTNPdENsYXNpZmljYWNpb25lcyBwb25pZW5kbyBzdSB2YWxvciB5IGNhbnRpZGFkIGVuIGNlcm9cclxuICAgICAqIEBwYXJhbSBvTTNPdENsYXNpZmljYWNpb25lcyBcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZVByb2R1Y3RvRnJvbU90cmFzQ2xhcyhvTTNPdENsYXNpZmljYWNpb25lczogTTNPdENsYXNpZmljYWNpb25lcywgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBvTTNPdENsYXNpZmljYWNpb25lcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5WYWxvciA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlvTTNQcm9jZXNvcyA9IHRoaXMucmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3MoaW9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhIGVsIHZhbG9yIGRlIE0zUHJvY2Vzb3MuVmFsT3RyYUNsYXNpIGEgcGFydGlyIGRlIGxhIHN1bWF0b3JpYSBkZSBsb3Mgb2JqZXRvcyBkZW50cm8gZGVsIGFycmVnbG8gTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsT3RyYUNsYXNpID0gb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bWEsIG9NM090Q2xhc2lmaWNhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdW1hICsgb00zT3RDbGFzaWZpY2FjaW9uZXMuVmFsb3I7XHJcbiAgICAgICAgfSwgMClcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBwcm9kdWN0byBkZW50cm8gZGUgdW4gbGEgbGlzdGEgZGUgTTNPdENsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXJFeGlzdGFPdHJhQ2xhc2lmKGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzOiBBcnJheTxNM090Q2xhc2lmaWNhY2lvbmVzPiwgcHJvZHVjdDogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvRXhpc3RlID0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLlNLVSk7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RvRXhpc3RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAqIExpbXBpYSBsb3MgZGV0YWxsZXMgeSBsb3MgaW1wdWVzdG9zIGRlIHVuIHByb2R1Y3RvIGRhZG8gZW4gdW4gcHJvY2VzbyBkZSBkZXZvbHVjaW9uXHJcbiAgICogQHBhcmFtIHByb2R1Y3RvQm9ycmFkbyBcclxuICAgKiBAcGFyYW0gcHJvY2Vzb0Rldm9sdWNpb24gXHJcbiAgICovXHJcbiAgICBkZWxldGVQcmREZXZvbHVjaW9uKHByb2R1Y3RvQm9ycmFkbywgcHJvY2Vzb0Rldm9sdWNpb246IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG8gPSBwcm9jZXNvRGV2b2x1Y2lvbi5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3RvQm9ycmFkby5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG8pIHtcclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNERVQuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTigrZGV0LlZhbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHByb2R1Y3RvLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBanVzdGEgbG9zIFZhbG9yZXMgZW4gY2FzbyBkZSBlbmNvbnRyYXIgZGlmZXJlbmNpYXMgcGFyYSBwb2RlciBnZW5lcmFyIEZFXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvclZhbG9yZXNDRkRJRnJvbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcbiAgICAgICAgbGV0IHRvdGFsRGVzY3VlbnRvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbERlc2N1ZW50b3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSB0aGlzLmdldFZhbG9yVG90YWxJbXBvcnRlSW1wdWVzdG9zKG9NM1Byb2Nlc29zKTtcclxuXHJcbiAgICAgICAgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZChvTTNQcm9jZXNvcy5WYWxvck5ldG8gLSAob00zUHJvY2Vzb3MuVmFsb3IgKyB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgLSB0b3RhbERlc2N1ZW50b3MpLCAzKTtcclxuICAgICAgICBpZiAoZGlmZXJlbmNpYSAhPSAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JEZXNjdWVudG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgdmFsb3IgdG90YWwgZGUgcHJvbW9jaW9uZXMgYXBsaWNhZGFzIGVuIGVsIHByb2Nlc28gZW4gY3Vlc3Rpw7NuXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGdldFZhbG9yVG90YWxEZXNjdWVudG9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRhbGxlUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVByb21vKSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbERlc2N1ZW50b3MgKz0gK2RldGFsbGVQcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxEZXNjdWVudG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgY29icmFkb3MgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgZW5jLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgKz0gK2ltcC5WYWxvcjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbEltcG9ydGVJbXB1ZXN0b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBpbXB1ZXN0byBlbiAwLjAxIHkgc3UgY29ycmVzcG9uZGllbnRlIGJhc2UgcGFyYSBxdWUgY3VhZHJlIGxvcyB2YWxvcmVzIGFsIHRpbWJyYXIgbGEgRkVcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JJbXB1ZXN0b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgYWp1c3RvID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgZW5jIG9mIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGltcCBvZiBlbmMuTTNQSW1wdWVzdG9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gaW1wLlZhbG9yIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGltcC5CYXNlID0gaW1wLlZhbG9yIC8gaW1wLlBvcmNlbnRhamU7XHJcbiAgICAgICAgICAgICAgICBhanVzdG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFqdXN0bykge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBkZXNjdWVudG8gZW4gMC4wMSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgZGV0YWxsZVRvdGFsUHJvbW86IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVRvdGFsUHJvbW8gJiYgK2RldGFsbGVUb3RhbFByb21vLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yIC0gMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vLlZhbG9yID0gKCtkZXRhbGxlVG90YWxQcm9tby5WYWxvciArIDAuMDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBqRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL2dldFByZHNHZW5lcmFsRnJvbU0zUHJvY2Vzby8nICsgc0lkS2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=
|
|
2631
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibTMtcmVnLXNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy8iLCJzb3VyY2VzIjpbImxpYi9ybm0zL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUk5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBNEMsTUFBTSw4Q0FBOEMsQ0FBQztBQUU1SCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUlwRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7O0FBQ3ZCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTNDLE1BQU07Ozs7OztJQVdGLFlBQVksZ0JBQWdDLEVBQUUsZUFBOEIsRUFBRSxTQUFpQjt1QkFWdEUsSUFBSSxNQUFNLEVBQUU7K0JB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Qy9ELElBQUksaUJBQWlCLENBQWtCO1FBQ3ZDLEtBQUssSUFBSSxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRTtZQUMvQixpQkFBaUIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksWUFBWSxDQUFDLENBQUM7WUFDMUUsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQ25ELElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtvQkFDaEIsaUJBQWlCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQzFFO3FCQUNJO29CQUNELGlCQUFpQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUMxRTtnQkFDRCxNQUFNO2FBQ1Q7U0FDSjtLQUNKOzs7Ozs7Ozs7SUFFTSwyQkFBMkIsQ0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUMxRixVQUFvQixFQUFFLFdBQXFCO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsaUNBQWlDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvRixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxHQUFHLENBQUMsRUFBRTtZQUNGLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM5QyxDQUFDLENBQUM7O0NBR2QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUEVuY0l0ZW1zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBlbmMtaXRlbXNcIjtcclxuaW1wb3J0IHsgTTNQcmRHZW5lcmFsIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGVcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCLCBNM1BEZXRhbGxlQ3Vwb24gfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zRGF0YSB9IGZyb20gXCIuLi9EYXRhL20zLWRhdGFcIjtcclxuaW1wb3J0IHsgREVGQVVMVF9WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9kZWZhdWx0X3ZhbHVlX2FjY2Vzc29yXCI7XHJcbmltcG9ydCB7IHhtbFRvSnNvblRGIH0gZnJvbSBcIi4uLy4uL0NvbnZlcnQveG1sVG9KU29uLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUEltcHVlc3RvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wLWltcHVlc3Rvc1wiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcbmltcG9ydCB7IE0zRU5DUFJPTU8gfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zRU5DUFJPTU8uY2xhc3NcIjtcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBwcm9tb2Npb25lc1NlcnZpY2UgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Qcm9jZXNhZGEsIFByb21vY2lvbmVzQXNvY2lhZGFzLCBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNDb3VjaE1hZXN0cm8gfSBmcm9tIFwiLi4vRGF0YS9tMy1jb3VjaC1tYWVzdHJvXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1saXN0YS1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGEgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9zcmMvcmVuZGVyM1wiO1xyXG5pbXBvcnQgeyBNM1ByZXNlbnRhY2lvbmVzIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcHJlc2VudGFjaW9uZXNcIjtcclxuaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyL3NyYy91dGlsXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0RldCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkUGFja0RldFwiO1xyXG5pbXBvcnQgeyBNM1ByZEFkaWNpb25hbGVzIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zT3RDbGFzaWZpY2FjaW9uZXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtb3QtY2xhc2lmaWNhY2lvbmVzXCI7XHJcbmltcG9ydCB7IE0zUHJkTGlzdGEgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZExpc3RhLnR5cGVcIjtcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSBcIi4uL01pc2NlbGFuZWEvTWF0aFRGLmNsYXNzXCI7XHJcbmltcG9ydCB7IEVDQU5DRUxFRCB9IGZyb20gXCJjb25zdGFudHNcIjtcclxuaW1wb3J0ICogYXMgeG1sMmpzIGZyb20gJ3htbDJqcyc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG52YXIgYmlnRGVjaW1hbCA9IHJlcXVpcmUoJ2pzLWJpZy1kZWNpbWFsJyk7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvTWF0aFRGOiBNYXRoVEYgPSBuZXcgTWF0aFRGKCk7XHJcbiAgICBwcml2YXRlIG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm87XHJcbiAgICBwdWJsaWMgb0xpc3RhT2JzZXF1aW9zOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NFeGM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb09Qcm9tbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zQ2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbElkQWN0aXZhUHJvbW8gPSBbXTtcclxuICAgIHByaXZhdGUgR29Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zO1xyXG4gICAgcHJpdmF0ZSBnc0lka2F0aW9zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBJc1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZGthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8gPSBpb00zQ291Y2hNYWVzdHJvO1xyXG4gICAgICAgIHRoaXMuR29Qb3N0U2VydmljZU0zID0gSXNQb3N0U2VydmljZU0zO1xyXG4gICAgICAgIHRoaXMuZ3NJZGthdGlvcyA9IHNJZGthdGlvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBWYWxpZGFyIG51bWVybyBkZSBpdGVtcyBhZ3JlZ2Fkb3MuIHNpIGVzIG1heW9yIGEgMS4wMDAgcHJlbmRlIHBhcmFtZXRybyBcclxuICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTnVtZXJvSXRlbXMob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPiAxMDAwKSB7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5BcGxEZXNkZVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTnVtZXJvSXRlbXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJT0NJRVJSRVxyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvSnNvbi5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBBcnJheTxNM1Byb2Nlc29zPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vL1JldG9tYXIgaW5mb3JtYWNpb24gcGFyYSBlbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIFJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXI6IGFueSwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhVXNlciAhPSBudWxsICYmIG9NM1Byb2Nlc29zLklkTTMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFwbFJldG9tYXJJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IHVuZGVmaW5lZCB8fCBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIGRhdG9zIGVuIGJhc2UgZGUgZGF0b3MgcG91Y2hEQi5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZVBvdWNoREIob00zRGF0YTogTTNEYXRhLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIC8vQ2FyZ2FyIGRldGFsbGUgZGUgaXRlbXNcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4oYXN5bmMgcmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyArb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCBNM0VuYyA9IHRoaXMuZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVLCBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUpO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9EYXRhQ2Fycml0b0NvbXByYXMpO1xyXG4gICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZ3JlZ2FyIGEgY2Fycml0byBwcm9kdWN0by5cclxuICAgIHB1YmxpYyBhZGR0b2NhcnQob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MDcyMiBzZSBhZ3JlZ2EgcGFyYSBjdWFuZG8gZXMgZWwgcHJpbWVyIHByb2R1Y3RvIHF1ZSBzZSBhZ3JlZ2Fyw6FcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb0RhdGFVc2VyLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBpb00zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMudmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM1Byb2Nlc29zLk0zRU5DLCBwcm9kdWN0VW5pdFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWRfYWN0dWFsICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMuZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9ICgrY2FudGlkYWRfYWN0dWFsKSArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSAmJiBwcm9kLkxvdGUgPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFICYmICEocHJvZC5JZEVuY1BhZHJlID4gMCkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLCB2YWxvckRlc2N1ZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmFsaWRhIHF1ZSBleGlzdGEgcHJvZHVjdG8gZW4gbG9zIGVuY2FiZXphZG9zLiBUcnVlOiBTaSBleGlzdGUsIEZhbHNlIGRlIG90cm8gbW9kb1xyXG4gICAgLy8gU2UgY2FtYmlhIGZ1bmNpb25hbGlkYWQgZGUgcmV0dXJuLlxyXG4gICAgcHVibGljIHZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNMaXN0YUVuYzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcmRHcmw6IE0zUHJkR2VuZXJhbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQik6IG51bWJlciB7XHJcbiAgICAgICAgdmFyIG9FbmM6IE0zUEVuY0l0ZW1zID0gbnVsbDtcclxuICAgICAgICB2YXIgY2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSAtMTtcclxuICAgICAgICBpZiAob00zTGlzdGFFbmMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcmRHcmwgIT09IHVuZGVmaW5lZCAmJiBvTTNMaXN0YUVuYy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICBvRW5jID0gb00zTGlzdGFFbmMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb00zUHJkR3JsLlNLVSAmJiAhZW5jLklkRW5jUGFkcmUgJiYgdGhpcy5nZXRDYW50aWRhZFBvc2l0aXZhKGVuYykpO1xyXG4gICAgICAgICAgICBpZiAob0VuYyAhPT0gdW5kZWZpbmVkICYmIG9FbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE3IFZhbGlkYXIgYWhvcmEgZWwgcHJlY2lvLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXNHZW5lcmFsKG9NM1ByZEdybCwgK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5WYWxpZGFyUHJlY2lvc1ByZHMob0VuYywgb00zUHJkR3JsLkxvTTNQcmRMaXN0YSkgJiYgIXRoaXMuVmFsaWRhckVzdGFQYXF1ZXRlKG9FbmMsIG9NM0xpc3RhRW5jKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gb0VuYy5JRDtcclxuICAgICAgICAgICAgICAgICAgICBjYW50aWRhZCA9ICtvRW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW50aWRhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYW50aWRhZFBvc2l0aXZhKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgY2FudGlkYWQgPSAwO1xyXG4gICAgICAgIGxldCBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpXHJcblxyXG4gICAgICAgIGlmIChkZXRDYW50aWRhZCkge1xyXG4gICAgICAgICAgICBjYW50aWRhZCA9ICtkZXRDYW50aWRhZC5WYWxvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBxdWUgZWwgZW5jYWJlemFkbyBjb24gZWwgcHJvZHVjdG8gYWdyZWdhZG8sIHNlYSB1biBwYXF1ZXRlXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIG9NM0xpc3RhRW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhckVzdGFQYXF1ZXRlKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAob00zTGlzdGFFbmMuZmluZCh4ID0+IHguSWRFbmNQYWRyZSA9PSBvTTNQRW5jSXRlbXMuSUQpKSB7XHJcbiAgICAgICAgICAgICAgICBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgbG9zIHByZWNpb3MgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICogQHBhcmFtIG9FbmMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJkTGlzdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyUHJlY2lvc1ByZHMob0VuYzogTTNQRW5jSXRlbXMsIG9NM1ByZExpc3RhOiBNM1ByZExpc3RhKSB7XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9FbmM6IG51bWJlciA9ICtvRW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBkUHJlY2lvTGlzdDogbnVtYmVyID0gb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRQcmVjaW9MaXN0ID09IGRQcmVjaW9FbmMpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBWYWxpZGFyUHJlY2lvc1ByZHNcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCB0aXBvVWJpY2FjaW9uOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb25cclxuICAgICAgICAsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIgPSBudWxsKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vSURIVUJcclxuICAgICAgICBpZiAodGlwb1ViaWNhY2lvbi50b1VwcGVyQ2FzZSgpID09IFwiV0VCXCIpIHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgbTNVYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgaWYgKG0zVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBsb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQikge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG9NM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyh0aGlzLmdzSWRrYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgdGhpcy5Qcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvcywgb0RhdGFVc2VyLCBsb00zUEl0ZW1zV0VCLCBtM1ViaWNhY2lvbiwgdHJ1ZSkudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHgpO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cob0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhc0FzeW5jKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coeClcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkbyBlbiBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2tcIik7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5vRW5jYWJlemFkb00zQ29tcG9uZW50LlJlY2FyZ2FyQ2Fycml0bygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLkxvYWRDYXJ0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyB1cGRhdGVBUG91Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvL0lESFVCXHJcbiAgICAgICAgaWYgKHRpcG9VYmljYWNpb24udG9VcHBlckNhc2UoKSA9PSBcIldFQlwiKSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZWxldGVNM1Byb2Nlc28ob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgYXdhaXQgb00zRGF0YS5EZWxldGUoc0tleUNhcnJpdG8pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9FbGltaW5hciBkb2N1bWVudG8gZGUgY291Y2gvcG91Y2gsIGluaWNpbyB5IGFjdHVhbFxyXG4gICAgcHVibGljIERlbERvY3NTdGFydEFuZEN1cnJlbnQob00zRGF0YTogTTNEYXRhLCBzSURLYXRpb3M6IHN0cmluZywgb2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBVYmljYWNpb25DdXJyZW50LCBIdWJDdXJyZW50KSB7XHJcbiAgICAgICAgLy9FbGltaW5hciBJbmljaWFsXHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPT0gdW5kZWZpbmVkICYmIG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIFwiSURIVUJcIjogb2xNM1Byb2Nlc29zLklESHViIH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIHN0YXJ0XCIpO1xyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgLy9FbGltaW5hciBhY3R1YWxcclxuICAgICAgICAgICAgb0RhdGFVc2VyID0geyBcIlVzdWFyaW9TaXN0ZW1hXCI6IHsgXCJURE9DXCI6IG9sTTNQcm9jZXNvcy5URG9jLCBcIk5ET0NcIjogb2xNM1Byb2Nlc29zLk5Eb2MsIFwiVUJJQ0FDSU9OXCI6IFViaWNhY2lvbkN1cnJlbnQudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBIdWJDdXJyZW50IH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIGN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVHJhc2xhZGFyIGluZm9ybWFjacOzbiBkZSBjYXJyaXRvLCBkb3MgdXN1YXJpb3NcclxuICAgIHB1YmxpYyBhc3luYyBNb3ZlQ2FydEludG9Vc2VyKHNJREthdGlvczogc3RyaW5nLCBvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlck9yaWdlbjogYW55LCBvRGF0YVVzZXJEZXN0aW5vOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9PcmlnZW47XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvRGVzdGlubztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG9PcmlnZW4gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b0Rlc3Rpbm8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgbGV0IG9NM1Byb2Nlc28gPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvT3JpZ2VuKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc28uVERvYyA9IG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVERPQztcclxuICAgICAgICAgICAgb00zUHJvY2Vzby5ORG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5ORE9DO1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb1tcIl9yZXZcIl07XHJcbiAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG9EZXN0aW5vLCBvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW9zIHRvdGFsZXMgeSBkZSBiYXNlXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvc1Byb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsQmFzZTtcclxuICAgICAgICAvLyB2YXIgZFZhbG9yOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3JOZXRvOiBudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgIC8vICAgICBkUHJlY2lvVG90YWwgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgLy8oK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikgKiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIC8vICAgICBkUHJlY2lvVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhclByZWNpb0Jhc2VGcm9tUHJvY2VzbyhlbmMsIGRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTEJBU0VcIikuVmFsb3IgPSBTdHJpbmcoTWF0aC5yb3VuZChkUHJlY2lvVG90YWxCYXNlICogMTAwKSAvIDEwMCk7XHJcbiAgICAgICAgLy8gICAgIGRWYWxvciA9ICgrZFZhbG9yKSArICgrZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gICAgIGRWYWxvck5ldG8gPSAoK2RWYWxvck5ldG8pICsgKCtkUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLlJlY2FsY3Vsb0ltcHVlc3RvcyhlbmMsIGRQcmVjaW9Ub3RhbEJhc2UpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICAgIC8vIC8vb00zUHJvY2Vzb3MuVmFsb3IgPSBkVmFsb3I7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gZFZhbG9yTmV0bztcclxuICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9SZWNhbGN1bGFyIHByZWNpb3MuIHJlY29ycmllbmRvIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciB2YWxvciA9IDA7XHJcbiAgICAgICAgdmFyIFZhbG9yTmV0byA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTEwMTAgc2UgY2FtYmlhIGVsIHZhbG9yIGRlbCBwcmVjaW8gdW5pdGFyaW8gYmFzZSwgeWEgcXVlIGFsIG1vbWVudG8gZGUgbGxhbWFyIGxhIGZ1bmNpw7NuIFZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzb1xyXG4gICAgICAgICAgICAvLyBzZSByZWNhbGN1bG8gZWwgcHJlY2lvIHRvdGFsLCBkZXBlbmRpZW5kbyBkZSBlc3RlIHZhbG9yLlxyXG4gICAgICAgICAgICBsZXQgcFRvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXRlUHJlY2lvQmFzZShlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1RCTERJTVBQUkRcIikuVmFsb3IsXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NYXRoVEYucm91bmQoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yLCAyKSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgZENhbnRpZGFkRW5jID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgaWYgKCtkQ2FudGlkYWRFbmMgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpLlZhbG9yID0gKCtwVG90YWxCYXNlIC8gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKGVuYywgK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bGFyIHByZWNpbyBiYXNlIGRlIHVuIHByZWNpbywgdGVuaWVuZG8gZWwgdmFsb3IgdG90YWwgbyBuZXRvLlxyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9OZXRvOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JJbXB1ZXN0byA9ICgrZFZhbG9ySW1wdWVzdG8pICsgKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgoK2RQcmVjaW9OZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1JlY2FsY3VsbyBkZSB2YWxvciBkZSBpbXB1ZXN0b3MsIGN1YW5kbyBjYW1iaWEgZWwgdmFsb3IuIFNlYSBwb3IgY2FudGlkYWQsIGVsaW1pbmFjacOzbi4uLlxyXG4gICAgLy8gcHVibGljIFJlY2FsY3Vsb0ltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkUHJlY2lvQmFzZTogbnVtYmVyKSB7XHJcbiAgICAvLyAgICAgdmFyIGRUb3RhbEltcHVlc3RvOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgLy8gICAgICAgICBpbXAuVmFsb3IgPSAoK2RQcmVjaW9CYXNlKSAqICgraW1wLlBvcmNlbnRhamUpO1xyXG4gICAgLy8gICAgICAgICAvL0pBR00gMjAxODA5MTIgbnVldm8gY29uY2VwdG9cclxuICAgIC8vICAgICAgICAgaW1wLkJhc2UgPSBkUHJlY2lvQmFzZTtcclxuICAgIC8vICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSAoK2RUb3RhbEltcHVlc3RvKSArICgraW1wLlZhbG9yKTtcclxuICAgIC8vICAgICAgICAgLy9TdW1hIGRlIHByZWNpbyBiYXNlIFxyXG4gICAgLy8gICAgICAgICBkUHJlY2lvQmFzZSA9ICgrZFByZWNpb0Jhc2UpICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIGRUb3RhbEltcHVlc3RvID0gTWF0aC5yb3VuZChkVG90YWxJbXB1ZXN0byAqIDEwMCkgLyAxMDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMSU1QVUVTVE9TXCIpLlZhbG9yID0gZFRvdGFsSW1wdWVzdG8udG9TdHJpbmcoKTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhY2lvbiBudWV2byBNMyBwcm9jZXNvcywgZXN0ZSB2YSB2YWNpbyBzaW4gbmlzaXF1aWVyYSBNM1BFbmNJdGVtcy4gXHJcbiAgICAgKiBTZSB1dGlsaXphIHByaW5jaXBhbG1lbnRlIHBhcmEgbGFzIGNyZWFjaW9uIGRlc2RlIDAgdW4gTTMgUHJvY2Vzby4gUXVlIHBhc2EgZGUgZXN0YWRvcyAnJyBhbCBwcmltZXIgZXN0YWRvXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGlkcHJvY2Vzb19kZXN0aW5vIFxyXG4gICAgICogQHBhcmFtIHRkb2MgXHJcbiAgICAgKiBAcGFyYW0gbmRvYyBcclxuICAgICAqIEBwYXJhbSBlc3RhZG9zX2Z1dHVyb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRIdWIgXHJcbiAgICAgKiBAcGFyYW0gaWRVYmljYWNpb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDcmVhdGVNM05ld1Byb2Nlc29FbXB0eShpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkcHJvY2Vzb19kZXN0aW5vOiBzdHJpbmcsIHRkb2M6IHN0cmluZywgbmRvYzogc3RyaW5nLFxyXG4gICAgICAgIGVzdGFkb3NfZnV0dXJvczogQXJyYXk8YW55PiwgaWRIdWI6IHN0cmluZywgaWRVYmljYWNpb246IHN0cmluZykge1xyXG5cclxuICAgICAgICBpb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBpZHByb2Nlc29fZGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gZXN0YWRvc19mdXR1cm9zWzBdLkVfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gZXN0YWRvc19mdXR1cm9zWzBdLlNFX0Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSAraWRIdWI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gK2lkVWJpY2FjaW9uO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5JREh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVWJpYzEgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlREb2MgPSB0ZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5ORG9jID0gbmRvYztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVGlwb1RlcmNlcm8gPSAxO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMiA9IC0xO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlID0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DdWFuZG8gc2UgYWdyZWdhIHBvciBwcmltZXJhIHZleiBhbCBjYXJyaXRvIGRlIGNvbXByYS5cclxuICAgIHB1YmxpYyBMb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9EYXRhVXNlcjogYW55LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgLy9zSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTlxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvcztcclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc29zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBuZXcgTTNQcm9jZXNvcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVGlwb1RlcmNlcm8gPSAxO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlREb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5ORG9jID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzEgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgLy8vQUdSRUdBUiBOVUVWQSBGVU5DSU9OQUxJREFEIERFIEhVQlMuIEZMVUpPIERFIFRSQUJBSk9cclxuICAgICAgICBvTTNQcm9jZXNvcy5JREh1YiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb00zUHJvY2Vzb3MuSURIdWI7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5VYmljMTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZSA9IC0xO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlID0gLTE7XHJcblxyXG4gICAgICAgIC8vL0ZJTiBBR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IFwiXCI7XHJcblxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPT0gXCJcIiAmJiBpb00zUHJvY2Vzb3MgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBcIlJlZ2lzdHJvXCI7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IFwiQWN0aXZvXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLlN1YkVzdGFkb19vICE9IFwiXCIgJiYgb00zUEl0ZW1zV0VCLkVzdGFkb19vICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gb00zUEl0ZW1zV0VCLlN1YkVzdGFkb19vO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuRXN0YWRvX287XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gPT0gXCJcIiAmJiBpb00zUHJvY2Vzb3MgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IFwiTTNFQ0NcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gb00zUEl0ZW1zV0VCLklkUHJvY2VzbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpKTtcclxuICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBudWxsLCAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgLy90aGlzLlByb2Nlc2FtaWVudG9TZXJ2aWNlKFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQ2FyZ2FyIG51ZXZvcyBhZGljaW9uYWxlcyBhZGljaW9uYWxlc1xyXG4gICAgcHVibGljIExvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApOiBNM1BJdGVtc1dFQiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkNsYXZlUHJkU1JWID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiQ0xBVkVQUk9EU0VSVlwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkNsYXZlUHJkVW5pZGFkID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiQ0xBVkVVTklEQURcIikuVkFMT1I7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5VbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJVTklEQURcIikuVkFMT1I7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUEl0ZW1zV0VCO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIHByb2Nlc29zLCByZXRvbWFuZG8gZGVzZGUgZGF0YVxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsLCB2YWxvckRlc2N1ZW50byA9IDApOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvciA9ICgrb00zUHJvY2Vzb3MuVmFsb3IpICsgKCtvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvTTNQcm9jZXNvcy5WYWxvcjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpKTtcclxuICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBudWxsLCB2YWxvckRlc2N1ZW50bywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9lbmNhYmV6YWRvSXRlbXM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvUGFkcmVNM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIHZhbG9yRGVzY3VlbnRvID0gMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIC8vVmFsaWRhY2lvbiBkZSBJbnZlbnRhcmlvLlxyXG4gICAgICAgIGxldCBhZGlWZW50YU5lZyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQVRSSUJVVE8gPT0gXCJWRU5UQU5FR1wiKVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSkge1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiTTNFQ0NcIiAmJiBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRSA8IG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgJiYgb00zVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvID09IFwiV0VCXCIgJiYgIShhZGlWZW50YU5lZyAmJiBhZGlWZW50YU5lZy5WQUxPUikpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl0gPSAnTm8gaGF5IGludmVudGFyaW8gcGFyYSBhZ3JlZ2FyICcgKyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkICsgJyBJdGVtcyc7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRTtcclxuICAgICAgICB9IC8vZWxzZSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQRW5jSXRlbXMgPSB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmxJdGVtKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb1BhZHJlTTNQRW5jSXRlbXMsIHZhbG9yRGVzY3VlbnRvKTtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9QYWRyZU0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIC8vVGllbmUgdW4gZW5jYWJlemFkbyBwYWRyZS5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvUGFkcmVNM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIHZhciBvbE0zUHJkUGFja0RldDogQXJyYXk8TTNQcmRQYWNrRGV0PjtcclxuICAgICAgICAgICAgb2xNM1ByZFBhY2tEZXQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTTNQQUNLXHJcbiAgICAgICAgICAgIGlmIChvbE0zUHJkUGFja0RldCAmJiBvbE0zUHJkUGFja0RldC5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZXQgdmFsb3JEZXNjdWVudG9QYWNrID0gdGhpcy5jYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2xNM1ByZFBhY2tEZXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUHJkUGFja0RldDogTTNQcmRQYWNrRGV0ID0gb2xNM1ByZFBhY2tEZXRbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhY2tNM1BJdGVtc1dFQjogTTNQSXRlbXNXRUI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQcmRQYWNrRGV0Lm9NM1BJdGVtc1dFQikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIgPSBvTTNQcmRQYWNrRGV0Lm9NM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IE9iamVjdC5hc3NpZ24oe30sIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvTTNQcmRQYWNrRGV0LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9NM1ByZFBhY2tEZXQuZ3NQYXRoSW1hZ2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkICogb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuQ2FsY3VsYXJQcmVjaW9zUENLRyhvTTNQcmRQYWNrRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgaSArIDI7IC8vRXN0byBmdW5jaW9uYSBzaSB0aWVuZSBzb2xvIDIgbml2ZWxlc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2kgZXN0byBzZSBjdW1wbGUgZXN0ZSBwcm9kdWN0byBlcyB1biBwYWNrIHkgdGllbmUgcHJvZHVjdG9zIGFzb2NpYWRvcy5cclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmRHZW5lcmFsID0gb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5NM0NvZHMuZmluZCh4ID0+IHguSWRDb2RpZ28gPT0gXCJVUENcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmRHZW5lcmFsICYmIHByZEdlbmVyYWwuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5Db2RpZ29CYXJyYXMgPSBwcmRHZW5lcmFsLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwibm8gYcOxYWRpIGNvZGlnbyBkZSBiYXJyYXMgYSBwcm9kdWN0byBoaWpvOiBcIiArIG9NM1ByZFBhY2tEZXQuU0tVSElKTylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBvTTNQcmRQYWNrRGV0Lk0zR1JQLCBvTTNQcm9jZXNvcy5NM0VOQywgcGFja00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcywgMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjIzLCBlc3RvIGVzIGN1YW5kbyBzZSBtb2RpZmljYSBsYSBjYW50aWRhZCBkZSBwcm9kY3V0b3MgZXhpc3RlbnRlcy5cclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOSBlbnZpbyBkZSBwYWRyZSBkZXNkZSBpbnN0cnVjY2lvbiBtYXMgYXJyaWJhXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5UaXBvQWdydXBhY2lvbiA9IG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob00zUERpbmFtaWNhc0J5QWN0aXZpZGFkICYmIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQuZm9yRWFjaChkaW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BEaW5hbUJ5QWN0aXZpZGFkLnB1c2goey4uLiBkaW59KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0gPSBvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1Byb2Nlc2FkbyA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAvL31cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIGxldCB2YWxvckRlc2N1ZW50b1BhY2sgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckl0ZW1zQ29tYm9TdW1hID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JGaW5hbENvbWJvID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0suZm9yRWFjaChwcmRQYWNrID0+IHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkID0gcHJkUGFjay5NM0dSUC5DYW50aWRhZCA/IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgOiAxO1xyXG4gICAgICAgICAgICBsZXQgaW5mTml2ZWxlc1ByY2lvID0gdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJkUGFjay5NM0dSUCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLklETElTVEEpXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPKVxyXG4gICAgICAgICAgICB2YWxvckl0ZW1zQ29tYm9TdW1hICs9IChwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh2YWxvckl0ZW1zQ29tYm9TdW1hID4gdmFsb3JGaW5hbENvbWJvKSB7XHJcbiAgICAgICAgICAgIHZhbG9yRGVzY3VlbnRvUGFjayA9IDEwMCAtICh2YWxvckZpbmFsQ29tYm8gKiAxMDAgLyB2YWxvckl0ZW1zQ29tYm9TdW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh2YWxvckRlc2N1ZW50b1BhY2spXHJcbiAgICAgICAgcmV0dXJuIHZhbG9yRGVzY3VlbnRvUGFjaztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcyBkZSBoaWpvcyBkZWwgcGFxdWV0ZVxyXG4gICAgICogQHBhcmFtIG9NM1ByZFBhY2tEZXQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQ6IE0zUHJkUGFja0RldCkge1xyXG4gICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb2RpZ286IHN0cmluZywgdmFsb3IsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5JZFByb2R1Y3RvID0gY29kaWdvO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTG90ZSA9IFwiMVwiO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw7NnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5PcmRlbiA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk5vbWJyZSA9IGBDb21ibyAtICR7cHJvZHVjdG9zSGlqb3NEZWxDb21iby5tYXAoeD0+IHguSWRQcm9kdWN0bykuam9pbignLScpfWA7XHJcblxyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9DT01CT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9cIikpOyAvLyBUUlVFLT4gU0kgRVMgVU4gUFJPRFVDVE8gUE9SIFBST01PQ0lPTiwgRkFMU0UtPiBERSBPVFJPIE1PRE9cclxuICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkVOQ1BST01PXCIsIFwiVElQT19QUkRcIikpO1xyXG4gICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgIC8vKiogSU5JQ0lPIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFJFQ0lPVU5JVEJBU0VcIikpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3Rvc1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVE5FVE9cIikpOy8vQ29uIGRlc2N1ZW50byBpbmNsdWlkby0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVU5JVEZJREVMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiRklERUxJWkFDSU9OXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTFBST01PXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJTVUJUT1RBTFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIikpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvQ29tYm8pO1xyXG4gICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8uZm9yRWFjaChwcm9kdWN0byA9PiB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMOzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgICAgICBwcm9kdWN0by5JZEVuY1BhZHJlID0gcHJvZHVjdG9Db21iby5JRDtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChwcm9kdWN0byk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RvQ29tYm87XHJcbiAgICB9XHJcblxyXG4gICAgcmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NBcGxTdW1hVmFsb3IgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIob00zRU5DID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGxldCBkZXRFc1ByZENvbWJvID0gb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiRVNQUk9EUFJPTU9DT01CT1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRldENhbnRpZGFkICYmICtkZXRDYW50aWRhZC5WYWxvciA+IDAgJiYgIShkZXRFc1ByZENvbWJvICYmIGRldEVzUHJkQ29tYm8uVmFsb3IgPT0gXCJ0cnVlXCIpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAwO1xyXG5cclxuICAgICAgICAvL2ZvciAoY29uc3Qgb00zRU5DIG9mIHRoaXMub00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhZW5jLklkRW5jUGFkcmUgfHwgZW5jLklkRW5jUGFkcmUgPD0gMCkpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG9NM0VOQyBvZiBwcm9kdWN0b3NBcGxTdW1hVmFsb3IpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvICs9ICtvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgKz0gK29NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBNM1Byb2Nlc28gZW5jYWJlemFkbyBpdGVtcywgZGVzZGUgcHJvZHVjdG8gZ2VuZXJhbFxyXG4gICAgcHVibGljIExvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmxJdGVtKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvZW5jYWJlemFkb0l0ZW1zOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb1BhZHJlTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gdW5kZWZpbmVkLCB2YWxvckRlc2N1ZW50byA9IDApOiBNM1BFbmNJdGVtcyB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHZhciBkUFJFQ0lPVW5pdEJhc2UgPSAwO1xyXG4gICAgICAgIHZhciBpbmZOaXZlbGVzUHJjaW87XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG9zVG90YWw6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRVbml0YXJpb01vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVW5pdGFyaW9Qcm9tbzogbnVtYmVyID0gMDtcclxuICAgICAgICAvL1ZlcmlmaWNhciBlbCBwcmVjaW8gYSB1c2FyLCB1c2FuZG8gbGEgbG9naWNhIGRlIG5pdmVsZXMgZGUgcHJlY2lvcy5cclxuICAgICAgICBpbmZOaXZlbGVzUHJjaW8gPSB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG4gICAgICAgIGlmICh2YWxvckRlc2N1ZW50byA+IDApIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPICogdmFsb3JEZXNjdWVudG8gLyAxMDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAtIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gdGhpcy5DYWxjdWxhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vVmFsaWRhIHNpIGVsIHByb2R1Y3RvIGVzdMOhIHJlc3RpbmdpZG9cclxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhclByb2R1Y3RvUmVzdHJpbmdpZG8ob1Byb21vY2lvblByb2Nlc2FkYSkpIHtcclxuICAgICAgICAgICAgdGhpcy5Bc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzKG9NM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXMpO1xyXG5cclxuICAgICAgICAgICAgLy9DYWxjdWxvIGRlbCB0b3RhbCBkZSBwdW50b3MgeSBlbCB2YWxvciB0b3RhbCBkZSBsYSBwcm9tb2Npw7NuIHBvciBsYSBjcWFudGlkYWQgZGUgcHJvZHVjdG9zIGRlIGxhIG1pc21hIHJlZmVyZW5jaWFcclxuICAgICAgICAgICAgZFVuaXRhcmlvTW9uZWRlcm8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybzsgLy9Vbml0YXJpbyBNb25lZGVyb1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy9ObyBzZSB1dGlsaXphLCBzZSBkZWphIHBhcmEgdXNvcyBhZGVsYW50ZVxyXG5cclxuICAgICAgICAgICAgZFVuaXRhcmlvUHJvbW8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uOyAvL1Byb21vY2lvbiB1bml0YXJpb1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vTm8gc2UgdXRpbGl6YSwgc2UgZGVqYSBwYXJhIHVzb3MgYWRlbGFudGVcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zRGV0Q3Vwb25lcyA9IHRoaXMuZ2V0X2xpc3RfY3Vwb25lc19mcm9tX3Byb21vKG9Qcm9tb2Npb25Qcm9jZXNhZGEsICtvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FsY3VsbyBkZSBwcmVjaW8gdG90YWwsIGRlc3B1ZXMgZGUgcHJvbW9jaW9uZXNcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9DYXJnYXIgcHJvZHVjdG8gXHJcbiAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0byA9IG9NM1ByZEdlbmVyYWwuU0tVO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTG90ZSA9IG9NM1ByZEdlbmVyYWwuTE9URTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw7NnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5PcmRlbiA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9lbmNhYmV6YWRvSXRlbXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTm9tYnJlID0gb00zUHJkR2VuZXJhbC5OT01CUkUxO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuRElTUE9OSUJMRSA9IG9NM1ByZEdlbmVyYWwuRElTUE9OSUJMRTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlBhdGhJbWFnZSA9IG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuQ29kaWdvQmFycmFzID0gb00zUEl0ZW1zV0VCLkNvZGlnb0JhcnJhcztcclxuICAgICAgICAgICAgaWYgKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uTTNVYmlBZGljaW9uYWxlcyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgdWJpSW1wRmlqbyA9IG9NM1ViaWNhY2lvbi5NM1ViaUFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkF0cmlidXRvID09IFwiSU1QRklKT1wiKTtcclxuICAgICAgICAgICAgICAgIGlmICh1YmlJbXBGaWpvICYmIHViaUltcEZpam8uVmFsb3IgIT0gXCJcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCA9IHViaUltcEZpam8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2Uob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgdGhpcy5vTWF0aFRGLnJvdW5kKGJpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCksIDIpKTtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZFBSRUNJT1VuaXRCYXNlID0gcFRvdGFsQmFzZSAvIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkVG90YWxJbXB1ZXN0b3NUb3RhbCA9IHRoaXMuTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgb00zUEVuY0l0ZW1zLCBwVG90YWxCYXNlLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKTtcclxuICAgICAgICAgICAgLyoqIElOSUNJTyBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpLCBcIkZFQ0hBSU5cIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc09ic2VxdWlvLnRvU3RyaW5nKCksIFwiRVNPQlNFUVVJT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5TS1AxLCBcIlBSRF9FU1RJTE9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIFwiQ1RCTERJTVBQUkRcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5vYnNlcnZhY2lvbi50b1N0cmluZygpLCBcIk9CU0VSVkFDSU9OXCIpKTsgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuLCBcIlBBVEhJTUFHRU5cIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc1Byb2R1Y3RvUHJvbW8udG9TdHJpbmcoKSwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShwcm9kR1JQU2VsZWN0ZWQuVElQTywgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlVuaWRhZCwgXCJVTklEQURcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFNSViwgXCJDTEFWRVBST0RTRVJWXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQsIFwiQ0xBVkVVTklEQURcIikpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEl0ZW1zSW50ZXJmYXoob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgdGhpcy5BZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICB0aGlzLmNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQilcclxuICAgICAgICAgICAgdGhpcy5Mb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vIExpc3RhIGRlIFByb21vY2lvbmVzIFxyXG4gICAgICAgICAgICAvKipGSU4gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG5cclxuICAgICAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkUFJFQ0lPVW5pdEJhc2UudG9TdHJpbmcoKSwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVG90YWxJbXB1ZXN0b3NUb3RhbC50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgodGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVFU1RPU1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gK2RUb3RhbEltcHVlc3Rvc1VuaXRhcmlvKS50b1N0cmluZygpLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3MgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtkUFJFQ0lPVW5pdEJhc2UgKyArZFVuaXRhcmlvUHJvbW8pLnRvU3RyaW5nKCksIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3RvcyAvLy0tLS0tLSBOdW5jYSBDYW1iaWEgLy9GUyAyMDE5MDcyNSBDb3JyZWNjaW9uIGVuIGxhIGZvbXJhIGRlIGNhbGN1bGFybG9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8udG9TdHJpbmcoKSwgXCJQVU5JVFwiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvICAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbC50b1N0cmluZygpLCBcIlBVTklUTkVUT1wiKSk7Ly9Db24gZGVzY3VlbnRvIGluY2x1aWRvLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRVbml0YXJpb01vbmVkZXJvLnRvU3RyaW5nKCksIFwiVU5JVEZJREVMXCIpKTsvL1VuaXRhcmlvIGZpZGVsaXphY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvUHJvbW8udG9TdHJpbmcoKSwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdzSWRrYXRpb3MgPT0gXCJDVE5cIikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpc3RhU1IgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM0xpc3RhUHJlY2lvLmZpbmQoeCA9PiB4LklETElTVEEgPT0gXCIyXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RhU1IpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZCh4ID0+IHguSURMSVNUQSA9PSBcIjJcIikuUFJFQ0lPLnRvU3RyaW5nKCksIFwiUFJFQ0lPU1JcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgICAgICAvLyAqKiogSW5mb3JtYWNpb24gZGUgYWNjaW9uZXMgZW4gZWwgY2xpZW50ZSAqKipcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5lbmNvbnRyYWRvTG9jYWwpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJMT0NBTFwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJTRVJWSURPUlwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL2lmICghb1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAoK29NM1Byb2Nlc29zLlZhbG9yKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yKSAvLyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAoK29NM1Byb2Nlc29zLlZhbG9yTmV0bykgKyAoK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgLy9WZXJpZmljYXIgb2JzZXF1aW9zIGRlbCBwcm9kdWN0byBxdWUgc2UgaW5ncmVzbyBhbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJPYnNlcXVpb3Mob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy50dXJuT25Qcm9tb3Mob1Byb21vY2lvblByb2Nlc2FkYSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXSA9IFwiUHJvZHVjdG8gUmVzdHJpbmdpZG9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRW5jSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHRydWUgc2kgZXN0ZSBwcm9kdWN0byBzZSBlbmN1ZW50cmEgcmVzdHJpbmdpZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhclByb2R1Y3RvUmVzdHJpbmdpZG8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9tb1Jlc3RyaW5naWRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9SZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgICAvKipcclxuICAgICAqIEV4Y2x1eWUgdG9kb3MgbG9zIGltcHVlc3RvcyBkZWphbmRvIHNvbG8gZWwgRklKTyBzaSBlcyBkZSBsYSB1YmljYWNpb24gZGFkYSBcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBHZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShsaXN0YSwgYXRyaWJ1dG8pIHtcclxuICAgICAgICBpZiAobGlzdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgbGlzdElEID0gbGlzdGEubWFwKHggPT4geFthdHJpYnV0b10pO1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgbGlzdElEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsb3JlcyBDYWxjdWxhZG9zIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkQ2FudGlkYWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZENhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICAvKiogSU5JQ0lPIFZBTE9SRVMgRElOQU1JQ09TICovXHJcbiAgICAgICAgLy8gdmFyIGRUb3RhbEltcHVlc3RvcyA9ICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIilcclxuICAgICAgICAvLyB2YXIgZFN1YlRvdGFsID0gTWF0aC5yb3VuZCgoK2RQcmVjaW9Ub3RhbFNpbkR0byAtICtkVG90YWxJbXB1ZXN0b3MpICogMTAwKSAvIDEwMDtcclxuXHJcbiAgICAgICAgbGV0IHN1YlRvdGFsID0gMDtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxTaW5EdG8gPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbEltcHVlc3Rvc1xyXG4gICAgICAgIC8vQWdyZWdhciBJbXB1ZXN0b3NcclxuICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBBcnJlZ2xvIGVuIGVsIGNhbGN1bG8gZGUgdG90YWxlcyBlbiBjYXNvIGRlIGhhYmVyIGltcHVlc3Rvc1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy9TdWJ0b3RhbCBTdW1hcyBkZSBsYXMgYmFzZXNcclxuICAgICAgICAgICAgc3ViVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoKCh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkgKyAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlZVTklUUFJPTU9cIikpKSwgMik7XHJcbiAgICAgICAgICAgIHRvdGFsSW1wdWVzdG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXMsIFwiVmFsb3JcIik7XHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gc3ViVG90YWwgKyB0b3RhbEltcHVlc3RvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vU2UgYXN1bWUgcXVlIG5vIGhheSBpbXB1ZXN0b3MgZW50b25jZXMgZWwgc3ViVG90YWwgZXMgaWd1YWwgYWwgcHJlY2lvVG90YWxTaW5EdG9cclxuICAgICAgICAgICAgcHJlY2lvVG90YWxTaW5EdG8gPSB0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIiksIDIpO1xyXG4gICAgICAgICAgICBzdWJUb3RhbCA9IHByZWNpb1RvdGFsU2luRHRvO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBkQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDQU5USURBRFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKHRvdGFsSW1wdWVzdG9zLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVFU1RPU1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFVuaXRhcmlvQnlUb3RhbChkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVFU1RPU1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVTklUXCIpO1xyXG5cclxuICAgICAgICAvL0xhIGZpZGVsaXphY2lvbiBlcyB1biBwb3JjYW50YWplIHBvciBlbmRlIG5vIGRlYmUgbXVsdGlwbGljYXJzZSB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCB0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJVTklURklERUxcIikudG9TdHJpbmcoKSwgXCJGSURFTElaQUNJT05cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlVOSVRGSURFTFwiKS5WYWxvciwgXCJGSURFTElaQUNJT05cIik7XHJcbiAgICAgICAgLy90aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVE5FVE9cIiksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpO1xyXG4gICAgICAgIC8vdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVE5FVE9cIikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxSRUFMXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHByZWNpb1RvdGFsU2luRHRvLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxTSU5EVE9cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgc3ViVG90YWwudG9TdHJpbmcoKSwgXCJTVUJUT1RBTFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyksIFwiRlVUXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlZVTklUUFJPTU9cIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFJFQ0lPVU5JVEJBU0VcIiksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMQkFTRVwiKTsgLy9QcmVjaW8gU2luIGltcHVlc3RvcyAgICAgICAgXHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgoc3ViVG90YWwgKyArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMSU1QVUVTVE9TXCIpLlZhbG9yIC0gK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIik7XHJcblxyXG4gICAgICAgIC8qKiBGSU4gVkFMT1JFUyBESU5BTUlDT1MgKi9cclxuXHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoID4gMCAmJiBkQ2FudGlkYWQgPT0gMCkgey8vU2kgbGEgY2FudGlkYWQgZXMgMCBzaWduaWZpY2EgcXVlIHNlIGVzdMOhIGJvcnJhbmRvIGVsIGl0ZW0gbyBlcyB1biBvYnNlcXVpbywgcG9yIGxvIHF1ZSBubyB0aWVuZSBzZW50aWRvIHF1ZSB0ZW5nYSBNM1BJbXB1ZXN0b1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBzdW1hdG9yaWEgZGUgbG9zIHZhbG9yZXMgZGUgdW4gYXRyaWJ1dG8gZGFkbyBkZWwgYXJyZWdsbyBkZSBpbXB1ZXN0b3NcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gYXRyaWJ1dG8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBhdHJpYnV0bzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc3VtYXRvcmlhID0gMDtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wdWVzdG8gPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zW19pXTtcclxuICAgICAgICAgICAgc3VtYXRvcmlhID0gc3VtYXRvcmlhICsgKCtpbXB1ZXN0b1thdHJpYnV0b10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHN1bWF0b3JpYSwyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFncmVnYXJJbXB1ZXN0byhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGRldF9jdGJsZF9pbXBfcHJkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNUQkxESU1QUFJEXCIpO1xyXG4gICAgICAgIGxldCBkZXRfcHJlY2lvX3VuaXRfYmFzZSA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKTtcclxuICAgICAgICBsZXQgdmFsb3JUb3RhbEltcHVlc3RvczogbnVtYmVyID0gMDtcclxuICAgICAgICBpZiAoZGV0X2N0YmxkX2ltcF9wcmQgJiYgZGV0X3ByZWNpb191bml0X2Jhc2UpIHtcclxuICAgICAgICAgICAgdmFsb3JUb3RhbEltcHVlc3RvcyA9IHRoaXMuTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwoZGV0X2N0YmxkX2ltcF9wcmQuVmFsb3IsIG9NM1BFbmNJdGVtcywgK2JpZ0RlY2ltYWwubXVsdGlwbHkoZGV0X3ByZWNpb191bml0X2Jhc2UuVmFsb3IsIGNhbnRpZGFkKSwgY2FudGlkYWQsICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub01hdGhURi5yb3VuZCh2YWxvclRvdGFsSW1wdWVzdG9zLDIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCB2YWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGV0OiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgb0RldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gc0NvbmNlcHRvKTtcclxuICAgICAgICBpZiAob0RldCkge1xyXG4gICAgICAgICAgICAvLyBFeGlzdGUgQWN0dWFsaXphXHJcbiAgICAgICAgICAgIG9EZXQuVmFsb3IgPSB2YWxvcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL05vIGV4aXN0ZSBhZ3JlZ2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvci50b1N0cmluZygpLCBzQ29uY2VwdG8pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHRvdGFsXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgTnVldmEgQ2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NVbml0YXJpbyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRUb3RhbEJ5VW5pdGFyaW8oY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1VuaXRhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdW5pdGFyaW8gPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NVbml0YXJpbykuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArYmlnRGVjaW1hbC5tdWx0aXBseSh1bml0YXJpbywgY2FudGlkYWQpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHVuaXRhcmlvXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NUb3RhbCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRVbml0YXJpb0J5VG90YWwoY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1RvdGFsOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoK2NhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gRGVzY1RvdGFsKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICt0b3RhbCAvICtjYW50aWRhZDtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIHJlbGFjaW9uYWRvcyBjb24gbGEgaW5mb3JtYWNpb24gZGUgc3cgZXh0ZXJuby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGd1YXJkYXLDoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDoSBsYSBpbmZvcm1hY2nDs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJdGVtc0ludGVyZmF6KG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0FkaWNpb25hbGVzRmlsdGVyOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPjtcclxuICAgICAgICAgICAgb0FkaWNpb25hbGVzRmlsdGVyID0gb0FkaWNpb25hbGVzLmZpbHRlcihhID0+IGEuQVRSSUJVVE8uc3RhcnRzV2l0aChcIkNTSUFfXCIpKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXNGaWx0ZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzRmlsdGVyW2ldLlZBTE9SLCBvQWRpY2lvbmFsZXNGaWx0ZXJbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw6EgbG9zIG51ZXZvcyBhdHJpYnV0b3MuXHJcbiAgICAgKiBAcGFyYW0gb0FkaWNpb25hbGVzIERlc2RlIGRvbmRlIHNlIHNhY2Fyw6EgbGEgaW5mb3JtYWNpw7NuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9BZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQURDX1wiICsgb0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQ0FNQURDX1wiICsgb00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBOb21icmUsIElELiBhIGRldGFsbGUgZGVsIGVuY2FiZXphZG8gZGUgcHJvZHVjdG8gYWdyZWdhZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIEluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIHByb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQ6IG51bWJlciwgYXBsaWNhZGFzID0gdHJ1ZSkge1xyXG4gICAgICAgIHZhciBzTm9tYnJlczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc0lkczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc1ZhbG9yZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYXBsaWNhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+ICF4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhID0geyBcIk5PTUJSRVNcIjogc05vbWJyZXMsIFwiSURcIjogc0lkcywgXCJWQUxPUkVTXCI6IHNWYWxvcmVzIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBzTm9tYnJlcyBcclxuICAgICAqIEBwYXJhbSBzSWRzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQpXHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLk5PTUJSRVMsIFwiTk9NQl9QUk9NT0NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuSUQsIFwiSURfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLlZBTE9SRVMsIFwiVkFMX1BST01PQ1wiKSk7XHJcblxyXG4gICAgICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacOzblxyXG4gICAgICAgICAgICBsZXQgbGlzdE5vbWJyZSA9IGRhdGEuTk9NQlJFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RJZCA9IGRhdGEuSUQucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0VmFsb3IgPSBkYXRhLlZBTE9SRVMucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3RJZFtfaV0sIFwiSURfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdFZhbG9yW19pXSwgXCJWQUxfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkLCBmYWxzZSlcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuTk9NQlJFUywgXCJOT01CX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5JRCwgXCJJRF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuVkFMT1JFUywgXCJWQUxfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGEgZGV0YWxsZSBpbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIGluZk5pdmVsZXNQcmNpbyBJbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgY2FyZ2Fyw6EgbGEgaW5mb3JtYWNpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWREZXRhbGxlTml2ZWxlc1ByZWNpbyhpbmZOaXZlbGVzUHJjaW8sIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAoaW5mTml2ZWxlc1ByY2lvICYmIGluZk5pdmVsZXNQcmNpby5OSVZFTCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoaW5mTml2ZWxlc1ByY2lvLk5JVkVMLCBcIk5JVkVMUFJFQ0lPXCIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgY29uIHF1ZSBuaXZlbCBkZSBwcmVjaW8gdmEgYSB0cmFiYWphclxyXG4gICAgICogQHBhcmFtIHByb2RHUlBTZWxlY3RlZCBFbCBwcm9kdWN0byBpbmdyZXNhZG9cclxuICAgICAqIEBwYXJhbSBpQ2FudGlkYWQgTGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSB2YSBhIGluZ3Jlc2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1ByZXNlbnRhY2lvbmVzOiBNM1ByZXNlbnRhY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgalJlc3BOaXZlbGVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMgJiZcclxuICAgICAgICAgICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZmluZCh4ID0+IGlDYW50aWRhZCA+PSB4LlRPUEUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1ByZXNlbnRhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTTNQcmVzZW50YWNpb25lcy5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcE5pdmVsZXMgPSB7IFwiUFJFQ0lPXCI6IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SLCBcIk5JVkVMXCI6IG9NM1ByZXNlbnRhY2lvbmVzLk5JVkVMUFJTIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGpSZXNwTml2ZWxlcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcmVjaW9CeU5pdmVsZXNHZW5lcmFsKG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbCwgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJlc2VudGFjaW9uZXM6IE0zUHJlc2VudGFjaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcE5pdmVsZXMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMgJiYgb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMgPSBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZpbmQoeCA9PiBpQ2FudGlkYWQgPj0geC5UT1BFKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcmVzZW50YWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwTml2ZWxlcyA9IHsgXCJQUkVDSU9cIjogb00zUHJlc2VudGFjaW9uZXMuVkFMT1IsIFwiTklWRUxcIjogb00zUHJlc2VudGFjaW9uZXMuTklWRUxQUlMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4galJlc3BOaXZlbGVzO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBjdXBvbmVzIGdlbmVyYWRvcyBkZSBsYSBsaXN0YSBkZSBwcm9tb3Byb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY3Vwb25lc19mcm9tX3Byb21vKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlcik6IEFycmF5PE0zUERldGFsbGVDdXBvbj4ge1xyXG4gICAgICAgIHZhciBsaXN0X2N1cG9uZXMgPSBBcnJheTxNM1BEZXRhbGxlQ3Vwb24+KCk7XHJcblxyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbW9fYXNvY2lhZGEgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhc1tfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vX2Fzb2NpYWRhLklkQ3Vwb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vwb24gPSBuZXcgTTNQRGV0YWxsZUN1cG9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3Vwb24uSWRDdXBvbiA9IHByb21vX2Fzb2NpYWRhLklkQ3Vwb247XHJcbiAgICAgICAgICAgICAgICAgICAgY3Vwb24uQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0X2N1cG9uZXMucHVzaChjdXBvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2N1cG9uZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Bc2lnbmFyIGEgcHJvbW9jaW9uZXMgY29tYmlhbmFzIGRlc2RlIGxvIHF1ZSBzZSBlbmNvbnRyw7MgYWwgZW5jYWJlemFkbyBpdGVtLCBkZWwgcHJvZHVjdG8gc2VsZWNjaW9uYWRvXHJcbiAgICBwdWJsaWMgQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW9Bc28gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBhZ3JlZ2EgcHJvbW9jaW9uIGNvbWJpbmFkYSBhIGVuY2FiZXphZG8gZGUgaXRlbXMuXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcy5wdXNoKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8vQWdyZWdhciBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyksIFwiUFJPTU9DT01CSVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhc0FNM1Byb2Nlc28ob00zUHJvY2Vzb3MsIHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzaWduYXIgcHJvbW9jaW9uZXMgY29tYmlhbmRhcyBhIE0zIFByb2Nlc28sIGVzdGUsIHZhbGlkYSBxdWUgbm8gZXhpc3RhIHVuIHByb21vY2lvbiBhbnRlcmlvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpKSB7XHJcbiAgICAgICAgICAgIC8vLy8vLy8gZXhpc3RlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vLy8vIE5vIEV4aXN0ZVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLnB1c2gob1Byb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGRpbmFtaWNhcyBwcm9jZXNvIGRlIGNvbWJpbmFkYXNcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhc0ZpbmRlZDogTTNQRGluYW1pY2FzO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQgPSBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBpZiAob00zUERpbmFtaWNhc0ZpbmRlZCkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4gPSBKU09OLnBhcnNlKG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyclByb21vLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb21vQ29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gYXJyUHJvbW9baV0uSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9Db21iaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMucHVzaChhcnJQcm9tb1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IFwiQ09NQklOQURBXCI7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsbyBkZSBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgIHZhciBsVGlwb3MgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiRElSRUNUQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1PTkVERVJPXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiTUFOVUFMXCIpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNFTkNQUk9NTyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGFyclByb21vID0gb3Byb21vY2lvbmVzU2VydmljZS5WZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBsVGlwb3MpO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJQcm9tb2Npb24oYXJyUHJvbW8sIHByb2RHUlBTZWxlY3RlZCwgb00zRU5DUFJPTU8sIHRoaXMuZ3NJZGthdGlvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGhheSBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgeSBhZ3JlZ2FybG9zLlxyXG4gICAgcHVibGljIFZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcihwcm9tbyA9PiBwcm9tby5MaXN0T2JzU0tVICE9IG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb21vLkxpc3RPYnNTS1UubGVuZ3RoKSBwcm9tby5MaXN0T2JzU0tVID0gW3Byb21vLkxpc3RPYnNTS1VdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tbywgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gcHJvbW8uSURQcm9tb2Npb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vLCBvTTNQRW5jSXRlbXMsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLmxJZEFjdGl2YVByb21vICYmIHByb21vLmxJZEFjdGl2YVByb21vLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAmJiBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubElkQWN0aXZhUHJvbW8gPSB0aGlzLmxJZEFjdGl2YVByb21vLmNvbmNhdChwcm9tby5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEdXBsaWNhdGVzKHRoaXMubElkQWN0aXZhUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVEdXBsaWNhdGVzKGFycjogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciB1bmlxdWUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pcXVlLmluZGV4T2YoYXJyW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHVuaXF1ZS5wdXNoKGFycltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc1NLVShwcm9tbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgY2FudGlkYWRSZWFsID0gTWF0aC5mbG9vcihjYW50aWRhZCAvIHByb21vLkNhbnRpZGFkT2JzZXEpO1xyXG4gICAgICAgIGlmIChwcm9tby5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSBjYW50aWRhZFJlYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHByb21vLkxpc3RPYnNTS1UuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZFJlYWwgKiArZWxlbWVudC5DYW50aWRhZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gcHJvbW8uTGlzdE9ic1NLVTtcclxuICAgIH1cclxuXHJcbiAgICBhc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChwcm9tby5MaXN0T2JzU0tVLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGNvbWJpLkFjY2lvbi5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8ob2JzZXF1aW9zLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9ic2VxdWlvcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvcm5hIHRydWUgc2kgaGF5IG90cmEgcHJvbW8gYXBsaWNhZGEgZG9uZGUgbmkgbGEgcHJvbW8gZGUgb2JzZXF1aW8gbyBsYSBhcGxpY2FkYSBzb24gZmlqYXMgeSB1bmEgZGUgbGFzIGRvcyBlcyBFWENcclxuICAgIHZhbGlkYVNpVGllbmVPdHJhUHJvbW8ocHJvbW9PYnNlcXVpbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAocHJvbW9PYnNlcXVpby5SZWdsYSAhPSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgIGxldCBvUHJvbW9zTm9PYnNlcXVpb3MgPSBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LklEUHJvbW9jaW9uICE9IHByb21vT2JzZXF1aW8uSURQcm9tb2Npb24pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9Qcm9tb3NOb09ic2VxdWlvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uQXBsaWNhZGEgJiYgKHByb21vLlJlZ2xhID09IFwiRVhDXCIgfHwgcHJvbW9PYnNlcXVpby5SZWdsYSA9PSBcIkVYQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9wcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvc1xyXG4gICAgcHVibGljIGFzeW5jIFByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9IC0xO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3MgIT0gbnVsbCAmJiB0aGlzLm9MaXN0YU9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLlNLVSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA4MTAgdmFsaWRhLCBjdWFudG9zIHByb2R1Y3RvcyBzZSBhZ3JlZ2EgZW4gZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5DYW50aWRhZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTExMiBzZSBhZ3JlZyBmdW5jaW9uYWxpZGFkIGRlIG9ic2VxdWlvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLmlkRW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbiA9IFwiT0JTUVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkd1YXJkYXJQcm9tb2Npb24odGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9HdWFyZGFyIHByb21vY2lvbiBzZWd1biB1biBza3VcclxuICAgIC8vMS4gQnVzY2FyIGVsIHByb2R1Y3RvIHNlZ3VuIGVsIHNrdVxyXG4gICAgLy8yLiBBZ3JlZ2FyIGVsIHByb2R1Y3RvIGEgbTNwcm9jZXNvc1xyXG4gICAgLy8zLiBBZ3JlZ2FyIGFsIGNhcnJpdG8gZGUgY29tcHJhcy5cclxuICAgIHB1YmxpYyBhc3luYyBHdWFyZGFyUHJvbW9jaW9uKHByb21vLCBvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vIDIwMTgxMTIxICB2YXIgc0tleUNhcnJpdG87XHJcbiAgICAgICAgLy8gMjAxODExMjEgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBwcm9jZXNvUHJvbW87XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvLyAyMDE4MTEyMSBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG5cclxuICAgICAgICAvLyAyMDE4MTEyMSBvTTNQcm9jZXNvcyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHByb2Nlc29Qcm9tbyA9IGF3YWl0IHRoaXMuQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb0RhdGFVc2VyKTtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gcG91Y2ggREJcclxuICAgICAgICAvLyAyMDE4MTEyMSAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgcHJvY2Vzb1Byb21vKTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgbG9zIHByb2R1Y3RvIHNlZ3VuIHN1IFNLVSwgc2FjYW5kbyBsYSBpbmZvcm1hY2lvbiBkZXNkZSBwb3VjaERCLlxyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hclByb21vY2lvbkFQcm9jZXNvKHByb21vLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IHRoaXMuR2V0UHJvZHVjdG9CeVNLVShwcm9tby5TS1UsIEVuTGluZWEsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcob1Byb2R1Y3RvKTtcclxuICAgICAgICBpZiAob1Byb2R1Y3RvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy9ZYSBubyBzZSBkZWphIHByZWNpbyBjZXJvIHNpbm8gcXVlIGNvbW8gZXMgb2JzZXF1aW8gc2ltdWxhIHVuIGRlc2N1ZW50byBkZWwgMTAwJSBcclxuICAgICAgICAgICAgLy9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgICAgICAgICAgLy9BZ3JlZ2FyIGEgbTNwcm9jZXNvcyBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgLy9vTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBvUHJvZHVjdG8sIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5hZGR0b2NhcnQob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8sIG51bGwsIG51bGwsIG9EYXRhVXNlciwgdGhpcy5nc0lka2F0aW9zLCBvTTNVYmljYWNpb24sIG51bGwsIG9NM1Byb2Nlc29zLCBudWxsLCAxMDApOy8vKlNlIG1hbmRhIHZhbG9yIGRlIGRlc2N1ZW5udG8gMTAwICVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBzZWd1biBlbCBTS1VcclxuICAgIHB1YmxpYyBhc3luYyBHZXRQcm9kdWN0b0J5U0tVKHNTS1UsIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSwgZGlzcG9uaWJsZU0zRW5jID0gbnVsbCkge1xyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RvcztcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHRoaXMuZ3NJZGthdGlvcyk7XHJcblxyXG4gICAgICAgIC8vb1NlcnZpY2VMaXN0YVByZWNpby5HZW5lcmF0ZURhdGFWYWxpZGFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28pO1xyXG4gICAgICAgIGlmICghRW5MaW5lYSAmJiAhb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSB7XHJcbiAgICAgICAgICAgIHZhciBzSURQcm9kdWN0b3MgPSB0aGlzLmdzSWRrYXRpb3MgKyBcIj9QUkRcIjtcclxuICAgICAgICAgICAgcHJvZHVjdG9zID0gYXdhaXQgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRFByb2R1Y3Rvcyk7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0byA9IG9TZXJ2aWNlTTNNYWVzdHJvLkdldE0zUHJkR3JwRnJvbUxpc3QocHJvZHVjdG9zLk0zTGlzdFByb2R1Y3Rvcy5NM0dSUCwgc1NLVSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmModGhpcy5Hb1Bvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZGthdGlvcywgc1NLVSwgb0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDw9IDAgJiYgZGlzcG9uaWJsZU0zRW5jKSB7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFID0gZGlzcG9uaWJsZU0zRW5jO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCB0aGlzLkdvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLlZhbGlkYXJMaXN0YVByZWNpb3Mob1Byb2R1Y3RvLCB0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsYXIgcHJlY2lvIHNpbiBpbXB1ZXN0b3MuIExhIGZvcm1hIGVzIGNhbGN1bGFyIHRvZG8gZWwgdmFsb3IgZGVsIGltcHVlc3RvLiBFSjogMTIwLjA5IC8gMS4xNi4gU2kgZWwgdmFsb3IgZGVsIGltcHVlc3RvIGVzOiAxNiVcclxuICAgIHB1YmxpYyBDYWxjdWxhdGVQcmVjaW9CYXNlKENUQkxESU1QUFJEOiBzdHJpbmcsIGRWYWxvck5ldG86IG51bWJlcikge1xyXG4gICAgICAgIC8vdmFyIGRWYWxvckltcHVlc3RvOiBudW1iZXIgPSAxO1xyXG4gICAgICAgIHZhciBkVmFsb3JCYXNlOiBudW1iZXIgPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIGpJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAgMjAxOTA2MjYgQ2FtYmlvIGRlIGNhbGN1bG8gZGUgYmFzZSBkZSBsb3MgaW1wdWVzdG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkVmFsb3JCYXNlID0gKCtkVmFsb3JCYXNlKSAvICgxICsgK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC0gKCtpbXAuJC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhvTTNQRW5jSXRlbXMuTTNJbXB1ZXN0b3MpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhdGNoXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3JldHVybiAoKCtkVmFsb3JOZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgICAgICByZXR1cm4gZFZhbG9yQmFzZTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBpbmZvcm1hY2nDs24gZGUgaW1wdWVzdG9zLCBkZXNkZSBlbCBwcm9kdWN0byBnZW5lcmFsXHJcbiAgICBwdWJsaWMgTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwoQ1RCTERJTVBQUkQ6IHN0cmluZywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyxcclxuICAgICAgICBkVmFsb3JOZXRvOiBudW1iZXIsIGNhbnRpZGFkOiBudW1iZXIsIHZhbG9yVG90YWxQcm9kdWN0b1VuaXQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIG9NM1BJbXB1ZXN0b3M6IE0zUEltcHVlc3RvcztcclxuICAgICAgICAgICAgbGV0IHZhbG9yQmFzZVRvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKGRWYWxvck5ldG8sIDQpO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JOZXRvVG90YWwgPSB2YWxvckJhc2VUb3RhbDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JUb3RhbFByb2R1Y3RvVW5pdCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgdmFyIGRUb3RhbEltcHVlc3RvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBpZiAoQ1RCTERJTVBQUkQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3RvcyA9IG94bWxUb0pzb25URi5jb252ZXJ0WG1sVG9Kc29uKENUQkxESU1QUFJEKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA2MjYgQ2FtYmlvIGVuIG9yZGVuIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JSZWFsSW1wID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wID0gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE9baV07XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3RvcyA9IG5ldyBNM1BJbXB1ZXN0b3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvID0gaW1wLiQuQ29kSW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuUG9yY2VudGFqZSA9IGltcC4kLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikgey8vUE9SQ0VOVEFKRVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvclJlYWxJbXAgPSArYmlnRGVjaW1hbC5tdWx0aXBseShpbXAuJC5WYWxvciwgdmFsb3JOZXRvVG90YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlZhbG9yID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yUmVhbEltcCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvTTNQSW1wdWVzdG9zLlZhbG9yIDwgdmFsb3JSZWFsSW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5jZWlsKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5mbG9vcigrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Ugey8vRklKT1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvclJlYWxJbXAgPSAraW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxODA5MTIgTnVldm8gY29uY2VwdG8gZGUgYmFzZVxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvck5ldG9Ub3RhbCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSB0aGlzLm9NYXRoVEYucm91bmQoKCtkVG90YWxJbXB1ZXN0byksMikgKyB0aGlzLm9NYXRoVEYucm91bmQoKCtvTTNQSW1wdWVzdG9zLlZhbG9yKSwyKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxODA5MTIgU3VtYSBkZSBWYWxvciBOZXRvXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsb3JOZXRvVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoKCt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JOZXRvVG90YWwsIDIpKSArIHRoaXMub01hdGhURi5yb3VuZCgoK29NM1BJbXB1ZXN0b3MuVmFsb3IpLDIpLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLy9Tb2xvIGFkaWNpb25lIGEgaW1wdWVzdG9zLCBjdWFuZG8gZXMgdG90YWwgaW1wdWVzdG9zXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltcEV4aXN0ZTogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcEV4aXN0ZSA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZmluZChpbXAgPT4gaW1wLkNvZEltcHVlc3RvID09IG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBFeGlzdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Cb3JyYSBlbiBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MgPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZpbHRlcihpbXAgPT4gaW1wLkNvZEltcHVlc3RvICE9IG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLnB1c2gob00zUEltcHVlc3Rvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcyNiBzZSBhZ3JlZ2EgdmFsaWRhY2lvbiwgeWEgcXVlIGVzdGFiYSBxdWVkYW5kbyBsYSByZXN0YSwgY29uIHZhbG9yZXMgY29tbzogMC4wMDAwMDAwMDAwMSA9IDEuMTU2NDU2NDU2NGU4NDUgRUpcclxuICAgICAgICAgICAgaWYgKGRUb3RhbEltcHVlc3RvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vRGlmZXJlbmNpYSByZWRvbmRlYWRhIGEgZG9zIGRlY2ltYWxlc1xyXG4gICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSB0aGlzLm9NYXRoVEYucm91bmQoZFRvdGFsSW1wdWVzdG8sIDIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQoKCt2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtICt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JCYXNlVG90YWwsMikgLSArZFRvdGFsSW1wdWVzdG8pLCAyKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hTihkaWZlcmVuY2lhKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQoKygrdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSArdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yQmFzZVRvdGFsLCAyKSAtICtkVG90YWxJbXB1ZXN0bykudG9GaXhlZCg0KSwyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtcywgZGlmZXJlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXCJUT1RBTElNUFVFU1RPU1wiXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKCh2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtIHRoaXMub01hdGhURi5yb3VuZCh2YWxvckJhc2VUb3RhbCwyKSksIDIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRlMgMjAxOTA3MjVcclxuICAgICAqIENvcnJpZ2UgZWwgdmFsb3IgcXVlIHRvbW8gZWwgaW1wdWVzdG8gZGVzcHVlcyBkZSBoYWJlcnNlIHJlZG9uZGVhZG9cclxuICAgICAqIFNpIGFsIHJlY29ycmVyIHRvZG9zIGxvcyBpbXB1ZXN0b3MgbGEgZGlmZXJlbmNpYSBubyBzZSB6YW5qYSwgTkkgTU9ET1MgZWwgZXJyb3IgZXN0w6EgZW4gb3RyYSBwYXJ0ZVxyXG4gICAgICogU2UgY3JlYSBlc3RhIGZ1bmNpw7NuIHBhcmEgcmVzb2x2ZXIgbG9zIGVycm9yZXMgZGUgdGltYnJhZG8gZGUgZmFjdHVyYSBlbGVjdHLDs25pY2FcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBEaWZlcmVuY2lhIHF1ZSBzZSBkZWJlIHNhbGRhciBwYXJhIGNvbnNlZ3VpciBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgcmVxdWVyaWRvXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRpZmVyZW5jaWE6IG51bWJlcikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgcG9zaXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWVub3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhYmFqbyBxdWllcmUgZGVjaXIgcXVlIHNlIHB1ZG8gcmVkb25kZWFyIGhhY2lhIGFycmliYVxyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFycmliYVwiIHkgcmVzdGEgdW5hIGNlbnRlc2ltYSBhIGxhIGRpZmVyZW5jaWFcclxuICAgICAgICAgICAgICAgIGlmIChpbXB1ZXN0by5WYWxvciA8IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5WYWxvciA9IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG87XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZChpbXB1ZXN0by5WYWxvciAvIGltcHVlc3RvLlBvcmNlbnRhamUsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSBkaWZlcmVuY2lhIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vU2kgVmFsb3I+VmFsb3JSZWFsIHF1aWVyZSBkZWNpciBxdWUgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9TaSBsYSBkaWZlcmVuY2lhIGVzIG5lZ2F0aXZhIHF1aWVyZSBkZWNpciBxdWUgbGEgc3VtYSBkZSBsb3MgaW1wdWVzdG9zIGVzIG1heW9yIGEgbGEgcmVhbFxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vU2kgZWwgaW1wdWVzdG8gc2UgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYWJham9cclxuICAgICAgICAgICAgICAgIC8vRW50b25jZXMgbG8gXCJyZWRvbmRlYSBoYWNpYSBhYmFqb1wiIHkgc3VtYSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yID4gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcjxWYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhYmFqbyB5IG5vIGRlYmUgbW9kaWZpY2FyIGVzZSB2YWxvclxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIHlhIHNlIHNhbGRvIGxhIGRpZmVyZW5jaWEgcm9tcGUgZWwgY2ljbG8gZGFuZG8gcG9yIGNvbmNsdWlkbyBlbCBhanVzdGVcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Mb2FkIHBvciB1bmlkYWQgZGV0YWxsZSBkZWwgbTNwcm9jZXNvIGl0ZW1zLlxyXG4gICAgcHVibGljIExvYWRNM1BEZXRhbGxlKHNWYWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZyk6IE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtcy5Ob21icmVDb25jZXB0byA9IHNDb25jZXB0bztcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gc1ZhbG9yO1xyXG4gICAgICAgIHJldHVybiBvTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0dlbmVyYXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgcHVibGljIGFzeW5jIEdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgfHwgKG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgJiYgIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiUFVFTlRFX0RJQVJJT1wiKSkpIHtcclxuICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgbnVsbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Db21wYXJlIE0zUHJvY2Vzb3MuIChGaXJzdDogQFBhcmFtOiBpbE0zUHJvY2Vzb3NTUUwgVlMgU2Vjb25kOiBHZXQgRnJvbSBDb3VjaERCL1BvdWNoREIpXHJcbiAgICBwdWJsaWMgYXN5bmMgQ29tcGFyZU0zUHJvY2VzbyhzSURLYXRpb3M6IHN0cmluZywgb00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgaWxNM1Byb2Nlc29zU1FMOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9SZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIHZhciBQcm9wZXJ0eUNvbXBhcmUgPSBbXCJWYWxvck5ldG9cIiwgXCJWYWxvclwiXTtcclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcm9jZXNvc0NPVUNIOiBNM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICAvL0dldCBkYXRhLCBmcm9tIFBvdWNoREIvQ291Y2hEQlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNIID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcblxyXG4gICAgICAgICAgICAvL1N0YXJ0IENvbXBhcmVcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQcm9wZXJ0eUNvbXBhcmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbE0zUHJvY2Vzb3NTUUxbUHJvcGVydHlDb21wYXJlW2ldXSAhPSBvTTNQcm9jZXNvc0NPVUNIW1Byb3BlcnR5Q29tcGFyZVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYlJlc3ApIHtcclxuICAgICAgICAgICAgICAgIC8vQ29tcGFyZTogSUQsIElkUHJvZHVjdG8geSBDQU5USURBRFxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbE0zUHJvY2Vzb3NTUUwuTTNFTkMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JRCAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uSUQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JZFByb2R1Y3RvICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JZFByb2R1Y3RvIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IGJSZXNwLCBcIk0zUHJvY2Vzb3NcIjogb00zUHJvY2Vzb3NDT1VDSCB9O1xyXG4gICAgICAgICAgICByZXR1cm4gb1Jlc3A7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBDb21wYXJlTTNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IHRydWUsIFwiTTNQcm9jZXNvc1wiOiBudWxsIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FkaWNpb25hciBjb21lcmNpYWwgYWwgcHJvY2VzbywgbG8gYWRpY2lvbmEgYWwgYXJyZWdsbyBkZSBkaW5hbWljb3MgYXNvY2lhZG8gYWwgcHJvY2Vzby5cclxuICAgIHB1YmxpYyBBZGRDb21lcmNpYWxUb00zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgVGRvY0NvbWVyY2lhbDogc3RyaW5nLCBOZG9jQ29tZXJjaWFsOiBzdHJpbmcpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVENPTUVSQ0lBTFwiLCBUZG9jQ29tZXJjaWFsKSk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5DT01FUkNJQUxcIiwgTmRvY0NvbWVyY2lhbCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ3JlYWNpb24geSByZXRvcm5vIGRlIHR1cGxhIGRlIGRpbmFtaWNvcywgYXRhZG9zIGEgcHJvY2VzbyBtMy5cclxuICAgIHB1YmxpYyBDcmVhdGVUdXBsYURpbmFtaWNhKG5vbWJyZSwgdmFsb3IpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IG5vbWJyZTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gdmFsb3I7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRGluYW1pY2FzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9BY3R1YWxpemEgbGEgY2FudGlkYWQgZGUgXHJcbiAgICBwdWJsaWMgc2V0Q2FudGlkYWRBTExZVVBEQ291Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlDYW50aWRhZCkge1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIFwiV0VCXCIsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkdldENhcnJpdG9Db21wcmFzUG91Y2hEQihvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vL1NlIGNhbnRpZGFkIGRlIHVuIHByb2R1Y3RvIGVzcGVjaWZpY29cclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbixcclxuICAgICAgICBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIHRpcG9VYmljYWNpb24sIElERW5jLFxyXG4gICAgICAgIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBmb3J6YXJCb3JyYWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAoKGlDYW50aWRhZCA9PSAwICYmIG9NM1Byb2Nlc29zLklERGlhcmlvID09PSB1bmRlZmluZWQgJiYgdGlwb1ViaWNhY2lvbiA9PSBcIldFQlwiKSB8fCBmb3J6YXJCb3JyYWQpIHtcclxuICAgICAgICAgICAgLy8vQXVuIG5vIGVzdGEgcmVnaXN0cmFkbyBlbCBwcm9jZXNvIGNvbW8gdGFsLCBzZSBwdWVkZSBib3JyYXIgZGUgcmFpelxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgcHJvZC5JRCA9PSBJREVuYykgJiYgIShwcm9kLklkRW5jUGFkcmUgPT0gSURFbmMpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEpBR00gMjAxOTEwMjEsIG5vIGhhY2VyIGzDs2dpY2EgZGUgcHJvbW9jaW9uZXMgeSB2YXJpb3MsIGN1w6FuZG8gc2UgYm9ycmEgZWwgaXRlbS5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NlIHRvbWEgZW4gY3VlbnRhIGVsIHByZCB5IHN1cyBoaWpvcyBjb24gZWwgSWRFbmNQYWRyZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYykgfHwgZW5jLklkRW5jUGFkcmUgPT0gSURFbmMpLmZvckVhY2gocHJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwcmQuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gaUNhbnRpZGFkOy8vQW50aWd1YSBsb2dpY2FcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhbnRpZGFkVjIob00zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgSURFbmMsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBtM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8pLnRoZW4ocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24sIHJlc3AuTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYW1iaWFyIGNhbnRpZGFkIGRlIG0zcHJvY2Vzb1xyXG4gICAgLy9KQUdNIDIwMTkxMDE4IFNlIGFncmVnYSBudWV2YSBmdW5jaW9uYWxpZGFkIGEgbGEgY2FudGlkYWQ6IFxyXG4gICAgLy8xLlNlIGJvcnJhIGVsIHByb2R1Y3RvIGRlIGxhIGxpc3RhIGRlbCBwcm9jZXNvXHJcbiAgICAvLzIuIFNlIGFncmVnYSBkZSBudWV2byBlbCBwcm9kdWN0byBjb24gbGEgbnVldmEgY2FudGlkYWQuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyOiBhbnlcclxuICAgICAgICAsIHNJREthdGlvczogc3RyaW5nLCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPikge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgLy9KQUdNIDIwMTkxMTE0LCBBZ3JlZ2FyIGltYWdlblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKTtcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUEVuY0l0ZW1zLlBhdGhJbWFnZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIShlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgKGVuYy5JRCA9PSBJREVuYyB8fCBlbmMuSWRFbmNQYWRyZSA9PSBJREVuYykpKTtcclxuXHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKGlkUHJvZHVjdG8sIHRydWUsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSB0aGlzLkxvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0byk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiB7IFwiTTNQcm9jZXNvXCI6IG9NM1Byb2Nlc29zLCBcIk0zUEl0ZW1zV0VCXCI6IG9NM1BJdGVtc1dFQiB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldF9NM0VOQ19ieV9pZHByZF9sb3RlKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUpXHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGNhbnRpZGFkIGRlIHVuIGVuY2FiZXphZG8sIHByb2R1Y3RvIGVzcGVjaWZpY28uXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9kdWN0bzogTTNQcmRHZW5lcmFsKSB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IG9Qcm9kdWN0by5TS1UgJiYgZW5jLkxvdGUgPT0gb1Byb2R1Y3RvLkxPVEUpLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vL1JFR0lPTiBERSBSRUNFUENJT05cclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgcmVjZXBjaW9uXHJcbiAgICBwdWJsaWMgTWVyZ2VSZWNlcFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUmVjZXBjaW9uOiBudW1iZXIpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5maWx0ZXIocmVjZXAgPT4gcmVjZXAuSWRSZWNlcGNpb24gPT0gaWRSZWNlcGNpb24pLmZvckVhY2gocmVjID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JRCA9PSByZWMuSWRFbmMpLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShyZWMuQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDVVJDUkVDXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0RlamFyIGxvcyBkZSB0YWxsZXMgZGUgbGEgdmFyaWFibGU6IENVUkNSRUMgZW49MCwgRXN0byBwYXJhIGZsdWpvcywgZG9uZGUgYWdyZWdhIGluZm8gcHJvY2VzYSB5IGFow60gbWlzbW8gYWdyZWdhIG3DoXMuXHJcbiAgICBwdWJsaWMgUmVtb3ZlQ3VyQ1JlYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPSBudWxsKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RldGFsbGU6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgIG9EZXRhbGxlID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNVUkNSRUNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RldGFsbGUgIT09IHVuZGVmaW5lZCAmJiBvRGV0YWxsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RldGFsbGUuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vRklOIFJFR0lPTiBERSBSRUNFUENJT05cclxuXHJcbiAgICAvLy8vLy8vUkVHSU9OIEVOVFJFR0FcclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgZW52aW9cclxuICAgIHB1YmxpYyBNZXJnZUVudHBZRW5jKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM1BFbnZpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM1BFbnZpb3MuZm9yRWFjaChlbnYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgICAgIGxFbmMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+IGVuYy5JZEVudmlvID09IGVudi5JZEVudmlvKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobEVuYyAhPT0gdW5kZWZpbmVkICYmIGxFbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxFbmMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciwgXCJDVVJDRU5UXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDrSBtaXNtbyBhZ3JlZ2EgbcOhcy5cclxuICAgIHB1YmxpYyBSZW1vdmVDdXJDRW50KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9IG51bGwpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGV0YWxsZTogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgb0RldGFsbGUgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1VSQ0VOVFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGV0YWxsZSAhPT0gdW5kZWZpbmVkICYmIG9EZXRhbGxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGV0YWxsZS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuICAgIC8vLy8vLy9GSU4gUkVHSU9OIEVOVFJFR0FcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb25lcyBxdWUgc2UgcHJvY2VzYW4gZGVzcHVlcyBkZSBhZ3JlZ2FyIGFsIGNhcnJpdG9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvRGF0YVVzZXIgXHJcbiAgICAgKiBAcGFyYW0gb00zUEl0ZW1zV0VCIFxyXG4gICAgICogQHBhcmFtIG9NM1ViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBFbkxpbmVhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY1Byb21vQWZ0ZXJBZGRUb0NhcnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5Qcm9jZXNhck9ic2VxdWlvcyhvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhciBwcm9tb2Npb25lcyBkZXNwdWVzIGRlIGZpbmFsaXphciBlbCByZWdpc3Ryb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY1Byb21vQWZ0ZXJGaW5hbGl6YXIob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuXHJcbiAgICAgICAgdGhpcy5HZW5lcmFyUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgdGhpcy5Qcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUHJvbW9BZnRlclByb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBudWxsKTtcclxuICAgICAgICAgICAgdmFyIGxUaXBvc1Byb21vID0gbmV3IEFycmF5PFN0cmluZz4oKTtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgbFRpcG9zUHJvbW8ucHVzaChcIkFGVEVSXCIpO1xyXG4gICAgICAgICAgICBhcnJQcm9tbyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIG51bGwsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvc1Byb21vKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJQcm9tb0FmdGVyKGFyclByb21vLCBvTTNQcm9jZXNvcywgb00zRU5DUFJPTU8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBhIGluZm9ybWFjaW9uIGRpbmFtaWNhIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEluZm9Qcm9tb2Npb25lc0FEaW5hbWljYXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCAwKTtcclxuICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVkFMX1BST01PQ1wiLCBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJOT01CX1BST01PQ1wiLCBkYXRhLk5PTUJSRVMpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJJRF9QUk9NT0NcIiwgZGF0YS5JRClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGllbmUgZWwgcHJvY2VzbyBhc29zaWFkbyBhIHVuIGlkcHJlc3RhbW9zXHJcbiAgICBhc3luYyBnZXRfbTNfcHJvY2Vzb19ieV9pZF9wcmVzdGFtb19hc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRfcHJlc3RhbW86IHN0cmluZykge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBpZF9rYXRpb3MgKyAnLycgKyBpZF9wcmVzdGFtbykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmNlcHRvTTNTYWxkb3NJdGVtVWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYi8nICsgc0lES2F0aW9zLCBqRGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSBvIG1vZGlmaWNhIGxhIGNhbnRpZGFkIGRlIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIGRlbnRybyBkZWxhIGxpc3RhIGRlIHVuIFByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9kdWN0IFxyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRQcm9kdWN0b1RvT3RyYXNDbGFzKHByb2R1Y3Q6IFR5cGVNM1ByZEdycCwgY2FudGlkYWQ6IG51bWJlciwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBmdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBvTTNPdENsYXNpZmljYWNpb25lczogTTNPdENsYXNpZmljYWNpb25lcztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdO1xyXG5cclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSB0aGlzLnZhbGlkYXJFeGlzdGFPdHJhQ2xhc2lmKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIHByb2R1Y3QpO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0V4aXN0ZSkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCA9IHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkICsgY2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLk9yZGVuID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcyA9IG5ldyBNM090Q2xhc2lmaWNhY2lvbmVzKCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLkNhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8gPSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuTm9tYnJlID0gcHJvZHVjdFVuaXRTZWxlY3RlZC5OT01CUkUxO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvciA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHByb2R1Y3RVbml0U2VsZWN0ZWQuTG9NM1ByZExpc3RhLlBSRUNJTywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5JRCA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJJRFwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLk9yZGVuID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIk9yZGVuXCIpICsgMTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMucHVzaChvTTNPdENsYXNpZmljYWNpb25lcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlvTTNQcm9jZXNvcyA9IHRoaXMucmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3MoaW9NM1Byb2Nlc29zKTtcclxuICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxpbWluYSB1biBvYmpldG8gTTNPdENsYXNpZmljYWNpb25lcyBwb25pZW5kbyBzdSB2YWxvciB5IGNhbnRpZGFkIGVuIGNlcm9cclxuICAgICAqIEBwYXJhbSBvTTNPdENsYXNpZmljYWNpb25lcyBcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZVByb2R1Y3RvRnJvbU90cmFzQ2xhcyhvTTNPdENsYXNpZmljYWNpb25lczogTTNPdENsYXNpZmljYWNpb25lcywgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBvTTNPdENsYXNpZmljYWNpb25lcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5WYWxvciA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlvTTNQcm9jZXNvcyA9IHRoaXMucmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3MoaW9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhIGVsIHZhbG9yIGRlIE0zUHJvY2Vzb3MuVmFsT3RyYUNsYXNpIGEgcGFydGlyIGRlIGxhIHN1bWF0b3JpYSBkZSBsb3Mgb2JqZXRvcyBkZW50cm8gZGVsIGFycmVnbG8gTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsT3RyYUNsYXNpID0gb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bWEsIG9NM090Q2xhc2lmaWNhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdW1hICsgb00zT3RDbGFzaWZpY2FjaW9uZXMuVmFsb3I7XHJcbiAgICAgICAgfSwgMClcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBwcm9kdWN0byBkZW50cm8gZGUgdW4gbGEgbGlzdGEgZGUgTTNPdENsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXJFeGlzdGFPdHJhQ2xhc2lmKGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzOiBBcnJheTxNM090Q2xhc2lmaWNhY2lvbmVzPiwgcHJvZHVjdDogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvRXhpc3RlID0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLlNLVSk7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RvRXhpc3RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAqIExpbXBpYSBsb3MgZGV0YWxsZXMgeSBsb3MgaW1wdWVzdG9zIGRlIHVuIHByb2R1Y3RvIGRhZG8gZW4gdW4gcHJvY2VzbyBkZSBkZXZvbHVjaW9uXHJcbiAgICogQHBhcmFtIHByb2R1Y3RvQm9ycmFkbyBcclxuICAgKiBAcGFyYW0gcHJvY2Vzb0Rldm9sdWNpb24gXHJcbiAgICovXHJcbiAgICBkZWxldGVQcmREZXZvbHVjaW9uKHByb2R1Y3RvQm9ycmFkbywgcHJvY2Vzb0Rldm9sdWNpb246IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG8gPSBwcm9jZXNvRGV2b2x1Y2lvbi5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3RvQm9ycmFkby5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG8pIHtcclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNERVQuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTigrZGV0LlZhbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHByb2R1Y3RvLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBanVzdGEgbG9zIFZhbG9yZXMgZW4gY2FzbyBkZSBlbmNvbnRyYXIgZGlmZXJlbmNpYXMgcGFyYSBwb2RlciBnZW5lcmFyIEZFXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvclZhbG9yZXNDRkRJRnJvbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcbiAgICAgICAgbGV0IHRvdGFsRGVzY3VlbnRvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbERlc2N1ZW50b3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSB0aGlzLmdldFZhbG9yVG90YWxJbXBvcnRlSW1wdWVzdG9zKG9NM1Byb2Nlc29zKTtcclxuXHJcbiAgICAgICAgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZChvTTNQcm9jZXNvcy5WYWxvck5ldG8gLSAob00zUHJvY2Vzb3MuVmFsb3IgKyB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgLSB0b3RhbERlc2N1ZW50b3MpLCAzKTtcclxuICAgICAgICBpZiAoZGlmZXJlbmNpYSAhPSAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JEZXNjdWVudG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgdmFsb3IgdG90YWwgZGUgcHJvbW9jaW9uZXMgYXBsaWNhZGFzIGVuIGVsIHByb2Nlc28gZW4gY3Vlc3Rpw7NuXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGdldFZhbG9yVG90YWxEZXNjdWVudG9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRhbGxlUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVByb21vKSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbERlc2N1ZW50b3MgKz0gK2RldGFsbGVQcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxEZXNjdWVudG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgY29icmFkb3MgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgZW5jLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgKz0gK2ltcC5WYWxvcjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbEltcG9ydGVJbXB1ZXN0b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBpbXB1ZXN0byBlbiAwLjAxIHkgc3UgY29ycmVzcG9uZGllbnRlIGJhc2UgcGFyYSBxdWUgY3VhZHJlIGxvcyB2YWxvcmVzIGFsIHRpbWJyYXIgbGEgRkVcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JJbXB1ZXN0b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgYWp1c3RvID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgZW5jIG9mIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGltcCBvZiBlbmMuTTNQSW1wdWVzdG9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gaW1wLlZhbG9yIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGltcC5CYXNlID0gaW1wLlZhbG9yIC8gaW1wLlBvcmNlbnRhamU7XHJcbiAgICAgICAgICAgICAgICBhanVzdG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFqdXN0bykge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBkZXNjdWVudG8gZW4gMC4wMSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgZGV0YWxsZVRvdGFsUHJvbW86IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVRvdGFsUHJvbW8gJiYgK2RldGFsbGVUb3RhbFByb21vLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yIC0gMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vLlZhbG9yID0gKCtkZXRhbGxlVG90YWxQcm9tby5WYWxvciArIDAuMDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBqRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL2dldFByZHNHZW5lcmFsRnJvbU0zUHJvY2Vzby8nICsgc0lkS2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=
|