sf-reglanegociom3 1.0.12-beta97 → 1.0.12-beta99

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.
@@ -1806,25 +1806,50 @@ export class promocionesService {
1806
1806
  /** @type {?} */
1807
1807
  let contDescAplicados = 0;
1808
1808
  try {
1809
- //Calcula el numero maximo de descinetos que puede aplicar la promo que es combi.Accion.maxNumDesc multiplicado por la cantidad de productos que palican la promo en el proceso
1810
- maxNumDescuentos = oListEncab.reduce((acc, cur) => {
1811
- return acc + +cur.M3DET.find(det => det.NombreConcepto == "CANTIDAD").Valor;
1812
- }, 0) * maxNumDescuentos;
1813
- //De los productos del proceso filtro los productos que aplicaran el descuento segun los SKU configurados en combi.Accion.skuAplDesc
1814
- ioM3Proceso.M3ENC.forEach(oM3PEncItems => {
1815
- if (skuAplDescuentos.find(x => x.SKU == oM3PEncItems.IdProducto)) {
1816
- prodsAplDescuento.push(oM3PEncItems);
1809
+ if (maxNumDescuentos) {
1810
+ //Calcula el numero maximo de descinetos que puede aplicar la promo que es combi.Accion.maxNumDesc multiplicado por la cantidad de productos que palican la promo en el proceso
1811
+ maxNumDescuentos = oListEncab.reduce((acc, cur) => {
1812
+ return acc + +cur.M3DET.find(det => det.NombreConcepto == "CANTIDAD").Valor;
1813
+ }, 0) * maxNumDescuentos;
1814
+ //De los productos del proceso filtro los productos que aplicaran el descuento segun los SKU configurados en combi.Accion.skuAplDesc
1815
+ ioM3Proceso.M3ENC.forEach(oM3PEncItems => {
1816
+ if (skuAplDescuentos.find(x => x.SKU == oM3PEncItems.IdProducto)) {
1817
+ prodsAplDescuento.push(oM3PEncItems);
1818
+ }
1819
+ });
1820
+ //Cálculo de los precios unitarios de los productos a los que la promo aplicara descuento
1821
+ lPrecios = this.ProcesarPromoCombyByListEnc(prodsAplDescuento, esAcumulable);
1822
+ //Aplica tantos descuentos se puedan a plaicar a cada valor de lPrecio
1823
+ while (contDescAplicados < maxNumDescuentos && contDescAplicados < lPrecios.length) {
1824
+ lPrecios[contDescAplicados].PUNITNETO -= (+lPrecios[contDescAplicados].PUNITNETO) * ((+combi.Accion.Valor) / 100);
1825
+ contDescAplicados++;
1817
1826
  }
1818
- });
1819
- //Cálculo de los precios unitarios de los productos a los que la promo aplicara descuento
1820
- lPrecios = this.ProcesarPromoCombyByListEnc(prodsAplDescuento, esAcumulable);
1821
- //Aplica tantos descuentos se puedan a plaicar a cada valor de lPrecio
1822
- while (contDescAplicados < maxNumDescuentos && contDescAplicados < lPrecios.length) {
1823
- lPrecios[contDescAplicados].PUNITNETO -= (+lPrecios[contDescAplicados].PUNITNETO) * ((+combi.Accion.Valor) / 100);
1824
- contDescAplicados++;
1827
+ //Recalcula los valores del producto aplicando el descuento
1828
+ this.CalculateTotalPriceFromList(lPrecios, prodsAplDescuento, combi, true, esAcumulable);
1829
+ }
1830
+ else {
1831
+ //CANTIDAD POR PRODUCTO
1832
+ debugger;
1833
+ oListEncab.forEach(prd => {
1834
+ contDescAplicados = 0;
1835
+ /** @type {?} */
1836
+ let prdFinded = skuAplDescuentos.find(x => x.SKU == prd.IdProducto);
1837
+ if (prdFinded) {
1838
+ prodsAplDescuento.push(prd);
1839
+ //Calcula el numero maximo de descinetos que puede aplicar la promo que es combi.Accion.maxNumDesc multiplicado por la cantidad de productos que palican la promo en el proceso
1840
+ maxNumDescuentos = +prd.M3DET.find(det => det.NombreConcepto == "CANTIDAD").Valor * prdFinded.Cantidad;
1841
+ //Cálculo de los precios unitarios de los productos a los que la promo aplicara descuento
1842
+ this.ProcesarPromoCombyByListEncByPrd(prd, esAcumulable, lPrecios);
1843
+ //Aplica tantos descuentos se puedan a plaicar a cada valor de lPrecio
1844
+ while (contDescAplicados < maxNumDescuentos) {
1845
+ lPrecios[contDescAplicados].PUNITNETO -= (+lPrecios[contDescAplicados].PUNITNETO) * ((+combi.Accion.Valor) / 100);
1846
+ contDescAplicados++;
1847
+ }
1848
+ }
1849
+ });
1850
+ //Recalcula los valores del producto aplicando el descuento
1851
+ this.CalculateTotalPriceFromList(lPrecios, prodsAplDescuento, combi, true, esAcumulable);
1825
1852
  }
1826
- //Recalcula los valores del producto aplicando el descuento
1827
- this.CalculateTotalPriceFromList(lPrecios, prodsAplDescuento, combi, true, esAcumulable);
1828
1853
  }
1829
1854
  catch (error) {
1830
1855
  }
@@ -2388,6 +2413,32 @@ export class promocionesService {
2388
2413
  }
2389
2414
  return lPrecios;
2390
2415
  }
2416
+ /**
2417
+ * Crear lista de precios y id de encabezado, teniendo en cuenta la informacion lista de encabezados
2418
+ * @param {?} enc
2419
+ * @param {?} bEsAcumulable
2420
+ * @param {?} lPrecios
2421
+ * @return {?}
2422
+ */
2423
+ ProcesarPromoCombyByListEncByPrd(enc, bEsAcumulable, lPrecios) {
2424
+ /** @type {?} */
2425
+ var lPrecios = new Array();
2426
+ /** @type {?} */
2427
+ var nCantidad;
2428
+ /** @type {?} */
2429
+ var nPrecioUnit;
2430
+ nCantidad = +enc.M3DET.find(det => det.NombreConcepto == "CANTIDAD").Valor;
2431
+ //JAGM 20190730 valida si la promocion es acumulable.
2432
+ if (bEsAcumulable) {
2433
+ nPrecioUnit = +enc.M3DET.find(det => det.NombreConcepto == "PUNITNETO").Valor;
2434
+ }
2435
+ else {
2436
+ nPrecioUnit = +enc.M3DET.find(det => det.NombreConcepto == "PUNIT").Valor;
2437
+ }
2438
+ for (var j = 0; j < nCantidad; j++) {
2439
+ lPrecios.push({ "Indice": j, "PUNITNETO": nPrecioUnit, "ID": enc.ID, "IDPRODUCTO": enc.IdProducto });
2440
+ }
2441
+ }
2391
2442
  /**
2392
2443
  * ProcesarCombinadaXporY
2393
2444
  * Procesar promocion combinada que se llevan x productos por el precion de y productos.
@@ -2817,4 +2868,4 @@ function promocionesService_tsickle_Closure_declarations() {
2817
2868
  promocionesService.prototype.operators;
2818
2869
  }
2819
2870
 
2820
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbW9jaW9uZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NmLXJlZ2xhbmVnb2Npb20zLyIsInNvdXJjZXMiOlsibGliL3JubTMvUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBTUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pELE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUVsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUcxRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDdkIsTUFBTTs7Ozs7SUFNRixZQUFZLFNBQWMsRUFBRSxjQUEyQjt1QkFMOUIsSUFBSSxNQUFNLEVBQUU7eUJBVWxCO1lBQ2YsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUEsRUFBRTtZQUNyQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQSxFQUFFO1lBQ3JDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBLEVBQUU7WUFDdkMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtZQUN2QyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FB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QUM7Z0JBQ3JHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7aUJBQU07Z0JBQ0gsT0FBTyxTQUFTLENBQUM7YUFDcEI7U0FDSjthQUFNO1lBQ0gsT0FBTyxDQUFDLENBQUM7U0FDWjs7Q0FFUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE0zRU5DUFJPTU8gfSBmcm9tICcuL01vZGVscy9NM0VOQ1BST01PLmNsYXNzJztcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tICcuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlJztcclxuaW1wb3J0IHsgTTNDT05ESUFHUlVQQUNJT04gfSBmcm9tICcuL01vZGVscy9NM0NPTkRJQUdSVVBBQ0lPTi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zQ09ORElQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElQUk9NTy5jbGFzcyc7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHcnAudHlwZSc7XHJcbmltcG9ydCB7IE0zREVUQ09ORElQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zREVUQ09ORElQUk9NTy5jbGFzcyc7XHJcbmltcG9ydCB7IFByb21vY2lvbmVzQXNvY2lhZGFzLCBQcm9tb2Npb25Qcm9jZXNhZGEsIFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gJy4vTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgeyBNM1Byb21Db21iaW5hZGFYUHJvY2VzbyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXByb20tY29tYic7XHJcbmltcG9ydCB7IE0zUEVuY0l0ZW1zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGVuYy1pdGVtcyc7XHJcbmltcG9ydCB7IE0zUEVuY0ZQIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGVuYy1mcCc7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXMnO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSAnLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZSc7XHJcbmltcG9ydCB7IF9pdGVyYWJsZURpZmZlcnNGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9zcmMvYXBwbGljYXRpb25fbW9kdWxlJztcclxuaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BJdGVtc1dFQiB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zJztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tICcuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlJztcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSAnLi4vTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1BlclhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGVyLXgtcHJvY2Vzbyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9tMy1yZWctc2VydmljZSc7XHJcbmltcG9ydCB7IE0zUHJkTGlzdGEgfSBmcm9tICcuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZSc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5leHBvcnQgY2xhc3MgcHJvbW9jaW9uZXNTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvTWF0aFRGOiBNYXRoVEYgPSBuZXcgTWF0aFRGKCk7XHJcbiAgICBwdWJsaWMgZ29EYXRhVXNlcjogYW55O1xyXG4gICAgcHVibGljIGdvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUI7XHJcbiAgICBwdWJsaWMgZ29NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvRGF0YVVzZXI6IGFueSwgb0RhdGFBZGljaW9uYWw6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFVc2VyID0gb0RhdGFVc2VyO1xyXG4gICAgICAgIHRoaXMuZ29EYXRhQWRpY2lvbmFsID0gb0RhdGFBZGljaW9uYWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZXJhdG9ycyA9IHtcclxuICAgICAgICAnPCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIDwgYiB9LFxyXG4gICAgICAgICc+JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPiBiIH0sXHJcbiAgICAgICAgJzw9JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPD0gYiB9LFxyXG4gICAgICAgICc+PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID49IGIgfSxcclxuICAgICAgICAnSUdVQUwnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PSBiIH0sXHJcbiAgICAgICAgJ0RJRkYnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAhPSBiIH0sXHJcbiAgICAgICAgJ0VOJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPT09IGIgfSxcclxuICAgICAgICAnQU5EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJiYgYiB9LFxyXG4gICAgICAgICdPUic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIHx8IGIgfSxcclxuICAgICAgICAnKic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiB0cnVlIH0sXHJcbiAgICAgICAgJ01PRCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICUgYiA9PSAwIH0sXHJcbiAgICAgICAgLy8gLi4uXHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBJbmljaW8gT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvL1ZlcmlmaWNhciBwcm9tb2Npb25lcywgaW5ncmVzYW5kbyBjb21vIHBhcmFtZXRybyBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvZHVjdG8gYSB2YWxpZGFyLCBVYmljYWNpb25cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGxUaXBvc1Byb21vOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHZhciBhUmVzcHMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHZhciBhUHJvbW9jaW9uZXMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHZhciBob3kgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZ29NM0VOQ1BST01PID0gb00zRU5DUFJPTU87XHJcbiAgICAgICAgaWYgKG9NM0VOQ1BST01PKSB7XHJcbiAgICAgICAgICAgIG9NM0VOQ1BST01PLmZpbHRlcih4ID0+IGxUaXBvc1Byb21vLmZpbmQocHJvbW8gPT4geC5UaXBvID09IHByb21vKSkuZm9yRWFjaChlbmNhYmV6YWRvUHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRWaWdlbmNpYSA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5WaWdlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZEluaWNpbyA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5JbmljaW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTAyMywgc2UgcXVpdGEgVGlwbyBNYW51YWwsIHkgc2UgZGVqYSBlbCBudWV2byBwYXJhbWV0cm8uXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGFyRXN0YWRvc0VuY1Byb21vKGVuY2FiZXphZG9Qcm9tbykgJiYgKGVuY2FiZXphZG9Qcm9tby5Fc3RhZG8gJiYgZFZpZ2VuY2lhID49IGhveSAmJiBkSW5pY2lvIDw9IGhveSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLy8vLy8vIFZhbGlkYWNpb246IDEuIFNpIGVzIGRpZmVyZW50ZSBhIE1hbnVhbCwgbm8gdmFsaWRhIFZhcmlhYmxlIGVzdGFkb3MgbWFudWFsZXMuIERlIGxvIGNvbnRyYXJpbyBsbyB2YWxpZGEuIC0tLSAyLiBTaSBlbCBlc3RhZG8gZWwgZXN0YWRvIGVzIHZlcmRhZGVybyB5IGxhIHZpZ2VuY2lhIGVzIG1heW9yIG8gaWd1YWwgYSBsYSBmZWNoYSBkZWwgbW9tZW50b1xyXG4gICAgICAgICAgICAgICAgICAgIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jYWJlemFkb1Byb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goYWdydXBhY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJBZ3J1cGFjaW9uUHJvbW8ob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgYWdydXBhY2lvbiwgZW5jYWJlemFkb1Byb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdldEpSZXNwRnJvbUFycmF5KGFSZXNwcywgZW5jYWJlemFkb1Byb21vLlRpcG8sIGVuY2FiZXphZG9Qcm9tby5UaXBvMik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1ZhbGlkYWNpb24gZGUgYWNjaW9uLCBzaSBleGlzdGUsIHNpbm8gZXhpc3RlIHNlIGFncmVnYSBkZWwgcGFwYS4gU2UgZW52aWEgY29tbyByZWZlcmVuY2lhIGpyZXNwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckFjY2lvbihqUmVzcCwgZW5jYWJlemFkb1Byb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmV0b21hclZhbG9yZXNQcm9tb2Npb24oZW5jYWJlemFkb1Byb21vLCBqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9tb2Npb25lcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGFQcm9tb2Npb25lcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vOiBNM0VOQ1BST01PKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGVzdGFkbyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXNNYW51YWwgJiYgIWVuY2FiZXphZG9Qcm9tby5Fc3RhZG9NYW51YWxlcykge1xyXG4gICAgICAgICAgICBlc3RhZG8gPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXNBcGxDdXBvbiAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb0FwbEN1cG9uKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVzdGFkbztcclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBhZ3J1cGFjaW9uIGRlIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uOiBNM0NPTkRJQUdSVVBBQ0lPTiwgb00zRW5jUHJvbW86IE0zRU5DUFJPTU8pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhZ3J1cGFjaW9uLk0zQ09ORElQUk9NTy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY29uZGljaW9uOiBNM0NPTkRJUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXM7XHJcbiAgICAgICAgICAgIGNvbmRpY2lvbiA9IGFncnVwYWNpb24uTTNDT05ESVBST01PW2ldO1xyXG4gICAgICAgICAgICBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpY2lvbi5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICBpZiAoIWpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCB8fCBqQWRpY2lvbmFsZXMuUk9PVC5BQ1RJVklEQUQgPT0gXCJSRUdJU1RST1wiKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FyQ29uZGljaW9uZXNQcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBjb25kaWNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvTTNFbmNQcm9tby5UaXBvID09IFwiQ09NQklOQURBXCIgJiYgb00zRW5jUHJvbW8uVGlwbzIgPT0gXCJDT01CT1wiICYmIGpSZXNwLkFQTENvbmRpY2lvbiAmJiBhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiT1JcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFORFwiICYmICFqUmVzcC5BUExDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAvL0xhIGNvbmRpY2lvbiBOTyBzZSBjdW1wbGVcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiICYmIGpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBkZWJlIGd1YXJkYXIgbGEgaW5mb3JtYWNpw7NuLiBTaSBzaWVtcHJlIGZ1ZXJvbiBPUiB5IEZBTFNFLCBzZSBkZWJlIGNvbXBhcmFyIGNvbW8gdW4gQU5ELlxyXG4gICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLkdldEpSZXNwRnJvbUFycmF5KGFSZXNwcywgb00zRW5jUHJvbW8uVGlwbywgb00zRW5jUHJvbW8uVGlwbzIpO1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9WZXJpZmljYXIgY29uZGljaW9uIGRlIHByb21vY2lvbmVzLlxyXG4gICAgcHVibGljIFZlcmlmaWNhckNvbmRpY2lvbmVzUHJvbW8ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICB2YXIgakFkaWNpb25hZXM7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGpBZGljaW9uYWVzID0gSlNPTi5wYXJzZShjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FyQ29uZGljaW9uQ29udHJhRGF0YShvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBjb25kaWNpb24sIGpBZGljaW9uYWVzKTtcclxuICAgICAgICB0aGlzLlZhbGlkYXJBY2Npb24oalJlc3AsIGNvbmRpY2lvbi5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIHRoaXMuQWdyZWdhckNvbmRpY2lvbk9LKGpSZXNwLCBjb25kaWNpb24pO1xyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgYSBqc29uIGRlIHJlc3B1ZXN0YSBzaSBzZSBnZW5lcm8gT0sgbGEgaW5mb3JtYWNpb24gZGUgbGEgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0galJlc3AgXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWdyZWdhckNvbmRpY2lvbk9LKGpSZXNwLCBjb25kaWNpb246IE0zQ09ORElQUk9NTykge1xyXG4gICAgICAgIGlmIChqUmVzcC5BUExDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgalJlc3AuSURDb25kaWNpb24gPSBjb25kaWNpb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1ZlcmlmaWNhIGNvbmRpY2lvbiwgY29udHJhIGRhdGEgaW5ncmVzYWRhLlxyXG4gICAgcHVibGljIFZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcyk6IGFueSB7XHJcbiAgICAgICAgdmFyIG9iamVjdEZpbmRlZDtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5Fc3QpIHtcclxuICAgICAgICAgICAgICAgIC8vVmEgYSBlc3RydWN0dXJhIGRlIHByb2R1Y3RvIGFkaWNpb25hbFxyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxvTTNQcmRBZGljaW9uYWxlc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZCA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpYyA9PiBhZGljLkFUUklCVVRPLnRyaW0oKSA9PSBjb25kaWNpb24uQ29uY2VwdG8udHJpbSgpICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShhZGljLlZBTE9SLnRyaW0oKSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0RmluZGVkLkpBZGljaW9uYWxlcyA9IEpTT04uc3RyaW5naWZ5KGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2JqZWN0RmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRUT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvUHJvZHVjdG8ob1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBSREdSUFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvUHJvZHVjdG9QUkRHUlAob1R5cGVNM1ByZEdycCwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk0zREVUQ09ORElQUk9NT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYWNpb25NM0RldGFsbGVDb25kaWNpb24ob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLk0zREVUQ09ORElQUk9NTywgY29uZGljaW9uLkNvbmNlcHRvLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0NFU09cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2Nlc28ob00zUHJvY2Vzb3MsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhclByb2Nlc29Gb3JtYVBhZ28ob00zUHJvY2Vzb3MsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9MSVNUQVBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMudmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiVVNFUlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvVXNlckRhdGEoY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQURJQ0lPTkFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9BZGljaW9uYWwoY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJDQVJBQ1RFUklTVElDQVNcIjpcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy9Fc3RhIHByb21vY2nDs24gZXN0YSBkaXNlw7FhZGEgcGFyYSBxdWUgc2VhIHByb2Nlc2FkYSBhbCBmaW5hbCBkZSBsYSB0cmFuc2FjY2nDs25cclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNsYXNpZmljYWNpb25lc1Byb2Nlc28ob00zUHJvY2Vzb3MsIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm8gRW50cm8gcG9yIERldGFsbGUhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldEpSZXNwRnJvbUFycmF5KGFSZXNwczogQXJyYXk8YW55PiwgdGlwbywgdGlwbzIpIHtcclxuICAgICAgICB2YXIgYkFQTENvbmRpY2lvbjtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgaWYgKGFSZXNwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vTExlZ2EgYSBlc3RlIHB1bnRvLCBwb3IgYWxndW5hIGRlIDIgcmF6b25lczogXHJcbiAgICAgICAgICAgIC8vMS4gTGEgY29uZGljacOzbiBlcyB1biBPUiB5IHRvZG9zIHNvbiBGQUxTRVxyXG4gICAgICAgICAgICAvLzIuIExhIGNvbmRpY2nDs24gZXMgdW4gQU5EIHkgdG9kb3Mgc29uIFRSVUVcclxuICAgICAgICAgICAgYkFQTENvbmRpY2lvbiA9IGFSZXNwcy5maWx0ZXIocmVzcCA9PiByZXNwLkFQTENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgIGlmICghYkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGlwbyA9PSBcIkNPTUJJTkFEQVwiICYmIHRpcG8yID09IFwiQ09NQk9cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcnJlZ2xvQ29uZGljaW9uZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBiQVBMQ29uZGljaW9uLmZvckVhY2goY29uZGljaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbi5JRENvbmRpY2lvbi5sZW5ndGggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uLklEQ29uZGljaW9uLmZvckVhY2goaWRDb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGlkQ29uKSkgYXJyZWdsb0NvbmRpY2lvbmVzLnB1c2goaWRDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmVnbG9Db25kaWNpb25lcy5maW5kKHggPT4geCA9PSBjb25kaWNpb24uSURDb25kaWNpb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChjb25kaWNpb24uSURDb25kaWNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgQVBMQ29uZGljaW9uOiB0cnVlLCBBY2Npb246IG51bGwsIElEQ29uZGljaW9uOiBhcnJlZ2xvQ29uZGljaW9uZXMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhUmVzcFRNUCA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9WZXJpZmljYXIgc2kgYWxndW5vIGRlIGxvcyBhcnJlZ2xvcyB0aWVuZSBhY2Npb24gZGlmZXJlbnRlIGEgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIGFSZXNwVE1QID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQWNjaW9uICE9IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhUmVzcFRNUC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVXNhciBlbCB1bHRpbW8gaXRlbSwgcXVlIHRlbmdhIGxhIGFjY2nDs25cclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcFRNUFthUmVzcFRNUC5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IGFSZXNwc1thUmVzcHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSBsYSBwcm9tbyBkZXBlbmRlIGRlIGxhIGZvcm1hIGRlIHBhZ28gYcOxYWRlIGVzdGEgaW5mb3JtYWNpw7NuXHJcbiAgICAgICAgICAgIGlmIChhUmVzcHMuZmluZCh4ID0+IHguRm9ybWFQYWdvKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3BbXCJGb3JtYVBhZ29cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vR2VuZXJhciBSZXNwdWVzdGEgZGUgY29uZGljaW9uLlxyXG4gICAgcHVibGljIEdlbmVyYXJSZXNwdWVzdGEoYkFQTFByb21vOiBib29sZWFuLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgalJlc3AgPSB7IFwiQVBMQ29uZGljaW9uXCI6IGJBUExQcm9tbywgXCJBY2Npb25cIjogbnVsbCB9O1xyXG4gICAgICAgIGlmIChqQWRpY2lvbmFsZXMgIT0gbnVsbCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgY2xhc2lmaWNhY2lvbmVzIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFByb2Nlc29zIGRlIE0zXHJcbiAgICAgKiBAcGFyYW0gZGV0Q29uZGljaW9uZXMgQ29uZGljaW9uZXMgZGUgcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckNsYXNpZmljYWNpb25lc1Byb2Nlc28ob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICAvL3ZhciBpQ2FudGlkYWRSZWFsOiBudW1iZXIgPSBsUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciBiRW50cm86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFsb3JlcyA9IHZhbG9yZXMuc29ydCgoYSwgYikgPT4gKGEuQ2FudGlkYWQgPCBiLkNhbnRpZGFkKSA/IDEgOiAoKGIuQ2FudGlkYWQgPCBhLkNhbnRpZGFkKSA/IC0xIDogMCkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIGxQcmVjaW9zLmxlbmd0aCk7Ly9KQUdNIDIwMTkwNzMxLCBmdW5jaW9uIHJlY3Vyc2l2YSBwYXJhIGNhbGN1bGFyIGxvcyBwcmVjaW9zIG51ZXZvcy5cclxuXHJcbiAgICAgICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwICYmIGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvID09IHRydWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2Vzb1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgY2xhc2lmaWNhY2lvbmVzIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFByb2Nlc29zIGRlIE0zXHJcbiAgICAgKiBAcGFyYW0gZGV0Q29uZGljaW9uZXMgQ29uZGljaW9uZXMgZGUgcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2Nlc2FyQ2FyYWN0ZXJpc3RpY2FQYXJjaWFsKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgbFByZWNpb3M6IEFycmF5PGFueT4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueSA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yZXM6IEFycmF5PGFueT4gPSBjb21iaS5BY2Npb24uVmFsb3JlcztcclxuICAgICAgICAgICAgdmFsb3JlcyA9IHZhbG9yZXMuc29ydCgoYSwgYikgPT4gYS5DYW50aWRhZCAtIGIuQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxQcmVjaW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsb3JQcm9tbyA9IGkgPCB2YWxvcmVzLmxlbmd0aCA/IHZhbG9yZXNbaV0uVmFsb3IgOiAwXHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaV0uUFVOSVRORVRPIC0gKCgrbFByZWNpb3NbaV0uUFVOSVRORVRPKSAqICgoK3ZhbG9yUHJvbW8pIC8gMTAwKSk7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwICYmIGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvID09IHRydWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2Vzb1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgQXBsaWNhclByb21vQnlWYWxvcmVzKHZhbG9yZXM6IEFycmF5PGFueT4sIGxQcmVjaW9zOiBBcnJheTxhbnk+LCByZXNpZHVvRW50cmFudGU6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBpQ2FudGlkYWRSZWFsOiBudW1iZXIgPSByZXNpZHVvRW50cmFudGU7Ly8gSkFHTSAyMDE5MDczMSBudWV2byBwYXJhbWV0cm8gPSBsUHJlY2lvcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsb3Jlcy5sZW5ndGg7IGkrKykgey8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgZnVuY2lvbmFsaWRhZCBwYXJhIHF1ZSBzZSBwdWVkYSB0ZW5lciB2YXJpb3MgdmFsb3Jlcy5cclxuICAgICAgICAgICAgdmFyIGlDYW50aWRhZFByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQcm9tbzogbnVtYmVyID0gdmFsb3Jlc1tpXS5WYWxvcjtcclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgPj0gaUNhbnRpZGFkUHJvbW8pIHsgLy9KQUdNIDIwMTkwNDI2IFNFIENBTUJJQSwgQU5URVMgRVNUQUJBIExBIEZVTkNJT05BTElEQUQgREUgQ0FOVElEQUQgUkVBTCBWUyBDQU5USURBRCBQUk9NT0NJT04uXHJcbiAgICAgICAgICAgICAgICB2YXIgUmVzaWR1bzogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgICAgIGlmIChpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBSZXNpZHVvID0gaUNhbnRpZGFkUmVhbCAlIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXBsaWNhclByb21vQnlWYWxvcmVzKHZhbG9yZXMsIGxQcmVjaW9zLCBSZXNpZHVvKTtcclxuICAgICAgICAgICAgICAgICAgICBpQ2FudGlkYWRSZWFsID0gaUNhbnRpZGFkUmVhbCAtIFJlc2lkdW87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gK2xQcmVjaW9zLmxlbmd0aCAtICtyZXNpZHVvRW50cmFudGU7IGkgPCArbFByZWNpb3MubGVuZ3RoIC0gK1Jlc2lkdW87IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcm1hciBudWV2byBhcnJlZ2xvLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgYXJyZWdsbyBlbnRyYW50ZS4gU2UgcmVjb3JyZSBkZSBhdHJhcyBoYWNpYSBhZGVsYW50ZSB5IHNlIHZhIGNyZWFuZG8gZWwgbnVldm8gYXJyZWdsb1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIHJlc2lkdW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBcm1hck51ZXZvQXJyYXlEZXNkZVJlc2lkdW8obFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW8pIHtcclxuICAgICAgICB2YXIgbFByZWNpb3NSZXNpZHVvID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGxQcmVjaW9zLmxlbmd0aCAtIDE7IGkgPiByZXNpZHVvOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zUmVzaWR1by5wdXNoKGxQcmVjaW9zW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQXJtYXJOdWV2b0FycmF0RGVzZGVSZXNpZHVvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NSZXNpZHVvO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHByb21vY2lvbmVzIHBvciBwcm9jZXNvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIE0zIFByb2Nlc29zIE9iamV0bywgY29uIGxhIGluZm9ybWFjaW9uIGRlIHRvZG9zIGxvcyBNM1Byb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tjb25kaWNpb24uQ29uY2VwdG9dICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvTTNQcm9jZXNvc1tjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSBlbCBwcm9jZXNvIHRpZW5lIHVuYSBmb3JtYSBkZSBwYWdvIHF1ZSBjdW1wbGEgY29uIGxhIGNvbmRpY2lvbiBlbnRyYW50ZSwgaGFjZSB1biAgcGFzcyB0cnVlLCBsYSBsb2dpY2Egc2UgaGFjZSBkZXNkZSBsYSBmb3JtYSBkZSBwYWdvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhclByb2Nlc29Gb3JtYVBhZ28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICBsZXQgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvTGlzdGFQcmVjaW86IE0zUHJkTGlzdGEsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvTGlzdGFQcmVjaW9bY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBwcm9tb2Npb25lcyBwb3IgcHJvY2Vzb3MsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZWwgTTMgcHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBNMyBQcm9jZXNvcyBPYmpldG8sIGNvbiBsYSBpbmZvcm1hY2lvbiBkZSB0b2RvcyBsb3MgTTNQcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBPYmpldG8gY29uIGluZm9ybWFjaW9uIGRlIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIGRlIGluZm9ybWFjaW9uIGFkaWNpb25hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1ByZEdlbmVyYWxbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gZGUgcHJvZHVjdG8gYWdydXBhZG8uXHJcbiAgICAgKiBAcGFyYW0gb1R5cGVNM1ByZEdycCBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9UeXBlTTNQcmRHcnBbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gYWRpY2lvbmFsLCBlc3RhIGluZm9ybWFjaW9uIGFkaWNpb25hbCBlc3RhIGVuIHVuYSB2YXJpYWJsZSBnbG9iYWw6IGdvRGF0YUFkaWNpb25hbFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBPYmpldG8gY29uIGluZm9ybWFjaW9uIGRlIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIGRlIGluZm9ybWFjaW9uIGFkaWNpb25hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb0FkaWNpb25hbChjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ29EYXRhQWRpY2lvbmFsW2NvbmRpY2lvbi5Db25jZXB0b10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0odGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJNT0RcIiAmJiArdGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSA+ICtjb25kaWNpb24uVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGluZm9ybWFjaW9uIGNvbnRyYSB1c3VhcmlvIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Vc2VyRGF0YShjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dICYmIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLmluY2x1ZGVzKCcsJykpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLnNwbGl0KCcsJykpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZWxlbWVudCwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBjb250cmEgZWwgZGV0YWxsZSBkZSBsYSBjb25kaWNpw7NuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sXHJcbiAgICAgICAgZGV0Q29uZGljaW9uZXM6IEFycmF5PE0zREVUQ09ORElQUk9NTz4sIGNvbmNlcHRvQ29uZGljaW9uOiBzdHJpbmcsIGpBZGljaW9uYWxlc0NvbmRpY2lvbikge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgb2RldENvbmRpY2lvbmVzRmluZGVkO1xyXG4gICAgICAgIHN3aXRjaCAoY29uY2VwdG9Db25kaWNpb24udHJpbSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tQMVwiOlxyXG5cclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDErMlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb1R5cGVNM1ByZEdycC5TS1AxICsgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5TS1AyKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tVXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tVLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfRElTUFwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRS50b1N0cmluZygpLCBkZXQuVmFsb3IudG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9USVBPXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuVElQTy50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgXCJQRVJfUFJPQ0VTT1wiOi8vKiBTb2xvIHZhbGlkYSB1bmEgZGV0Q29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICBsZXQgcGVyWFByb2Nlc286IE0zUGVyWFByb2Nlc287XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBwZXJYUHJvY2VzbyA9IG9NM1Byb2Nlc29zLk0zUGVyWFByb2Nlc28uZmluZCh4ID0+IHguVGlwb1BlcnNvbmEgPT0gZGV0Q29uZGljaW9uZXNbMF0uVmFsb3IudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkVOXCIgJiYgcGVyWFByb2Nlc28pIHtcclxuICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIgJiYgIXBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBTE1BQ0VOXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJIT1JBUklPX0hPUkFcIjpcclxuICAgICAgICAgICAgICAgIHZhciBvVGltZU5vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UaW1lTm93LmdldEhvdXJzKCkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiTG9NM1ByZEFkaWNpb25hbGVzXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0byAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFZsckFkaSA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLkNvbmNlcHRvKS5WQUxPUlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBWbHJBZGkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAvL1Byb2Nlc29zXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVswXS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUFJPQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvTTNQcm9jZXNvc1twcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW3Byb3BlcnR5XSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8vVmFsaWRhciByZXNwdWVzdGEsIGNvbiBvYmpldG8gYSB2YWxpZGFyXHJcbiAgICBwdWJsaWMgVmFsaWRhclJlc3B1ZXN0YShvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgakFkaWNpb25hbGVzO1xyXG4gICAgICAgIGlmIChvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgICAgICBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKG9iamVjdFZhbGlkYXRlLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNSBBZ3JlZ2FyIHNlY2Npb24gZGUgdmFsaWRhY2lvbmVzLlxyXG4gICAgICAgICAgICB2YXIgYlJlc3AgPSB0aGlzLlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzKGpBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgaWYgKGJSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NlIGVudmlhIGVuIGFkaWNpb25hbGVzLCBlbCBqc29uIGRlIGxhIGluZm9ybWFjaW9uIGVuY29udHJhZGEgZGVsIGRldGFsbGUuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciByZWdsYXMgY29uZmlndXJhZGFzIGRlc2RlIEpTT04gZGUgQWRpY2lvbmFsZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXM6IGFueSkge1xyXG4gICAgICAgIHZhciBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXNcIilcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMgJiYgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVklHRU5DSUFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLlZhbGlkYXJWaWdlbmNpYShqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMuVkFMMSwgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipFcnJvclwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZhbGlkYXJWaWdlbmNpYSh2YWwxOiBEYXRlLCB2YWwyOiBEYXRlKSB7XHJcblxyXG4gICAgICAgIHZhciBGZWNoYUFjdHVhbCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMSlcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh2YWwyKVxyXG5cclxuICAgICAgICAvLyB2YXIgZFZhbDEgPSBuZXcgRGF0ZSh2YWwxKTtcclxuICAgICAgICAvLyB2YXIgZFZhbDIgPSBuZXcgRGF0ZSh2YWwyKTtcclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDIpXHJcblxyXG5cclxuICAgICAgICB2YXIgbkZlY2hhQWN0dWFsOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcihGZWNoYUFjdHVhbCk7IC8vKyhGZWNoYUFjdHVhbC5nZXRGdWxsWWVhcigpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldE1vbnRoKCkgKyBcIlwiICsgRmVjaGFBY3R1YWwuZ2V0RGF0ZSgpKTtcclxuICAgICAgICB2YXIgblZhbDE6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDEpOyAvLysoZFZhbDEuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMS5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDEuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICB2YXIgblZhbDI6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDIpIC8vKyhkVmFsMi5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRWYWwyLmdldE1vbnRoKCkgKyBcIlwiICsgKCtkVmFsMi5nZXREYXRlKCkgKyAxKSApO1xyXG4gICAgICAgIGlmIChuRmVjaGFBY3R1YWwgPj0gblZhbDEgJiYgbkZlY2hhQWN0dWFsIDw9IG5WYWwyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRGZWNoYU51bWJlcihkYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgYWNjaW9uLCBzaSBubyB0aWVuZSBjYXJnYWRhIHVuYS4gRXN0YSBhY2Npb24gc2UgY2FyZ2EgamVyYXJxdWljYW1lbnRlLlxyXG4gICAgcHVibGljIFZhbGlkYXJBY2Npb24oalJlc3AsIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqc29uQWRpYyA9IEpTT04ucGFyc2UoakFkaWNpb25hbGVzKTtcclxuICAgICAgICBpZiAoalJlc3AuQWNjaW9uID09IG51bGwgJiYganNvbkFkaWMuUk9PVC5BY2Npb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSBqc29uQWRpYy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvbWFyIGluZm9ybWFjacOzbiBcclxuICAgIHB1YmxpYyBSZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihvTTNFTkNQUk9NTzogTTNFTkNQUk9NTywgalJlc3ApIHtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24gPSB7fTtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24uTm9tYnJlID0gb00zRU5DUFJPTU8uTm9tYnJlO1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5JRCA9IG9NM0VOQ1BST01PLklkUHJvbW9jaW9uO1xyXG4gICAgICAgIC8vU2kgbm8gdHV2byBuaW5ndW5hIGFjY2lvblxyXG4gICAgICAgIGlmIChqUmVzcC5BY2Npb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSB7IFwiVGlwbzJcIjogb00zRU5DUFJPTU8uVGlwbzIsIFwiVGlwb1wiOiBvTTNFTkNQUk9NTy5UaXBvIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vIFJldG9tYXIgZGVzZGUgZWwgZW5jYWJlemFkbyBwcm9tbywgc2kgbm8gZXhpc3RlIGVsIHRpcG8geSBUaXBvMlxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8yID0gb00zRU5DUFJPTU8uVGlwbzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFqUmVzcC5BY2Npb24uVGlwbykge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8gPSBvTTNFTkNQUk9NTy5UaXBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIHByb21vY2nDs24sIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvZHVjdG8gYSBhcGxpY2FyIGxhIHByb21vY2lvbiB5IGxhcyBwcm9tb2Npb25lcyBhIGFwbGljYXJcclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vY2lvbihKUHJvbW9jaW9uZXM6IEFycmF5PGFueT4sIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBnc0lkS2F0aW9zID0gbnVsbCk6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgbGV0IHNwbGl0UHJlY2lvID0gdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpby5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM0xpc3RhUHJlY2lvLmZpbmQobFByZSA9PiBsUHJlLklETElTVEEgPT0gc3BsaXRQcmVjaW9bMF0pO1xyXG4gICAgICAgIGxldCBwcmVjaW9Nb25lZGVybyA9IDA7XHJcbiAgICAgICAgbGV0IGxpc3RhQXBsaWNhZGEgPSBcIlZhbG9yXCI7XHJcbiAgICAgICAgaWYgKG9MaXN0YUZpbmRlZCAmJiBzcGxpdFByZWNpbyAmJiBzcGxpdFByZWNpby5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoc3BsaXRQcmVjaW9bMV0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMQlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RhQXBsaWNhZGEgPSBcIkxCXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGFBcGxpY2FkYSA9IFwiTENcIjtcclxuICAgICAgICAgICAgICAgICAgICBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEM7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTERcIjpcclxuICAgICAgICAgICAgICAgICAgICBsaXN0YUFwbGljYWRhID0gXCJMRFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MRDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgIGlmIChnc0lkS2F0aW9zICE9IG51bGwgJiYgZ3NJZEthdGlvcyA9PSBcIkNUTlwiKSB7XHJcbiAgICAgICAgICAgIHByZWNpb01vbmVkZXJvID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZCh4ID0+IHguSURMSVNUQSA9PSBcIjJcIikuUFJFQ0lPO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5Qcm9jZXNhclByb21vR2VuZXJhbChKUHJvbW9jaW9uZXMsIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8sIHByZWNpb01vbmVkZXJvLCBsaXN0YUFwbGljYWRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIHF1ZSBzZSBoYWNlbiB2YWxpZGFzIGRlc3B1ZXMgZGUgcmVnaXN0cmFyIHRvZG9zIGxvcyBwcm9kdWN0b3MuXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb0FmdGVyKEpQcm9tb2Npb25lczogQXJyYXk8YW55Piwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvTTNQcm9jZXNvcy5WYWxvck5ldG87XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5Qcm9jZXNhclByb21vR2VuZXJhbChKUHJvbW9jaW9uZXMsIG9NM1Byb2Nlc29zLlZhbG9yTmV0bywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gZW4gZ2VuZXJhbFxyXG4gICAgICogQHBhcmFtIEpQcm9tb2Npb25lcyBcclxuICAgICAqIEBwYXJhbSBuUHJlY2lvIFxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vR2VuZXJhbChKUHJvbW9jaW9uZXM6IEFycmF5PGFueT4sIG5QcmVjaW86IG51bWJlciwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIHByZWNpb01vbmVkZXJvID0gMCwgbGlzdGFBcGxpY2FkYSA9IFwiVmFsb3JcIik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgdmFyIG9MaXN0YVByb21vc0Fzb2MgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KCk7XHJcbiAgICAgICAgbGV0IHByZWNpb0FzaWduYWRvID0gblByZWNpbztcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgSlByb21vY2lvbmVzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAvL0pQcm9tb2Npb25lcy5mb3JFYWNoKHByb21vY2lvbiA9PiB7XHJcbiAgICAgICAgICAgIHZhciBwcm9tb2Npb24gPSBKUHJvbW9jaW9uZXNbX2ldO1xyXG4gICAgICAgICAgICAvLyBpZiAocHJvbW9jaW9uLkFjY2lvbiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgIT0gbnVsbCAmJiBwcm9tb2Npb24uQWNjaW9uLlRpcG8yID09IFwiTU9ORURFUk9cIiAmJiBwcmVjaW9Nb25lZGVybyA+IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcmVjaW9Nb25lZGVybztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMgPSB0aGlzLlByb2Nlc2FyUHJvbW9CeVRpcG8ocHJvbW9jaW9uLCBwcmVjaW9Bc2lnbmFkbywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8sIGxpc3RhQXBsaWNhZGEpO1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBvTGlzdGFQcm9tb3NBc29jLnB1c2gob1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgcHJlY2lvTW9uZWRlcm8pO1xyXG5cclxuICAgICAgICAvLyBpZiAob1Byb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvcikgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvcikgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybztcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsIDwgMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBSZWRvZG5lbyBkZSBsb3MgdmFsb3JlcyB0b3RhbGVzXHJcbiAgICAgICAgLy8gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247XHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjaW9uIGRlIG1lam9yIG9wY2lvbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyBwcm9tb2Npb25lcyBwcm9jZXNhZGFzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgTGlzdGEgZGUgcHJvbW9jaW9uZXMgcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgUHJvbW9jaW9uIHByb2Nlc2FkYSwgcXVlIHJldG9ybmFyw6EgYSBmbHVqby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgbW9uZWRlcm86IG51bWJlcik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgbGV0IHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgIC8vU2kgZWwgcHJvZHVjdG8gZXN0YSByZXN0cmluZ2lkbyBsZSBkYSBtYXlvciBwcmlvcmlkYWQgYSBlc3RhIHByb21vY2nDs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vbmVkZXJvICE9IDAgJiYgcHJvbW8uVGlwbyA9PSBcIk1PTkVERVJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCttb25lZGVybykgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCttb25lZGVybykgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBwcm9tby5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLy8vLy8vRlVOQ0lPTkFMSURBRCBQUk9EUklBIEZVTkNJT05BUiBNw4FTIEFERUxBTlRFLCBTSSBTRSBRVUlFUkUgQUdSVVBBUiBMQVMgUFJPTU9DSU9ORVMgQUNNIFkgRVhDXHJcbiAgICAgICAgICAgIC8vIGlmKGRQcm9tb0FDTSA9PSAwICYmIGRQcm9tb0VYQyA9PSAwKXtcclxuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignTm8gc2UgZW5jb250cmFyb24gcHJvbW9jaW9uZXMnKTtcclxuICAgICAgICAgICAgLy8gfWVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICBpZihkUHJvbW9BQ00gPiBkUHJvbW9FWEMpe1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vR2FuYSBwcm9tb2Npb25lcyBhY3VtdWxhdGl2YXMuXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpLmZvckVhY2goeCA9PiB4LkFwbGljYWRhID0gdHJ1ZSk7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2M7Ly8uZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gZFByb21vQUNNKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBkUHJvbW9BQ00pICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIikucmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5WYWxvck1vbmVkZXJvKSwgMCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvL0dhbmEgcHJvbW9jaW9uZXMgZXhjbHV5ZW50ZXMuXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpLkFwbGljYWRhID0gdHJ1ZTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYy8vLnB1c2gob0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIGRQcm9tb0VYQykgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgZFByb21vRVhDKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gbmV3IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPihwcm9tb0Fzb2NpYWRhUmVzdHJpbmdpZG8pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvID0gMDtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICBhcGxpY2FQcm9tb0VYQyhvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgdmFsb3JQcm9tb0VYQzogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHByb21vRXhjOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICBpZiAodmFsb3JQcm9tb0VYQyA+IDApIHtcclxuICAgICAgICAgICAgcHJvbW9FeGMgPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IHZhbG9yUHJvbW9FWEMgfHwgeC5WYWxvck1vbmVkZXJvID09IHZhbG9yUHJvbW9FWEMpO1xyXG4gICAgICAgICAgICBwcm9tb0V4Yy5BcGxpY2FkYSA9IHRydWU7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gcHJvbW9FeGMuVmFsb3IpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBwcm9tb0V4Yy5WYWxvcik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vRXhjLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIHZhbG9yUHJvbW9BQ01ESU46IG51bWJlcikge1xyXG4gICAgICAgIGlmICh2YWxvclByb21vQUNNRElOID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9tbyBvZiBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEgPT0gXCJBQ01ESU5cIikpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gdmFsb3JQcm9tb0FDTURJTik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHZhbG9yUHJvbW9BQ01ESU4pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGVsIG1heGltbyB2YWxvciBzZWd1biBsYSByZWdsYSBhIGNvbXBhcmFyXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBcclxuICAgICAqIEBwYXJhbSBzUmVnbGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBzUmVnbGE6IHN0cmluZywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdDogbnVtYmVyID0gMDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHNSZWdsYSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY2FzZSBcIkFDTVwiOlxyXG4gICAgICAgICAgICAgICAgLy8gICAgIHJlc3VsdCA9IG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBzUmVnbGEgJiYgIXguZmxhZ3MuZm9ybWFQYWdvKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQUNNRElOXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZWNpb0FjdHVhbCA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxEZXNjdWVudG8gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW8gb2Ygb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNRElOXCIgJiYgKCF4LmZsYWdzLmZvcm1hUGFnbyB8fCB4LlRpcG8gPT0gXCJNT05FREVST1wiKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vLlZhbG9yUG9yY2VudGFqZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudWV2b1ZhbG9yRGVzY3VlbnRvID0gKHByZWNpb0FjdHVhbCAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9BY3R1YWwgLT0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxEZXNjdWVudG8gKz0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb0FjdHVhbCAtPSBwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxEZXNjdWVudG8gKz0gcHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsb3JUb3RhbERlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJFWENcIjpcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBNYXRoLm1heC5hcHBseShNYXRoLCBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gc1JlZ2xhICYmICgheC5mbGFncy5mb3JtYVBhZ28gfHwgeC5UaXBvID09IFwiTU9ORURFUk9cIikpLm1hcChmdW5jdGlvbiAobykgeyByZXR1cm4gby5WYWxvciA+IG8uVmFsb3JNb25lZGVybyA/IG8uVmFsb3IgOiBvLlZhbG9yTW9uZWRlcm87IH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vUHJvY2VzYXIgcHJvbW9jaW9uIHNlZ3VuIGVsIHRpcG8gXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb246IGFueSwgUHJlY2lvOiBudW1iZXIsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBsaXN0YUFwbGljYWRhID0gXCJWYWxvclwiKTogUHJvbW9jaW9uZXNBc29jaWFkYXMge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBBY2Npb247XHJcbiAgICAgICAgICAgIHZhciBvUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgUHJvbW9jaW9uZXNBc29jaWFkYXMoKTtcclxuICAgICAgICAgICAgaWYgKHByb21vY2lvbi5BY2Npb24gIT0gbnVsbCAmJiBwcm9tb2Npb24uUHJvbW9jaW9uICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uID0gcHJvbW9jaW9uLlByb21vY2lvbi5JRDtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Ob21icmUgPSBwcm9tb2Npb24uUHJvbW9jaW9uLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgIEFjY2lvbiA9IHByb21vY2lvbi5BY2Npb247XHJcbiAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlJlZ2xhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhID0gQWNjaW9uLlJlZ2xhO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGEgPSBcIkVYQ1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5UaXBvID0gQWNjaW9uLlRpcG8yO1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbG9yQXBsaWNhciA9IEFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Npb25bbGlzdGFBcGxpY2FkYV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckFwbGljYXIgPSBBY2Npb25bbGlzdGFBcGxpY2FkYV07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChBY2Npb24uVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPXyVcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvclBvcmNlbnRhamUgPSArdmFsb3JBcGxpY2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAqICgoK3ZhbG9yQXBsaWNhcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX1ZBTE9SXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gdmFsb3JBcGxpY2FyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX0VYQUNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pIC0gKCt2YWxvckFwbGljYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBBY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGFPYnNlcSA9IEFjY2lvbi5SZWdsYU9ic2VxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTywgQWNjaW9uLk9CU0VRVUlPUywgb1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YWxpZGFyIGNhbnRpZGFkIHZzIGNhbnRpZGFkIGRlIG9ic3F1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNT05FREVST1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9GUyAyMDE5MDgyNyBZYSBubyBzZSBndWFyZGEgZWwgdmFsb3IgdG90YWwgZGVsIG1vbmVkZXJvIHNpIG5vIHVuaWNhbWVudGUgZWwgcG9yY2VudGFqZS4uLiBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNVUE9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklkQ3Vwb24gPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkFfUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMubElkQWN0aXZhUHJvbW8gPSBBY2Npb24uVmFsb3Iuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvL3RoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQob1Byb21vY2lvbmVzQXNvY2lhZGFzLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlRpcG8gPT0gXCJDT01CSU5BREFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEgPSBuZXcgUHJvbW9jaW9uQ29tYmluYWRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5UaXBvMiA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuTm9tYnJlID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uID0gQWNjaW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbXBvc0FkaWNpb25hbGVzKG9NM0VOQ1BST01PLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLCBwcm9tb2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLkZvcm1hUGFnbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5mbGFncy5mb3JtYVBhZ28gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPixcclxuICAgICAgICBvYnNlcXVpb3M6IEFycmF5PGFueT4sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkQ6IG51bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEUmVhbDogbnVtYmVyID0gdGhpcy5nb0RhdGFBZGljaW9uYWwuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIHByb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZGlwcm9tbyA9IHguTTNDT05ESVBST01PLmZpbmQoeCA9PiB4LkNvbmNlcHRvID09IFwiZENhbnRpZGFkXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmRpcHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSArY29uZGlwcm9tby5WYWxvclxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSAxXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuQ2FudGlkYWRPYnNlcSA9IFZhbG9yQ2FudFBSRFxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgY2FtcG9zIGFkaWNpb25hbGVzIGVuIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zRU5DUFJPTU8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBcclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyQ2FtcG9zQWRpY2lvbmFsZXMob00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIHByb21vY2lvbjogYW55KSB7XHJcbiAgICAgICAgc3dpdGNoIChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJPQlNFUV9DSUVSUkVcIjpcclxuICAgICAgICAgICAgICAgIC8vQWdyZWdhciBDYW50aWRhZC5cclxuICAgICAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIHZhciBzVmFsb3JDYW50aWRhZDogc3RyaW5nID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlwcm9tbyA9IHguTTNDT05ESVBST01PLmZpbmQoeCA9PiB4LkNvbmNlcHRvID09IFwiZENhbnRpZGFkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXByb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0gY29uZGlwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzVmFsb3JDYW50aWRhZCA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uQ2FudGlkYWRPYnNxID0gc1ZhbG9yQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgLy8gdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgLy8gcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIC8vIHZhciBqQWRpYzphbnkgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5DbGFzaWZpY2FjaW9uID0gakFkaWMuUk9PVC5BY2Npb24uQ2FyYWN0ZXJpc3RpY2E7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5OdW1Db25kaWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLk51bUNvbmRpY2lvbmVzID0gcHJvbW8uTTNDT05ESUFHUlVQQUNJT05bMF0uTTNDT05ESVBST01PLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb2Npb24uSURDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5JZENvbmRpY2lvbiA9IHByb21vY2lvbi5JRENvbmRpY2lvblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBJbmljaW8gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLy9Qcm9jZXNhciBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJDb21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLlByb21vQ29tYmluYWRhc1YyKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUHJvY2VzYXJDb21iaW5hZGFcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9WMiBDT01CSU5BREFcclxuICAgIC8qKlxyXG4gICAqIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxpc3RhIGRlIHByb21vY2lvbmVzIGNvbWJpbmFkYXMgZGUgTTNQcm9jZXNvc1xyXG4gICAqIEBwYXJhbSBpb00zUHJvY2VzbyBPYmpldG8gTTMgUHJvY2Vzb3MsIGVsIGN1YWwgc2UgcmVjb3JyZXLDoSBsYSBpbmZvcm1hY2lvbiBkZSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzVjIoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIGxldCBlbmNDb25MYUNhbnRpZGFkT3JpZ2luYWwgPSBfLmNsb25lRGVlcChpb00zUHJvY2Vzby5NM0VOQyk7XHJcblxyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgdmFyIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzW2ldO1xyXG4gICAgICAgICAgICB2YXIgZXNBY3VtdWxhYmxlID0gdGhpcy5HZXRFc0FjdW11bGFibGVQcm9tbyhjb21iaSlcclxuICAgICAgICAgICAgLy8vT2J0ZW5lciB0b2RvcyBsb3MgRW5jYWJlemFkb3MgcXVlIGFwbGljYW4gYSBsYSBwcm9tb2Npb24gYSBsYSBxdWUgc2UgZXN0YSBpdGVyYW5kb1xyXG4gICAgICAgICAgICBvTGlzdEVuY2FiID0gdGhpcy5HZXRFbmNhYmV6YWRvQnlDb21iaShjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzOiAzIGdhc2Vvc2FzIHBvciAkNTAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfQ0lFUlJFXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKGxQcmVjaW9zLCBjb21iaSwgaW9NM1Byb2Nlc28sIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfU1VNVE9UQUxcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyT2JzZXFTdW1Ub3RhbChvTGlzdEVuY2FiLCBjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FQQVJDSUFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlbmFyTGlzdGFFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYiwgY29tYmksIGxQcmVjaW9zLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwbENvbWJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXBsQ29tYm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsQ29tYm8gPSB0aGlzLlByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlLCBpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0RfQVBMREVTQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzIHBhcmEgMngxLCAzeDEsIDR4MiwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9MaXN0RW5jYWIgJiYgb0xpc3RFbmNhYi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWVzdGFibGVjZSBsYSBjYW50aWRhZCBvcmlnaW5hbCBwYXJhIHF1ZSBubyBzZSBxdWVkZSBlbiB1biBidXZsZSBpbmZpbml0b1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUEVuY09yaWdpbmFsZXMgb2YgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsKSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZE9yaWdpbmFsID0gb00zUEVuY09yaWdpbmFsZXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY09yaWdpbmFsZXMuSUQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gY2FudGlkYWRPcmlnaW5hbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3JkZW5hckxpc3RhRW5jKG9saXN0YUVuYzogTTNQRW5jSXRlbXNbXSwgZXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgaWYgKGVzQWN1bXVsYWJsZSkgb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVE5FVE8nKS5WYWxvcikpO1xyXG4gICAgICAgIGVsc2Ugb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVQnKS5WYWxvcikgLSAoK2EuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkRGVzY1Byb21vOiBudW1iZXIgPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbENvbXByYTogbnVtYmVyID0gbFByZWNpb3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgTnVtYmVyKGIuUFVOSVRORVRPKTsgfSwgMCk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmVjaW9Ub3RhbENvbXByYSk7XHJcbiAgICAgICAgbGV0IGRlc2NBY3VtID0gMDtcclxuICAgICAgICBsZXQgZGVzY1Byb2RBY3R1YWw7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGVzY1Byb2RBY3R1YWwgPSAobFByZWNpb3NbaV0uUFVOSVRORVRPIC8gcHJlY2lvVG90YWxDb21wcmEpICogY2FudGlkYWREZXNjUHJvbW8gLy80MFxyXG4gICAgICAgICAgICBkZXNjQWN1bSArPSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgLy8gaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA8IGNhbnRpZGFkRGVzY1Byb21vKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gLT0gbFByZWNpb3NbaV0uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICBlbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyAtPSBjYW50aWRhZERlc2NQcm9tbztcclxuICAgICAgICAgICAgLy8gICAgICAgICBjYW50aWRhZERlc2NQcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gZGVzY0FjdW0gfHwgY2FudGlkYWREZXNjUHJvbW8gPCBkZXNjQWN1bSkge1xyXG4gICAgICAgICAgICAvL2ZpbmQgZGVsIHVsdGltbyBcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVuY29udHJlIGRpZmVyZW5jaWEgZW4gcHJvbW9zIGNvbWJpbmFkYXM6IFwiICsgY2FudGlkYWREZXNjUHJvbW8gKyBcIiB2cyBcIiArIGRlc2NBY3VtKTtcclxuICAgICAgICAgICAgbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPID0gbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPIC0gKGNhbnRpZGFkRGVzY1Byb21vIC0gZGVzY0FjdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWRcIilcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhck9ic2VxU3VtVG90YWwocHJvZHVjdG9zQXBsaWNhUHJvbW86IE0zUEVuY0l0ZW1zW10sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yUHJvbW8gPSArY29tYmkuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGVuY0l0ZW0gb2YgcHJvZHVjdG9zQXBsaWNhUHJvbW8pIHtcclxuICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA9IDE7XHJcbiAgICAgICAgICAgIGxldCBwVW5pdEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHdoaWxlIChjYW50aWRhZFByb2R1Y3RvQWN0dWFsIDw9IGNhbnRpZGFkQWN0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcFVuaXRBY3R1YWw7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZFByb2R1Y3RvQWN0dWFsKys7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gZW5jSXRlbS5JRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IGVuY0l0ZW0uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN1bWFWYWxvclByb2R1Y3RvcyArIGRpZmVyZW5jaWEgPj0gdmFsb3JQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgb00zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gc3VtYVZhbG9yUHJvZHVjdG9zIC0gdmFsb3JQcm9tbztcclxuICAgICAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBwcm9kdWN0b0NvbWJvLCBjYW50aWRhZE9ic2VxdWlvcyk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wib00zUmVnU2VydmljZVwiXSA9IG9NM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJvY2VzbzogTTNQcm9jZXNvcywgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCBwcm9kSGlqbzogTTNQRW5jSXRlbXM7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHByb2RSZXZpc2FkbyBvZiBwcm9kdWN0b3NSZXZpc2Fkb3MpIHtcclxuICAgICAgICAgICAgaWYgKHByb2RSZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gcHJvZFJldmlzYWRvLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9ICgrb00zUERldGFsbGVJdGVtcy5WYWxvciAtIHByb2RSZXZpc2Fkby5DYW50aWRhZCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIaWpvID0gXy5jbG9uZURlZXAob00zUEVuY0l0ZW1zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzbyhwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5wdXNoKHByb2RIaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIHByb2RIaWpvLCBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9kdXRvUHJvbW9Db21ib1N1bVRvdGFsKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExpc3RhUHJlY2lvcyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGxQcmVjaW9zRmlsdGVyID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHkgPT4geS5JRCA9PSBvTGlzdEVuY2FiW2ldLklEKS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NGaWx0ZXIucHVzaCh4KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb24gZGUgY29tYm8sIHggcHJvZHVjdG9zLCB5IHByb2R1Y3RvcywgLi4uIG4gcHJvZHVjdG9zIFxyXG4gICAgICogcG9yICQxMDAwXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqIEBwYXJhbSBiRXNBY3VtdWxhYmxlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9jaW9uQ29tYmluYWRhQ29tYm8obFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbiwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGZsYWdBcGxpY29Qcm9tbyA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBuTnVtZXJvQ29uZGljaW9uZXM6IG51bWJlciA9ICtjb21iaS5BY2Npb24uTnVtQ29uZGljaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBWYWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIExpc3RDb25kaWNpb25lcyA9IG5ldyBBcnJheTxBcnJheTxhbnk+PigpO1xyXG4gICAgICAgICAgICB2YXIgbWluaW1vSXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwb3JjZW50YWplUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFNpblByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2U7XHJcblxyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbk51bWVyb0NvbmRpY2lvbmVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGNvbmRpY2lvbiAxLlxyXG4gICAgICAgICAgICAgICAgdmFyIExpc3RQcm9tb0NvbWJpOiBBcnJheTxNM1BFbmNJdGVtcz4gPSB0aGlzLkJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiLCBpLnRvU3RyaW5nKCksIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgTGlzdENvbmRpY2lvbmVzLnB1c2godGhpcy5HZXRMaXN0YVByZWNpb3MobFByZWNpb3MsIExpc3RQcm9tb0NvbWJpKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhMaXN0Q29uZGljaW9uZXMsIG9MaXN0RW5jYWIpO1xyXG4gICAgICAgICAgICBpZiAoTGlzdENvbmRpY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGVsIHZhbG9yIG1lbm9yIGRlIGxhcyBpdGVtcyBhZ3JlZ2FkYXNcclxuICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gTGlzdENvbmRpY2lvbmVzWzBdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaisrKSB7Ly9Db21pZW56YSBkZXNkZSAxIHBvcnF1ZSBlbCAwIHlhIHNlIHZhbGlkbyBlbiBsYSBhbnRlcmlvciBsaW5lYVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtc1ByZWNpb3M6IEFycmF5PGFueT4gPSBMaXN0Q29uZGljaW9uZXNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01pbiA9IGl0ZW1zUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01pbiA8IG1pbmltb0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gbmV3TWluO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vTG9zIGNvbWJvcyBkZWJlbiBwcm9jZXNhcnNlIGRlIGEgdW5vIHBhcmEgc3UgY29ycmVjdG8gZnVuY2lvbmFtaWVudG9cclxuICAgICAgICAgICAgICAgIGlmIChtaW5pbW9JdGVtcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9SZWNvcnJlIHRvZG9zIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3MgZGUgbGEgcHJvbW8gcGFyYSBzYWJlciBjdWFsIGVzIGVsIHZhbG9yIHJvYWwgZGUgbGEgcHJvbW9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpblByb21vICs9ICtsUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5JbmRpY2UgPT0gZW5jLkluZGljZSkuUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgbGEgcHJvbW8gYSBwYXJ0aXIgZGVsIGNhbG9yIGRlbCBjb21ibyB5IGRlIGxhIHN1bWEgZGUgbG9zIHByZWNpb3Mgb3JpZ2luYWxlcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBwb3JjZW50YWplUHJvbW8gPSAxMDAgLSAoK1ZhbG9yUHJvbW8gKiAxMDAgLyB2YWxvclRvdGFsU2luUHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZvckVhY2gocHJlY2lvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjaW8uSW5kaWNlID09IGVuYy5JbmRpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWNpby5Qcm9tb0FwbGljYWRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxvciA9IHByZWNpby5QVU5JVE5FVE87XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01vZGlmaWNhIGVsIHByZWNpbyBkZSBsb3MgcHJvZHVjdG9zIGEgc3UgbnVldm8gdmFsb3IgY29uIGxhIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gdmFsb3IgLSAodmFsb3IgKiBwb3JjZW50YWplUHJvbW8gLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUHJvbW9BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcmVjaW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FbiBsYXMgcHJvbW9zIHBvciBjb21ibyBubyBhcGxpY2FuIGVsIHByZWNpbyBkZSBsb3Mgb3Ryb3MgcHJvZHVjdG9zIHF1ZSBubyBoYWNlbiBwYXJ0ZSBkZWwgY29tYm8gOilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTyA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnQXBsaWNvUHJvbW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ0FwbGljb1Byb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvZHVjdG9Qcm9tb0NvbWJpRXhpc3RlbnRlID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBjb21iaS5BY2Npb24uQ29kaWdvKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgY29tYmkuQWNjaW9uLlZhbG9yLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saW1waWFyRW5jSXRlbVByZENvbmRpKG9MaXN0RW5jYWIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb21vY2lvbkNvbWJpbmFkYUNvbWJvXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZ0FwbGljb1Byb21vO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmaWx0cmFyTGlzdGFDb25kaWNpb25lc0NvbWJvKGxpc3RDb25kaWNpb25lczogQXJyYXk8YW55Piwgb00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RDb25kaWNpb25lcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgbGV0IG51ZXZhQ29uZGljaW9uID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGljaW9uIG9mIGxpc3RDb25kaWNpb25lc1tfaV0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbmNJdGVtID0gb00zUEVuY0l0ZW1zTGlzdC5maW5kKHggPT4geC5JRCA9PSBjb25kaWNpb24uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY0l0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdID0gZW5jSXRlbVtcIlByZENvbmRpXCJdID8gZW5jSXRlbVtcIlByZENvbmRpXCJdIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0Q2FudGlkYWQgPiBlbmNJdGVtW1wiUHJkQ29uZGlcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVldmFDb25kaWNpb24gPSBbY29uZGljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaXN0Q29uZGljaW9uZXNbX2ldID0gbnVldmFDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxpbXBpYXJFbmNJdGVtUHJkQ29uZGkob00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgZWxlbWVudFtcIlByZENvbmRpXCJdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2VzbzogTTNQcm9jZXNvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQgPSAxKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvUXVpdGFyO1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvZHVjdG9RdWl0YXIgPSBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0uZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b1F1aXRhcikge1xyXG4gICAgICAgICAgICBwcm9kdWN0b1F1aXRhci5DYW50aWRhZCArPSAoLTEgKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0ucHVzaCh7IElEOiBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bywgQ2FudGlkYWQ6ICgtMSAqIGNhbnRpZGFkKSB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FncmVnYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZSBlbnRyYWRhIGEgdW4gYXJyZWdsbyBkZSBwcm9kdWN0b3MgcXVlIHBvc3Rlcmlvcm1lbnRlIHNlcmEgbG9zIHByb2R1Y3RvcyBoaWpvcyBkZWwgcHJvZHVjdG8gQ29tYm9cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSB0aGlzLmdldFByb2R1dG9Qcm9tb0NvbWJvKG9NM1Byb2Nlc28uTTNFTkMsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgIC8vTGEgY2FudGlkYWQgZGlzbWludXllIHBlcm8gZXN0ZSBtb3ZpbWllbnRvIHNlIHJldmVyc2EgYWwgdGVybWluYXIgZGUgdmFsaWRhciBlc3RhIHByb21vXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgMSk7XHJcbiAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2Vzbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vRGlzbWludXllIGVuIHVubyBsYSBjYW50aWRhZCBkZWwgcHJvZHVjdG8geSByZXRvcm5hIHVuIGNsb24gZGUgZXN0ZVxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm8ocHJvZHVjdG9zRW5NM1Byb2Nlc286IEFycmF5PE0zUEVuY0l0ZW1zPiwgb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NEZWxDb21ibyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGVuIGhhc2htYXAgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGhtbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gSUQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGR0b0htUHJlY2lvcyhobWxQcmVjaW9zOiBBcnJheTxhbnk+LCBJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGZpbmRlZDogYW55ID0gaG1sUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBJRCk7XHJcbiAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICBmaW5kZWQuSW5kaWNlID0gK2ZpbmRlZC5JbmRpY2UgKyArMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaW5kZWQgPSB7IFwiSURcIjogSUQsIFwiSW5kaWNlXCI6IDAgfTtcclxuICAgICAgICAgICAgaG1sUHJlY2lvcy5wdXNoKGZpbmRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5kZWQuSW5kaWNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVzY2FyIGVuY2FiZXphZG9zIHF1ZSB0ZW5nYSBsYSBwcm9tb2Npb24geSBjb25kaWNpb24gZW52aWFkYSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gSWRDb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaWRQcm9tb2Npb25lcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIElkQ29uZGljaW9uOiBzdHJpbmcsIGlkUHJvbW9jaW9uZXM6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRW5jRmluZGVkID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSlcclxuICAgICAgICAgICAgICAgIGlmICghb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgfHwgIShvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldCAmJiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb3M6IEFycmF5PGFueT4gPSBKU09OLnBhcnNlKGRldC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb0ZpbmRlZCA9IHByb21vcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBpZFByb21vY2lvbmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW9GaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaWNpb25GaW5kZWQgPSBwcm9tb0ZpbmRlZC5BY2Npb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5maW5kKHggPT4geCA9PSBJZENvbmRpY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9FbmNGaW5kZWQucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkID09IElkQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9FbmNGaW5kZWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDs24gc2kgbGEgcHJvbW9jacOzbiBxdWUgbGxlZ2EgY29tbyBwYXJhbWV0cm8sIGVzIGFjdW11bGFibGUgbyBub1xyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEVzQWN1bXVsYWJsZVByb21vKHByb21vY2lvbjogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHByb21vY2lvbi5BY2Npb24uUmVnbGEgJiYgcHJvbW9jaW9uLkFjY2lvbi5SZWdsYSA9PSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgR2V0RXNBY3VtdWxhYmxlXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IGxQcmVjaW9zID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBsZXQgcHJvZHNBcGxEZXNjdWVudG86IEFycmF5PE0zUEVuY0l0ZW1zPiA9IFtdO1xyXG4gICAgICAgIGxldCBza3VBcGxEZXNjdWVudG9zOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLnNrdUFwbERlc2M7IC8vW3tTS1U6XCJYWFhYWFhcIn0sIHtTS1U6XCJZWVlZWVlZXCJ9XVxyXG4gICAgICAgIGxldCBtYXhOdW1EZXNjdWVudG9zID0gK2NvbWJpLkFjY2lvbi5tYXhOdW1EZXNjO1xyXG4gICAgICAgIGxldCBjb250RGVzY0FwbGljYWRvcyA9IDA7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vQ2FsY3VsYSBlbCBudW1lcm8gbWF4aW1vIGRlIGRlc2NpbmV0b3MgcXVlIHB1ZWRlIGFwbGljYXIgbGEgcHJvbW8gcXVlIGVzIGNvbWJpLkFjY2lvbi5tYXhOdW1EZXNjIG11bHRpcGxpY2FkbyBwb3IgbGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSBwYWxpY2FuIGxhIHByb21vIGVuIGVsIHByb2Nlc29cclxuICAgICAgICAgICAgbWF4TnVtRGVzY3VlbnRvcyA9IG9MaXN0RW5jYWIucmVkdWNlKChhY2MsIGN1cikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYyArICtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIH0sIDApICogbWF4TnVtRGVzY3VlbnRvcztcclxuXHJcbiAgICAgICAgICAgIC8vRGUgbG9zIHByb2R1Y3RvcyBkZWwgcHJvY2VzbyBmaWx0cm8gbG9zIHByb2R1Y3RvcyBxdWUgYXBsaWNhcmFuIGVsIGRlc2N1ZW50byBzZWd1biBsb3MgU0tVIGNvbmZpZ3VyYWRvcyBlbiBjb21iaS5BY2Npb24uc2t1QXBsRGVzY1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5NM0VOQy5mb3JFYWNoKG9NM1BFbmNJdGVtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2t1QXBsRGVzY3VlbnRvcy5maW5kKHggPT4geC5TS1UgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHNBcGxEZXNjdWVudG8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vQ8OhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKHByb2RzQXBsRGVzY3VlbnRvLCBlc0FjdW11bGFibGUpO1xyXG5cclxuICAgICAgICAgICAgLy9BcGxpY2EgdGFudG9zIGRlc2N1ZW50b3Mgc2UgcHVlZGFuIGEgcGxhaWNhciBhIGNhZGEgdmFsb3IgZGUgbFByZWNpb1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udERlc2NBcGxpY2Fkb3MgPCBtYXhOdW1EZXNjdWVudG9zICYmIGNvbnREZXNjQXBsaWNhZG9zIDwgbFByZWNpb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tjb250RGVzY0FwbGljYWRvc10uUFVOSVRORVRPIC09ICgrbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTykgKiAoKCtjb21iaS5BY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgIGNvbnREZXNjQXBsaWNhZG9zKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kc0FwbERlc2N1ZW50bywgY29tYmksIHRydWUsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvcyBlbiBlbCBjaWVycmVcclxuICAgICAqIFZhbGlkYSB0b2RhIGxhIGxpc3RhIGRlIGVuY2FiZXphZG9zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICogVmFsaWRhIGxhIHByb21vY2nDs24sIHBvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGluZ3Jlc2Fkb3MsIGN1w6FudG9zIG9ic2VxdWlvcyBzZSBwdWVkZW4gZGFyLlxyXG4gICAgICogVHJhZSB0b2RvcyBsb3Mgb2JzZXF1aW9zIHF1ZSBzZSBpbmdyZXNhcm9uIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhcywgbG9zIGxpc3RhXHJcbiAgICAgKiBjb2xvY2EgZW4gdmFsb3IgMCBsb3Mgb2JzZXF1aW9zIHF1ZSBzZWxlY2Npb25vIGF1dG9tYXRpY2FtZW50ZSBlbCBhbGdvcml0bW9cclxuICAgICAqIFJlY2FsY3VsbyBkZSBwcmVjaW9zLCBpbXB1ZXN0b3MgeSBkZW1hcyB2YWxvcmVzIHRvdGFsZXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBsb3MgcHJvZHVjdG9zIGluZ3Jlc2Fkb3MgYWwgY2Fycml0byBxdWUgdGllbmVuIG9ic2VxdWlvXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgSW5mb3JtYWNpw7NuIGRlIHByb21vY2nDs24gZGUgb2JzZXF1aW9zXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gUHJvY2VzbyBjb24gdG9kb3MgbG9zIHByb2R1Y3RvcyBlIGluZm9ybWFjacOzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKG9MaXN0RW5jYWI6IEFycmF5PGFueT4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBlc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpb00zUHJvY2Vzb1snUHJvZHVjdG9zQ29tYmknXSA9IFtdO1xyXG4gICAgICAgIGxldCBjYW50UG9yT2JzID0gK2NvbWJpLkFjY2lvbi5DYW50aWRhZE9ic3E7IC8vUG9yIGNhZGEgY3VhbnRvcyBwcm9kdWN0b3MgY29uIGxhIHByb21vY2nDs24gc2UgZGFyw6EgZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgbGV0IGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgbGV0IHN1bWFWYWxvclByb2R1Y3RvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkT2JzZXF1aW9zID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgbTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub0xpc3RhT2JzZXF1aW9zID0gY29tYmkuQWNjaW9uLk9CU0VRVUlPUztcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zQ2FudGlkYWQgPSAwXHJcbiAgICAgICAgLy8gdmFyIGNhbnRPYnNlcXVpb3M6IG51bWJlciA9IDA7IC8vQ2FudGlkYWQgZGUgb2JzZXF1aW9zIHF1ZSBzZSBkYXLDoSBwb3IgZXN0YSBjb21wcmEuXHJcblxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y3RvIG9mIG9MaXN0RW5jYWIpIHtcclxuICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zICs9IHByb2R1Y3RvLlBVTklUTkVUTztcclxuICAgICAgICAgICAgY2FudEFncmVnYWRhKys7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b1JldmlzYWRvID0gcHJvZHVjdG9zUmV2aXNhZG9zLmZpbmQoeCA9PiB4LklkID09IHByb2R1Y3RvLklEKTtcclxuICAgICAgICAgICAgaWYgKHByb2R1Y3RvUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IHByb2R1Y3RvLklELCBDYW50aWRhZDogMSB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNhbnRBZ3JlZ2FkYSA9PT0gY2FudFBvck9icykge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JDb21ibyArPSBzdW1hVmFsb3JQcm9kdWN0b3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NSZXZpc2Fkb3MpO1xyXG4gICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY2FudEFncmVnYWRhID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvbWJpLkFjY2lvbi5Db2RpZ28pIGNvbnNvbGUuZXJyb3IoJ0VsIGPDs2RpZ28gZGVsIGNvbWJvIG5vIGVzdGEgY29uZmlndXJhZG8gZW4gTTNERVRDT05ESVBST01PJylcclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwICYmIGNvbWJpLkFjY2lvbi5Db2RpZ28pIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBtM1JlZ1NlcnZpY2UubG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaS5BY2Npb24uQ29kaWdvLCB2YWxvckNvbWJvLCAxKTtcclxuICAgICAgICAgICAgbTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzb1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBtM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBsaWNhciByZWdsYXMsIHJlc3BlY3RvIGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhLlxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvbmVzQXNvY2lhZGFzIFxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcblxyXG4gICAgICAgIHZhciBpQ2FudGlkYWRQcm9tbzogbnVtYmVyID0gQWNjaW9uLkNhbnRpZGFkOyAvL0VqZW1wbG8gOiAzXHJcbiAgICAgICAgLy92YXIgaUNhbnRpZGFkQVBMUHJvbW86IG51bWJlcjsgLy9OdW1lcm8gcmVhbCBkZSBhcGxpY2FjaW9uIGRlIHByb21vY2lvbmVzLCBTaSBhcGxpY2EgcmVzdGEgZWwgcmVzaWR1by5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyOyAvL0NhbnRpZGFkIHJlYWwgaW5ncmVzYWRhLlxyXG4gICAgICAgIHZhciBWYWxvclByb21vOiBudW1iZXIgPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgdmFyIHZhbG9yUHJvbW9Vbml0OiBudW1iZXIgPSAoK1ZhbG9yUHJvbW8pIC8gKCtpQ2FudGlkYWRQcm9tbylcclxuICAgICAgICBpQ2FudGlkYWRSZWFsID0gbFByZWNpb3MubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIFJlc2lkdW86IG51bWJlciA9IGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIC8vaUNhbnRpZGFkQVBMUHJvbW8gPSBpQ2FudGlkYWRSZWFsIC8gaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaUNhbnRpZGFkUmVhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobFByZWNpb3NbaV0uUFVOSVRORVRPID4gdmFsb3JQcm9tb1VuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSB2YWxvclByb21vVW5pdDtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGNvbWJpbmFkYXMgZGVzZGUgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBzQ29tYmluYWRhID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBvQ29tYmluYWRhID0gSlNPTi5wYXJzZShzQ29tYmluYWRhKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMgPSBvQ29tYmluYWRhO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByb21vY2lvbmVzLCBzZWd1biBsYSBsaXN0YSBkZSBwcmVjaW9zIGRpdmlkaWRhLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MsIGNvbnRyYSBlc3RlIG9iamV0byBzZSBpdGVyYXLDoSB5IHNlIG9yZGVuYXLDoSBkZSBtYXlvciBhIG1lbm9yXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgICAgIHZhciBpeDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgaXk6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAgICAgdmFyIHk6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzBdIC0gKCt4KTtcclxuICAgICAgICB2YXIgcmVzaWR1b1g6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHJlc2lkdW9YID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAgICAgICAgIHggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vL1NlIGl0ZXJhIGVsIGFycmVnbG8gZGUgcHJpbmNpcGlvIGEgZmluIHkgZGUgZmluIGEgcHJpbmNpcGlvLi4uIFxyXG4gICAgICAgIC8vL0NvbmZvcm1lIHNlIHJlY29ycmUgZWwgYXJyZWdsbyBkZSBmaW4gYSBwcmluaWNpbywgc2UgdmEgZGFuZG8gbGEgcHJvbW9jacOzbiBhIGxvcyBwcm9kdWN0b3MgZGUgbWVub3IgdmFsb3IuXHJcbiAgICAgICAgLy8vU2kgbGEgcHJvbW9jacOzbiBlc3RhIGluY29tcGxldGEsIGxvcyBwcm9kdWN0b3MgZGUgbGEgbWl0YWQgcXVlZGFuIHNpbiBwcm9tb2Npw7NuIFxyXG4gICAgICAgIHZhciBpOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxQcmVjaW9zID0gbFByZWNpb3Muc29ydCgoYSwgYikgPT4gYS5QVU5JVE5FVE8gPCBiLlBVTklUTkVUTyA/IDEgOiBhLlBVTklUTkVUTyA+IGIuUFVOSVRORVRPID8gLTEgOiAwKVxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBqID0gK2xQcmVjaW9zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbFByZWNpb3MubGVuZ3RoICYmIGogPj0gaSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGl4ID0gMDtcclxuICAgICAgICAgICAgICAgIGl5ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXggPCB4KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGl4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl5IDwgeSAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3Nbal0uUFVOSVRORVRPID0gMC4wMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiRW50cm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9QYXJhIGxhcyBwcm9tb2Npb24gY29tbzogMlgxLjUsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0VzdGEgc29wb3J0YW5kbyBzb2xvIHBhcmE6IDJYMS41XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tqXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpeSsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGotLTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgICAgICAvL0pHQU0gMjAxOTEwMjMsIGZ1bmNpb25hbGlkYWQgZGUgcXVlIHNvbG8gZW50cmEgYWPDoSBjdWFuZG8gc2UgY2FtYmlvIGFsZ3VuIHByZWNpb1xyXG4gICAgICAgICAgICBpZiAoYkVudHJvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMpO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXIgcHJlY2lvIHRvdGFsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgZGUgcHJlY2lvcyBhIHRlbmVyIGVuIGN1ZW50YVxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBjb21iaSBQcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkFwbFZhbGlkYTogYm9vbGVhbiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgIHZhciBkVmFsb3JQcm9tb0FudDogbnVtYmVyID0gMDtcclxuICAgICAgICAvL3ZhciBkVmFsb3JQcm9tb0FudEFjdW06IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRWYWxvckFjdDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb051ZXZvID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAgICAgICAgIHZhciBwcmVjaW9Ub3RhbEFudGVyaW9yO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbEFudGVyaW9yID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE4IFNFIFFVSVRBIFZBTElEQUNJT04sIFBPUiBGTFVKTyBRVUUgU0kgU0UgREVWVUVMVkUgVFJBRSBMQSBQUk9NTywgUEVSTyBTSSBTRSBCT1JSQS4gaWYgKGRQcmVjaW9OdWV2byA8IHByZWNpb1RvdGFsQW50ZXJpb3IpIHsgLy8gU2UgYWdyZWdhIHZhbGlkYWNpb24gZGUgcHJlY2lvLCBwYXJhIGVzY29nZXIgZWwgbWVqb3IuIE5vIHB1ZWRlbiBhIHZlciAyIHByb21vY2lvbmVzLlxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMUkVBTFwiKS5WYWxvciA9IGRQcmVjaW9OdWV2bztcclxuICAgICAgICAgICAgLy9MaW1waWFyIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIGlmICgodGhpcy5WYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zLCBlbmMpIHx8ICFiQXBsVmFsaWRhKSAmJiAhYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gdGhpcy5HZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3MsIGVuYyk7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JBY3QgPSB0aGlzLkdldFZhbG9yUHJvbW9BQ3QoZW5jLCBkVmFsb3JQcm9tb0FudCwgZFByZWNpb051ZXZvLCBwcmVjaW9Ub3RhbEFudGVyaW9yLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgcGFyYSBwcm9tb2Npb25lcyBhY3VtdWxhYmxlcy4gYWN1bXVsYWJcclxuICAgICAgICAgICAgICAgIGlmICghYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gZFZhbG9yUHJvbW9BbnQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FcyBhY3VtdWxhYmxlLCB1dGlsaXphciBsYSBpbmZvcm1hY2nDs24gXHJcbiAgICAgICAgICAgICAgICAgICAgZFZhbG9yUHJvbW9BbnQgPSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvciAtIHByZWNpb1RvdGFsQW50ZXJpb3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMsIGRWYWxvckFjdCArIGRWYWxvclByb21vQW50KTtcclxuICAgICAgICAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpLCBkVmFsb3JBY3QpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYywgZFByZWNpb051ZXZvKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maWx0ZXIoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlZBTF9QUk9NT0NfXCIpKS5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST19DT01CSV9cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW8gdW5pdGFyaW8sIGEgcGFydGlyIGRlIHVuIG51ZXZvIHByZWNpbyBUb3RhbC5cclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gbmV3UHJpY2UgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvVW5pdEZyb21Ub3RhbChlbmM6IE0zUEVuY0l0ZW1zLCBuZXdQcmljZTogbnVtYmVyKSB7XHJcbiAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA9ICgrbmV3UHJpY2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSB0b2RvcyBsb3MgcHJlY2lvcyBkZSB1biBwcm9kdWN0byBzZSBjYW1iaWFyb24gbyBuby5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBjb24gdG9kb3MgbG9zIGl0ZW1zXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvczogQXJyYXk8YW55PiwgZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIC8vQ2hlY2ssIHNpIGFsZ3VubyBkZSBsYSBsaXN0YSBkZSBwcmVjaW8gZXMgaWd1YWwgYWwgcHJlY2lvIGFudGVyaW9yXHJcbiAgICAgICAgdmFyIHByZWNpb0FudGVyaW9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZpbmQoeCA9PiB4LlBVTklUTkVUTyA9PSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIGlmIChwcmVjaW9BbnRlcmlvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvcmVzIGRlIHByb21vY2lvbmVzIGRlcGVuZGllbmRvIGRlbCBudW1lcm8gZGUgaXRlbXMgcXVlIG5vIHNlIG1vZGlmaWNhcm9uXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRWYWxvciA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIG51bWVyb0l0ZW1zID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciBkVW5pdFByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtudW1lcm9JdGVtcyAqICtkVW5pdFByb21vO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIGRlIGxhIHByb21vY2lvbiBxdWUgc2UgZXN0YSBwcm9jZXNhbmRvIGFjdHVhbG1lbnRlXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIHZhbG9yUHJvbW9BbnQgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3RUb3RhbE51ZXZvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FDdChlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vQW50OiBudW1iZXIsIHZhbG90VG90YWxOdWV2bzogbnVtYmVyLCBwcmVjaW9Ub3RhbEFudDogbnVtYmVyLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yVG90YWxTaW5EdG86IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUHJvbW9BY3Q6IG51bWJlcjtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHNpIHZpZW5lIGFjdW11bGFibGUgdXRpbGl6YXIgZWwgcHJlY2lvIGFudGVyaW9yLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgZHRvLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9IHByZWNpb1RvdGFsQW50O1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG90VG90YWxOdWV2bztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5EdG8gPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG9yUHJvbW9BbnQgLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbG9yUHJvbW9BY3Q7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRWYWxvclByb21vQUN0OiBcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXMoZW5jOiBNM1BFbmNJdGVtcywgdmFsb3JQcm9tbzogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9lbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vRlMgMjAxOTA3MjUgUmVkb25kZW8gZGVsIHZhbG9yIGRlIHByb21vY2lvblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IChNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MTggU2UgYWdyZWdhIGVsIHZhbG9yIHVuaXRhcmlvIGRlIGxhIHByb21vY2nDs25cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZVTklUUFJPTU9cIikuVmFsb3IgPSAoKyhNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAgLyoqXHJcbiAgICAvLyAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAvLyAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXNGcm9tTGlzdGFQcmVjaW9zKGVuYzogTTNQRW5jSXRlbXMsIGxQcmVjaW9zOiBBcnJheTxhbnk+KSB7XHJcbiAgICAvLyAgICAgdHJ5IHtcclxuICAgIC8vICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LlBVTklUTkVUTyA9PSBkVmFsb3IpXHJcbiAgICAvLyAgICAgfSBjYXRjaHtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8vIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWNCZXRhKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgIC8vICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICB2YXIgVGlwb1Byb21vID0gY29tYmkuVGlwbzI7XHJcbiAgICAvLyAgICAgICAgIHZhciBpU2l6ZVByZWM6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgIC8vICAgICAgICAgdmFyIGlNaXRhZDogbnVtYmVyO1xyXG5cclxuICAgIC8vICAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgICAgICB2YXIgeDogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMV1cclxuICAgIC8vICAgICAgICAgdmFyIHk6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzBdIC0gKCt4KTtcclxuICAgIC8vICAgICAgICAgdmFyIGlEdG86IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmICh4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEpIHtcclxuICAgIC8vICAgICAgICAgICAgIHJlc2lkdW9YID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIGlNaXRhZCA9ICgreSkgLyAoK2lTaXplUHJlYyk7XHJcbiAgICAvLyAgICAgICAgIGlNaXRhZCA9IE1hdGguY2VpbCgoK2lNaXRhZCkgKiAoK3gpKSAtIDE7XHJcblxyXG4gICAgLy8gICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciBpWCA9IDA7XHJcbiAgICAvLyAgICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpRHRvID0gaU1pdGFkO1xyXG4gICAgLy8gICAgICAgICAgICAgd2hpbGUgKGlEdG8gPCBpU2l6ZVByZWMpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAocmVzaWR1b1ggPT0gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUoaVggPCB4KXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgaVgrKztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlEdG8rKztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBpWCA9IDA7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgIC8vICAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgIC8vICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgbGlzdGEgZGUgZGV0YWxsZSBlbDogIE5PTUJfUFJPTU9DLCBWQUxfUFJPTU9DIHkgSURfUFJPTU9DXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIGNvbWJpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWdyZWdhckxpc3RhUHJvbW8oZW5jOiBNM1BFbmNJdGVtcywgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgZFZhbG9yUHJvbW9Db21iaTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRldE5vbWJyZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0VmFsb3Jlczogc3RyaW5nO1xyXG4gICAgICAgIHZhciBkZXRJZHM6IHN0cmluZztcclxuXHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNOYW1lczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNWYWxzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc0lkczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKTtcclxuXHJcbiAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXNOYW1lcykge1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuTm9tYnJlQ29uY2VwdG8gPSBcIk5PTUJfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuTm9tYnJlQ29uY2VwdG8gPSBcIlZBTF9QUk9fQ09NQklcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLk5vbWJyZUNvbmNlcHRvID0gXCJJRF9QUk9fQ09NQklcIlxyXG5cclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciA9IFwiXCJcclxuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNOYW1lcylcclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc1ZhbHMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNJZHMpXHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciArIGNvbWJpLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yICsgY29tYmkuSWRQcm9tb2Npb25Db21iaW5hZGEgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yICsgZFZhbG9yUHJvbW9Db21iaS50b1N0cmluZygpICsgXCIsXCI7XHJcblxyXG4gICAgICAgIC8vQWhvcmEgc2UgYWdyZWdhIHVuYSBkaW5hbWljYSBwb3IgYXRyaWJ1dG8gZGUgbGEgcHJvbW8gcGFyYSBmYWNpbGl0YXIgbGEgcmV0b21hIGRlIGVzdGEgaW5mb3JtYWNpw7NuXHJcbiAgICAgICAgbGV0IGxpc3ROb21icmUgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RJZCA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RWYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiSURfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJWQUxfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGFycmF5RGluYW1pY2FzOiBBcnJheTxNM1BEZXRhbGxlSXRlbXM+LCBub21icmVEaW5hbWljYTogc3RyaW5nLCBWYWxvckRpbmFtaWNhOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgb00zUERldGFsbGVJdGVtcyA9IGFycmF5RGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IG5vbWJyZURpbmFtaWNhKTtcclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gVmFsb3JEaW5hbWljYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBub21icmVEaW5hbWljYTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgICAgIGFycmF5RGluYW1pY2FzLnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgcXVlIGFwbGljYW4gYSBsYSBsaXN0YSBjb21iaW5hZGEgcXVlIHRpZW5lXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBPYmpldG8gZGUgcHJvbW9jaW9uIGNvbWJpYW5kYVxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBkZSBNM1Byb2Nlc29cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRFbmNhYmV6YWRvQnlDb21iaShvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbHRlcihlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0UHJvbW9Db21iaW5hZGFFTkMoZW5jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghKGVuYy5JZEVuY1BhZHJlID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5jLlByb21vQ29tYmluYWRhcyAmJiArZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTIwOCBzZSBjYW1iaWEgdmFsaWRhY2lvbiwgcGFyYSBxdWUgdGVuZ2EgZW4gY3VlbnRhIGN1YWxxdWllciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9MaXN0RW5jYWI7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0UHJvbW9Db21iaW5hZGFFTkMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzID0gSlNPTi5wYXJzZShvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgLy8gICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAvLyAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklEIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBsUHJlY2lvcztcclxuXHJcbiAgICAvLyB9XHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vRklOIFYyIENPTUJJTkFEQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogUHJvY2VzYXJDb21iaW5hZGFYcG9yWVxyXG4gICAgKiBQcm9jZXNhciBwcm9tb2Npb24gY29tYmluYWRhIHF1ZSBzZSBsbGV2YW4geCBwcm9kdWN0b3MgcG9yIGVsIHByZWNpb24gZGUgeSBwcm9kdWN0b3MuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhWHBvclkob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG86IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdmFyIG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgdmFyIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvO1xyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBhZ3JlZ2FkbywgdGllbmUgdW5hIG1pc21hIHByb21vY2lvbiBhY3RpdmEgZW4gbGEgZmFjdHVyYS5cclxuICAgICAgICAvLyBpZiAob00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSAhPSBudWxsICYmIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvID0gb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYS5maW5kKGNvbWJpbmFkYXMgPT4gY29tYmluYWRhcy5JZFByb21vY2lvbiA9PSBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSAmJiBjb21iaW5hZGFzLlRlcm1pbmFkYSA9PSBmYWxzZSk7XHJcbiAgICAgICAgLy8gICAgIC8vVmFsaWRhIHNpIHlhIGV4aXN0ZSB1biBwcm9jZXNvLlxyXG4gICAgICAgIC8vICAgICBpZiAobTNDb21iaW5hZGF4UHJvY2VzbyAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvblhQcm9jZXNvID0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvO1xyXG4gICAgICAgIC8vICAgICAgICAgLy9UcmFlIGxvcyBFbmNhYmV6YWRvcyBjb24gbGEgcHJvbW9jaW9uIFxyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jcyA9PiBlbmNzLlByb21vQ29tYmluYWRhcyAhPSBudWxsICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jcy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9PSBtM0NvbWJpbmFkYXhQcm9jZXNvLklkUHJvbW9jaW9uWFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbywgbTNDb21iaW5hZGF4UHJvY2Vzbyk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkFncmVnYXJQcm9tb2Npb25Db21iaW5hZGFBUHJvY2VzbyhvTTNQcm9jZXNvcywgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSA9IG5ldyBBcnJheTxNM1Byb21Db21iaW5hZGFYUHJvY2Vzbz4oKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcmVjYWxjdWxhciBwcm9tb2Npb24sIGRlcGVuZGllbmRvIGRlIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIC8vMS5WYWxpZGFyIHNpIHlhIGVzdGFuIHRvZG9zIGxvcyBpdGVtcyBwYXJhIHJlY2FsY3VsYXIgbGEgcHJvbW9jaW9uXHJcbiAgICAvLzIuIE9yZGVuYXIgbG9zIGVuY2FiZXphZG9zIGRlIG1heW9yIGEgbWVub3IgcHJlY2lvLlxyXG4gICAgLy8zLiBEZWphciBlbCBwcmVjaW8gZGUgbG9zIGl0ZW1zIGRlIG1lbm9yIHByZWNpb24gZW4gMFxyXG4gICAgLy8gcHVibGljIFJlY2FsY3VsYXJQcm9tb1hQb3JZKG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz4sIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvKSB7XHJcbiAgICAvLyAgICAgdmFyIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYTtcclxuICAgIC8vICAgICB2YXIgdmFyeDogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciB2YXJ5OiBudW1iZXI7XHJcbiAgICAvLyAgICAgdmFyIHBhcnRlRGVjWTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvUHJvbW9jaW9uQ29tYmluYWRhID0gbTNFbmNzQ29uUHJvbW9bMF0uUHJvbW9Db21iaW5hZGFzWzBdO1xyXG5cclxuICAgIC8vICAgICB2YXJ4ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMF0pO1xyXG4gICAgLy8gICAgIHZhcnkgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChTdHJpbmcodmFyeSkuaW5jbHVkZXMoXCIuXCIpKSB7XHJcbiAgICAvLyAgICAgICAgIHBhcnRlRGVjWSA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzFdLnNwbGl0KFwiLlwiKVsxXSk7XHJcbiAgICAvLyAgICAgICAgIHZhcnkgPSBwYXJzZUZsb2F0KFN0cmluZyh2YXJ5KS5zcGxpdChcIi5cIilbMF0pO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgaWYgKHZhcnggPT0gbTNFbmNzQ29uUHJvbW8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIG0zQ29tYmluYWRheFByb2Nlc28uVGVybWluYWRhID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgLy9PcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBwb3IgcHJlY2lvIG1heW9yIGEgbWVub3JcclxuICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBtM0VuY3NDb25Qcm9tby5zb3J0KChhLCBiKSA9PlxyXG4gICAgLy8gICAgICAgICAgICAgKGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yIDwgYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpID8gMSA6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKChiLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IC0xIDogMCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtM0VuY3NDb25Qcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgLy9WYWxpZGEgc2kgeWEgXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGFydGVEZWNZICE9IDAgJiYgKCtpKSA9PSAoK3ZhcnkpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFydGVEZWNZKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoKCttM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpICogKCsoK3BhcnRlRGVjWSkgLyAxMDApKS50b1N0cmluZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIGlmICgoK2kpICsgMSA+IHZhcnkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBcIjBcIjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRvdGFsIGRlIHB1bnRvcyBkZSBmaWRlbGl6YWNpb24gZW4gbGEgdHJhbnNhY2Npw7NuIHJlZG9uZGVhZG9zIGhhY8OtYSBhYmFqb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X3RvdGFsX2ZpZGVsaXphY2lvbihvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB0b3RhbF9maWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdG90YWxfZmlkZWxpemFjaW9uID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJGSURFTElaQUNJT05cIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgoKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiRklERUxJWkFDSU9OXCIpLlZhbG9yKSAvIDEwMCkgKiAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLCAwKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1NlIHJlZG9uZGVhcmEgbm8gYWNhIHNpbm8gZW4gbGEgc3VtYSB0b3RhbCBkZWwgZmlkZWxpemFjaW9uIGRlIGNhZGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICAgIHJldHVybiB0b3RhbF9maWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRpZW5lIGVsIHZhbG9yIGRlbCBmaWRlbGl6YWNpb24gZGUgdW4gcHJvY2VzbywgZXZhbHVhbmRvIGNhZGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICogQHBhcmFtIHByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gbGlzdF9lbmNfcHJvbW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfdmFsdWVfZmlkZWxpemFjaW9uX2J5X3Byb2Nlc28ocHJvY2VzbzogTTNQcm9jZXNvcywgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcblxyXG4gICAgICAgIHZhciBwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciA9IHByb2Nlc28uVmFsb3JOZXRvO1xyXG4gICAgICAgIC8vdmFyIG1heF92YWx1ZV9maWRlbGl6YWNpb246IG51bWJlciA9IHRoaXMuZ2V0X3RvdGFsX2ZpZGVsaXphY2lvbihwcm9jZXNvKTtcclxuICAgICAgICB2YXIgcmVhbF92YWx1ZV9maWRlbGl6YWNpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIHZhciBsaXN0X2NvbmRpX3Byb21vID0gdGhpcy5nZXRfbGlzdF9jb25kaV9wcm9tb19ieV9hY3RpdmlkYWQobGlzdF9lbmNfcHJvbW8sIFwiUEFHT1wiLCBcIk1PTkVERVJPXCIpO1xyXG5cclxuICAgICAgICBpZiAocHJvY2Vzby5sTTNQRW5jRlApIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHByb2Nlc28ubE0zUEVuY0ZQLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hX3BhZ286IE0zUEVuY0ZQID0gcHJvY2Vzby5sTTNQRW5jRlBbX2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21vQXBsaWNhZGE6IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgICAgIGxldCBhcGxpY2FfZmlkZWxpemFjaW9uID0gdGhpcy52YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ28sIGxpc3RfY29uZGlfcHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcGxpY2FfZmlkZWxpemFjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JQYWdvID0gZm9ybWFfcGFnby5WYWxvciAtIGZvcm1hX3BhZ28uVmFsQ2FtYmlvO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uICs9IHRoaXMuY2FsY3VsYXRlX2ZpZGVsaXphY2lvbl9ieV9mb3JtYV9wYWdvKHBhZ29fdG90YWxfcHJvY2VzbywgcHJvY2Vzby5NM0VOQywgdmFsb3JQYWdvLCBhcGxpY2FfZmlkZWxpemFjaW9uLCBsaXN0X2VuY19wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA+IG1heF92YWx1ZV9maWRlbGl6YWNpb24pIHtcclxuICAgICAgICAvLyAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMub01hdGhURi5yb3VuZChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiwgMik7XHJcbiAgICAgICAgcmV0dXJuIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIGRlIHRpcG8gZGUgcGFnbyBhIHBhcnRpciBkZSBBcnJheTxNM0NPTkRJUFJPTU8+XHJcbiAgICAgKiBAcGFyYW0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvIC5cclxuICAgICAqIEBwYXJhbSBsaXN0TTNFbmNJdGVtIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG86IEFycmF5PE0zQ09ORElQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPik6IEFycmF5PE0zQ09ORElQUk9NTz4ge1xyXG4gICAgICAgIGxldCByZXN0cmljY2lvbmVzQWN0aXZhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgaWYgKGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0TTNFbmNJdGVtLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpc3RNM0RldCA9IGxpc3RNM0VuY0l0ZW1bX2ldLk0zREVUO1xyXG4gICAgICAgICAgICAgICAgaWYgKCtsaXN0TTNFbmNJdGVtW19pXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tb2Npb25lcyA9IGxpc3RNM0RldC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRQcm9tb2Npb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tbyA9IGlkUHJvbW9jaW9uZXMuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgaWRQcm9tby5sZW5ndGg7IF9rKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9ICtpZFByb21vW19rXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaVByb21vID0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaVByb21vICYmICFyZXN0cmljY2lvbmVzQWN0aXZhcy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljY2lvbmVzQWN0aXZhcy5wdXNoKGNvbmRpUHJvbW8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3RyaWNjaW9uZXNBY3RpdmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIHBhcmEgbG9zIHByb2R1Y3RvcyBkZWwgcHJvY2VzbyBhY3R1YWxcclxuICAgICAqIEBwYXJhbSBsaXN0RW5jUHJvbW8gXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXNGcm9tRW5jUHJvbW8obGlzdEVuY1Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgbGlzdE0zRW5jSXRlbTogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RFbmNQcm9tbywgXCJQQUdPXCIsIFwiUkVTVFJJQ0NJT05fUEFHT1wiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8sIGxpc3RNM0VuY0l0ZW0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIG1vdmltaWVudG9zIHJlYWxpemFkb3MgcG9yIHVuIG0zc2FsZG9zeGN1ZW50YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkX20zXCI6IGlkbTMsIFwiaWRfcHJvY2Vzb1wiOiBwcm9jZXNvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBtb3ZzID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcF9tb3ZzOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICBpZiAoIW1vdnMuTU9WUy5NT1YubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzLnB1c2gobW92cy5NT1ZTLk1PVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBtb3ZzLk1PVlMuTU9WO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcF9tb3ZzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgbGEgZm9ybWEgZGUgcGFnbyBjdW1wbGUgYWxndW5hIGNvbmRpY2lvbiBkZSBmaWRlbGl6YWNpb25cclxuICAgICAqIEBwYXJhbSBmb3JtYV9wYWdvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfY29uZGlfcHJvbW86IGxpc3RhZG8gZGUgY29uZGljaW9uZXMgZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ286IE0zUEVuY0ZQLCBsaXN0X2NvbmRpX3Byb21vOiBBcnJheTxNM0NPTkRJUFJPTU8+KSB7XHJcbiAgICAgICAgLy9yZXR1cm4gbGlzdF9jb25kaV9wcm9tb1swXTtcclxuICAgICAgICBsZXQgcHJvbW9zQXBsaWNhZGFzID0gbmV3IEFycmF5PE0zQ09ORElQUk9NTz4oKTtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdF9jb25kaV9wcm9tby5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdmFyIGNvbmRpX3Byb21vID0gbGlzdF9jb25kaV9wcm9tb1tfaV07XHJcbiAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbmRpX3Byb21vLkNvbmNlcHRvLnRyaW0oKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIklEX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICAvL1NpIGVsIG9wZXJhZG9yIGVzIERJRkYgY3JlYSB1bmEgZXhwcmVzaW9uIHJlZ3VsYSBwYXJhIGV4Y2x1aXIgbG8gdGlwb2RlcGFnbyBjb25maWd1cmFkb3NcclxuICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYSAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkRJRkZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaV9wcm9tby5WYWxvciA9IFwiXig/IShcIiArIGNvbmRpX3Byb21vLlZhbG9yICsgXCIpXFxcXGIpXFxcXHcrJFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKSRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChjb25kaV9wcm9tby5WYWxvciwgXCJpXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS50ZXN0KGZvcm1hX3BhZ28uSWRUaXBvUGFnby50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3NBcGxpY2FkYXMucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9tb3NBcGxpY2FkYXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIGxpc3RhZG8gZGUgY29uZGljaW9uZXMgdmFsaWRhcyBwYXJhIHVuYSBhY3RpdmlkYWQgZGFkYVxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgYWN0aXZpZGFkOiBzdHJpbmcsIHRpcG8yOiBzdHJpbmcpOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPiA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAgIGlmIChsaXN0X2VuY19wcm9tbykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGlzdF9lbmNfcHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5jYWJlemFkb1Byb21vID0gbGlzdF9lbmNfcHJvbW9bX2tdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRWaWdlbmNpYSA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5WaWdlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZEluaWNpbyA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5JbmljaW8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc3RhZG8gJiYgZFZpZ2VuY2lhID49IGhveSAmJiBkSW5pY2lvIDw9IGhveSAmJiBlbmNhYmV6YWRvUHJvbW8uVGlwbzIgPT0gdGlwbzIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgZW5jYWJlemFkb1Byb21vLk0zQ09ORElBR1JVUEFDSU9OLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfYWdydXBhY2lvbiA9IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTltfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaiA9IDA7IF9qIDwgY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU8ubGVuZ3RoOyBfaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfcHJvbW8gPSBjb25kaV9hZ3J1cGFjaW9uLk0zQ09ORElQUk9NT1tfal07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEICYmIGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBhY3RpdmlkYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9jb25kaV9wcm9tby5wdXNoKGNvbmRpX3Byb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2NvbmRpX3Byb21vO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuYSBmb3JtYSBkZSBwYWdvIGRlIGFjdWVyZG8gYSBzdSBwb3JjZW50YWplIHJlc3BlY3RvIGVsIHZhbG9yIHRvdGFsIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcGFnb190b3RhbF9wcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIG1heF92YWx1ZV9maWRlbGl6YWNpb24gXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVfZm9ybWFfcGFnbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciwgbGlzdE0zRW5jOiBNM1BFbmNJdGVtc1tdLCB2YWx1ZV9mb3JtYV9wYWdvOiBudW1iZXIsIHByb21vc0FwbGljYWRhOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuICAgICAgICBsZXQgbGlzdFByb21vc0FwbGljYWRhcztcclxuICAgICAgICBsZXQgZGV0YWxsZUlkUHJvbW9jO1xyXG4gICAgICAgIGxldCB2YWxvckZpZGVsaXphY2lvbiA9IDA7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRfZm9ybWFfcGFnbzogbnVtYmVyID0gdmFsdWVfZm9ybWFfcGFnbyAvIHBhZ29fdG90YWxfcHJvY2VzbztcclxuICAgICAgICB2YXIgcHJlY2lvUHJvZHVjdG8gPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0TTNFbmMpIHtcclxuICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IFtdO1xyXG4gICAgICAgICAgICBkZXRhbGxlSWRQcm9tb2MgPSBpdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPTU9DXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Qcm9kdWN0byA9ICtpdGVtLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBsZXQgcHJlY2lvU1IgPSBpdGVtLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1NSXCIpO1xyXG4gICAgICAgICAgICBpZiAocHJlY2lvU1IgIT0gbnVsbCAmJiBwcmVjaW9TUi5WYWxvciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwcmVjaW9Qcm9kdWN0byA9ICtwcmVjaW9TUi5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZUlkUHJvbW9jICYmIGRldGFsbGVJZFByb21vYy5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IGRldGFsbGVJZFByb21vYy5WYWxvci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tb0FwbCBvZiBwcm9tb3NBcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RQcm9tb3NBcGxpY2FkYXMuZmluZCh4ID0+ICt4ID09IHByb21vQXBsLklkUHJvbW9jaW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9IGxpc3RfZW5jX3Byb21vLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vQXBsLklkUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3IgPSB0aGlzLnZhbGlkYXJSZWRvbmRlbyhwcm9tbywgcHJlY2lvUHJvZHVjdG8gKiB0aGlzLmdldFBvcmNlbnRhamVGaWRlbGl6YWNpb25Gcm9tRW5jUHJvbW8ocHJvbW8pIC8gMTAwKSAqIChwZXJjZW50X2Zvcm1hX3BhZ28pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yRmlkZWxpemFjaW9uICs9IHZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvckZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09UICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhclJlZG9uZGVvKHByb21vLCB2YWxvcjogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09UICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uUmVkb25kZW8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQodmFsb3IsICtqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uUmVkb25kZW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWxvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmEgdW5hIGRpbmFtaWNhIGNvbiBlbCB2YWxvciBkZSBsYSBmaWRlbGl6YWNpw7NuIGRlIGRpY2hvIHByb2Nlc28geSByZXRvcm5hIGRpY2hvIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkX2RpbmFtaWNhX2ZpZGVsaXphY2lvbl90b19wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPik6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIHZhciB2YWx1ZV9maWRlbGl6YWNpb24gPSAwXHJcbiAgICAgICAgaWYgKGxpc3RfZW5jX3Byb21vKSB7XHJcbiAgICAgICAgICAgIHZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMuZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc28sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZV9maWRlbGl6YWNpb24gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYV9maWRlbGl6YWNpb246IE0zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLk5vbWJyZSA9IFwiRklERUxJWkFDSU9OXCJcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLlZhbG9yID0gdmFsdWVfZmlkZWxpemFjaW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChkaW5hbWljYV9maWRlbGl6YWNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBkb2N1bWVudG8gZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRhYmxhIE0zU2FsZG9zWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRvIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9kb2NfZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzYWxkb194X2N1ZW50YTtcclxuICAgICAgICAgICAgc2FsZG9feF9jdWVudGEgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLk0zU2FsZG9zWEN1ZW50YTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHNhbGRvX3hfY3VlbnRhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgZWwgc2FsZG8gc3VtYW5kb2xlIGVsIHZhbG9yIGVudmlhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbGl6YXJfc2FsZG9fZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0ge1wiZG9jdW1lbnRvXCI6ZG9jdW1lbnRvLCBcInZhbG9yX21vdmltaWVudG9cIjp2YWxvcl9tb3ZpZW50bywgXCJwYWdvXCI6cGFnbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9hY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEucGFnby5pZERpYXJpbyA9IHJlc3BbXCJfYm9keVwiXS5yZXBsYWNlKCdcIicsICcnKS5yZXBsYWNlKCdcIicsICcnKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEucGFnbyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBVbiBib25vIGRlIGRldm9sdWNpb24gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3J9XHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9ib25vX2Rldm9sdWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gbnVldm8gcmVnaXN0cm8gZW4gbGEgdGFibGEgU2FsZG9YQ3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM0luc2VydFNhbGRvWEN1ZW50YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7ICdEb2N1bWVudG8nOiB0aGlzLmRvY3VtZW50bywgJ1REb2NUaXR1bGFyJzogJzUnLCAnTkRvY1RpdHVsYXInOiB0aGlzLm5kb2NfY2xpZW50ZSwgJ05vbUN1ZW50YSc6ICdGSURFTElaQUNJT04nLCAnVmFsQ3VlbnRhJzogMCB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM0luc2VydFNhbGRvWEN1ZW50YS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKE0zRU5DOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICBpZiAoTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IE0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
2871
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbW9jaW9uZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NmLXJlZ2xhbmVnb2Npb20zLyIsInNvdXJjZXMiOlsibGliL3JubTMvUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBTUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pELE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUVsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUcxRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDdkIsTUFBTTs7Ozs7SUFNRixZQUFZLFNBQWMsRUFBRSxjQUEyQjt1QkFMOUIsSUFBSSxNQUFNLEVBQUU7eUJBVWxCO1lBQ2YsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUEsRUFBRTtZQUNyQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQSxFQUFFO1lBQ3JDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBLEVBQUU7WUFDdkMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtZQUN2QyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FB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QUFJLFNBQVMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7aUJBQU07Z0JBQ0gsT0FBTyxTQUFTLENBQUM7YUFDcEI7U0FDSjthQUFNO1lBQ0gsT0FBTyxDQUFDLENBQUM7U0FDWjs7Q0FFUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE0zRU5DUFJPTU8gfSBmcm9tICcuL01vZGVscy9NM0VOQ1BST01PLmNsYXNzJztcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tICcuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlJztcclxuaW1wb3J0IHsgTTNDT05ESUFHUlVQQUNJT04gfSBmcm9tICcuL01vZGVscy9NM0NPTkRJQUdSVVBBQ0lPTi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zQ09ORElQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElQUk9NTy5jbGFzcyc7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHcnAudHlwZSc7XHJcbmltcG9ydCB7IE0zREVUQ09ORElQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zREVUQ09ORElQUk9NTy5jbGFzcyc7XHJcbmltcG9ydCB7IFByb21vY2lvbmVzQXNvY2lhZGFzLCBQcm9tb2Npb25Qcm9jZXNhZGEsIFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gJy4vTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgeyBNM1Byb21Db21iaW5hZGFYUHJvY2VzbyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXByb20tY29tYic7XHJcbmltcG9ydCB7IE0zUEVuY0l0ZW1zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGVuYy1pdGVtcyc7XHJcbmltcG9ydCB7IE0zUEVuY0ZQIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGVuYy1mcCc7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXMnO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSAnLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZSc7XHJcbmltcG9ydCB7IF9pdGVyYWJsZURpZmZlcnNGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9zcmMvYXBwbGljYXRpb25fbW9kdWxlJztcclxuaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BJdGVtc1dFQiB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zJztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tICcuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlJztcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSAnLi4vTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1BlclhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGVyLXgtcHJvY2Vzbyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9tMy1yZWctc2VydmljZSc7XHJcbmltcG9ydCB7IE0zUHJkTGlzdGEgfSBmcm9tICcuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZSc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5leHBvcnQgY2xhc3MgcHJvbW9jaW9uZXNTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvTWF0aFRGOiBNYXRoVEYgPSBuZXcgTWF0aFRGKCk7XHJcbiAgICBwdWJsaWMgZ29EYXRhVXNlcjogYW55O1xyXG4gICAgcHVibGljIGdvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUI7XHJcbiAgICBwdWJsaWMgZ29NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvRGF0YVVzZXI6IGFueSwgb0RhdGFBZGljaW9uYWw6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFVc2VyID0gb0RhdGFVc2VyO1xyXG4gICAgICAgIHRoaXMuZ29EYXRhQWRpY2lvbmFsID0gb0RhdGFBZGljaW9uYWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZXJhdG9ycyA9IHtcclxuICAgICAgICAnPCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIDwgYiB9LFxyXG4gICAgICAgICc+JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPiBiIH0sXHJcbiAgICAgICAgJzw9JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPD0gYiB9LFxyXG4gICAgICAgICc+PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID49IGIgfSxcclxuICAgICAgICAnSUdVQUwnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PSBiIH0sXHJcbiAgICAgICAgJ0RJRkYnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAhPSBiIH0sXHJcbiAgICAgICAgJ0VOJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPT09IGIgfSxcclxuICAgICAgICAnQU5EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJiYgYiB9LFxyXG4gICAgICAgICdPUic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIHx8IGIgfSxcclxuICAgICAgICAnKic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiB0cnVlIH0sXHJcbiAgICAgICAgJ01PRCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICUgYiA9PSAwIH0sXHJcbiAgICAgICAgLy8gLi4uXHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBJbmljaW8gT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvL1ZlcmlmaWNhciBwcm9tb2Npb25lcywgaW5ncmVzYW5kbyBjb21vIHBhcmFtZXRybyBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvZHVjdG8gYSB2YWxpZGFyLCBVYmljYWNpb25cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGxUaXBvc1Byb21vOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHZhciBhUmVzcHMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHZhciBhUHJvbW9jaW9uZXMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHZhciBob3kgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZ29NM0VOQ1BST01PID0gb00zRU5DUFJPTU87XHJcbiAgICAgICAgaWYgKG9NM0VOQ1BST01PKSB7XHJcbiAgICAgICAgICAgIG9NM0VOQ1BST01PLmZpbHRlcih4ID0+IGxUaXBvc1Byb21vLmZpbmQocHJvbW8gPT4geC5UaXBvID09IHByb21vKSkuZm9yRWFjaChlbmNhYmV6YWRvUHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRWaWdlbmNpYSA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5WaWdlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZEluaWNpbyA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5JbmljaW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTAyMywgc2UgcXVpdGEgVGlwbyBNYW51YWwsIHkgc2UgZGVqYSBlbCBudWV2byBwYXJhbWV0cm8uXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGFyRXN0YWRvc0VuY1Byb21vKGVuY2FiZXphZG9Qcm9tbykgJiYgKGVuY2FiZXphZG9Qcm9tby5Fc3RhZG8gJiYgZFZpZ2VuY2lhID49IGhveSAmJiBkSW5pY2lvIDw9IGhveSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLy8vLy8vIFZhbGlkYWNpb246IDEuIFNpIGVzIGRpZmVyZW50ZSBhIE1hbnVhbCwgbm8gdmFsaWRhIFZhcmlhYmxlIGVzdGFkb3MgbWFudWFsZXMuIERlIGxvIGNvbnRyYXJpbyBsbyB2YWxpZGEuIC0tLSAyLiBTaSBlbCBlc3RhZG8gZWwgZXN0YWRvIGVzIHZlcmRhZGVybyB5IGxhIHZpZ2VuY2lhIGVzIG1heW9yIG8gaWd1YWwgYSBsYSBmZWNoYSBkZWwgbW9tZW50b1xyXG4gICAgICAgICAgICAgICAgICAgIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jYWJlemFkb1Byb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goYWdydXBhY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJBZ3J1cGFjaW9uUHJvbW8ob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgYWdydXBhY2lvbiwgZW5jYWJlemFkb1Byb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdldEpSZXNwRnJvbUFycmF5KGFSZXNwcywgZW5jYWJlemFkb1Byb21vLlRpcG8sIGVuY2FiZXphZG9Qcm9tby5UaXBvMik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1ZhbGlkYWNpb24gZGUgYWNjaW9uLCBzaSBleGlzdGUsIHNpbm8gZXhpc3RlIHNlIGFncmVnYSBkZWwgcGFwYS4gU2UgZW52aWEgY29tbyByZWZlcmVuY2lhIGpyZXNwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckFjY2lvbihqUmVzcCwgZW5jYWJlemFkb1Byb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmV0b21hclZhbG9yZXNQcm9tb2Npb24oZW5jYWJlemFkb1Byb21vLCBqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFQcm9tb2Npb25lcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGFQcm9tb2Npb25lcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vOiBNM0VOQ1BST01PKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGVzdGFkbyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXNNYW51YWwgJiYgIWVuY2FiZXphZG9Qcm9tby5Fc3RhZG9NYW51YWxlcykge1xyXG4gICAgICAgICAgICBlc3RhZG8gPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXNBcGxDdXBvbiAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb0FwbEN1cG9uKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVzdGFkbztcclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBhZ3J1cGFjaW9uIGRlIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uOiBNM0NPTkRJQUdSVVBBQ0lPTiwgb00zRW5jUHJvbW86IE0zRU5DUFJPTU8pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhZ3J1cGFjaW9uLk0zQ09ORElQUk9NTy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY29uZGljaW9uOiBNM0NPTkRJUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXM7XHJcbiAgICAgICAgICAgIGNvbmRpY2lvbiA9IGFncnVwYWNpb24uTTNDT05ESVBST01PW2ldO1xyXG4gICAgICAgICAgICBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpY2lvbi5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICBpZiAoIWpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCB8fCBqQWRpY2lvbmFsZXMuUk9PVC5BQ1RJVklEQUQgPT0gXCJSRUdJU1RST1wiKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FyQ29uZGljaW9uZXNQcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBjb25kaWNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvTTNFbmNQcm9tby5UaXBvID09IFwiQ09NQklOQURBXCIgJiYgb00zRW5jUHJvbW8uVGlwbzIgPT0gXCJDT01CT1wiICYmIGpSZXNwLkFQTENvbmRpY2lvbiAmJiBhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiT1JcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFORFwiICYmICFqUmVzcC5BUExDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAvL0xhIGNvbmRpY2lvbiBOTyBzZSBjdW1wbGVcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiICYmIGpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBkZWJlIGd1YXJkYXIgbGEgaW5mb3JtYWNpw7NuLiBTaSBzaWVtcHJlIGZ1ZXJvbiBPUiB5IEZBTFNFLCBzZSBkZWJlIGNvbXBhcmFyIGNvbW8gdW4gQU5ELlxyXG4gICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLkdldEpSZXNwRnJvbUFycmF5KGFSZXNwcywgb00zRW5jUHJvbW8uVGlwbywgb00zRW5jUHJvbW8uVGlwbzIpO1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9WZXJpZmljYXIgY29uZGljaW9uIGRlIHByb21vY2lvbmVzLlxyXG4gICAgcHVibGljIFZlcmlmaWNhckNvbmRpY2lvbmVzUHJvbW8ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICB2YXIgakFkaWNpb25hZXM7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGpBZGljaW9uYWVzID0gSlNPTi5wYXJzZShjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FyQ29uZGljaW9uQ29udHJhRGF0YShvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBjb25kaWNpb24sIGpBZGljaW9uYWVzKTtcclxuICAgICAgICB0aGlzLlZhbGlkYXJBY2Npb24oalJlc3AsIGNvbmRpY2lvbi5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIHRoaXMuQWdyZWdhckNvbmRpY2lvbk9LKGpSZXNwLCBjb25kaWNpb24pO1xyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgYSBqc29uIGRlIHJlc3B1ZXN0YSBzaSBzZSBnZW5lcm8gT0sgbGEgaW5mb3JtYWNpb24gZGUgbGEgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0galJlc3AgXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWdyZWdhckNvbmRpY2lvbk9LKGpSZXNwLCBjb25kaWNpb246IE0zQ09ORElQUk9NTykge1xyXG4gICAgICAgIGlmIChqUmVzcC5BUExDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgalJlc3AuSURDb25kaWNpb24gPSBjb25kaWNpb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1ZlcmlmaWNhIGNvbmRpY2lvbiwgY29udHJhIGRhdGEgaW5ncmVzYWRhLlxyXG4gICAgcHVibGljIFZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcyk6IGFueSB7XHJcbiAgICAgICAgdmFyIG9iamVjdEZpbmRlZDtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5Fc3QpIHtcclxuICAgICAgICAgICAgICAgIC8vVmEgYSBlc3RydWN0dXJhIGRlIHByb2R1Y3RvIGFkaWNpb25hbFxyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxvTTNQcmRBZGljaW9uYWxlc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZCA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpYyA9PiBhZGljLkFUUklCVVRPLnRyaW0oKSA9PSBjb25kaWNpb24uQ29uY2VwdG8udHJpbSgpICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShhZGljLlZBTE9SLnRyaW0oKSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0RmluZGVkLkpBZGljaW9uYWxlcyA9IEpTT04uc3RyaW5naWZ5KGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2JqZWN0RmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRUT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvUHJvZHVjdG8ob1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBSREdSUFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvUHJvZHVjdG9QUkRHUlAob1R5cGVNM1ByZEdycCwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk0zREVUQ09ORElQUk9NT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYWNpb25NM0RldGFsbGVDb25kaWNpb24ob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLk0zREVUQ09ORElQUk9NTywgY29uZGljaW9uLkNvbmNlcHRvLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0NFU09cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2Nlc28ob00zUHJvY2Vzb3MsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhclByb2Nlc29Gb3JtYVBhZ28ob00zUHJvY2Vzb3MsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9MSVNUQVBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMudmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiVVNFUlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvVXNlckRhdGEoY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQURJQ0lPTkFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9BZGljaW9uYWwoY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJDQVJBQ1RFUklTVElDQVNcIjpcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy9Fc3RhIHByb21vY2nDs24gZXN0YSBkaXNlw7FhZGEgcGFyYSBxdWUgc2VhIHByb2Nlc2FkYSBhbCBmaW5hbCBkZSBsYSB0cmFuc2FjY2nDs25cclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNsYXNpZmljYWNpb25lc1Byb2Nlc28ob00zUHJvY2Vzb3MsIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm8gRW50cm8gcG9yIERldGFsbGUhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldEpSZXNwRnJvbUFycmF5KGFSZXNwczogQXJyYXk8YW55PiwgdGlwbywgdGlwbzIpIHtcclxuICAgICAgICB2YXIgYkFQTENvbmRpY2lvbjtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgaWYgKGFSZXNwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vTExlZ2EgYSBlc3RlIHB1bnRvLCBwb3IgYWxndW5hIGRlIDIgcmF6b25lczogXHJcbiAgICAgICAgICAgIC8vMS4gTGEgY29uZGljacOzbiBlcyB1biBPUiB5IHRvZG9zIHNvbiBGQUxTRVxyXG4gICAgICAgICAgICAvLzIuIExhIGNvbmRpY2nDs24gZXMgdW4gQU5EIHkgdG9kb3Mgc29uIFRSVUVcclxuICAgICAgICAgICAgYkFQTENvbmRpY2lvbiA9IGFSZXNwcy5maWx0ZXIocmVzcCA9PiByZXNwLkFQTENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgIGlmICghYkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGlwbyA9PSBcIkNPTUJJTkFEQVwiICYmIHRpcG8yID09IFwiQ09NQk9cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcnJlZ2xvQ29uZGljaW9uZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBiQVBMQ29uZGljaW9uLmZvckVhY2goY29uZGljaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbi5JRENvbmRpY2lvbi5sZW5ndGggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uLklEQ29uZGljaW9uLmZvckVhY2goaWRDb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGlkQ29uKSkgYXJyZWdsb0NvbmRpY2lvbmVzLnB1c2goaWRDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmVnbG9Db25kaWNpb25lcy5maW5kKHggPT4geCA9PSBjb25kaWNpb24uSURDb25kaWNpb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChjb25kaWNpb24uSURDb25kaWNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgQVBMQ29uZGljaW9uOiB0cnVlLCBBY2Npb246IG51bGwsIElEQ29uZGljaW9uOiBhcnJlZ2xvQ29uZGljaW9uZXMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhUmVzcFRNUCA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9WZXJpZmljYXIgc2kgYWxndW5vIGRlIGxvcyBhcnJlZ2xvcyB0aWVuZSBhY2Npb24gZGlmZXJlbnRlIGEgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIGFSZXNwVE1QID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQWNjaW9uICE9IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhUmVzcFRNUC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVXNhciBlbCB1bHRpbW8gaXRlbSwgcXVlIHRlbmdhIGxhIGFjY2nDs25cclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcFRNUFthUmVzcFRNUC5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IGFSZXNwc1thUmVzcHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSBsYSBwcm9tbyBkZXBlbmRlIGRlIGxhIGZvcm1hIGRlIHBhZ28gYcOxYWRlIGVzdGEgaW5mb3JtYWNpw7NuXHJcbiAgICAgICAgICAgIGlmIChhUmVzcHMuZmluZCh4ID0+IHguRm9ybWFQYWdvKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3BbXCJGb3JtYVBhZ29cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vR2VuZXJhciBSZXNwdWVzdGEgZGUgY29uZGljaW9uLlxyXG4gICAgcHVibGljIEdlbmVyYXJSZXNwdWVzdGEoYkFQTFByb21vOiBib29sZWFuLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgalJlc3AgPSB7IFwiQVBMQ29uZGljaW9uXCI6IGJBUExQcm9tbywgXCJBY2Npb25cIjogbnVsbCB9O1xyXG4gICAgICAgIGlmIChqQWRpY2lvbmFsZXMgIT0gbnVsbCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgY2xhc2lmaWNhY2lvbmVzIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFByb2Nlc29zIGRlIE0zXHJcbiAgICAgKiBAcGFyYW0gZGV0Q29uZGljaW9uZXMgQ29uZGljaW9uZXMgZGUgcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckNsYXNpZmljYWNpb25lc1Byb2Nlc28ob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICAvL3ZhciBpQ2FudGlkYWRSZWFsOiBudW1iZXIgPSBsUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciBiRW50cm86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFsb3JlcyA9IHZhbG9yZXMuc29ydCgoYSwgYikgPT4gKGEuQ2FudGlkYWQgPCBiLkNhbnRpZGFkKSA/IDEgOiAoKGIuQ2FudGlkYWQgPCBhLkNhbnRpZGFkKSA/IC0xIDogMCkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIGxQcmVjaW9zLmxlbmd0aCk7Ly9KQUdNIDIwMTkwNzMxLCBmdW5jaW9uIHJlY3Vyc2l2YSBwYXJhIGNhbGN1bGFyIGxvcyBwcmVjaW9zIG51ZXZvcy5cclxuXHJcbiAgICAgICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwICYmIGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvID09IHRydWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2Vzb1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgY2xhc2lmaWNhY2lvbmVzIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFByb2Nlc29zIGRlIE0zXHJcbiAgICAgKiBAcGFyYW0gZGV0Q29uZGljaW9uZXMgQ29uZGljaW9uZXMgZGUgcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2Nlc2FyQ2FyYWN0ZXJpc3RpY2FQYXJjaWFsKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgbFByZWNpb3M6IEFycmF5PGFueT4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueSA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yZXM6IEFycmF5PGFueT4gPSBjb21iaS5BY2Npb24uVmFsb3JlcztcclxuICAgICAgICAgICAgdmFsb3JlcyA9IHZhbG9yZXMuc29ydCgoYSwgYikgPT4gYS5DYW50aWRhZCAtIGIuQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxQcmVjaW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsb3JQcm9tbyA9IGkgPCB2YWxvcmVzLmxlbmd0aCA/IHZhbG9yZXNbaV0uVmFsb3IgOiAwXHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaV0uUFVOSVRORVRPIC0gKCgrbFByZWNpb3NbaV0uUFVOSVRORVRPKSAqICgoK3ZhbG9yUHJvbW8pIC8gMTAwKSk7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwICYmIGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvID09IHRydWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2Vzb1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgQXBsaWNhclByb21vQnlWYWxvcmVzKHZhbG9yZXM6IEFycmF5PGFueT4sIGxQcmVjaW9zOiBBcnJheTxhbnk+LCByZXNpZHVvRW50cmFudGU6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBpQ2FudGlkYWRSZWFsOiBudW1iZXIgPSByZXNpZHVvRW50cmFudGU7Ly8gSkFHTSAyMDE5MDczMSBudWV2byBwYXJhbWV0cm8gPSBsUHJlY2lvcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsb3Jlcy5sZW5ndGg7IGkrKykgey8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgZnVuY2lvbmFsaWRhZCBwYXJhIHF1ZSBzZSBwdWVkYSB0ZW5lciB2YXJpb3MgdmFsb3Jlcy5cclxuICAgICAgICAgICAgdmFyIGlDYW50aWRhZFByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQcm9tbzogbnVtYmVyID0gdmFsb3Jlc1tpXS5WYWxvcjtcclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgPj0gaUNhbnRpZGFkUHJvbW8pIHsgLy9KQUdNIDIwMTkwNDI2IFNFIENBTUJJQSwgQU5URVMgRVNUQUJBIExBIEZVTkNJT05BTElEQUQgREUgQ0FOVElEQUQgUkVBTCBWUyBDQU5USURBRCBQUk9NT0NJT04uXHJcbiAgICAgICAgICAgICAgICB2YXIgUmVzaWR1bzogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgICAgIGlmIChpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBSZXNpZHVvID0gaUNhbnRpZGFkUmVhbCAlIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXBsaWNhclByb21vQnlWYWxvcmVzKHZhbG9yZXMsIGxQcmVjaW9zLCBSZXNpZHVvKTtcclxuICAgICAgICAgICAgICAgICAgICBpQ2FudGlkYWRSZWFsID0gaUNhbnRpZGFkUmVhbCAtIFJlc2lkdW87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gK2xQcmVjaW9zLmxlbmd0aCAtICtyZXNpZHVvRW50cmFudGU7IGkgPCArbFByZWNpb3MubGVuZ3RoIC0gK1Jlc2lkdW87IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcm1hciBudWV2byBhcnJlZ2xvLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgYXJyZWdsbyBlbnRyYW50ZS4gU2UgcmVjb3JyZSBkZSBhdHJhcyBoYWNpYSBhZGVsYW50ZSB5IHNlIHZhIGNyZWFuZG8gZWwgbnVldm8gYXJyZWdsb1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIHJlc2lkdW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBcm1hck51ZXZvQXJyYXlEZXNkZVJlc2lkdW8obFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW8pIHtcclxuICAgICAgICB2YXIgbFByZWNpb3NSZXNpZHVvID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGxQcmVjaW9zLmxlbmd0aCAtIDE7IGkgPiByZXNpZHVvOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zUmVzaWR1by5wdXNoKGxQcmVjaW9zW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQXJtYXJOdWV2b0FycmF0RGVzZGVSZXNpZHVvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NSZXNpZHVvO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHByb21vY2lvbmVzIHBvciBwcm9jZXNvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIE0zIFByb2Nlc29zIE9iamV0bywgY29uIGxhIGluZm9ybWFjaW9uIGRlIHRvZG9zIGxvcyBNM1Byb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tjb25kaWNpb24uQ29uY2VwdG9dICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvTTNQcm9jZXNvc1tjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSBlbCBwcm9jZXNvIHRpZW5lIHVuYSBmb3JtYSBkZSBwYWdvIHF1ZSBjdW1wbGEgY29uIGxhIGNvbmRpY2lvbiBlbnRyYW50ZSwgaGFjZSB1biAgcGFzcyB0cnVlLCBsYSBsb2dpY2Egc2UgaGFjZSBkZXNkZSBsYSBmb3JtYSBkZSBwYWdvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhclByb2Nlc29Gb3JtYVBhZ28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICBsZXQgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvTGlzdGFQcmVjaW86IE0zUHJkTGlzdGEsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvTGlzdGFQcmVjaW9bY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBwcm9tb2Npb25lcyBwb3IgcHJvY2Vzb3MsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZWwgTTMgcHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBNMyBQcm9jZXNvcyBPYmpldG8sIGNvbiBsYSBpbmZvcm1hY2lvbiBkZSB0b2RvcyBsb3MgTTNQcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBPYmpldG8gY29uIGluZm9ybWFjaW9uIGRlIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIGRlIGluZm9ybWFjaW9uIGFkaWNpb25hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1ByZEdlbmVyYWxbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gZGUgcHJvZHVjdG8gYWdydXBhZG8uXHJcbiAgICAgKiBAcGFyYW0gb1R5cGVNM1ByZEdycCBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9UeXBlTTNQcmRHcnBbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gYWRpY2lvbmFsLCBlc3RhIGluZm9ybWFjaW9uIGFkaWNpb25hbCBlc3RhIGVuIHVuYSB2YXJpYWJsZSBnbG9iYWw6IGdvRGF0YUFkaWNpb25hbFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBPYmpldG8gY29uIGluZm9ybWFjaW9uIGRlIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIGRlIGluZm9ybWFjaW9uIGFkaWNpb25hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb0FkaWNpb25hbChjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ29EYXRhQWRpY2lvbmFsW2NvbmRpY2lvbi5Db25jZXB0b10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0odGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJNT0RcIiAmJiArdGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSA+ICtjb25kaWNpb24uVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGluZm9ybWFjaW9uIGNvbnRyYSB1c3VhcmlvIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Vc2VyRGF0YShjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dICYmIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLmluY2x1ZGVzKCcsJykpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtjb25kaWNpb24uQ29uY2VwdG9dLnNwbGl0KCcsJykpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZWxlbWVudCwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBjb250cmEgZWwgZGV0YWxsZSBkZSBsYSBjb25kaWNpw7NuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sXHJcbiAgICAgICAgZGV0Q29uZGljaW9uZXM6IEFycmF5PE0zREVUQ09ORElQUk9NTz4sIGNvbmNlcHRvQ29uZGljaW9uOiBzdHJpbmcsIGpBZGljaW9uYWxlc0NvbmRpY2lvbikge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgb2RldENvbmRpY2lvbmVzRmluZGVkO1xyXG4gICAgICAgIHN3aXRjaCAoY29uY2VwdG9Db25kaWNpb24udHJpbSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tQMVwiOlxyXG5cclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDErMlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb1R5cGVNM1ByZEdycC5TS1AxICsgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5TS1AyKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tVXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tVLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfRElTUFwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRS50b1N0cmluZygpLCBkZXQuVmFsb3IudG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9USVBPXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuVElQTy50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgXCJQRVJfUFJPQ0VTT1wiOi8vKiBTb2xvIHZhbGlkYSB1bmEgZGV0Q29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICBsZXQgcGVyWFByb2Nlc286IE0zUGVyWFByb2Nlc287XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBwZXJYUHJvY2VzbyA9IG9NM1Byb2Nlc29zLk0zUGVyWFByb2Nlc28uZmluZCh4ID0+IHguVGlwb1BlcnNvbmEgPT0gZGV0Q29uZGljaW9uZXNbMF0uVmFsb3IudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkVOXCIgJiYgcGVyWFByb2Nlc28pIHtcclxuICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIgJiYgIXBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBTE1BQ0VOXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJIT1JBUklPX0hPUkFcIjpcclxuICAgICAgICAgICAgICAgIHZhciBvVGltZU5vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UaW1lTm93LmdldEhvdXJzKCkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiTG9NM1ByZEFkaWNpb25hbGVzXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0byAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFZsckFkaSA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLkNvbmNlcHRvKS5WQUxPUlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBWbHJBZGkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAvL1Byb2Nlc29zXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVswXS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUFJPQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvTTNQcm9jZXNvc1twcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW3Byb3BlcnR5XSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8vVmFsaWRhciByZXNwdWVzdGEsIGNvbiBvYmpldG8gYSB2YWxpZGFyXHJcbiAgICBwdWJsaWMgVmFsaWRhclJlc3B1ZXN0YShvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgakFkaWNpb25hbGVzO1xyXG4gICAgICAgIGlmIChvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgICAgICBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKG9iamVjdFZhbGlkYXRlLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNSBBZ3JlZ2FyIHNlY2Npb24gZGUgdmFsaWRhY2lvbmVzLlxyXG4gICAgICAgICAgICB2YXIgYlJlc3AgPSB0aGlzLlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzKGpBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgaWYgKGJSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NlIGVudmlhIGVuIGFkaWNpb25hbGVzLCBlbCBqc29uIGRlIGxhIGluZm9ybWFjaW9uIGVuY29udHJhZGEgZGVsIGRldGFsbGUuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciByZWdsYXMgY29uZmlndXJhZGFzIGRlc2RlIEpTT04gZGUgQWRpY2lvbmFsZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXM6IGFueSkge1xyXG4gICAgICAgIHZhciBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXNcIilcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMgJiYgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVklHRU5DSUFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLlZhbGlkYXJWaWdlbmNpYShqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMuVkFMMSwgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipFcnJvclwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZhbGlkYXJWaWdlbmNpYSh2YWwxOiBEYXRlLCB2YWwyOiBEYXRlKSB7XHJcblxyXG4gICAgICAgIHZhciBGZWNoYUFjdHVhbCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMSlcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh2YWwyKVxyXG5cclxuICAgICAgICAvLyB2YXIgZFZhbDEgPSBuZXcgRGF0ZSh2YWwxKTtcclxuICAgICAgICAvLyB2YXIgZFZhbDIgPSBuZXcgRGF0ZSh2YWwyKTtcclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDIpXHJcblxyXG5cclxuICAgICAgICB2YXIgbkZlY2hhQWN0dWFsOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcihGZWNoYUFjdHVhbCk7IC8vKyhGZWNoYUFjdHVhbC5nZXRGdWxsWWVhcigpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldE1vbnRoKCkgKyBcIlwiICsgRmVjaGFBY3R1YWwuZ2V0RGF0ZSgpKTtcclxuICAgICAgICB2YXIgblZhbDE6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDEpOyAvLysoZFZhbDEuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMS5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDEuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICB2YXIgblZhbDI6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDIpIC8vKyhkVmFsMi5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRWYWwyLmdldE1vbnRoKCkgKyBcIlwiICsgKCtkVmFsMi5nZXREYXRlKCkgKyAxKSApO1xyXG4gICAgICAgIGlmIChuRmVjaGFBY3R1YWwgPj0gblZhbDEgJiYgbkZlY2hhQWN0dWFsIDw9IG5WYWwyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRGZWNoYU51bWJlcihkYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgYWNjaW9uLCBzaSBubyB0aWVuZSBjYXJnYWRhIHVuYS4gRXN0YSBhY2Npb24gc2UgY2FyZ2EgamVyYXJxdWljYW1lbnRlLlxyXG4gICAgcHVibGljIFZhbGlkYXJBY2Npb24oalJlc3AsIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqc29uQWRpYyA9IEpTT04ucGFyc2UoakFkaWNpb25hbGVzKTtcclxuICAgICAgICBpZiAoalJlc3AuQWNjaW9uID09IG51bGwgJiYganNvbkFkaWMuUk9PVC5BY2Npb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSBqc29uQWRpYy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvbWFyIGluZm9ybWFjacOzbiBcclxuICAgIHB1YmxpYyBSZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihvTTNFTkNQUk9NTzogTTNFTkNQUk9NTywgalJlc3ApIHtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24gPSB7fTtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24uTm9tYnJlID0gb00zRU5DUFJPTU8uTm9tYnJlO1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5JRCA9IG9NM0VOQ1BST01PLklkUHJvbW9jaW9uO1xyXG4gICAgICAgIC8vU2kgbm8gdHV2byBuaW5ndW5hIGFjY2lvblxyXG4gICAgICAgIGlmIChqUmVzcC5BY2Npb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSB7IFwiVGlwbzJcIjogb00zRU5DUFJPTU8uVGlwbzIsIFwiVGlwb1wiOiBvTTNFTkNQUk9NTy5UaXBvIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vIFJldG9tYXIgZGVzZGUgZWwgZW5jYWJlemFkbyBwcm9tbywgc2kgbm8gZXhpc3RlIGVsIHRpcG8geSBUaXBvMlxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8yID0gb00zRU5DUFJPTU8uVGlwbzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFqUmVzcC5BY2Npb24uVGlwbykge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8gPSBvTTNFTkNQUk9NTy5UaXBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIHByb21vY2nDs24sIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvZHVjdG8gYSBhcGxpY2FyIGxhIHByb21vY2lvbiB5IGxhcyBwcm9tb2Npb25lcyBhIGFwbGljYXJcclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vY2lvbihKUHJvbW9jaW9uZXM6IEFycmF5PGFueT4sIG9UeXBlTTNQcmRHcnA6IFR5cGVNM1ByZEdycCwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBnc0lkS2F0aW9zID0gbnVsbCk6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgbGV0IHNwbGl0UHJlY2lvID0gdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpby5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM0xpc3RhUHJlY2lvLmZpbmQobFByZSA9PiBsUHJlLklETElTVEEgPT0gc3BsaXRQcmVjaW9bMF0pO1xyXG4gICAgICAgIGxldCBwcmVjaW9Nb25lZGVybyA9IDA7XHJcbiAgICAgICAgbGV0IGxpc3RhQXBsaWNhZGEgPSBcIlZhbG9yXCI7XHJcbiAgICAgICAgaWYgKG9MaXN0YUZpbmRlZCAmJiBzcGxpdFByZWNpbyAmJiBzcGxpdFByZWNpby5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoc3BsaXRQcmVjaW9bMV0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMQlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RhQXBsaWNhZGEgPSBcIkxCXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGFBcGxpY2FkYSA9IFwiTENcIjtcclxuICAgICAgICAgICAgICAgICAgICBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEM7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTERcIjpcclxuICAgICAgICAgICAgICAgICAgICBsaXN0YUFwbGljYWRhID0gXCJMRFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MRDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgIGlmIChnc0lkS2F0aW9zICE9IG51bGwgJiYgZ3NJZEthdGlvcyA9PSBcIkNUTlwiKSB7XHJcbiAgICAgICAgICAgIHByZWNpb01vbmVkZXJvID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZCh4ID0+IHguSURMSVNUQSA9PSBcIjJcIikuUFJFQ0lPO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5Qcm9jZXNhclByb21vR2VuZXJhbChKUHJvbW9jaW9uZXMsIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8sIHByZWNpb01vbmVkZXJvLCBsaXN0YUFwbGljYWRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIHF1ZSBzZSBoYWNlbiB2YWxpZGFzIGRlc3B1ZXMgZGUgcmVnaXN0cmFyIHRvZG9zIGxvcyBwcm9kdWN0b3MuXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb0FmdGVyKEpQcm9tb2Npb25lczogQXJyYXk8YW55Piwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvTTNQcm9jZXNvcy5WYWxvck5ldG87XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5Qcm9jZXNhclByb21vR2VuZXJhbChKUHJvbW9jaW9uZXMsIG9NM1Byb2Nlc29zLlZhbG9yTmV0bywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gZW4gZ2VuZXJhbFxyXG4gICAgICogQHBhcmFtIEpQcm9tb2Npb25lcyBcclxuICAgICAqIEBwYXJhbSBuUHJlY2lvIFxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vR2VuZXJhbChKUHJvbW9jaW9uZXM6IEFycmF5PGFueT4sIG5QcmVjaW86IG51bWJlciwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIHByZWNpb01vbmVkZXJvID0gMCwgbGlzdGFBcGxpY2FkYSA9IFwiVmFsb3JcIik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgdmFyIG9MaXN0YVByb21vc0Fzb2MgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KCk7XHJcbiAgICAgICAgbGV0IHByZWNpb0FzaWduYWRvID0gblByZWNpbztcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgSlByb21vY2lvbmVzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAvL0pQcm9tb2Npb25lcy5mb3JFYWNoKHByb21vY2lvbiA9PiB7XHJcbiAgICAgICAgICAgIHZhciBwcm9tb2Npb24gPSBKUHJvbW9jaW9uZXNbX2ldO1xyXG4gICAgICAgICAgICAvLyBpZiAocHJvbW9jaW9uLkFjY2lvbiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgIT0gbnVsbCAmJiBwcm9tb2Npb24uQWNjaW9uLlRpcG8yID09IFwiTU9ORURFUk9cIiAmJiBwcmVjaW9Nb25lZGVybyA+IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcmVjaW9Nb25lZGVybztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMgPSB0aGlzLlByb2Nlc2FyUHJvbW9CeVRpcG8ocHJvbW9jaW9uLCBwcmVjaW9Bc2lnbmFkbywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8sIGxpc3RhQXBsaWNhZGEpO1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBvTGlzdGFQcm9tb3NBc29jLnB1c2gob1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgcHJlY2lvTW9uZWRlcm8pO1xyXG5cclxuICAgICAgICAvLyBpZiAob1Byb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvcikgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvcikgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybztcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsIDwgMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBSZWRvZG5lbyBkZSBsb3MgdmFsb3JlcyB0b3RhbGVzXHJcbiAgICAgICAgLy8gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247XHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjaW9uIGRlIG1lam9yIG9wY2lvbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyBwcm9tb2Npb25lcyBwcm9jZXNhZGFzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgTGlzdGEgZGUgcHJvbW9jaW9uZXMgcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgUHJvbW9jaW9uIHByb2Nlc2FkYSwgcXVlIHJldG9ybmFyw6EgYSBmbHVqby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgbW9uZWRlcm86IG51bWJlcik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgbGV0IHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgIC8vU2kgZWwgcHJvZHVjdG8gZXN0YSByZXN0cmluZ2lkbyBsZSBkYSBtYXlvciBwcmlvcmlkYWQgYSBlc3RhIHByb21vY2nDs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vbmVkZXJvICE9IDAgJiYgcHJvbW8uVGlwbyA9PSBcIk1PTkVERVJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCttb25lZGVybykgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCttb25lZGVybykgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBwcm9tby5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLy8vLy8vRlVOQ0lPTkFMSURBRCBQUk9EUklBIEZVTkNJT05BUiBNw4FTIEFERUxBTlRFLCBTSSBTRSBRVUlFUkUgQUdSVVBBUiBMQVMgUFJPTU9DSU9ORVMgQUNNIFkgRVhDXHJcbiAgICAgICAgICAgIC8vIGlmKGRQcm9tb0FDTSA9PSAwICYmIGRQcm9tb0VYQyA9PSAwKXtcclxuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignTm8gc2UgZW5jb250cmFyb24gcHJvbW9jaW9uZXMnKTtcclxuICAgICAgICAgICAgLy8gfWVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICBpZihkUHJvbW9BQ00gPiBkUHJvbW9FWEMpe1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vR2FuYSBwcm9tb2Npb25lcyBhY3VtdWxhdGl2YXMuXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpLmZvckVhY2goeCA9PiB4LkFwbGljYWRhID0gdHJ1ZSk7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2M7Ly8uZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gZFByb21vQUNNKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBkUHJvbW9BQ00pICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIikucmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5WYWxvck1vbmVkZXJvKSwgMCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvL0dhbmEgcHJvbW9jaW9uZXMgZXhjbHV5ZW50ZXMuXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpLkFwbGljYWRhID0gdHJ1ZTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYy8vLnB1c2gob0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIGRQcm9tb0VYQykgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgZFByb21vRVhDKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gbmV3IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPihwcm9tb0Fzb2NpYWRhUmVzdHJpbmdpZG8pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvID0gMDtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICBhcGxpY2FQcm9tb0VYQyhvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgdmFsb3JQcm9tb0VYQzogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHByb21vRXhjOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICBpZiAodmFsb3JQcm9tb0VYQyA+IDApIHtcclxuICAgICAgICAgICAgcHJvbW9FeGMgPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IHZhbG9yUHJvbW9FWEMgfHwgeC5WYWxvck1vbmVkZXJvID09IHZhbG9yUHJvbW9FWEMpO1xyXG4gICAgICAgICAgICBwcm9tb0V4Yy5BcGxpY2FkYSA9IHRydWU7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gcHJvbW9FeGMuVmFsb3IpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBwcm9tb0V4Yy5WYWxvcik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vRXhjLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIHZhbG9yUHJvbW9BQ01ESU46IG51bWJlcikge1xyXG4gICAgICAgIGlmICh2YWxvclByb21vQUNNRElOID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9tbyBvZiBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEgPT0gXCJBQ01ESU5cIikpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gdmFsb3JQcm9tb0FDTURJTik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHZhbG9yUHJvbW9BQ01ESU4pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGVsIG1heGltbyB2YWxvciBzZWd1biBsYSByZWdsYSBhIGNvbXBhcmFyXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBcclxuICAgICAqIEBwYXJhbSBzUmVnbGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBzUmVnbGE6IHN0cmluZywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdDogbnVtYmVyID0gMDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHNSZWdsYSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY2FzZSBcIkFDTVwiOlxyXG4gICAgICAgICAgICAgICAgLy8gICAgIHJlc3VsdCA9IG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBzUmVnbGEgJiYgIXguZmxhZ3MuZm9ybWFQYWdvKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQUNNRElOXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZWNpb0FjdHVhbCA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxEZXNjdWVudG8gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW8gb2Ygb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNRElOXCIgJiYgKCF4LmZsYWdzLmZvcm1hUGFnbyB8fCB4LlRpcG8gPT0gXCJNT05FREVST1wiKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vLlZhbG9yUG9yY2VudGFqZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudWV2b1ZhbG9yRGVzY3VlbnRvID0gKHByZWNpb0FjdHVhbCAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9BY3R1YWwgLT0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxEZXNjdWVudG8gKz0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb0FjdHVhbCAtPSBwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxEZXNjdWVudG8gKz0gcHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsb3JUb3RhbERlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJFWENcIjpcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBNYXRoLm1heC5hcHBseShNYXRoLCBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gc1JlZ2xhICYmICgheC5mbGFncy5mb3JtYVBhZ28gfHwgeC5UaXBvID09IFwiTU9ORURFUk9cIikpLm1hcChmdW5jdGlvbiAobykgeyByZXR1cm4gby5WYWxvciA+IG8uVmFsb3JNb25lZGVybyA/IG8uVmFsb3IgOiBvLlZhbG9yTW9uZWRlcm87IH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vUHJvY2VzYXIgcHJvbW9jaW9uIHNlZ3VuIGVsIHRpcG8gXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb246IGFueSwgUHJlY2lvOiBudW1iZXIsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBsaXN0YUFwbGljYWRhID0gXCJWYWxvclwiKTogUHJvbW9jaW9uZXNBc29jaWFkYXMge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBBY2Npb247XHJcbiAgICAgICAgICAgIHZhciBvUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgUHJvbW9jaW9uZXNBc29jaWFkYXMoKTtcclxuICAgICAgICAgICAgaWYgKHByb21vY2lvbi5BY2Npb24gIT0gbnVsbCAmJiBwcm9tb2Npb24uUHJvbW9jaW9uICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uID0gcHJvbW9jaW9uLlByb21vY2lvbi5JRDtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Ob21icmUgPSBwcm9tb2Npb24uUHJvbW9jaW9uLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgIEFjY2lvbiA9IHByb21vY2lvbi5BY2Npb247XHJcbiAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlJlZ2xhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhID0gQWNjaW9uLlJlZ2xhO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGEgPSBcIkVYQ1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5UaXBvID0gQWNjaW9uLlRpcG8yO1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbG9yQXBsaWNhciA9IEFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Npb25bbGlzdGFBcGxpY2FkYV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckFwbGljYXIgPSBBY2Npb25bbGlzdGFBcGxpY2FkYV07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChBY2Npb24uVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPXyVcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvclBvcmNlbnRhamUgPSArdmFsb3JBcGxpY2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAqICgoK3ZhbG9yQXBsaWNhcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX1ZBTE9SXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gdmFsb3JBcGxpY2FyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX0VYQUNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pIC0gKCt2YWxvckFwbGljYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBBY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGFPYnNlcSA9IEFjY2lvbi5SZWdsYU9ic2VxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTywgQWNjaW9uLk9CU0VRVUlPUywgb1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YWxpZGFyIGNhbnRpZGFkIHZzIGNhbnRpZGFkIGRlIG9ic3F1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNT05FREVST1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9GUyAyMDE5MDgyNyBZYSBubyBzZSBndWFyZGEgZWwgdmFsb3IgdG90YWwgZGVsIG1vbmVkZXJvIHNpIG5vIHVuaWNhbWVudGUgZWwgcG9yY2VudGFqZS4uLiBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNVUE9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklkQ3Vwb24gPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkFfUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMubElkQWN0aXZhUHJvbW8gPSBBY2Npb24uVmFsb3Iuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvL3RoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQob1Byb21vY2lvbmVzQXNvY2lhZGFzLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlRpcG8gPT0gXCJDT01CSU5BREFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEgPSBuZXcgUHJvbW9jaW9uQ29tYmluYWRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5UaXBvMiA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuTm9tYnJlID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uID0gQWNjaW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbXBvc0FkaWNpb25hbGVzKG9NM0VOQ1BST01PLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLCBwcm9tb2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLkZvcm1hUGFnbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5mbGFncy5mb3JtYVBhZ28gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPixcclxuICAgICAgICBvYnNlcXVpb3M6IEFycmF5PGFueT4sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkQ6IG51bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEUmVhbDogbnVtYmVyID0gdGhpcy5nb0RhdGFBZGljaW9uYWwuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIHByb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZGlwcm9tbyA9IHguTTNDT05ESVBST01PLmZpbmQoeCA9PiB4LkNvbmNlcHRvID09IFwiZENhbnRpZGFkXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmRpcHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSArY29uZGlwcm9tby5WYWxvclxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSAxXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuQ2FudGlkYWRPYnNlcSA9IFZhbG9yQ2FudFBSRFxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgY2FtcG9zIGFkaWNpb25hbGVzIGVuIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zRU5DUFJPTU8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBcclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyQ2FtcG9zQWRpY2lvbmFsZXMob00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIHByb21vY2lvbjogYW55KSB7XHJcbiAgICAgICAgc3dpdGNoIChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJPQlNFUV9DSUVSUkVcIjpcclxuICAgICAgICAgICAgICAgIC8vQWdyZWdhciBDYW50aWRhZC5cclxuICAgICAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIHZhciBzVmFsb3JDYW50aWRhZDogc3RyaW5nID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlwcm9tbyA9IHguTTNDT05ESVBST01PLmZpbmQoeCA9PiB4LkNvbmNlcHRvID09IFwiZENhbnRpZGFkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXByb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0gY29uZGlwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzVmFsb3JDYW50aWRhZCA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uQ2FudGlkYWRPYnNxID0gc1ZhbG9yQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgLy8gdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgLy8gcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIC8vIHZhciBqQWRpYzphbnkgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5DbGFzaWZpY2FjaW9uID0gakFkaWMuUk9PVC5BY2Npb24uQ2FyYWN0ZXJpc3RpY2E7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5OdW1Db25kaWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLk51bUNvbmRpY2lvbmVzID0gcHJvbW8uTTNDT05ESUFHUlVQQUNJT05bMF0uTTNDT05ESVBST01PLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb2Npb24uSURDb25kaWNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5JZENvbmRpY2lvbiA9IHByb21vY2lvbi5JRENvbmRpY2lvblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBJbmljaW8gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLy9Qcm9jZXNhciBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJDb21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLlByb21vQ29tYmluYWRhc1YyKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUHJvY2VzYXJDb21iaW5hZGFcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9WMiBDT01CSU5BREFcclxuICAgIC8qKlxyXG4gICAqIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxpc3RhIGRlIHByb21vY2lvbmVzIGNvbWJpbmFkYXMgZGUgTTNQcm9jZXNvc1xyXG4gICAqIEBwYXJhbSBpb00zUHJvY2VzbyBPYmpldG8gTTMgUHJvY2Vzb3MsIGVsIGN1YWwgc2UgcmVjb3JyZXLDoSBsYSBpbmZvcm1hY2lvbiBkZSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzVjIoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIGxldCBlbmNDb25MYUNhbnRpZGFkT3JpZ2luYWwgPSBfLmNsb25lRGVlcChpb00zUHJvY2Vzby5NM0VOQyk7XHJcblxyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgdmFyIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzW2ldO1xyXG4gICAgICAgICAgICB2YXIgZXNBY3VtdWxhYmxlID0gdGhpcy5HZXRFc0FjdW11bGFibGVQcm9tbyhjb21iaSlcclxuICAgICAgICAgICAgLy8vT2J0ZW5lciB0b2RvcyBsb3MgRW5jYWJlemFkb3MgcXVlIGFwbGljYW4gYSBsYSBwcm9tb2Npb24gYSBsYSBxdWUgc2UgZXN0YSBpdGVyYW5kb1xyXG4gICAgICAgICAgICBvTGlzdEVuY2FiID0gdGhpcy5HZXRFbmNhYmV6YWRvQnlDb21iaShjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzOiAzIGdhc2Vvc2FzIHBvciAkNTAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfQ0lFUlJFXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKGxQcmVjaW9zLCBjb21iaSwgaW9NM1Byb2Nlc28sIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfU1VNVE9UQUxcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyT2JzZXFTdW1Ub3RhbChvTGlzdEVuY2FiLCBjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FQQVJDSUFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlbmFyTGlzdGFFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYiwgY29tYmksIGxQcmVjaW9zLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwbENvbWJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXBsQ29tYm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsQ29tYm8gPSB0aGlzLlByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlLCBpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0RfQVBMREVTQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzIHBhcmEgMngxLCAzeDEsIDR4MiwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9MaXN0RW5jYWIgJiYgb0xpc3RFbmNhYi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWVzdGFibGVjZSBsYSBjYW50aWRhZCBvcmlnaW5hbCBwYXJhIHF1ZSBubyBzZSBxdWVkZSBlbiB1biBidXZsZSBpbmZpbml0b1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUEVuY09yaWdpbmFsZXMgb2YgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsKSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZE9yaWdpbmFsID0gb00zUEVuY09yaWdpbmFsZXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY09yaWdpbmFsZXMuSUQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gY2FudGlkYWRPcmlnaW5hbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3JkZW5hckxpc3RhRW5jKG9saXN0YUVuYzogTTNQRW5jSXRlbXNbXSwgZXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgaWYgKGVzQWN1bXVsYWJsZSkgb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVE5FVE8nKS5WYWxvcikpO1xyXG4gICAgICAgIGVsc2Ugb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVQnKS5WYWxvcikgLSAoK2EuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkRGVzY1Byb21vOiBudW1iZXIgPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbENvbXByYTogbnVtYmVyID0gbFByZWNpb3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgTnVtYmVyKGIuUFVOSVRORVRPKTsgfSwgMCk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmVjaW9Ub3RhbENvbXByYSk7XHJcbiAgICAgICAgbGV0IGRlc2NBY3VtID0gMDtcclxuICAgICAgICBsZXQgZGVzY1Byb2RBY3R1YWw7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGVzY1Byb2RBY3R1YWwgPSAobFByZWNpb3NbaV0uUFVOSVRORVRPIC8gcHJlY2lvVG90YWxDb21wcmEpICogY2FudGlkYWREZXNjUHJvbW8gLy80MFxyXG4gICAgICAgICAgICBkZXNjQWN1bSArPSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgLy8gaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA8IGNhbnRpZGFkRGVzY1Byb21vKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gLT0gbFByZWNpb3NbaV0uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICBlbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyAtPSBjYW50aWRhZERlc2NQcm9tbztcclxuICAgICAgICAgICAgLy8gICAgICAgICBjYW50aWRhZERlc2NQcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gZGVzY0FjdW0gfHwgY2FudGlkYWREZXNjUHJvbW8gPCBkZXNjQWN1bSkge1xyXG4gICAgICAgICAgICAvL2ZpbmQgZGVsIHVsdGltbyBcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVuY29udHJlIGRpZmVyZW5jaWEgZW4gcHJvbW9zIGNvbWJpbmFkYXM6IFwiICsgY2FudGlkYWREZXNjUHJvbW8gKyBcIiB2cyBcIiArIGRlc2NBY3VtKTtcclxuICAgICAgICAgICAgbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPID0gbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPIC0gKGNhbnRpZGFkRGVzY1Byb21vIC0gZGVzY0FjdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWRcIilcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhck9ic2VxU3VtVG90YWwocHJvZHVjdG9zQXBsaWNhUHJvbW86IE0zUEVuY0l0ZW1zW10sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yUHJvbW8gPSArY29tYmkuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGVuY0l0ZW0gb2YgcHJvZHVjdG9zQXBsaWNhUHJvbW8pIHtcclxuICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA9IDE7XHJcbiAgICAgICAgICAgIGxldCBwVW5pdEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHdoaWxlIChjYW50aWRhZFByb2R1Y3RvQWN0dWFsIDw9IGNhbnRpZGFkQWN0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcFVuaXRBY3R1YWw7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZFByb2R1Y3RvQWN0dWFsKys7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gZW5jSXRlbS5JRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IGVuY0l0ZW0uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN1bWFWYWxvclByb2R1Y3RvcyArIGRpZmVyZW5jaWEgPj0gdmFsb3JQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgb00zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gc3VtYVZhbG9yUHJvZHVjdG9zIC0gdmFsb3JQcm9tbztcclxuICAgICAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBwcm9kdWN0b0NvbWJvLCBjYW50aWRhZE9ic2VxdWlvcyk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wib00zUmVnU2VydmljZVwiXSA9IG9NM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJvY2VzbzogTTNQcm9jZXNvcywgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCBwcm9kSGlqbzogTTNQRW5jSXRlbXM7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHByb2RSZXZpc2FkbyBvZiBwcm9kdWN0b3NSZXZpc2Fkb3MpIHtcclxuICAgICAgICAgICAgaWYgKHByb2RSZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gcHJvZFJldmlzYWRvLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9ICgrb00zUERldGFsbGVJdGVtcy5WYWxvciAtIHByb2RSZXZpc2Fkby5DYW50aWRhZCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIaWpvID0gXy5jbG9uZURlZXAob00zUEVuY0l0ZW1zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzbyhwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5wdXNoKHByb2RIaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIHByb2RIaWpvLCBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9kdXRvUHJvbW9Db21ib1N1bVRvdGFsKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExpc3RhUHJlY2lvcyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGxQcmVjaW9zRmlsdGVyID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHkgPT4geS5JRCA9PSBvTGlzdEVuY2FiW2ldLklEKS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NGaWx0ZXIucHVzaCh4KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb24gZGUgY29tYm8sIHggcHJvZHVjdG9zLCB5IHByb2R1Y3RvcywgLi4uIG4gcHJvZHVjdG9zIFxyXG4gICAgICogcG9yICQxMDAwXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqIEBwYXJhbSBiRXNBY3VtdWxhYmxlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9jaW9uQ29tYmluYWRhQ29tYm8obFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbiwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGZsYWdBcGxpY29Qcm9tbyA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBuTnVtZXJvQ29uZGljaW9uZXM6IG51bWJlciA9ICtjb21iaS5BY2Npb24uTnVtQ29uZGljaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBWYWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIExpc3RDb25kaWNpb25lcyA9IG5ldyBBcnJheTxBcnJheTxhbnk+PigpO1xyXG4gICAgICAgICAgICB2YXIgbWluaW1vSXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwb3JjZW50YWplUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFNpblByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2U7XHJcblxyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbk51bWVyb0NvbmRpY2lvbmVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGNvbmRpY2lvbiAxLlxyXG4gICAgICAgICAgICAgICAgdmFyIExpc3RQcm9tb0NvbWJpOiBBcnJheTxNM1BFbmNJdGVtcz4gPSB0aGlzLkJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiLCBpLnRvU3RyaW5nKCksIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgTGlzdENvbmRpY2lvbmVzLnB1c2godGhpcy5HZXRMaXN0YVByZWNpb3MobFByZWNpb3MsIExpc3RQcm9tb0NvbWJpKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhMaXN0Q29uZGljaW9uZXMsIG9MaXN0RW5jYWIpO1xyXG4gICAgICAgICAgICBpZiAoTGlzdENvbmRpY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGVsIHZhbG9yIG1lbm9yIGRlIGxhcyBpdGVtcyBhZ3JlZ2FkYXNcclxuICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gTGlzdENvbmRpY2lvbmVzWzBdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaisrKSB7Ly9Db21pZW56YSBkZXNkZSAxIHBvcnF1ZSBlbCAwIHlhIHNlIHZhbGlkbyBlbiBsYSBhbnRlcmlvciBsaW5lYVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtc1ByZWNpb3M6IEFycmF5PGFueT4gPSBMaXN0Q29uZGljaW9uZXNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01pbiA9IGl0ZW1zUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01pbiA8IG1pbmltb0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gbmV3TWluO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vTG9zIGNvbWJvcyBkZWJlbiBwcm9jZXNhcnNlIGRlIGEgdW5vIHBhcmEgc3UgY29ycmVjdG8gZnVuY2lvbmFtaWVudG9cclxuICAgICAgICAgICAgICAgIGlmIChtaW5pbW9JdGVtcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9SZWNvcnJlIHRvZG9zIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3MgZGUgbGEgcHJvbW8gcGFyYSBzYWJlciBjdWFsIGVzIGVsIHZhbG9yIHJvYWwgZGUgbGEgcHJvbW9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpblByb21vICs9ICtsUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5JbmRpY2UgPT0gZW5jLkluZGljZSkuUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgbGEgcHJvbW8gYSBwYXJ0aXIgZGVsIGNhbG9yIGRlbCBjb21ibyB5IGRlIGxhIHN1bWEgZGUgbG9zIHByZWNpb3Mgb3JpZ2luYWxlcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBwb3JjZW50YWplUHJvbW8gPSAxMDAgLSAoK1ZhbG9yUHJvbW8gKiAxMDAgLyB2YWxvclRvdGFsU2luUHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZvckVhY2gocHJlY2lvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjaW8uSW5kaWNlID09IGVuYy5JbmRpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWNpby5Qcm9tb0FwbGljYWRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxvciA9IHByZWNpby5QVU5JVE5FVE87XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01vZGlmaWNhIGVsIHByZWNpbyBkZSBsb3MgcHJvZHVjdG9zIGEgc3UgbnVldm8gdmFsb3IgY29uIGxhIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gdmFsb3IgLSAodmFsb3IgKiBwb3JjZW50YWplUHJvbW8gLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUHJvbW9BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcmVjaW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FbiBsYXMgcHJvbW9zIHBvciBjb21ibyBubyBhcGxpY2FuIGVsIHByZWNpbyBkZSBsb3Mgb3Ryb3MgcHJvZHVjdG9zIHF1ZSBubyBoYWNlbiBwYXJ0ZSBkZWwgY29tYm8gOilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTyA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnQXBsaWNvUHJvbW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ0FwbGljb1Byb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvZHVjdG9Qcm9tb0NvbWJpRXhpc3RlbnRlID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBjb21iaS5BY2Npb24uQ29kaWdvKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgY29tYmkuQWNjaW9uLlZhbG9yLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saW1waWFyRW5jSXRlbVByZENvbmRpKG9MaXN0RW5jYWIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb21vY2lvbkNvbWJpbmFkYUNvbWJvXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZ0FwbGljb1Byb21vO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmaWx0cmFyTGlzdGFDb25kaWNpb25lc0NvbWJvKGxpc3RDb25kaWNpb25lczogQXJyYXk8YW55Piwgb00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RDb25kaWNpb25lcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgbGV0IG51ZXZhQ29uZGljaW9uID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGljaW9uIG9mIGxpc3RDb25kaWNpb25lc1tfaV0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbmNJdGVtID0gb00zUEVuY0l0ZW1zTGlzdC5maW5kKHggPT4geC5JRCA9PSBjb25kaWNpb24uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY0l0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdID0gZW5jSXRlbVtcIlByZENvbmRpXCJdID8gZW5jSXRlbVtcIlByZENvbmRpXCJdIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0Q2FudGlkYWQgPiBlbmNJdGVtW1wiUHJkQ29uZGlcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVldmFDb25kaWNpb24gPSBbY29uZGljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaXN0Q29uZGljaW9uZXNbX2ldID0gbnVldmFDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxpbXBpYXJFbmNJdGVtUHJkQ29uZGkob00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgZWxlbWVudFtcIlByZENvbmRpXCJdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2VzbzogTTNQcm9jZXNvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQgPSAxKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvUXVpdGFyO1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvZHVjdG9RdWl0YXIgPSBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0uZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b1F1aXRhcikge1xyXG4gICAgICAgICAgICBwcm9kdWN0b1F1aXRhci5DYW50aWRhZCArPSAoLTEgKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0ucHVzaCh7IElEOiBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bywgQ2FudGlkYWQ6ICgtMSAqIGNhbnRpZGFkKSB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FncmVnYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZSBlbnRyYWRhIGEgdW4gYXJyZWdsbyBkZSBwcm9kdWN0b3MgcXVlIHBvc3Rlcmlvcm1lbnRlIHNlcmEgbG9zIHByb2R1Y3RvcyBoaWpvcyBkZWwgcHJvZHVjdG8gQ29tYm9cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSB0aGlzLmdldFByb2R1dG9Qcm9tb0NvbWJvKG9NM1Byb2Nlc28uTTNFTkMsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgIC8vTGEgY2FudGlkYWQgZGlzbWludXllIHBlcm8gZXN0ZSBtb3ZpbWllbnRvIHNlIHJldmVyc2EgYWwgdGVybWluYXIgZGUgdmFsaWRhciBlc3RhIHByb21vXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgMSk7XHJcbiAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2Vzbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vRGlzbWludXllIGVuIHVubyBsYSBjYW50aWRhZCBkZWwgcHJvZHVjdG8geSByZXRvcm5hIHVuIGNsb24gZGUgZXN0ZVxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm8ocHJvZHVjdG9zRW5NM1Byb2Nlc286IEFycmF5PE0zUEVuY0l0ZW1zPiwgb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NEZWxDb21ibyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGVuIGhhc2htYXAgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGhtbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gSUQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGR0b0htUHJlY2lvcyhobWxQcmVjaW9zOiBBcnJheTxhbnk+LCBJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGZpbmRlZDogYW55ID0gaG1sUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBJRCk7XHJcbiAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICBmaW5kZWQuSW5kaWNlID0gK2ZpbmRlZC5JbmRpY2UgKyArMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaW5kZWQgPSB7IFwiSURcIjogSUQsIFwiSW5kaWNlXCI6IDAgfTtcclxuICAgICAgICAgICAgaG1sUHJlY2lvcy5wdXNoKGZpbmRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5kZWQuSW5kaWNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVzY2FyIGVuY2FiZXphZG9zIHF1ZSB0ZW5nYSBsYSBwcm9tb2Npb24geSBjb25kaWNpb24gZW52aWFkYSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gSWRDb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaWRQcm9tb2Npb25lcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIElkQ29uZGljaW9uOiBzdHJpbmcsIGlkUHJvbW9jaW9uZXM6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRW5jRmluZGVkID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSlcclxuICAgICAgICAgICAgICAgIGlmICghb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgfHwgIShvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldCAmJiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb3M6IEFycmF5PGFueT4gPSBKU09OLnBhcnNlKGRldC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb0ZpbmRlZCA9IHByb21vcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBpZFByb21vY2lvbmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW9GaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaWNpb25GaW5kZWQgPSBwcm9tb0ZpbmRlZC5BY2Npb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5maW5kKHggPT4geCA9PSBJZENvbmRpY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9FbmNGaW5kZWQucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkID09IElkQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9FbmNGaW5kZWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDs24gc2kgbGEgcHJvbW9jacOzbiBxdWUgbGxlZ2EgY29tbyBwYXJhbWV0cm8sIGVzIGFjdW11bGFibGUgbyBub1xyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEVzQWN1bXVsYWJsZVByb21vKHByb21vY2lvbjogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHByb21vY2lvbi5BY2Npb24uUmVnbGEgJiYgcHJvbW9jaW9uLkFjY2lvbi5SZWdsYSA9PSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgR2V0RXNBY3VtdWxhYmxlXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IGxQcmVjaW9zID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBsZXQgcHJvZHNBcGxEZXNjdWVudG86IEFycmF5PE0zUEVuY0l0ZW1zPiA9IFtdO1xyXG4gICAgICAgIGxldCBza3VBcGxEZXNjdWVudG9zOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLnNrdUFwbERlc2M7IC8vW3tTS1U6XCJYWFhYWFhcIn0sIHtTS1U6XCJZWVlZWVlZXCJ9XVxyXG4gICAgICAgIGxldCBtYXhOdW1EZXNjdWVudG9zID0gK2NvbWJpLkFjY2lvbi5tYXhOdW1EZXNjO1xyXG4gICAgICAgIGxldCBjb250RGVzY0FwbGljYWRvcyA9IDA7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChtYXhOdW1EZXNjdWVudG9zKSB7XHJcbiAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgbnVtZXJvIG1heGltbyBkZSBkZXNjaW5ldG9zIHF1ZSBwdWVkZSBhcGxpY2FyIGxhIHByb21vIHF1ZSBlcyBjb21iaS5BY2Npb24ubWF4TnVtRGVzYyBtdWx0aXBsaWNhZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgcGFsaWNhbiBsYSBwcm9tbyBlbiBlbCBwcm9jZXNvXHJcbiAgICAgICAgICAgICAgICBtYXhOdW1EZXNjdWVudG9zID0gb0xpc3RFbmNhYi5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYyArICtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9LCAwKSAqIG1heE51bURlc2N1ZW50b3M7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9EZSBsb3MgcHJvZHVjdG9zIGRlbCBwcm9jZXNvIGZpbHRybyBsb3MgcHJvZHVjdG9zIHF1ZSBhcGxpY2FyYW4gZWwgZGVzY3VlbnRvIHNlZ3VuIGxvcyBTS1UgY29uZmlndXJhZG9zIGVuIGNvbWJpLkFjY2lvbi5za3VBcGxEZXNjXHJcbiAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5NM0VOQy5mb3JFYWNoKG9NM1BFbmNJdGVtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNrdUFwbERlc2N1ZW50b3MuZmluZCh4ID0+IHguU0tVID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kc0FwbERlc2N1ZW50by5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9Dw6FsY3VsbyBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MgZGUgbG9zIHByb2R1Y3RvcyBhIGxvcyBxdWUgbGEgcHJvbW8gYXBsaWNhcmEgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKHByb2RzQXBsRGVzY3VlbnRvLCBlc0FjdW11bGFibGUpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vQXBsaWNhIHRhbnRvcyBkZXNjdWVudG9zIHNlIHB1ZWRhbiBhIHBsYWljYXIgYSBjYWRhIHZhbG9yIGRlIGxQcmVjaW9cclxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250RGVzY0FwbGljYWRvcyA8IG1heE51bURlc2N1ZW50b3MgJiYgY29udERlc2NBcGxpY2Fkb3MgPCBsUHJlY2lvcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tjb250RGVzY0FwbGljYWRvc10uUFVOSVRORVRPIC09ICgrbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTykgKiAoKCtjb21iaS5BY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250RGVzY0FwbGljYWRvcysrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHNBcGxEZXNjdWVudG8sIGNvbWJpLCB0cnVlLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9DQU5USURBRCBQT1IgUFJPRFVDVE9cclxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgICAgICAgICAgb0xpc3RFbmNhYi5mb3JFYWNoKHByZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udERlc2NBcGxpY2Fkb3MgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZEZpbmRlZCA9IHNrdUFwbERlc2N1ZW50b3MuZmluZCh4ID0+IHguU0tVID09IHByZC5JZFByb2R1Y3RvKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZEZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kc0FwbERlc2N1ZW50by5wdXNoKHByZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2FsY3VsYSBlbCBudW1lcm8gbWF4aW1vIGRlIGRlc2NpbmV0b3MgcXVlIHB1ZWRlIGFwbGljYXIgbGEgcHJvbW8gcXVlIGVzIGNvbWJpLkFjY2lvbi5tYXhOdW1EZXNjIG11bHRpcGxpY2FkbyBwb3IgbGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSBwYWxpY2FuIGxhIHByb21vIGVuIGVsIHByb2Nlc29cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtRGVzY3VlbnRvcyA9ICtwcmQuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgKiBwcmRGaW5kZWQuQ2FudGlkYWQ7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Dw6FsY3VsbyBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MgZGUgbG9zIHByb2R1Y3RvcyBhIGxvcyBxdWUgbGEgcHJvbW8gYXBsaWNhcmEgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jQnlQcmQocHJkLCBlc0FjdW11bGFibGUsIGxQcmVjaW9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQXBsaWNhIHRhbnRvcyBkZXNjdWVudG9zIHNlIHB1ZWRhbiBhIHBsYWljYXIgYSBjYWRhIHZhbG9yIGRlIGxQcmVjaW9cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbnREZXNjQXBsaWNhZG9zIDwgbWF4TnVtRGVzY3VlbnRvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTyAtPSAoK2xQcmVjaW9zW2NvbnREZXNjQXBsaWNhZG9zXS5QVU5JVE5FVE8pICogKCgrY29tYmkuQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGVzY0FwbGljYWRvcysrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHNBcGxEZXNjdWVudG8sIGNvbWJpLCB0cnVlLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBvYnNlcXVpb3MgZW4gZWwgY2llcnJlXHJcbiAgICAgKiBWYWxpZGEgdG9kYSBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYSBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAqIFZhbGlkYSBsYSBwcm9tb2Npw7NuLCBwb3IgY2FkYSBjdWFudG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zLCBjdcOhbnRvcyBvYnNlcXVpb3Mgc2UgcHVlZGVuIGRhci5cclxuICAgICAqIFRyYWUgdG9kb3MgbG9zIG9ic2VxdWlvcyBxdWUgc2UgaW5ncmVzYXJvbiBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXMsIGxvcyBsaXN0YVxyXG4gICAgICogY29sb2NhIGVuIHZhbG9yIDAgbG9zIG9ic2VxdWlvcyBxdWUgc2VsZWNjaW9ubyBhdXRvbWF0aWNhbWVudGUgZWwgYWxnb3JpdG1vXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcywgaW1wdWVzdG9zIHkgZGVtYXMgdmFsb3JlcyB0b3RhbGVzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgbG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zIGFsIGNhcnJpdG8gcXVlIHRpZW5lbiBvYnNlcXVpb1xyXG4gICAgICogQHBhcmFtIGNvbWJpIEluZm9ybWFjacOzbiBkZSBwcm9tb2Npw7NuIGRlIG9ic2VxdWlvc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFByb2Nlc28gY29uIHRvZG9zIGxvcyBwcm9kdWN0b3MgZSBpbmZvcm1hY2nDs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vT2JzcUNpZXJyZShvTGlzdEVuY2FiOiBBcnJheTxhbnk+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29bJ1Byb2R1Y3Rvc0NvbWJpJ10gPSBbXTtcclxuICAgICAgICBsZXQgY2FudFBvck9icyA9ICtjb21iaS5BY2Npb24uQ2FudGlkYWRPYnNxOyAvL1BvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGNvbiBsYSBwcm9tb2Npw7NuIHNlIGRhcsOhIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgIGxldCBjYW50QWdyZWdhZGEgPSAwO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9yQ29tYm8gPSAwO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IG0zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9MaXN0YU9ic2VxdWlvcyA9IGNvbWJpLkFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9ic2VxdWlvc0NhbnRpZGFkID0gMFxyXG4gICAgICAgIC8vIHZhciBjYW50T2JzZXF1aW9zOiBudW1iZXIgPSAwOyAvL0NhbnRpZGFkIGRlIG9ic2VxdWlvcyBxdWUgc2UgZGFyw6EgcG9yIGVzdGEgY29tcHJhLlxyXG5cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWN0byBvZiBvTGlzdEVuY2FiKSB7XHJcbiAgICAgICAgICAgIHN1bWFWYWxvclByb2R1Y3RvcyArPSBwcm9kdWN0by5QVU5JVE5FVE87XHJcbiAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSsrO1xyXG4gICAgICAgICAgICBsZXQgcHJvZHVjdG9SZXZpc2FkbyA9IHByb2R1Y3Rvc1JldmlzYWRvcy5maW5kKHggPT4geC5JZCA9PSBwcm9kdWN0by5JRCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9kdWN0b1JldmlzYWRvKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBwcm9kdWN0by5JRCwgQ2FudGlkYWQ6IDEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjYW50QWdyZWdhZGEgPT09IGNhbnRQb3JPYnMpIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJvZHVjdG9zUmV2aXNhZG9zKTtcclxuICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb21iaS5BY2Npb24uQ29kaWdvKSBjb25zb2xlLmVycm9yKCdFbCBjw7NkaWdvIGRlbCBjb21ibyBubyBlc3RhIGNvbmZpZ3VyYWRvIGVuIE0zREVUQ09ORElQUk9NTycpXHJcbiAgICAgICAgaWYgKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ubGVuZ3RoID4gMCAmJiBjb21iaS5BY2Npb24uQ29kaWdvKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gbTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG0zUmVnU2VydmljZS5hcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIHByb2R1Y3RvQ29tYm8sIGNhbnRpZGFkT2JzZXF1aW9zKTtcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc29bXCJvTTNSZWdTZXJ2aWNlXCJdID0gbTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwbGljYXIgcmVnbGFzLCByZXNwZWN0byBhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYS5cclxuICAgICogQHBhcmFtIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyBcclxuICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAqL1xyXG4gICAgcHVibGljIEFwbGljYXJSZWdsYU1vZENhbnRpZGFkKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IEFjY2lvbi5DYW50aWRhZDsgLy9FamVtcGxvIDogM1xyXG4gICAgICAgIC8vdmFyIGlDYW50aWRhZEFQTFByb21vOiBudW1iZXI7IC8vTnVtZXJvIHJlYWwgZGUgYXBsaWNhY2lvbiBkZSBwcm9tb2Npb25lcywgU2kgYXBsaWNhIHJlc3RhIGVsIHJlc2lkdW8uXHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlcjsgLy9DYW50aWRhZCByZWFsIGluZ3Jlc2FkYS5cclxuICAgICAgICB2YXIgVmFsb3JQcm9tbzogbnVtYmVyID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIHZhciB2YWxvclByb21vVW5pdDogbnVtYmVyID0gKCtWYWxvclByb21vKSAvICgraUNhbnRpZGFkUHJvbW8pXHJcbiAgICAgICAgaUNhbnRpZGFkUmVhbCA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgPj0gaUNhbnRpZGFkUHJvbW8pIHsgLy9KQUdNIDIwMTkwNDI2IFNFIENBTUJJQSwgQU5URVMgRVNUQUJBIExBIEZVTkNJT05BTElEQUQgREUgQ0FOVElEQUQgUkVBTCBWUyBDQU5USURBRCBQUk9NT0NJT04uXHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9pQ2FudGlkYWRBUExQcm9tbyA9IGlDYW50aWRhZFJlYWwgLyBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICBpQ2FudGlkYWRSZWFsID0gaUNhbnRpZGFkUmVhbCAtIFJlc2lkdW87XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlDYW50aWRhZFJlYWw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA+IHZhbG9yUHJvbW9Vbml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gdmFsb3JQcm9tb1VuaXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJBcGxpY2FyUmVnbGFNb2RDYW50aWRhZFwiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhcmdhciBjb21iaW5hZGFzIGRlc2RlIGRpbmFtaWNhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgc0NvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgb0NvbWJpbmFkYSA9IEpTT04ucGFyc2Uoc0NvbWJpbmFkYSk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID0gb0NvbWJpbmFkYTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgZGluYW1pY2FzIHByb2Nlc28gZGUgY29tYmluYWRhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzRmluZGVkOiBNM1BEaW5hbWljYXM7XHJcbiAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZCA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGlmIChvTTNQRGluYW1pY2FzRmluZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPiA9IEpTT04ucGFyc2Uob00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvcik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvUHJvbW9Db21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBhcnJQcm9tb1tpXS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb0NvbWJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5wdXNoKGFyclByb21vW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gXCJDT01CSU5BREFcIjtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG5cclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhciBwcm9tb2Npb25lcywgc2VndW4gbGEgbGlzdGEgZGUgcHJlY2lvcyBkaXZpZGlkYS5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBkZSBwcmVjaW9zLCBjb250cmEgZXN0ZSBvYmpldG8gc2UgaXRlcmFyw6EgeSBzZSBvcmRlbmFyw6EgZGUgbWF5b3IgYSBtZW5vclxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWMobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBUaXBvUHJvbW8gPSBjb21iaS5UaXBvMjtcclxuICAgICAgICB2YXIgaXg6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGl5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciB4OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVsxXVxyXG4gICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBiRW50cm86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHgudG9TdHJpbmcoKS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgICAgICAgICB4ID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy9TZSBpdGVyYSBlbCBhcnJlZ2xvIGRlIHByaW5jaXBpbyBhIGZpbiB5IGRlIGZpbiBhIHByaW5jaXBpby4uLiBcclxuICAgICAgICAvLy9Db25mb3JtZSBzZSByZWNvcnJlIGVsIGFycmVnbG8gZGUgZmluIGEgcHJpbmljaW8sIHNlIHZhIGRhbmRvIGxhIHByb21vY2nDs24gYSBsb3MgcHJvZHVjdG9zIGRlIG1lbm9yIHZhbG9yLlxyXG4gICAgICAgIC8vL1NpIGxhIHByb21vY2nDs24gZXN0YSBpbmNvbXBsZXRhLCBsb3MgcHJvZHVjdG9zIGRlIGxhIG1pdGFkIHF1ZWRhbiBzaW4gcHJvbW9jacOzbiBcclxuICAgICAgICB2YXIgaTogbnVtYmVyID0gMDtcclxuICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgaiA9ICtsUHJlY2lvcy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGxQcmVjaW9zLmxlbmd0aCAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpeCA9IDA7XHJcbiAgICAgICAgICAgICAgICBpeSA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl4IDwgeCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpeCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpeSA8IHkgJiYgaiA+PSBpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNpZHVvWCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJFbnRybyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9IDAuMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tqXS5QVU5JVE5FVE8gPSArbFByZWNpb3Nbal0uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaXkrKztcclxuICAgICAgICAgICAgICAgICAgICBqLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICAgICAgLy9KR0FNIDIwMTkxMDIzLCBmdW5jaW9uYWxpZGFkIGRlIHF1ZSBzb2xvIGVudHJhIGFjw6EgY3VhbmRvIHNlIGNhbWJpbyBhbGd1biBwcmVjaW9cclxuICAgICAgICAgICAgaWYgKGJFbnRybykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBmYWxzZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvLyBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy8gICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgLy8gICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgICAgICAgICAgLy8gICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLlNldFZhbG9yUHJvbW9jaW9uZXMoZW5jKTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuQWdyZWdhckxpc3RhUHJvbW8oZW5jLCBjb21iaSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByZWNpbyB0b3RhbCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MgYSB0ZW5lciBlbiBjdWVudGFcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgUHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJBcGxWYWxpZGE6IGJvb2xlYW4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICB2YXIgZFZhbG9yUHJvbW9BbnQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy92YXIgZFZhbG9yUHJvbW9BbnRBY3VtOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVmFsb3JBY3Q6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9OdWV2byA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG4gICAgICAgICAgICB2YXIgcHJlY2lvVG90YWxBbnRlcmlvcjtcclxuICAgICAgICAgICAgcHJlY2lvVG90YWxBbnRlcmlvciA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcxOCBTRSBRVUlUQSBWQUxJREFDSU9OLCBQT1IgRkxVSk8gUVVFIFNJIFNFIERFVlVFTFZFIFRSQUUgTEEgUFJPTU8sIFBFUk8gU0kgU0UgQk9SUkEuIGlmIChkUHJlY2lvTnVldm8gPCBwcmVjaW9Ub3RhbEFudGVyaW9yKSB7IC8vIFNlIGFncmVnYSB2YWxpZGFjaW9uIGRlIHByZWNpbywgcGFyYSBlc2NvZ2VyIGVsIG1lam9yLiBObyBwdWVkZW4gYSB2ZXIgMiBwcm9tb2Npb25lcy5cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gZFByZWNpb051ZXZvO1xyXG4gICAgICAgICAgICAvL2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFJFQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vTGltcGlhciBwcm9tb2Npb25lc1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMuVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvcywgZW5jKSB8fCAhYkFwbFZhbGlkYSkgJiYgIWJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPTU9DXCIpLlZhbG9yID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIC8vIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGRWYWxvckFjdCA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JQcm9tb0FudCA9IHRoaXMuR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zLCBlbmMpO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gdGhpcy5HZXRWYWxvclByb21vQUN0KGVuYywgZFZhbG9yUHJvbW9BbnQsIGRQcmVjaW9OdWV2bywgcHJlY2lvVG90YWxBbnRlcmlvciwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgc2UgYWdyZWdhIHBhcmEgcHJvbW9jaW9uZXMgYWN1bXVsYWJsZXMuIGFjdW11bGFiXHJcbiAgICAgICAgICAgICAgICBpZiAoIWJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IGRWYWxvclByb21vQW50LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRXMgYWN1bXVsYWJsZSwgdXRpbGl6YXIgbGEgaW5mb3JtYWNpw7NuIFxyXG4gICAgICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3IgLSBwcmVjaW9Ub3RhbEFudGVyaW9yKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlNldFZhbG9yUHJvbW9jaW9uZXMoZW5jLCBkVmFsb3JBY3QgKyBkVmFsb3JQcm9tb0FudCk7XHJcbiAgICAgICAgICAgIHRoaXMuQWdyZWdhckxpc3RhUHJvbW8oZW5jLCBjb21iaSwgZFZhbG9yQWN0KTtcclxuICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvVW5pdEZyb21Ub3RhbChlbmMsIGRQcmVjaW9OdWV2byk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIFF1aXRhckxhc1Byb21vc0RpcmVjdGFzKGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmlsdGVyKHggPT4geC5Ob21icmVDb25jZXB0by50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJWQUxfUFJPTU9DX1wiKSkuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFF1aXRhckxhc1Byb21vc0NvbWJpbmFkYXMoZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maWx0ZXIoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlZBTF9QUk9fQ09NQklfXCIpKS5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsYXIgcHJlY2lvIHVuaXRhcmlvLCBhIHBhcnRpciBkZSB1biBudWV2byBwcmVjaW8gVG90YWwuXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIG5ld1ByaWNlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVjYWxjdWxhclByZWNpb1VuaXRGcm9tVG90YWwoZW5jOiBNM1BFbmNJdGVtcywgbmV3UHJpY2U6IG51bWJlcikge1xyXG4gICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoK25ld1ByaWNlIC8gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgdG9kb3MgbG9zIHByZWNpb3MgZGUgdW4gcHJvZHVjdG8gc2UgY2FtYmlhcm9uIG8gbm8uXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgY29uIHRvZG9zIGxvcyBpdGVtc1xyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJTaVRvZG9zQVBMUHJvbW9Db21iaW5hZGEobFByZWNpb3M6IEFycmF5PGFueT4sIGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAvL0NoZWNrLCBzaSBhbGd1bm8gZGUgbGEgbGlzdGEgZGUgcHJlY2lvIGVzIGlndWFsIGFsIHByZWNpbyBhbnRlcmlvclxyXG4gICAgICAgIHZhciBwcmVjaW9BbnRlcmlvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5maW5kKHggPT4geC5QVU5JVE5FVE8gPT0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKTtcclxuICAgICAgICBpZiAocHJlY2lvQW50ZXJpb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3JlcyBkZSBwcm9tb2Npb25lcyBkZXBlbmRpZW5kbyBkZWwgbnVtZXJvIGRlIGl0ZW1zIHF1ZSBubyBzZSBtb2RpZmljYXJvblxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFZhbG9yUHJvbW9BbnRlcmlvcihsUHJlY2lvczogQXJyYXk8YW55PiwgZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkVmFsb3IgPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBudW1lcm9JdGVtcyA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEICYmIHguUFVOSVRORVRPID09IGRWYWxvcikubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgZFVuaXRQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlZVTklUUFJPTU9cIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArbnVtZXJvSXRlbXMgKiArZFVuaXRQcm9tbztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciBkZSBsYSBwcm9tb2Npb24gcXVlIHNlIGVzdGEgcHJvY2VzYW5kbyBhY3R1YWxtZW50ZVxyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSB2YWxvclByb21vQW50IFxyXG4gICAgICogQHBhcmFtIHZhbG90VG90YWxOdWV2byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFZhbG9yUHJvbW9BQ3QoZW5jOiBNM1BFbmNJdGVtcywgdmFsb3JQcm9tb0FudDogbnVtYmVyLCB2YWxvdFRvdGFsTnVldm86IG51bWJlciwgcHJlY2lvVG90YWxBbnQ6IG51bWJlciwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclRvdGFsU2luRHRvOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vQWN0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzaSB2aWVuZSBhY3VtdWxhYmxlIHV0aWxpemFyIGVsIHByZWNpbyBhbnRlcmlvciwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIGR0by5cclxuICAgICAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5EdG8gPSBwcmVjaW9Ub3RhbEFudDtcclxuICAgICAgICAgICAgICAgIHZhbG9yUHJvbW9BY3QgPSArdmFsb3JUb3RhbFNpbkR0byAtICt2YWxvdFRvdGFsTnVldm87XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvclRvdGFsU2luRHRvID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIHZhbG9yUHJvbW9BY3QgPSArdmFsb3JUb3RhbFNpbkR0byAtICt2YWxvclByb21vQW50IC0gK3ZhbG90VG90YWxOdWV2bztcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB2YWxvclByb21vQWN0O1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgR2V0VmFsb3JQcm9tb0FDdDogXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0ZWFyIGVsIHZhbG9yIGRlIGxhIHByb21vY2lvblxyXG4gICAgICogQHBhcmFtIGVuYyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTZXRWYWxvclByb21vY2lvbmVzKGVuYzogTTNQRW5jSXRlbXMsIHZhbG9yUHJvbW86IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IgPSAoKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3IpIC0gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9uZGVvIGRlbCB2YWxvciBkZSBwcm9tb2Npb25cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IgPSAoTWF0aC5yb3VuZCh2YWxvclByb21vICogMTAwKSAvIDEwMCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjE4IFNlIGFncmVnYSBlbCB2YWxvciB1bml0YXJpbyBkZSBsYSBwcm9tb2Npw7NuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yID0gKCsoTWF0aC5yb3VuZCh2YWxvclByb21vICogMTAwKSAvIDEwMCkgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gIC8qKlxyXG4gICAgLy8gICogU2V0ZWFyIGVsIHZhbG9yIGRlIGxhIHByb21vY2lvblxyXG4gICAgLy8gICogQHBhcmFtIGVuYyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBTZXRWYWxvclByb21vY2lvbmVzRnJvbUxpc3RhUHJlY2lvcyhlbmM6IE0zUEVuY0l0ZW1zLCBsUHJlY2lvczogQXJyYXk8YW55Pikge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKVxyXG4gICAgLy8gICAgIH0gY2F0Y2h7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjQmV0YShsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAvLyAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgLy8gICAgICAgICB2YXIgaVNpemVQcmVjOiBudW1iZXIgPSBsUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAvLyAgICAgICAgIHZhciBpTWl0YWQ6IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciByZXNpZHVvWDogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAvLyAgICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAvLyAgICAgICAgIHZhciBpRHRvOiBudW1iZXI7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAvLyAgICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSAoK3kpIC8gKCtpU2l6ZVByZWMpO1xyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSBNYXRoLmNlaWwoKCtpTWl0YWQpICogKCt4KSkgLSAxO1xyXG5cclxuICAgIC8vICAgICAgICAgbFByZWNpb3MgPSBsUHJlY2lvcy5zb3J0KChhLCBiKSA9PiBhLlBVTklUTkVUTyA8IGIuUFVOSVRORVRPID8gMSA6IGEuUFVOSVRORVRPID4gYi5QVU5JVE5FVE8gPyAtMSA6IDApXHJcblxyXG4gICAgLy8gICAgICAgICB2YXIgaVggPSAwO1xyXG4gICAgLy8gICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaUR0byA9IGlNaXRhZDtcclxuICAgIC8vICAgICAgICAgICAgIHdoaWxlIChpRHRvIDwgaVNpemVQcmVjKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaUR0bysrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vL1BhcmEgbGFzIHByb21vY2lvbiBjb21vOiAyWDEuNSwgLi4uXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vRXN0YSBzb3BvcnRhbmRvIHNvbG8gcGFyYTogMlgxLjVcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gK2xQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlKGlYIDwgeCl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlYKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gaVggPSAwO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAvLyAgICAgICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAvLyAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGxpc3RhIGRlIGRldGFsbGUgZWw6ICBOT01CX1BST01PQywgVkFMX1BST01PQyB5IElEX1BST01PQ1xyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJMaXN0YVByb21vKGVuYzogTTNQRW5jSXRlbXMsIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGRWYWxvclByb21vQ29tYmk6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkZXROb21icmVzOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIGRldFZhbG9yZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0SWRzOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zTmFtZXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zVmFsczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNJZHM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG5cclxuXHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIik7XHJcblxyXG4gICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLk5vbWJyZUNvbmNlcHRvID0gXCJOT01CX1BST19DT01CSVwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLk5vbWJyZUNvbmNlcHRvID0gXCJWQUxfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5Ob21icmVDb25jZXB0byA9IFwiSURfUFJPX0NPTUJJXCJcclxuXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBcIlwiXHJcblxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNWYWxzKVxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zSWRzKVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgKyBjb21iaS5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciArIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhICsgXCIsXCI7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciArIGRWYWxvclByb21vQ29tYmkudG9TdHJpbmcoKSArIFwiLFwiO1xyXG5cclxuICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacOzblxyXG4gICAgICAgIGxldCBsaXN0Tm9tYnJlID0gb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaXN0SWQgPSBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaXN0VmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvci5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RJZC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiTk9NQl9QUk9fQ09NQklfXCIgKyBfaSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShlbmMuTTNERVQsIGxpc3ROb21icmVbX2ldLCBcIklEX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiVkFMX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShhcnJheURpbmFtaWNhczogQXJyYXk8TTNQRGV0YWxsZUl0ZW1zPiwgbm9tYnJlRGluYW1pY2E6IHN0cmluZywgVmFsb3JEaW5hbWljYTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG9NM1BEZXRhbGxlSXRlbXMgPSBhcnJheURpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBub21icmVEaW5hbWljYSk7XHJcbiAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gbm9tYnJlRGluYW1pY2E7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBWYWxvckRpbmFtaWNhO1xyXG4gICAgICAgICAgICBhcnJheURpbmFtaWNhcy5wdXNoKG9NM1BEZXRhbGxlSXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbGEgbGlzdGEgZGUgZW5jYWJlemFkb3MsIHF1ZSBhcGxpY2FuIGEgbGEgbGlzdGEgY29tYmluYWRhIHF1ZSB0aWVuZVxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Db21iaW5hZGEgT2JqZXRvIGRlIHByb21vY2lvbiBjb21iaWFuZGFcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBPYmpldG8gZGUgTTNQcm9jZXNvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0RW5jYWJlemFkb0J5Q29tYmkob1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgICAgIG9MaXN0RW5jYWIgPSBpb00zUHJvY2Vzby5NM0VOQy5maWx0ZXIoZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmMuUHJvbW9Db21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNldFByb21vQ29tYmluYWRhRU5DKGVuYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIShlbmMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgJiYgK2VuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTEyMDggc2UgY2FtYmlhIHZhbGlkYWNpb24sIHBhcmEgcXVlIHRlbmdhIGVuIGN1ZW50YSBjdWFscXVpZXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZW5jLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuYy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuYy5Qcm9tb0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdEVuY2FiO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFNldFByb21vQ29tYmluYWRhRU5DKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyA9IEpTT04ucGFyc2Uob00zUERldGFsbGVJdGVtcy5WYWxvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXIgbGlzdGEgZGUgcHJlY2lvcyB5IGlkIGRlIGVuY2FiZXphZG8sIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBsaXN0YSBkZSBlbmNhYmV6YWRvc1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcm9jZXNhclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLy9EZXNBY29wbGFyIGxpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgdmFyIGxQcmVjaW9zID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgbkNhbnRpZGFkOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBuUHJlY2lvVW5pdDogbnVtYmVyO1xyXG4gICAgICAgICAgICBuQ2FudGlkYWQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHZhbGlkYSBzaSBsYSBwcm9tb2Npb24gZXMgYWN1bXVsYWJsZS5cclxuICAgICAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3JcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbkNhbnRpZGFkOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zLnB1c2goeyBcIkluZGljZVwiOiBqLCBcIlBVTklUTkVUT1wiOiBuUHJlY2lvVW5pdCwgXCJJRFwiOiBlbmMuSUQgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmNCeVByZChlbmM6IE0zUEVuY0l0ZW1zLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuLCBsUHJlY2lvczogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgICAgIHZhciBuUHJlY2lvVW5pdDogbnVtYmVyO1xyXG4gICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvclxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zLnB1c2goeyBcIkluZGljZVwiOiBqLCBcIlBVTklUTkVUT1wiOiBuUHJlY2lvVW5pdCwgXCJJRFwiOiBlbmMuSUQsIFwiSURQUk9EVUNUT1wiOiBlbmMuSWRQcm9kdWN0byB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgLy8gICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAvLyAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklEIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBsUHJlY2lvcztcclxuXHJcbiAgICAvLyB9XHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vRklOIFYyIENPTUJJTkFEQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogUHJvY2VzYXJDb21iaW5hZGFYcG9yWVxyXG4gICAgKiBQcm9jZXNhciBwcm9tb2Npb24gY29tYmluYWRhIHF1ZSBzZSBsbGV2YW4geCBwcm9kdWN0b3MgcG9yIGVsIHByZWNpb24gZGUgeSBwcm9kdWN0b3MuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhWHBvclkob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG86IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdmFyIG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgdmFyIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvO1xyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBhZ3JlZ2FkbywgdGllbmUgdW5hIG1pc21hIHByb21vY2lvbiBhY3RpdmEgZW4gbGEgZmFjdHVyYS5cclxuICAgICAgICAvLyBpZiAob00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSAhPSBudWxsICYmIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvID0gb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYS5maW5kKGNvbWJpbmFkYXMgPT4gY29tYmluYWRhcy5JZFByb21vY2lvbiA9PSBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSAmJiBjb21iaW5hZGFzLlRlcm1pbmFkYSA9PSBmYWxzZSk7XHJcbiAgICAgICAgLy8gICAgIC8vVmFsaWRhIHNpIHlhIGV4aXN0ZSB1biBwcm9jZXNvLlxyXG4gICAgICAgIC8vICAgICBpZiAobTNDb21iaW5hZGF4UHJvY2VzbyAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvblhQcm9jZXNvID0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvO1xyXG4gICAgICAgIC8vICAgICAgICAgLy9UcmFlIGxvcyBFbmNhYmV6YWRvcyBjb24gbGEgcHJvbW9jaW9uIFxyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jcyA9PiBlbmNzLlByb21vQ29tYmluYWRhcyAhPSBudWxsICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jcy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9PSBtM0NvbWJpbmFkYXhQcm9jZXNvLklkUHJvbW9jaW9uWFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbywgbTNDb21iaW5hZGF4UHJvY2Vzbyk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkFncmVnYXJQcm9tb2Npb25Db21iaW5hZGFBUHJvY2VzbyhvTTNQcm9jZXNvcywgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSA9IG5ldyBBcnJheTxNM1Byb21Db21iaW5hZGFYUHJvY2Vzbz4oKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcmVjYWxjdWxhciBwcm9tb2Npb24sIGRlcGVuZGllbmRvIGRlIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIC8vMS5WYWxpZGFyIHNpIHlhIGVzdGFuIHRvZG9zIGxvcyBpdGVtcyBwYXJhIHJlY2FsY3VsYXIgbGEgcHJvbW9jaW9uXHJcbiAgICAvLzIuIE9yZGVuYXIgbG9zIGVuY2FiZXphZG9zIGRlIG1heW9yIGEgbWVub3IgcHJlY2lvLlxyXG4gICAgLy8zLiBEZWphciBlbCBwcmVjaW8gZGUgbG9zIGl0ZW1zIGRlIG1lbm9yIHByZWNpb24gZW4gMFxyXG4gICAgLy8gcHVibGljIFJlY2FsY3VsYXJQcm9tb1hQb3JZKG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz4sIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvKSB7XHJcbiAgICAvLyAgICAgdmFyIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYTtcclxuICAgIC8vICAgICB2YXIgdmFyeDogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciB2YXJ5OiBudW1iZXI7XHJcbiAgICAvLyAgICAgdmFyIHBhcnRlRGVjWTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvUHJvbW9jaW9uQ29tYmluYWRhID0gbTNFbmNzQ29uUHJvbW9bMF0uUHJvbW9Db21iaW5hZGFzWzBdO1xyXG5cclxuICAgIC8vICAgICB2YXJ4ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMF0pO1xyXG4gICAgLy8gICAgIHZhcnkgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChTdHJpbmcodmFyeSkuaW5jbHVkZXMoXCIuXCIpKSB7XHJcbiAgICAvLyAgICAgICAgIHBhcnRlRGVjWSA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzFdLnNwbGl0KFwiLlwiKVsxXSk7XHJcbiAgICAvLyAgICAgICAgIHZhcnkgPSBwYXJzZUZsb2F0KFN0cmluZyh2YXJ5KS5zcGxpdChcIi5cIilbMF0pO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgaWYgKHZhcnggPT0gbTNFbmNzQ29uUHJvbW8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIG0zQ29tYmluYWRheFByb2Nlc28uVGVybWluYWRhID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgLy9PcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBwb3IgcHJlY2lvIG1heW9yIGEgbWVub3JcclxuICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBtM0VuY3NDb25Qcm9tby5zb3J0KChhLCBiKSA9PlxyXG4gICAgLy8gICAgICAgICAgICAgKGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yIDwgYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpID8gMSA6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKChiLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IC0xIDogMCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtM0VuY3NDb25Qcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgLy9WYWxpZGEgc2kgeWEgXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGFydGVEZWNZICE9IDAgJiYgKCtpKSA9PSAoK3ZhcnkpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFydGVEZWNZKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoKCttM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpICogKCsoK3BhcnRlRGVjWSkgLyAxMDApKS50b1N0cmluZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIGlmICgoK2kpICsgMSA+IHZhcnkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBcIjBcIjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRvdGFsIGRlIHB1bnRvcyBkZSBmaWRlbGl6YWNpb24gZW4gbGEgdHJhbnNhY2Npw7NuIHJlZG9uZGVhZG9zIGhhY8OtYSBhYmFqb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X3RvdGFsX2ZpZGVsaXphY2lvbihvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB0b3RhbF9maWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdG90YWxfZmlkZWxpemFjaW9uID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJGSURFTElaQUNJT05cIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgoKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiRklERUxJWkFDSU9OXCIpLlZhbG9yKSAvIDEwMCkgKiAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLCAwKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1NlIHJlZG9uZGVhcmEgbm8gYWNhIHNpbm8gZW4gbGEgc3VtYSB0b3RhbCBkZWwgZmlkZWxpemFjaW9uIGRlIGNhZGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICAgIHJldHVybiB0b3RhbF9maWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRpZW5lIGVsIHZhbG9yIGRlbCBmaWRlbGl6YWNpb24gZGUgdW4gcHJvY2VzbywgZXZhbHVhbmRvIGNhZGEgZm9ybWEgZGUgcGFnb1xyXG4gICAgICogQHBhcmFtIHByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gbGlzdF9lbmNfcHJvbW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfdmFsdWVfZmlkZWxpemFjaW9uX2J5X3Byb2Nlc28ocHJvY2VzbzogTTNQcm9jZXNvcywgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcblxyXG4gICAgICAgIHZhciBwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciA9IHByb2Nlc28uVmFsb3JOZXRvO1xyXG4gICAgICAgIC8vdmFyIG1heF92YWx1ZV9maWRlbGl6YWNpb246IG51bWJlciA9IHRoaXMuZ2V0X3RvdGFsX2ZpZGVsaXphY2lvbihwcm9jZXNvKTtcclxuICAgICAgICB2YXIgcmVhbF92YWx1ZV9maWRlbGl6YWNpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIHZhciBsaXN0X2NvbmRpX3Byb21vID0gdGhpcy5nZXRfbGlzdF9jb25kaV9wcm9tb19ieV9hY3RpdmlkYWQobGlzdF9lbmNfcHJvbW8sIFwiUEFHT1wiLCBcIk1PTkVERVJPXCIpO1xyXG5cclxuICAgICAgICBpZiAocHJvY2Vzby5sTTNQRW5jRlApIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHByb2Nlc28ubE0zUEVuY0ZQLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hX3BhZ286IE0zUEVuY0ZQID0gcHJvY2Vzby5sTTNQRW5jRlBbX2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21vQXBsaWNhZGE6IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgICAgIGxldCBhcGxpY2FfZmlkZWxpemFjaW9uID0gdGhpcy52YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ28sIGxpc3RfY29uZGlfcHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcGxpY2FfZmlkZWxpemFjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JQYWdvID0gZm9ybWFfcGFnby5WYWxvciAtIGZvcm1hX3BhZ28uVmFsQ2FtYmlvO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uICs9IHRoaXMuY2FsY3VsYXRlX2ZpZGVsaXphY2lvbl9ieV9mb3JtYV9wYWdvKHBhZ29fdG90YWxfcHJvY2VzbywgcHJvY2Vzby5NM0VOQywgdmFsb3JQYWdvLCBhcGxpY2FfZmlkZWxpemFjaW9uLCBsaXN0X2VuY19wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA+IG1heF92YWx1ZV9maWRlbGl6YWNpb24pIHtcclxuICAgICAgICAvLyAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMub01hdGhURi5yb3VuZChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiwgMik7XHJcbiAgICAgICAgcmV0dXJuIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIGRlIHRpcG8gZGUgcGFnbyBhIHBhcnRpciBkZSBBcnJheTxNM0NPTkRJUFJPTU8+XHJcbiAgICAgKiBAcGFyYW0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvIC5cclxuICAgICAqIEBwYXJhbSBsaXN0TTNFbmNJdGVtIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG86IEFycmF5PE0zQ09ORElQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPik6IEFycmF5PE0zQ09ORElQUk9NTz4ge1xyXG4gICAgICAgIGxldCByZXN0cmljY2lvbmVzQWN0aXZhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgaWYgKGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0TTNFbmNJdGVtLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpc3RNM0RldCA9IGxpc3RNM0VuY0l0ZW1bX2ldLk0zREVUO1xyXG4gICAgICAgICAgICAgICAgaWYgKCtsaXN0TTNFbmNJdGVtW19pXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tb2Npb25lcyA9IGxpc3RNM0RldC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRQcm9tb2Npb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tbyA9IGlkUHJvbW9jaW9uZXMuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgaWRQcm9tby5sZW5ndGg7IF9rKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9ICtpZFByb21vW19rXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaVByb21vID0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaVByb21vICYmICFyZXN0cmljY2lvbmVzQWN0aXZhcy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljY2lvbmVzQWN0aXZhcy5wdXNoKGNvbmRpUHJvbW8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3RyaWNjaW9uZXNBY3RpdmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIHBhcmEgbG9zIHByb2R1Y3RvcyBkZWwgcHJvY2VzbyBhY3R1YWxcclxuICAgICAqIEBwYXJhbSBsaXN0RW5jUHJvbW8gXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXNGcm9tRW5jUHJvbW8obGlzdEVuY1Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgbGlzdE0zRW5jSXRlbTogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RFbmNQcm9tbywgXCJQQUdPXCIsIFwiUkVTVFJJQ0NJT05fUEFHT1wiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8sIGxpc3RNM0VuY0l0ZW0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIG1vdmltaWVudG9zIHJlYWxpemFkb3MgcG9yIHVuIG0zc2FsZG9zeGN1ZW50YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkX20zXCI6IGlkbTMsIFwiaWRfcHJvY2Vzb1wiOiBwcm9jZXNvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBtb3ZzID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcF9tb3ZzOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICBpZiAoIW1vdnMuTU9WUy5NT1YubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzLnB1c2gobW92cy5NT1ZTLk1PVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBtb3ZzLk1PVlMuTU9WO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcF9tb3ZzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgbGEgZm9ybWEgZGUgcGFnbyBjdW1wbGUgYWxndW5hIGNvbmRpY2lvbiBkZSBmaWRlbGl6YWNpb25cclxuICAgICAqIEBwYXJhbSBmb3JtYV9wYWdvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfY29uZGlfcHJvbW86IGxpc3RhZG8gZGUgY29uZGljaW9uZXMgZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ286IE0zUEVuY0ZQLCBsaXN0X2NvbmRpX3Byb21vOiBBcnJheTxNM0NPTkRJUFJPTU8+KSB7XHJcbiAgICAgICAgLy9yZXR1cm4gbGlzdF9jb25kaV9wcm9tb1swXTtcclxuICAgICAgICBsZXQgcHJvbW9zQXBsaWNhZGFzID0gbmV3IEFycmF5PE0zQ09ORElQUk9NTz4oKTtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdF9jb25kaV9wcm9tby5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdmFyIGNvbmRpX3Byb21vID0gbGlzdF9jb25kaV9wcm9tb1tfaV07XHJcbiAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbmRpX3Byb21vLkNvbmNlcHRvLnRyaW0oKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIklEX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICAvL1NpIGVsIG9wZXJhZG9yIGVzIERJRkYgY3JlYSB1bmEgZXhwcmVzaW9uIHJlZ3VsYSBwYXJhIGV4Y2x1aXIgbG8gdGlwb2RlcGFnbyBjb25maWd1cmFkb3NcclxuICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYSAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkRJRkZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaV9wcm9tby5WYWxvciA9IFwiXig/IShcIiArIGNvbmRpX3Byb21vLlZhbG9yICsgXCIpXFxcXGIpXFxcXHcrJFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKSRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChjb25kaV9wcm9tby5WYWxvciwgXCJpXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS50ZXN0KGZvcm1hX3BhZ28uSWRUaXBvUGFnby50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3NBcGxpY2FkYXMucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9tb3NBcGxpY2FkYXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIGxpc3RhZG8gZGUgY29uZGljaW9uZXMgdmFsaWRhcyBwYXJhIHVuYSBhY3RpdmlkYWQgZGFkYVxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgYWN0aXZpZGFkOiBzdHJpbmcsIHRpcG8yOiBzdHJpbmcpOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPiA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAgIGlmIChsaXN0X2VuY19wcm9tbykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGlzdF9lbmNfcHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5jYWJlemFkb1Byb21vID0gbGlzdF9lbmNfcHJvbW9bX2tdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRWaWdlbmNpYSA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5WaWdlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZEluaWNpbyA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5JbmljaW8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc3RhZG8gJiYgZFZpZ2VuY2lhID49IGhveSAmJiBkSW5pY2lvIDw9IGhveSAmJiBlbmNhYmV6YWRvUHJvbW8uVGlwbzIgPT0gdGlwbzIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgZW5jYWJlemFkb1Byb21vLk0zQ09ORElBR1JVUEFDSU9OLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfYWdydXBhY2lvbiA9IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTltfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaiA9IDA7IF9qIDwgY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU8ubGVuZ3RoOyBfaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfcHJvbW8gPSBjb25kaV9hZ3J1cGFjaW9uLk0zQ09ORElQUk9NT1tfal07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEICYmIGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBhY3RpdmlkYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9jb25kaV9wcm9tby5wdXNoKGNvbmRpX3Byb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2NvbmRpX3Byb21vO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuYSBmb3JtYSBkZSBwYWdvIGRlIGFjdWVyZG8gYSBzdSBwb3JjZW50YWplIHJlc3BlY3RvIGVsIHZhbG9yIHRvdGFsIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcGFnb190b3RhbF9wcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIG1heF92YWx1ZV9maWRlbGl6YWNpb24gXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVfZm9ybWFfcGFnbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciwgbGlzdE0zRW5jOiBNM1BFbmNJdGVtc1tdLCB2YWx1ZV9mb3JtYV9wYWdvOiBudW1iZXIsIHByb21vc0FwbGljYWRhOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuICAgICAgICBsZXQgbGlzdFByb21vc0FwbGljYWRhcztcclxuICAgICAgICBsZXQgZGV0YWxsZUlkUHJvbW9jO1xyXG4gICAgICAgIGxldCB2YWxvckZpZGVsaXphY2lvbiA9IDA7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRfZm9ybWFfcGFnbzogbnVtYmVyID0gdmFsdWVfZm9ybWFfcGFnbyAvIHBhZ29fdG90YWxfcHJvY2VzbztcclxuICAgICAgICB2YXIgcHJlY2lvUHJvZHVjdG8gPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0TTNFbmMpIHtcclxuICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IFtdO1xyXG4gICAgICAgICAgICBkZXRhbGxlSWRQcm9tb2MgPSBpdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPTU9DXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Qcm9kdWN0byA9ICtpdGVtLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBsZXQgcHJlY2lvU1IgPSBpdGVtLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1NSXCIpO1xyXG4gICAgICAgICAgICBpZiAocHJlY2lvU1IgIT0gbnVsbCAmJiBwcmVjaW9TUi5WYWxvciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwcmVjaW9Qcm9kdWN0byA9ICtwcmVjaW9TUi5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZUlkUHJvbW9jICYmIGRldGFsbGVJZFByb21vYy5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IGRldGFsbGVJZFByb21vYy5WYWxvci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tb0FwbCBvZiBwcm9tb3NBcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RQcm9tb3NBcGxpY2FkYXMuZmluZCh4ID0+ICt4ID09IHByb21vQXBsLklkUHJvbW9jaW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9IGxpc3RfZW5jX3Byb21vLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vQXBsLklkUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3IgPSB0aGlzLnZhbGlkYXJSZWRvbmRlbyhwcm9tbywgcHJlY2lvUHJvZHVjdG8gKiB0aGlzLmdldFBvcmNlbnRhamVGaWRlbGl6YWNpb25Gcm9tRW5jUHJvbW8ocHJvbW8pIC8gMTAwKSAqIChwZXJjZW50X2Zvcm1hX3BhZ28pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yRmlkZWxpemFjaW9uICs9IHZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvckZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09UICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhclJlZG9uZGVvKHByb21vLCB2YWxvcjogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09UICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uUmVkb25kZW8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQodmFsb3IsICtqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uUmVkb25kZW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWxvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmEgdW5hIGRpbmFtaWNhIGNvbiBlbCB2YWxvciBkZSBsYSBmaWRlbGl6YWNpw7NuIGRlIGRpY2hvIHByb2Nlc28geSByZXRvcm5hIGRpY2hvIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkX2RpbmFtaWNhX2ZpZGVsaXphY2lvbl90b19wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPik6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIHZhciB2YWx1ZV9maWRlbGl6YWNpb24gPSAwXHJcbiAgICAgICAgaWYgKGxpc3RfZW5jX3Byb21vKSB7XHJcbiAgICAgICAgICAgIHZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMuZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc28sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZV9maWRlbGl6YWNpb24gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYV9maWRlbGl6YWNpb246IE0zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLk5vbWJyZSA9IFwiRklERUxJWkFDSU9OXCJcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLlZhbG9yID0gdmFsdWVfZmlkZWxpemFjaW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChkaW5hbWljYV9maWRlbGl6YWNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBkb2N1bWVudG8gZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRhYmxhIE0zU2FsZG9zWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRvIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9kb2NfZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzYWxkb194X2N1ZW50YTtcclxuICAgICAgICAgICAgc2FsZG9feF9jdWVudGEgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLk0zU2FsZG9zWEN1ZW50YTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHNhbGRvX3hfY3VlbnRhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgZWwgc2FsZG8gc3VtYW5kb2xlIGVsIHZhbG9yIGVudmlhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbGl6YXJfc2FsZG9fZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0ge1wiZG9jdW1lbnRvXCI6ZG9jdW1lbnRvLCBcInZhbG9yX21vdmltaWVudG9cIjp2YWxvcl9tb3ZpZW50bywgXCJwYWdvXCI6cGFnbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9hY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEucGFnby5pZERpYXJpbyA9IHJlc3BbXCJfYm9keVwiXS5yZXBsYWNlKCdcIicsICcnKS5yZXBsYWNlKCdcIicsICcnKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEucGFnbyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBVbiBib25vIGRlIGRldm9sdWNpb24gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3J9XHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9ib25vX2Rldm9sdWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gbnVldm8gcmVnaXN0cm8gZW4gbGEgdGFibGEgU2FsZG9YQ3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM0luc2VydFNhbGRvWEN1ZW50YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7ICdEb2N1bWVudG8nOiB0aGlzLmRvY3VtZW50bywgJ1REb2NUaXR1bGFyJzogJzUnLCAnTkRvY1RpdHVsYXInOiB0aGlzLm5kb2NfY2xpZW50ZSwgJ05vbUN1ZW50YSc6ICdGSURFTElaQUNJT04nLCAnVmFsQ3VlbnRhJzogMCB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM0luc2VydFNhbGRvWEN1ZW50YS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKE0zRU5DOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICBpZiAoTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IE0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19