gridviz 2.0.50 → 2.0.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/gridviz.js +58 -10
- package/dist/gridviz.min.js +1 -1
- package/package.json +1 -1
- package/src/App.js +9 -4
- package/src/style/TimeSeriesStyle.js +48 -5
package/dist/gridviz.js
CHANGED
|
@@ -8285,7 +8285,7 @@ class App {
|
|
|
8285
8285
|
if (strong) dsc.updateViewCache(this.cg.extGeo)
|
|
8286
8286
|
|
|
8287
8287
|
//set layer alpha and blend mode
|
|
8288
|
-
this.cg.ctx.globalAlpha = layer.alpha? layer.alpha(zf) : 1.0
|
|
8288
|
+
this.cg.ctx.globalAlpha = layer.alpha ? layer.alpha(zf) : 1.0
|
|
8289
8289
|
this.cg.ctx.globalCompositeOperation = layer.blendOperation(zf)
|
|
8290
8290
|
|
|
8291
8291
|
//draw cells, style by style
|
|
@@ -8298,14 +8298,14 @@ class App {
|
|
|
8298
8298
|
|
|
8299
8299
|
//set style alpha and blend mode
|
|
8300
8300
|
//TODO: multiply by layer alpha ?
|
|
8301
|
-
this.cg.ctx.globalAlpha = s.alpha? s.alpha(zf) : 1.0
|
|
8301
|
+
this.cg.ctx.globalAlpha = s.alpha ? s.alpha(zf) : 1.0
|
|
8302
8302
|
this.cg.ctx.globalCompositeOperation = s.blendOperation(zf)
|
|
8303
|
-
|
|
8303
|
+
|
|
8304
8304
|
s.draw(dsc.getViewCache(), dsc.getResolution(), this.cg)
|
|
8305
8305
|
}
|
|
8306
8306
|
|
|
8307
8307
|
//add legend element
|
|
8308
|
-
if (this.legend && strong)
|
|
8308
|
+
if (this.legend && strong) {
|
|
8309
8309
|
for (const s of layer.styles) {
|
|
8310
8310
|
if (zf > s.maxZoom) continue
|
|
8311
8311
|
if (zf < s.minZoom) continue
|
|
@@ -8331,6 +8331,11 @@ class App {
|
|
|
8331
8331
|
}
|
|
8332
8332
|
}
|
|
8333
8333
|
}
|
|
8334
|
+
}
|
|
8335
|
+
|
|
8336
|
+
//restore default alpha and blend operation
|
|
8337
|
+
this.cg.ctx.globalAlpha = 1.0
|
|
8338
|
+
this.cg.ctx.globalCompositeOperation = "normal"
|
|
8334
8339
|
}
|
|
8335
8340
|
|
|
8336
8341
|
//draw boundary layer
|
|
@@ -14854,6 +14859,10 @@ class TimeSeriesStyle extends _Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
|
|
|
14854
14859
|
* @type {Array.<string>} */
|
|
14855
14860
|
this.ts = opts.ts
|
|
14856
14861
|
|
|
14862
|
+
/** A function specifying when a value should be considered as "no data" and thus not ignored. The line will have a break at these values.
|
|
14863
|
+
* @type {function(string):boolean} */
|
|
14864
|
+
this.noData = opts.noData || ((v) => v === undefined || v == "" || v === null || isNaN(+v))
|
|
14865
|
+
|
|
14857
14866
|
//x
|
|
14858
14867
|
/** in geo unit
|
|
14859
14868
|
* @type {function(import("../Dataset.js").Cell,number,number):number} */
|
|
@@ -14945,7 +14954,7 @@ class TimeSeriesStyle extends _Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
|
|
|
14945
14954
|
//in geo coordinates
|
|
14946
14955
|
cg.setCanvasTransform()
|
|
14947
14956
|
|
|
14948
|
-
cg.ctx.lineCap =
|
|
14957
|
+
cg.ctx.lineCap = "butt"
|
|
14949
14958
|
for (let c of cells) {
|
|
14950
14959
|
|
|
14951
14960
|
//line width
|
|
@@ -15018,28 +15027,67 @@ class TimeSeriesStyle extends _Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
|
|
|
15018
15027
|
continue;
|
|
15019
15028
|
}
|
|
15020
15029
|
|
|
15030
|
+
/*/draw line
|
|
15021
15031
|
if (val0 == undefined || isNaN(val0)) continue
|
|
15022
|
-
|
|
15023
|
-
//draw line
|
|
15024
15032
|
cg.ctx.beginPath()
|
|
15025
15033
|
const sX = w / (nb - 1)
|
|
15026
15034
|
for (let i = 0; i < nb; i++) {
|
|
15027
15035
|
const val = c[this.ts[i]]
|
|
15028
|
-
if (val == undefined) break
|
|
15036
|
+
if (val == undefined || isNaN(val)) break
|
|
15029
15037
|
if (i == 0)
|
|
15030
15038
|
cg.ctx.moveTo(c.x + i * sX + offX, c.y + y0 + (val - val0) * h / ampMax + offY)
|
|
15031
15039
|
else
|
|
15032
15040
|
cg.ctx.lineTo(c.x + i * sX + offX, c.y + y0 + (val - val0) * h / ampMax + offY)
|
|
15033
15041
|
}
|
|
15042
|
+
cg.ctx.stroke()*/
|
|
15034
15043
|
|
|
15035
|
-
|
|
15044
|
+
|
|
15045
|
+
//draw line, segment by segment
|
|
15046
|
+
const sX = w / (nb - 1)
|
|
15047
|
+
|
|
15048
|
+
//handle first point
|
|
15049
|
+
let v0 = c[this.ts[0]]
|
|
15050
|
+
if (!this.noData(v0)) {
|
|
15051
|
+
cg.ctx.beginPath()
|
|
15052
|
+
cg.ctx.moveTo(c.x + offX, c.y + y0 + (v0 - val0) * h / ampMax + offY)
|
|
15053
|
+
}
|
|
15054
|
+
//console.log(v0, isNaN(v0))
|
|
15055
|
+
|
|
15056
|
+
let v1
|
|
15057
|
+
for (let i = 1; i < nb; i++) {
|
|
15058
|
+
v1 = c[this.ts[i]]
|
|
15059
|
+
|
|
15060
|
+
//draw segment from v0 to v1
|
|
15061
|
+
|
|
15062
|
+
//both points 'no data'
|
|
15063
|
+
if (this.noData(v0) && this.noData(v1)) {
|
|
15064
|
+
|
|
15065
|
+
//second point 'no data'
|
|
15066
|
+
} else if (!this.noData(v0) && this.noData(v1)) {
|
|
15067
|
+
cg.ctx.stroke()
|
|
15068
|
+
|
|
15069
|
+
//first point 'no data'
|
|
15070
|
+
} else if (this.noData(v0) && !this.noData(v1)) {
|
|
15071
|
+
cg.ctx.beginPath()
|
|
15072
|
+
cg.ctx.moveTo(c.x + i * sX + offX, c.y + y0 + (v1 - val0) * h / ampMax + offY)
|
|
15073
|
+
|
|
15074
|
+
//both points have data: trace line
|
|
15075
|
+
} else {
|
|
15076
|
+
cg.ctx.lineTo(c.x + i * sX + offX, c.y + y0 + (v1 - val0) * h / ampMax + offY)
|
|
15077
|
+
//if it is the last point, stroke
|
|
15078
|
+
if (i == nb - 1) cg.ctx.stroke()
|
|
15079
|
+
}
|
|
15080
|
+
v0 = v1
|
|
15081
|
+
}
|
|
15036
15082
|
|
|
15037
15083
|
}
|
|
15038
15084
|
|
|
15039
15085
|
}
|
|
15086
|
+
|
|
15040
15087
|
}
|
|
15041
15088
|
|
|
15042
15089
|
|
|
15090
|
+
|
|
15043
15091
|
/***/ }),
|
|
15044
15092
|
|
|
15045
15093
|
/***/ "./src/utils/Utils.js":
|
|
@@ -16206,4 +16254,4 @@ const getParameterByName = _GeoCanvas_js__WEBPACK_IMPORTED_MODULE_1__.GeoCanvas.
|
|
|
16206
16254
|
/******/ })()
|
|
16207
16255
|
;
|
|
16208
16256
|
});
|
|
16209
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHZpei5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSMkM7O0FBRXBDOztBQUVBO0FBQ0E7O0FBRVA7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLElBQUk7QUFDN0Isd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQ25FLDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQ25FLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsMENBQTBDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7O0FBRW5FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzREFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFD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OztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVPLDJCQUEyQixvREFBUzs7QUFFM0M7QUFDQSxDQUErQztBQUMvQyxzREFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3Zpei93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZnN1bS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZXJnZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2RyYWcuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2V2ZW50LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9jc3YuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvdHN2LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvZHN2LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvdGV4dC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZGVmYXVsdExvY2FsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZXhwb25lbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdERlY2ltYWwuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdEdyb3VwLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0UHJlZml4QXV0by5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0Um91bmRlZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0U3BlY2lmaWVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUcmltLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUeXBlcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2xvY2FsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2FydGVzaWFuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jaXJjbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvYW50aW1lcmlkaWFuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2J1ZmZlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2xpcC9jaXJjbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvbGluZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2xpcC9yZWN0YW5nbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvcmVqb2luLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jb21wb3NlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL21hdGguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL25vb3AuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3BhdGgvYm91bmRzLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wb2ludEVxdWFsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wb2x5Z29uQ29udGFpbnMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vYXppbXV0aGFsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2F6aW11dGhhbEVxdWFsQXJlYS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9maXQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vcmVzYW1wbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3JvdGF0aW9uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcmdiLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvem9vbS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvZGVmYXVsdFNvdXJjZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvbm9ybWFsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvcG9pbnRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NhbGwuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXRhLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0dW0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VhY2guanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbXB0eS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VudGVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luc2VydC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vam9pbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zaXplLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zb3VyY2VFdmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9hY3RpdmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0clR3ZWVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ludGVycG9sYXRlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9tZXJnZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2NoZWR1bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0QWxsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZVR3ZWVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3R3ZWVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ldmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9BcHAuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9CYWNrZ3JvdW5kTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9EYXRhc2V0LmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvRGF0YXNldENvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0dlb0NhbnZhcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0xhYmVsTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9MYXllci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0xlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0xpbmVMYXllci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL1N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvVG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2RhdGFzZXQvQ1NWR3JpZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2RhdGFzZXQvR3JpZFRpbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9kYXRhc2V0L1RpbGVkR3JpZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9sZWdlbmQvQ29sb3JMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9sZWdlbmQvU2VnbWVudE9yaWVudGF0aW9uTGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvbGVnZW5kL1NlZ21lbnRXaWR0aExlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2xlZ2VuZC9TaXplTGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvQ29tcG9zaXRpb25TdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0NvbnRvdXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0RvdERlbnNpdHlTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0pveVBsb3RTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0xlZ29TdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL01vc2FpY1N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvTmluamFTdGFyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9QaWxsYXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1NlZ21lbnRTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TaWRlQ2F0U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TaWRlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TcXVhcmVDb2xvckNhdFdHTFN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU3F1YXJlQ29sb3JXR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1N0cm9rZVN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvVGFuYWthU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9UZXh0U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9UaW1lU2VyaWVzU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy91dGlscy9VdGlscy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmcuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy91dGlscy9zdHJldGNoaW5nLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvd2ViR0xVdGlscy5qcyIsIndlYnBhY2s6Ly9ndml6L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2d2aXovd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2d2aXovd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9ndml6L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJndml6XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImd2aXpcIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi9jcHl0aG9uL2Jsb2IvYTc0ZWVhMjM4ZjViYWJhMTU3OTdlMmU4YjU3MGQxNTNiYzg2OTBhNy9Nb2R1bGVzL21hdGhtb2R1bGUuYyNMMTQyM1xuZXhwb3J0IGNsYXNzIEFkZGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcGFydGlhbHMgPSBuZXcgRmxvYXQ2NEFycmF5KDMyKTtcbiAgICB0aGlzLl9uID0gMDtcbiAgfVxuICBhZGQoeCkge1xuICAgIGNvbnN0IHAgPSB0aGlzLl9wYXJ0aWFscztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9uICYmIGogPCAzMjsgaisrKSB7XG4gICAgICBjb25zdCB5ID0gcFtqXSxcbiAgICAgICAgaGkgPSB4ICsgeSxcbiAgICAgICAgbG8gPSBNYXRoLmFicyh4KSA8IE1hdGguYWJzKHkpID8geCAtIChoaSAtIHkpIDogeSAtIChoaSAtIHgpO1xuICAgICAgaWYgKGxvKSBwW2krK10gPSBsbztcbiAgICAgIHggPSBoaTtcbiAgICB9XG4gICAgcFtpXSA9IHg7XG4gICAgdGhpcy5fbiA9IGkgKyAxO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHZhbHVlT2YoKSB7XG4gICAgY29uc3QgcCA9IHRoaXMuX3BhcnRpYWxzO1xuICAgIGxldCBuID0gdGhpcy5fbiwgeCwgeSwgbG8sIGhpID0gMDtcbiAgICBpZiAobiA+IDApIHtcbiAgICAgIGhpID0gcFstLW5dO1xuICAgICAgd2hpbGUgKG4gPiAwKSB7XG4gICAgICAgIHggPSBoaTtcbiAgICAgICAgeSA9IHBbLS1uXTtcbiAgICAgICAgaGkgPSB4ICsgeTtcbiAgICAgICAgbG8gPSB5IC0gKGhpIC0geCk7XG4gICAgICAgIGlmIChsbykgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobiA+IDAgJiYgKChsbyA8IDAgJiYgcFtuIC0gMV0gPCAwKSB8fCAobG8gPiAwICYmIHBbbiAtIDFdID4gMCkpKSB7XG4gICAgICAgIHkgPSBsbyAqIDI7XG4gICAgICAgIHggPSBoaSArIHk7XG4gICAgICAgIGlmICh5ID09IHggLSBoaSkgaGkgPSB4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZzdW0odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGNvbnN0IGFkZGVyID0gbmV3IEFkZGVyKCk7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSA9ICt2YWx1ZSkge1xuICAgICAgICBhZGRlci5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSA9ICt2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSB7XG4gICAgICAgIGFkZGVyLmFkZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiArYWRkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmY3Vtc3VtKHZhbHVlcywgdmFsdWVvZikge1xuICBjb25zdCBhZGRlciA9IG5ldyBBZGRlcigpO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgcmV0dXJuIEZsb2F0NjRBcnJheS5mcm9tKHZhbHVlcywgdmFsdWVvZiA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHYgPT4gYWRkZXIuYWRkKCt2IHx8IDApXG4gICAgICA6IHYgPT4gYWRkZXIuYWRkKCt2YWx1ZW9mKHYsICsraW5kZXgsIHZhbHVlcykgfHwgMClcbiAgKTtcbn1cbiIsImZ1bmN0aW9uKiBmbGF0dGVuKGFycmF5cykge1xuICBmb3IgKGNvbnN0IGFycmF5IG9mIGFycmF5cykge1xuICAgIHlpZWxkKiBhcnJheTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZShhcnJheXMpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oZmxhdHRlbihhcnJheXMpKTtcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pXFxcXHMqXCIsXG4gICAgcmVQID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pJVxcXFxzKlwiLFxuICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sXG4gICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX1cXFxcKSRgKSxcbiAgICByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsYVxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCk7XG5cbnZhciBuYW1lZCA9IHtcbiAgYWxpY2VibHVlOiAweGYwZjhmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNyxcbiAgYXF1YTogMHgwMGZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LFxuICBhenVyZTogMHhmMGZmZmYsXG4gIGJlaWdlOiAweGY1ZjVkYyxcbiAgYmlzcXVlOiAweGZmZTRjNCxcbiAgYmxhY2s6IDB4MDAwMDAwLFxuICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsXG4gIGJsdWU6IDB4MDAwMGZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMixcbiAgYnJvd246IDB4YTUyYTJhLFxuICBidXJseXdvb2Q6IDB4ZGViODg3LFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwLFxuICBjaGFydHJldXNlOiAweDdmZmYwMCxcbiAgY2hvY29sYXRlOiAweGQyNjkxZSxcbiAgY29yYWw6IDB4ZmY3ZjUwLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsXG4gIGNvcm5zaWxrOiAweGZmZjhkYyxcbiAgY3JpbXNvbjogMHhkYzE0M2MsXG4gIGN5YW46IDB4MDBmZmZmLFxuICBkYXJrYmx1ZTogMHgwMDAwOGIsXG4gIGRhcmtjeWFuOiAweDAwOGI4YixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsXG4gIGRhcmtncmF5OiAweGE5YTlhOSxcbiAgZGFya2dyZWVuOiAweDAwNjQwMCxcbiAgZGFya2dyZXk6IDB4YTlhOWE5LFxuICBkYXJra2hha2k6IDB4YmRiNzZiLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGIsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZixcbiAgZGFya29yYW5nZTogMHhmZjhjMDAsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLFxuICBkYXJrcmVkOiAweDhiMDAwMCxcbiAgZGFya3NhbG1vbjogMHhlOTk2N2EsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLFxuICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLFxuICBkYXJrdmlvbGV0OiAweDk0MDBkMyxcbiAgZGVlcHBpbms6IDB4ZmYxNDkzLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsXG4gIGRpbWdyYXk6IDB4Njk2OTY5LFxuICBkaW1ncmV5OiAweDY5Njk2OSxcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsXG4gIGZpcmVicmljazogMHhiMjIyMjIsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMCxcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLFxuICBmdWNoc2lhOiAweGZmMDBmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkYyxcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsXG4gIGdvbGQ6IDB4ZmZkNzAwLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLFxuICBncmF5OiAweDgwODA4MCxcbiAgZ3JlZW46IDB4MDA4MDAwLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmYsXG4gIGdyZXk6IDB4ODA4MDgwLFxuICBob25leWRldzogMHhmMGZmZjAsXG4gIGhvdHBpbms6IDB4ZmY2OWI0LFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLFxuICBpbmRpZ286IDB4NGIwMDgyLFxuICBpdm9yeTogMHhmZmZmZjAsXG4gIGtoYWtpOiAweGYwZTY4YyxcbiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSxcbiAgbGF3bmdyZWVuOiAweDdjZmMwMCxcbiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCxcbiAgbGlnaHRibHVlOiAweGFkZDhlNixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODAsXG4gIGxpZ2h0Y3lhbjogMHhlMGZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMixcbiAgbGlnaHRncmF5OiAweGQzZDNkMyxcbiAgbGlnaHRncmVlbjogMHg5MGVlOTAsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDMsXG4gIGxpZ2h0cGluazogMHhmZmI2YzEsXG4gIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSxcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsXG4gIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSxcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsXG4gIGxpZ2h0eWVsbG93OiAweGZmZmZlMCxcbiAgbGltZTogMHgwMGZmMDAsXG4gIGxpbWVncmVlbjogMHgzMmNkMzIsXG4gIGxpbmVuOiAweGZhZjBlNixcbiAgbWFnZW50YTogMHhmZjAwZmYsXG4gIG1hcm9vbjogMHg4MDAwMDAsXG4gIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZCxcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMyxcbiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLFxuICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsXG4gIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmEsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTEsXG4gIG1vY2Nhc2luOiAweGZmZTRiNSxcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLFxuICBuYXZ5OiAweDAwMDA4MCxcbiAgb2xkbGFjZTogMHhmZGY1ZTYsXG4gIG9saXZlOiAweDgwODAwMCxcbiAgb2xpdmVkcmFiOiAweDZiOGUyMyxcbiAgb3JhbmdlOiAweGZmYTUwMCxcbiAgb3JhbmdlcmVkOiAweGZmNDUwMCxcbiAgb3JjaGlkOiAweGRhNzBkNixcbiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsXG4gIHBhbGVncmVlbjogMHg5OGZiOTgsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLFxuICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MyxcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDUsXG4gIHBlYWNocHVmZjogMHhmZmRhYjksXG4gIHBlcnU6IDB4Y2Q4NTNmLFxuICBwaW5rOiAweGZmYzBjYixcbiAgcGx1bTogMHhkZGEwZGQsXG4gIHBvd2RlcmJsdWU6IDB4YjBlMGU2LFxuICBwdXJwbGU6IDB4ODAwMDgwLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSxcbiAgcmVkOiAweGZmMDAwMCxcbiAgcm9zeWJyb3duOiAweGJjOGY4ZixcbiAgcm95YWxibHVlOiAweDQxNjllMSxcbiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLFxuICBzYWxtb246IDB4ZmE4MDcyLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MCxcbiAgc2VhZ3JlZW46IDB4MmU4YjU3LFxuICBzZWFzaGVsbDogMHhmZmY1ZWUsXG4gIHNpZW5uYTogMHhhMDUyMmQsXG4gIHNpbHZlcjogMHhjMGMwYzAsXG4gIHNreWJsdWU6IDB4ODdjZWViLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkLFxuICBzbGF0ZWdyYXk6IDB4NzA4MDkwLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwLFxuICBzbm93OiAweGZmZmFmYSxcbiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0LFxuICB0YW46IDB4ZDJiNDhjLFxuICB0ZWFsOiAweDAwODA4MCxcbiAgdGhpc3RsZTogMHhkOGJmZDgsXG4gIHRvbWF0bzogMHhmZjYzNDcsXG4gIHR1cnF1b2lzZTogMHg0MGUwZDAsXG4gIHZpb2xldDogMHhlZTgyZWUsXG4gIHdoZWF0OiAweGY1ZGViMyxcbiAgd2hpdGU6IDB4ZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSxcbiAgeWVsbG93OiAweGZmZmYwMCxcbiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyXG59O1xuXG5kZWZpbmUoQ29sb3IsIGNvbG9yLCB7XG4gIGNvcHkoY2hhbm5lbHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcywgY2hhbm5lbHMpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpO1xuICB9LFxuICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IGNvbG9yX2Zvcm1hdEhleDgsXG4gIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLFxuICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYlxufSk7XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkge1xuICByZXR1cm4gaHNsQ29udmVydCh0aGlzKS5mb3JtYXRIc2woKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiKCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7XG4gIHZhciBtLCBsO1xuICBmb3JtYXQgPSAoZm9ybWF0ICsgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwXG4gICAgICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDBcbiAgICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwXG4gICAgICA6IGwgPT09IDQgPyByZ2JhKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDBcbiAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXhcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGhleDogcmdiX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYlxufSkpO1xuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9JHtoZXgoKGlzTmFOKHRoaXMub3BhY2l0eSkgPyAxIDogdGhpcy5vcGFjaXR5KSAqIDI1NSl9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHtcbiAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICByZXR1cm4gYCR7YSA9PT0gMSA/IFwicmdiKFwiIDogXCJyZ2JhKFwifSR7Y2xhbXBpKHRoaXMucil9LCAke2NsYW1waSh0aGlzLmcpfSwgJHtjbGFtcGkodGhpcy5iKX0ke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xufVxuXG5mdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkge1xuICByZXR1cm4gaXNOYU4ob3BhY2l0eSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgb3BhY2l0eSkpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGkodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh2YWx1ZSkgfHwgMCkpO1xufVxuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBjbGFtcGkodmFsdWUpO1xuICByZXR1cm4gKHZhbHVlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgdmFsdWUudG9TdHJpbmcoMTYpO1xufVxuXG5mdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHtcbiAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOO1xuICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtcbiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOO1xuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgSHNsO1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87XG4gIG8gPSBvLnJnYigpO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGggPSBOYU4sXG4gICAgICBzID0gbWF4IC0gbWluLFxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgaWYgKHMpIHtcbiAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjtcbiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7XG4gICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0O1xuICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47XG4gICAgaCAqPSA2MDtcbiAgfSBlbHNlIHtcbiAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDtcbiAgfVxuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLnMgPSArcztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsXG4gICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyxcbiAgICAgICAgbCA9IHRoaXMubCxcbiAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcyxcbiAgICAgICAgbTEgPSAyICogbCAtIG0yO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgaHNsMnJnYihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IEhzbChjbGFtcGgodGhpcy5oKSwgY2xhbXB0KHRoaXMucyksIGNsYW1wdCh0aGlzLmwpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBmb3JtYXRIc2woKSB7XG4gICAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICAgIHJldHVybiBgJHthID09PSAxID8gXCJoc2woXCIgOiBcImhzbGEoXCJ9JHtjbGFtcGgodGhpcy5oKX0sICR7Y2xhbXB0KHRoaXMucykgKiAxMDB9JSwgJHtjbGFtcHQodGhpcy5sKSAqIDEwMH0lJHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiBjbGFtcGgodmFsdWUpIHtcbiAgdmFsdWUgPSAodmFsdWUgfHwgMCkgJSAzNjA7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyB2YWx1ZSArIDM2MCA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjbGFtcHQodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTtcbn1cblxuLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqL1xuZnVuY3Rpb24gaHNsMnJnYihoLCBtMSwgbTIpIHtcbiAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MFxuICAgICAgOiBoIDwgMTgwID8gbTJcbiAgICAgIDogaCA8IDI0MCA/IG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjBcbiAgICAgIDogbTEpICogMjU1O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7XG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07XG4gIHJldHVybiBwcm90b3R5cGU7XG59XG4iLCJ2YXIgbm9vcCA9IHt2YWx1ZTogKCkgPT4ge319O1xuXG5mdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykgfHwgL1tcXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0eXBlOiBcIiArIHQpO1xuICAgIF9bdF0gPSBbXTtcbiAgfVxuICByZXR1cm4gbmV3IERpc3BhdGNoKF8pO1xufVxuXG5mdW5jdGlvbiBEaXNwYXRjaChfKSB7XG4gIHRoaXMuXyA9IF87XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHQpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5EaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCxcbiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiLCBfKSxcbiAgICAgICAgdCxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gVC5sZW5ndGg7XG5cbiAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuXG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO1xuICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87XG4gICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7XG4gIH0sXG4gIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXQodHlwZSwgbmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXNwYXRjaDtcbiIsImltcG9ydCB7c2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgbm9ldmVudCwge25vbnBhc3NpdmVjYXB0dXJlfSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZpZXcpIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgfSBlbHNlIHtcbiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHllc2RyYWcodmlldywgbm9jbGljaykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIGlmIChub2NsaWNrKSB7XG4gICAgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBudWxsKTsgfSwgMCk7XG4gIH1cbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IHJvb3QuX19ub3NlbGVjdDtcbiAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0O1xuICB9XG59XG4iLCIvLyBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBub2V2ZW50IHRvIGVuc3VyZSB0aGF0IHdlIGNhblxuLy8gcHJldmVudERlZmF1bHQgb24gdGhlIGV2ZW50LlxuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmUgPSB7cGFzc2l2ZTogZmFsc2V9O1xuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmVjYXB0dXJlID0ge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiaW1wb3J0IGRzdiBmcm9tIFwiLi9kc3YuanNcIjtcblxudmFyIGNzdiA9IGRzdihcIixcIik7XG5cbmV4cG9ydCB2YXIgY3N2UGFyc2UgPSBjc3YucGFyc2U7XG5leHBvcnQgdmFyIGNzdlBhcnNlUm93cyA9IGNzdi5wYXJzZVJvd3M7XG5leHBvcnQgdmFyIGNzdkZvcm1hdCA9IGNzdi5mb3JtYXQ7XG5leHBvcnQgdmFyIGNzdkZvcm1hdEJvZHkgPSBjc3YuZm9ybWF0Qm9keTtcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Um93cyA9IGNzdi5mb3JtYXRSb3dzO1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRSb3cgPSBjc3YuZm9ybWF0Um93O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRWYWx1ZSA9IGNzdi5mb3JtYXRWYWx1ZTtcbiIsInZhciBFT0wgPSB7fSxcbiAgICBFT0YgPSB7fSxcbiAgICBRVU9URSA9IDM0LFxuICAgIE5FV0xJTkUgPSAxMCxcbiAgICBSRVRVUk4gPSAxMztcblxuZnVuY3Rpb24gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbihcImRcIiwgXCJyZXR1cm4ge1wiICsgY29sdW1ucy5tYXAoZnVuY3Rpb24obmFtZSwgaSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArIFwiOiBkW1wiICsgaSArIFwiXSB8fCBcXFwiXFxcIlwiO1xuICB9KS5qb2luKFwiLFwiKSArIFwifVwiKTtcbn1cblxuZnVuY3Rpb24gY3VzdG9tQ29udmVydGVyKGNvbHVtbnMsIGYpIHtcbiAgdmFyIG9iamVjdCA9IG9iamVjdENvbnZlcnRlcihjb2x1bW5zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHJvdywgaSkge1xuICAgIHJldHVybiBmKG9iamVjdChyb3cpLCBpLCBjb2x1bW5zKTtcbiAgfTtcbn1cblxuLy8gQ29tcHV0ZSB1bmlxdWUgY29sdW1ucyBpbiBvcmRlciBvZiBkaXNjb3ZlcnkuXG5mdW5jdGlvbiBpbmZlckNvbHVtbnMocm93cykge1xuICB2YXIgY29sdW1uU2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgIGNvbHVtbnMgPSBbXTtcblxuICByb3dzLmZvckVhY2goZnVuY3Rpb24ocm93KSB7XG4gICAgZm9yICh2YXIgY29sdW1uIGluIHJvdykge1xuICAgICAgaWYgKCEoY29sdW1uIGluIGNvbHVtblNldCkpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtblNldFtjb2x1bW5dID0gY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjb2x1bW5zO1xufVxuXG5mdW5jdGlvbiBwYWQodmFsdWUsIHdpZHRoKSB7XG4gIHZhciBzID0gdmFsdWUgKyBcIlwiLCBsZW5ndGggPSBzLmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbigwKSArIHMgOiBzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgPCAwID8gXCItXCIgKyBwYWQoLXllYXIsIDYpXG4gICAgOiB5ZWFyID4gOTk5OSA/IFwiK1wiICsgcGFkKHllYXIsIDYpXG4gICAgOiBwYWQoeWVhciwgNCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZSkge1xuICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCksXG4gICAgICBtaW51dGVzID0gZGF0ZS5nZXRVVENNaW51dGVzKCksXG4gICAgICBzZWNvbmRzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICByZXR1cm4gaXNOYU4oZGF0ZSkgPyBcIkludmFsaWQgRGF0ZVwiXG4gICAgICA6IGZvcm1hdFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCA0KSArIFwiLVwiICsgcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsIDIpICsgXCItXCIgKyBwYWQoZGF0ZS5nZXRVVENEYXRlKCksIDIpXG4gICAgICArIChtaWxsaXNlY29uZHMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiOlwiICsgcGFkKHNlY29uZHMsIDIpICsgXCIuXCIgKyBwYWQobWlsbGlzZWNvbmRzLCAzKSArIFwiWlwiXG4gICAgICA6IHNlY29uZHMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiOlwiICsgcGFkKHNlY29uZHMsIDIpICsgXCJaXCJcbiAgICAgIDogbWludXRlcyB8fCBob3VycyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCJaXCJcbiAgICAgIDogXCJcIik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlbGltaXRlcikge1xuICB2YXIgcmVGb3JtYXQgPSBuZXcgUmVnRXhwKFwiW1xcXCJcIiArIGRlbGltaXRlciArIFwiXFxuXFxyXVwiKSxcbiAgICAgIERFTElNSVRFUiA9IGRlbGltaXRlci5jaGFyQ29kZUF0KDApO1xuXG4gIGZ1bmN0aW9uIHBhcnNlKHRleHQsIGYpIHtcbiAgICB2YXIgY29udmVydCwgY29sdW1ucywgcm93cyA9IHBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHtcbiAgICAgIGlmIChjb252ZXJ0KSByZXR1cm4gY29udmVydChyb3csIGkgLSAxKTtcbiAgICAgIGNvbHVtbnMgPSByb3csIGNvbnZlcnQgPSBmID8gY3VzdG9tQ29udmVydGVyKHJvdywgZikgOiBvYmplY3RDb252ZXJ0ZXIocm93KTtcbiAgICB9KTtcbiAgICByb3dzLmNvbHVtbnMgPSBjb2x1bW5zIHx8IFtdO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VSb3dzKHRleHQsIGYpIHtcbiAgICB2YXIgcm93cyA9IFtdLCAvLyBvdXRwdXQgcm93c1xuICAgICAgICBOID0gdGV4dC5sZW5ndGgsXG4gICAgICAgIEkgPSAwLCAvLyBjdXJyZW50IGNoYXJhY3RlciBpbmRleFxuICAgICAgICBuID0gMCwgLy8gY3VycmVudCBsaW5lIG51bWJlclxuICAgICAgICB0LCAvLyBjdXJyZW50IHRva2VuXG4gICAgICAgIGVvZiA9IE4gPD0gMCwgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0Y/XG4gICAgICAgIGVvbCA9IGZhbHNlOyAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD9cblxuICAgIC8vIFN0cmlwIHRoZSB0cmFpbGluZyBuZXdsaW5lLlxuICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoTiAtIDEpID09PSBORVdMSU5FKSAtLU47XG4gICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IFJFVFVSTikgLS1OO1xuXG4gICAgZnVuY3Rpb24gdG9rZW4oKSB7XG4gICAgICBpZiAoZW9mKSByZXR1cm4gRU9GO1xuICAgICAgaWYgKGVvbCkgcmV0dXJuIGVvbCA9IGZhbHNlLCBFT0w7XG5cbiAgICAgIC8vIFVuZXNjYXBlIHF1b3Rlcy5cbiAgICAgIHZhciBpLCBqID0gSSwgYztcbiAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IFFVT1RFKSB7XG4gICAgICAgIHdoaWxlIChJKysgPCBOICYmIHRleHQuY2hhckNvZGVBdChJKSAhPT0gUVVPVEUgfHwgdGV4dC5jaGFyQ29kZUF0KCsrSSkgPT09IFFVT1RFKTtcbiAgICAgICAgaWYgKChpID0gSSkgPj0gTikgZW9mID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVSTikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7IH1cbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiArIDEsIGkgLSAxKS5yZXBsYWNlKC9cIlwiL2csIFwiXFxcIlwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmluZCBuZXh0IGRlbGltaXRlciBvciBuZXdsaW5lLlxuICAgICAgd2hpbGUgKEkgPCBOKSB7XG4gICAgICAgIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChpID0gSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVSTikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7IH1cbiAgICAgICAgZWxzZSBpZiAoYyAhPT0gREVMSU1JVEVSKSBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiwgaSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBsYXN0IHRva2VuIGJlZm9yZSBFT0YuXG4gICAgICByZXR1cm4gZW9mID0gdHJ1ZSwgdGV4dC5zbGljZShqLCBOKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7XG4gICAgICB2YXIgcm93ID0gW107XG4gICAgICB3aGlsZSAodCAhPT0gRU9MICYmIHQgIT09IEVPRikgcm93LnB1c2godCksIHQgPSB0b2tlbigpO1xuICAgICAgaWYgKGYgJiYgKHJvdyA9IGYocm93LCBuKyspKSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgIHJvd3MucHVzaChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKGZ1bmN0aW9uKHJvdykge1xuICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWUocm93W2NvbHVtbl0pO1xuICAgICAgfSkuam9pbihkZWxpbWl0ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0KHJvd3MsIGNvbHVtbnMpIHtcbiAgICBpZiAoY29sdW1ucyA9PSBudWxsKSBjb2x1bW5zID0gaW5mZXJDb2x1bW5zKHJvd3MpO1xuICAgIHJldHVybiBbY29sdW1ucy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKV0uY29uY2F0KHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHtcbiAgICBpZiAoY29sdW1ucyA9PSBudWxsKSBjb2x1bW5zID0gaW5mZXJDb2x1bW5zKHJvd3MpO1xuICAgIHJldHVybiBwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3dzKHJvd3MpIHtcbiAgICByZXR1cm4gcm93cy5tYXAoZm9ybWF0Um93KS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Um93KHJvdykge1xuICAgIHJldHVybiByb3cubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIlxuICAgICAgICA6IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGZvcm1hdERhdGUodmFsdWUpXG4gICAgICAgIDogcmVGb3JtYXQudGVzdCh2YWx1ZSArPSBcIlwiKSA/IFwiXFxcIlwiICsgdmFsdWUucmVwbGFjZSgvXCIvZywgXCJcXFwiXFxcIlwiKSArIFwiXFxcIlwiXG4gICAgICAgIDogdmFsdWU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBwYXJzZVJvd3M6IHBhcnNlUm93cyxcbiAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICBmb3JtYXRCb2R5OiBmb3JtYXRCb2R5LFxuICAgIGZvcm1hdFJvd3M6IGZvcm1hdFJvd3MsXG4gICAgZm9ybWF0Um93OiBmb3JtYXRSb3csXG4gICAgZm9ybWF0VmFsdWU6IGZvcm1hdFZhbHVlXG4gIH07XG59XG4iLCJpbXBvcnQgZHN2IGZyb20gXCIuL2Rzdi5qc1wiO1xuXG52YXIgdHN2ID0gZHN2KFwiXFx0XCIpO1xuXG5leHBvcnQgdmFyIHRzdlBhcnNlID0gdHN2LnBhcnNlO1xuZXhwb3J0IHZhciB0c3ZQYXJzZVJvd3MgPSB0c3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciB0c3ZGb3JtYXQgPSB0c3YuZm9ybWF0O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRCb2R5ID0gdHN2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFJvd3MgPSB0c3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Um93ID0gdHN2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0VmFsdWUgPSB0c3YuZm9ybWF0VmFsdWU7XG4iLCJleHBvcnQgZnVuY3Rpb24gY3ViaWNJbih0KSB7XG4gIHJldHVybiB0ICogdCAqIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY091dCh0KSB7XG4gIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY0luT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgKiB0IDogKHQgLT0gMikgKiB0ICogdCArIDIpIC8gMjtcbn1cbiIsImltcG9ydCB7Y3N2UGFyc2UsIGRzdkZvcm1hdCwgdHN2UGFyc2V9IGZyb20gXCJkMy1kc3ZcIjtcbmltcG9ydCB0ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcblxuZnVuY3Rpb24gZHN2UGFyc2UocGFyc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBpbml0LCByb3cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcGFyc2UocmVzcG9uc2UsIHJvdyk7XG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRzdihkZWxpbWl0ZXIsIGlucHV0LCBpbml0LCByb3cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIGluaXQgPT09IFwiZnVuY3Rpb25cIikgcm93ID0gaW5pdCwgaW5pdCA9IHVuZGVmaW5lZDtcbiAgdmFyIGZvcm1hdCA9IGRzdkZvcm1hdChkZWxpbWl0ZXIpO1xuICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgIHJldHVybiBmb3JtYXQucGFyc2UocmVzcG9uc2UsIHJvdyk7XG4gIH0pO1xufVxuXG5leHBvcnQgdmFyIGNzdiA9IGRzdlBhcnNlKGNzdlBhcnNlKTtcbmV4cG9ydCB2YXIgdHN2ID0gZHN2UGFyc2UodHN2UGFyc2UpO1xuIiwiZnVuY3Rpb24gcmVzcG9uc2VKc29uKHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDUpIHJldHVybjtcbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlSnNvbik7XG59XG4iLCJmdW5jdGlvbiByZXNwb25zZVRleHQocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArIFwiIFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZVRleHQpO1xufVxuIiwiaW1wb3J0IGZvcm1hdExvY2FsZSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcblxudmFyIGxvY2FsZTtcbmV4cG9ydCB2YXIgZm9ybWF0O1xuZXhwb3J0IHZhciBmb3JtYXRQcmVmaXg7XG5cbmRlZmF1bHRMb2NhbGUoe1xuICB0aG91c2FuZHM6IFwiLFwiLFxuICBncm91cGluZzogWzNdLFxuICBjdXJyZW5jeTogW1wiJFwiLCBcIlwiXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikge1xuICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7XG4gIGZvcm1hdCA9IGxvY2FsZS5mb3JtYXQ7XG4gIGZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7XG4gIHJldHVybiBsb2NhbGU7XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbFBhcnRzKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBNYXRoLmFicyh4ID0gTWF0aC5yb3VuZCh4KSkgPj0gMWUyMVxuICAgICAgPyB4LnRvTG9jYWxlU3RyaW5nKFwiZW5cIikucmVwbGFjZSgvLC9nLCBcIlwiKVxuICAgICAgOiB4LnRvU3RyaW5nKDEwKTtcbn1cblxuLy8gQ29tcHV0ZXMgdGhlIGRlY2ltYWwgY29lZmZpY2llbnQgYW5kIGV4cG9uZW50IG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHggd2l0aFxuLy8gc2lnbmlmaWNhbnQgZGlnaXRzIHAsIHdoZXJlIHggaXMgcG9zaXRpdmUgYW5kIHAgaXMgaW4gWzEsIDIxXSBvciB1bmRlZmluZWQuXG4vLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbFBhcnRzKDEuMjMpIHJldHVybnMgW1wiMTIzXCIsIDBdLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKSB7XG4gIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZihcImVcIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgwrFJbmZpbml0eVxuICB2YXIgaSwgY29lZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpO1xuXG4gIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxcZFxcLlxcZCtlWy0rXVxcZCtcbiAgLy8gKGUuZy4sIDEuMmUrMykgb3IgdGhlIGZvcm0gXFxkZVstK11cXGQrIChlLmcuLCAxZSszKS5cbiAgcmV0dXJuIFtcbiAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LFxuICAgICt4LnNsaWNlKGkgKyAxKVxuICBdO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZ3JvdXBpbmcsIHRob3VzYW5kcykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsXG4gICAgICAgIHQgPSBbXSxcbiAgICAgICAgaiA9IDAsXG4gICAgICAgIGcgPSBncm91cGluZ1swXSxcbiAgICAgICAgbGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7XG4gICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTtcbiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgIGcgPSBncm91cGluZ1tqID0gKGogKyAxKSAlIGdyb3VwaW5nLmxlbmd0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG51bWVyYWxzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bMC05XS9nLCBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gbnVtZXJhbHNbK2ldO1xuICAgIH0pO1xuICB9O1xufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IHZhciBwcmVmaXhFeHBvbmVudDtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV0sXG4gICAgICBpID0gZXhwb25lbnQgLSAocHJlZml4RXhwb25lbnQgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCAvIDMpKSkgKiAzKSArIDEsXG4gICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoO1xuICByZXR1cm4gaSA9PT0gbiA/IGNvZWZmaWNpZW50XG4gICAgICA6IGkgPiBuID8gY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoaSAtIG4gKyAxKS5qb2luKFwiMFwiKVxuICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShpKVxuICAgICAgOiBcIjAuXCIgKyBuZXcgQXJyYXkoMSAtIGkpLmpvaW4oXCIwXCIpICsgZm9ybWF0RGVjaW1hbFBhcnRzKHgsIE1hdGgubWF4KDAsIHAgKyBpIC0gMSkpWzBdOyAvLyBsZXNzIHRoYW4gMXkhXG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXTtcbiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/IFwiMC5cIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oXCIwXCIpICsgY29lZmZpY2llbnRcbiAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoZXhwb25lbnQgKyAxKVxuICAgICAgOiBjb2VmZmljaWVudCArIG5ldyBBcnJheShleHBvbmVudCAtIGNvZWZmaWNpZW50Lmxlbmd0aCArIDIpLmpvaW4oXCIwXCIpO1xufVxuIiwiLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXVxudmFyIHJlID0gL14oPzooLik/KFs8Pj1eXSkpPyhbK1xcLSggXSk/KFskI10pPygwKT8oXFxkKyk/KCwpPyhcXC5cXGQrKT8ofik/KFthLXolXSk/JC9pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmb3JtYXQ6IFwiICsgc3BlY2lmaWVyKTtcbiAgdmFyIG1hdGNoO1xuICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcih7XG4gICAgZmlsbDogbWF0Y2hbMV0sXG4gICAgYWxpZ246IG1hdGNoWzJdLFxuICAgIHNpZ246IG1hdGNoWzNdLFxuICAgIHN5bWJvbDogbWF0Y2hbNF0sXG4gICAgemVybzogbWF0Y2hbNV0sXG4gICAgd2lkdGg6IG1hdGNoWzZdLFxuICAgIGNvbW1hOiBtYXRjaFs3XSxcbiAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLFxuICAgIHRyaW06IG1hdGNoWzldLFxuICAgIHR5cGU6IG1hdGNoWzEwXVxuICB9KTtcbn1cblxuZm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZSA9IEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2ZcblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/IFwiIFwiIDogc3BlY2lmaWVyLmZpbGwgKyBcIlwiO1xuICB0aGlzLmFsaWduID0gc3BlY2lmaWVyLmFsaWduID09PSB1bmRlZmluZWQgPyBcIj5cIiA6IHNwZWNpZmllci5hbGlnbiArIFwiXCI7XG4gIHRoaXMuc2lnbiA9IHNwZWNpZmllci5zaWduID09PSB1bmRlZmluZWQgPyBcIi1cIiA6IHNwZWNpZmllci5zaWduICsgXCJcIjtcbiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnN5bWJvbCArIFwiXCI7XG4gIHRoaXMuemVybyA9ICEhc3BlY2lmaWVyLnplcm87XG4gIHRoaXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIud2lkdGg7XG4gIHRoaXMuY29tbWEgPSAhIXNwZWNpZmllci5jb21tYTtcbiAgdGhpcy5wcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLnByZWNpc2lvbjtcbiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTtcbiAgdGhpcy50eXBlID0gc3BlY2lmaWVyLnR5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIudHlwZSArIFwiXCI7XG59XG5cbkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZmlsbFxuICAgICAgKyB0aGlzLmFsaWduXG4gICAgICArIHRoaXMuc2lnblxuICAgICAgKyB0aGlzLnN5bWJvbFxuICAgICAgKyAodGhpcy56ZXJvID8gXCIwXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSlcbiAgICAgICsgKHRoaXMuY29tbWEgPyBcIixcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFwiLlwiICsgTWF0aC5tYXgoMCwgdGhpcy5wcmVjaXNpb24gfCAwKSlcbiAgICAgICsgKHRoaXMudHJpbSA/IFwiflwiIDogXCJcIilcbiAgICAgICsgdGhpcy50eXBlO1xufTtcbiIsIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcbmltcG9ydCBmb3JtYXRQcmVmaXhBdXRvIGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBmb3JtYXRSb3VuZGVkIGZyb20gXCIuL2Zvcm1hdFJvdW5kZWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBcIiVcIjogKHgsIHApID0+ICh4ICogMTAwKS50b0ZpeGVkKHApLFxuICBcImJcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMiksXG4gIFwiY1wiOiAoeCkgPT4geCArIFwiXCIsXG4gIFwiZFwiOiBmb3JtYXREZWNpbWFsLFxuICBcImVcIjogKHgsIHApID0+IHgudG9FeHBvbmVudGlhbChwKSxcbiAgXCJmXCI6ICh4LCBwKSA9PiB4LnRvRml4ZWQocCksXG4gIFwiZ1wiOiAoeCwgcCkgPT4geC50b1ByZWNpc2lvbihwKSxcbiAgXCJvXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpLFxuICBcInBcIjogKHgsIHApID0+IGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCksXG4gIFwiclwiOiBmb3JtYXRSb3VuZGVkLFxuICBcInNcIjogZm9ybWF0UHJlZml4QXV0byxcbiAgXCJYXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLFxuICBcInhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuaW1wb3J0IGZvcm1hdEdyb3VwIGZyb20gXCIuL2Zvcm1hdEdyb3VwLmpzXCI7XG5pbXBvcnQgZm9ybWF0TnVtZXJhbHMgZnJvbSBcIi4vZm9ybWF0TnVtZXJhbHMuanNcIjtcbmltcG9ydCBmb3JtYXRTcGVjaWZpZXIgZnJvbSBcIi4vZm9ybWF0U3BlY2lmaWVyLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHJpbSBmcm9tIFwiLi9mb3JtYXRUcmltLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHlwZXMgZnJvbSBcIi4vZm9ybWF0VHlwZXMuanNcIjtcbmltcG9ydCB7cHJlZml4RXhwb25lbnR9IGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuXG52YXIgbWFwID0gQXJyYXkucHJvdG90eXBlLm1hcCxcbiAgICBwcmVmaXhlcyA9IFtcInlcIixcInpcIixcImFcIixcImZcIixcInBcIixcIm5cIixcIsK1XCIsXCJtXCIsXCJcIixcImtcIixcIk1cIixcIkdcIixcIlRcIixcIlBcIixcIkVcIixcIlpcIixcIllcIl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxvY2FsZSkge1xuICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdEdyb3VwKG1hcC5jYWxsKGxvY2FsZS5ncm91cGluZywgTnVtYmVyKSwgbG9jYWxlLnRob3VzYW5kcyArIFwiXCIpLFxuICAgICAgY3VycmVuY3lQcmVmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMF0gKyBcIlwiLFxuICAgICAgY3VycmVuY3lTdWZmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyBcIlwiLFxuICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyBcIi5cIiA6IGxvY2FsZS5kZWNpbWFsICsgXCJcIixcbiAgICAgIG51bWVyYWxzID0gbG9jYWxlLm51bWVyYWxzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdE51bWVyYWxzKG1hcC5jYWxsKGxvY2FsZS5udW1lcmFscywgU3RyaW5nKSksXG4gICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgPT09IHVuZGVmaW5lZCA/IFwiJVwiIDogbG9jYWxlLnBlcmNlbnQgKyBcIlwiLFxuICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/IFwi4oiSXCIgOiBsb2NhbGUubWludXMgKyBcIlwiLFxuICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gXCJOYU5cIiA6IGxvY2FsZS5uYW4gKyBcIlwiO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTtcblxuICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsXG4gICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sXG4gICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsXG4gICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsXG4gICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLFxuICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sXG4gICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgIC8vIFRoZSBcIm5cIiB0eXBlIGlzIGFuIGFsaWFzIGZvciBcIixnXCIuXG4gICAgaWYgKHR5cGUgPT09IFwiblwiKSBjb21tYSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIFRoZSBcIlwiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgXCIuMTJ+Z1wiLlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLlxuICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSBcIjBcIiAmJiBhbGlnbiA9PT0gXCI9XCIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9IFwiMFwiLCBhbGlnbiA9IFwiPVwiO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuXG4gICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gXCIjXCIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIixcbiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogXCJcIjtcblxuICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/XG4gICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj9cbiAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO1xuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBub3Qgc3BlY2lmaWVkLFxuICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLlxuICAgIC8vIEZvciBmaXhlZCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzAsIDIwXS5cbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IDZcbiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpXG4gICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7XG4gICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsXG4gICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgaSwgbiwgYztcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY1wiKSB7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLlxuICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pO1xuXG4gICAgICAgIC8vIFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy5cbiAgICAgICAgaWYgKHRyaW0pIHZhbHVlID0gZm9ybWF0VHJpbSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uXG4gICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSBcIitcIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09IFwiKFwiID8gc2lnbiA6IG1pbnVzKSA6IHNpZ24gPT09IFwiLVwiIHx8IHNpZ24gPT09IFwiKFwiID8gXCJcIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gKHR5cGUgPT09IFwic1wiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiBcIlwiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIOKAnHN1ZmZpeOKAnSBwYXJ0IHRoYXQgaXMgbm90LlxuICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBub3QgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy5cbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gXCJcIjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgIGNhc2UgXCI8XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCI9XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJeXCI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyICsgXCJcIjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7XG4gICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzLFxuICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSxcbiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXhcbiAgfTtcbn1cbiIsImltcG9ydCB7YXNpbiwgYXRhbjIsIGNvcywgc2luLCBzcXJ0fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGhlcmljYWwoY2FydGVzaWFuKSB7XG4gIHJldHVybiBbYXRhbjIoY2FydGVzaWFuWzFdLCBjYXJ0ZXNpYW5bMF0pLCBhc2luKGNhcnRlc2lhblsyXSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuKHNwaGVyaWNhbCkge1xuICB2YXIgbGFtYmRhID0gc3BoZXJpY2FsWzBdLCBwaGkgPSBzcGhlcmljYWxbMV0sIGNvc1BoaSA9IGNvcyhwaGkpO1xuICByZXR1cm4gW2Nvc1BoaSAqIGNvcyhsYW1iZGEpLCBjb3NQaGkgKiBzaW4obGFtYmRhKSwgc2luKHBoaSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuRG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhbkNyb3NzKGEsIGIpIHtcbiAgcmV0dXJuIFthWzFdICogYlsyXSAtIGFbMl0gKiBiWzFdLCBhWzJdICogYlswXSAtIGFbMF0gKiBiWzJdLCBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdXTtcbn1cblxuLy8gVE9ETyByZXR1cm4gYVxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhbkFkZEluUGxhY2UoYSwgYikge1xuICBhWzBdICs9IGJbMF0sIGFbMV0gKz0gYlsxXSwgYVsyXSArPSBiWzJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuU2NhbGUodmVjdG9yLCBrKSB7XG4gIHJldHVybiBbdmVjdG9yWzBdICogaywgdmVjdG9yWzFdICogaywgdmVjdG9yWzJdICoga107XG59XG5cbi8vIFRPRE8gcmV0dXJuIGRcbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGQpIHtcbiAgdmFyIGwgPSBzcXJ0KGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV0gKyBkWzJdICogZFsyXSk7XG4gIGRbMF0gLz0gbCwgZFsxXSAvPSBsLCBkWzJdIC89IGw7XG59XG4iLCJpbXBvcnQge2NhcnRlc2lhbiwgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZSwgc3BoZXJpY2FsfSBmcm9tIFwiLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IHthY29zLCBjb3MsIGRlZ3JlZXMsIGVwc2lsb24sIHJhZGlhbnMsIHNpbiwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5pbXBvcnQge3JvdGF0ZVJhZGlhbnN9IGZyb20gXCIuL3JvdGF0aW9uLmpzXCI7XG5cbi8vIEdlbmVyYXRlcyBhIGNpcmNsZSBjZW50ZXJlZCBhdCBbMMKwLCAwwrBdLCB3aXRoIGEgZ2l2ZW4gcmFkaXVzIGFuZCBwcmVjaXNpb24uXG5leHBvcnQgZnVuY3Rpb24gY2lyY2xlU3RyZWFtKHN0cmVhbSwgcmFkaXVzLCBkZWx0YSwgZGlyZWN0aW9uLCB0MCwgdDEpIHtcbiAgaWYgKCFkZWx0YSkgcmV0dXJuO1xuICB2YXIgY29zUmFkaXVzID0gY29zKHJhZGl1cyksXG4gICAgICBzaW5SYWRpdXMgPSBzaW4ocmFkaXVzKSxcbiAgICAgIHN0ZXAgPSBkaXJlY3Rpb24gKiBkZWx0YTtcbiAgaWYgKHQwID09IG51bGwpIHtcbiAgICB0MCA9IHJhZGl1cyArIGRpcmVjdGlvbiAqIHRhdTtcbiAgICB0MSA9IHJhZGl1cyAtIHN0ZXAgLyAyO1xuICB9IGVsc2Uge1xuICAgIHQwID0gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgdDApO1xuICAgIHQxID0gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgdDEpO1xuICAgIGlmIChkaXJlY3Rpb24gPiAwID8gdDAgPCB0MSA6IHQwID4gdDEpIHQwICs9IGRpcmVjdGlvbiAqIHRhdTtcbiAgfVxuICBmb3IgKHZhciBwb2ludCwgdCA9IHQwOyBkaXJlY3Rpb24gPiAwID8gdCA+IHQxIDogdCA8IHQxOyB0IC09IHN0ZXApIHtcbiAgICBwb2ludCA9IHNwaGVyaWNhbChbY29zUmFkaXVzLCAtc2luUmFkaXVzICogY29zKHQpLCAtc2luUmFkaXVzICogc2luKHQpXSk7XG4gICAgc3RyZWFtLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7XG4gIH1cbn1cblxuLy8gUmV0dXJucyB0aGUgc2lnbmVkIGFuZ2xlIG9mIGEgY2FydGVzaWFuIHBvaW50IHJlbGF0aXZlIHRvIFtjb3NSYWRpdXMsIDAsIDBdLlxuZnVuY3Rpb24gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgcG9pbnQpIHtcbiAgcG9pbnQgPSBjYXJ0ZXNpYW4ocG9pbnQpLCBwb2ludFswXSAtPSBjb3NSYWRpdXM7XG4gIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UocG9pbnQpO1xuICB2YXIgcmFkaXVzID0gYWNvcygtcG9pbnRbMV0pO1xuICByZXR1cm4gKCgtcG9pbnRbMl0gPCAwID8gLXJhZGl1cyA6IHJhZGl1cykgKyB0YXUgLSBlcHNpbG9uKSAlIHRhdTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjZW50ZXIgPSBjb25zdGFudChbMCwgMF0pLFxuICAgICAgcmFkaXVzID0gY29uc3RhbnQoOTApLFxuICAgICAgcHJlY2lzaW9uID0gY29uc3RhbnQoNiksXG4gICAgICByaW5nLFxuICAgICAgcm90YXRlLFxuICAgICAgc3RyZWFtID0ge3BvaW50OiBwb2ludH07XG5cbiAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgIHJpbmcucHVzaCh4ID0gcm90YXRlKHgsIHkpKTtcbiAgICB4WzBdICo9IGRlZ3JlZXMsIHhbMV0gKj0gZGVncmVlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNpcmNsZSgpIHtcbiAgICB2YXIgYyA9IGNlbnRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICByID0gcmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zLFxuICAgICAgICBwID0gcHJlY2lzaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zO1xuICAgIHJpbmcgPSBbXTtcbiAgICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKC1jWzBdICogcmFkaWFucywgLWNbMV0gKiByYWRpYW5zLCAwKS5pbnZlcnQ7XG4gICAgY2lyY2xlU3RyZWFtKHN0cmVhbSwgciwgcCwgMSk7XG4gICAgYyA9IHt0eXBlOiBcIlBvbHlnb25cIiwgY29vcmRpbmF0ZXM6IFtyaW5nXX07XG4gICAgcmluZyA9IHJvdGF0ZSA9IG51bGw7XG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICBjaXJjbGUuY2VudGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNlbnRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoWytfWzBdLCArX1sxXV0pLCBjaXJjbGUpIDogY2VudGVyO1xuICB9O1xuXG4gIGNpcmNsZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGNpcmNsZSkgOiByYWRpdXM7XG4gIH07XG5cbiAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcmVjaXNpb24gPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgY2lyY2xlKSA6IHByZWNpc2lvbjtcbiAgfTtcblxuICByZXR1cm4gY2lyY2xlO1xufVxuIiwiaW1wb3J0IGNsaXAgZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7YWJzLCBhdGFuLCBjb3MsIGVwc2lsb24sIGhhbGZQaSwgcGksIHNpbn0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xpcChcbiAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9LFxuICBjbGlwQW50aW1lcmlkaWFuTGluZSxcbiAgY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlLFxuICBbLXBpLCAtaGFsZlBpXVxuKTtcblxuLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRzIGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlczogMCAtIHRoZXJlIHdlcmVcbi8vIGludGVyc2VjdGlvbnMgb3IgdGhlIGxpbmUgd2FzIGVtcHR5OyAxIC0gbm8gaW50ZXJzZWN0aW9uczsgMiAtIHRoZXJlIHdlcmVcbi8vIGludGVyc2VjdGlvbnMsIGFuZCB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMgc2hvdWxkIGJlIHJlam9pbmVkLlxuZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkxpbmUoc3RyZWFtKSB7XG4gIHZhciBsYW1iZGEwID0gTmFOLFxuICAgICAgcGhpMCA9IE5hTixcbiAgICAgIHNpZ24wID0gTmFOLFxuICAgICAgY2xlYW47IC8vIG5vIGludGVyc2VjdGlvbnNcblxuICByZXR1cm4ge1xuICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICBjbGVhbiA9IDE7XG4gICAgfSxcbiAgICBwb2ludDogZnVuY3Rpb24obGFtYmRhMSwgcGhpMSkge1xuICAgICAgdmFyIHNpZ24xID0gbGFtYmRhMSA+IDAgPyBwaSA6IC1waSxcbiAgICAgICAgICBkZWx0YSA9IGFicyhsYW1iZGExIC0gbGFtYmRhMCk7XG4gICAgICBpZiAoYWJzKGRlbHRhIC0gcGkpIDwgZXBzaWxvbikgeyAvLyBsaW5lIGNyb3NzZXMgYSBwb2xlXG4gICAgICAgIHN0cmVhbS5wb2ludChsYW1iZGEwLCBwaGkwID0gKHBoaTAgKyBwaGkxKSAvIDIgPiAwID8gaGFsZlBpIDogLWhhbGZQaSk7XG4gICAgICAgIHN0cmVhbS5wb2ludChzaWduMCwgcGhpMCk7XG4gICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24xLCBwaGkwKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTEsIHBoaTApO1xuICAgICAgICBjbGVhbiA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHNpZ24wICE9PSBzaWduMSAmJiBkZWx0YSA+PSBwaSkgeyAvLyBsaW5lIGNyb3NzZXMgYW50aW1lcmlkaWFuXG4gICAgICAgIGlmIChhYnMobGFtYmRhMCAtIHNpZ24wKSA8IGVwc2lsb24pIGxhbWJkYTAgLT0gc2lnbjAgKiBlcHNpbG9uOyAvLyBoYW5kbGUgZGVnZW5lcmFjaWVzXG4gICAgICAgIGlmIChhYnMobGFtYmRhMSAtIHNpZ24xKSA8IGVwc2lsb24pIGxhbWJkYTEgLT0gc2lnbjEgKiBlcHNpbG9uO1xuICAgICAgICBwaGkwID0gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdChsYW1iZGEwLCBwaGkwLCBsYW1iZGExLCBwaGkxKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjEsIHBoaTApO1xuICAgICAgICBjbGVhbiA9IDA7XG4gICAgICB9XG4gICAgICBzdHJlYW0ucG9pbnQobGFtYmRhMCA9IGxhbWJkYTEsIHBoaTAgPSBwaGkxKTtcbiAgICAgIHNpZ24wID0gc2lnbjE7XG4gICAgfSxcbiAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICBsYW1iZGEwID0gcGhpMCA9IE5hTjtcbiAgICB9LFxuICAgIGNsZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAyIC0gY2xlYW47IC8vIGlmIGludGVyc2VjdGlvbnMsIHJlam9pbiBmaXJzdCBhbmQgbGFzdCBzZWdtZW50c1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdChsYW1iZGEwLCBwaGkwLCBsYW1iZGExLCBwaGkxKSB7XG4gIHZhciBjb3NQaGkwLFxuICAgICAgY29zUGhpMSxcbiAgICAgIHNpbkxhbWJkYTBMYW1iZGExID0gc2luKGxhbWJkYTAgLSBsYW1iZGExKTtcbiAgcmV0dXJuIGFicyhzaW5MYW1iZGEwTGFtYmRhMSkgPiBlcHNpbG9uXG4gICAgICA/IGF0YW4oKHNpbihwaGkwKSAqIChjb3NQaGkxID0gY29zKHBoaTEpKSAqIHNpbihsYW1iZGExKVxuICAgICAgICAgIC0gc2luKHBoaTEpICogKGNvc1BoaTAgPSBjb3MocGhpMCkpICogc2luKGxhbWJkYTApKVxuICAgICAgICAgIC8gKGNvc1BoaTAgKiBjb3NQaGkxICogc2luTGFtYmRhMExhbWJkYTEpKVxuICAgICAgOiAocGhpMCArIHBoaTEpIC8gMjtcbn1cblxuZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0cmVhbSkge1xuICB2YXIgcGhpO1xuICBpZiAoZnJvbSA9PSBudWxsKSB7XG4gICAgcGhpID0gZGlyZWN0aW9uICogaGFsZlBpO1xuICAgIHN0cmVhbS5wb2ludCgtcGksIHBoaSk7XG4gICAgc3RyZWFtLnBvaW50KDAsIHBoaSk7XG4gICAgc3RyZWFtLnBvaW50KHBpLCBwaGkpO1xuICAgIHN0cmVhbS5wb2ludChwaSwgMCk7XG4gICAgc3RyZWFtLnBvaW50KHBpLCAtcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoMCwgLXBoaSk7XG4gICAgc3RyZWFtLnBvaW50KC1waSwgLXBoaSk7XG4gICAgc3RyZWFtLnBvaW50KC1waSwgMCk7XG4gICAgc3RyZWFtLnBvaW50KC1waSwgcGhpKTtcbiAgfSBlbHNlIGlmIChhYnMoZnJvbVswXSAtIHRvWzBdKSA+IGVwc2lsb24pIHtcbiAgICB2YXIgbGFtYmRhID0gZnJvbVswXSA8IHRvWzBdID8gcGkgOiAtcGk7XG4gICAgcGhpID0gZGlyZWN0aW9uICogbGFtYmRhIC8gMjtcbiAgICBzdHJlYW0ucG9pbnQoLWxhbWJkYSwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoMCwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQobGFtYmRhLCBwaGkpO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbS5wb2ludCh0b1swXSwgdG9bMV0pO1xuICB9XG59XG4iLCJpbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGxpbmVzID0gW10sXG4gICAgICBsaW5lO1xuICByZXR1cm4ge1xuICAgIHBvaW50OiBmdW5jdGlvbih4LCB5LCBtKSB7XG4gICAgICBsaW5lLnB1c2goW3gsIHksIG1dKTtcbiAgICB9LFxuICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBsaW5lcy5wdXNoKGxpbmUgPSBbXSk7XG4gICAgfSxcbiAgICBsaW5lRW5kOiBub29wLFxuICAgIHJlam9pbjogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgbGluZXMucHVzaChsaW5lcy5wb3AoKS5jb25jYXQobGluZXMuc2hpZnQoKSkpO1xuICAgIH0sXG4gICAgcmVzdWx0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsaW5lcztcbiAgICAgIGxpbmVzID0gW107XG4gICAgICBsaW5lID0gbnVsbDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHtjYXJ0ZXNpYW4sIGNhcnRlc2lhbkFkZEluUGxhY2UsIGNhcnRlc2lhbkNyb3NzLCBjYXJ0ZXNpYW5Eb3QsIGNhcnRlc2lhblNjYWxlLCBzcGhlcmljYWx9IGZyb20gXCIuLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCB7Y2lyY2xlU3RyZWFtfSBmcm9tIFwiLi4vY2lyY2xlLmpzXCI7XG5pbXBvcnQge2FicywgY29zLCBlcHNpbG9uLCBwaSwgcmFkaWFucywgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCBwb2ludEVxdWFsIGZyb20gXCIuLi9wb2ludEVxdWFsLmpzXCI7XG5pbXBvcnQgY2xpcCBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyYWRpdXMpIHtcbiAgdmFyIGNyID0gY29zKHJhZGl1cyksXG4gICAgICBkZWx0YSA9IDYgKiByYWRpYW5zLFxuICAgICAgc21hbGxSYWRpdXMgPSBjciA+IDAsXG4gICAgICBub3RIZW1pc3BoZXJlID0gYWJzKGNyKSA+IGVwc2lsb247IC8vIFRPRE8gb3B0aW1pc2UgZm9yIHRoaXMgY29tbW9uIGNhc2VcblxuICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHtcbiAgICBjaXJjbGVTdHJlYW0oc3RyZWFtLCByYWRpdXMsIGRlbHRhLCBkaXJlY3Rpb24sIGZyb20sIHRvKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZpc2libGUobGFtYmRhLCBwaGkpIHtcbiAgICByZXR1cm4gY29zKGxhbWJkYSkgKiBjb3MocGhpKSA+IGNyO1xuICB9XG5cbiAgLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRzIGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlcyB1c2VkIGZvciBwb2x5Z29uXG4gIC8vIGNsaXBwaW5nOiAwIC0gdGhlcmUgd2VyZSBpbnRlcnNlY3Rpb25zIG9yIHRoZSBsaW5lIHdhcyBlbXB0eTsgMSAtIG5vXG4gIC8vIGludGVyc2VjdGlvbnMgMiAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucywgYW5kIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50c1xuICAvLyBzaG91bGQgYmUgcmVqb2luZWQuXG4gIGZ1bmN0aW9uIGNsaXBMaW5lKHN0cmVhbSkge1xuICAgIHZhciBwb2ludDAsIC8vIHByZXZpb3VzIHBvaW50XG4gICAgICAgIGMwLCAvLyBjb2RlIGZvciBwcmV2aW91cyBwb2ludFxuICAgICAgICB2MCwgLy8gdmlzaWJpbGl0eSBvZiBwcmV2aW91cyBwb2ludFxuICAgICAgICB2MDAsIC8vIHZpc2liaWxpdHkgb2YgZmlyc3QgcG9pbnRcbiAgICAgICAgY2xlYW47IC8vIG5vIGludGVyc2VjdGlvbnNcbiAgICByZXR1cm4ge1xuICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdjAwID0gdjAgPSBmYWxzZTtcbiAgICAgICAgY2xlYW4gPSAxO1xuICAgICAgfSxcbiAgICAgIHBvaW50OiBmdW5jdGlvbihsYW1iZGEsIHBoaSkge1xuICAgICAgICB2YXIgcG9pbnQxID0gW2xhbWJkYSwgcGhpXSxcbiAgICAgICAgICAgIHBvaW50MixcbiAgICAgICAgICAgIHYgPSB2aXNpYmxlKGxhbWJkYSwgcGhpKSxcbiAgICAgICAgICAgIGMgPSBzbWFsbFJhZGl1c1xuICAgICAgICAgICAgICA/IHYgPyAwIDogY29kZShsYW1iZGEsIHBoaSlcbiAgICAgICAgICAgICAgOiB2ID8gY29kZShsYW1iZGEgKyAobGFtYmRhIDwgMCA/IHBpIDogLXBpKSwgcGhpKSA6IDA7XG4gICAgICAgIGlmICghcG9pbnQwICYmICh2MDAgPSB2MCA9IHYpKSBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgIGlmICh2ICE9PSB2MCkge1xuICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7XG4gICAgICAgICAgaWYgKCFwb2ludDIgfHwgcG9pbnRFcXVhbChwb2ludDAsIHBvaW50MikgfHwgcG9pbnRFcXVhbChwb2ludDEsIHBvaW50MikpXG4gICAgICAgICAgICBwb2ludDFbMl0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2ICE9PSB2MCkge1xuICAgICAgICAgIGNsZWFuID0gMDtcbiAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgLy8gb3V0c2lkZSBnb2luZyBpblxuICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MSwgcG9pbnQwKTtcbiAgICAgICAgICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50MlsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluc2lkZSBnb2luZyBvdXRcbiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7XG4gICAgICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0sIDIpO1xuICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9pbnQwID0gcG9pbnQyO1xuICAgICAgICB9IGVsc2UgaWYgKG5vdEhlbWlzcGhlcmUgJiYgcG9pbnQwICYmIHNtYWxsUmFkaXVzIF4gdikge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIC8vIElmIHRoZSBjb2RlcyBmb3IgdHdvIHBvaW50cyBhcmUgZGlmZmVyZW50LCBvciBhcmUgYm90aCB6ZXJvLFxuICAgICAgICAgIC8vIGFuZCB0aGVyZSB0aGlzIHNlZ21lbnQgaW50ZXJzZWN0cyB3aXRoIHRoZSBzbWFsbCBjaXJjbGUuXG4gICAgICAgICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkpKSB7XG4gICAgICAgICAgICBjbGVhbiA9IDA7XG4gICAgICAgICAgICBpZiAoc21hbGxSYWRpdXMpIHtcbiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFswXVswXSwgdFswXVsxXSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTtcbiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTtcbiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFswXVswXSwgdFswXVsxXSwgMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2ICYmICghcG9pbnQwIHx8ICFwb2ludEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHtcbiAgICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnQxWzBdLCBwb2ludDFbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHBvaW50MCA9IHBvaW50MSwgdjAgPSB2LCBjMCA9IGM7XG4gICAgICB9LFxuICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh2MCkgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgcG9pbnQwID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAvLyBSZWpvaW4gZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMgaWYgdGhlcmUgd2VyZSBpbnRlcnNlY3Rpb25zIGFuZCB0aGUgZmlyc3RcbiAgICAgIC8vIGFuZCBsYXN0IHBvaW50cyB3ZXJlIHZpc2libGUuXG4gICAgICBjbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBjbGVhbiB8ICgodjAwICYmIHYwKSA8PCAxKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gSW50ZXJzZWN0cyB0aGUgZ3JlYXQgY2lyY2xlIGJldHdlZW4gYSBhbmQgYiB3aXRoIHRoZSBjbGlwIGNpcmNsZS5cbiAgZnVuY3Rpb24gaW50ZXJzZWN0KGEsIGIsIHR3bykge1xuICAgIHZhciBwYSA9IGNhcnRlc2lhbihhKSxcbiAgICAgICAgcGIgPSBjYXJ0ZXNpYW4oYik7XG5cbiAgICAvLyBXZSBoYXZlIHR3byBwbGFuZXMsIG4xLnAgPSBkMSBhbmQgbjIucCA9IGQyLlxuICAgIC8vIEZpbmQgaW50ZXJzZWN0aW9uIGxpbmUgcCh0KSA9IGMxIG4xICsgYzIgbjIgKyB0IChuMSDiqK8gbjIpLlxuICAgIHZhciBuMSA9IFsxLCAwLCAwXSwgLy8gbm9ybWFsXG4gICAgICAgIG4yID0gY2FydGVzaWFuQ3Jvc3MocGEsIHBiKSxcbiAgICAgICAgbjJuMiA9IGNhcnRlc2lhbkRvdChuMiwgbjIpLFxuICAgICAgICBuMW4yID0gbjJbMF0sIC8vIGNhcnRlc2lhbkRvdChuMSwgbjIpLFxuICAgICAgICBkZXRlcm1pbmFudCA9IG4ybjIgLSBuMW4yICogbjFuMjtcblxuICAgIC8vIFR3byBwb2xhciBwb2ludHMuXG4gICAgaWYgKCFkZXRlcm1pbmFudCkgcmV0dXJuICF0d28gJiYgYTtcblxuICAgIHZhciBjMSA9ICBjciAqIG4ybjIgLyBkZXRlcm1pbmFudCxcbiAgICAgICAgYzIgPSAtY3IgKiBuMW4yIC8gZGV0ZXJtaW5hbnQsXG4gICAgICAgIG4xeG4yID0gY2FydGVzaWFuQ3Jvc3MobjEsIG4yKSxcbiAgICAgICAgQSA9IGNhcnRlc2lhblNjYWxlKG4xLCBjMSksXG4gICAgICAgIEIgPSBjYXJ0ZXNpYW5TY2FsZShuMiwgYzIpO1xuICAgIGNhcnRlc2lhbkFkZEluUGxhY2UoQSwgQik7XG5cbiAgICAvLyBTb2x2ZSB8cCh0KXxeMiA9IDEuXG4gICAgdmFyIHUgPSBuMXhuMixcbiAgICAgICAgdyA9IGNhcnRlc2lhbkRvdChBLCB1KSxcbiAgICAgICAgdXUgPSBjYXJ0ZXNpYW5Eb3QodSwgdSksXG4gICAgICAgIHQyID0gdyAqIHcgLSB1dSAqIChjYXJ0ZXNpYW5Eb3QoQSwgQSkgLSAxKTtcblxuICAgIGlmICh0MiA8IDApIHJldHVybjtcblxuICAgIHZhciB0ID0gc3FydCh0MiksXG4gICAgICAgIHEgPSBjYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgLSB0KSAvIHV1KTtcbiAgICBjYXJ0ZXNpYW5BZGRJblBsYWNlKHEsIEEpO1xuICAgIHEgPSBzcGhlcmljYWwocSk7XG5cbiAgICBpZiAoIXR3bykgcmV0dXJuIHE7XG5cbiAgICAvLyBUd28gaW50ZXJzZWN0aW9uIHBvaW50cy5cbiAgICB2YXIgbGFtYmRhMCA9IGFbMF0sXG4gICAgICAgIGxhbWJkYTEgPSBiWzBdLFxuICAgICAgICBwaGkwID0gYVsxXSxcbiAgICAgICAgcGhpMSA9IGJbMV0sXG4gICAgICAgIHo7XG5cbiAgICBpZiAobGFtYmRhMSA8IGxhbWJkYTApIHogPSBsYW1iZGEwLCBsYW1iZGEwID0gbGFtYmRhMSwgbGFtYmRhMSA9IHo7XG5cbiAgICB2YXIgZGVsdGEgPSBsYW1iZGExIC0gbGFtYmRhMCxcbiAgICAgICAgcG9sYXIgPSBhYnMoZGVsdGEgLSBwaSkgPCBlcHNpbG9uLFxuICAgICAgICBtZXJpZGlhbiA9IHBvbGFyIHx8IGRlbHRhIDwgZXBzaWxvbjtcblxuICAgIGlmICghcG9sYXIgJiYgcGhpMSA8IHBoaTApIHogPSBwaGkwLCBwaGkwID0gcGhpMSwgcGhpMSA9IHo7XG5cbiAgICAvLyBDaGVjayB0aGF0IHRoZSBmaXJzdCBwb2ludCBpcyBiZXR3ZWVuIGEgYW5kIGIuXG4gICAgaWYgKG1lcmlkaWFuXG4gICAgICAgID8gcG9sYXJcbiAgICAgICAgICA/IHBoaTAgKyBwaGkxID4gMCBeIHFbMV0gPCAoYWJzKHFbMF0gLSBsYW1iZGEwKSA8IGVwc2lsb24gPyBwaGkwIDogcGhpMSlcbiAgICAgICAgICA6IHBoaTAgPD0gcVsxXSAmJiBxWzFdIDw9IHBoaTFcbiAgICAgICAgOiBkZWx0YSA+IHBpIF4gKGxhbWJkYTAgPD0gcVswXSAmJiBxWzBdIDw9IGxhbWJkYTEpKSB7XG4gICAgICB2YXIgcTEgPSBjYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgKyB0KSAvIHV1KTtcbiAgICAgIGNhcnRlc2lhbkFkZEluUGxhY2UocTEsIEEpO1xuICAgICAgcmV0dXJuIFtxLCBzcGhlcmljYWwocTEpXTtcbiAgICB9XG4gIH1cblxuICAvLyBHZW5lcmF0ZXMgYSA0LWJpdCB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiBhIHBvaW50IHJlbGF0aXZlIHRvXG4gIC8vIHRoZSBzbWFsbCBjaXJjbGUncyBib3VuZGluZyBib3guXG4gIGZ1bmN0aW9uIGNvZGUobGFtYmRhLCBwaGkpIHtcbiAgICB2YXIgciA9IHNtYWxsUmFkaXVzID8gcmFkaXVzIDogcGkgLSByYWRpdXMsXG4gICAgICAgIGNvZGUgPSAwO1xuICAgIGlmIChsYW1iZGEgPCAtcikgY29kZSB8PSAxOyAvLyBsZWZ0XG4gICAgZWxzZSBpZiAobGFtYmRhID4gcikgY29kZSB8PSAyOyAvLyByaWdodFxuICAgIGlmIChwaGkgPCAtcikgY29kZSB8PSA0OyAvLyBiZWxvd1xuICAgIGVsc2UgaWYgKHBoaSA+IHIpIGNvZGUgfD0gODsgLy8gYWJvdmVcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIHJldHVybiBjbGlwKHZpc2libGUsIGNsaXBMaW5lLCBpbnRlcnBvbGF0ZSwgc21hbGxSYWRpdXMgPyBbMCwgLXJhZGl1c10gOiBbLXBpLCByYWRpdXMgLSBwaV0pO1xufVxuIiwiaW1wb3J0IGNsaXBCdWZmZXIgZnJvbSBcIi4vYnVmZmVyLmpzXCI7XG5pbXBvcnQgY2xpcFJlam9pbiBmcm9tIFwiLi9yZWpvaW4uanNcIjtcbmltcG9ydCB7ZXBzaWxvbiwgaGFsZlBpfSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHBvbHlnb25Db250YWlucyBmcm9tIFwiLi4vcG9seWdvbkNvbnRhaW5zLmpzXCI7XG5pbXBvcnQge21lcmdlfSBmcm9tIFwiZDMtYXJyYXlcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocG9pbnRWaXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHN0YXJ0KSB7XG4gIHJldHVybiBmdW5jdGlvbihzaW5rKSB7XG4gICAgdmFyIGxpbmUgPSBjbGlwTGluZShzaW5rKSxcbiAgICAgICAgcmluZ0J1ZmZlciA9IGNsaXBCdWZmZXIoKSxcbiAgICAgICAgcmluZ1NpbmsgPSBjbGlwTGluZShyaW5nQnVmZmVyKSxcbiAgICAgICAgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZSxcbiAgICAgICAgcG9seWdvbixcbiAgICAgICAgc2VnbWVudHMsXG4gICAgICAgIHJpbmc7XG5cbiAgICB2YXIgY2xpcCA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludFJpbmc7XG4gICAgICAgIGNsaXAubGluZVN0YXJ0ID0gcmluZ1N0YXJ0O1xuICAgICAgICBjbGlwLmxpbmVFbmQgPSByaW5nRW5kO1xuICAgICAgICBzZWdtZW50cyA9IFtdO1xuICAgICAgICBwb2x5Z29uID0gW107XG4gICAgICB9LFxuICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludDtcbiAgICAgICAgY2xpcC5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gICAgICAgIGNsaXAubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICAgIHNlZ21lbnRzID0gbWVyZ2Uoc2VnbWVudHMpO1xuICAgICAgICB2YXIgc3RhcnRJbnNpZGUgPSBwb2x5Z29uQ29udGFpbnMocG9seWdvbiwgc3RhcnQpO1xuICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIGNsaXBSZWpvaW4oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc2luayk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhcnRJbnNpZGUpIHtcbiAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgc2luay5saW5lU3RhcnQoKTtcbiAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzaW5rKTtcbiAgICAgICAgICBzaW5rLmxpbmVFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvbkVuZCgpLCBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBzZWdtZW50cyA9IHBvbHlnb24gPSBudWxsO1xuICAgICAgfSxcbiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHNpbmsucG9seWdvblN0YXJ0KCk7XG4gICAgICAgIHNpbmsubGluZVN0YXJ0KCk7XG4gICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHNpbmspO1xuICAgICAgICBzaW5rLmxpbmVFbmQoKTtcbiAgICAgICAgc2luay5wb2x5Z29uRW5kKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBvaW50KGxhbWJkYSwgcGhpKSB7XG4gICAgICBpZiAocG9pbnRWaXNpYmxlKGxhbWJkYSwgcGhpKSkgc2luay5wb2ludChsYW1iZGEsIHBoaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRMaW5lKGxhbWJkYSwgcGhpKSB7XG4gICAgICBsaW5lLnBvaW50KGxhbWJkYSwgcGhpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICBjbGlwLnBvaW50ID0gcG9pbnRMaW5lO1xuICAgICAgbGluZS5saW5lU3RhcnQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgY2xpcC5wb2ludCA9IHBvaW50O1xuICAgICAgbGluZS5saW5lRW5kKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRSaW5nKGxhbWJkYSwgcGhpKSB7XG4gICAgICByaW5nLnB1c2goW2xhbWJkYSwgcGhpXSk7XG4gICAgICByaW5nU2luay5wb2ludChsYW1iZGEsIHBoaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkge1xuICAgICAgcmluZ1NpbmsubGluZVN0YXJ0KCk7XG4gICAgICByaW5nID0gW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcbiAgICAgIHBvaW50UmluZyhyaW5nWzBdWzBdLCByaW5nWzBdWzFdKTtcbiAgICAgIHJpbmdTaW5rLmxpbmVFbmQoKTtcblxuICAgICAgdmFyIGNsZWFuID0gcmluZ1NpbmsuY2xlYW4oKSxcbiAgICAgICAgICByaW5nU2VnbWVudHMgPSByaW5nQnVmZmVyLnJlc3VsdCgpLFxuICAgICAgICAgIGksIG4gPSByaW5nU2VnbWVudHMubGVuZ3RoLCBtLFxuICAgICAgICAgIHNlZ21lbnQsXG4gICAgICAgICAgcG9pbnQ7XG5cbiAgICAgIHJpbmcucG9wKCk7XG4gICAgICBwb2x5Z29uLnB1c2gocmluZyk7XG4gICAgICByaW5nID0gbnVsbDtcblxuICAgICAgaWYgKCFuKSByZXR1cm47XG5cbiAgICAgIC8vIE5vIGludGVyc2VjdGlvbnMuXG4gICAgICBpZiAoY2xlYW4gJiAxKSB7XG4gICAgICAgIHNlZ21lbnQgPSByaW5nU2VnbWVudHNbMF07XG4gICAgICAgIGlmICgobSA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPiAwKSB7XG4gICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgc2luay5wb2ludCgocG9pbnQgPSBzZWdtZW50W2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICAgIHNpbmsubGluZUVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVqb2luIGNvbm5lY3RlZCBzZWdtZW50cy5cbiAgICAgIC8vIFRPRE8gcmV1c2UgcmluZ0J1ZmZlci5yZWpvaW4oKT9cbiAgICAgIGlmIChuID4gMSAmJiBjbGVhbiAmIDIpIHJpbmdTZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5wb3AoKS5jb25jYXQocmluZ1NlZ21lbnRzLnNoaWZ0KCkpKTtcblxuICAgICAgc2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMuZmlsdGVyKHZhbGlkU2VnbWVudCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwO1xuICB9O1xufVxuXG5mdW5jdGlvbiB2YWxpZFNlZ21lbnQoc2VnbWVudCkge1xuICByZXR1cm4gc2VnbWVudC5sZW5ndGggPiAxO1xufVxuXG4vLyBJbnRlcnNlY3Rpb25zIGFyZSBzb3J0ZWQgYWxvbmcgdGhlIGNsaXAgZWRnZS4gRm9yIGJvdGggYW50aW1lcmlkaWFuIGN1dHRpbmdcbi8vIGFuZCBjaXJjbGUgY2xpcHBpbmcsIHRoZSBzYW1lIGNvbXBhcmlzb24gaXMgdXNlZC5cbmZ1bmN0aW9uIGNvbXBhcmVJbnRlcnNlY3Rpb24oYSwgYikge1xuICByZXR1cm4gKChhID0gYS54KVswXSA8IDAgPyBhWzFdIC0gaGFsZlBpIC0gZXBzaWxvbiA6IGhhbGZQaSAtIGFbMV0pXG4gICAgICAgLSAoKGIgPSBiLngpWzBdIDwgMCA/IGJbMV0gLSBoYWxmUGkgLSBlcHNpbG9uIDogaGFsZlBpIC0gYlsxXSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgdDAgPSAwLFxuICAgICAgdDEgPSAxLFxuICAgICAgZHggPSBieCAtIGF4LFxuICAgICAgZHkgPSBieSAtIGF5LFxuICAgICAgcjtcblxuICByID0geDAgLSBheDtcbiAgaWYgKCFkeCAmJiByID4gMCkgcmV0dXJuO1xuICByIC89IGR4O1xuICBpZiAoZHggPCAwKSB7XG4gICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xuICAgIGlmIChyIDwgdDEpIHQxID0gcjtcbiAgfSBlbHNlIGlmIChkeCA+IDApIHtcbiAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICB9XG5cbiAgciA9IHgxIC0gYXg7XG4gIGlmICghZHggJiYgciA8IDApIHJldHVybjtcbiAgciAvPSBkeDtcbiAgaWYgKGR4IDwgMCkge1xuICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gIH0gZWxzZSBpZiAoZHggPiAwKSB7XG4gICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xuICAgIGlmIChyIDwgdDEpIHQxID0gcjtcbiAgfVxuXG4gIHIgPSB5MCAtIGF5O1xuICBpZiAoIWR5ICYmIHIgPiAwKSByZXR1cm47XG4gIHIgLz0gZHk7XG4gIGlmIChkeSA8IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9IGVsc2UgaWYgKGR5ID4gMCkge1xuICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gIH1cblxuICByID0geTEgLSBheTtcbiAgaWYgKCFkeSAmJiByIDwgMCkgcmV0dXJuO1xuICByIC89IGR5O1xuICBpZiAoZHkgPCAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfSBlbHNlIGlmIChkeSA+IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9XG5cbiAgaWYgKHQwID4gMCkgYVswXSA9IGF4ICsgdDAgKiBkeCwgYVsxXSA9IGF5ICsgdDAgKiBkeTtcbiAgaWYgKHQxIDwgMSkgYlswXSA9IGF4ICsgdDEgKiBkeCwgYlsxXSA9IGF5ICsgdDEgKiBkeTtcbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQge2FicywgZXBzaWxvbn0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCBjbGlwQnVmZmVyIGZyb20gXCIuL2J1ZmZlci5qc1wiO1xuaW1wb3J0IGNsaXBMaW5lIGZyb20gXCIuL2xpbmUuanNcIjtcbmltcG9ydCBjbGlwUmVqb2luIGZyb20gXCIuL3Jlam9pbi5qc1wiO1xuaW1wb3J0IHttZXJnZX0gZnJvbSBcImQzLWFycmF5XCI7XG5cbnZhciBjbGlwTWF4ID0gMWU5LCBjbGlwTWluID0gLWNsaXBNYXg7XG5cbi8vIFRPRE8gVXNlIGQzLXBvbHlnb27igJlzIHBvbHlnb25Db250YWlucyBoZXJlIGZvciB0aGUgcmluZyBjaGVjaz9cbi8vIFRPRE8gRWxpbWluYXRlIGR1cGxpY2F0ZSBidWZmZXJpbmcgaW4gY2xpcEJ1ZmZlciBhbmQgcG9seWdvbi5wdXNoP1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbGlwUmVjdGFuZ2xlKHgwLCB5MCwgeDEsIHkxKSB7XG5cbiAgZnVuY3Rpb24gdmlzaWJsZSh4LCB5KSB7XG4gICAgcmV0dXJuIHgwIDw9IHggJiYgeCA8PSB4MSAmJiB5MCA8PSB5ICYmIHkgPD0geTE7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHtcbiAgICB2YXIgYSA9IDAsIGExID0gMDtcbiAgICBpZiAoZnJvbSA9PSBudWxsXG4gICAgICAgIHx8IChhID0gY29ybmVyKGZyb20sIGRpcmVjdGlvbikpICE9PSAoYTEgPSBjb3JuZXIodG8sIGRpcmVjdGlvbikpXG4gICAgICAgIHx8IGNvbXBhcmVQb2ludChmcm9tLCB0bykgPCAwIF4gZGlyZWN0aW9uID4gMCkge1xuICAgICAgZG8gc3RyZWFtLnBvaW50KGEgPT09IDAgfHwgYSA9PT0gMyA/IHgwIDogeDEsIGEgPiAxID8geTEgOiB5MCk7XG4gICAgICB3aGlsZSAoKGEgPSAoYSArIGRpcmVjdGlvbiArIDQpICUgNCkgIT09IGExKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLnBvaW50KHRvWzBdLCB0b1sxXSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29ybmVyKHAsIGRpcmVjdGlvbikge1xuICAgIHJldHVybiBhYnMocFswXSAtIHgwKSA8IGVwc2lsb24gPyBkaXJlY3Rpb24gPiAwID8gMCA6IDNcbiAgICAgICAgOiBhYnMocFswXSAtIHgxKSA8IGVwc2lsb24gPyBkaXJlY3Rpb24gPiAwID8gMiA6IDFcbiAgICAgICAgOiBhYnMocFsxXSAtIHkwKSA8IGVwc2lsb24gPyBkaXJlY3Rpb24gPiAwID8gMSA6IDBcbiAgICAgICAgOiBkaXJlY3Rpb24gPiAwID8gMyA6IDI7IC8vIGFicyhwWzFdIC0geTEpIDwgZXBzaWxvblxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGFyZUludGVyc2VjdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVQb2ludChhLngsIGIueCk7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wYXJlUG9pbnQoYSwgYikge1xuICAgIHZhciBjYSA9IGNvcm5lcihhLCAxKSxcbiAgICAgICAgY2IgPSBjb3JuZXIoYiwgMSk7XG4gICAgcmV0dXJuIGNhICE9PSBjYiA/IGNhIC0gY2JcbiAgICAgICAgOiBjYSA9PT0gMCA/IGJbMV0gLSBhWzFdXG4gICAgICAgIDogY2EgPT09IDEgPyBhWzBdIC0gYlswXVxuICAgICAgICA6IGNhID09PSAyID8gYVsxXSAtIGJbMV1cbiAgICAgICAgOiBiWzBdIC0gYVswXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICB2YXIgYWN0aXZlU3RyZWFtID0gc3RyZWFtLFxuICAgICAgICBidWZmZXJTdHJlYW0gPSBjbGlwQnVmZmVyKCksXG4gICAgICAgIHNlZ21lbnRzLFxuICAgICAgICBwb2x5Z29uLFxuICAgICAgICByaW5nLFxuICAgICAgICB4X18sIHlfXywgdl9fLCAvLyBmaXJzdCBwb2ludFxuICAgICAgICB4XywgeV8sIHZfLCAvLyBwcmV2aW91cyBwb2ludFxuICAgICAgICBmaXJzdCxcbiAgICAgICAgY2xlYW47XG5cbiAgICB2YXIgY2xpcFN0cmVhbSA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgIHBvbHlnb25TdGFydDogcG9seWdvblN0YXJ0LFxuICAgICAgcG9seWdvbkVuZDogcG9seWdvbkVuZFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7XG4gICAgICBpZiAodmlzaWJsZSh4LCB5KSkgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvbHlnb25JbnNpZGUoKSB7XG4gICAgICB2YXIgd2luZGluZyA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgZm9yICh2YXIgcmluZyA9IHBvbHlnb25baV0sIGogPSAxLCBtID0gcmluZy5sZW5ndGgsIHBvaW50ID0gcmluZ1swXSwgYTAsIGExLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdOyBqIDwgbTsgKytqKSB7XG4gICAgICAgICAgYTAgPSBiMCwgYTEgPSBiMSwgcG9pbnQgPSByaW5nW2pdLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdO1xuICAgICAgICAgIGlmIChhMSA8PSB5MSkgeyBpZiAoYjEgPiB5MSAmJiAoYjAgLSBhMCkgKiAoeTEgLSBhMSkgPiAoYjEgLSBhMSkgKiAoeDAgLSBhMCkpICsrd2luZGluZzsgfVxuICAgICAgICAgIGVsc2UgeyBpZiAoYjEgPD0geTEgJiYgKGIwIC0gYTApICogKHkxIC0gYTEpIDwgKGIxIC0gYTEpICogKHgwIC0gYTApKSAtLXdpbmRpbmc7IH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gd2luZGluZztcbiAgICB9XG5cbiAgICAvLyBCdWZmZXIgZ2VvbWV0cnkgd2l0aGluIGEgcG9seWdvbiBhbmQgdGhlbiBjbGlwIGl0IGVuIG1hc3NlLlxuICAgIGZ1bmN0aW9uIHBvbHlnb25TdGFydCgpIHtcbiAgICAgIGFjdGl2ZVN0cmVhbSA9IGJ1ZmZlclN0cmVhbSwgc2VnbWVudHMgPSBbXSwgcG9seWdvbiA9IFtdLCBjbGVhbiA9IHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9seWdvbkVuZCgpIHtcbiAgICAgIHZhciBzdGFydEluc2lkZSA9IHBvbHlnb25JbnNpZGUoKSxcbiAgICAgICAgICBjbGVhbkluc2lkZSA9IGNsZWFuICYmIHN0YXJ0SW5zaWRlLFxuICAgICAgICAgIHZpc2libGUgPSAoc2VnbWVudHMgPSBtZXJnZShzZWdtZW50cykpLmxlbmd0aDtcbiAgICAgIGlmIChjbGVhbkluc2lkZSB8fCB2aXNpYmxlKSB7XG4gICAgICAgIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTtcbiAgICAgICAgaWYgKGNsZWFuSW5zaWRlKSB7XG4gICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHN0cmVhbSk7XG4gICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgIGNsaXBSZWpvaW4oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0ucG9seWdvbkVuZCgpO1xuICAgICAgfVxuICAgICAgYWN0aXZlU3RyZWFtID0gc3RyZWFtLCBzZWdtZW50cyA9IHBvbHlnb24gPSByaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICBjbGlwU3RyZWFtLnBvaW50ID0gbGluZVBvaW50O1xuICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb24ucHVzaChyaW5nID0gW10pO1xuICAgICAgZmlyc3QgPSB0cnVlO1xuICAgICAgdl8gPSBmYWxzZTtcbiAgICAgIHhfID0geV8gPSBOYU47XG4gICAgfVxuXG4gICAgLy8gVE9ETyByYXRoZXIgdGhhbiBzcGVjaWFsLWNhc2UgcG9seWdvbnMsIHNpbXBseSBoYW5kbGUgdGhlbSBzZXBhcmF0ZWx5LlxuICAgIC8vIElkZWFsbHksIGNvaW5jaWRlbnQgaW50ZXJzZWN0aW9uIHBvaW50cyBzaG91bGQgYmUgaml0dGVyZWQgdG8gYXZvaWRcbiAgICAvLyBjbGlwcGluZyBpc3N1ZXMuXG4gICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgIGlmIChzZWdtZW50cykge1xuICAgICAgICBsaW5lUG9pbnQoeF9fLCB5X18pO1xuICAgICAgICBpZiAodl9fICYmIHZfKSBidWZmZXJTdHJlYW0ucmVqb2luKCk7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyU3RyZWFtLnJlc3VsdCgpKTtcbiAgICAgIH1cbiAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBwb2ludDtcbiAgICAgIGlmICh2XykgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lUG9pbnQoeCwgeSkge1xuICAgICAgdmFyIHYgPSB2aXNpYmxlKHgsIHkpO1xuICAgICAgaWYgKHBvbHlnb24pIHJpbmcucHVzaChbeCwgeV0pO1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIHhfXyA9IHgsIHlfXyA9IHksIHZfXyA9IHY7XG4gICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHYgJiYgdl8pIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGEgPSBbeF8gPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB4XykpLCB5XyA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHlfKSldLFxuICAgICAgICAgICAgICBiID0gW3ggPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB4KSksIHkgPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB5KSldO1xuICAgICAgICAgIGlmIChjbGlwTGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkpIHtcbiAgICAgICAgICAgIGlmICghdl8pIHtcbiAgICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoYVswXSwgYVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoYlswXSwgYlsxXSk7XG4gICAgICAgICAgICBpZiAoIXYpIGFjdGl2ZVN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgICBjbGVhbiA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodikge1xuICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgICAgICAgICAgY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBTdHJlYW07XG4gIH07XG59XG4iLCJpbXBvcnQgcG9pbnRFcXVhbCBmcm9tIFwiLi4vcG9pbnRFcXVhbC5qc1wiO1xuaW1wb3J0IHtlcHNpbG9ufSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBJbnRlcnNlY3Rpb24ocG9pbnQsIHBvaW50cywgb3RoZXIsIGVudHJ5KSB7XG4gIHRoaXMueCA9IHBvaW50O1xuICB0aGlzLnogPSBwb2ludHM7XG4gIHRoaXMubyA9IG90aGVyOyAvLyBhbm90aGVyIGludGVyc2VjdGlvblxuICB0aGlzLmUgPSBlbnRyeTsgLy8gaXMgYW4gZW50cnk/XG4gIHRoaXMudiA9IGZhbHNlOyAvLyB2aXNpdGVkXG4gIHRoaXMubiA9IHRoaXMucCA9IG51bGw7IC8vIG5leHQgJiBwcmV2aW91c1xufVxuXG4vLyBBIGdlbmVyYWxpemVkIHBvbHlnb24gY2xpcHBpbmcgYWxnb3JpdGhtOiBnaXZlbiBhIHBvbHlnb24gdGhhdCBoYXMgYmVlbiBjdXRcbi8vIGludG8gaXRzIHZpc2libGUgbGluZSBzZWdtZW50cywgYW5kIHJlam9pbnMgdGhlIHNlZ21lbnRzIGJ5IGludGVycG9sYXRpbmdcbi8vIGFsb25nIHRoZSBjbGlwIGVkZ2UuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBzdHJlYW0pIHtcbiAgdmFyIHN1YmplY3QgPSBbXSxcbiAgICAgIGNsaXAgPSBbXSxcbiAgICAgIGksXG4gICAgICBuO1xuXG4gIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24oc2VnbWVudCkge1xuICAgIGlmICgobiA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPD0gMCkgcmV0dXJuO1xuICAgIHZhciBuLCBwMCA9IHNlZ21lbnRbMF0sIHAxID0gc2VnbWVudFtuXSwgeDtcblxuICAgIGlmIChwb2ludEVxdWFsKHAwLCBwMSkpIHtcbiAgICAgIGlmICghcDBbMl0gJiYgIXAxWzJdKSB7XG4gICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgc3RyZWFtLnBvaW50KChwMCA9IHNlZ21lbnRbaV0pWzBdLCBwMFsxXSk7XG4gICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGhhbmRsZSBkZWdlbmVyYXRlIGNhc2VzIGJ5IG1vdmluZyB0aGUgcG9pbnRcbiAgICAgIHAxWzBdICs9IDIgKiBlcHNpbG9uO1xuICAgIH1cblxuICAgIHN1YmplY3QucHVzaCh4ID0gbmV3IEludGVyc2VjdGlvbihwMCwgc2VnbWVudCwgbnVsbCwgdHJ1ZSkpO1xuICAgIGNsaXAucHVzaCh4Lm8gPSBuZXcgSW50ZXJzZWN0aW9uKHAwLCBudWxsLCB4LCBmYWxzZSkpO1xuICAgIHN1YmplY3QucHVzaCh4ID0gbmV3IEludGVyc2VjdGlvbihwMSwgc2VnbWVudCwgbnVsbCwgZmFsc2UpKTtcbiAgICBjbGlwLnB1c2goeC5vID0gbmV3IEludGVyc2VjdGlvbihwMSwgbnVsbCwgeCwgdHJ1ZSkpO1xuICB9KTtcblxuICBpZiAoIXN1YmplY3QubGVuZ3RoKSByZXR1cm47XG5cbiAgY2xpcC5zb3J0KGNvbXBhcmVJbnRlcnNlY3Rpb24pO1xuICBsaW5rKHN1YmplY3QpO1xuICBsaW5rKGNsaXApO1xuXG4gIGZvciAoaSA9IDAsIG4gPSBjbGlwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGNsaXBbaV0uZSA9IHN0YXJ0SW5zaWRlID0gIXN0YXJ0SW5zaWRlO1xuICB9XG5cbiAgdmFyIHN0YXJ0ID0gc3ViamVjdFswXSxcbiAgICAgIHBvaW50cyxcbiAgICAgIHBvaW50O1xuXG4gIHdoaWxlICgxKSB7XG4gICAgLy8gRmluZCBmaXJzdCB1bnZpc2l0ZWQgaW50ZXJzZWN0aW9uLlxuICAgIHZhciBjdXJyZW50ID0gc3RhcnQsXG4gICAgICAgIGlzU3ViamVjdCA9IHRydWU7XG4gICAgd2hpbGUgKGN1cnJlbnQudikgaWYgKChjdXJyZW50ID0gY3VycmVudC5uKSA9PT0gc3RhcnQpIHJldHVybjtcbiAgICBwb2ludHMgPSBjdXJyZW50Lno7XG4gICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgIGRvIHtcbiAgICAgIGN1cnJlbnQudiA9IGN1cnJlbnQuby52ID0gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50LmUpIHtcbiAgICAgICAgaWYgKGlzU3ViamVjdCkge1xuICAgICAgICAgIGZvciAoaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoOyBpIDwgbjsgKytpKSBzdHJlYW0ucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5uLngsIDEsIHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1N1YmplY3QpIHtcbiAgICAgICAgICBwb2ludHMgPSBjdXJyZW50LnAuejtcbiAgICAgICAgICBmb3IgKGkgPSBwb2ludHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHN0cmVhbS5wb2ludCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJwb2xhdGUoY3VycmVudC54LCBjdXJyZW50LnAueCwgLTEsIHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm87XG4gICAgICBwb2ludHMgPSBjdXJyZW50Lno7XG4gICAgICBpc1N1YmplY3QgPSAhaXNTdWJqZWN0O1xuICAgIH0gd2hpbGUgKCFjdXJyZW50LnYpO1xuICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGluayhhcnJheSkge1xuICBpZiAoIShuID0gYXJyYXkubGVuZ3RoKSkgcmV0dXJuO1xuICB2YXIgbixcbiAgICAgIGkgPSAwLFxuICAgICAgYSA9IGFycmF5WzBdLFxuICAgICAgYjtcbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICBhLm4gPSBiID0gYXJyYXlbaV07XG4gICAgYi5wID0gYTtcbiAgICBhID0gYjtcbiAgfVxuICBhLm4gPSBiID0gYXJyYXlbMF07XG4gIGIucCA9IGE7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG5cbiAgZnVuY3Rpb24gY29tcG9zZSh4LCB5KSB7XG4gICAgcmV0dXJuIHggPSBhKHgsIHkpLCBiKHhbMF0sIHhbMV0pO1xuICB9XG5cbiAgaWYgKGEuaW52ZXJ0ICYmIGIuaW52ZXJ0KSBjb21wb3NlLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9IGIuaW52ZXJ0KHgsIHkpLCB4ICYmIGEuaW52ZXJ0KHhbMF0sIHhbMV0pO1xuICB9O1xuXG4gIHJldHVybiBjb21wb3NlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+IHg7XG4iLCJleHBvcnQgdmFyIGVwc2lsb24gPSAxZS02O1xuZXhwb3J0IHZhciBlcHNpbG9uMiA9IDFlLTEyO1xuZXhwb3J0IHZhciBwaSA9IE1hdGguUEk7XG5leHBvcnQgdmFyIGhhbGZQaSA9IHBpIC8gMjtcbmV4cG9ydCB2YXIgcXVhcnRlclBpID0gcGkgLyA0O1xuZXhwb3J0IHZhciB0YXUgPSBwaSAqIDI7XG5cbmV4cG9ydCB2YXIgZGVncmVlcyA9IDE4MCAvIHBpO1xuZXhwb3J0IHZhciByYWRpYW5zID0gcGkgLyAxODA7XG5cbmV4cG9ydCB2YXIgYWJzID0gTWF0aC5hYnM7XG5leHBvcnQgdmFyIGF0YW4gPSBNYXRoLmF0YW47XG5leHBvcnQgdmFyIGF0YW4yID0gTWF0aC5hdGFuMjtcbmV4cG9ydCB2YXIgY29zID0gTWF0aC5jb3M7XG5leHBvcnQgdmFyIGNlaWwgPSBNYXRoLmNlaWw7XG5leHBvcnQgdmFyIGV4cCA9IE1hdGguZXhwO1xuZXhwb3J0IHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5leHBvcnQgdmFyIGh5cG90ID0gTWF0aC5oeXBvdDtcbmV4cG9ydCB2YXIgbG9nID0gTWF0aC5sb2c7XG5leHBvcnQgdmFyIHBvdyA9IE1hdGgucG93O1xuZXhwb3J0IHZhciBzaW4gPSBNYXRoLnNpbjtcbmV4cG9ydCB2YXIgc2lnbiA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbih4KSB7IHJldHVybiB4ID4gMCA/IDEgOiB4IDwgMCA/IC0xIDogMDsgfTtcbmV4cG9ydCB2YXIgc3FydCA9IE1hdGguc3FydDtcbmV4cG9ydCB2YXIgdGFuID0gTWF0aC50YW47XG5cbmV4cG9ydCBmdW5jdGlvbiBhY29zKHgpIHtcbiAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IHBpIDogTWF0aC5hY29zKHgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNpbih4KSB7XG4gIHJldHVybiB4ID4gMSA/IGhhbGZQaSA6IHggPCAtMSA/IC1oYWxmUGkgOiBNYXRoLmFzaW4oeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXZlcnNpbih4KSB7XG4gIHJldHVybiAoeCA9IHNpbih4IC8gMikpICogeDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vb3AoKSB7fVxuIiwiaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxudmFyIHgwID0gSW5maW5pdHksXG4gICAgeTAgPSB4MCxcbiAgICB4MSA9IC14MCxcbiAgICB5MSA9IHgxO1xuXG52YXIgYm91bmRzU3RyZWFtID0ge1xuICBwb2ludDogYm91bmRzUG9pbnQsXG4gIGxpbmVTdGFydDogbm9vcCxcbiAgbGluZUVuZDogbm9vcCxcbiAgcG9seWdvblN0YXJ0OiBub29wLFxuICBwb2x5Z29uRW5kOiBub29wLFxuICByZXN1bHQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBib3VuZHMgPSBbW3gwLCB5MF0sIFt4MSwgeTFdXTtcbiAgICB4MSA9IHkxID0gLSh5MCA9IHgwID0gSW5maW5pdHkpO1xuICAgIHJldHVybiBib3VuZHM7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJvdW5kc1BvaW50KHgsIHkpIHtcbiAgaWYgKHggPCB4MCkgeDAgPSB4O1xuICBpZiAoeCA+IHgxKSB4MSA9IHg7XG4gIGlmICh5IDwgeTApIHkwID0geTtcbiAgaWYgKHkgPiB5MSkgeTEgPSB5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBib3VuZHNTdHJlYW07XG4iLCJpbXBvcnQge2FicywgZXBzaWxvbn0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhYnMoYVswXSAtIGJbMF0pIDwgZXBzaWxvbiAmJiBhYnMoYVsxXSAtIGJbMV0pIDwgZXBzaWxvbjtcbn1cbiIsImltcG9ydCB7QWRkZXJ9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtjYXJ0ZXNpYW4sIGNhcnRlc2lhbkNyb3NzLCBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlfSBmcm9tIFwiLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCB7YWJzLCBhc2luLCBhdGFuMiwgY29zLCBlcHNpbG9uLCBlcHNpbG9uMiwgaGFsZlBpLCBwaSwgcXVhcnRlclBpLCBzaWduLCBzaW4sIHRhdX0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBsb25naXR1ZGUocG9pbnQpIHtcbiAgcmV0dXJuIGFicyhwb2ludFswXSkgPD0gcGkgPyBwb2ludFswXSA6IHNpZ24ocG9pbnRbMF0pICogKChhYnMocG9pbnRbMF0pICsgcGkpICUgdGF1IC0gcGkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwb2x5Z29uLCBwb2ludCkge1xuICB2YXIgbGFtYmRhID0gbG9uZ2l0dWRlKHBvaW50KSxcbiAgICAgIHBoaSA9IHBvaW50WzFdLFxuICAgICAgc2luUGhpID0gc2luKHBoaSksXG4gICAgICBub3JtYWwgPSBbc2luKGxhbWJkYSksIC1jb3MobGFtYmRhKSwgMF0sXG4gICAgICBhbmdsZSA9IDAsXG4gICAgICB3aW5kaW5nID0gMDtcblxuICB2YXIgc3VtID0gbmV3IEFkZGVyKCk7XG5cbiAgaWYgKHNpblBoaSA9PT0gMSkgcGhpID0gaGFsZlBpICsgZXBzaWxvbjtcbiAgZWxzZSBpZiAoc2luUGhpID09PSAtMSkgcGhpID0gLWhhbGZQaSAtIGVwc2lsb247XG5cbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2x5Z29uLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICghKG0gPSAocmluZyA9IHBvbHlnb25baV0pLmxlbmd0aCkpIGNvbnRpbnVlO1xuICAgIHZhciByaW5nLFxuICAgICAgICBtLFxuICAgICAgICBwb2ludDAgPSByaW5nW20gLSAxXSxcbiAgICAgICAgbGFtYmRhMCA9IGxvbmdpdHVkZShwb2ludDApLFxuICAgICAgICBwaGkwID0gcG9pbnQwWzFdIC8gMiArIHF1YXJ0ZXJQaSxcbiAgICAgICAgc2luUGhpMCA9IHNpbihwaGkwKSxcbiAgICAgICAgY29zUGhpMCA9IGNvcyhwaGkwKTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbTsgKytqLCBsYW1iZGEwID0gbGFtYmRhMSwgc2luUGhpMCA9IHNpblBoaTEsIGNvc1BoaTAgPSBjb3NQaGkxLCBwb2ludDAgPSBwb2ludDEpIHtcbiAgICAgIHZhciBwb2ludDEgPSByaW5nW2pdLFxuICAgICAgICAgIGxhbWJkYTEgPSBsb25naXR1ZGUocG9pbnQxKSxcbiAgICAgICAgICBwaGkxID0gcG9pbnQxWzFdIC8gMiArIHF1YXJ0ZXJQaSxcbiAgICAgICAgICBzaW5QaGkxID0gc2luKHBoaTEpLFxuICAgICAgICAgIGNvc1BoaTEgPSBjb3MocGhpMSksXG4gICAgICAgICAgZGVsdGEgPSBsYW1iZGExIC0gbGFtYmRhMCxcbiAgICAgICAgICBzaWduID0gZGVsdGEgPj0gMCA/IDEgOiAtMSxcbiAgICAgICAgICBhYnNEZWx0YSA9IHNpZ24gKiBkZWx0YSxcbiAgICAgICAgICBhbnRpbWVyaWRpYW4gPSBhYnNEZWx0YSA+IHBpLFxuICAgICAgICAgIGsgPSBzaW5QaGkwICogc2luUGhpMTtcblxuICAgICAgc3VtLmFkZChhdGFuMihrICogc2lnbiAqIHNpbihhYnNEZWx0YSksIGNvc1BoaTAgKiBjb3NQaGkxICsgayAqIGNvcyhhYnNEZWx0YSkpKTtcbiAgICAgIGFuZ2xlICs9IGFudGltZXJpZGlhbiA/IGRlbHRhICsgc2lnbiAqIHRhdSA6IGRlbHRhO1xuXG4gICAgICAvLyBBcmUgdGhlIGxvbmdpdHVkZXMgZWl0aGVyIHNpZGUgb2YgdGhlIHBvaW504oCZcyBtZXJpZGlhbiAobGFtYmRhKSxcbiAgICAgIC8vIGFuZCBhcmUgdGhlIGxhdGl0dWRlcyBzbWFsbGVyIHRoYW4gdGhlIHBhcmFsbGVsIChwaGkpP1xuICAgICAgaWYgKGFudGltZXJpZGlhbiBeIGxhbWJkYTAgPj0gbGFtYmRhIF4gbGFtYmRhMSA+PSBsYW1iZGEpIHtcbiAgICAgICAgdmFyIGFyYyA9IGNhcnRlc2lhbkNyb3NzKGNhcnRlc2lhbihwb2ludDApLCBjYXJ0ZXNpYW4ocG9pbnQxKSk7XG4gICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoYXJjKTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGNhcnRlc2lhbkNyb3NzKG5vcm1hbCwgYXJjKTtcbiAgICAgICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShpbnRlcnNlY3Rpb24pO1xuICAgICAgICB2YXIgcGhpQXJjID0gKGFudGltZXJpZGlhbiBeIGRlbHRhID49IDAgPyAtMSA6IDEpICogYXNpbihpbnRlcnNlY3Rpb25bMl0pO1xuICAgICAgICBpZiAocGhpID4gcGhpQXJjIHx8IHBoaSA9PT0gcGhpQXJjICYmIChhcmNbMF0gfHwgYXJjWzFdKSkge1xuICAgICAgICAgIHdpbmRpbmcgKz0gYW50aW1lcmlkaWFuIF4gZGVsdGEgPj0gMCA/IDEgOiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpcnN0LCBkZXRlcm1pbmUgd2hldGhlciB0aGUgU291dGggcG9sZSBpcyBpbnNpZGUgb3Igb3V0c2lkZTpcbiAgLy9cbiAgLy8gSXQgaXMgaW5zaWRlIGlmOlxuICAvLyAqIHRoZSBwb2x5Z29uIHdpbmRzIGFyb3VuZCBpdCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uXG4gIC8vICogdGhlIHBvbHlnb24gZG9lcyBub3QgKGN1bXVsYXRpdmVseSkgd2luZCBhcm91bmQgaXQsIGJ1dCBoYXMgYSBuZWdhdGl2ZVxuICAvLyAgIChjb3VudGVyLWNsb2Nrd2lzZSkgYXJlYS5cbiAgLy9cbiAgLy8gU2Vjb25kLCBjb3VudCB0aGUgKHNpZ25lZCkgbnVtYmVyIG9mIHRpbWVzIGEgc2VnbWVudCBjcm9zc2VzIGEgbGFtYmRhXG4gIC8vIGZyb20gdGhlIHBvaW50IHRvIHRoZSBTb3V0aCBwb2xlLiAgSWYgaXQgaXMgemVybywgdGhlbiB0aGUgcG9pbnQgaXMgdGhlXG4gIC8vIHNhbWUgc2lkZSBhcyB0aGUgU291dGggcG9sZS5cblxuICByZXR1cm4gKGFuZ2xlIDwgLWVwc2lsb24gfHwgYW5nbGUgPCBlcHNpbG9uICYmIHN1bSA8IC1lcHNpbG9uMikgXiAod2luZGluZyAmIDEpO1xufVxuIiwiaW1wb3J0IHthc2luLCBhdGFuMiwgY29zLCBzaW4sIHNxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhemltdXRoYWxSYXcoc2NhbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB2YXIgY3ggPSBjb3MoeCksXG4gICAgICAgIGN5ID0gY29zKHkpLFxuICAgICAgICBrID0gc2NhbGUoY3ggKiBjeSk7XG4gICAgICAgIGlmIChrID09PSBJbmZpbml0eSkgcmV0dXJuIFsyLCAwXTtcbiAgICByZXR1cm4gW1xuICAgICAgayAqIGN5ICogc2luKHgpLFxuICAgICAgayAqIHNpbih5KVxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF6aW11dGhhbEludmVydChhbmdsZSkge1xuICByZXR1cm4gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciB6ID0gc3FydCh4ICogeCArIHkgKiB5KSxcbiAgICAgICAgYyA9IGFuZ2xlKHopLFxuICAgICAgICBzYyA9IHNpbihjKSxcbiAgICAgICAgY2MgPSBjb3MoYyk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGF0YW4yKHggKiBzYywgeiAqIGNjKSxcbiAgICAgIGFzaW4oeiAmJiB5ICogc2MgLyB6KVxuICAgIF07XG4gIH1cbn1cbiIsImltcG9ydCB7YXNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7YXppbXV0aGFsUmF3LCBhemltdXRoYWxJbnZlcnR9IGZyb20gXCIuL2F6aW11dGhhbC5qc1wiO1xuaW1wb3J0IHByb2plY3Rpb24gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IHZhciBhemltdXRoYWxFcXVhbEFyZWFSYXcgPSBhemltdXRoYWxSYXcoZnVuY3Rpb24oY3hjeSkge1xuICByZXR1cm4gc3FydCgyIC8gKDEgKyBjeGN5KSk7XG59KTtcblxuYXppbXV0aGFsRXF1YWxBcmVhUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7XG4gIHJldHVybiAyICogYXNpbih6IC8gMik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBwcm9qZWN0aW9uKGF6aW11dGhhbEVxdWFsQXJlYVJhdylcbiAgICAgIC5zY2FsZSgxMjQuNzUpXG4gICAgICAuY2xpcEFuZ2xlKDE4MCAtIDFlLTMpO1xufVxuIiwiaW1wb3J0IHtkZWZhdWx0IGFzIGdlb1N0cmVhbX0gZnJvbSBcIi4uL3N0cmVhbS5qc1wiO1xuaW1wb3J0IGJvdW5kc1N0cmVhbSBmcm9tIFwiLi4vcGF0aC9ib3VuZHMuanNcIjtcblxuZnVuY3Rpb24gZml0KHByb2plY3Rpb24sIGZpdEJvdW5kcywgb2JqZWN0KSB7XG4gIHZhciBjbGlwID0gcHJvamVjdGlvbi5jbGlwRXh0ZW50ICYmIHByb2plY3Rpb24uY2xpcEV4dGVudCgpO1xuICBwcm9qZWN0aW9uLnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLCAwXSk7XG4gIGlmIChjbGlwICE9IG51bGwpIHByb2plY3Rpb24uY2xpcEV4dGVudChudWxsKTtcbiAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvbi5zdHJlYW0oYm91bmRzU3RyZWFtKSk7XG4gIGZpdEJvdW5kcyhib3VuZHNTdHJlYW0ucmVzdWx0KCkpO1xuICBpZiAoY2xpcCAhPSBudWxsKSBwcm9qZWN0aW9uLmNsaXBFeHRlbnQoY2xpcCk7XG4gIHJldHVybiBwcm9qZWN0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml0RXh0ZW50KHByb2plY3Rpb24sIGV4dGVudCwgb2JqZWN0KSB7XG4gIHJldHVybiBmaXQocHJvamVjdGlvbiwgZnVuY3Rpb24oYikge1xuICAgIHZhciB3ID0gZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdLFxuICAgICAgICBoID0gZXh0ZW50WzFdWzFdIC0gZXh0ZW50WzBdWzFdLFxuICAgICAgICBrID0gTWF0aC5taW4odyAvIChiWzFdWzBdIC0gYlswXVswXSksIGggLyAoYlsxXVsxXSAtIGJbMF1bMV0pKSxcbiAgICAgICAgeCA9ICtleHRlbnRbMF1bMF0gKyAodyAtIGsgKiAoYlsxXVswXSArIGJbMF1bMF0pKSAvIDIsXG4gICAgICAgIHkgPSArZXh0ZW50WzBdWzFdICsgKGggLSBrICogKGJbMV1bMV0gKyBiWzBdWzFdKSkgLyAyO1xuICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJhbnNsYXRlKFt4LCB5XSk7XG4gIH0sIG9iamVjdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXRTaXplKHByb2plY3Rpb24sIHNpemUsIG9iamVjdCkge1xuICByZXR1cm4gZml0RXh0ZW50KHByb2plY3Rpb24sIFtbMCwgMF0sIHNpemVdLCBvYmplY3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml0V2lkdGgocHJvamVjdGlvbiwgd2lkdGgsIG9iamVjdCkge1xuICByZXR1cm4gZml0KHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHtcbiAgICB2YXIgdyA9ICt3aWR0aCxcbiAgICAgICAgayA9IHcgLyAoYlsxXVswXSAtIGJbMF1bMF0pLFxuICAgICAgICB4ID0gKHcgLSBrICogKGJbMV1bMF0gKyBiWzBdWzBdKSkgLyAyLFxuICAgICAgICB5ID0gLWsgKiBiWzBdWzFdO1xuICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJhbnNsYXRlKFt4LCB5XSk7XG4gIH0sIG9iamVjdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXRIZWlnaHQocHJvamVjdGlvbiwgaGVpZ2h0LCBvYmplY3QpIHtcbiAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlvbihiKSB7XG4gICAgdmFyIGggPSAraGVpZ2h0LFxuICAgICAgICBrID0gaCAvIChiWzFdWzFdIC0gYlswXVsxXSksXG4gICAgICAgIHggPSAtayAqIGJbMF1bMF0sXG4gICAgICAgIHkgPSAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7XG4gICAgcHJvamVjdGlvbi5zY2FsZSgxNTAgKiBrKS50cmFuc2xhdGUoW3gsIHldKTtcbiAgfSwgb2JqZWN0KTtcbn1cbiIsImltcG9ydCBjbGlwQW50aW1lcmlkaWFuIGZyb20gXCIuLi9jbGlwL2FudGltZXJpZGlhbi5qc1wiO1xuaW1wb3J0IGNsaXBDaXJjbGUgZnJvbSBcIi4uL2NsaXAvY2lyY2xlLmpzXCI7XG5pbXBvcnQgY2xpcFJlY3RhbmdsZSBmcm9tIFwiLi4vY2xpcC9yZWN0YW5nbGUuanNcIjtcbmltcG9ydCBjb21wb3NlIGZyb20gXCIuLi9jb21wb3NlLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4uL2lkZW50aXR5LmpzXCI7XG5pbXBvcnQge2NvcywgZGVncmVlcywgcmFkaWFucywgc2luLCBzcXJ0fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHtyb3RhdGVSYWRpYW5zfSBmcm9tIFwiLi4vcm90YXRpb24uanNcIjtcbmltcG9ydCB7dHJhbnNmb3JtZXJ9IGZyb20gXCIuLi90cmFuc2Zvcm0uanNcIjtcbmltcG9ydCB7Zml0RXh0ZW50LCBmaXRTaXplLCBmaXRXaWR0aCwgZml0SGVpZ2h0fSBmcm9tIFwiLi9maXQuanNcIjtcbmltcG9ydCByZXNhbXBsZSBmcm9tIFwiLi9yZXNhbXBsZS5qc1wiO1xuXG52YXIgdHJhbnNmb3JtUmFkaWFucyA9IHRyYW5zZm9ybWVyKHtcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLnN0cmVhbS5wb2ludCh4ICogcmFkaWFucywgeSAqIHJhZGlhbnMpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtUm90YXRlKHJvdGF0ZSkge1xuICByZXR1cm4gdHJhbnNmb3JtZXIoe1xuICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICB2YXIgciA9IHJvdGF0ZSh4LCB5KTtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5wb2ludChyWzBdLCByWzFdKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzY2FsZVRyYW5zbGF0ZShrLCBkeCwgZHksIHN4LCBzeSkge1xuICBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSkge1xuICAgIHggKj0gc3g7IHkgKj0gc3k7XG4gICAgcmV0dXJuIFtkeCArIGsgKiB4LCBkeSAtIGsgKiB5XTtcbiAgfVxuICB0cmFuc2Zvcm0uaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiBbKHggLSBkeCkgLyBrICogc3gsIChkeSAtIHkpIC8gayAqIHN5XTtcbiAgfTtcbiAgcmV0dXJuIHRyYW5zZm9ybTtcbn1cblxuZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGVSb3RhdGUoaywgZHgsIGR5LCBzeCwgc3ksIGFscGhhKSB7XG4gIGlmICghYWxwaGEpIHJldHVybiBzY2FsZVRyYW5zbGF0ZShrLCBkeCwgZHksIHN4LCBzeSk7XG4gIHZhciBjb3NBbHBoYSA9IGNvcyhhbHBoYSksXG4gICAgICBzaW5BbHBoYSA9IHNpbihhbHBoYSksXG4gICAgICBhID0gY29zQWxwaGEgKiBrLFxuICAgICAgYiA9IHNpbkFscGhhICogayxcbiAgICAgIGFpID0gY29zQWxwaGEgLyBrLFxuICAgICAgYmkgPSBzaW5BbHBoYSAvIGssXG4gICAgICBjaSA9IChzaW5BbHBoYSAqIGR5IC0gY29zQWxwaGEgKiBkeCkgLyBrLFxuICAgICAgZmkgPSAoc2luQWxwaGEgKiBkeCArIGNvc0FscGhhICogZHkpIC8gaztcbiAgZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHkpIHtcbiAgICB4ICo9IHN4OyB5ICo9IHN5O1xuICAgIHJldHVybiBbYSAqIHggLSBiICogeSArIGR4LCBkeSAtIGIgKiB4IC0gYSAqIHldO1xuICB9XG4gIHRyYW5zZm9ybS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIFtzeCAqIChhaSAqIHggLSBiaSAqIHkgKyBjaSksIHN5ICogKGZpIC0gYmkgKiB4IC0gYWkgKiB5KV07XG4gIH07XG4gIHJldHVybiB0cmFuc2Zvcm07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHByb2plY3Rpb24ocHJvamVjdCkge1xuICByZXR1cm4gcHJvamVjdGlvbk11dGF0b3IoZnVuY3Rpb24oKSB7IHJldHVybiBwcm9qZWN0OyB9KSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdGlvbk11dGF0b3IocHJvamVjdEF0KSB7XG4gIHZhciBwcm9qZWN0LFxuICAgICAgayA9IDE1MCwgLy8gc2NhbGVcbiAgICAgIHggPSA0ODAsIHkgPSAyNTAsIC8vIHRyYW5zbGF0ZVxuICAgICAgbGFtYmRhID0gMCwgcGhpID0gMCwgLy8gY2VudGVyXG4gICAgICBkZWx0YUxhbWJkYSA9IDAsIGRlbHRhUGhpID0gMCwgZGVsdGFHYW1tYSA9IDAsIHJvdGF0ZSwgLy8gcHJlLXJvdGF0ZVxuICAgICAgYWxwaGEgPSAwLCAvLyBwb3N0LXJvdGF0ZSBhbmdsZVxuICAgICAgc3ggPSAxLCAvLyByZWZsZWN0WFxuICAgICAgc3kgPSAxLCAvLyByZWZsZWN0WFxuICAgICAgdGhldGEgPSBudWxsLCBwcmVjbGlwID0gY2xpcEFudGltZXJpZGlhbiwgLy8gcHJlLWNsaXAgYW5nbGVcbiAgICAgIHgwID0gbnVsbCwgeTAsIHgxLCB5MSwgcG9zdGNsaXAgPSBpZGVudGl0eSwgLy8gcG9zdC1jbGlwIGV4dGVudFxuICAgICAgZGVsdGEyID0gMC41LCAvLyBwcmVjaXNpb25cbiAgICAgIHByb2plY3RSZXNhbXBsZSxcbiAgICAgIHByb2plY3RUcmFuc2Zvcm0sXG4gICAgICBwcm9qZWN0Um90YXRlVHJhbnNmb3JtLFxuICAgICAgY2FjaGUsXG4gICAgICBjYWNoZVN0cmVhbTtcblxuICBmdW5jdGlvbiBwcm9qZWN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIHByb2plY3RSb3RhdGVUcmFuc2Zvcm0ocG9pbnRbMF0gKiByYWRpYW5zLCBwb2ludFsxXSAqIHJhZGlhbnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52ZXJ0KHBvaW50KSB7XG4gICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlVHJhbnNmb3JtLmludmVydChwb2ludFswXSwgcG9pbnRbMV0pO1xuICAgIHJldHVybiBwb2ludCAmJiBbcG9pbnRbMF0gKiBkZWdyZWVzLCBwb2ludFsxXSAqIGRlZ3JlZXNdO1xuICB9XG5cbiAgcHJvamVjdGlvbi5zdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICByZXR1cm4gY2FjaGUgJiYgY2FjaGVTdHJlYW0gPT09IHN0cmVhbSA/IGNhY2hlIDogY2FjaGUgPSB0cmFuc2Zvcm1SYWRpYW5zKHRyYW5zZm9ybVJvdGF0ZShyb3RhdGUpKHByZWNsaXAocHJvamVjdFJlc2FtcGxlKHBvc3RjbGlwKGNhY2hlU3RyZWFtID0gc3RyZWFtKSkpKSk7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5wcmVjbGlwID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNsaXAgPSBfLCB0aGV0YSA9IHVuZGVmaW5lZCwgcmVzZXQoKSkgOiBwcmVjbGlwO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucG9zdGNsaXAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfLCB4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIHJlc2V0KCkpIDogcG9zdGNsaXA7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5jbGlwQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJlY2xpcCA9ICtfID8gY2xpcENpcmNsZSh0aGV0YSA9IF8gKiByYWRpYW5zKSA6ICh0aGV0YSA9IG51bGwsIGNsaXBBbnRpbWVyaWRpYW4pLCByZXNldCgpKSA6IHRoZXRhICogZGVncmVlcztcbiAgfTtcblxuICBwcm9qZWN0aW9uLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfID09IG51bGwgPyAoeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCBpZGVudGl0eSkgOiBjbGlwUmVjdGFuZ2xlKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0pLCByZXNldCgpKSA6IHgwID09IG51bGwgPyBudWxsIDogW1t4MCwgeTBdLCBbeDEsIHkxXV07XG4gIH07XG5cbiAgcHJvamVjdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrID0gK18sIHJlY2VudGVyKCkpIDogaztcbiAgfTtcblxuICBwcm9qZWN0aW9uLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gK19bMF0sIHkgPSArX1sxXSwgcmVjZW50ZXIoKSkgOiBbeCwgeV07XG4gIH07XG5cbiAgcHJvamVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobGFtYmRhID0gX1swXSAlIDM2MCAqIHJhZGlhbnMsIHBoaSA9IF9bMV0gJSAzNjAgKiByYWRpYW5zLCByZWNlbnRlcigpKSA6IFtsYW1iZGEgKiBkZWdyZWVzLCBwaGkgKiBkZWdyZWVzXTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWx0YUxhbWJkYSA9IF9bMF0gJSAzNjAgKiByYWRpYW5zLCBkZWx0YVBoaSA9IF9bMV0gJSAzNjAgKiByYWRpYW5zLCBkZWx0YUdhbW1hID0gXy5sZW5ndGggPiAyID8gX1syXSAlIDM2MCAqIHJhZGlhbnMgOiAwLCByZWNlbnRlcigpKSA6IFtkZWx0YUxhbWJkYSAqIGRlZ3JlZXMsIGRlbHRhUGhpICogZGVncmVlcywgZGVsdGFHYW1tYSAqIGRlZ3JlZXNdO1xuICB9O1xuXG4gIHByb2plY3Rpb24uYW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGEgPSBfICUgMzYwICogcmFkaWFucywgcmVjZW50ZXIoKSkgOiBhbHBoYSAqIGRlZ3JlZXM7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5yZWZsZWN0WCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzeCA9IF8gPyAtMSA6IDEsIHJlY2VudGVyKCkpIDogc3ggPCAwO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucmVmbGVjdFkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3kgPSBfID8gLTEgOiAxLCByZWNlbnRlcigpKSA6IHN5IDwgMDtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcm9qZWN0UmVzYW1wbGUgPSByZXNhbXBsZShwcm9qZWN0VHJhbnNmb3JtLCBkZWx0YTIgPSBfICogXyksIHJlc2V0KCkpIDogc3FydChkZWx0YTIpO1xuICB9O1xuXG4gIHByb2plY3Rpb24uZml0RXh0ZW50ID0gZnVuY3Rpb24oZXh0ZW50LCBvYmplY3QpIHtcbiAgICByZXR1cm4gZml0RXh0ZW50KHByb2plY3Rpb24sIGV4dGVudCwgb2JqZWN0KTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmZpdFNpemUgPSBmdW5jdGlvbihzaXplLCBvYmplY3QpIHtcbiAgICByZXR1cm4gZml0U2l6ZShwcm9qZWN0aW9uLCBzaXplLCBvYmplY3QpO1xuICB9O1xuXG4gIHByb2plY3Rpb24uZml0V2lkdGggPSBmdW5jdGlvbih3aWR0aCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdFdpZHRoKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpO1xuICB9O1xuXG4gIHByb2plY3Rpb24uZml0SGVpZ2h0ID0gZnVuY3Rpb24oaGVpZ2h0LCBvYmplY3QpIHtcbiAgICByZXR1cm4gZml0SGVpZ2h0KHByb2plY3Rpb24sIGhlaWdodCwgb2JqZWN0KTtcbiAgfTtcblxuICBmdW5jdGlvbiByZWNlbnRlcigpIHtcbiAgICB2YXIgY2VudGVyID0gc2NhbGVUcmFuc2xhdGVSb3RhdGUoaywgMCwgMCwgc3gsIHN5LCBhbHBoYSkuYXBwbHkobnVsbCwgcHJvamVjdChsYW1iZGEsIHBoaSkpLFxuICAgICAgICB0cmFuc2Zvcm0gPSBzY2FsZVRyYW5zbGF0ZVJvdGF0ZShrLCB4IC0gY2VudGVyWzBdLCB5IC0gY2VudGVyWzFdLCBzeCwgc3ksIGFscGhhKTtcbiAgICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKGRlbHRhTGFtYmRhLCBkZWx0YVBoaSwgZGVsdGFHYW1tYSk7XG4gICAgcHJvamVjdFRyYW5zZm9ybSA9IGNvbXBvc2UocHJvamVjdCwgdHJhbnNmb3JtKTtcbiAgICBwcm9qZWN0Um90YXRlVHJhbnNmb3JtID0gY29tcG9zZShyb3RhdGUsIHByb2plY3RUcmFuc2Zvcm0pO1xuICAgIHByb2plY3RSZXNhbXBsZSA9IHJlc2FtcGxlKHByb2plY3RUcmFuc2Zvcm0sIGRlbHRhMik7XG4gICAgcmV0dXJuIHJlc2V0KCk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICBjYWNoZSA9IGNhY2hlU3RyZWFtID0gbnVsbDtcbiAgICByZXR1cm4gcHJvamVjdGlvbjtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBwcm9qZWN0ID0gcHJvamVjdEF0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcHJvamVjdGlvbi5pbnZlcnQgPSBwcm9qZWN0LmludmVydCAmJiBpbnZlcnQ7XG4gICAgcmV0dXJuIHJlY2VudGVyKCk7XG4gIH07XG59XG4iLCJpbXBvcnQge2NhcnRlc2lhbn0gZnJvbSBcIi4uL2NhcnRlc2lhbi5qc1wiO1xuaW1wb3J0IHthYnMsIGFzaW4sIGF0YW4yLCBjb3MsIGVwc2lsb24sIHJhZGlhbnMsIHNxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQge3RyYW5zZm9ybWVyfSBmcm9tIFwiLi4vdHJhbnNmb3JtLmpzXCI7XG5cbnZhciBtYXhEZXB0aCA9IDE2LCAvLyBtYXhpbXVtIGRlcHRoIG9mIHN1YmRpdmlzaW9uXG4gICAgY29zTWluRGlzdGFuY2UgPSBjb3MoMzAgKiByYWRpYW5zKTsgLy8gY29zKG1pbmltdW0gYW5ndWxhciBkaXN0YW5jZSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocHJvamVjdCwgZGVsdGEyKSB7XG4gIHJldHVybiArZGVsdGEyID8gcmVzYW1wbGUocHJvamVjdCwgZGVsdGEyKSA6IHJlc2FtcGxlTm9uZShwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gcmVzYW1wbGVOb25lKHByb2plY3QpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyKHtcbiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgeCA9IHByb2plY3QoeCwgeSk7XG4gICAgICB0aGlzLnN0cmVhbS5wb2ludCh4WzBdLCB4WzFdKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNhbXBsZShwcm9qZWN0LCBkZWx0YTIpIHtcblxuICBmdW5jdGlvbiByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgxLCB5MSwgbGFtYmRhMSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSkge1xuICAgIHZhciBkeCA9IHgxIC0geDAsXG4gICAgICAgIGR5ID0geTEgLSB5MCxcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICBpZiAoZDIgPiA0ICogZGVsdGEyICYmIGRlcHRoLS0pIHtcbiAgICAgIHZhciBhID0gYTAgKyBhMSxcbiAgICAgICAgICBiID0gYjAgKyBiMSxcbiAgICAgICAgICBjID0gYzAgKyBjMSxcbiAgICAgICAgICBtID0gc3FydChhICogYSArIGIgKiBiICsgYyAqIGMpLFxuICAgICAgICAgIHBoaTIgPSBhc2luKGMgLz0gbSksXG4gICAgICAgICAgbGFtYmRhMiA9IGFicyhhYnMoYykgLSAxKSA8IGVwc2lsb24gfHwgYWJzKGxhbWJkYTAgLSBsYW1iZGExKSA8IGVwc2lsb24gPyAobGFtYmRhMCArIGxhbWJkYTEpIC8gMiA6IGF0YW4yKGIsIGEpLFxuICAgICAgICAgIHAgPSBwcm9qZWN0KGxhbWJkYTIsIHBoaTIpLFxuICAgICAgICAgIHgyID0gcFswXSxcbiAgICAgICAgICB5MiA9IHBbMV0sXG4gICAgICAgICAgZHgyID0geDIgLSB4MCxcbiAgICAgICAgICBkeTIgPSB5MiAtIHkwLFxuICAgICAgICAgIGR6ID0gZHkgKiBkeDIgLSBkeCAqIGR5MjtcbiAgICAgIGlmIChkeiAqIGR6IC8gZDIgPiBkZWx0YTIgLy8gcGVycGVuZGljdWxhciBwcm9qZWN0ZWQgZGlzdGFuY2VcbiAgICAgICAgICB8fCBhYnMoKGR4ICogZHgyICsgZHkgKiBkeTIpIC8gZDIgLSAwLjUpID4gMC4zIC8vIG1pZHBvaW50IGNsb3NlIHRvIGFuIGVuZFxuICAgICAgICAgIHx8IGEwICogYTEgKyBiMCAqIGIxICsgYzAgKiBjMSA8IGNvc01pbkRpc3RhbmNlKSB7IC8vIGFuZ3VsYXIgZGlzdGFuY2VcbiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MiwgeTIsIGxhbWJkYTIsIGEgLz0gbSwgYiAvPSBtLCBjLCBkZXB0aCwgc3RyZWFtKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHgyLCB5Mik7XG4gICAgICAgIHJlc2FtcGxlTGluZVRvKHgyLCB5MiwgbGFtYmRhMiwgYSwgYiwgYywgeDEsIHkxLCBsYW1iZGExLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHZhciBsYW1iZGEwMCwgeDAwLCB5MDAsIGEwMCwgYjAwLCBjMDAsIC8vIGZpcnN0IHBvaW50XG4gICAgICAgIGxhbWJkYTAsIHgwLCB5MCwgYTAsIGIwLCBjMDsgLy8gcHJldmlvdXMgcG9pbnRcblxuICAgIHZhciByZXNhbXBsZVN0cmVhbSA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7IHN0cmVhbS5wb2x5Z29uU3RhcnQoKTsgcmVzYW1wbGVTdHJlYW0ubGluZVN0YXJ0ID0gcmluZ1N0YXJ0OyB9LFxuICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHN0cmVhbS5wb2x5Z29uRW5kKCk7IHJlc2FtcGxlU3RyZWFtLmxpbmVTdGFydCA9IGxpbmVTdGFydDsgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7XG4gICAgICB4ID0gcHJvamVjdCh4LCB5KTtcbiAgICAgIHN0cmVhbS5wb2ludCh4WzBdLCB4WzFdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICB4MCA9IE5hTjtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gbGluZVBvaW50O1xuICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVQb2ludChsYW1iZGEsIHBoaSkge1xuICAgICAgdmFyIGMgPSBjYXJ0ZXNpYW4oW2xhbWJkYSwgcGhpXSksIHAgPSBwcm9qZWN0KGxhbWJkYSwgcGhpKTtcbiAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDAgPSBwWzBdLCB5MCA9IHBbMV0sIGxhbWJkYTAgPSBsYW1iZGEsIGEwID0gY1swXSwgYjAgPSBjWzFdLCBjMCA9IGNbMl0sIG1heERlcHRoLCBzdHJlYW0pO1xuICAgICAgc3RyZWFtLnBvaW50KHgwLCB5MCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gcG9pbnQ7XG4gICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHtcbiAgICAgIGxpbmVTdGFydCgpO1xuICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSByaW5nUG9pbnQ7XG4gICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5kID0gcmluZ0VuZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByaW5nUG9pbnQobGFtYmRhLCBwaGkpIHtcbiAgICAgIGxpbmVQb2ludChsYW1iZGEwMCA9IGxhbWJkYSwgcGhpKSwgeDAwID0geDAsIHkwMCA9IHkwLCBhMDAgPSBhMCwgYjAwID0gYjAsIGMwMCA9IGMwO1xuICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcbiAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDAwLCB5MDAsIGxhbWJkYTAwLCBhMDAsIGIwMCwgYzAwLCBtYXhEZXB0aCwgc3RyZWFtKTtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLmxpbmVFbmQgPSBsaW5lRW5kO1xuICAgICAgbGluZUVuZCgpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNhbXBsZVN0cmVhbTtcbiAgfTtcbn1cbiIsImltcG9ydCBjb21wb3NlIGZyb20gXCIuL2NvbXBvc2UuanNcIjtcbmltcG9ydCB7YWJzLCBhc2luLCBhdGFuMiwgY29zLCBkZWdyZWVzLCBwaSwgcmFkaWFucywgc2luLCB0YXV9IGZyb20gXCIuL21hdGguanNcIjtcblxuZnVuY3Rpb24gcm90YXRpb25JZGVudGl0eShsYW1iZGEsIHBoaSkge1xuICByZXR1cm4gW2FicyhsYW1iZGEpID4gcGkgPyBsYW1iZGEgKyBNYXRoLnJvdW5kKC1sYW1iZGEgLyB0YXUpICogdGF1IDogbGFtYmRhLCBwaGldO1xufVxuXG5yb3RhdGlvbklkZW50aXR5LmludmVydCA9IHJvdGF0aW9uSWRlbnRpdHk7XG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVSYWRpYW5zKGRlbHRhTGFtYmRhLCBkZWx0YVBoaSwgZGVsdGFHYW1tYSkge1xuICByZXR1cm4gKGRlbHRhTGFtYmRhICU9IHRhdSkgPyAoZGVsdGFQaGkgfHwgZGVsdGFHYW1tYSA/IGNvbXBvc2Uocm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpLCByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKSlcbiAgICA6IHJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSlcbiAgICA6IChkZWx0YVBoaSB8fCBkZWx0YUdhbW1hID8gcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSlcbiAgICA6IHJvdGF0aW9uSWRlbnRpdHkpO1xufVxuXG5mdW5jdGlvbiBmb3J3YXJkUm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7XG4gICAgcmV0dXJuIGxhbWJkYSArPSBkZWx0YUxhbWJkYSwgW2xhbWJkYSA+IHBpID8gbGFtYmRhIC0gdGF1IDogbGFtYmRhIDwgLXBpID8gbGFtYmRhICsgdGF1IDogbGFtYmRhLCBwaGldO1xuICB9O1xufVxuXG5mdW5jdGlvbiByb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSkge1xuICB2YXIgcm90YXRpb24gPSBmb3J3YXJkUm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpO1xuICByb3RhdGlvbi5pbnZlcnQgPSBmb3J3YXJkUm90YXRpb25MYW1iZGEoLWRlbHRhTGFtYmRhKTtcbiAgcmV0dXJuIHJvdGF0aW9uO1xufVxuXG5mdW5jdGlvbiByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKSB7XG4gIHZhciBjb3NEZWx0YVBoaSA9IGNvcyhkZWx0YVBoaSksXG4gICAgICBzaW5EZWx0YVBoaSA9IHNpbihkZWx0YVBoaSksXG4gICAgICBjb3NEZWx0YUdhbW1hID0gY29zKGRlbHRhR2FtbWEpLFxuICAgICAgc2luRGVsdGFHYW1tYSA9IHNpbihkZWx0YUdhbW1hKTtcblxuICBmdW5jdGlvbiByb3RhdGlvbihsYW1iZGEsIHBoaSkge1xuICAgIHZhciBjb3NQaGkgPSBjb3MocGhpKSxcbiAgICAgICAgeCA9IGNvcyhsYW1iZGEpICogY29zUGhpLFxuICAgICAgICB5ID0gc2luKGxhbWJkYSkgKiBjb3NQaGksXG4gICAgICAgIHogPSBzaW4ocGhpKSxcbiAgICAgICAgayA9IHogKiBjb3NEZWx0YVBoaSArIHggKiBzaW5EZWx0YVBoaTtcbiAgICByZXR1cm4gW1xuICAgICAgYXRhbjIoeSAqIGNvc0RlbHRhR2FtbWEgLSBrICogc2luRGVsdGFHYW1tYSwgeCAqIGNvc0RlbHRhUGhpIC0geiAqIHNpbkRlbHRhUGhpKSxcbiAgICAgIGFzaW4oayAqIGNvc0RlbHRhR2FtbWEgKyB5ICogc2luRGVsdGFHYW1tYSlcbiAgICBdO1xuICB9XG5cbiAgcm90YXRpb24uaW52ZXJ0ID0gZnVuY3Rpb24obGFtYmRhLCBwaGkpIHtcbiAgICB2YXIgY29zUGhpID0gY29zKHBoaSksXG4gICAgICAgIHggPSBjb3MobGFtYmRhKSAqIGNvc1BoaSxcbiAgICAgICAgeSA9IHNpbihsYW1iZGEpICogY29zUGhpLFxuICAgICAgICB6ID0gc2luKHBoaSksXG4gICAgICAgIGsgPSB6ICogY29zRGVsdGFHYW1tYSAtIHkgKiBzaW5EZWx0YUdhbW1hO1xuICAgIHJldHVybiBbXG4gICAgICBhdGFuMih5ICogY29zRGVsdGFHYW1tYSArIHogKiBzaW5EZWx0YUdhbW1hLCB4ICogY29zRGVsdGFQaGkgKyBrICogc2luRGVsdGFQaGkpLFxuICAgICAgYXNpbihrICogY29zRGVsdGFQaGkgLSB4ICogc2luRGVsdGFQaGkpXG4gICAgXTtcbiAgfTtcblxuICByZXR1cm4gcm90YXRpb247XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJvdGF0ZSkge1xuICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKHJvdGF0ZVswXSAqIHJhZGlhbnMsIHJvdGF0ZVsxXSAqIHJhZGlhbnMsIHJvdGF0ZS5sZW5ndGggPiAyID8gcm90YXRlWzJdICogcmFkaWFucyA6IDApO1xuXG4gIGZ1bmN0aW9uIGZvcndhcmQoY29vcmRpbmF0ZXMpIHtcbiAgICBjb29yZGluYXRlcyA9IHJvdGF0ZShjb29yZGluYXRlc1swXSAqIHJhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogcmFkaWFucyk7XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGRlZ3JlZXMsIGNvb3JkaW5hdGVzWzFdICo9IGRlZ3JlZXMsIGNvb3JkaW5hdGVzO1xuICB9XG5cbiAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykge1xuICAgIGNvb3JkaW5hdGVzID0gcm90YXRlLmludmVydChjb29yZGluYXRlc1swXSAqIHJhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogcmFkaWFucyk7XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGRlZ3JlZXMsIGNvb3JkaW5hdGVzWzFdICo9IGRlZ3JlZXMsIGNvb3JkaW5hdGVzO1xuICB9O1xuXG4gIHJldHVybiBmb3J3YXJkO1xufVxuIiwiZnVuY3Rpb24gc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cnksIHN0cmVhbSkge1xuICBpZiAoZ2VvbWV0cnkgJiYgc3RyZWFtR2VvbWV0cnlUeXBlLmhhc093blByb3BlcnR5KGdlb21ldHJ5LnR5cGUpKSB7XG4gICAgc3RyZWFtR2VvbWV0cnlUeXBlW2dlb21ldHJ5LnR5cGVdKGdlb21ldHJ5LCBzdHJlYW0pO1xuICB9XG59XG5cbnZhciBzdHJlYW1PYmplY3RUeXBlID0ge1xuICBGZWF0dXJlOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHN0cmVhbUdlb21ldHJ5KG9iamVjdC5nZW9tZXRyeSwgc3RyZWFtKTtcbiAgfSxcbiAgRmVhdHVyZUNvbGxlY3Rpb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gb2JqZWN0LmZlYXR1cmVzLCBpID0gLTEsIG4gPSBmZWF0dXJlcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUdlb21ldHJ5KGZlYXR1cmVzW2ldLmdlb21ldHJ5LCBzdHJlYW0pO1xuICB9XG59O1xuXG52YXIgc3RyZWFtR2VvbWV0cnlUeXBlID0ge1xuICBTcGhlcmU6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgc3RyZWFtLnNwaGVyZSgpO1xuICB9LFxuICBQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBvYmplY3QgPSBvYmplY3QuY29vcmRpbmF0ZXM7XG4gICAgc3RyZWFtLnBvaW50KG9iamVjdFswXSwgb2JqZWN0WzFdLCBvYmplY3RbMl0pO1xuICB9LFxuICBNdWx0aVBvaW50OiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBvYmplY3QgPSBjb29yZGluYXRlc1tpXSwgc3RyZWFtLnBvaW50KG9iamVjdFswXSwgb2JqZWN0WzFdLCBvYmplY3RbMl0pO1xuICB9LFxuICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHN0cmVhbUxpbmUob2JqZWN0LmNvb3JkaW5hdGVzLCBzdHJlYW0sIDApO1xuICB9LFxuICBNdWx0aUxpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSwgMCk7XG4gIH0sXG4gIFBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgc3RyZWFtUG9seWdvbihvYmplY3QuY29vcmRpbmF0ZXMsIHN0cmVhbSk7XG4gIH0sXG4gIE11bHRpUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtUG9seWdvbihjb29yZGluYXRlc1tpXSwgc3RyZWFtKTtcbiAgfSxcbiAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBnZW9tZXRyaWVzID0gb2JqZWN0Lmdlb21ldHJpZXMsIGkgPSAtMSwgbiA9IGdlb21ldHJpZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1HZW9tZXRyeShnZW9tZXRyaWVzW2ldLCBzdHJlYW0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzLCBzdHJlYW0sIGNsb3NlZCkge1xuICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoIC0gY2xvc2VkLCBjb29yZGluYXRlO1xuICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gIHdoaWxlICgrK2kgPCBuKSBjb29yZGluYXRlID0gY29vcmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChjb29yZGluYXRlWzBdLCBjb29yZGluYXRlWzFdLCBjb29yZGluYXRlWzJdKTtcbiAgc3RyZWFtLmxpbmVFbmQoKTtcbn1cblxuZnVuY3Rpb24gc3RyZWFtUG9seWdvbihjb29yZGluYXRlcywgc3RyZWFtKSB7XG4gIHZhciBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTtcbiAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSwgMSk7XG4gIHN0cmVhbS5wb2x5Z29uRW5kKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gIGlmIChvYmplY3QgJiYgc3RyZWFtT2JqZWN0VHlwZS5oYXNPd25Qcm9wZXJ0eShvYmplY3QudHlwZSkpIHtcbiAgICBzdHJlYW1PYmplY3RUeXBlW29iamVjdC50eXBlXShvYmplY3QsIHN0cmVhbSk7XG4gIH0gZWxzZSB7XG4gICAgc3RyZWFtR2VvbWV0cnkob2JqZWN0LCBzdHJlYW0pO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtZXRob2RzKSB7XG4gIHJldHVybiB7XG4gICAgc3RyZWFtOiB0cmFuc2Zvcm1lcihtZXRob2RzKVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtZXIobWV0aG9kcykge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgdmFyIHMgPSBuZXcgVHJhbnNmb3JtU3RyZWFtO1xuICAgIGZvciAodmFyIGtleSBpbiBtZXRob2RzKSBzW2tleV0gPSBtZXRob2RzW2tleV07XG4gICAgcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgcmV0dXJuIHM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbSgpIHt9XG5cblRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm1TdHJlYW0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuc3RyZWFtLnBvaW50KHgsIHkpOyB9LFxuICBzcGhlcmU6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5zcGhlcmUoKTsgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ubGluZVN0YXJ0KCk7IH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5saW5lRW5kKCk7IH0sXG4gIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpOyB9LFxuICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpOyB9XG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykge1xuICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7XG4gIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MFxuICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MVxuICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MlxuICAgICAgKyB0MyAqIHYzKSAvIDY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7YmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLFxuICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLFxuICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sXG4gICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSxcbiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsInZhciBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDtcbiAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYO1xuICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7XG4gIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZO1xuICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYO1xuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZVg6IGUsXG4gICAgdHJhbnNsYXRlWTogZixcbiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLFxuICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcyxcbiAgICBzY2FsZVg6IHNjYWxlWCxcbiAgICBzY2FsZVk6IHNjYWxlWVxuICB9O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge3BhcnNlQ3NzLCBwYXJzZVN2Z30gZnJvbSBcIi4vcGFyc2UuanNcIjtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7XG5cbiAgZnVuY3Rpb24gcG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIgXCIgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKFwidHJhbnNsYXRlKFwiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHtcbiAgICAgIHMucHVzaChcInRyYW5zbGF0ZShcIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoXG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiICsgeGIgKyBcIixcIiArIHliICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcbiAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTtcbiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTtcbiAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTtcbiAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTtcbiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7XG4gICAgYSA9IGIgPSBudWxsOyAvLyBnY1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87XG4gICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsIFwicHgsIFwiLCBcInB4KVwiLCBcImRlZylcIik7XG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcbiIsImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsInZhciBlcHNpbG9uMiA9IDFlLTEyO1xuXG5mdW5jdGlvbiBjb3NoKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSArIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHNpbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpIC0gMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gdGFuaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gem9vbVJobyhyaG8sIHJobzIsIHJobzQpIHtcblxuICAvLyBwMCA9IFt1eDAsIHV5MCwgdzBdXG4gIC8vIHAxID0gW3V4MSwgdXkxLCB3MV1cbiAgZnVuY3Rpb24gem9vbShwMCwgcDEpIHtcbiAgICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLFxuICAgICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sXG4gICAgICAgIGR4ID0gdXgxIC0gdXgwLFxuICAgICAgICBkeSA9IHV5MSAtIHV5MCxcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSxcbiAgICAgICAgaSxcbiAgICAgICAgUztcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAg4omFIHUxLlxuICAgIGlmIChkMiA8IGVwc2lsb24yKSB7XG4gICAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHQgKiBkeCxcbiAgICAgICAgICB1eTAgKyB0ICogZHksXG4gICAgICAgICAgdzAgKiBNYXRoLmV4cChyaG8gKiB0ICogUylcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmFsIGNhc2UuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZDEgPSBNYXRoLnNxcnQoZDIpLFxuICAgICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLFxuICAgICAgICAgIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gcmhvNCAqIGQyKSAvICgyICogdzEgKiByaG8yICogZDEpLFxuICAgICAgICAgIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSxcbiAgICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgICBTID0gKHIxIC0gcjApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdmFyIHMgPSB0ICogUyxcbiAgICAgICAgICAgIGNvc2hyMCA9IGNvc2gocjApLFxuICAgICAgICAgICAgdSA9IHcwIC8gKHJobzIgKiBkMSkgKiAoY29zaHIwICogdGFuaChyaG8gKiBzICsgcjApIC0gc2luaChyMCkpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHUgKiBkeCxcbiAgICAgICAgICB1eTAgKyB1ICogZHksXG4gICAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpLmR1cmF0aW9uID0gUyAqIDEwMDAgKiByaG8gLyBNYXRoLlNRUlQyO1xuXG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICB6b29tLnJobyA9IGZ1bmN0aW9uKF8pIHtcbiAgICB2YXIgXzEgPSBNYXRoLm1heCgxZS0zLCArXyksIF8yID0gXzEgKiBfMSwgXzQgPSBfMiAqIF8yO1xuICAgIHJldHVybiB6b29tUmhvKF8xLCBfMiwgXzQpO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufSkoTWF0aC5TUVJUMiwgMiwgNCk7XG4iLCJleHBvcnQgZGVmYXVsdCBNYXRoLnJhbmRvbTtcbiIsImltcG9ydCBkZWZhdWx0U291cmNlIGZyb20gXCIuL2RlZmF1bHRTb3VyY2UuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbU5vcm1hbChzb3VyY2UpIHtcbiAgZnVuY3Rpb24gcmFuZG9tTm9ybWFsKG11LCBzaWdtYSkge1xuICAgIHZhciB4LCByO1xuICAgIG11ID0gbXUgPT0gbnVsbCA/IDAgOiArbXU7XG4gICAgc2lnbWEgPSBzaWdtYSA9PSBudWxsID8gMSA6ICtzaWdtYTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgeTtcblxuICAgICAgLy8gSWYgYXZhaWxhYmxlLCB1c2UgdGhlIHNlY29uZCBwcmV2aW91c2x5LWdlbmVyYXRlZCB1bmlmb3JtIHJhbmRvbS5cbiAgICAgIGlmICh4ICE9IG51bGwpIHkgPSB4LCB4ID0gbnVsbDtcblxuICAgICAgLy8gT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhIG5ldyB4IGFuZCB5LlxuICAgICAgZWxzZSBkbyB7XG4gICAgICAgIHggPSBzb3VyY2UoKSAqIDIgLSAxO1xuICAgICAgICB5ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7XG4gICAgICB9IHdoaWxlICghciB8fCByID4gMSk7XG5cbiAgICAgIHJldHVybiBtdSArIHNpZ21hICogeSAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7XG4gICAgfTtcbiAgfVxuXG4gIHJhbmRvbU5vcm1hbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21Ob3JtYWw7XG5cbiAgcmV0dXJuIHJhbmRvbU5vcm1hbDtcbn0pKGRlZmF1bHRTb3VyY2UpO1xuIiwiLy8gR2l2ZW4gc29tZXRoaW5nIGFycmF5IGxpa2UgKG9yIG51bGwpLCByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIHN0cmljdGx5IGFuXG4vLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsXG4vLyBvciBzZWxlY3Rpb24uc2VsZWN0QWxsIGFyZSBjb252ZXJ0ZWQgaW50byBwcm9wZXIgYXJyYXlzIHdoZW4gY3JlYXRpbmcgYVxuLy8gc2VsZWN0aW9uOyB3ZSBkb27igJl0IGV2ZXIgd2FudCB0byBjcmVhdGUgYSBzZWxlY3Rpb24gYmFja2VkIGJ5IGEgbGl2ZVxuLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGFcbi8vIHN0YXRpYyBOb2RlTGlzdCBhcyBhIGdyb3VwLCBzaW5jZSBpdCBzYWZlbHkgZGVyaXZlZCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcnJheSh4KSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi9uYW1lc3BhY2UuanNcIjtcbmltcG9ydCB7eGh0bWx9IGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZnVuY3Rpb24gY3JlYXRvckluaGVyaXQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LFxuICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTtcbiAgICByZXR1cm4gdXJpID09PSB4aHRtbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSB4aHRtbFxuICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSlcbiAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCBuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRvckZpeGVkKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbFxuICAgICAgPyBjcmVhdG9yRml4ZWRcbiAgICAgIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgc291cmNlRXZlbnQgZnJvbSBcIi4vc291cmNlRXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQsIG5vZGUpIHtcbiAgZXZlbnQgPSBzb3VyY2VFdmVudChldmVudCk7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIG5vZGUgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBpZiAobm9kZSkge1xuICAgIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlO1xuICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHtcbiAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZO1xuICAgICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTtcbiAgICB9XG4gICAgaWYgKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICB2YXIgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtldmVudC5wYWdlWCwgZXZlbnQucGFnZVldO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb24sIHJvb3R9IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCJmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZShmYWxzZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWVwKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChkZWVwID8gc2VsZWN0aW9uX2Nsb25lRGVlcCA6IHNlbGVjdGlvbl9jbG9uZVNoYWxsb3cpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge0VudGVyTm9kZX0gZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHtcbiAgdmFyIGkgPSAwLFxuICAgICAgbm9kZSxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuXG4gIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLlxuICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0LlxuICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHtcbiAgdmFyIGksXG4gICAgICBub2RlLFxuICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAga2V5VmFsdWU7XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuXG4gIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSArIFwiXCI7XG4gICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLlxuICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuXG4gIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSkgKyBcIlwiO1xuICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWUuZGVsZXRlKGtleVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkpIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkYXR1bShub2RlKSB7XG4gIHJldHVybiBub2RlLl9fZGF0YV9fO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIEFycmF5LmZyb20odGhpcywgZGF0dW0pO1xuXG4gIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCxcbiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7XG5cbiAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sXG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YSA9IGFycmF5bGlrZSh2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cykpLFxuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpO1xuXG4gICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpO1xuXG4gICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0XG4gICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSxcbiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkge1xuICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHtcbiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTtcbiAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpO1xuICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7XG4gIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjtcbiAgdXBkYXRlLl9leGl0ID0gZXhpdDtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuLy8gR2l2ZW4gc29tZSBkYXRhLCB0aGlzIHJldHVybnMgYW4gYXJyYXktbGlrZSB2aWV3IG9mIGl0OiBhbiBvYmplY3QgdGhhdFxuLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2Vcbi8vIHNlbGVjdEFsbCwgdGhpcyBpc27igJl0IHdvcnJpZWQgYWJvdXQg4oCcbGl2ZeKAnSBjb2xsZWN0aW9ucyBiZWNhdXNlIHRoZSByZXN1bHRpbmdcbi8vIGFycmF5IHdpbGwgb25seSBiZSB1c2VkIGJyaWVmbHkgd2hpbGUgZGF0YSBpcyBiZWluZyBib3VuZC4gKEl0IGlzIHBvc3NpYmxlIHRvXG4vLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlXG4vLyBkb27igJl0OyB3ZeKAmWQgcmF0aGVyIGF2b2lkIGEgZ3JhdHVpdG91cyBjb3B5LilcbmZ1bmN0aW9uIGFycmF5bGlrZShkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIGRhdGFcbiAgICA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKGRhdGEpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBpZiAodHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVudGVyID0gb25lbnRlcihlbnRlcik7XG4gICAgaWYgKGVudGVyKSBlbnRlciA9IGVudGVyLnNlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGVudGVyID0gZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgfVxuICBpZiAob251cGRhdGUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpO1xuICB9XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG59XG4iLCJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwiZnVuY3Rpb24gcmVtb3ZlKCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBzZWxlY3RvckFsbCBmcm9tIFwiLi4vc2VsZWN0b3JBbGwuanNcIjtcblxuZnVuY3Rpb24gYXJyYXlBbGwoc2VsZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJyYXkoc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gYXJyYXlBbGwoc2VsZWN0KTtcbiAgZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7XG5cbmZ1bmN0aW9uIGNoaWxkcmVuKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdEFsbChtYXRjaCA9PSBudWxsID8gY2hpbGRyZW5cbiAgICAgIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSArK3NpemU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIHNpemU7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHVwZGF0ZSkge1xuICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvblxuICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpXG4gICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3R5bGVWYWx1ZShub2RlLCBuYW1lKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSlcbiAgICAgIHx8IGRlZmF1bHRWaWV3KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCJmdW5jdGlvbiBub25lKCkge31cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBsZXQgc291cmNlRXZlbnQ7XG4gIHdoaWxlIChzb3VyY2VFdmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50KSBldmVudCA9IHNvdXJjZUV2ZW50O1xuICByZXR1cm4gZXZlbnQ7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsInZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nP1xuICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz9cbiAgICBpbnRlcnZhbCA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT9cbiAgICBwb2tlRGVsYXkgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tld1xuICAgIHRhc2tIZWFkLFxuICAgIHRhc2tUYWlsLFxuICAgIGNsb2NrTGFzdCA9IDAsXG4gICAgY2xvY2tOb3cgPSAwLFxuICAgIGNsb2NrU2tldyA9IDAsXG4gICAgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09IFwib2JqZWN0XCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLFxuICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gY2xvY2tOb3cgfHwgKHNldEZyYW1lKGNsZWFyTm93KSwgY2xvY2tOb3cgPSBjbG9jay5ub3coKSArIGNsb2NrU2tldyk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTm93KCkge1xuICBjbG9ja05vdyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lcigpIHtcbiAgdGhpcy5fY2FsbCA9XG4gIHRoaXMuX3RpbWUgPVxuICB0aGlzLl9uZXh0ID0gbnVsbDtcbn1cblxuVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVGltZXIsXG4gIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpO1xuICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykge1xuICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7XG4gICAgICBlbHNlIHRhc2tIZWFkID0gdGhpcztcbiAgICAgIHRhc2tUYWlsID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX3RpbWUgPSB0aW1lO1xuICAgIHNsZWVwKCk7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9jYWxsKSB7XG4gICAgICB0aGlzLl9jYWxsID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTtcbiAgICAgIHNsZWVwKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lckZsdXNoKCkge1xuICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuXG4gIHZhciB0ID0gdGFza0hlYWQsIGU7XG4gIHdoaWxlICh0KSB7XG4gICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwodW5kZWZpbmVkLCBlKTtcbiAgICB0ID0gdC5fbmV4dDtcbiAgfVxuICAtLWZyYW1lO1xufVxuXG5mdW5jdGlvbiB3YWtlKCkge1xuICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7XG4gIGZyYW1lID0gdGltZW91dCA9IDA7XG4gIHRyeSB7XG4gICAgdGltZXJGbHVzaCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZyYW1lID0gMDtcbiAgICBuYXAoKTtcbiAgICBjbG9ja05vdyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9rZSgpIHtcbiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDtcbiAgaWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5vdztcbn1cblxuZnVuY3Rpb24gbmFwKCkge1xuICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7XG4gIHdoaWxlICh0MSkge1xuICAgIGlmICh0MS5fY2FsbCkge1xuICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lO1xuICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsO1xuICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyO1xuICAgIH1cbiAgfVxuICB0YXNrVGFpbCA9IHQwO1xuICBzbGVlcCh0aW1lKTtcbn1cblxuZnVuY3Rpb24gc2xlZXAodGltZSkge1xuICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS5cbiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuXG4gIGlmIChkZWxheSA+IDI0KSB7XG4gICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTtcbiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTtcbiAgICBmcmFtZSA9IDEsIHNldEZyYW1lKHdha2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCB7U0NIRURVTEVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbnZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgaTtcblxuICBpZiAoc2NoZWR1bGVzKSB7XG4gICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5zdGF0ZSA+IFNDSEVEVUxFRCAmJiBzY2hlZHVsZS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihbW25vZGVdXSwgcm9vdCwgbmFtZSwgK2kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgYWN0aXZlfSBmcm9tIFwiLi9hY3RpdmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnJ1cHR9IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuIiwiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBzZWxlY3Rpb25faW50ZXJydXB0IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcblxuc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0O1xuc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247XG4iLCJpbXBvcnQgaW50ZXJydXB0IGZyb20gXCIuLi9pbnRlcnJ1cHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlIGZyb20gXCIuLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge2Vhc2VDdWJpY0luT3V0fSBmcm9tIFwiZDMtZWFzZVwiO1xuaW1wb3J0IHtub3d9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZGVmYXVsdFRpbWluZyA9IHtcbiAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS5cbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiAyNTAsXG4gIGVhc2U6IGVhc2VDdWJpY0luT3V0XG59O1xuXG5mdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7XG4gIHZhciB0aW1pbmc7XG4gIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpbWluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgaWQsXG4gICAgICB0aW1pbmc7XG5cbiAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7XG4gICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7XG4gIH0gZWxzZSB7XG4gICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLCBpID0gZnVsbG5hbWUgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwiYXR0ci5cIiArIG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpKGZ1bGxuYW1lKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkoZnVsbG5hbWUsIGksIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJhdHRyLlwiICsgbmFtZTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtnZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb25cbiAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5O1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb25cbiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmVhc2U7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMuZWFjaChlYXNlVmFyeWluZyh0aGlzLl9pZCwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3RvckFsbH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHtcbiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG52YXIgU2VsZWN0aW9uID0gc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsImZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgdCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleSA9IFwic3R5bGUuXCIgKyAobmFtZSArPSBcIlwiKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKTtcbn1cbiIsImltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLnR3ZWVuKFwidGV4dFwiLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCBcInRleHRcIiwgdmFsdWUpKVxuICAgICAgOiB0ZXh0Q29uc3RhbnQodmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCIpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZDAgPSB0aGlzLl9pZCxcbiAgICAgIGlkMSA9IG5ld0lkKCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQobm9kZSwgaWQwKTtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwge1xuICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFpvb21FdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICB0YXJnZXQsXG4gIHRyYW5zZm9ybSxcbiAgZGlzcGF0Y2hcbn0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIHR5cGU6IHt2YWx1ZTogdHlwZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzb3VyY2VFdmVudDoge3ZhbHVlOiBzb3VyY2VFdmVudCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRyYW5zZm9ybToge3ZhbHVlOiB0cmFuc2Zvcm0sIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgem9vbX0gZnJvbSBcIi4vem9vbS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHpvb21UcmFuc2Zvcm0sIGlkZW50aXR5IGFzIHpvb21JZGVudGl0eSwgVHJhbnNmb3JtIGFzIFpvb21UcmFuc2Zvcm19IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShrLCB4LCB5KSB7XG4gIHRoaXMuayA9IGs7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sXG4gIHNjYWxlOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7XG4gIH0sXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID09PSAwICYgeSA9PT0gMCA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuaywgdGhpcy54ICsgdGhpcy5rICogeCwgdGhpcy55ICsgdGhpcy5rICogeSk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbihwb2ludCkge1xuICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTtcbiAgfSxcbiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7XG4gIH0sXG4gIGFwcGx5WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5ICogdGhpcy5rICsgdGhpcy55O1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTtcbiAgfSxcbiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7XG4gIH0sXG4gIGludmVydFk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gKHkgLSB0aGlzLnkpIC8gdGhpcy5rO1xuICB9LFxuICByZXNjYWxlWDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpO1xuICB9LFxuICByZXNjYWxlWTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy54ICsgXCIsXCIgKyB0aGlzLnkgKyBcIikgc2NhbGUoXCIgKyB0aGlzLmsgKyBcIilcIjtcbiAgfVxufTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7XG5cbnRyYW5zZm9ybS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX196b29tKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gbm9kZS5fX3pvb207XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZHJhZ0Rpc2FibGUsIGRyYWdFbmFibGV9IGZyb20gXCJkMy1kcmFnXCI7XG5pbXBvcnQge2ludGVycG9sYXRlWm9vbX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBab29tRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCB7VHJhbnNmb3JtLCBpZGVudGl0eX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG4vLyBleGNlcHQgZm9yIHBpbmNoLXRvLXpvb20sIHdoaWNoIGlzIHNlbnQgYXMgYSB3aGVlbCtjdHJsS2V5IGV2ZW50XG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAoIWV2ZW50LmN0cmxLZXkgfHwgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIGUgPSB0aGlzO1xuICBpZiAoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICBlID0gZS5vd25lclNWR0VsZW1lbnQgfHwgZTtcbiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgICBlID0gZS52aWV3Qm94LmJhc2VWYWw7XG4gICAgICByZXR1cm4gW1tlLngsIGUueV0sIFtlLnggKyBlLndpZHRoLCBlLnkgKyBlLmhlaWdodF1dO1xuICAgIH1cbiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGguYmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbZS5jbGllbnRXaWR0aCwgZS5jbGllbnRIZWlnaHRdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRyYW5zZm9ybSgpIHtcbiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0V2hlZWxEZWx0YShldmVudCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKSAqIChldmVudC5jdHJsS2V5ID8gMTAgOiAxKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcInpvb21cIiwgXCJlbmRcIiksXG4gICAgICB0b3VjaHN0YXJ0aW5nLFxuICAgICAgdG91Y2hmaXJzdCxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgdG91Y2hEZWxheSA9IDUwMCxcbiAgICAgIHdoZWVsRGVsYXkgPSAxNTAsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDAsXG4gICAgICB0YXBEaXN0YW5jZSA9IDEwO1xuXG4gIGZ1bmN0aW9uIHpvb20oc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKVxuICAgICAgICAub24oXCJ3aGVlbC56b29tXCIsIHdoZWVsZWQsIHtwYXNzaXZlOiBmYWxzZX0pXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi56b29tXCIsIG1vdXNlZG93bmVkKVxuICAgICAgICAub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC56b29tXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLnpvb21cIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29sbGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247XG4gICAgc2VsZWN0aW9uLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pO1xuICAgIGlmIChjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHNjaGVkdWxlKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIC5ldmVudChldmVudClcbiAgICAgICAgICAuc3RhcnQoKVxuICAgICAgICAgIC56b29tKG51bGwsIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKVxuICAgICAgICAgIC5lbmQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS5zY2FsZVRvKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgazAgPSB0aGlzLl9fem9vbS5rLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gazAgKiBrMTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS5zY2FsZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8geS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeVxuICAgICAgKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgbnVsbCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcDtcbiAgICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkudHJhbnNsYXRlKHAwWzBdLCBwMFsxXSkuc2NhbGUodC5rKS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXlcbiAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHRyYW5zZm9ybSwgaykge1xuICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIGspKTtcbiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHtcbiAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uaztcbiAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRyb2lkKGV4dGVudCkge1xuICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIsICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdHJhbnNpdGlvblxuICAgICAgICAub24oXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLnN0YXJ0KCk7IH0pXG4gICAgICAgIC5vbihcImludGVycnVwdC56b29tIGVuZC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLmVuZCgpOyB9KVxuICAgICAgICAudHdlZW4oXCJ6b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhhdCwgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LFxuICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSxcbiAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLFxuICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoYXQsIGFyZ3MpIDogdHJhbnNmb3JtLFxuICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29uY2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC5cbiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCksIGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9XG4gICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgcmV0dXJuICghY2xlYW4gJiYgdGhhdC5fX3pvb21pbmcpIHx8IG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLnNvdXJjZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB0aGlzLnRhcHMgPSAwO1xuICB9XG5cbiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7XG4gICAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIHRoaXMuc291cmNlRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHtcbiAgICAgICAgdGhpcy50aGF0Ll9fem9vbWluZyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZztcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgZCA9IHNlbGVjdCh0aGlzLnRoYXQpLmRhdHVtKCk7XG4gICAgICBsaXN0ZW5lcnMuY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy50aGF0LFxuICAgICAgICBuZXcgWm9vbUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogdGhpcy5zb3VyY2VFdmVudCxcbiAgICAgICAgICB0YXJnZXQ6IHpvb20sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMudGhhdC5fX3pvb20sXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gd2hlZWxlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b27igJl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBnLndoZWVsID0gc2V0VGltZW91dCh3aGVlbGlkbGVkLCB3aGVlbERlbGF5KTtcbiAgICBnLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQsIGspLCBnLm1vdXNlWzBdLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuXG4gICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHtcbiAgICAgIGcud2hlZWwgPSBudWxsO1xuICAgICAgZy5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIHRydWUpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdiA9IHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS56b29tXCIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKFwibW91c2V1cC56b29tXCIsIG1vdXNldXBwZWQsIHRydWUpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksXG4gICAgICAgIHgwID0gZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTAgPSBldmVudC5jbGllbnRZO1xuXG4gICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGlmICghZy5tb3ZlZCkge1xuICAgICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXZlbnQuY2xpZW50WSAtIHkwO1xuICAgICAgICBnLm1vdmVkID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICAgIH1cbiAgICAgIGcuZXZlbnQoZXZlbnQpXG4gICAgICAgLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKGcudGhhdC5fX3pvb20sIGcubW91c2VbMF0gPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgICB2Lm9uKFwibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tXCIsIG51bGwpO1xuICAgICAgZHJhZ0VuYWJsZShldmVudC52aWV3LCBnLm1vdmVkKTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgZy5ldmVudChldmVudCkuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGJsY2xpY2tlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgcDAgPSBwb2ludGVyKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCwgdGhpcyksXG4gICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgazEgPSB0MC5rICogKGV2ZW50LnNoaWZ0S2V5ID8gMC41IDogMiksXG4gICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJncyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDAsIGV2ZW50KTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSwgcDAsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID09PSBuKS5ldmVudChldmVudCksXG4gICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTtcbiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7XG4gICAgICBlbHNlIGlmICghZy50b3VjaDEgJiYgZy50b3VjaDBbMl0gIT09IHBbMl0pIGcudG91Y2gxID0gcCwgZy50YXBzID0gMDtcbiAgICB9XG5cbiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcblxuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBpZiAoZy50YXBzIDwgMikgdG91Y2hmaXJzdCA9IHBbMF0sIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMFswXSA9IHA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMVswXSA9IHA7XG4gICAgfVxuICAgIHQgPSBnLnRoYXQuX196b29tO1xuICAgIGlmIChnLnRvdWNoMSkge1xuICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0sIGwwID0gZy50b3VjaDBbMV0sXG4gICAgICAgICAgcDEgPSBnLnRvdWNoMVswXSwgbDEgPSBnLnRvdWNoMVsxXSxcbiAgICAgICAgICBkcCA9IChkcCA9IHAxWzBdIC0gcDBbMF0pICogZHAgKyAoZHAgPSBwMVsxXSAtIHAwWzFdKSAqIGRwLFxuICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkgKiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7XG4gICAgICB0ID0gc2NhbGUodCwgTWF0aC5zcXJ0KGRwIC8gZGwpKTtcbiAgICAgIHAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07XG4gICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDJdO1xuICAgIH1cbiAgICBlbHNlIGlmIChnLnRvdWNoMCkgcCA9IGcudG91Y2gwWzBdLCBsID0gZy50b3VjaDBbMV07XG4gICAgZWxzZSByZXR1cm47XG5cbiAgICBnLnpvb20oXCJ0b3VjaFwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0O1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDE7XG4gICAgfVxuICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICBpZiAoZy50b3VjaDApIGcudG91Y2gwWzFdID0gdGhpcy5fX3pvb20uaW52ZXJ0KGcudG91Y2gwWzBdKTtcbiAgICBlbHNlIHtcbiAgICAgIGcuZW5kKCk7XG4gICAgICAvLyBJZiB0aGlzIHdhcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuXG4gICAgICBpZiAoZy50YXBzID09PSAyKSB7XG4gICAgICAgIHQgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgICBpZiAoTWF0aC5oeXBvdCh0b3VjaGZpcnN0WzBdIC0gdFswXSwgdG91Y2hmaXJzdFsxXSAtIHRbMV0pIDwgdGFwRGlzdGFuY2UpIHtcbiAgICAgICAgICB2YXIgcCA9IHNlbGVjdCh0aGlzKS5vbihcImRibGNsaWNrLnpvb21cIik7XG4gICAgICAgICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHpvb20ud2hlZWxEZWx0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbERlbHRhID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHpvb20pIDogd2hlZWxEZWx0YTtcbiAgfTtcblxuICB6b29tLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogZmlsdGVyO1xuICB9O1xuXG4gIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgem9vbS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIHpvb20pIDogZXh0ZW50O1xuICB9O1xuXG4gIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2NhbGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGVFeHRlbnRbMF1bMF0gPSArX1swXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzBdID0gK19bMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXSA9ICtfWzBdWzFdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV0gPSArX1sxXVsxXSwgem9vbSkgOiBbW3RyYW5zbGF0ZUV4dGVudFswXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdXSwgW3RyYW5zbGF0ZUV4dGVudFsxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdXV07XG4gIH07XG5cbiAgem9vbS5jb25zdHJhaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29uc3RyYWluID0gXywgem9vbSkgOiBjb25zdHJhaW47XG4gIH07XG5cbiAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uO1xuICB9O1xuXG4gIHpvb20uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCB6b29tKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHpvb20ub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVlO1xuICB9O1xuXG4gIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgem9vbSkgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHpvb20udGFwRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFwRGlzdGFuY2UgPSArXywgem9vbSkgOiB0YXBEaXN0YW5jZTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLy8gaW50ZXJuYWwgaW1wb3J0c1xuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9HZW9DYW52YXMuanMnXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4vTGF5ZXIuanMnXG5pbXBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi9EYXRhc2V0LmpzJ1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJy4vVG9vbHRpcC5qcydcbmltcG9ydCB7IENTVkdyaWQgfSBmcm9tICcuL2RhdGFzZXQvQ1NWR3JpZC5qcydcbmltcG9ydCB7IFRpbGVkR3JpZCB9IGZyb20gJy4vZGF0YXNldC9UaWxlZEdyaWQuanMnXG5pbXBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXIgfSBmcm9tICcuL0JhY2tncm91bmRMYXllci5qcydcbmltcG9ydCB7IEJhY2tncm91bmRMYXllcldNUyB9IGZyb20gJy4vQmFja2dyb3VuZExheWVyV01TLmpzJ1xuaW1wb3J0IHsgTGFiZWxMYXllciB9IGZyb20gJy4vTGFiZWxMYXllci5qcydcbmltcG9ydCB7IExpbmVMYXllciB9IGZyb20gJy4vTGluZUxheWVyLmpzJ1xuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi91dGlscy9VdGlscy5qcydcblxuLy8gZXh0ZXJuYWwgaW1wb3J0c1xuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuXG4vKipcbiAqIEEgZ3JpZHZpeiBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyLCBvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBsYXllcnMuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGF5ZXI+fVxuICAgICAgICAgKiAqL1xuICAgICAgICB0aGlzLmxheWVycyA9IFtdXG5cbiAgICAgICAgLy9nZXQgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWR2aXonKVxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgZmluZCBncmlkdml6IGNvbnRhaW5lciBlbGVtZW50LicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vc2V0IGRpbWVuc2lvbnNcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudyA9IG9wdHMudyB8fCB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oID0gb3B0cy5oIHx8IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodFxuXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBlbGVtZW50IGlmIHVzZXIgZG9lc250IHNwZWNpZnkgb25lXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9ICovXG4gICAgICAgIGxldCBjYW52YXMgPSBvcHRzLmNhbnZhcyB8fCBudWxsXG4gICAgICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY2FudmFzKVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqIE1ha2UgZ2VvIGNhbnZhc1xuICAgICAgICAgKiBAdHlwZSB7R2VvQ2FudmFzfVxuICAgICAgICAgKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNnID0gbmV3IEdlb0NhbnZhcyhjYW52YXMsIHVuZGVmaW5lZCwgMSwgb3B0cylcbiAgICAgICAgdGhpcy5jZy5yZWRyYXcgPSAoc3Ryb25nID0gdHJ1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignU3RhcnQgcmVkcmF3JylcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCI/eD1cIiArIHRoaXMuY2cuZ2V0Q2VudGVyKCkueCArIFwiJnk9XCIgKyB0aGlzLmNnLmdldENlbnRlcigpLnkgKyBcIiZ6PVwiICsgdGhpcy5jZy5nZXRaZigpKVxuXG4gICAgICAgICAgICAvL3JlbW92ZSBsZWdlbmQgZWxlbWVudHNcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZ2VuZCAmJiBzdHJvbmcpIHRoaXMubGVnZW5kLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgICAgIC8vY2xlYXJcbiAgICAgICAgICAgIHRoaXMuY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICB0aGlzLmNnLmNsZWFyKHRoaXMuY2cuYmFja2dyb3VuZENvbG9yKVxuXG4gICAgICAgICAgICBjb25zdCB6ZiA9IHRoaXMuZ2V0Wm9vbUZhY3RvcigpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgYmFja2dyb3VuZCBsYXllcnNcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dCZ0xheWVycylcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuYmdMYXllcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiBsYXllciBpcyB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXIudmlzaWJsZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHpmID4gbGF5ZXIubWF4Wm9vbSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHpmIDwgbGF5ZXIubWluWm9vbSkgY29udGludWVcblxuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmNnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsYXllcnNcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIGxheWVyIGlzIHZpc2libGVcbiAgICAgICAgICAgICAgICBpZiAoIWxheWVyLnZpc2libGUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKHpmID4gbGF5ZXIubWF4Wm9vbSkgY29udGludWVcbiAgICAgICAgICAgICAgICBpZiAoemYgPCBsYXllci5taW5ab29tKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgbGF5ZXIgZGF0YXNldCBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0Q29tcG9uZW50JykuRGF0YXNldENvbXBvbmVudHx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICAgICAgY29uc3QgZHNjID0gbGF5ZXIuZ2V0RGF0YXNldENvbXBvbmVudCh6ZilcbiAgICAgICAgICAgICAgICBpZiAoIWRzYykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbGF1bmNoIGRhdGEgZG93bmxvYWQsIGlmIG5lY2Vzc2FyeVxuICAgICAgICAgICAgICAgIGlmIChzdHJvbmcpXG4gICAgICAgICAgICAgICAgICAgIGRzYy5nZXREYXRhKHRoaXMuY2cuZXh0R2VvLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvL3VwZGF0ZSBkYXRhc2V0IHZpZXcgY2FjaGVcbiAgICAgICAgICAgICAgICBpZiAoc3Ryb25nKSBkc2MudXBkYXRlVmlld0NhY2hlKHRoaXMuY2cuZXh0R2VvKVxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGF5ZXIgYWxwaGEgYW5kIGJsZW5kIG1vZGVcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5nbG9iYWxBbHBoYSA9IGxheWVyLmFscGhhPyBsYXllci5hbHBoYSh6ZikgOiAxLjBcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBsYXllci5ibGVuZE9wZXJhdGlvbih6ZilcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBjZWxscywgc3R5bGUgYnkgc3R5bGVcbiAgICAgICAgICAgICAgICBpZiAoc3Ryb25nKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgbGF5ZXIuc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHN0eWxlIGlzIHZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy52aXNpYmxlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmID4gcy5tYXhab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmIDwgcy5taW5ab29tKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBzdHlsZSBhbHBoYSBhbmQgYmxlbmQgbW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBtdWx0aXBseSBieSBsYXllciBhbHBoYSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5nbG9iYWxBbHBoYSA9IHMuYWxwaGE/IHMuYWxwaGEoemYpIDogMS4wXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBzLmJsZW5kT3BlcmF0aW9uKHpmKVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuZHJhdyhkc2MuZ2V0Vmlld0NhY2hlKCksIGRzYy5nZXRSZXNvbHV0aW9uKCksIHRoaXMuY2cpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vYWRkIGxlZ2VuZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGVnZW5kICYmIHN0cm9uZylcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGxheWVyLnN0eWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmID4gcy5tYXhab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmIDwgcy5taW5ab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsZyBvZiBzLmxlZ2VuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHMsIGxnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5sZWdlbmQuYXBwZW5kKGxnLmRpdilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3MxLm5vZGUoKS5hcHBlbmRDaGlsZChzMi5ub2RlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWdlbmQubm9kZSgpLmFwcGVuZChsZy5kaXYubm9kZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2Nhc2UgZm9yIHN0eWxlcyBvZiBzdHlsZXMsIGxpa2Uga2VybmVsIHNtb290aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGRvIGJldHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbJ3N0eWxlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzMiBvZiBzLnN0eWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPiBzMi5tYXhab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPCBzMi5taW5ab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxnIG9mIHMyLmxlZ2VuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocywgbGcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMubGVnZW5kLmFwcGVuZChsZy5kaXYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3MxLm5vZGUoKS5hcHBlbmRDaGlsZChzMi5ub2RlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZ2VuZC5ub2RlKCkuYXBwZW5kKGxnLmRpdi5ub2RlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9kcmF3IGJvdW5kYXJ5IGxheWVyXG4gICAgICAgICAgICAvL2lmIChzdHJvbmcpXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93Qm91bmRhcmllcyAmJiB0aGlzLmJvdW5kYXJ5TGF5ZXIpIHRoaXMuYm91bmRhcnlMYXllci5kcmF3KHRoaXMuY2cpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYWJlbCBsYXllclxuICAgICAgICAgICAgLy9pZiAoc3Ryb25nKVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0xhYmVscyAmJiB0aGlzLmxhYmVsTGF5ZXIpIHRoaXMubGFiZWxMYXllci5kcmF3KHRoaXMuY2cpXG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ0VuZCByZWRyYXcnKVxuXG4gICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHJlc2l6ZSBldmVudHMgb24gdGhlIEFwcCdzIGNvbnRhaW5lciBhbmQgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgIHRoaXMuZGVmaW5lUmVzaXplT2JzZXJ2ZXIodGhpcy5jb250YWluZXIsIGNhbnZhcylcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPEJhY2tncm91bmRMYXllcnxCYWNrZ3JvdW5kTGF5ZXJXTVM+fSAqL1xuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cbiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnNob3dCZ0xheWVycyA9IHRydWVcblxuICAgICAgICAvKiogQHR5cGUge0xhYmVsTGF5ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMubGFiZWxMYXllciA9IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMuc2hvd0xhYmVscyA9IHRydWVcblxuICAgICAgICAvKiogQHR5cGUge0xpbmVMYXllciB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5ib3VuZGFyeUxheWVyID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zaG93Qm91bmRhcmllcyA9IHRydWVcblxuICAgICAgICAvL2xlZ2VuZCBkaXZcblxuICAgICAgICB0aGlzLmxlZ2VuZERpdklkID0gb3B0cy5sZWdlbmREaXZJZCB8fCAnZ3ZpekxlZ2VuZCdcbiAgICAgICAgdGhpcy5sZWdlbmQgPSBzZWxlY3QoJyMnICsgdGhpcy5sZWdlbmREaXZJZClcbiAgICAgICAgaWYgKHRoaXMubGVnZW5kLmVtcHR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KFxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmlkICYmIHRoaXMuY29udGFpbmVyLmlkICE9ICcnID8gJyMnICsgdGhpcy5jb250YWluZXIuaWQgOiAnYm9keSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIHRoaXMubGVnZW5kRGl2SWQpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2hlaWdodCcsICdhdXRvJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2JhY2tncm91bmQnLCAnI0ZGRkZGRkNDJylcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcInBhZGRpbmdcIiwgdGhpcy5wYWRkaW5nKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdib3JkZXItcmFkaXVzJywgJzVweCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdib3gtc2hhZG93JywgJzNweCAzcHggM3B4IGdyZXksIC0zcHggLTNweCAzcHggI2RkZCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LWZhbWlseScsICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RvcCcsICcyMHB4JylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3JpZ2h0JywgJzIwcHgnKVxuICAgICAgICAgICAgLy9oaWRlXG4gICAgICAgICAgICAvLy5zdHlsZShcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdG9vbHRpcFxuXG4gICAgICAgIC8vIHNldCBBcHAgY29udGFpbmVyIGFzIGRlZmF1bHQgcGFyZW50IGVsZW1lbnQgZm9yIHRvb2x0aXBcbiAgICAgICAgaWYgKCFvcHRzLnRvb2x0aXApIG9wdHMudG9vbHRpcCA9IHt9XG4gICAgICAgIGlmICghb3B0cy50b29sdGlwLnBhcmVudEVsZW1lbnQpIG9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50ID0gdGhpcy5jb250YWluZXJcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge1Rvb2x0aXB9ICovXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKG9wdHMudG9vbHRpcClcblxuICAgICAgICAvKiogQHBhcmFtIHtNb3VzZUV2ZW50fSBlICovXG4gICAgICAgIGNvbnN0IGZvY3VzQ2VsbCA9IChlKSA9PiB7XG4gICAgICAgICAgICAvL2NvbXB1dGUgbW91c2UgZ2VvIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBtb3VzZVBvc2l0aW9uR2VvID0ge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2cucGl4VG9HZW9YKGUub2Zmc2V0WCArIHRoaXMudG9vbHRpcC54TW91c2VPZmZzZXQpLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuY2cucGl4VG9HZW9ZKGUub2Zmc2V0WSArIHRoaXMudG9vbHRpcC55TW91c2VPZmZzZXQpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqIEB0eXBlIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLmdldENlbGxGb2N1c0luZm8obW91c2VQb3NpdGlvbkdlbylcblxuICAgICAgICAgICAgLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoZS5nLiBsZWFmbGV0KSAncmVkIHBhaW50aW5nJyBmaXhcbiAgICAgICAgICAgIGlmIChvcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmIChmb2N1cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNob3coKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZSh0aGlzLmNnLmNhbnZhcywgMCwgMClcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoZm9jdXMuaHRtbClcblxuICAgICAgICAgICAgICAgIC8vc2hvdyBjZWxsIHBvc2l0aW9uIGFzIGEgcmVjdGFuZ2xlXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhbnZhc1NhdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZSh0aGlzLmNnLmNhbnZhcywgMCwgMClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vZHJhdyBpbWFnZSBzYXZlZCArIGRyYXcgcmVjdGFuZ2xlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdFdQaXggPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeChmb2N1cy5yZXNvbHV0aW9uLCB0aGlzLmdldFpvb21GYWN0b3IoKSlcbiAgICAgICAgICAgICAgICAgICAgOiA0XG4gICAgICAgICAgICAgICAgdGhpcy5jZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3JcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5saW5lV2lkdGggPSByZWN0V1BpeFxuICAgICAgICAgICAgICAgIHRoaXMuY2cuY3R4LmJlZ2luUGF0aCgpXG5cbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5yZWN0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLmdlb1RvUGl4WChmb2N1cy5jZWxsLngpIC0gcmVjdFdQaXggLyAyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLmdlb1RvUGl4WShmb2N1cy5jZWxsLnkpICsgcmVjdFdQaXggLyAyLFxuICAgICAgICAgICAgICAgICAgICBmb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZXRab29tRmFjdG9yKCkgKyByZWN0V1BpeCxcbiAgICAgICAgICAgICAgICAgICAgLWZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdldFpvb21GYWN0b3IoKSAtIHJlY3RXUGl4XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMuY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlKSB0aGlzLmNnLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVycyB0byBjb250YWluZXJcbiAgICAgICAgdGhpcy5tb3VzZU92ZXJIYW5kbGVyID0gKGUpID0+IGZvY3VzQ2VsbChlKVxuICAgICAgICB0aGlzLm1vdXNlTW92ZUhhbmRsZXIgPSAoZSkgPT4gZm9jdXNDZWxsKGUpXG4gICAgICAgIHRoaXMubW91c2VPdXRIYW5kbGVyID0gKGUpID0+IHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5tb3VzZU92ZXJIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5tb3VzZU91dEhhbmRsZXIpXG5cbiAgICAgICAgLy8gYWRkIGV4dHJhIGxvZ2ljIHRvIG9uWm9vbVN0YXJ0RnVuXG4gICAgICAgIHRoaXMuY2cub25ab29tU3RhcnRGdW4gPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdHMub25ab29tU3RhcnRGdW4pIG9wdHMub25ab29tU3RhcnRGdW4oZSlcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIG1vdXNlIG92ZXJcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudHxudWxsfSAqL1xuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvciA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgfHwgJ3JlZCdcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeCA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggfHwgKCgpID0+IDQpIC8vKHIsemYpID0+IHt9XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZSA9PiB7IGNvbnNvbGUubG9nKGFyZ3VtZW50cykgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1hcmdpblB4XG4gICAgICogQHJldHVybnMge2ltcG9ydCgnLi9EYXRhc2V0JykuRW52ZWxvcGV9XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHVwZGF0ZUV4dGVudEdlbyhtYXJnaW5QeCA9IDIwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNnLnVwZGF0ZUV4dGVudEdlbyhtYXJnaW5QeClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGNlbGwgSFRNTCBpbmZvIGF0IGEgZ2l2ZW4gZ2VvIHBvc2l0aW9uLlxuICAgICAqIFRoaXMgaXMgdXNlZnVsbCBmb3IgdXNlciBpbnRlcmFjdGlvbnMsIHRvIHNob3cgdGhpcyBpbmZvIHdoZXJlIHRoZSB1c2VyIGNsaWNrcyBmb3IgZXhhbXBsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gcG9zR2VvXG4gICAgICogQHJldHVybnMge3tjZWxsOmltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCxodG1sOnN0cmluZyxyZXNvbHV0aW9uOm51bWJlcn0gfCB1bmRlZmluZWR9XG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGdldENlbGxGb2N1c0luZm8ocG9zR2VvKSB7XG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzLCBzdGFydGluZyBmcm9tIHRvcFxuICAgICAgICBjb25zdCB6ZiA9IHRoaXMuZ2V0Wm9vbUZhY3RvcigpXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxheWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgLyoqIEB0eXBlIHtMYXllcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbaV1cbiAgICAgICAgICAgIGlmICghbGF5ZXIudmlzaWJsZSkgY29udGludWVcbiAgICAgICAgICAgIGlmICghbGF5ZXIuY2VsbEluZm9IVE1MKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGxheWVyLmNlbGxJbmZvSFRNTCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgZHNjID0gbGF5ZXIuZ2V0RGF0YXNldENvbXBvbmVudCh6ZilcbiAgICAgICAgICAgIGlmICghZHNjKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBjZWxsIGF0IG1vdXNlIHBvc2l0aW9uXG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbHx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZHNjLmdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBkc2MuZ2V0Vmlld0NhY2hlKCkpXG4gICAgICAgICAgICBpZiAoIWNlbGwpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcbiAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogZHNjLmdldFJlc29sdXRpb24oKSB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcblxuICAgIC8qKiBAcmV0dXJucyB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gKi9cbiAgICBnZXRHZW9DZW50ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNnLmdldENlbnRlcigpXG4gICAgfVxuICAgIC8qKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRHZW9DZW50ZXIodmFsKSB7XG4gICAgICAgIHRoaXMuY2cuc2V0Q2VudGVyKHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgICBnZXRab29tRmFjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZy5nZXRaZigpXG4gICAgfVxuICAgIC8qKiBAcGFyYW0ge251bWJlcn0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldFpvb21GYWN0b3IodmFsKSB7XG4gICAgICAgIHRoaXMuY2cuc2V0WmYodmFsKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgZ2V0Wm9vbUZhY3RvckV4dGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuZ2V0WmZFeHRlbnQoKVxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldFpvb21GYWN0b3JFeHRlbnQodmFsKSB7XG4gICAgICAgIHRoaXMuY2cuc2V0WmZFeHRlbnQodmFsKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICAgIGdldEJhY2tncm91bmRDb2xvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuYmFja2dyb3VuZENvbG9yXG4gICAgfVxuICAgIC8qKiBAcGFyYW0ge3N0cmluZ30gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldEJhY2tncm91bmRDb2xvcih2YWwpIHtcbiAgICAgICAgdGhpcy5jZy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWxcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0xpbmVMYXllciB8IHVuZGVmaW5lZH0gKi9cbiAgICBnZXRCb3VuZGFyeUxheWVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZGFyeUxheWVyXG4gICAgfVxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRCb3VuZGFyeUxheWVyKG9wdHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZGFyeUxheWVyID0gbmV3IExpbmVMYXllcihvcHRzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7TGFiZWxMYXllciB8IHVuZGVmaW5lZH0gKi9cbiAgICBnZXRMYWJlbExheWVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbExheWVyXG4gICAgfVxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRMYWJlbExheWVyKG9wdHMpIHtcbiAgICAgICAgdGhpcy5sYWJlbExheWVyID0gbmV3IExhYmVsTGF5ZXIob3B0cylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgcmVkcmF3KCkge1xuICAgICAgICB0aGlzLmNnLnJlZHJhdygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGF5ZXIgdG8gdGhlIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0YXNldH0gZGF0YXNldCBUaGUgZGF0YXNldCBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzIG9mIHRoZSBsYXllclxuICAgICAqIEBwYXJhbSB7e3Zpc2libGU/OmJvb2xlYW4sbWluWm9vbT86bnVtYmVyLG1heFpvb20/Om51bWJlcixwaXhOYj86bnVtYmVyLGNlbGxJbmZvSFRNTD86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpzdHJpbmd9fSBvcHRzIFRoZSBsYXllciBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZExheWVyRnJvbURhdGFzZXQoZGF0YXNldCwgc3R5bGVzLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IGxheSA9IG5ldyBMYXllcihkYXRhc2V0LCBzdHlsZXMsIG9wdHMpXG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8vZGF0YXNldCBjcmVhdGlvblxuXG4gICAgLyoqXG4gICAgICogTWFrZSBhIENTViBncmlkIGRhdGFzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdHMgVGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHJldHVybnMge0RhdGFzZXR9XG4gICAgICovXG4gICAgbWFrZUNTVkdyaWREYXRhc2V0KHVybCwgcmVzb2x1dGlvbiwgb3B0cykge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFzZXQoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgbmV3IENTVkdyaWQodXJsLCByZXNvbHV0aW9uLCBvcHRzKS5nZXREYXRhKHVuZGVmaW5lZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBvcHRzXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlIGEgdGlsZWQgZ3JpZCBkYXRhc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7RGF0YXNldH1cbiAgICAgKi9cbiAgICBtYWtlVGlsZWRHcmlkRGF0YXNldCh1cmwsIG9wdHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhc2V0KFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIG5ldyBUaWxlZEdyaWQodXJsLCB0aGlzLCBvcHRzKS5sb2FkSW5mbygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2cucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIG9wdHNcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8vbXVsdGkgc2NhbGUgZGF0YXNldCBjcmVhdGlvblxuXG4gICAgLyoqXG4gICAgICogTWFrZSBhIG11bHRpIHNjYWxlIENTViBncmlkIGRhdGFzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IHJlc1RvVVJMXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFufX0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxuICAgICAqL1xuICAgIG1ha2VNdWx0aVNjYWxlQ1NWR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiBEYXRhc2V0Lm1ha2UoXG4gICAgICAgICAgICByZXNvbHV0aW9ucyxcbiAgICAgICAgICAgIChyZXMpID0+XG4gICAgICAgICAgICAgICAgbmV3IENTVkdyaWQocmVzVG9VUkwocmVzKSwgcmVzLCBvcHRzKS5nZXREYXRhKHVuZGVmaW5lZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBvcHRzXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvL3RpbGVkIG11bHRpc2NhbGVcblxuICAgIC8qKlxuICAgICAqIE1ha2UgYSBtdWx0aSBzY2FsZSB0aWxlZCBncmlkIGRhdGFzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IHJlc1RvVVJMXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFufX0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxuICAgICAqL1xuICAgIG1ha2VNdWx0aVNjYWxlVGlsZWRHcmlkRGF0YXNldChyZXNvbHV0aW9ucywgcmVzVG9VUkwsIG9wdHMpIHtcbiAgICAgICAgcmV0dXJuIERhdGFzZXQubWFrZShcbiAgICAgICAgICAgIHJlc29sdXRpb25zLFxuICAgICAgICAgICAgKHJlcykgPT5cbiAgICAgICAgICAgICAgICBuZXcgVGlsZWRHcmlkKHJlc1RvVVJMKHJlcyksIHRoaXMsIG9wdHMpLmxvYWRJbmZvKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgb3B0c1xuICAgICAgICApXG4gICAgfVxuXG4gICAgLy8gZGlyZWN0IGxheWVyIGNyZWF0aW9uXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYXllciBmcm9tIGEgQ1NWIGdyaWQgZGF0YXNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9TdHlsZScpLlN0eWxlPn0gc3R5bGVzIFRoZSBzdHlsZXMsIG9yZGVyZWQgaW4gZHJhd2luZyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdHMgVGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRhdGFzZXQgYW5kIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZENTVkdyaWRMYXllcih1cmwsIHJlc29sdXRpb24sIHN0eWxlcywgb3B0cykge1xuICAgICAgICBjb25zdCBkcyA9IHRoaXMubWFrZUNTVkdyaWREYXRhc2V0KHVybCwgcmVzb2x1dGlvbiwgb3B0cylcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGF5ZXJGcm9tRGF0YXNldChkcywgc3R5bGVzLCBvcHRzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9TdHlsZScpLlN0eWxlPn0gc3R5bGVzXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86Ym9vbGVhbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyLHBpeE5iPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOnN0cmluZywgcHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFufX0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZFRpbGVkR3JpZExheWVyKHVybCwgc3R5bGVzLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlVGlsZWRHcmlkRGF0YXNldCh1cmwsIG9wdHMpXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYXllciBmcm9tIGEgQ1NWIGdyaWQgZGF0YXNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gcmVzVG9VUkxcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzLCBvcmRlcmVkIGluIGRyYXdpbmcgb3JkZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0IGFuZCBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRNdWx0aVNjYWxlQ1NWR3JpZExheWVyKHJlc29sdXRpb25zLCByZXNUb1VSTCwgc3R5bGVzLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlTXVsdGlTY2FsZUNTVkdyaWREYXRhc2V0KHJlc29sdXRpb25zLCByZXNUb1VSTCwgb3B0cylcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGF5ZXJGcm9tRGF0YXNldChkcywgc3R5bGVzLCBvcHRzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gcmVzVG9VUkxcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlc1xuICAgICAqIEBwYXJhbSB7e3Zpc2libGU/OmJvb2xlYW4sbWluWm9vbT86bnVtYmVyLG1heFpvb20/Om51bWJlcixwaXhOYj86bnVtYmVyLGNlbGxJbmZvSFRNTD86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpzdHJpbmcsIHByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRNdWx0aVNjYWxlVGlsZWRHcmlkTGF5ZXIocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBzdHlsZXMsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgZHMgPSB0aGlzLm1ha2VNdWx0aVNjYWxlVGlsZWRHcmlkRGF0YXNldChyZXNvbHV0aW9ucywgcmVzVG9VUkwsIG9wdHMpXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBiYWNrZ3JvdW5kIGxheWVyIHRvIHRoZSBhcHAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZEJhY2tncm91bmRMYXllcihvcHRzKSB7XG4gICAgICAgIHRoaXMuYmdMYXllcnMucHVzaChuZXcgQmFja2dyb3VuZExheWVyKG9wdHMpKVxuICAgICAgICB0aGlzLnJlZHJhdygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgV01TIGJhY2tncm91bmQgbGF5ZXIgdG8gdGhlIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgYWRkQmFja2dyb3VuZExheWVyV01TKG9wdHMpIHtcbiAgICAgICAgdGhpcy5iZ0xheWVycy5wdXNoKG5ldyBCYWNrZ3JvdW5kTGF5ZXJXTVMob3B0cykpXG4gICAgICAgIHRoaXMucmVkcmF3KClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgYWRkWm9vbVNsaWRlcihpZCwgb3B0cykge1xuICAgICAgICB0aGlzLmNnLmFkZFpvb21TbGlkZXIoaWQsIG9wdHMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldFZpZXdGcm9tVVJMKCkge1xuICAgICAgICB0aGlzLmNnLnNldFZpZXdGcm9tVVJMKClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgcmVzaXplIGV2ZW50IG9ic2VydmVyIHRvIHRoZSBBcHBzIGNvbnRhaW5lciBhbmQgdXBkYXRlIHRoZSBjYW52YXMgYWNjb3JkaW5nbHlcbiAgICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXIgVGhlIEFwcCdzIGNvbnRhaW5lciBlbGVtZW50XG4gICAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzIFRoZSBBcHAgY2FudmFzIGVsZW1lbnRcbiAgICAgKiBAbWVtYmVyb2YgQXBwXG4gICAgICovXG4gICAgZGVmaW5lUmVzaXplT2JzZXJ2ZXIoY29udGFpbmVyLCBjYW52YXMpIHtcbiAgICAgICAgLy8gbGlzdGVuIHRvIHJlc2l6ZSBldmVudHNcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjYW52YXMgaGFzIGJlZW4gYnVpbHRcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuY2xpZW50V2lkdGggPiAwICYmIGNvbnRhaW5lci5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbnQgZXhjZWVkIGxvb3AgbGltaXQgZmlyc3RcbiAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5Mzg0MTIwL3Jlc2l6ZW9ic2VydmVyLWxvb3AtbGltaXQtZXhjZWVkZWRcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpIHx8ICFlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcHAgYW5kIGNhbnZhcyBzaXplXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmggIT09IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgdGhpcy53ICE9PSBjb250YWluZXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudyA9IGNvbnRhaW5lci5jbGllbnRXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5oID0gY29udGFpbmVyLmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBEZXN0cm95IHRoZSBhcHAgYW5kIGl0J3MgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogVGhpcyBzaG91bGQgc2lnbmlmaWNhbnRseSByZWR1Y2UgdGhlIG1lbW9yeSB1c2VkIHdoZW4gY3JlYXRpbmcgYW5kIGRlc3Ryb3lpbmcgZ3JpZHZpeiBhcHAgaW5zdGFuY2VzIChmb3IgZXhhbXBsZSBpbiBsZWFmbGV0LWdyaWR2aXopXG4gICAgICogQG1lbWJlcm9mIEFwcFxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIC8vIGNsZWFyIGxheWVyc1xuICAgICAgICB0aGlzLmxheWVycyA9IFtdXG4gICAgICAgIHRoaXMuYmdMYXllcnMgPSBbXVxuXG4gICAgICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbSBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5tb3VzZU92ZXJIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5tb3VzZU91dEhhbmRsZXIpXG5cbiAgICAgICAgLy8gcmVtb3ZlIGNhbnZhc1xuICAgICAgICB0aGlzLmNnLmNhbnZhcy5yZW1vdmUoKVxuXG4gICAgICAgIC8vIHJlbW92ZSBsZWdlbmRcbiAgICAgICAgdGhpcy5sZWdlbmQ/LnJlbW92ZSgpXG5cbiAgICAgICAgLy8gcmVtb3ZlIHRvb2x0aXBcbiAgICAgICAgdGhpcy50b29sdGlwLnRvb2x0aXA/LnJlbW92ZSgpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGluIFwiU2xpcHB5IG1hcFwiIFhZWiBzdGFuZGFyZC5cbiAqIFNlZSBodHRwczovL3dpa2kub3BlbnN0cmVldG1hcC5vcmcvd2lraS9TbGlwcHlfbWFwX3RpbGVuYW1lc1xuICogaHR0cHM6Ly93d3cubWFwdGlsZXIuY29tL2dvb2dsZS1tYXBzLWNvb3JkaW5hdGVzLXRpbGUtYm91bmRzLXByb2plY3Rpb24vIzYvMjcuODgvNDQuNDhcbiAqIFxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQW4gYXR0cmlidXRlIHRvIHNwZWNpZnkgaWYgYSBsYXllciBzaG91bGQgYmUgZHJhd24gb3Igbm90XG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcblxuICAgICAgICAvKiogVGhlIG1pbmltdW0gem9vbSBmYWN0b3I6IEJlbG93IHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubWluWm9vbSA9IG9wdHMubWluWm9vbSB8fCAwXG5cbiAgICAgICAgLyoqIFRoZSBtYXhpbXVtIHpvb20gZmFjdG9yOiBBYm92ZSB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1heFpvb20gPSBvcHRzLm1heFpvb20gfHwgSW5maW5pdHlcblxuICAgICAgICAvL2Vuc3VyZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3IgdGhlIHpvb20gbGltaXRzLlxuICAgICAgICBpZiAodGhpcy5taW5ab29tID49IHRoaXMubWF4Wm9vbSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcblxuICAgICAgICAvKiogVGhlIGltYWdlIGNhY2hlLCBpbmRleGVkIGJ5IHoveS94ICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmxGdW4gPSBvcHRzLnVybEZ1biB8fCAoKHgsIHksIHopID0+IHRoaXMudXJsICsgeiArICcvJyArIHggKyAnLycgKyB5ICsgJy5wbmcnKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbnMgPSBvcHRzLnJlc29sdXRpb25zXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNvbHV0aW9ucyBwcm92aWRlZCBmb3IgYmFja2dyb3VuZCBsYXllcicpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubmJQaXggPSBvcHRzLm5iUGl4IHx8IDI1NlxuICAgICAgICAvKiogQ1JTIGNvb3JkaW5hdGVzIG9mIHRvcCBsZWZ0IGNvcm5lclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMub3JpZ2luID0gb3B0cy5vcmlnaW4gfHwgWzAsIDBdXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnowID0gb3B0cy56MCB8fCAwXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWx0ZXJDb2xvciA9IG9wdHMuZmlsdGVyQ29sb3IgLy8gKHpmKSA9PiBcIiNlZWU3XCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcmV0dXJucyB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KHosIHgsIHkpIHtcbiAgICAgICAgbGV0IGQgPSB0aGlzLmNhY2hlW3pdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIGQgPSBkW3hdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIHJldHVybiBkW3ldXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHoveC95IGNhY2hlIGRhdGEuXG4gICAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fHN0cmluZ30gaW1nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHJldHVybnNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHB1dChpbWcsIHosIHgsIHkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3pdKSB0aGlzLmNhY2hlW3pdID0ge31cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3pdW3hdKSB0aGlzLmNhY2hlW3pdW3hdID0ge31cbiAgICAgICAgdGhpcy5jYWNoZVt6XVt4XVt5XSA9IGltZ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoY2cpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG4gICAgICAgIGNvbnN0IHgwID0gdGhpcy5vcmlnaW5bMF0sXG4gICAgICAgICAgICB5MCA9IHRoaXMub3JpZ2luWzFdXG5cbiAgICAgICAgLy9nZXQgem9vbSBsZXZlbCBhbmQgcmVzb2x1dGlvblxuICAgICAgICBsZXQgeiA9IDBcbiAgICAgICAgZm9yICh6ID0gMDsgeiA8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoOyB6KyspIGlmICh0aGlzLnJlc29sdXRpb25zW3pdIDwgemYpIGJyZWFrXG4gICAgICAgIHogLT0gMVxuICAgICAgICB6ID0gTWF0aC5tYXgoMCwgeilcbiAgICAgICAgeiA9IE1hdGgubWluKHosIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMSlcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnJlc29sdXRpb25zLmxlbmd0aCwgeilcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5yZXNvbHV0aW9uc1t6XVxuXG4gICAgICAgIHogKz0gdGhpcy56MFxuXG4gICAgICAgIGNvbnN0IHNpemVHID0gdGhpcy5uYlBpeCAqIHJlc1xuICAgICAgICBjb25zdCBzaXplID0gc2l6ZUcgLyB6ZlxuXG4gICAgICAgIC8vZ2V0IHRpbGUgbnVtYmVyc1xuICAgICAgICBjb25zdCB4R2VvVG9UTVMgPSAoeCkgPT4gTWF0aC5jZWlsKCh4IC0geDApIC8gc2l6ZUcpXG4gICAgICAgIGNvbnN0IHlHZW9Ub1RNUyA9ICh5KSA9PiBNYXRoLmNlaWwoLSh5IC0geTApIC8gc2l6ZUcpXG4gICAgICAgIGNvbnN0IHhNaW4gPSB4R2VvVG9UTVMoY2cuZXh0R2VvLnhNaW4pIC0gMVxuICAgICAgICBjb25zdCB4TWF4ID0geEdlb1RvVE1TKGNnLmV4dEdlby54TWF4KVxuICAgICAgICBjb25zdCB5TWF4ID0geUdlb1RvVE1TKGNnLmV4dEdlby55TWluKVxuICAgICAgICBjb25zdCB5TWluID0geUdlb1RvVE1TKGNnLmV4dEdlby55TWF4KSAtIDFcblxuICAgICAgICAvL1RPRE8gP1xuICAgICAgICAvL2NnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgLy9oYW5kbGUgaW1hZ2VzXG4gICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDwgeE1heDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8IHlNYXg7IHkrKykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGltYWdlXG4gICAgICAgICAgICAgICAgbGV0IGltZyA9IHRoaXMuZ2V0KHosIHgsIHkpXG5cbiAgICAgICAgICAgICAgICAvL2xvYWQgaW1hZ2VcbiAgICAgICAgICAgICAgICBpZiAoIWltZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1dChpbWcsIHosIHgsIHkpXG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KCdmYWlsZWQnLCB6LCB4LCB5KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGltZy5zcmMgPSB0aGlzLnVybEZ1bih4LCB5LCB6KVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKGltZyA9PT0gJ2ZhaWxlZCcpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaW1nKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1nLndpZHRoID09IDAgfHwgaW1nLmhlaWdodCA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgeEdlbyA9IHgwICsgeCAqIHNpemVHXG4gICAgICAgICAgICAgICAgY29uc3QgeUdlbyA9IHkwIC0geSAqIHNpemVHXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmRyYXdJbWFnZShpbWcsIGNnLmdlb1RvUGl4WCh4R2VvKSwgY2cuZ2VvVG9QaXhZKHlHZW8pLCBzaXplLCBzaXplKVxuICAgICAgICAgICAgICAgICAgICAvL2NnLmN0eC5kcmF3SW1hZ2UoaW1nLCB4R2VvLCB5R2VvLCBzaXplRywgLXNpemVHKVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9hcHBseSBmaWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyQ29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWx0ZXJDb2xvcih6ZilcbiAgICAgICAgICAgIGlmIChmYyAmJiBmYyAhPSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gZmNcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoMCwgMCwgY2cudywgY2cuaClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKlxuICogQSBtYXAgV01TIGJhY2tncm91bmQgbGF5ZXIuXG4gKiBcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRMYXllcldNUyB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEFuIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGlmIGEgbGF5ZXIgc2hvdWxkIGJlIGRyYXduIG9yIG5vdFxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy52aXNpYmxlID0gb3B0cy52aXNpYmxlID09IGZhbHNlID8gZmFsc2UgOiB0cnVlXG5cbiAgICAgICAgLyoqIFRoZSBtaW5pbXVtIHpvb20gZmFjdG9yOiBCZWxvdyB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1pblpvb20gPSBvcHRzLm1pblpvb20gfHwgMFxuXG4gICAgICAgIC8qKiBUaGUgbWF4aW11bSB6b29tIGZhY3RvcjogQWJvdmUgdGhpcyBsZXZlbCwgdGhlIGxheWVyIGlzIG5vdCBzaG93bi5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XG5cbiAgICAgICAgLy9lbnN1cmUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoZSB6b29tIGxpbWl0cy5cbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgem9vbSBsaW1pdHMgZm9yIGxheWVyLiBab29tIG1pbiBzaG91bGQgYmUgc21hbGxlciB0aGFuIHpvb20gbWF4LicpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZpbHRlckNvbG9yID0gb3B0cy5maWx0ZXJDb2xvciAvLyAoemYpID0+IFwiI2VlZTdcIlxuXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEltYWdlRWxlbWVudHx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuaW1nID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueE1heCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnlNaW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBDaGVjayBpZiB0aGUgdmlldyBoYXMgbW92ZWQgYW5kIGEgbmV3IGltYWdlIG5lZWRzIHRvIGJlIHJldHJpZXZlZC5cbiAgICAgKiBAcHJpdmF0ZSAqL1xuICAgIGhhc01vdmVkKGV4dEdlbykge1xuICAgICAgICBpZiAoKGV4dEdlby54TWluKSAhPSB0aGlzLnhNaW4pIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueE1heCkgIT0gdGhpcy54TWF4KSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIGlmICgoZXh0R2VvLnlNaW4pICE9IHRoaXMueU1pbikgcmV0dXJuIHRydWVcbiAgICAgICAgZWxzZSBpZiAoKGV4dEdlby55TWF4KSAhPSB0aGlzLnlNYXgpIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2cgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGNnKSB7XG5cbiAgICAgICAgLy91cGRhdGUgbWFwIGV4dGVudFxuICAgICAgICBjZy51cGRhdGVFeHRlbnRHZW8oMClcblxuICAgICAgICBpZiAoIXRoaXMuaGFzTW92ZWQoY2cuZXh0R2VvKSAmJiB0aGlzLmltZykge1xuICAgICAgICAgICAgLy90aGUgbWFwIGRpZCBub3QgbW92ZSBhbmQgdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgdGhlIGltYWdlXG4gICAgICAgICAgICBjZy5jdHguZHJhd0ltYWdlKHRoaXMuaW1nLCAwLCAwLCBjZy53LCBjZy5oKVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL3RoZSBtYXAgbW92ZWQ6IHJldHJpZXZlIG5ldyBpbWFnZVxuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdGhpcy54TWluID0gY2cuZXh0R2VvLnhNaW5cbiAgICAgICAgICAgIHRoaXMueE1heCA9IGNnLmV4dEdlby54TWF4XG4gICAgICAgICAgICB0aGlzLnlNaW4gPSBjZy5leHRHZW8ueU1pblxuICAgICAgICAgICAgdGhpcy55TWF4ID0gY2cuZXh0R2VvLnlNYXhcblxuICAgICAgICAgICAgLy9idWlsZCBXTVMgVVJMXG4gICAgICAgICAgICBjb25zdCB1cmwgPSBbXVxuICAgICAgICAgICAgdXJsLnB1c2godGhpcy51cmwpXG4gICAgICAgICAgICB1cmwucHVzaChcIiZ3aWR0aD1cIilcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLncpXG4gICAgICAgICAgICB1cmwucHVzaChcIiZoZWlnaHQ9XCIpXG4gICAgICAgICAgICB1cmwucHVzaChjZy5oKVxuICAgICAgICAgICAgLy9iYm94OiB4bWluIHltaW4geG1heCB5bWF4XG4gICAgICAgICAgICB1cmwucHVzaChcIiZiYm94PVwiKVxuICAgICAgICAgICAgdXJsLnB1c2goY2cuZXh0R2VvLnhNaW4pXG4gICAgICAgICAgICB1cmwucHVzaChcIixcIilcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLmV4dEdlby55TWluKVxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXG4gICAgICAgICAgICB1cmwucHVzaChjZy5leHRHZW8ueE1heClcbiAgICAgICAgICAgIHVybC5wdXNoKFwiLFwiKVxuICAgICAgICAgICAgdXJsLnB1c2goY2cuZXh0R2VvLnlNYXgpXG5cbiAgICAgICAgICAgIGNvbnN0IHVybFMgPSB1cmwuam9pbihcIlwiKVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh1cmxTKVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcgPSBuZXcgSW1hZ2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2cucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJldHJpZXZlIFdNUyBiYWNrZ3JvdW5kIGltYWdlIGZyb21cIiwgdXJsUylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXG4gICAgICAgICAgICB0aGlzLmltZy5zcmMgPSB1cmxTXG4gICAgICAgIH1cblxuICAgICAgICAvL2FwcGx5IGZpbHRlclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyQ29sb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWx0ZXJDb2xvcih6ZilcbiAgICAgICAgICAgIGlmIChmYyAmJiBmYyAhPSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gZmNcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoMCwgMCwgY2cudywgY2cuaClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBBIGdyaWQgY2VsbC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXJ9fSBDZWxsICovXG4vKipcbiAqIEFuIGVudmVsb3BlLlxuICogQHR5cGVkZWYgeyB7eE1pbjogbnVtYmVyLCB4TWF4OiBudW1iZXIsIHlNaW46IG51bWJlciwgeU1heDogbnVtYmVyfSB9IEVudmVsb3BlICovXG5cbi8qKlxuICogQSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgb2YgZ3JpZCBjZWxscy5cbiAqIEl0IGNvbnNpc3RzIG9mIGRpZmZlcmVudCB7QGxpbmsgRGF0YXNldENvbXBvbmVudH1zIGZvciBlYWNoIHJlc29sdXRpb24uXG4gKlxuICogQGFic3RyYWN0XG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRGF0YXNldCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0Q29tcG9uZW50XCIpLkRhdGFzZXRDb21wb25lbnQ+fSBkYXRhc2V0Q29tcG9uZW50cyBUaGUgZGF0YXNldCBjb21wb25lbnRzXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0IGNvbXBvbmVudHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxuICAgICAqIEBwYXJhbSB7IHtwcmVwcm9jZXNzPzpmdW5jdGlvbihDZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXMuIENhbiBiZSB1c2VkIGFsc28gdG8gc2VsZWN0IGNlbGxzIHRvIGtlZXAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YXNldENvbXBvbmVudHMsIHJlc29sdXRpb25zLCBvcHRzID0ge30pIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIGRhdGFzZXQgY29tcG9uZW50cy5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0RhdGFzZXRDb21wb25lbnRcIikuRGF0YXNldENvbXBvbmVudD59ICovXG4gICAgICAgIHRoaXMuZGF0YXNldENvbXBvbmVudHMgPSBkYXRhc2V0Q29tcG9uZW50c1xuXG4gICAgICAgIC8qKiBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXQgY29tcG9uZW50cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uc1xuXG4gICAgICAgIC8vdGhlcmUgbXVzdCBiZSBhcyBtYW55IGRhdGFzZXQgY29tcG9uZW50cyBhcyByZXNvbHV0aW9uc1xuICAgICAgICBpZiAodGhpcy5kYXRhc2V0Q29tcG9uZW50cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldENvbXBvbmVudHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdVbmNvbXBhdGlibGUgbnVtYmVyIG9mIGRhdGFzZXRzIGFuZCByZXNvbHV0aW9uczogJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldENvbXBvbmVudHMubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgIClcblxuICAgICAgICAvL3NldCBkYXRhc2V0IHByZXByb2Nlc3NlcyBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGEgcHJlcHJvY2VzcyBmdW5jdGlvbiBmb3IgYWxsIGRhdGFzZXQgY29tcG9uZW50cy5cbiAgICAgKiBUaGlzIGlzIGEgZnVuY3Rpb24gYXBwbGllZCBvbiBlYWNoIGNlbGwgYWZ0ZXIgaXQgaGFzIGJlZW4gbG9hZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihDZWxsKTpib29sZWFufSBwcmVwcm9jZXNzXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgc2V0UHJlcG9jZXNzZXMocHJlcHJvY2Vzcykge1xuICAgICAgICBmb3IgKGxldCBkcyBvZiB0aGlzLmRhdGFzZXRDb21wb25lbnRzKSBkcy5wcmVwcm9jZXNzID0gcHJlcHJvY2Vzc1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdG8gZWFzZSB0aGUgY3JlYXRpb24gb2YgZGF0YXNldHMgZnJvbSB0aGVpciBjb21wb25lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0IGNvbXBvbmVudHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTppbXBvcnQoXCIuL0RhdGFzZXRDb21wb25lbnRcIikuRGF0YXNldENvbXBvbmVudH0gcmVzVG9EYXRhc2V0Q29tcG9uZW50IEZ1bmN0aW9uIHJldHVybmluZyBhIGRhdGFzZXQgY29tcG9uZW50IGZyb20gYSByZXNvbHV0aW9uXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKENlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlc1xuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxuICAgICAqL1xuICAgIHN0YXRpYyBtYWtlKHJlc29sdXRpb25zLCByZXNUb0RhdGFzZXRDb21wb25lbnQsIG9wdHMpIHtcbiAgICAgICAgLy9tYWtlIGRhdGFzZXQgY29tcG9uZW50c1xuICAgICAgICBjb25zdCBkc2MgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXNvbHV0aW9ucykgZHNjLnB1c2gocmVzVG9EYXRhc2V0Q29tcG9uZW50KHJlcykpXG4gICAgICAgIC8vbWFrZSBkYXRhc2V0XG4gICAgICAgIHJldHVybiBuZXcgRGF0YXNldChkc2MsIHJlc29sdXRpb25zLCBvcHRzKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBBIGRhdGFzZXQgY29tcG9uZW50LCBvZiBncmlkIGNlbGxzLlxuICogQGFic3RyYWN0XG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRGF0YXNldENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24sIGluIHRoZSBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59fSBvcHRzXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHVybCBvZiB0aGUgZGF0YXNldC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IHVybFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IHJlc29sdXRpb25cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBwcmVwcm9jZXNzIHRvIHJ1biBvbiBlYWNoIGNlbGwgYWZ0ZXIgbG9hZGluZy4gSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlIG9yIGNvbXB1dGUgYSBuZXcgY29sdW1uLiBBbmQgYWxzbyB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbHMgdG8ga2VlcCBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFuICl8IHVuZGVmaW5lZCB9ICovXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2VzcyB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogVGhlIGNlbGxzIHdpdGhpbiB0aGUgdmlld1xuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZXh0R2VvXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgZ2V0RGF0YShleHRHZW8sIGNhbGxiYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGdldERhdGEgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkVudmVsb3BlfSBleHRHZW8gVGhlIHZpZXcgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgdXBkYXRlVmlld0NhY2hlIG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNlbGwgdW5kZXIgYSBnaXZlbiBwb3NpdGlvbiwgaWYgYW55LlxuICAgICAqXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzIFNvbWUgY2VsbHMgZnJvbSB0aGUgZGF0YXNldCAoYSBzdWJzZXQgaWYgbmVjZXNzYXJ5LCB1c3VhbGx5IHRoZSB2aWV3IGNhY2hlKS5cbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGx8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBjZWxscykge1xuICAgICAgICAvL2NvbXB1dGUgY2FuZGlkYXRlIGNlbGwgcG9zaXRpb25cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldFJlc29sdXRpb24oKVxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgY29uc3QgY2VsbFggPSByICogTWF0aC5mbG9vcihwb3NHZW8ueCAvIHIpXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICBjb25zdCBjZWxsWSA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby55IC8gcilcblxuICAgICAgICAvL2dldCBjZWxsXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgaWYgKGNlbGwueCAhPSBjZWxsWCkgY29udGludWVcbiAgICAgICAgICAgIGlmIChjZWxsLnkgIT0gY2VsbFkpIGNvbnRpbnVlXG4gICAgICAgICAgICByZXR1cm4gY2VsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcblxuICAgIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICAgIGdldFJlc29sdXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdXRpb25cbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbD59ICovXG4gICAgZ2V0Vmlld0NhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc1ZpZXdDYWNoZVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqIEB0eXBlZGVmIHsge3hNaW46IG51bWJlciwgeE1heDogbnVtYmVyLCB5TWluOiBudW1iZXIsIHlNYXg6IG51bWJlcn0gfSBFbnZlbG9wZSAqL1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5pbXBvcnQgeyB6b29tLCB6b29tSWRlbnRpdHkgfSBmcm9tICdkMy16b29tJ1xuXG4vKipcbiAqIEEgSFRNTCBjYW52YXMgZm9yIGdlbyBkYXRhIGRpc3BsYXksIGVuaGFuY2VkIHdpdGggem9vbSBhbmQgcGFuIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBHZW9DYW52YXMge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjZW50ZXIgR2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gemYgVGhlIHpvb20gZmFjdG9yIChwaXhlbCBzaXplLCBpbiBncm91bmQgbSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgY2VudGVyLCB6Ziwgb3B0cykge1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy53ID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxuXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53XG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaFxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgaWYgKCFjdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgLyoqQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gKi9cbiAgICAgICAgdGhpcy5jdHggPSBjdHhcblxuICAgICAgICAvLyBzZXQgZ2VvIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXJcbiAgICAgICAgdGhpcy5jZW50ZXIgPSBjZW50ZXIgfHwgeyB4OiB0aGlzLncgKiAwLjUsIHk6IHRoaXMuaCAqIDAuNSB9XG5cbiAgICAgICAgLy8gem9vbSBmYWN0b3I6IHBpeGVsIHNpemUsIGluIG0vcGl4XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnpmID0gemZcblxuICAgICAgICAvKiogQmFja2dyb3VuZCBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnd2hpdGUnXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbigpOnZvaWR9ICovXG4gICAgICAgIHRoaXMub25ab29tU3RhcnRGdW4gPSBvcHRzLm9uWm9vbVN0YXJ0RnVuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbigpOnZvaWR9ICovXG4gICAgICAgIHRoaXMub25ab29tRW5kRnVuID0gb3B0cy5vblpvb21FbmRGdW5cblxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKCk6dm9pZH0gKi9cbiAgICAgICAgdGhpcy5vblpvb21GdW4gPSBvcHRzLm9uWm9vbUZ1blxuXG4gICAgICAgIC8vY3VycmVudCBleHRlbnRcbiAgICAgICAgLyoqIEB0eXBlIHtFbnZlbG9wZX0gKi9cbiAgICAgICAgdGhpcy5leHRHZW8gPSB7IHhNaW46IE5hTiwgeE1heDogTmFOLCB5TWluOiBOYU4sIHlNYXg6IE5hTiB9XG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvL3JlbHkgb24gZDMgem9vbSBmb3IgcGFuL3pvb21cbiAgICAgICAgaWYgKCFvcHRzLmRpc2FibGVab29tKSB7XG4gICAgICAgICAgICBsZXQgdFAgPSB6b29tSWRlbnRpdHlcbiAgICAgICAgICAgIGNvbnN0IHogPSB6b29tKClcbiAgICAgICAgICAgICAgICAvL3RvIG1ha2UgdGhlIHpvb21pbmcgYSBiaXQgZmFzdGVyXG4gICAgICAgICAgICAgICAgLndoZWVsRGVsdGEoKGUpID0+IC1lLmRlbHRhWSAqIChlLmRlbHRhTW9kZSA9PT0gMSA/IDAuMDcgOiBlLmRlbHRhTW9kZSA/IDEgOiAwLjAwNCkpXG4gICAgICAgICAgICAgICAgLm9uKCd6b29tJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGUudHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGYgPSB0UC5rIC8gdC5rXG4gICAgICAgICAgICAgICAgICAgIGlmIChmID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeCA9IHRQLnggLSB0LnhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5ID0gdFAueSAtIHQueVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYW4oZHggKiB0aGlzLmdldFpmKCksIC1keSAqIHRoaXMuZ2V0WmYoKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlID0gZS5zb3VyY2VFdmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlIGluc3RhbmNlb2YgV2hlZWxFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9YKGUuc291cmNlRXZlbnQub2Zmc2V0WCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9ZKGUuc291cmNlRXZlbnQub2Zmc2V0WSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlIGluc3RhbmNlb2YgVG91Y2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3VjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR4ID0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHQgb2Ygc2UudGFyZ2V0VG91Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCArPSB0dC5jbGllbnRYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5ICs9IHR0LmNsaWVudFlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLz0gc2UudGFyZ2V0VG91Y2hlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAvPSBzZS50YXJnZXRUb3VjaGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGlzIGF2ZXJhZ2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oZiwgdGhpcy5waXhUb0dlb1godHgpLCB0aGlzLnBpeFRvR2VvWSh0eSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdFAgPSB0XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tRnVuKSB0aGlzLm9uWm9vbUZ1bihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdzdGFydCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZSh0aGlzLmNhbnZhcywgMCwgMClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4ID0gMFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgPSAwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mID0gMVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbVN0YXJ0RnVuKSB0aGlzLm9uWm9vbVN0YXJ0RnVuKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ2VuZCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21FbmRGdW4pIHRoaXMub25ab29tRW5kRnVuKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHooc2VsZWN0KHRoaXMuY2FudmFzKSlcbiAgICAgICAgfVxuICAgICAgICAvL3NlbGVjdCh0aGlzLmNhbnZhcykuY2FsbCh6KTtcblxuICAgICAgICAvKiogWm9vbSBleHRlbnQsIHRvIGxpbWl0IHpvb20gaW4gYW5kIG91dFxuICAgICAgICAgKiAgQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLnpmRXh0ZW50ID0gWzAsIEluZmluaXR5XVxuXG4gICAgICAgIC8qKiBDYW52YXMgc3RhdGUsIHRvIGJlIHVzZWQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVkcmF3cyBvbiB6b29tL3BhblxuICAgICAgICAgKiAgQHR5cGUge3tjOkhUTUxDYW52YXNFbGVtZW50fG51bGwsZHg6bnVtYmVyLGR5Om51bWJlcixmOm51bWJlcn19ICovXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cbiAgICB9XG5cbiAgICAvKiogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSB2IEdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyICovXG4gICAgc2V0Q2VudGVyKHYpIHtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB2XG4gICAgfVxuICAgIC8qKiBAcmV0dXJucyB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gR2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgKi9cbiAgICBnZXRDZW50ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbnRlclxuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge251bWJlcn0gdiBUaGUgem9vbSBmYWN0b3IgKHBpeGVsIHNpemUsIGluIGdyb3VuZCBtKSAqL1xuICAgIHNldFpmKHYpIHtcbiAgICAgICAgdGhpcy56ZiA9IHZcbiAgICAgICAgaWYgKHRoaXMuc2xpZGVyKSB0aGlzLnNsaWRlci5hdHRyKCd2YWx1ZScsICt0aGlzLnpmKVxuICAgIH1cbiAgICAvKiogQHJldHVybnMge251bWJlcn0gVGhlIHpvb20gZmFjdG9yIChwaXhlbCBzaXplLCBpbiBncm91bmQgbSkgKi9cbiAgICBnZXRaZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuemZcbiAgICB9XG5cbiAgICAvKiogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdiAqL1xuICAgIHNldFpmRXh0ZW50KHYpIHtcbiAgICAgICAgdGhpcy56ZkV4dGVudCA9IHZcbiAgICB9XG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICBnZXRaZkV4dGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuemZFeHRlbnRcbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGlzZSBjYW52YXMgdHJhbnNmb3JtIHdpdGggaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uICovXG4gICAgaW5pdENhbnZhc1RyYW5zZm9ybSgpIHtcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgfVxuXG4gICAgLyoqIEluaXRpYWxpc2UgY2FudmFzIHRyYW5zZm9ybSB3aXRoIGdlbyB0byBzY3JlZW4gdHJhbnNmb3JtYXRpb24sIHNvIHRoYXQgZ2VvIG9iamVjdHMgY2FuIGJlIGRyYXduIGRpcmVjdGx5IGluIGdlbyBjb29yZGluYXRlcy4gKi9cbiAgICBzZXRDYW52YXNUcmFuc2Zvcm0oKSB7XG4gICAgICAgIGNvbnN0IGsgPSAxIC8gdGhpcy5nZXRaZigpXG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMuY2VudGVyLnggLyB0aGlzLmdldFpmKCkgKyB0aGlzLncgKiAwLjVcbiAgICAgICAgY29uc3QgdHkgPSB0aGlzLmNlbnRlci55IC8gdGhpcy5nZXRaZigpICsgdGhpcy5oICogMC41XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybShrLCAwLCAwLCAtaywgdHgsIHR5KVxuICAgIH1cblxuICAgIC8qKiBHZXQgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byB3ZWJHTCBzY3JlZW4gY29vcmRpbmF0ZXMsIHdpdGhpbiBbLTEsMV0qWy0xLDFdICovXG4gICAgZ2V0V2ViR0xUcmFuc2Zvcm0oKSB7XG4gICAgICAgIGNvbnN0IGt4ID0gMi4wIC8gKHRoaXMudyAqIHRoaXMuZ2V0WmYoKSlcbiAgICAgICAgY29uc3Qga3kgPSAyLjAgLyAodGhpcy5oICogdGhpcy5nZXRaZigpKVxuICAgICAgICByZXR1cm4gW2t4LCAwLjAsIDAuMCwgMC4wLCBreSwgMC4wLCAta3ggKiB0aGlzLmNlbnRlci54LCAta3kgKiB0aGlzLmNlbnRlci55LCAxLjBdXG4gICAgfVxuXG4gICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGhvdyB0byBkcmF3IHRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdHJvbmcgKi9cbiAgICByZWRyYXcoc3Ryb25nID0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCByZWRyYXcgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIuIFRvIGJlIHVzZWQgYmVmb3JlIGEgcmVkcmF3IGZvciBleGFtcGxlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICAgICAqL1xuICAgIGNsZWFyKGNvbG9yID0gJ3doaXRlJykge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xuICAgICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3R4KSB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHhHZW9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHlHZW9cbiAgICAgKi9cbiAgICBwYW4oZHhHZW8gPSAwLCBkeUdlbyA9IDApIHtcbiAgICAgICAgLy9UT0RPIGZvcmNlIGV4dGVuZCB0byByZW1haW5cbiAgICAgICAgdGhpcy5jZW50ZXIueCArPSBkeEdlb1xuICAgICAgICB0aGlzLmNlbnRlci55ICs9IGR5R2VvXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlLmMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCAtPSBkeEdlbyAvIHRoaXMuZ2V0WmYoKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ICs9IGR5R2VvIC8gdGhpcy5nZXRaZigpXG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgLy8gdGhpcyBkb2VzbnQgd29yayBvbiBtb2JpbGUgaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2dyaWR2aXovaXNzdWVzLzk4XG4gICAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLmMsIHRoaXMuY2FudmFzU2F2ZS5keCwgdGhpcy5jYW52YXNTYXZlLmR5KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZiBUaGUgem9vbSBmYWN0b3IsIHdpdGhpbiBdMCwgSW5maW5pdHldLiAxIGlzIGZvciBubyBjaGFuZ2UuIDwxIHRvIHpvb20taW4sID4xIHRvIHpvb20tb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIFRoZSB4IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5R2VvIFRoZSB5IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxuICAgICAqL1xuICAgIHpvb20oZiA9IDEsIHhHZW8gPSB0aGlzLmNlbnRlci54LCB5R2VvID0gdGhpcy5jZW50ZXIueSkge1xuICAgICAgICAvL1RPRE8gZm9yY2UgZ2VvIGV4dGVuZCB0byByZW1haW5cblxuICAgICAgICAvL3RyeWluZyB0byB6b29tIGluL291dCBiZXlvbmQgbGltaXRcbiAgICAgICAgaWYgKHRoaXMuemZFeHRlbnRbMF0gPT0gdGhpcy5nZXRaZigpICYmIGYgPD0gMSkgcmV0dXJuXG4gICAgICAgIGlmICh0aGlzLnpmRXh0ZW50WzFdID09IHRoaXMuZ2V0WmYoKSAmJiBmID49IDEpIHJldHVyblxuXG4gICAgICAgIC8vZW5zdXJlIHpvb20gZXh0ZW50IHByZXNlcnZlZFxuICAgICAgICBjb25zdCBuZXdaZiA9IGYgKiB0aGlzLmdldFpmKClcbiAgICAgICAgaWYgKG5ld1pmIDwgdGhpcy56ZkV4dGVudFswXSkgZiA9IHRoaXMuemZFeHRlbnRbMF0gLyB0aGlzLmdldFpmKClcbiAgICAgICAgaWYgKG5ld1pmID4gdGhpcy56ZkV4dGVudFsxXSkgZiA9IHRoaXMuemZFeHRlbnRbMV0gLyB0aGlzLmdldFpmKClcblxuICAgICAgICB0aGlzLnNldFpmKGYgKiB0aGlzLmdldFpmKCkpXG4gICAgICAgIGNvbnN0IGR4R2VvID0gKHhHZW8gLSB0aGlzLmNlbnRlci54KSAqICgxIC0gZilcbiAgICAgICAgdGhpcy5jZW50ZXIueCArPSBkeEdlb1xuICAgICAgICBjb25zdCBkeUdlbyA9ICh5R2VvIC0gdGhpcy5jZW50ZXIueSkgKiAoMSAtIGYpXG4gICAgICAgIHRoaXMuY2VudGVyLnkgKz0gZHlHZW9cbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIC8vVE9ET1xuICAgICAgICAvL3RoaXMucmVkcmF3KGZhbHNlKVxuICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlLmMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIodGhpcy5iYWNrZ3JvdW5kQ29sb3IpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAvPSBmXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHggPSB0aGlzLmdlb1RvUGl4WCh4R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgPSB0aGlzLmdlb1RvUGl4WSh5R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHksXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy53aWR0aCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAqIHRoaXMuY2FudmFzU2F2ZS5jLmhlaWdodFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1hcmdpblB4XG4gICAgICogQHJldHVybnMge0VudmVsb3BlfSBUaGUgZW52ZWxvcGUgb2YgdGhlIHZpZXcsIGluIGdlbyBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xuICAgICAgICB0aGlzLmV4dEdlbyA9IHtcbiAgICAgICAgICAgIHhNaW46IHRoaXMucGl4VG9HZW9YKC1tYXJnaW5QeCksXG4gICAgICAgICAgICB4TWF4OiB0aGlzLnBpeFRvR2VvWCh0aGlzLncgKyBtYXJnaW5QeCksXG4gICAgICAgICAgICB5TWluOiB0aGlzLnBpeFRvR2VvWSh0aGlzLmggKyBtYXJnaW5QeCksXG4gICAgICAgICAgICB5TWF4OiB0aGlzLnBpeFRvR2VvWSgtbWFyZ2luUHgpLFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmV4dEdlb1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBvYmplY3QgaGFzIHRvIGJlIGRyYXduXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IG9ialxuICAgICAqL1xuICAgIHRvRHJhdyhvYmopIHtcbiAgICAgICAgaWYgKG9iai54IDwgdGhpcy5leHRHZW8ueE1pbikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChvYmoueCA+IHRoaXMuZXh0R2VvLnhNYXgpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAob2JqLnkgPCB0aGlzLmV4dEdlby55TWluKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG9iai55ID4gdGhpcy5leHRHZW8ueU1heCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy9jb252ZXJzaW9uIGZ1bmN0aW9uc1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIEdlbyB4IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICogQHJldHVybnMge251bWJlcn0gU2NyZWVuIHggY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqL1xuICAgIGdlb1RvUGl4WCh4R2VvKSB7XG4gICAgICAgIHJldHVybiAoeEdlbyAtIHRoaXMuY2VudGVyLngpIC8gdGhpcy5nZXRaZigpICsgdGhpcy53ICogMC41XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5R2VvIEdlbyB5IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICogQHJldHVybnMge251bWJlcn0gU2NyZWVuIHkgY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqL1xuICAgIGdlb1RvUGl4WSh5R2VvKSB7XG4gICAgICAgIHJldHVybiAtKHlHZW8gLSB0aGlzLmNlbnRlci55KSAvIHRoaXMuZ2V0WmYoKSArIHRoaXMuaCAqIDAuNVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBTY3JlZW4geCBjb29yZGluYXRlLCBpbiBwaXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gR2VvIHggY29vcmRpbmF0ZSwgaW4gbS5cbiAgICAgKi9cbiAgICBwaXhUb0dlb1goeCkge1xuICAgICAgICByZXR1cm4gKHggLSB0aGlzLncgKiAwLjUpICogdGhpcy5nZXRaZigpICsgdGhpcy5jZW50ZXIueFxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBTY3JlZW4geSBjb29yZGluYXRlLCBpbiBwaXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gR2VvIHkgY29vcmRpbmF0ZSwgaW4gbS5cbiAgICAgKi9cbiAgICBwaXhUb0dlb1koeSkge1xuICAgICAgICByZXR1cm4gLSh5IC0gdGhpcy5oICogMC41KSAqIHRoaXMuZ2V0WmYoKSArIHRoaXMuY2VudGVyLnlcbiAgICB9XG5cbiAgICAvKiogR2V0IHgseSx6IGVsZW1lbnRzIGZyb20gVVJMIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgdmlldyBjZW50ZXIgYW5kIHpvb20gbGV2ZWwuICovXG4gICAgc2V0Vmlld0Zyb21VUkwoKSB7XG4gICAgICAgIGNvbnN0IHggPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd4JyksXG4gICAgICAgICAgICB5ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneScpLFxuICAgICAgICAgICAgeiA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3onKVxuICAgICAgICBjb25zdCBjID0gdGhpcy5nZXRDZW50ZXIoKVxuICAgICAgICBpZiAoeCAhPSBudWxsICYmIHggIT0gdW5kZWZpbmVkICYmICFpc05hTigreCkpIGMueCA9ICt4XG4gICAgICAgIGlmICh5ICE9IG51bGwgJiYgeSAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt5KSkgYy55ID0gK3lcbiAgICAgICAgaWYgKHogIT0gbnVsbCAmJiB6ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3opKSB0aGlzLnNldFpmKCt6KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRab29tU2xpZGVyKGlkLCBvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgICAgIG9wdHMud2lkdGggPSBvcHRzLndpZHRoIHx8ICczMHB4J1xuICAgICAgICBvcHRzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICczMDBweCdcblxuICAgICAgICAvL3RoZSBkaXYgZWxlbWVudFxuICAgICAgICBjb25zdCBkaXYgPSBzZWxlY3QoJyMnICsgaWQpXG4gICAgICAgIGlmIChkaXYuZW1wdHkoKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGZpbmQgZGl2IGVsZW1lbnQgdG8gYnVpbGQgem9vbSBzbGlkZXIuIElkOiAnICsgaWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGggPSB0aGlzXG4gICAgICAgIC8qKiAqL1xuICAgICAgICB0aGlzLnNsaWRlciA9IGRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnaW5wdXQnKVxuICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAncmFuZ2UnKVxuICAgICAgICAgICAgLmF0dHIoJ21pbicsIHRoaXMuZ2V0WmZFeHRlbnQoKVswXSlcbiAgICAgICAgICAgIC5hdHRyKCdtYXgnLCB0aGlzLmdldFpmRXh0ZW50KClbMV0pXG4gICAgICAgICAgICAuYXR0cigndmFsdWUnLCB0aGlzLmdldFpmKCkpXG4gICAgICAgICAgICAub24oJ2lucHV0JywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMgfHwgIXRoaXMudmFsdWUpIHJldHVyblxuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArdGhpcy52YWx1ZVxuICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5hdHRyKCd2YWx1ZScsIHYpXG4gICAgICAgICAgICAgICAgdGguc2V0WmYodilcbiAgICAgICAgICAgICAgICAvL3JlZHJhd1xuICAgICAgICAgICAgICAgIHRoLnJlZHJhdygpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsIG9wdHMud2lkdGgpXG4gICAgICAgICAgICAuc3R5bGUoJ2hlaWdodCcsIG9wdHMuaGVpZ2h0KVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC43KVxuICAgICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0KHRoaXMpLnN0eWxlKCdvcGFjaXR5JywgMC43KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdHlsZSgnLXdlYmtpdC1hcHBlYXJhbmNlJywgJ3NsaWRlci12ZXJ0aWNhbCcpIC8vZm9yIGNocm9tZVxuICAgICAgICAgICAgLnN0eWxlKCd3cml0aW5nLW1vZGUnLCAnYnQtbHInKSAvL2ZvciBJRS9lZGdlXG4gICAgICAgICAgICAuYXR0cignb3JpZW50JywgJ3ZlcnRpY2FsJykgLy9mb3IgZmlyZWZveFxuICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJ2xpZ2h0Z3JheScpXG4gICAgICAgICAgICAuc3R5bGUoJ291dGxpbmUnLCAnbm9uZScpXG4gICAgICAgICAgICAuc3R5bGUoJy13ZWJraXQtdHJhbnNpdGlvbicsICcuMnMnKVxuICAgICAgICAgICAgLnN0eWxlKCd0cmFuc2l0aW9uJywgJ29wYWNpdHkgLjJzJylcblxuICAgICAgICAvL1RPRE9cbiAgICAgICAgLypzZWxlY3QoXCIuc2xpZGVyOjotd2Via2l0LXNsaWRlci10aHVtYlwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC1hcHBlYXJhbmNlXCIsIFwibm9uZVwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiYXBwZWFyYW5jZVwiLCBcIm5vbmVcIilcbiAgICAgICAgICAgIC5zdHlsZShcIndpZHRoXCIsIFwiMzBweFwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiaGVpZ2h0XCIsIFwiNDBweFwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiYmFja2dyb3VuZFwiLCBcImJsYWNrXCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpKi9cblxuICAgICAgICAvKnNlbGVjdChcInNsaWRlcjo6LW1vei1yYW5nZS10aHVtYlwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC1hcHBlYXJhbmNlXCIsIFwibm9uZVwiKVxuICAgICAgICAgICAgLnN0eWxlKFwid2lkdGhcIiwgXCIzMHB4XCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJoZWlnaHRcIiwgXCI0MHB4XCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJiYWNrZ3JvdW5kXCIsIFwiIzA0QUE2RFwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKSovXG4gICAgICAgIC8qXG4gICAgICAgICAgICAuc2xpZGVyOjptcy10aHVtYixcbiAgICAgICAgLnNsaWRlcjo6LW1vei1yYW5nZS10aHVtYiB7XG4gICAgICAgIH0qL1xuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgVVJMIHBhcmFtZXRlciBieSBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UGFyYW1ldGVyQnlOYW1lKG5hbWUpIHtcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW10vLCAnXFxcXFsnKS5yZXBsYWNlKC9bXFxdXS8sICdcXFxcXScpXG4gICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ1tcXFxcPyZdJyArIG5hbWUgKyAnPShbXiYjXSopJyksXG4gICAgICAgICAgICByZXN1bHRzID0gcmVnZXguZXhlYyhsb2NhdGlvbi5zZWFyY2gpXG4gICAgICAgIHJldHVybiAhcmVzdWx0cyA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0c1sxXS5yZXBsYWNlKC9cXCsvZywgJyAnKSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IGNzdiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKiogQSBsYWJlbC4gVGhlIG5hbWUgaXMgdGhlIHRleHQgdG8gc2hvdy4gKHgseSkgYXJlIHRoZSBjb29yZGluYXRlcyBpbiB0aGUgc2FtZSBDUlMgYXMgdGhlIGdyaWQuXG4gKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgeDpudW1iZXIsIHk6bnVtYmVyIH19IExhYmVsICovXG5cbi8qKlxuICogQSAoZ2VuZXJpYykgbGF5ZXIgZm9yIHBsYWNlbmFtZSBsYWJlbHMsIHRvIGJlIHNob3duIG9uIHRvcCBvZiB0aGUgZ3JpZCBsYXllcnMuXG4gKiBUaGUgaW5wdXQgaXMgYSBDU1YgZmlsZSB3aXRoIHRoZSBwb3NpdGlvbiAoeCwgeSkgb2YgdGhlIGxhYmVscyBhbmQgbmFtZSArIHNvbWUgb3RoZXIgaW5mbyBvbiB0aGUgbGFiZWwgaW1wb3J0YW5jZS5cbiAqIElmIHRoZSBsYWJlbCBkYXRhIGlzIG5vdCBpbiB0aGUgZXhwZWN0ZWQgZm9ybWF0IG9yIGluIHRoZSBzYW1lIENSUyBhcyB0aGUgZ3JpZCwgaXQgY2FuIGJlIGNvcnJlY3RlZCB3aXRoIHRoZSBcInByZXByb2Nlc3NcIiBmdW5jdGlvbi5cbiAqIFRoZSBzZWxlY3Rpb24gb2YgdGhlIGxhYmVsLCB0aGVpciBzdHlsZSAoZm9udCwgd2VpZ2h0LCBldGMuKSBhbmQgY29sb3IgY2FuIGJlIHNwZWNpZmllZCBkZXBlbmRpbmcgb24gdGhlaXIgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGFiZWxMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGxhYmVsIGRhdGEsIGFzIENTViBmaWxlLlxuICAgICAgICAgKiBUaGUgZmlsZSBzaG91bGQgY29udGFpbiB0aGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggbGFiZWwgc3VjaCBhcyB0aGUgdGV4dCwgdGhlIHBvc2l0aW9uIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIGxhYmVsIGFjY29yZGluZyB0byB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogSWYgbmVjZXNzYXJ5LCB0aGlzIGRhdGEgY2FuIGJlIHJlZm9ybWF0ZWQgd2l0aCB0aGUgJ3ByZXByb2Nlc3MnIHBhcmFtZXRlci5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IGlmIGFuZCBob3cgYSBsYWJlbCBzaG91bGQgYmUgZHJhd24sIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zdHlsZSA9IG9wdHMuc3R5bGUgfHwgKCgpID0+ICdib2xkIDFlbSBBcmlhbCcpXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8IChvcHRzLmRhcmsgPyAoKSA9PiAnI2RkZCcgOiAoKSA9PiAnIzIyMicpXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGhhbG8gY29sb3IsIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5oYWxvQ29sb3IgPSBvcHRzLmhhbG9Db2xvciB8fCAob3B0cy5kYXJrID8gKCkgPT4gJyMwMDAwMDBCQicgOiAoKSA9PiAnI0ZGRkZGRkJCJylcblxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgaGFsbyB3aWR0aCwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhhbG9XaWR0aCA9IG9wdHMuaGFsb1dpZHRoIHx8ICgoKSA9PiA0KVxuXG4gICAgICAgIC8qKiBUaGUgYW5jaG9yIHdoZXJlIHRvIGRyYXcgdGhlIHRleHQsIGZyb20gbGFiZWwgcG9zaXRpb24uIFNlZSBIVE1MLWNhbnZhcyB0ZXh0QWxpZ24gcHJvcGVydHkuXG4gICAgICAgICAqIFwibGVmdFwiIHx8IFwicmlnaHRcIiB8fCBcImNlbnRlclwiIHx8IFwic3RhcnRcIiB8fCBcImVuZFwiXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNUZXh0QWxpZ259ICovXG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ24gfHwgJ3N0YXJ0J1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMub2Zmc2V0UGl4ID0gb3B0cy5vZmZzZXRQaXggfHwgWzUsIDVdXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBsYWJlbCBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnByZXByb2Nlc3MgPSBvcHRzLnByZXByb2Nlc3NcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxMYWJlbD4gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMubGFiZWxzID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyB0aGUgbGFiZWwgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2cgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGNnKSB7XG4gICAgICAgIC8vbG9hZCBsYWJlbHMsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmxhYmVscykge1xuICAgICAgICAgICAgdGhpcy5sb2FkKGNnLnJlZHJhdylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICAvL3RleHQgYWxpZ25cbiAgICAgICAgY2cuY3R4LnRleHRBbGlnbiA9IHRoaXMudGV4dEFsaWduIHx8ICdzdGFydCdcblxuICAgICAgICAvL2xpbmUgam9pbiBhbmQgY2FwXG4gICAgICAgIGNnLmN0eC5saW5lSm9pbiA9ICdiZXZlbCcgLy98fCBcInJvdW5kXCIgfHwgXCJtaXRlclwiO1xuICAgICAgICBjZy5jdHgubGluZUNhcCA9ICdidXR0JyAvL3x8IFwicm91bmRcIiB8fCBcInNxdWFyZVwiO1xuXG4gICAgICAgIC8vZHJhdyBpbiBwaXggY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgLy9kcmF3IGxhYmVscywgb25lIGJ5IG9uZVxuICAgICAgICBmb3IgKGNvbnN0IGxiIG9mIHRoaXMubGFiZWxzKSB7XG4gICAgICAgICAgICAvL2dldCBsYWJlbCBzdHlsZVxuICAgICAgICAgICAgY29uc3Qgc3QgPSB0aGlzLnN0eWxlKGxiLCB6ZilcbiAgICAgICAgICAgIGlmICghc3QpIGNvbnRpbnVlXG4gICAgICAgICAgICBjZy5jdHguZm9udCA9IHN0XG5cbiAgICAgICAgICAgIC8vY2hlY2sgbGFiZWwgd2l0aGluIHRoZSB2aWV3LCB0byBiZSBkcmF3blxuICAgICAgICAgICAgaWYgKCFjZy50b0RyYXcobGIpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3Bvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCB4UCA9IGNnLmdlb1RvUGl4WChsYi54KSArIHRoaXMub2Zmc2V0UGl4WzBdXG4gICAgICAgICAgICBjb25zdCB5UCA9IGNnLmdlb1RvUGl4WShsYi55KSAtIHRoaXMub2Zmc2V0UGl4WzFdXG5cbiAgICAgICAgICAgIC8vbGFiZWwgc3Ryb2tlLCBmb3IgdGhlIGhhbG9cbiAgICAgICAgICAgIGlmICh0aGlzLmhhbG9Db2xvciAmJiB0aGlzLmhhbG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhjID0gdGhpcy5oYWxvQ29sb3IobGIsIHpmKVxuICAgICAgICAgICAgICAgIGNvbnN0IGh3ID0gdGhpcy5oYWxvV2lkdGgobGIsIHpmKVxuICAgICAgICAgICAgICAgIGlmIChoYyAmJiBodyAmJiBodyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gaGNcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IGh3XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VUZXh0KGxiLm5hbWUsIHhQLCB5UClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbGFiZWwgZmlsbFxuICAgICAgICAgICAgaWYgKHRoaXMuY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGxiLCB6ZilcbiAgICAgICAgICAgICAgICBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxUZXh0KGxiLm5hbWUsIHhQLCB5UClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVsczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48TGFiZWw+IH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBjc3YodGhpcy51cmwpXG5cbiAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChjKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscyA9IGRhdGFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcblxuICAgICAgICAgICAgLy9yZWRyYXdcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVscyBmcm9tICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQSBsYXllciwgd2hpY2ggc3BlY2lmaWVzIGEgZGF0YXNldCB0byBiZSBzaG93biB3aXRoIHNwZWNpZmllZCBzdHlsZXMuXG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9IGRhdGFzZXQgVGhlIG11bHRpIHJlc29sdXRpb24gZGF0YXNldCB0byBzaG93LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vU3R5bGVcIikuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxuICAgICAqIEBwYXJhbSB7e3Zpc2libGU/OmJvb2xlYW4sYWxwaGE/Om51bWJlcixibGVuZE9wZXJhdGlvbj86R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uLG1pblpvb20/Om51bWJlcixtYXhab29tPzpudW1iZXIscGl4TmI/Om51bWJlcixjZWxsSW5mb0hUTUw/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9fSBvcHRzXG4gICAgICogICAgICBtaW5ab29tOiBUaGUgbWluaW11bSB6b29tIGxldmVsIHdoZW4gdG8gc2hvdyB0aGUgbGF5ZXIuIG1heFpvb206IFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgd2hlbiB0byBzaG93IHRoZSBsYXllclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGFzZXQsIHN0eWxlcywgb3B0cyA9IHt9KSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL0RhdGFzZXRcIikuRGF0YXNldH0gKi9cbiAgICAgICAgdGhpcy5kYXRhc2V0ID0gZGF0YXNldFxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL1N0eWxlXCIpLlN0eWxlPn0gKi9cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXNcblxuICAgICAgICAvKiogQW4gYXR0cmlidXRlIHRvIHNwZWNpZnkgaWYgYSBsYXllciBzaG91bGQgYmUgZHJhd24gb3Igbm90XG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGUgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBhbHBoYSAodHJhbnNwYXJlbmN5L29wYWNpdHkpLCBiZXR3ZWVuIDAuMCAoZnVsbHkgdHJhbnNwYXJlbnQpIGFuZCAxLjAgKGZ1bGx5IG9wYXF1ZSkuXG4gICAgICAgICAqICBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGZhY3Rvci5cbiAgICAgICAgICogKHNlZSBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6IGdsb2JhbEFscGhhIHByb3BlcnR5KVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmFscGhhID0gb3B0cy5hbHBoYVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYmxlbmQgb3BlcmF0aW9uLiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGZhY3Rvci5cbiAgICAgICAgICogKHNlZSBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6IGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUge0dsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbn0gKi9cbiAgICAgICAgdGhpcy5ibGVuZE9wZXJhdGlvbiA9IG9wdHMuYmxlbmRPcGVyYXRpb24gfHwgKHpmID0+ICdub3JtYWwnKVxuXG4gICAgICAgIC8qKiBUaGUgbWluaW11bSB6b29tIGZhY3RvcjogQmVsb3cgdGhpcyBsZXZlbCwgdGhlIGxheWVyIGlzIG5vdCBzaG93bi5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5taW5ab29tID0gb3B0cy5taW5ab29tIHx8IDBcblxuICAgICAgICAvKiogVGhlIG1heGltdW0gem9vbSBmYWN0b3I6IEFib3ZlIHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubWF4Wm9vbSA9IG9wdHMubWF4Wm9vbSB8fCBJbmZpbml0eVxuXG4gICAgICAgIC8vZW5zdXJlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgem9vbSBsaW1pdHMuXG4gICAgICAgIGlmICh0aGlzLm1pblpvb20gPj0gdGhpcy5tYXhab29tKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHpvb20gbGltaXRzIGZvciBsYXllci4gWm9vbSBtaW4gc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiB6b29tIG1heC4nKVxuXG4gICAgICAgIC8qKiBVbml0OiBudW1iZXIgb2YgcGl4ZWxzXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMucGl4TmIgPSBvcHRzLnBpeE5iIHx8IDNcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHJldHVybmluZyBjZWxsIGluZm9ybWF0aW9uIGFzIEhUTUwuXG4gICAgICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHRvb2x0aXAgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCwgbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY2VsbEluZm9IVE1MID0gb3B0cy5jZWxsSW5mb0hUTUwgfHwgTGF5ZXIuZGVmYXVsdENlbGxJbmZvSFRNTFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBjb21wb25lbnQgZm9yIGEgc3BlY2lmaWVkIHpvb20gZmFjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpmXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4vRGF0YXNldENvbXBvbmVudFwiKS5EYXRhc2V0Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAgICAgKiAqL1xuICAgIGdldERhdGFzZXRDb21wb25lbnQoemYpIHtcbiAgICAgICAgaWYgKHpmIDwgdGhpcy5taW5ab29tIHx8IHpmID4gdGhpcy5tYXhab29tKSByZXR1cm5cblxuICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGl0aCBzaW5nbGUgY29tcG9uZW50IGRhdGFzZXRcbiAgICAgICAgaWYgKHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50c1swXVxuXG4gICAgICAgIGNvbnN0IHJzID0gdGhpcy5kYXRhc2V0LnJlc29sdXRpb25zXG4gICAgICAgIGxldCBpID0gMFxuICAgICAgICBsZXQgeiA9IHJzW2ldIC8gdGhpcy5waXhOYlxuICAgICAgICB3aGlsZSAoeiA8IHpmICYmIGkgPCBycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgeiA9IHJzW2ldIC8gdGhpcy5waXhOYlxuICAgICAgICB9XG4gICAgICAgIC8vaWYgKGkgPT0gMCkgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50c1swXTtcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzW2kgLSAxXTtcbiAgICAgICAgaWYgKGkgPT0gcnMubGVuZ3RoKSByZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzW3JzLmxlbmd0aCAtIDFdXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFzZXQuZGF0YXNldENvbXBvbmVudHNbaV1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiByZXR1cm5pbmcgY2VsbCBpbmZvcm1hdGlvbiBhcyBIVE1MLlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHRvb2x0aXAgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsfSBjZWxsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmYXVsdENlbGxJbmZvSFRNTChjZWxsKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IFtdXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNlbGwpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneCcpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneScpIGNvbnRpbnVlXG4gICAgICAgICAgICBidWYucHVzaCgnPGI+Jywga2V5LCAnPC9iPicsICcgOiAnLCBjZWxsW2tleV0sICc8YnI+JylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmLmpvaW4oJycpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBsZWdlbmQgY29udGFpbmVyLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIExlZ2VuZCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaWQgPSBvcHRzLmlkXG5cbiAgICAgICAgLy9UT0RPIHN0b3AgdXNpbmcgaXQuIFVzZSBzdHlsZSBtZXRob2QgYmVsb3cgaW5zdGVhZC5cblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy50b3AgPSBvcHRzLnRvcFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5ib3R0b20gPSBvcHRzLmJvdHRvbVxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5sZWZ0ID0gb3B0cy5sZWZ0XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnJpZ2h0ID0gb3B0cy5yaWdodFxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICdub25lJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5wYWRkaW5nID0gb3B0cy5wYWRkaW5nIHx8ICc1cHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJvcmRlciA9IG9wdHMuYm9yZGVyIHx8ICcwcHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzWydib3JkZXItcmFkaXVzJ10gPSBvcHRzWydib3JkZXItcmFkaXVzJ10gfHwgJ25vbmUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzWydib3gtc2hhZG93J10gPSBvcHRzWydib3gtc2hhZG93J10gfHwgJ25vbmUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzWydmb250LWZhbWlseSddID0gb3B0c1snZm9udC1mYW1pbHknXSB8fCAnSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZidcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XG5cbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIHRoaXMuaWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmRpdiB8fCB0aGlzLmRpdi5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcbiAgICAgICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdi5hdHRyKCdpZCcsIHRoaXMuaWQpXG4gICAgICAgIH1cblxuICAgICAgICAvL3NldCBzdHlsZVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxuXG4gICAgICAgIGlmICh0aGlzLndpZHRoKSB0aGlzLmRpdi5zdHlsZSgnd2lkdGgnLCB0aGlzLndpZHRoKVxuICAgICAgICBpZiAodGhpcy5oZWlnaHQpIHRoaXMuZGl2LnN0eWxlKCdoZWlnaHQnLCB0aGlzLmhlaWdodClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIHN0eWxlIHRvIHRoZSBsZWdlbmQgZGl2LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBzdHlsZShrLCB2KSB7XG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKGssIHYpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdMZWdlbmQgdXBkYXRlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IGpzb24gfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMaW5lTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBmZWF0dXJlIGFmdGVyIGxvYWRpbmcuXG4gICAgICAgICAqIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSwgZm9ybWF0IHRoZSBsYWJlbCBkYXRhLCBwcm9qZWN0IGNvb3JkaW5hdGVzLCBldGMuXG4gICAgICAgICAqIFJldHVybiBmYWxzZSBpZiB0aGUgbGFiZWwgc2hvdWxkIG5vdCBiZSBrZXB0LlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0KTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnByZXByb2Nlc3MgPSBvcHRzLnByZXByb2Nlc3NcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChmLCB6ZikgPT4gJ2dyYXknKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChmLCB6ZikgPT4gMilcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpBcnJheS48bnVtYmVyPnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMubGluZURhc2ggPSBvcHRzLmxpbmVEYXNoIHx8ICgoZiwgemYpID0+IHVuZGVmaW5lZClcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxvYmplY3Q+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZzID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhjZykge1xuICAgICAgICAvL2xvYWQgZGF0YSwgaWYgbm90IGRvbmUgeWV0LlxuICAgICAgICBpZiAoIXRoaXMuZnMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZChjZy5yZWRyYXcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETyBzb3J0IGxpbmVzIGJ5IHdpZHRoID9cblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIC8vZHJhdyBpbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgdGhpcy5mcykge1xuICAgICAgICAgICAgY29uc3QgY3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG4gICAgICAgICAgICBpZiAoY3MubGVuZ3RoIDwgMikgY29udGludWVcblxuICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoZiwgemYpXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vc2V0IGxpbmV3aWR0aFxuICAgICAgICAgICAgY29uc3Qgd1AgPSB0aGlzLndpZHRoKGYsIHpmKVxuICAgICAgICAgICAgaWYgKCF3UCB8fCB3UCA8IDApIGNvbnRpbnVlXG4gICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd1AgKiB6ZlxuXG4gICAgICAgICAgICAvL3NldCBsaW5lIGRhc2hcbiAgICAgICAgICAgIGNvbnN0IGxkUCA9IHRoaXMubGluZURhc2goZiwgemYpXG4gICAgICAgICAgICBpZiAobGRQKSBjZy5jdHguc2V0TGluZURhc2gobGRQKVxuXG4gICAgICAgICAgICAvL2RyYXcgbGluZVxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjZy5jdHgubW92ZVRvKGNzWzBdWzBdLCBjc1swXVsxXSlcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY3MubGVuZ3RoOyBpKyspIGNnLmN0eC5saW5lVG8oY3NbaV1bMF0sIGNzW2ldWzFdKVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvLy4uLlxuICAgICAgICBjZy5jdHguc2V0TGluZURhc2goW10pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkYXRhIGZvciBsYWJlbHMsIGZyb20gVVJMIHRoaXMudXJsXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBib3VuZGFyaWVzOiBObyBVUkwgc3BlY2lmaWVkLiAnICsgdGhpcy51cmwpXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuXG5cbiAgICAgICAgLy9sb2FkIGRhdGFcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFfID0gYXdhaXQganNvbih0aGlzLnVybClcblxuICAgICAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPG9iamVjdD4gfSAqL1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGRhdGFfLmZlYXR1cmVzXG5cbiAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZzID0gW11cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXG4gICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZzLnB1c2goYylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vc3RvcmUgbGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5mcyA9IGRhdGFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcblxuICAgICAgICAgICAgLy9yZWRyYXdcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGJvdW5kYXJpZXMgZnJvbSAnICsgdGhpcy51cmwpXG4gICAgICAgICAgICB0aGlzLmZzID0gW11cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogU3RhdGlzdGljcyBvZiBhIHNldCBvZiB2YWx1ZXNcbiAqIEB0eXBlZGVmIHt7bWluOm51bWJlcixtYXg6bnVtYmVyfX0gU3RhdCAqL1xuXG4vKiogQHR5cGVkZWYge1wic3F1YXJlXCJ8XCJjaXJjbGVcInxcImRpYW1vbmRcInxcImRvbnV0XCJ8XCJub25lXCJ9IFNoYXBlICovXG5cbi8qKlxuICogQSBzdHlsZSwgdG8gc2hvdyBhIGdyaWQgZGF0YXNldC5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZSB7XG4gICAgLyoqXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHt7ZmlsdGVyPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW4sb2Zmc2V0PzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9LHZpc2libGU/OmJvb2xlYW4sYWxwaGE/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyLGJsZW5kT3BlcmF0aW9uPzpmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyfX0gb3B0c1xuICAgICAqICAgICAgbWluWm9vbTogVGhlIG1pbmltdW0gem9vbSBsZXZlbCB3aGVuIHRvIHNob3cgdGhlIGxheWVyLiBtYXhab29tOiBUaGUgbWF4aW11bSB6b29tIGxldmVsIHdoZW4gdG8gc2hvdyB0aGUgbGF5ZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIHRoZSBjZWxsIGxpc3QsIHRvIGZpbHRlciBvdXQgc29tZSBjZWxscyBub3QgdG8gYmUgZHJhd24gKHN1Y2ggYXMgZm9yIGV4YW1wbGUgdGhlIGNlbGxzIHdpdGggdmFsdWU9MCkuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5maWx0ZXIgPSBvcHRzLmZpbHRlciB8fCAoKCkgPT4gdHJ1ZSlcblxuICAgICAgICAvKiogQW4gb2Zmc2V0LiBUaGlzIGlzIHRvIGFsdGVyIHRoZSBwb3NpdGlvbiBvZiBhbGwgc3ltYm9scyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gSW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCxudW1iZXIsbnVtYmVyKTp7ZHg6bnVtYmVyLGR5Om51bWJlcn19ICovXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb3B0cy5vZmZzZXQgfHwgKChjLCByLCB6ZikgPT4gKHsgZHg6IDAsIGR5OiAwIH0pKVxuXG4gICAgICAgIC8qKiBBbiBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBhIHN0eWxlIHNob3VsZCBiZSBkcmF3biBvciBub3RcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IG9wdHMudmlzaWJsZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGFscGhhICh0cmFuc3BhcmVuY3kvb3BhY2l0eSksIGJldHdlZW4gMC4wIChmdWxseSB0cmFuc3BhcmVudCkgYW5kIDEuMCAoZnVsbHkgb3BhcXVlKS5cbiAgICAgICAgICogIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gZmFjdG9yLlxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQWxwaGEgcHJvcGVydHkpXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuYWxwaGEgPSBvcHRzLmFscGhhXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBibGVuZCBvcGVyYXRpb24uIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gZmFjdG9yLlxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIHByb3BlcnR5KVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb259ICovXG4gICAgICAgIHRoaXMuYmxlbmRPcGVyYXRpb24gPSBvcHRzLmJsZW5kT3BlcmF0aW9uIHx8ICh6ZiA9PiAnbm9ybWFsJylcblxuICAgICAgICAvKiogVGhlIG1pbmltdW0gem9vbSBmYWN0b3I6IEJlbG93IHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqICovXG4gICAgICAgIHRoaXMubWluWm9vbSA9IG9wdHMubWluWm9vbSB8fCAwXG5cbiAgICAgICAgLyoqIFRoZSBtYXhpbXVtIHpvb20gZmFjdG9yOiBBYm92ZSB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiAqL1xuICAgICAgICB0aGlzLm1heFpvb20gPSBvcHRzLm1heFpvb20gfHwgSW5maW5pdHlcblxuICAgICAgICAvL2Vuc3VyZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3IgdGhlIHpvb20gbGltaXRzLlxuICAgICAgICBpZiAodGhpcy5taW5ab29tID49IHRoaXMubWF4Wm9vbSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHB1YmxpY1xuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vTGVnZW5kXCIpLkxlZ2VuZD59ICovXG4gICAgICAgIHRoaXMubGVnZW5kcyA9IFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbD59IGNlbGxzIFRoZSBjZWxscyB0byBkcmF3LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2cgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZW0uXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgZHJhdyhjZWxscywgcmVzb2x1dGlvbiwgY2cpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcblxuICAgIC8qKiBAcmV0dXJucyB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gKi9cbiAgICBnZXRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IHZhbFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBIaWRlIGFsbCBsZWdlbmQgZWxlbWVudHMgb2YgdGhlIHN0eWxlLCBpZiBhbnlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHVwZGF0ZUxlZ2VuZHMob3B0cykge1xuICAgICAgICBmb3IgKGNvbnN0IGxnIG9mIHRoaXMubGVnZW5kcykgbGcudXBkYXRlKG9wdHMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBzb21lIHN0YXRpc3RpY3Mgb24gYSB2YWx1ZSBvZiBzb21lIGNlbGxzLlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgaG93IHRvIGRyYXcgc3BlY2lmaWNhbGx5IHRoZSBjZWxscyB3aXRoaW4gdGhlIHZpZXcuXG4gICAgICogVE9ETzogY29tcHV0ZSBtZWRpYW4gP1xuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6bnVtYmVyfSB2YWxGdW5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVplcm9zXG4gICAgICogQHJldHVybnMge1N0YXQgfCB1bmRlZmluZWR9XG4gICAgICovXG4gICAgc3RhdGljIGdldFN0YXRpc3RpY3MoY2VsbHMsIHZhbEZ1biwgaWdub3JlWmVyb3MpIHtcbiAgICAgICAgaWYgKCFjZWxscyB8fCBjZWxscy5sZW5ndGggPT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICBsZXQgbWluID0gSW5maW5pdHlcbiAgICAgICAgbGV0IG1heCA9IC1JbmZpbml0eVxuICAgICAgICAvL2xldCBzdW0gPSAwXG4gICAgICAgIC8vbGV0IG5iID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSArdmFsRnVuKGNlbGwpXG4gICAgICAgICAgICBpZiAoaWdub3JlWmVyb3MgJiYgIXYpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAodiA8IG1pbikgbWluID0gdlxuICAgICAgICAgICAgaWYgKHYgPiBtYXgpIG1heCA9IHZcbiAgICAgICAgICAgIC8vc3VtICs9IHZcbiAgICAgICAgICAgIC8vbmIrK1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1pbjogbWluLCBtYXg6IG1heCB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG4vL2ltcG9ydCB7IHRyYW5zaXRpb24gfSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBjbGFzcyB0byBtYWtlIGEgdG9vbHRpcC5cbiAqIEl0IGlzIGEgZGl2IGVsZW1lbnQsIHdoaWNoIGNhbiBiZSBtb3ZlZCB1bmRlciB0aGUgbW91c2UgcG9pbnRlciBhbmQgZmlsbGVkIHdpdGggc29tZSBpbmZvcm1hdGlvbiBpbiBodG1sLlxuICovXG5leHBvcnQgY2xhc3MgVG9vbHRpcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZGl2ID0gb3B0cy5kaXYgfHwgJ3Rvb2x0aXBfZXVyb3N0YXQnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLm1heFdpZHRoID0gb3B0cy5tYXhXaWR0aCB8fCAnMjBlbSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8ICcxLjJlbSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IG9wdHMuYmFja2dyb3VuZCB8fCAnd2hpdGUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuYm9yZGVyID0gb3B0cy5ib3JkZXIgfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnNXB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICc1cHggNXB4IDVweCBncmV5J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpc1snZm9udC1mYW1pbHknXSA9IG9wdHNbJ2ZvbnQtZmFtaWx5J10gfHwgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uID0gb3B0cy50cmFuc2l0aW9uRHVyYXRpb24gfHwgMTAwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnhPZmZzZXQgPSBvcHRzLnhPZmZzZXQgfHwgMzBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueU9mZnNldCA9IG9wdHMueU9mZnNldCB8fCAyMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gLy8gZS5nLiB0byBwcmV2ZW50IG1vdXNlIGN1cnNvciBjb3ZlcmluZyBjZWxsIGJlaW5nIGhpZ2hsaWdodGVkXG4gICAgICAgIHRoaXMueU1vdXNlT2Zmc2V0ID0gb3B0cy55TW91c2VPZmZzZXQgfHwgMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy54TW91c2VPZmZzZXQgPSBvcHRzLnhNb3VzZU9mZnNldCB8fCAwXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovXG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IG9wdHMucGFyZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwdWJsaWNcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcImQzLXNlbGVjdGlvblwiKS5TZWxlY3Rpb259ICovXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IHNlbGVjdCgnIycgKyB0aGlzLmRpdilcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcC5lbXB0eSgpKVxuICAgICAgICAgICAgdGhpcy50b29sdGlwID0gc2VsZWN0KFxuICAgICAgICAgICAgICAgICcjJyArIHRoaXMucGFyZW50RWxlbWVudC5pZCAmJiB0aGlzLnBhcmVudEVsZW1lbnQuaWQgIT0gJydcbiAgICAgICAgICAgICAgICAgICAgPyAnIycgKyB0aGlzLnBhcmVudEVsZW1lbnQuaWRcbiAgICAgICAgICAgICAgICAgICAgOiAnYm9keSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIHRoaXMuZGl2KVxuXG4gICAgICAgIC8vaW5pdGlhbGlzZVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ21heC13aWR0aCcsIHRoaXMubWF4V2lkdGgpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnb3ZlcmZsb3cnLCAnaGlkZGVuJylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmZvbnRTaXplKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JhY2tncm91bmQnLCB0aGlzLmJhY2tncm91bmQpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncGFkZGluZycsIHRoaXMucGFkZGluZylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdib3JkZXItcmFkaXVzJywgdGhpc1snYm9yZGVyLXJhZGl1cyddKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JveC1zaGFkb3cnLCB0aGlzWydib3gtc2hhZG93J10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdvcGFjaXR5JywgJzAnKVxuXG4gICAgICAgIC8vIGFyaWEtbGFiZWxzICh0aGFua3MgdG8gd2FobGF0bGFzKVxuICAgICAgICB0aGlzLnRvb2x0aXAuYXR0cigncm9sZScsICd0b29sdGlwJykuYXR0cignYXJpYS1saXZlJywgJ3BvbGl0ZScpXG4gICAgfVxuXG4gICAgLyoqIFNob3cgdGhlIHRvb2x0aXAgKi9cbiAgICBzaG93KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICB9XG5cbiAgICAvKiogSGlkZSB0aGUgdG9vbHRpcCAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy50b29sdGlwLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29udGVudCBvZiB0aGUgdG9vbHRpcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICAgICAqL1xuICAgIGh0bWwoaHRtbCkge1xuICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChodG1sKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXAgYXQgdGhlIG1vdXNlIGV2ZW50IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzZXRQb3NpdGlvbihldmVudCkge1xuICAgICAgICBsZXQgcGFyZW50UmVjdCA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuXG4gICAgICAgIHRoaXMudG9vbHRpcFxuICAgICAgICAgICAgLnN0eWxlKCdsZWZ0JywgZXZlbnQucGFnZVggLSBwYXJlbnRSZWN0LmxlZnQgKyB0aGlzLnhPZmZzZXQgKyAncHgnKVxuICAgICAgICAgICAgLnN0eWxlKCd0b3AnLCBldmVudC5wYWdlWSAtIHBhcmVudFJlY3QudG9wIC0gdGhpcy55T2Zmc2V0ICsgJ3B4JylcblxuICAgICAgICB0aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QpXG4gICAgfVxuXG4gICAgLypcblx0bXkubW91c2VvdmVyID0gZnVuY3Rpb24gKGV2ZW50LCBodG1sKSB7XG5cdFx0aWYgKGh0bWwpIG15Lmh0bWwoaHRtbCk7XG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xuXHRcdG15LnNob3coKVxuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XG5cdH07XG5cdFxuXHRteS5tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRteS5zZXRQb3NpdGlvbihldmVudCk7XG5cdFx0Ly90aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoKTtcblx0fTtcblx0XG5cdG15Lm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkge1xuXHRcdG15LmhpZGUoKTtcblx0fTsqL1xuXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLnN0eWxlKGspXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGF0dHIoaywgdikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLmF0dHIoaylcbiAgICAgICAgdGhpcy50b29sdGlwLmF0dHIoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb24gZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lclxuICAgICAqIEBkZXNjcmlwdGlvbiBQcmV2ZW50cyB0aGUgdG9vbHRpcCBmcm9tIG92ZXJmbG93aW5nIG91dCBvZiB0aGUgQXBwIGNvbnRhaW5lciAoZW5zdXJlcyB0aGF0IHRoZSB0b29sdGlwIGlzIGluc2lkZSB0aGUgZ3JpZHZpeiBjb250YWluZXIpXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqIEBwYXJhbSB7RE9NUmVjdH0gcGFyZW50UmVjdFxuICAgICAqL1xuICAgIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIgPSBmdW5jdGlvbiAoZXZlbnQsIHBhcmVudFJlY3QpIHtcbiAgICAgICAgbGV0IHR0Tm9kZSA9IHRoaXMudG9vbHRpcC5ub2RlKClcblxuICAgICAgICAvL3RvbyBmYXIgcmlnaHRcbiAgICAgICAgbGV0IG1heFJpZ2h0ID0gcGFyZW50UmVjdC53aWR0aFxuICAgICAgICBsZXQgdHRSaWdodCA9IHR0Tm9kZS5vZmZzZXRMZWZ0ICsgdHROb2RlLmNsaWVudFdpZHRoXG4gICAgICAgIGlmICh0dFJpZ2h0ID4gbWF4UmlnaHQpIHtcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gZXZlbnQucGFnZVggLSBwYXJlbnRSZWN0LmxlZnQgLSB0dE5vZGUuY2xpZW50V2lkdGggLSB0aGlzLnhPZmZzZXRcbiAgICAgICAgICAgIHR0Tm9kZS5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCdcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIG1vdXNlIGNvdmVycyB0b29sdGlwXG4gICAgICAgICAgICBpZiAodHROb2RlLm9mZnNldExlZnQgKyB0dE5vZGUuY2xpZW50V2lkdGggKyBwYXJlbnRSZWN0LmxlZnQgPiBldmVudC5wYWdlWCkge1xuICAgICAgICAgICAgICAgIC8vbW92ZSB0b29sdGlwIGxlZnQgc28gaXQgZG9lc250IGNvdmVyIG1vdXNlXG4gICAgICAgICAgICAgICAgbGV0IGxlZnQyID0gZXZlbnQucGFnZVggLSAodHROb2RlLmNsaWVudFdpZHRoICsgdGhpcy54T2Zmc2V0ICsgcGFyZW50UmVjdC5sZWZ0KVxuICAgICAgICAgICAgICAgIHR0Tm9kZS5zdHlsZS5sZWZ0ID0gbGVmdDIgKyAncHgnXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3RvbyBmYXIgZG93blxuICAgICAgICBpZiAodHROb2RlLm9mZnNldFRvcCArIHR0Tm9kZS5jbGllbnRIZWlnaHQgPiBwYXJlbnRSZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgdHROb2RlLnN0eWxlLnRvcCA9IHR0Tm9kZS5vZmZzZXRUb3AgLSB0dE5vZGUuY2xpZW50SGVpZ2h0ICsgJ3B4J1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlIH19IEdyaWRJbmZvICovXG5cbmltcG9ydCB7IGNzdiB9IGZyb20gJ2QzLWZldGNoJ1xuaW1wb3J0IHsgRGF0YXNldENvbXBvbmVudCB9IGZyb20gJy4uL0RhdGFzZXRDb21wb25lbnQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGEgc2luZ2xlIENTViBmaWxlIChub3QgdGlsZWQpLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENTVkdyaWQgZXh0ZW5kcyBEYXRhc2V0Q29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzooZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFuKX19IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHJlc29sdXRpb24sIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcih1cmwsIHJlc29sdXRpb24sIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gKi9cbiAgICAgICAgdGhpcy5jZWxscyA9IFtdXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcml2YXRlICAqL1xuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gcmVkcmF3XG4gICAgICovXG4gICAgZ2V0RGF0YShlLCByZWRyYXcpIHtcbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm4gdGhpc1xuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcbiAgICAgICAgOyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBjc3YodGhpcy51cmwpXG5cbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgY29vcmRpbmF0ZXMgaW4gbnVtYmVyc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGMueCA9ICtjLnhcbiAgICAgICAgICAgICAgICAgICAgYy55ID0gK2MueVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2goYylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBkYXRhXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIGlmIHJlZHJhdyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAvL3RoYXQgaXMgaWYgdGhlIGRhdGFzZXQgYmVsb25ncyB0byBhIGxheWVyIHdoaWNoIGlzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbFxuXG4gICAgICAgICAgICAgICAgLy9leGVjdXRlIHRoZSBjYWxsYmFjaywgdXN1YWxseSBhIGRyYXcgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICBpZiAocmVkcmF3KSByZWRyYXcoKVxuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vZGF0YSBub3QgbG9hZGVkIHlldFxuICAgICAgICBpZiAoIXRoaXMuY2VsbHMpIHJldHVyblxuXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEEgZ3JpZCB0aWxlLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdyaWRUaWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxscyBUaGUgdGlsZSBjZWxscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFQgVGhlIFggcG9zaXRpb24gb2YgdGhlIHRpbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlUIFRoZSBZIHBvc2l0aW9uIG9mIHRoZSB0aWxlLlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9DU1ZHcmlkXCIpLkdyaWRJbmZvfSBncmlkSW5mbyBUaGUgZ3JpZCBpbmZvIG9iamVjdC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjZWxscywgeFQsIHlULCBncmlkSW5mbykge1xuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzID0gY2VsbHNcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueCA9IHhUXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnkgPSB5VFxuXG4gICAgICAgIGNvbnN0IHIgPSBncmlkSW5mby5yZXNvbHV0aW9uR2VvXG4gICAgICAgIGNvbnN0IHMgPSBncmlkSW5mby50aWxlU2l6ZUNlbGxcblxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV9ICovXG4gICAgICAgIHRoaXMuZXh0R2VvID0ge1xuICAgICAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGhpcy54LFxuICAgICAgICAgICAgeE1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogKHRoaXMueCArIDEpLFxuICAgICAgICAgICAgeU1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogdGhpcy55LFxuICAgICAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRoaXMueSArIDEpLFxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb252ZXJ0IGNlbGwgY29vcmRpbmF0ZXMgaW50byBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICAgICAgICBjZWxsLnggPSB0aGlzLmV4dEdlby54TWluICsgY2VsbC54ICogclxuICAgICAgICAgICAgY2VsbC55ID0gdGhpcy5leHRHZW8ueU1pbiArIGNlbGwueSAqIHJcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqIEB0eXBlZGVmIHt7IGRpbXM6IG9iamVjdCwgY3JzOiBzdHJpbmcsIHRpbGVTaXplQ2VsbDogbnVtYmVyLCBvcmlnaW5Qb2ludDoge3g6bnVtYmVyLHk6bnVtYmVyfSwgcmVzb2x1dGlvbkdlbzogbnVtYmVyLCB0aWxpbmdCb3VuZHM6aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZSwgZm9ybWF0OmltcG9ydChcIi4uL0RhdGFzZXRDb21wb25lbnRcIikuRm9ybWF0IH19IEdyaWRJbmZvICovXG5cbi8vIGludGVybmFsXG5pbXBvcnQgeyBHcmlkVGlsZSB9IGZyb20gJy4vR3JpZFRpbGUuanMnXG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuLi9BcHAuanMnXG5pbXBvcnQgeyBEYXRhc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vRGF0YXNldENvbXBvbmVudC5qcydcbmltcG9ydCB7IG1vbml0b3IsIG1vbml0b3JEdXJhdGlvbiB9IGZyb20gJy4uL3V0aWxzL1V0aWxzLmpzJ1xuXG4vLyBleHRlcm5hbFxuaW1wb3J0IHsganNvbiwgY3N2IH0gZnJvbSAnZDMtZmV0Y2gnXG5cbi8qKlxuICogQSB0aWxlZCBkYXRhc2V0LCBjb21wb3NlZCBvZiBDU1YgdGlsZXMuXG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgVGlsZWRHcmlkIGV4dGVuZHMgRGF0YXNldENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7QXBwfSBhcHAgVGhlIGFwcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OihmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW4pIH19IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGFwcCwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHVybCwgMCwgb3B0cylcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFwcCBiZWluZyB1c2VkLlxuICAgICAgICAgKiBAdHlwZSB7QXBwfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hcHAgPSBhcHBcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGdyaWQgaW5mbyBvYmplY3QsIGZyb20gdGhlIGluZm8uanNvbiBmaWxlLlxuICAgICAgICAgKiAgQHR5cGUge0dyaWRJbmZvIHwgdW5kZWZpbmVkfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiAgKi9cbiAgICAgICAgdGhpcy5pbmZvID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcml2YXRlICAqL1xuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIG9mIHRoZSBsb2FkZWQgdGlsZXMuIEl0IGlzIGRvdWJsZSBpbmRleGVkOiBieSB4VCBhbmQgdGhlbiB5VC5cbiAgICAgICAgICogRXhhbXBsZTogdGhpcy5jYWNoZVt4VF1beVRdIHJldHVybnMgdGhlIHRpbGUgYXQgW3hUXVt5VF0gbG9jYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgaW5mby5qc29uIGZyb20gdGhlIHVybC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xuICAgICAqIEByZXR1cm5zIHRoaXNcbiAgICAgKi9cbiAgICBsb2FkSW5mbyhjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuaW5mbyAmJiB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnbm90TG9hZGVkJykge1xuICAgICAgICAgICAgOyAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBqc29uKHRoaXMudXJsICsgJ2luZm8uanNvbicpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mbyA9IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gZGF0YS5yZXNvbHV0aW9uR2VvXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvL21hcmsgYXMgZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKClcbiAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFjayAmJiAodGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ2xvYWRlZCcgfHwgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ2ZhaWxlZCcpKVxuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgYSB0aWxpbmcgZW52ZWxvcGUgZnJvbSBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0byB1c2UgdG8ga25vdyB3aGljaCB0aWxlcyB0byBkb3dubG9hZCBmb3IgYSBnZW9ncmFwaGljYWwgdmlldy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZVxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXRUaWxpbmdFbnZlbG9wZShlKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbmZvKCgpID0+IHsgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG8gPSB0aGlzLmluZm8ub3JpZ2luUG9pbnQsXG4gICAgICAgICAgICByID0gdGhpcy5pbmZvLnJlc29sdXRpb25HZW8sXG4gICAgICAgICAgICBzID0gdGhpcy5pbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TWluOiBNYXRoLmZsb29yKChlLnhNaW4gLSBwby54KSAvIChyICogcykpLFxuICAgICAgICAgICAgeE1heDogTWF0aC5mbG9vcigoZS54TWF4IC0gcG8ueCkgLyAociAqIHMpKSxcbiAgICAgICAgICAgIHlNaW46IE1hdGguZmxvb3IoKGUueU1pbiAtIHBvLnkpIC8gKHIgKiBzKSksXG4gICAgICAgICAgICB5TWF4OiBNYXRoLmZsb29yKChlLnlNYXggLSBwby55KSAvIChyICogcykpLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV9IGV4dEdlb1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSByZWRyYXdGdW5cbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBnZXREYXRhKGV4dEdlbywgcmVkcmF3RnVuKSB7XG4gICAgICAgIC8vVE9ETyBlbXB0eSBjYWNoZSB3aGVuIGl0IGdldHMgdG9vIGJpZyA/XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbmZvIGhhcyBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuIHRoaXNcblxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcbiAgICAgICAgaWYgKCF0YikgcmV0dXJuIHRoaXNcblxuICAgICAgICAvL2dyaWQgYm91bmRzXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gKi9cbiAgICAgICAgY29uc3QgZ2IgPSB0aGlzLmluZm8udGlsaW5nQm91bmRzXG5cbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHlUID0gTWF0aC5tYXgodGIueU1pbiwgZ2IueU1pbik7IHlUIDw9IE1hdGgubWluKHRiLnlNYXgsIGdiLnlNYXgpOyB5VCsrKSB7XG4gICAgICAgICAgICAgICAgLy9wcmVwYXJlIGNhY2hlXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgdGhpcy5jYWNoZVt4VF0gPSB7fVxuXG4gICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aWxlIGV4aXN0cyBpbiB0aGUgY2FjaGVcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge0dyaWRUaWxlfSAqL1xuICAgICAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXG4gICAgICAgICAgICAgICAgaWYgKHRpbGUpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL21hcmsgdGlsZSBhcyBsb2FkaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt4VF1beVRdID0gJ2xvYWRpbmcnXG4gICAgICAgICAgICAgICAgICAgIDsgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVxdWVzdCB0aWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZWxsc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59ICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsICsgeFQgKyAnLycgKyB5VCArICcuY3N2JylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBUaWxlZEdyaWQgcGFyc2Ugc3RhcnQnKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdwcmVwcm9jZXNzIC8gZmlsdGVyJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgdGlsZSBpbiBjYWNoZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaWxlIGluZm8gaW5rbm93bicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aWxlXyA9IG5ldyBHcmlkVGlsZShjZWxscywgeFQsIHlULCB0aGlzLmluZm8pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSB0aWxlX1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdzdG9yYWdlJylcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBubyByZWRyYXcgaXMgc3BlY2lmaWVkLCB0aGVuIGxlYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZHJhd0Z1bikgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgcmVkcmF3IGlzIHJlYWxseSBuZWVkZWQsIHRoYXQgaXMgaWY6XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWRyYXcgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsYXllcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpmID0gdGhpcy5hcHAuZ2V0Wm9vbUZhY3RvcigpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxheSBvZiB0aGlzLmFwcC5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheS52aXNpYmxlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXkuZ2V0RGF0YXNldENvbXBvbmVudCh6ZikgIT0gdGhpcykgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvdW5kIG9uZSBsYXllci4gTm8gbmVlZCB0byBzZWVrIG1vcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdjaGVjayByZWRyYXcgMScpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVkcmF3KSByZXR1cm5cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhlIHRpbGUgaXMgd2l0aGluIHRoZSB2aWV3LCB0aGF0IGlzIGl0cyBnZW8gZW52ZWxvcGUgaW50ZXJzZWN0cyB0aGUgdmlld2VyIGdlbyBlbnZlbG9wZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudiA9IHRoaXMuYXBwLnVwZGF0ZUV4dGVudEdlbygpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZUID0gdGlsZV8uZXh0R2VvXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnhNYXggPD0gZW52VC54TWluKSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnYueE1pbiA+PSBlbnZULnhNYXgpIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudi55TWF4IDw9IGVudlQueU1pbikgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnlNaW4gPj0gZW52VC55TWF4KSByZXR1cm5cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignY2hlY2sgcmVkcmF3IDInKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIFRpbGVkR3JpZCBwYXJzZSBlbmQnKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3JlZHJhd1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3RnVuKClcbiAgICAgICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cblxuICAgICAgICAvL2NoZWNrIGlmIGluZm8gaGFzIGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICghdGhpcy5pbmZvKSByZXR1cm5cblxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcbiAgICAgICAgaWYgKCF0YikgcmV0dXJuXG5cbiAgICAgICAgLy9ncmlkIGJvdW5kc1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV9ICovXG4gICAgICAgIGNvbnN0IGdiID0gdGhpcy5pbmZvLnRpbGluZ0JvdW5kc1xuXG4gICAgICAgIGZvciAobGV0IHhUID0gTWF0aC5tYXgodGIueE1pbiwgZ2IueE1pbik7IHhUIDw9IE1hdGgubWluKHRiLnhNYXgsIGdiLnhNYXgpOyB4VCsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FjaGVbeFRdKSBjb250aW51ZVxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcbiAgICAgICAgICAgICAgICAvL2dldCB0aWxlXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtHcmlkVGlsZX0gKi9cbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHR5cGVvZiB0aWxlID09PSAnc3RyaW5nJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGxzXG4gICAgICAgICAgICAgICAgLy90aGlzLmNlbGxzVmlld0NhY2hlID0gdGhpcy5jZWxsc1ZpZXdDYWNoZS5jb25jYXQodGlsZS5jZWxscylcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbG9yIGNhdGVncm9yaWVzLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbG9yQ2F0ZWdvcnlMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2NvbC9jYXRlZ29yaWVzIGFycmF5LCBpbiBkaXNwbGF5IG9yZGVyXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPEFycmF5LjxzdHJpbmc+Pn0gKi9cbiAgICAgICAgdGhpcy5jb2xDYXQgPSBvcHRzLmNvbENhdCB8fCBbWydncmF5JywgJy0nXV1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4uL1N0eWxlXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IG9wdHMuZGltZW5zaW9uIHx8IHsgcjogOCB9XG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICdncmF5J1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXG5cbiAgICAgICAgdGhpcy50aXRsZSA9IG9wdHMudGl0bGVcbiAgICAgICAgdGhpcy50aXRsZUZvbnRTaXplID0gb3B0cy50aXRsZUZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IG9wdHMubGFiZWxGb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdHlsZSwgcjogbnVtYmVyLCB6ZjogbnVtYmVyLCBzU2l6ZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0NvbG9yOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy9idWlsZFxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgaWYgKHRoaXMudGl0bGUpXG4gICAgICAgICAgICB0aGlzLmRpdlxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLnRpdGxlRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICc3cHgnKVxuICAgICAgICAgICAgICAgIC50ZXh0KHRoaXMudGl0bGUpXG5cbiAgICAgICAgLy9jYXRlZ29yaWVzXG4gICAgICAgIGNvbnN0IG5iID0gdGhpcy5jb2xDYXQubGVuZ3RoXG4gICAgICAgIGlmIChuYiA9PSAwKSByZXR1cm5cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IHRoaXMuY29sQ2F0W2ldXG5cbiAgICAgICAgICAgIC8vbWFrZSBkaXYgZm9yIGNhdGVnb3J5XG4gICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLy90byBlbmFibGUgdmVydGljYWwgY2VudGVyaW5nXG4gICAgICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIilcblxuICAgICAgICAgICAgY29uc3Qgc3cgPSB0aGlzLnN0cm9rZVdpZHRoXG5cbiAgICAgICAgICAgIC8vZHJhdyBncmFwaGljIGVsZW1lbnQ6IGJveCAvIGNpcmNsZVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuZGltZW5zaW9uLmggfHwgMTVcbiAgICAgICAgICAgICAgICBjb25zdCB3ID0gdGhpcy5kaW1lbnNpb24udyB8fCAyMFxuICAgICAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcblxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3ICsgMiAqIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaCArIDIgKiBzdylcblxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3knLCBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNhdFswXSlcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuZGltZW5zaW9uLnIgfHwgOFxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSAyICogciArIDIgKiBzd1xuICAgICAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcblxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBoKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcblxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeScsIHIgKyBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3InLCByKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjYXRbMF0pXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHRoaXMuc2hhcGUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vd3JpdGUgbGFiZWwgdGV4dFxuICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgLy9zaG93IG9uIHJpZ2h0IG9mIGdyYXBoaWNcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcblxuICAgICAgICAgICAgICAgIC8vY2VudGVyIHZlcnRpY2FsbHlcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwiYWJzb2x1dGVcIikuc3R5bGUoXCJ0b3BcIiwgXCIwXCIpLnN0eWxlKFwiYm90dG9tXCIsIFwiMFwiKVxuXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgICAgICAudGV4dChjYXRbMV0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBkaXNjcmV0ZSBjb2xvciBzdHlsZS5cbiAqIEluc3BpcmF0aW9uOiBodHRwczovL29ic2VydmFibGVocS5jb20vQGQzL2NvbG9yLWxlZ2VuZFxuICpcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbG9yRGlzY3JldGVMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHByaXZhdGUgQHR5cGUge0FycmF5LjxBcnJheS48c3RyaW5nPj59ICovXG4gICAgICAgIHRoaXMuY29sb3JzID0gb3B0cy5jb2xvcnNcbiAgICAgICAgLyoqIEBwcml2YXRlIEB0eXBlIHtBcnJheS48QXJyYXkuPHN0cmluZz4+fSAqL1xuICAgICAgICB0aGlzLmJyZWFrc1RleHQgPSBvcHRzLmJyZWFrc1RleHRcblxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAzMDBcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxuXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMudGl0bGVGb250V2VpZ2h0ID0gb3B0cy50aXRsZUZvbnRXZWlnaHQgfHwgJ2JvbGQnXG5cbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgM1xuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5pbnZlcnQgPSBvcHRzLmludmVydFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3R5bGUsIHI6IG51bWJlciwgemY6IG51bWJlciwgc1NpemU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB9fSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vYnVpbGRcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKVxuICAgICAgICAgICAgdGhpcy5kaXZcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ21hcmdpbi1ib3R0b20nLCAnN3B4JylcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuXG4gICAgICAgIC8vY2xhc3Nlc1xuICAgICAgICBjb25zdCBuYiA9IHRoaXMuY29sb3JzLmxlbmd0aFxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoIC8gbmJcblxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kaXZcbiAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0aGlzLndpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIgKyAxMClcblxuICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSAqIHcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIHRoaXMuY29sb3JzW2ldKVxuICAgICAgICB9XG5cbiAgICAgICAgLy90aWNrIGxpbmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIH1cblxuICAgICAgICAvL2xhYmVsc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIC8vcHJlcGFyZSBsYWJlbFxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ3RpY2tsYWJlbF8nICsgaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIHcgKiBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC1mYW1pbHlcIiwgXCJBcmlhbFwiKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCBpID09IDAgPyAnc3RhcnQnIDogaSA9PSB0aGlzLnRpY2tzIC0gMSA/ICdlbmQnIDogJ21pZGRsZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy5icmVha3NUZXh0W2kgLSAxXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vTGVnZW5kLmpzJ1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZDMtZm9ybWF0J1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbnRpbnVvdXMgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xvckxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIHRoaXMuY29sb3JSYW1wID0gb3B0cy5jb2xvclJhbXBcblxuICAgICAgICAvL2Z1bmN0aW9uICh0WzAsMV0sIHIsIHMpIC0+IHYgKGZvciBsYWJlbCB0ZXh0KVxuICAgICAgICB0aGlzLmZ1biA9IG9wdHMuZnVuXG5cbiAgICAgICAgdGhpcy50aXRsZSA9IG9wdHMudGl0bGVcbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgNlxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAzMDBcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxuICAgICAgICB0aGlzLm1hcmdpbiA9IG9wdHMubWFyZ2luIHx8IDVcbiAgICAgICAgdGhpcy50aWNrcyA9IG9wdHMudGlja3MgfHwgTWF0aC5mbG9vcih0aGlzLndpZHRoIC8gNTApXG4gICAgICAgIHRoaXMudGlja0Zvcm1hdCA9IG9wdHMudGlja0Zvcm1hdCB8fCAnLC4wZidcbiAgICAgICAgdGhpcy50aWNrVW5pdCA9IG9wdHMudGlja1VuaXRcblxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gb3B0cy5pbnZlcnRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3sgc3R5bGU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNTaXplOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0LCBzQ29sb3I6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQgfX0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY291bGQgaGFwcGVuIHdoZW4gZGF0YSBpcyBzdGlsbCBsb2FkaW5nXG4gICAgICAgIGlmICghb3B0cy5zQ29sb3IpIHJldHVyblxuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICBjb25zdCB0aXRsZUhlaWdodCA9IDEyXG5cbiAgICAgICAgY29uc3Qgc3ZnVyA9IHRoaXMud2lkdGggKyAyICogdGhpcy5tYXJnaW5cbiAgICAgICAgY29uc3Qgc3ZnSCA9IHRoaXMuaGVpZ2h0ICsgMyAqIHRoaXMubWFyZ2luICsgdGl0bGVIZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMTBcbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kaXYuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHN2Z1cpLmF0dHIoJ2hlaWdodCcsIHN2Z0gpXG4gICAgICAgIC8vICA8cmVjdCB3aWR0aD1cIjMwMFwiIGhlaWdodD1cIjEwMFwiIHN0eWxlPVwiZmlsbDpyZ2IoMCwwLDI1NSk7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlOnJnYigwLDAsMClcIiAvPlxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cigneCcsIHRoaXMubWFyZ2luKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCB0aGlzLm1hcmdpbilcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzAuOGVtJylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnYm9sZCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScsICd0b3AnKVxuICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcbiAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuXG4gICAgICAgIGNvbnN0IGcgPSBzdmdcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHRoaXMubWFyZ2luICsgJyAnICsgKDIgKiB0aGlzLm1hcmdpbiArIHRpdGxlSGVpZ2h0KSArICcpJylcblxuICAgICAgICAvL2RyYXcgY29sb3IgYmFyXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoLFxuICAgICAgICAgICAgaCA9IHRoaXMuaGVpZ2h0XG4gICAgICAgIGNvbnN0IHN0ZXAgPSA1XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdzsgaSArPSBzdGVwKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGkgLyAodyAtIDEpXG4gICAgICAgICAgICBpZiAodGhpcy5pbnZlcnQpIHQgPSAxIC0gdFxuICAgICAgICAgICAgZy5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc3RlcClcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmNvbG9yUmFtcCh0KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50aWNrczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGkgLyAodGhpcy50aWNrcyAtIDEpXG5cbiAgICAgICAgICAgIC8vdGljayBsaW5lXG4gICAgICAgICAgICBnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgdyAqIHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB3ICogdClcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCBoICsgdGhpcy50aWNrU2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdibGFjaycpXG5cbiAgICAgICAgICAgIC8vcHJlcGFyZSB0aWNrIGxhYmVsXG4gICAgICAgICAgICBnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ3RpY2tsYWJlbF8nICsgaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIHcgKiB0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgaCArIHRoaXMudGlja1NpemUgKyAyKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5mb250U2l6ZSlcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC1mYW1pbHlcIiwgXCJBcmlhbFwiKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCBpID09IDAgPyAnc3RhcnQnIDogaSA9PSB0aGlzLnRpY2tzIC0gMSA/ICdlbmQnIDogJ21pZGRsZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgICAvLy50ZXh0KFwiLVwiKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgdGljayBsYWJlbHNcblxuICAgICAgICAvL2xhYmVsIHRleHQgZm9ybWF0XG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLnRpY2tGb3JtYXQgJiYgdGhpcy50aWNrRm9ybWF0ICE9ICd0ZXh0JyA/IGZvcm1hdCh0aGlzLnRpY2tGb3JtYXQpIDogKHYpID0+IHZcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh0aGlzLnRpY2tzIC0gMSlcblxuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuZnVuKHQsIG9wdHMuciwgb3B0cy5zQ29sb3IpXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gKHYgPyBmKHYpIDogJzAnKSArICh0aGlzLnRpY2tVbml0ID8gdGhpcy50aWNrVW5pdCA6ICcnKVxuXG4gICAgICAgICAgICAvL3RpY2sgbGFiZWxcbiAgICAgICAgICAgIHRoaXMuZGl2LnNlbGVjdCgnIycgKyAndGlja2xhYmVsXycgKyBpKS50ZXh0KHRleHQpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBzZWdtZW50IG9yaWVudGF0aW9uLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNlZ21lbnRPcmllbnRhdGlvbkxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy50aXRsZSA9IG9wdHMudGl0bGVcbiAgICAgICAgdGhpcy50aXRsZUZvbnRTaXplID0gb3B0cy50aXRsZUZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcblxuICAgICAgICAvL2V4YWdlcmF0aW9uXG4gICAgICAgIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yID0gb3B0cy5leGFnZ2VyYXRpb25GYWN0b3IgfHwgMC41XG5cbiAgICAgICAgLy9jb2xvclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAnZ3JheSdcbiAgICAgICAgLy9vcmllbnRhdGlvblxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXG4gICAgICAgIC8vd2lkdGhcbiAgICAgICAgdGhpcy53aWR0aFBpeCA9IG9wdHMud2lkdGhQaXggfHwgM1xuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TZWdtZW50U3R5bGVcIikuU2VnbWVudFN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0xlbmd0aDogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc1dpZHRoOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xuICAgICAgICBpZiAoIW9wdHMuc1dpZHRoKSByZXR1cm5cblxuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKSB7XG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgd2lkdGggYW5kIGxlbmd0aCwgaW4gcGl4XG4gICAgICAgIGNvbnN0IHNXaWR0aCA9IHRoaXMud2lkdGhQaXhcbiAgICAgICAgY29uc3Qgc0xlbmd0aCA9ICgxICogb3B0cy5yKSAvIG9wdHMuemZcblxuICAgICAgICAvL2RyYXcgU1ZHIHNlZ21lbnRcbiAgICAgICAgY29uc3Qgc3ZnUyA9IE1hdGgubWF4KHNMZW5ndGgsIHNXaWR0aClcbiAgICAgICAgY29uc3Qgc3ZnID0gZC5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgc3ZnUykuYXR0cignaGVpZ2h0Jywgc3ZnUykuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxuICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbigoLXRoaXMub3JpZW50YXRpb24gKiBNYXRoLlBJKSAvIDE4MClcbiAgICAgICAgY29uc3QgZGMgPSBzdmdTICogMC41LFxuICAgICAgICAgICAgbDIgPSBzTGVuZ3RoICogMC41XG4gICAgICAgIHN2Zy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgLmF0dHIoJ3gxJywgZGMgLSBjb3MgKiBsMilcbiAgICAgICAgICAgIC5hdHRyKCd5MScsIGRjIC0gc2luICogbDIpXG4gICAgICAgICAgICAuYXR0cigneDInLCBkYyArIGNvcyAqIGwyKVxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgZGMgKyBzaW4gKiBsMilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5jb2xvcilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc1dpZHRoKVxuXG4gICAgICAgIC8vdGV4dCBsYWJlbFxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC8vc2hvdyBvbiByaWdodCBvZiBzdmdcbiAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgIC50ZXh0KHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL0xlZ2VuZC5qcydcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2QzLWZvcm1hdCdcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBzZWdtZW50IHdpZHRoLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNlZ21lbnRXaWR0aExlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy50aXRsZSA9IG9wdHMudGl0bGVcbiAgICAgICAgdGhpcy50aXRsZUZvbnRTaXplID0gb3B0cy50aXRsZUZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcblxuICAgICAgICAvL2V4YWdlcmF0aW9uXG4gICAgICAgIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yID0gb3B0cy5leGFnZ2VyYXRpb25GYWN0b3IgfHwgMC41XG5cbiAgICAgICAgLy9jb2xvclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAnZ3JheSdcbiAgICAgICAgLy9vcmllbnRhdGlvblxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLmxhYmVsVW5pdFRleHQgPSBvcHRzLmxhYmVsVW5pdFRleHQgfHwgJydcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3sgc3R5bGU6IGltcG9ydChcIi4uL3N0eWxlL1NlZ21lbnRTdHlsZVwiKS5TZWdtZW50U3R5bGUsIHI6IG51bWJlciwgemY6IG51bWJlciwgc0NvbG9yOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0LCBzTGVuZ3RoOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0LCBzV2lkdGg6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQgfX0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY291bGQgaGFwcGVuIHdoZW4gZGF0YSBpcyBzdGlsbCBsb2FkaW5nXG4gICAgICAgIGlmICghb3B0cy5zV2lkdGgpIHJldHVyblxuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgaWYgKHRoaXMudGl0bGUpIHtcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLnRpdGxlRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxuICAgICAgICAgICAgICAgIC50ZXh0KHRoaXMudGl0bGUpXG4gICAgICAgIH1cblxuICAgICAgICAvL2dldCBtYXggdmFsdWVcbiAgICAgICAgY29uc3QgdmFsdWVfID0gb3B0cy5zV2lkdGgubWF4ICogdGhpcy5leGFnZ2VyYXRpb25GYWN0b3JcblxuICAgICAgICAvL3Rha2UgJ25pY2UnIHZhbHVlIChwb3dlciBvZiB0ZW4sIG9yIG11bHRpcGxlKVxuICAgICAgICBsZXQgcG93MTAgPSBNYXRoLmxvZzEwKHZhbHVlXylcbiAgICAgICAgcG93MTAgPSBNYXRoLmZsb29yKHBvdzEwKVxuICAgICAgICBsZXQgdmFsdWUgPSBNYXRoLnBvdygxMCwgcG93MTApXG4gICAgICAgIGlmICh2YWx1ZSAqIDggPD0gdmFsdWVfKSB2YWx1ZSAqPSA4XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICogNiA8PSB2YWx1ZV8pIHZhbHVlICo9IDZcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA1IDw9IHZhbHVlXykgdmFsdWUgKj0gNVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDQgPD0gdmFsdWVfKSB2YWx1ZSAqPSA0XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICogMi41IDw9IHZhbHVlXykgdmFsdWUgKj0gMi41XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICogMiA8PSB2YWx1ZV8pIHZhbHVlICo9IDJcblxuICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCB3aWR0aCBhbmQgbGVuZ3RoLCBpbiBwaXhcbiAgICAgICAgY29uc3Qgc1dpZHRoID0gb3B0cy5zdHlsZS53aWR0aCh2YWx1ZSwgb3B0cy5yLCBvcHRzLnNXaWR0aCwgb3B0cy56ZikgLyBvcHRzLnpmXG4gICAgICAgIGNvbnN0IHNMZW5ndGggPSAoMSAqIG9wdHMucikgLyBvcHRzLnpmXG5cbiAgICAgICAgLy9UT0RPIHVzZSBvcmllbnRhdGlvblxuXG4gICAgICAgIGNvbnN0IHN2ZyA9IGQuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHNMZW5ndGgpLmF0dHIoJ2hlaWdodCcsIHNXaWR0aCkuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIC8vPGxpbmUgeDE9XCIwXCIgeTE9XCIwXCIgeDI9XCIyMDBcIiB5Mj1cIjIwMFwiIHN0eWxlPVwic3Ryb2tlOnJnYigyNTUsMCwwKTtzdHJva2Utd2lkdGg6MlwiIC8+XG4gICAgICAgIHN2Zy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgLmF0dHIoJ3gxJywgMClcbiAgICAgICAgICAgIC5hdHRyKCd5MScsIHNXaWR0aCAvIDIpXG4gICAgICAgICAgICAuYXR0cigneDInLCBzTGVuZ3RoKVxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgc1dpZHRoIC8gMilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5jb2xvcilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc1dpZHRoKVxuXG4gICAgICAgIGNvbnN0IHZhbHVlVCA9IGZvcm1hdCgnLC4ycicpKHZhbHVlKVxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC8vc2hvdyBvbiByaWdodCBvZiBncmFwaGljXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXG4gICAgICAgICAgICAudGV4dCh2YWx1ZVQgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vTGVnZW5kLmpzJ1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZDMtZm9ybWF0J1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIHByb3BvcnRpb25hbCBzeW1ib2xzLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpemVMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2V4YWdlcmF0aW9uXG4gICAgICAgIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yID0gb3B0cy5leGFnZ2VyYXRpb25GYWN0b3IgfHwgMC44XG5cbiAgICAgICAgLy9pZiB2YWx1ZSBpcyB0byBiZSBmb3JjZWRcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9wdHMudmFsdWUgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxuICAgICAgICB0aGlzLnRpdGxlRm9udFNpemUgPSBvcHRzLnRpdGxlRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xuXG4gICAgICAgIC8vc3ltYm9sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vU3R5bGVcIikuU2hhcGV9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICdjaXJjbGUnXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgJ25vbmUnXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICdncmF5J1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLmxhYmVsVW5pdFRleHQgPSBvcHRzLmxhYmVsVW5pdFRleHQgfHwgJydcbiAgICAgICAgdGhpcy5sYWJlbEZvcm1hdCA9IG9wdHMubGFiZWxGb3JtYXQgfHwgJywuMnInXG5cbiAgICAgICAgLy9cbiAgICAgICAgLy90aGlzLmRpdi5zdHlsZShcInRleHQtYWxpZ25cIiwgXCJjZW50ZXJcIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3sgc3R5bGU6IGltcG9ydChcIi4uL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGVcIikuU2hhcGVDb2xvclNpemVTdHlsZSwgcjogbnVtYmVyLCB6ZjogbnVtYmVyLCBzU2l6ZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0NvbG9yOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xuICAgICAgICBpZiAoIW9wdHMuc1NpemUpIHJldHVyblxuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL2dldCB2YWx1ZVxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlXG4gICAgICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSAnbmljZSB2YWx1ZVxuXG4gICAgICAgICAgICAvL2dldCBtYXggdmFsdWVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlXyA9IG9wdHMuc1NpemUubWF4ICogdGhpcy5leGFnZ2VyYXRpb25GYWN0b3JcblxuICAgICAgICAgICAgLy90YWtlICduaWNlJyB2YWx1ZSAocG93ZXIgb2YgdGVuLCBvciBtdWx0aXBsZSlcbiAgICAgICAgICAgIGxldCBwb3cxMCA9IE1hdGgubG9nMTAodmFsdWVfKVxuICAgICAgICAgICAgcG93MTAgPSBNYXRoLmZsb29yKHBvdzEwKVxuICAgICAgICAgICAgdmFsdWUgPSBNYXRoLnBvdygxMCwgcG93MTApXG4gICAgICAgICAgICBpZiAodmFsdWUgKiA4IDw9IHZhbHVlXykgdmFsdWUgKj0gOFxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA2IDw9IHZhbHVlXykgdmFsdWUgKj0gNlxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA1IDw9IHZhbHVlXykgdmFsdWUgKj0gNVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA0IDw9IHZhbHVlXykgdmFsdWUgKj0gNFxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiAyLjUgPD0gdmFsdWVfKSB2YWx1ZSAqPSAyLjVcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICogMiA8PSB2YWx1ZV8pIHZhbHVlICo9IDJcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG4gICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xuICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIilcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKSB7XG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIHNpemUgb2Ygc3ltYm9sLCBpbiBwaXhcbiAgICAgICAgY29uc3Qgc2l6ZSA9IG9wdHMuc3R5bGUuc2l6ZSh2YWx1ZSwgb3B0cy5yLCBvcHRzLnNTaXplLCBvcHRzLnpmKSAvIG9wdHMuemZcblxuICAgICAgICBjb25zdCBzdmcgPSBkXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc2l6ZSArIHRoaXMuc3Ryb2tlV2lkdGggKyAyKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemUgKyB0aGlzLnN0cm9rZVdpZHRoICsgMilcbiAgICAgICAgICAgIC5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXG5cbiAgICAgICAgaWYgKHRoaXMuc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemUpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgICAgIC8vVE9ETyB0ZXN0XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgIC8vIDxjaXJjbGUgY3g9XCI1MFwiIGN5PVwiNTBcIiByPVwiNDBcIiBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjNcIiBmaWxsPVwicmVkXCIgLz5cbiAgICAgICAgICAgIGNvbnN0IHIgPSAoc2l6ZSArIHRoaXMuc3Ryb2tlV2lkdGgpICogMC41XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyAxKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeScsIHIgKyAxKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdkb251dCcpIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgLy9UT0RPXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHRoaXMuc2hhcGUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZVQgPSBmb3JtYXQodGhpcy5sYWJlbEZvcm1hdCkodmFsdWUpXG4gICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLy9zaG93IG9uIHJpZ2h0IG9mIGdyYXBoaWNcbiAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAvL2NlbnRlciB2ZXJ0aWNhbGx5XG4gICAgICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwiYWJzb2x1dGVcIikuc3R5bGUoXCJ0b3BcIiwgXCIwXCIpLnN0eWxlKFwiYm90dG9tXCIsIFwiMFwiKVxuXG4gICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAudGV4dCh2YWx1ZVQgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHtcImZsYWdcInxcInBpZWNoYXJ0XCJ8XCJyaW5nXCJ8XCJzZWdtZW50XCJ8XCJyYWRhclwifFwiYWdlcHlyYW1pZFwifFwiaGFsZnRvbmVcIn0gQ29tcG9zaXRpb25UeXBlICovXG5cbi8qKlxuICogQSBzdHlsZSBzaG93aW5nIHRoZSBjb21wb3NpdGlvbiBvZiBhIHRvdGFsIGluIGRpZmZlcmVudCBjYXRlZ29yaWVzLCB3aXRoIGRpZmZlcmVudCBjb2xvciBodWVzLlxuICogSXQgY29uc2lzdHMgb2YgYSBzeW1ib2wgd2l0aCBkaWZmZXJlbnQgcGFydHMsIHdob3NlIHNpemUgcmVmbGVjdCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeS5cbiAqIEZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHN5bWJvbHMsIEBzZWUgQ29tcG9zaXRpb25UeXBlXG4gKiBUaGUgc3ltYm9sIGNhbiBiZSBzY2FsZWQgZGVwZW5kaW5nIG9uIHRoZSBjZWxsIGltcG9ydGFuY2UuXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRpb25TdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIG9mIGRlY29tcG9zaXRpb24gc3ltYm9sIG9mIGEgY2VsbCwgQHNlZSBDb21wb3NpdGlvblR5cGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6Q29tcG9zaXRpb25UeXBlfSAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRzLnR5cGVcblxuICAgICAgICAvKiogVGhlIGNvbHVtbiB3aGVyZSB0byBnZXQgdGhlIHNpemUgdmFsdWVzLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNpemVDb2wgPSBvcHRzLnNpemVDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgodiwgciwgcywgemYpID0+IHIpXG5cbiAgICAgICAgLyoqIEZvciBzdHlsZSB0eXBlcyB3aXRoIHN0cmlwZXMgKGZsYWcsIHNlZ21lbnQpLCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHN0cmlwZXMgKDAgZm9yIGhvcml6b250YWwsIG90aGVyIGZvciB2ZXJ0aWNhbCkuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnN0cmlwZXNPcmllbnRhdGlvbiA9IG9wdHMuc3RyaXBlc09yaWVudGF0aW9uIHx8ICgoKSA9PiAwKSAvLyhjLHIsemYpID0+IC4uLlxuXG4gICAgICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyBhbiBvZmZzZXQgYW5nbGUgZm9yIGEgcmFkYXIsIGhhbGZ0b25lIG9yIHBpZSBjaGFydCBzdHlsZS5cbiAgICAgICAgICogVGhlIGFuZ2xlIGlzIHNwZWNpZmllZCBpbiBkZWdyZWUuIFRoZSByb3RhdGlvbiBpcyBhbnRpLWNsb2Nrd2lzZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub2Zmc2V0QW5nbGUgPSBvcHRzLm9mZnNldEFuZ2xlIHx8ICgoKSA9PiAwKSAvLyhjZWxsLHIsemYpID0+IC4uLlxuXG4gICAgICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyB0aGUgaGVpZ2h0IG9mIHRoZSBhZ2UgcHlyYW1pZCwgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmFnZVB5cmFtaWRIZWlnaHQgPSBvcHRzLmFnZVB5cmFtaWRIZWlnaHQgfHwgKChjLCByLCB6ZikgPT4gcikgLy8oY2VsbCxyLHpmKSA9PiAuLi5cblxuICAgICAgICAvKiogRm9yIHBpZSBjaGFydCwgdGhpcyBpcyBwYXJhbWV0ZXIgZm9yIGludGVybmFsIHJhZGl1cywgc28gdGhhdCB0aGUgcGllIGNoYXJ0IGxvb2tzIGxpa2UgYSBkb251dC5cbiAgICAgICAgICogMCBmb3Igbm9ybWFsIHBpZSBjaGFydHMsIDAuNSB0byBlbXB0eSBoYWxmIG9mIHRoZSByYWRpdXMuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvciA9IG9wdHMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvciB8fCAwXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzIGRlcGVuZGluZyBvbiB0aGVpciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIGxldCBzdGF0XG4gICAgICAgIGlmICh0aGlzLnNpemVDb2wpIHtcbiAgICAgICAgICAgIC8vaWYgc2l6ZSBpcyB1c2VkLCBzb3J0IGNlbGxzIGJ5IHNpemUgc28gdGhhdCB0aGUgYmlnZ2VzdCBhcmUgZHJhd24gZmlyc3RcbiAgICAgICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gYzJbdGhpcy5zaXplQ29sXSAtIGMxW3RoaXMuc2l6ZUNvbF0pXG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXQgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnNpemVDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9uYiBjYXRlZ29yaWVzIC0gdXNlZCBmb3IgcmFkYXIgYW5kIGFnZXB5cmFtaWRcbiAgICAgICAgY29uc3QgbmJDYXQgPSBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKS5sZW5ndGhcblxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgLy9kcmF3IGNhbGxzXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vc2l6ZVxuICAgICAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICAgICAgbGV0IHNfID0gdGhpcy5zaXplIHx8ICgoKSA9PiByKVxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IHNHID0gc18oY2VsbFt0aGlzLnNpemVDb2xdLCByLCBzdGF0LCB6ZilcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6ZilcblxuICAgICAgICAgICAgLy9nZXQgc3ltYm9sIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHR5cGVfID0gdGhpcy50eXBlID8gdGhpcy50eXBlKGNlbGwpIDogJ2ZsYWcnXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZW50ZXIgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IHhjID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogciAqIDAuNSlcbiAgICAgICAgICAgIGNvbnN0IHljID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogciAqIDAuNSlcblxuICAgICAgICAgICAgLy9jb21wdXRlIG9mZnNldCBhbmdsZSwgd2hlbiByZWxldmFudFxuICAgICAgICAgICAgY29uc3Qgb2ZmQW5nID0gdGhpcy5vZmZzZXRBbmdsZSA/ICh0aGlzLm9mZnNldEFuZ2xlKGNlbGwsIHIsIHpmKSAqIE1hdGguUEkpIC8gMTgwIDogMFxuXG4gICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyB8fCB0eXBlXyA9PT0gJ3JhZGFyJyB8fCB0eXBlXyA9PT0gJ2hhbGZ0b25lJykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGwgY2F0ZWdvcnkgbWF4IHZhbHVlXG4gICAgICAgICAgICAgICAgbGV0IG1heFZhbCA9IC1JbmZpbml0eVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gK2NlbGxba2V5XVxuICAgICAgICAgICAgICAgICAgICBpZiAodiA+IG1heFZhbCkgbWF4VmFsID0gdlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY3VtdWxcbiAgICAgICAgICAgICAgICBsZXQgY3VtdWwgPSAwXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgJiYgdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICBjdW11bCA9IChyIC0gdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0KGNlbGwsIHIsIHpmKSkgLyAyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSBjdW11bCA9IE1hdGguUEkgLyAyICsgb2ZmQW5nXG5cbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgdGhlIGluY3JlbWVudCwgd2hpY2ggaXMgdGhlIHZhbHVlIHRvIGluY3JlbWVudCB0aGUgY3VtdWwgZm9yIGVhY2ggY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICBjb25zdCBpbmNyID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZV8gPT09ICdhZ2VweXJhbWlkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5hZ2VQeXJhbWlkSGVpZ2h0ID8gdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0KGNlbGwsIHIsIHpmKSA6IHIpIC8gbmJDYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKDIgKiBNYXRoLlBJKSAvIG5iQ2F0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmIChpbmNyID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbY29sdW1uLCBjb2xvcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgbGVuZ3RoIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogdmFsKSAvIG1heFZhbFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoeGMgKyAociAtIHdHKSAvIDIsIHljICsgY3VtdWwsIHdHLCBpbmNyKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyYWRhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdyb3kgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgcmFkaXVzIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgckcgPSB0aGlzLnJhZGl1cyh2YWwsIHIsIHN0YXQsIGNlbGxTdGF0LCB6ZilcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJHID0gKHNHIC8gMikgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgYW5ndWxhciBzZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4YywgeWMpXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYXJjKHhjLCB5YywgckcsIGN1bXVsIC0gaW5jciwgY3VtdWwpXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdoYWxmdG9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdyb3kgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgcmFkaXVzIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJHID0gc0cgKiAwLjMzMyAqIE1hdGguc3FydCh2YWwgLyBtYXhWYWwpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmFyYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyArIHIgKiAwLjI1ICogTWF0aC5jb3MoY3VtdWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljICsgciAqIDAuMjUgKiBNYXRoLnNpbihjdW11bCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgckcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogTWF0aC5QSVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgYW5ndWxhciBzZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0b3RhbFxuICAgICAgICAgICAgICAgIGxldCB0b3RhbCA9IDBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2x1bW4gb2YgT2JqZWN0LmtleXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2NvbHVtbl1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB2XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdG90YWwgfHwgaXNOYU4odG90YWwpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRlY29tcG9zaXRpb24gc3ltYm9sXG4gICAgICAgICAgICAgICAgbGV0IGN1bXVsID0gMFxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByICogKDEgLSBzRyAvIHIpICogMC41XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpID0gdGhpcy5zdHJpcGVzT3JpZW50YXRpb24oY2VsbCwgciwgemYpXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbY29sdW1uLCBjb2xvcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgc2hhcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmUgPSBjZWxsW2NvbHVtbl0gLyB0b3RhbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNoYXJlIHx8IGlzTmFOKHNoYXJlKSkgY29udGludWVcblxuICAgICAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc3ltYm9sIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnZmxhZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBmbGFnIHN0cmlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBkICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyBkICsgY3VtdWwgKiBzRyArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogc0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBjdW11bCAqIHNHICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyBkICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3BpZWNoYXJ0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHBpZSBjaGFydCBhbmd1bGFyIHNlY3RvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMSA9IGN1bXVsICogMiAqIE1hdGguUElcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGEyID0gKGN1bXVsICsgc2hhcmUpICogMiAqIE1hdGguUElcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3XG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmFyYyh4YywgeWMsIHNHICogMC41LCBhMSArIG9mZkFuZywgYTIgKyBvZmZBbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0cgKiAwLjUgKiB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExICsgb2ZmQW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMiArIG9mZkFuZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyByaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoeGMsIHljLCBNYXRoLnNxcnQoMSAtIGN1bXVsKSAqIHNHICogMC41LCAwLCAyICogTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3NlZ21lbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCBzZWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0cgPSAoc0cgKiBzRykgLyByXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHIgLSB3RykgLyAyICsgY3VtdWwgKiB3RyArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiB3R1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgY3VtdWwgKiByICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyAociAtIHdHKSAvIDIgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gc2hhcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYsIHNTaXplOiBzdGF0IH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL1NpZGVTdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHt7eDpudW1iZXIseTpudW1iZXIsb3I6XCJ2XCJ8XCJoXCIsdmFsdWU6bnVtYmVyfX0gU2lkZSAqL1xuXG4vKipcbiAqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250b3VyU3R5bGUgZXh0ZW5kcyBTaWRlU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgLy9vcHRzLmludGVydmFsID0gb3B0cy5pbnRlcnZhbCB8fCAxMDBcblxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICBvcHRzLmJyZWFrcyA9IG9wdHMuYnJlYWtzIHx8IFsxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDEwMDAwMDBdXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihTaWRlLG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgb3B0cy53aWR0aCA9IG9wdHMud2lkdGggfHwgKCgpID0+IDEpIC8vKHMsIHIsIHpmKSA9PiAuLi5cblxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKFNpZGUsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFN0E5MzUnKSAvLyhzLCByLCB6ZikgPT4gLi4uXG5cbiAgICAgICAgLy9vdmVycmlkZSBtZXRob2QgZm9yIGNvbnRvdXIgZHJhd2luZ1xuXG4gICAgICAgIGNvbnN0IGdldENsYXNzID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIGlmICh2ID09IHVuZGVmaW5lZCkgcmV0dXJuIDBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5icmVha3MubGVuZ3RoOyBpKyspIGlmICh2IDwgb3B0cy5icmVha3NbaV0pIHJldHVybiBpXG4gICAgICAgICAgICByZXR1cm4gb3B0cy5icmVha3MubGVuZ3RoXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbHVlID0gKHYxLCB2MiwgciwgcywgemYpID0+IHtcbiAgICAgICAgICAgIC8vaWYgKCF2MSB8fCAhdjIpIHJldHVybiAwXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoZ2V0Q2xhc3ModjIpIC0gZ2V0Q2xhc3ModjEpKVxuXG4gICAgICAgICAgICAvL2NoZWNrIGlmIHYxIC0gdjIgY3Jvc3MgYSBjb250b3VyIGxpbmVcbiAgICAgICAgICAgIC8vY29uc3QgcjEgPSBNYXRoLmZsb29yKHYxIC8gb3B0cy5pbnRlcnZhbCk7XG4gICAgICAgICAgICAvL2NvbnN0IHIyID0gTWF0aC5mbG9vcih2MiAvIG9wdHMuaW50ZXJ2YWwpO1xuICAgICAgICAgICAgLy9yZXR1cm4gTWF0aC5hYnMocjIgLSByMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL3NhbWUgY29sb3IgZm9yIGFsbFxuICAgICAgICB0aGlzLmNvbG9yID0gKHNpZGUsIHIsIHMsIHpmKSA9PiAoc2lkZS52YWx1ZSA/IG9wdHMuY29sb3Ioc2lkZSwgciwgemYpIDogdW5kZWZpbmVkKVxuXG4gICAgICAgIC8vd2lkdGg6IG11bHRpcGxlIG9mXG4gICAgICAgIHRoaXMud2lkdGggPSAoc2lkZSwgciwgcywgemYpID0+IHNpZGUudmFsdWUgKiB6ZiAqIG9wdHMud2lkdGgoc2lkZSwgciwgemYpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xuaW1wb3J0IHsgcmFuZG9tTm9ybWFsIH0gZnJvbSAnZDMtcmFuZG9tJ1xuaW1wb3J0IHsgY2hlY2tXZWJHTFN1cHBvcnQsIG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5pbXBvcnQgeyBtb25pdG9yLCBtb25pdG9yRHVyYXRpb24gfSBmcm9tICcuLi91dGlscy9VdGlscy5qcydcblxuLyoqXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRG90RGVuc2l0eVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIGRvdCBudW1iZXIuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubmJDb2wgPSBvcHRzLm5iQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZG90cyBmb3IgYSBjZWxsIHZhbHVlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm5iID0gb3B0cy5uYiB8fCAoKHYsIHIsIHMsIHpmKSA9PiAoKCgwLjMgKiByICogcikgLyAoemYgKiB6ZikpICogdikgLyBzLm1heClcblxuICAgICAgICAvKiogVGhlIGNvbG9yIG9mIHRoZSBkb3RzLiBTYW1lIGNvbG9yIGZvciBhbGwgZG90cyB3aXRoaW4gYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0ZGNTczMycpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBkb3RzLCBpbiBnZW8gdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5kb3RTaXplID0gb3B0cy5kb3RTaXplIC8vfHwgKChyLCB6ZikgPT4gLi4uXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaWdtYSBvZiB0aGUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHJlc29sdXRpb24sIGluIGdlbyB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpZ21hID0gb3B0cy5zaWdtYSAvL3x8ICgocix6ZikgPT4gLi4uXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogRG90RGVuc2l0eVN0eWxlIGRyYXcnKVxuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICBsZXQgc3RhdFxuICAgICAgICBpZiAodGhpcy5uYkNvbCkgc3RhdCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMubmJDb2xdLCB0cnVlKVxuICAgICAgICBpZiAoIXN0YXQpIHJldHVyblxuXG4gICAgICAgIC8vc2l6ZSBvZiB0aGUgZG90c1xuICAgICAgICBjb25zdCBzR2VvID0gdGhpcy5kb3RTaXplID8gdGhpcy5kb3RTaXplKHIsIHpmKSA6IDIgKiB6ZlxuXG4gICAgICAgIC8vbWFrZSByYW5kb20gZnVuY3Rpb25cbiAgICAgICAgY29uc3Qgc2lnID0gdGhpcy5zaWdtYSA/IHRoaXMuc2lnbWEociwgemYpIDogciAqIDAuNFxuICAgICAgICBjb25zdCByYW5kID0gcmFuZG9tTm9ybWFsKDAsIHNpZylcblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgcHJlcGFyYXRpb24nKVxuXG4gICAgICAgIGlmIChjaGVja1dlYkdMU3VwcG9ydCgpKSB7XG4gICAgICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhjZy53ICsgJycsIGNnLmggKyAnJylcbiAgICAgICAgICAgIGlmICghY3ZXR0wpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vY3JlYXRlIHdlYkdMIHByb2dyYW1cbiAgICAgICAgICAgIGNvbnN0IHByb2cgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZyhjdldHTC5nbCwgc0dlbyAvIHpmKVxuXG4gICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgd2ViZ2wgY3JlYXRpb24nKVxuXG4gICAgICAgICAgICBjb25zdCByMiA9IHIgLyAyXG5cbiAgICAgICAgICAgIGxldCBjb2wsIG9mZnNldCwgbmIsIGN4LCBjeSwgY2NcbiAgICAgICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbCA9IHRoaXMuY29sb3IoYylcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHIsIHpmKVxuXG4gICAgICAgICAgICAgICAgLy9udW1iZXIgb2YgZG90c1xuICAgICAgICAgICAgICAgIG5iID0gdGhpcy5uYihjW3RoaXMubmJDb2xdLCByLCBzdGF0LCB6ZilcblxuICAgICAgICAgICAgICAgIC8vY2VsbCBjZW50ZXJcbiAgICAgICAgICAgICAgICBjeCA9IGMueCArIG9mZnNldC5keCArIHIyXG4gICAgICAgICAgICAgICAgY3kgPSBjLnkgKyBvZmZzZXQuZHkgKyByMlxuXG4gICAgICAgICAgICAgICAgLy9jb252ZXJ0IGNvbG9yXG4gICAgICAgICAgICAgICAgY2MgPSBjb2xvcihjb2wpXG4gICAgICAgICAgICAgICAgaWYgKCFjYykgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAvL3JhbmRvbSBwb2ludHNcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuYjsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBwcm9nLmFkZFBvaW50RGF0YTIoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBjYy5yLCBjYy5nLCBjYy5iLCBjYy5vcGFjaXR5KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgZGF0YSBwcmVwYXJhdGlvbicpXG5cbiAgICAgICAgICAgIC8vZHJhd1xuICAgICAgICAgICAgcHJvZy5kcmF3KGNnLmdldFdlYkdMVHJhbnNmb3JtKCkpXG5cbiAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyB3ZWJnbCBkcmF3aW5nJylcblxuICAgICAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgICAgIGNnLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgY2cuY3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXG5cbiAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyBjYW52YXMgZHJhd2luZycpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xuXG4gICAgICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGMpXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcblxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcbiAgICAgICAgICAgICAgICBjb25zdCBuYiA9IHRoaXMubmIoY1t0aGlzLm5iQ29sXSwgciwgc3RhdCwgemYpXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgcmFuZG9tIGRvdHNcbiAgICAgICAgICAgICAgICBjb25zdCBjeCA9IGMueCArIG9mZnNldC5keCArIHIgLyAyLFxuICAgICAgICAgICAgICAgICAgICBjeSA9IGMueSArIG9mZnNldC5keSArIHIgLyAyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbmI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBzR2VvLCBzR2VvKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHIsIHpmOiB6ZiB9KVxuXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBEb3REZW5zaXR5U3R5bGUgZW5kIGRyYXcnKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSm95UGxvdFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIGNlbGwgY29sdW1uIHdoZXJlIHRvIGdldCB0aGUgdmFsdWUgdG8gcmVwcmVzZW50LlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmhlaWdodENvbCA9IG9wdHMuaGVpZ2h0Q29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKHYpID0+IE1hdGguc3FydCh2KSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxpbmVDb2xvciA9IG9wdHMubGluZUNvbG9yIHx8ICgoeSwgeXMsIHIsIHpmKSA9PiAnI0JCQicpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLHttaW46bnVtYmVyLCBtYXg6bnVtYmVyfSxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gb3B0cy5saW5lV2lkdGggfHwgKCh5LCB5cywgciwgemYpID0+IHpmKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yIHx8ICgoeSwgeXMsIHIsIHpmKSA9PiAnI2MwOGM1OTY4JylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMgZGVwZW5kaW5nIG9uIHRoZWlyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKiAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgY2cuY3R4LmxpbmVKb2luID0gJ3JvdW5kJ1xuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgLy9jb21wdXRlIHN0YXRpc3RpY3NcbiAgICAgICAgY29uc3Qgc3RhdCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuaGVpZ2h0Q29sXSwgdHJ1ZSlcblxuICAgICAgICAvL2luZGV4IGNlbGxzIGJ5IHkgYW5kIHhcbiAgICAgICAgLyoqICBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICBjb25zdCBpbmQgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGxldCByb3cgPSBpbmRbY2VsbC55XVxuICAgICAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgICAgICByb3cgPSB7fVxuICAgICAgICAgICAgICAgIGluZFtjZWxsLnldID0gcm93XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dbY2VsbC54XSA9IHRoaXMuaGVpZ2h0KGNlbGxbdGhpcy5oZWlnaHRDb2xdLCByLCBzdGF0LCB6ZilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcHV0ZSBleHRlbnRcbiAgICAgICAgY29uc3QgZSA9IGNnLmV4dEdlb1xuICAgICAgICBpZiAoIWUpIHJldHVyblxuICAgICAgICBjb25zdCB4TWluID0gTWF0aC5mbG9vcihlLnhNaW4gLyByKSAqIHJcbiAgICAgICAgY29uc3QgeE1heCA9IE1hdGguZmxvb3IoZS54TWF4IC8gcikgKiByXG4gICAgICAgIGNvbnN0IHlNaW4gPSBNYXRoLmZsb29yKGUueU1pbiAvIHIpICogclxuICAgICAgICBjb25zdCB5TWF4ID0gTWF0aC5mbG9vcihlLnlNYXggLyByKSAqIHJcblxuICAgICAgICAvKiogIEB0eXBlIHt7bWluOm51bWJlciwgbWF4Om51bWJlcn19ICovXG4gICAgICAgIGNvbnN0IHlzID0geyBtaW46IHlNaW4sIG1heDogeU1heCB9XG5cbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xuICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vZHJhdyBsaW5lcywgcm93IGJ5IHJvdywgc3RhdGluZyBmcm9tIHRoZSB0b3BcbiAgICAgICAgZm9yIChsZXQgeSA9IHlNYXg7IHkgPj0geU1pbjsgeSAtPSByKSB7XG4gICAgICAgICAgICAvL2dldCByb3dcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGluZFt5XVxuXG4gICAgICAgICAgICAvL25vIHJvd1xuICAgICAgICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vcGxhY2UgZmlyc3QgcG9pbnRcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4TWluIC0gciAvIDIsIHkpXG5cbiAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIGhlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgbGV0IGhHX1xuXG4gICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxpbmUgY2VsbHNcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbHVtbiB2YWx1ZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxuICAgICAgICAgICAgICAgIGlmICghaEcpIGhHID0gMFxuXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgbGluZSBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIG9mIGJvdGggdmFsdWVzIGlzIG5vbi1udWxsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyB0ZXN0IGJlemllckN1cnZlVG9cbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyh4ICsgciAvIDIsIHkgKyBoRylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgbW92ZSB0aGUgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4ICsgciAvIDIsIHkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgICAgICAgaEdfID0gaEdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9sYXN0IHBvaW50XG4gICAgICAgICAgICBpZiAoaEdfKSBjZy5jdHgubGluZVRvKHhNYXggKyByIC8gMiwgeSlcblxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcbiAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWxsQ29sb3IoeSwgeXMsIHIsIHpmKVxuICAgICAgICAgICAgaWYgKGZjICYmIGZjICE9ICdub25lJykge1xuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcbiAgICAgICAgICAgIGNvbnN0IGxjID0gdGhpcy5saW5lQ29sb3IoeSwgeXMsIHIsIHpmKVxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmxpbmVXaWR0aCh5LCB5cywgciwgemYpXG4gICAgICAgICAgICBpZiAobGMgJiYgbGMgIT0gJ25vbmUnICYmIGx3ID4gMCkge1xuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGxjXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IGx3XG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFRhbmFrYVN0eWxlIH0gZnJvbSAnLi9UYW5ha2FTdHlsZS5qcydcbmltcG9ydCB7IFN0cm9rZVN0eWxlIH0gZnJvbSAnLi9TdHJva2VTdHlsZS5qcydcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgfSBmcm9tICcuL1NxdWFyZUNvbG9yQ2F0V0dMU3R5bGUuanMnXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIExlZ29TdHlsZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge0FycmF5LjxTdHlsZT59XG4gICAgICovXG4gICAgc3RhdGljIGdldChjb2wsIG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL3RoZSBjb2xvcnNcbiAgICAgICAgLy9odHRwOi8vd3d3Lmplbm55c2NyYXlvbmNvbGxlY3Rpb24uY29tLzIwMjEvMDYvYWxsLWN1cnJlbnQtbGVnby1jb2xvcnMuaHRtbFxuICAgICAgICAvL2h0dHBzOi8vbGVvbmF3aWN6LmdpdGh1Yi5pby9sZWdvY29sb3JzL3JlZmVyZW5jZS9maWd1cmVzL1JFQURNRS1wbG90LTEucG5nXG4gICAgICAgIG9wdHMuY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgW1xuICAgICAgICAgICAgJyMwMDg1MmInLCAvL2RhcmtlciBncmVlblxuICAgICAgICAgICAgJyNhZmQyNDYnLCAvL2xpZ2h0IGdyZWVuXG4gICAgICAgICAgICAnI2ZhYzgwYScsIC8vZGFyayB5ZWxsb3dcbiAgICAgICAgICAgICcjYmI4MDVhJywgLy9icm93blxuICAgICAgICAgICAgJyNkNjc5MjMnLCAvL21vc3RhcmRcbiAgICAgICAgICAgICcjY2I0ZTI5JywgLy9yZWRpc2hcbiAgICAgICAgICAgICcjYjQwMDAwJywgLy9yZWRcbiAgICAgICAgICAgICcjNzIwMDEyJywgLy9kYXJrIHJlZFxuICAgICAgICAgICAgLy9cInB1cnBsZVwiLFxuICAgICAgICAgICAgLy9cIiNlZWVcIiAvL3doaXRoZVxuICAgICAgICBdXG5cbiAgICAgICAgb3B0cy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xuICAgICAgICBvcHRzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xuICAgICAgICBvcHRzLndpZHRoRmFjdG9yID0gb3B0cy53aWR0aEZhY3RvciB8fCAwLjEyXG5cbiAgICAgICAgLy9yZXVzZSB0YW5ha2EgYXMgYmFzaXNcbiAgICAgICAgY29uc3QgdHMgPSBUYW5ha2FTdHlsZS5nZXQoY29sLCBvcHRzKVxuICAgICAgICAvL3N0eWxlIHRvIHNob3cgbGltaXRzIGJldHdlZW4gcGllY2VzXG4gICAgICAgIGNvbnN0IHNzdCA9IG5ldyBTdHJva2VTdHlsZSh7XG4gICAgICAgICAgICBzdHJva2VDb2xvcjogKCkgPT4gJyM2NjYnLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6ICh2LCByLCBzLCB6KSA9PiAwLjIgKiB6LFxuICAgICAgICAgICAgZmlsdGVyOiBvcHRzLmZpbHRlcixcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdHNbMF0sXG4gICAgICAgICAgICBzc3QsXG4gICAgICAgICAgICB0c1sxXSxcbiAgICAgICAgICAgIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQsIGZpbHRlcjogb3B0cy5maWx0ZXIgfSksXG4gICAgICAgIF1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6c3RyaW5nfSBjb2xcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtBcnJheS48U3R5bGU+fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDYXQoY29sLCBvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgb3B0cy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xuICAgICAgICBvcHRzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHMgPSBuZXcgU3F1YXJlQ29sb3JDYXRXR0xTdHlsZSh7IGNvbG9yQ29sOiBjb2wsIGNvbG9yOiBvcHRzLmNvbG9yIH0pXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHsgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2Jywgc3Ryb2tlV2lkdGg6ICh2LCByLCBzLCB6KSA9PiAwLjIgKiB6IH0pXG5cbiAgICAgICAgcmV0dXJuIFtzLCBzc3QsIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQgfSldXG4gICAgfVxufVxuXG4vKipcbiAqIEEgc3R5bGUgdG8gZHJhdyB0b3AgY2lyY2xlIG9mIGxlZ28gYnJpY2tzLlxuICovXG5jbGFzcyBMZWdvVG9wU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fHVuZGVmaW5lZH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICAgICAgdGhpcy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xuICAgICAgICB0aGlzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xuICAgIH1cblxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IDAuNiAqIGNnLmdldFpmKClcblxuICAgICAgICAvL2RhcmsgcGFydFxuICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbERhcmtcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjZy5jdHguYXJjKGMueCArIHIgKiAwLjUsIGMueSArIHIgKiAwLjUsIHIgKiAwLjU1ICogMC41LCBNYXRoLlBJIC8gNCwgLU1hdGguUEkgKiAoMyAvIDQpLCB0cnVlKVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2JyaWdodCBwYXJ0XG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sQnJpZ2h0XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY2cuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgZmFsc2UpXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBNb3NhaWNTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKVxuXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgZWZmZWN0LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIGVmZmVjdC5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5tb3NhaWNGYWN0b3IgPSBvcHRzLm1vc2FpY0ZhY3RvciB8fCAwLjE1XG5cbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgc2hhZG93LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIHNoYWRvdy5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjJcblxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBvcHRzLnNoYWRvd0NvbG9yIHx8ICcjNTU1J1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByZXNvbHV0aW9uLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgbGV0IHN0YXRDb2xvclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9zZXQgc3Ryb2tlIHN0eWxlLCBmb3Igc2hhZG93XG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHRoaXMuc2hhZG93RmFjdG9yICogcmVzb2x1dGlvblxuICAgICAgICBjZy5jdHgubGluZUpvaW4gPSAncm91bmQnXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXG5cbiAgICAgICAgLy9mdW5jdGlvbiB0byBjb21wdXRlIHBvc2l0aW9uIG1vc2FpYyBlZmZlY3RcbiAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiB0aGlzLm1vc2FpY0ZhY3RvclxuICAgICAgICBjb25zdCBtb3NhaWMgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB4OiBNYXRoLnJhbmRvbSgpICogZCwgeTogTWF0aC5yYW5kb20oKSAqIGQgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXMgaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9zZXQgZmlsbCBjb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbFt0aGlzLmNvbG9yQ29sXSwgcmVzb2x1dGlvbiwgc3RhdENvbG9yKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgemYpXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XG4gICAgICAgICAgICBjb25zdCBsbCA9IG1vc2FpYygpLFxuICAgICAgICAgICAgICAgIHVsID0gbW9zYWljKCksXG4gICAgICAgICAgICAgICAgbHIgPSBtb3NhaWMoKSxcbiAgICAgICAgICAgICAgICB1ciA9IG1vc2FpYygpXG5cbiAgICAgICAgICAgIC8vc3Ryb2tlXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFkb3dGYWN0b3IgPiAwKSB7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZmlsbFxuXG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgbGwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbGwueSlcbiAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXG4gICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSB1ci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdXIueSlcbiAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgdWwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVsLnkpXG4gICAgICAgICAgICBjZy5jdHguZmlsbCgpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByZXNvbHV0aW9uLCB6ZjogemYsIHNDb2xvcjogc3RhdENvbG9yIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xuXG4vKipcbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBOaW5qYVN0YXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJykgLy8odixyLHMsemYpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNpemVDb2wgPSBvcHRzLnNpemVDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsLCB3aXRoaW4gWzAsMV06XG4gICAgICAgICAqICAtIDAsIG5vdGhpbmcgc2hvd25cbiAgICAgICAgICogIC0gMSwgZW50aXJlIHNxdWFyZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ28nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgbGV0IHN0YXRTaXplXG4gICAgICAgIGlmICh0aGlzLnNpemVDb2wpIHtcbiAgICAgICAgICAgIC8vaWYgc2l6ZSBpcyB1c2VkLCBzb3J0IGNlbGxzIGJ5IHNpemUgc28gdGhhdCB0aGUgYmlnZ2VzdCBhcmUgZHJhd24gZmlyc3RcbiAgICAgICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gYzJbdGhpcy5zaXplQ29sXSAtIGMxW3RoaXMuc2l6ZUNvbF0pXG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdFNpemUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnNpemVDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRDb2xvclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcbiAgICAgICAgLy9pbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBjb25zdCByMiA9IHIgKiAwLjVcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbFt0aGlzLmNvbG9yQ29sXSwgciwgc3RhdENvbG9yLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL3NoYXBlXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGNlbGwpIDogJ28nXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9zaXplXG4gICAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgICAgICBsZXQgc18gPSB0aGlzLnNpemUgfHwgKCgpID0+IDAuNSlcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XG4gICAgICAgICAgICBjb25zdCBzRzIgPSBzXyhjZWxsW3RoaXMuc2l6ZUNvbF0sIHIsIHN0YXRTaXplLCB6ZikgKiByMlxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIC8vVE9ETyB1c2VcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgemYpXG5cbiAgICAgICAgICAgIC8vY2VudGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHIyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHIyXG5cbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3AnKSB7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjeCwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSArIHNHMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgcjIsIGN5KVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyBzRzIsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3gsIGN5IC0gcjIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgLSBzRzIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSlcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSArIHNHMilcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnbycpIHtcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGN4LCBjeSArIHNHMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgcjIsIGN5ICsgcjIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHIyLCBjeSAtIHIyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3gsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSlcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4IC0gcjIsIGN5ICsgcjIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzU2l6ZTogc3RhdFNpemUsIHNDb2xvcjogc3RhdENvbG9yIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFBpbGxhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8vVE9ETyBtYWtlIGEgd2ViR0wgdmVyc2lvbiA/XG5cbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0Q29sID0gb3B0cy5oZWlnaHRDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodFxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yQ29sID0gb3B0cy5jb2xvckNvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjYzA4YzU5JykgLy9iYlxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLndpZHRoQ29sID0gb3B0cy53aWR0aENvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgodiwgcikgPT4gMC41ICogcilcblxuICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMuc2ltcGxlID0gb3B0cy5zaW1wbGUgIT0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld0hlaWdodEZhY3RvciA9IG9wdHMudmlld0hlaWdodEZhY3RvciB8fCAxLjVcbiAgICAgICAgLy8wLDAgaXMgdGhlIGNlbnRlclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy52aWV3U1ggPSBvcHRzLnZpZXdTWCA9PSB1bmRlZmluZWQgPyAwIDogb3B0cy52aWV3U1hcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld1NZID0gb3B0cy52aWV3U1kgPT0gdW5kZWZpbmVkID8gLTAuNSA6IG9wdHMudmlld1NZXG5cbiAgICAgICAgLy9UT0RPIHJlcGxhY2Ugd2l0aCBzdW4gbG9jYXRpb24gP1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dEaXJlY3Rpb24gPVxuICAgICAgICAgICAgb3B0cy5zaGFkb3dEaXJlY3Rpb24gPT0gdW5kZWZpbmVkID8gKC00MC4zICogTWF0aC5QSSkgLyAxODAuMCA6IG9wdHMuc2hhZG93RGlyZWN0aW9uXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuM1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyMwMDAwMDAzMydcblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lQ29sID0gb3B0cy5vdXRsaW5lQ29sIHx8ICcjRkZGRkZGJ1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lV2lkdGhQaXggPSBvcHRzLm91dGxpbmVXaWR0aFBpeCA9PSB1bmRlZmluZWQgPyAwLjUgOiBvcHRzLm91dGxpbmVXaWR0aFBpeFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc2VnbWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICBsZXQgc3RhdEhlaWdodFxuICAgICAgICBpZiAodGhpcy5oZWlnaHRDb2wpIHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRIZWlnaHQgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmhlaWdodENvbF0sIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhdENvbG9yXG4gICAgICAgIGlmICh0aGlzLmNvbG9yQ29sKSB7XG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdENvbG9yID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5jb2xvckNvbF0sIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhdFdpZHRoXG4gICAgICAgIGlmICh0aGlzLndpZHRoQ29sKSB7XG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdFdpZHRoID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy53aWR0aENvbF0sIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cbiAgICAgICAgY29uc3QgY3Z4ID0gY2cuZ2V0Q2VudGVyKCkueCArIHRoaXMudmlld1NYICogY2cudyAqIHpmXG4gICAgICAgIGNvbnN0IGN2eSA9IGNnLmdldENlbnRlcigpLnkgKyB0aGlzLnZpZXdTWSAqIGNnLmggKiB6ZlxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxuICAgICAgICBjb25zdCBIID0gdGhpcy52aWV3SGVpZ2h0RmFjdG9yICogKGNnLncgKyBjZy5oKSAqIDAuNSAqIHpmXG5cbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcbiAgICAgICAgLy9jb25zdCBkaXN0VG9WaWV3Q2VudGVyID0gKGMpID0+IHsgY29uc3QgZHggPSBjdnggLSBjLngsIGR5ID0gY3Z5IC0gYy55OyByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSB9XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gMTAwMDAwMDAwICogKGMyLnkgLSBjMS55KSArIGMxLnggLSBjMi54KVxuXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gdGhpcy5zaW1wbGUgPyAnYnV0dCcgOiAncm91bmQnXG5cbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xuICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vZHJhdyBzaGFkb3dzXG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjW3RoaXMud2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vaGVpZ2h0XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY1t0aGlzLmhlaWdodENvbF0sIHIsIHN0YXRIZWlnaHQsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcblxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcbiAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50cmUgcG9zdGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGMueCArIHIgLyAyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGMueSArIHIgLyAyXG4gICAgICAgICAgICBjb25zdCBscyA9IGhHICogdGhpcy5zaGFkb3dGYWN0b3JcblxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgbHMgKiBNYXRoLmNvcyh0aGlzLnNoYWRvd0RpcmVjdGlvbiksIGN5ICsgbHMgKiBNYXRoLnNpbih0aGlzLnNoYWRvd0RpcmVjdGlvbikpXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIGlmICh0aGlzLnNpbXBsZSkge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBiYXNlIGNpcmNsZVxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKFxuICAgICAgICAgICAgICAgICAgICBjeCwgY3ksXG4gICAgICAgICAgICAgICAgICAgIHdHICogMC41LFxuICAgICAgICAgICAgICAgICAgICAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIC8vY2cuY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKCk7XG4gICAgICAgICAgICB9Ki9cbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhdyBwaWxsYXJzXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNbdGhpcy5jb2xvckNvbF0sIHIsIHN0YXRDb2xvcikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGNbdGhpcy53aWR0aENvbF0sIHIsIHN0YXRXaWR0aCwgemYpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9oZWlnaHRcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodChjW3RoaXMuaGVpZ2h0Q29sXSwgciwgc3RhdEhlaWdodCwgemYpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHIsIHpmKVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50cmUgcG9zdGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGMueCArIHIgLyAyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGMueSArIHIgLyAyXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmdsZVxuICAgICAgICAgICAgY29uc3QgZHggPSBjeCAtIGN2eCxcbiAgICAgICAgICAgICAgICBkeSA9IGN5IC0gY3Z5XG4gICAgICAgICAgICBjb25zdCBhID0gTWF0aC5hdGFuMihkeSwgZHgpXG4gICAgICAgICAgICBjb25zdCBEID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KVxuICAgICAgICAgICAgY29uc3QgZCA9IChEICogaEcpIC8gKEggLSBoRylcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2ltcGxlKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGN4LCBjeSlcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhY2tncm91bmQgc2VnbWVudFxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3RyArIDIgKiB0aGlzLm91dGxpbmVXaWR0aFBpeCAqIHpmXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IHRvcCBjaXJjbGVcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsU3R5bGUgPSBcIiNjMDhjNTlcIlxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB0aGlzLm91dGxpbmVXaWR0aFBpeCAqIHpmXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSksIHdHICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9pbiBjYXNlLi4uXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKiBBIHN0eWxlIHdoZXJlIGVhY2ggY2VsbCBpcyByZXByZXNlbnRlZCBieSBhIHNlZ21lbnQgd2hvc2UgbGVuZ3RoLCB3aWR0aCwgY29sb3IgYW5kIG9yaWVudGF0aW9uIGNhbiB2YXJ5IGFjY29yZGluZyB0byBzdGF0aXN0aWNhbCB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2VnbWVudFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG9yaWVudGF0aW9uIChpbiBkZWdyZWVzKSBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8ICgoKSA9PiAwKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yQ29sID0gb3B0cy5jb2xvckNvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwgc2VnbWVudC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJylcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5sZW5ndGhDb2wgPSBvcHRzLmxlbmd0aENvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMud2lkdGhDb2wgPSBvcHRzLndpZHRoQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGhcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgbGV0IHN0YXRDb2xvclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRMZW5ndGhcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoQ29sKSB7XG4gICAgICAgICAgICAvL2lmIGxlbmd0aCBpcyB1c2VkLCBzb3J0IGNlbGxzIGJ5IGxlbmd0aCBzbyB0aGF0IHRoZSBsb25nZXN0cyBhcmUgZHJhd24gZmlyc3RcbiAgICAgICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gYzJbdGhpcy5sZW5ndGhDb2xdIC0gYzFbdGhpcy5sZW5ndGhDb2xdKVxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRMZW5ndGggPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmxlbmd0aENvbF0sIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhdFdpZHRoXG4gICAgICAgIGlmICh0aGlzLndpZHRoQ29sKSB7XG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdFdpZHRoID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy53aWR0aENvbF0sIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICBjZy5jdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vY29udmVyc2lvbiBmYWN0b3IgZGVncmVlIC0+IHJhZGlhblxuICAgICAgICBjb25zdCBmID0gTWF0aC5QSSAvIDE4MFxuXG4gICAgICAgIC8vZHJhdyBpbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcblxuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjW3RoaXMud2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBsRyA9IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGgoY1t0aGlzLmxlbmd0aENvbF0sIHIsIHN0YXRMZW5ndGgsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vb3JpZW50YXRpb24gKGluIHJhZGlhbilcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgY29uc3Qgb3IgPSB0aGlzLm9yaWVudGF0aW9uKGMpICogZlxuICAgICAgICAgICAgaWYgKG9yID09PSB1bmRlZmluZWQgfHwgaXNOYU4ob3IpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHIsIHpmKVxuXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IGNlbnRyZSBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgciAvIDIgKyBvZmZzZXQuZHhcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gYy55ICsgciAvIDIgKyBvZmZzZXQuZHlcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkeCA9IDAuNSAqIE1hdGguY29zKG9yKSAqIGxHXG4gICAgICAgICAgICBjb25zdCBkeSA9IDAuNSAqIE1hdGguc2luKG9yKSAqIGxHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3ggLSBkeCwgY3kgLSBkeSlcbiAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyBkeCwgY3kgKyBkeSlcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kLCBpZiBhbnlcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHtcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLFxuICAgICAgICAgICAgcjogcixcbiAgICAgICAgICAgIHpmOiB6ZixcbiAgICAgICAgICAgIHNDb2xvcjogc3RhdENvbG9yLFxuICAgICAgICAgICAgc0xlbmd0aDogc3RhdExlbmd0aCxcbiAgICAgICAgICAgIHNXaWR0aDogc3RhdFdpZHRoLFxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKiBBIHZlcnkgZ2VuZXJpYyBzdHlsZSB0aGF0IHNob3dzIGdyaWQgY2VsbHMgd2l0aCBzcGVjaWZpYyBjb2xvciwgc2l6ZSBhbmQgc2hhcGUuXG4gKiBJdCBjYW4gYmUgdXNlZCB0byBzaG93IHZhcmlhYmxlcyBhcyBjZWxsIGNvbG9ycywgY2VsbCBzaXplLCBjZWxsIHNoYXBlLCBvciBhbnkgY29tYmluYXRpb24gb2YgdGhlIHRocmVlIHZpc3VhbCB2YXJpYWJsZXMuXG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2hhcGVDb2xvclNpemVTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJykgLy8odixyLHMsemYpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNpemVDb2wgPSBvcHRzLnNpemVDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZSBvZiBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOmltcG9ydChcIi4uL1N0eWxlXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ3NxdWFyZScpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzLCB3aXRoIHZhcmlvdXMgY29sb3JzIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgbGV0IHN0YXRTaXplXG4gICAgICAgIGlmICh0aGlzLnNpemVDb2wpIHtcbiAgICAgICAgICAgIC8vaWYgc2l6ZSBpcyB1c2VkLCBzb3J0IGNlbGxzIGJ5IHNpemUgc28gdGhhdCB0aGUgYmlnZ2VzdCBhcmUgZHJhd24gZmlyc3RcbiAgICAgICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gYzJbdGhpcy5zaXplQ29sXSAtIGMxW3RoaXMuc2l6ZUNvbF0pXG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdFNpemUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnNpemVDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRDb2xvclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcbiAgICAgICAgLy9pbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBjb25zdCByMiA9IHIgKiAwLjVcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbFt0aGlzLmNvbG9yQ29sXSwgciwgc3RhdENvbG9yLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL3NoYXBlXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGNlbGwpIDogJ3NxdWFyZSdcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NpemVcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgICAgIGxldCBzXyA9IHRoaXMuc2l6ZSB8fCAoKCkgPT4gcilcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XG4gICAgICAgICAgICBjb25zdCBzRyA9IHNfKGNlbGxbdGhpcy5zaXplQ29sXSwgciwgc3RhdFNpemUsIHpmKVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHIsIHpmKVxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNxdWFyZVxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByICogKDEgLSBzRyAvIHIpICogMC41XG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KGNlbGwueCArIGQgKyBvZmZzZXQuZHgsIGNlbGwueSArIGQgKyBvZmZzZXQuZHksIHNHLCBzRylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoY2VsbC54ICsgcjIgKyBvZmZzZXQuZHgsIGNlbGwueSArIHIyICsgb2Zmc2V0LmR5LCBzRyAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkb251dCcpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgZG9udXRcbiAgICAgICAgICAgICAgICBjb25zdCB4YyA9IGNlbGwueCArIHIyICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICB5YyA9IGNlbGwueSArIHIyICsgb2Zmc2V0LmR5XG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4YywgeWMpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyh4YywgeWMsIHIyLCAwLCAyICogTWF0aC5QSSlcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKHhjLCB5YywgKDEgLSBzRyAvIHIpICogcjIsIDAsIDIgKiBNYXRoLlBJLCB0cnVlKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc0cgKiAwLjVcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGNlbGwueCArIHIyIC0gczIsIGNlbGwueSArIHIyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIsIGNlbGwueSArIHIyICsgczIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiArIHMyLCBjZWxsLnkgKyByMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMiAtIHMyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHIsIHpmOiB6Ziwgc1NpemU6IHN0YXRTaXplLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHt7eDpudW1iZXIseTpudW1iZXIsb3I6XCJ2XCJ8XCJoXCIsdjE6c3RyaW5nfHVuZGVmaW5lZCx2MjpzdHJpbmd8dW5kZWZpbmVkfX0gU2lkZSAqL1xuXG4vKipcbiAqIEEgc3R5bGUgdG8gc2hvdyB0aGUgc2lkZXMgb2YgZ3JpZCBjZWxscyBiYXNlZCBvbiB0aGVpciBkaWZmZXJlbnQgY2F0ZWdvcmllcy5cbiAqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWRlQ2F0U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSBjYXRlZ29yaWNhbCB2YWx1ZS5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2wgPSBvcHRzLmNvbFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvclxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgYSBjZWxsIHNpZGUgbGluZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHNpZGUsIHIsIHopID0+IHIgKiAwLjIpXG5cbiAgICAgICAgLyoqIEEgZmlsbCBjb2xvciBmb3IgdGhlIGNlbGxzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3JcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgaWYgKCFjZWxscyB8fCBjZWxscy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48U2lkZT59ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gW11cblxuICAgICAgICAvL21ha2UgaG9yaXpvbnRhbCBzaWRlc1xuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeCBhbmQgeVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi54ID09IGMxLnggPyBjMS55IC0gYzIueSA6IGMxLnggLSBjMi54KSlcbiAgICAgICAgbGV0IGMxID0gY2VsbHNbMF1cbiAgICAgICAgbGV0IHYxID0gYzFbdGhpcy5jb2xdXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXG4gICAgICAgICAgICBsZXQgdjIgPSBjMlt0aGlzLmNvbF1cblxuICAgICAgICAgICAgaWYgKGMxLnkgKyByID09IGMyLnkgJiYgYzEueCA9PSBjMi54KSB7XG4gICAgICAgICAgICAgICAgLy9jZWxscyBpbiBzYW1lIGNvbHVtbiBhbmQgdG91Y2ggYWxvbmcgaG9yaXpvbnRhbCBzaWRlXG4gICAgICAgICAgICAgICAgLy9tYWtlIHNoYXJlZCBzaWRlXG4gICAgICAgICAgICAgICAgaWYgKHYxICE9IHYyKSBzaWRlcy5wdXNoKHsgeDogYzEueCwgeTogYzIueSwgb3I6ICdoJywgdjE6IHYxLCB2MjogdjIgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgaG9yaXpvbnRhbCBzaWRlXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogdG9wIG9uZSBmb3IgYzEsIGJvdHRvbSBmb3IgYzJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHsgeDogYzEueCwgeTogYzEueSArIHIsIG9yOiAnaCcsIHYxOiB2MSwgdjI6IHVuZGVmaW5lZCB9KVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goeyB4OiBjMi54LCB5OiBjMi55LCBvcjogJ2gnLCB2MTogdW5kZWZpbmVkLCB2MjogdjIgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICAgICAgdjEgPSB2MlxuICAgICAgICB9XG5cbiAgICAgICAgLy9tYWtlIHZlcnRpY2FsIHNpZGVzXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnkgPT0gYzEueSA/IGMxLnggLSBjMi54IDogYzEueSAtIGMyLnkpKVxuICAgICAgICBjMSA9IGNlbGxzWzBdXG4gICAgICAgIHYxID0gYzFbdGhpcy5jb2xdXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXG4gICAgICAgICAgICBsZXQgdjIgPSBjMlt0aGlzLmNvbF1cblxuICAgICAgICAgICAgaWYgKGMxLnggKyByID09IGMyLnggJiYgYzEueSA9PSBjMi55KSB7XG4gICAgICAgICAgICAgICAgLy9jZWxscyBpbiBzYW1lIHJvdyBhbmQgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxuICAgICAgICAgICAgICAgIGlmICh2MSAhPSB2Mikgc2lkZXMucHVzaCh7IHg6IGMxLnggKyByLCB5OiBjMS55LCBvcjogJ3YnLCB2MTogdjEsIHYyOiB2MiB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGRvIG5vdCB0b3VjaCBhbG9uZyB2ZXJ0aWNhbCBzaWRlXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogcmlnaHQgb25lIGZvciBjMSwgbGVmdCBmb3IgYzJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHsgeDogYzEueCArIHIsIHk6IGMxLnksIG9yOiAndicsIHYxOiB2MSwgdjI6IHVuZGVmaW5lZCB9KVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goeyB4OiBjMi54LCB5OiBjMi55LCBvcjogJ3YnLCB2MTogdW5kZWZpbmVkLCB2MjogdjIgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICAgICAgdjEgPSB2MlxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgLy9kcmF3IGNlbGxzLCBpZiBmaWxsQ29sb3Igc3BlY2lmaWVkXG4gICAgICAgIGlmICh0aGlzLmZpbGxDb2xvcilcbiAgICAgICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsbENvbG9yKGMpXG4gICAgICAgICAgICAgICAgaWYgKCFmYyB8fCBmYyA9PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGZjXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KGMueCwgYy55LCByLCByKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhdyBzaWRlc1xuICAgICAgICBjZy5jdHgubGluZUNhcCA9ICdidXR0J1xuICAgICAgICBmb3IgKGxldCBzIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKHMsIHIsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgdzIgPSB3RyAqIDAuNVxuXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcbiAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cbiAgICAgICAgICAgIGlmIChzLm9yID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAvL3RvcCBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKHMudjIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3Jbcy52Ml1cbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLngsIHMueSArIHcyKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKHMueCArIHIsIHMueSArIHcyKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2JvdHRvbSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKHMudjEpIHtcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3Jbcy52MV1cbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLngsIHMueSAtIHcyKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKHMueCArIHIsIHMueSAtIHcyKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmlnaHQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChzLnYyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW3MudjJdXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8ocy54ICsgdzIsIHMueSlcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhzLnggKyB3Miwgcy55ICsgcilcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9sZWZ0IGxpbmVcbiAgICAgICAgICAgICAgICBpZiAocy52MSkge1xuICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltzLnYxXVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHMueCAtIHcyLCBzLnkpXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8ocy54IC0gdzIsIHMueSArIHIpXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHIsIHpmOiB6ZiB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHt7eDpudW1iZXIseTpudW1iZXIsb3I6XCJ2XCJ8XCJoXCIsdmFsdWU6bnVtYmVyfX0gU2lkZSAqL1xuXG4vKipcbiAqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWRlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgdGhlIGNlbGwgdmFsdWVzLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnZhbHVlQ29sID0gb3B0cy52YWx1ZUNvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdmFsdWUgb2YgYSBjZWxsIHNpZGUuIFRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgZnJvbSB0aGUgdHdvIGFkamFjZW50IGNlbGwgdmFsdWVzLlxuICAgICAgICAgKiBGb3IgaG9yaXpvbnRhbCBzaWRlcywgdjEgaXMgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIGJlbG93IGFuZCB2MiB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgYWJvdmUuXG4gICAgICAgICAqIEZvciB2ZXJ0aWNhbCBzaWRlcywgdjEgaXMgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIGxlZnQgYW5kIHYyIHRoZSB2YWx1ZSBvZiB0aGUgY2VsbCByaWdodC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcnx1bmRlZmluZWQsbnVtYmVyfHVuZGVmaW5lZCxudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRzLnZhbHVlIHx8ICgodjEsIHYyLCByLCBzLCB6ZikgPT4gMSlcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIGEgY2VsbCBzaWRlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSxudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHNpZGUsIHIsIHMsIHpmKSA9PiAociAqIHNpZGUudmFsdWUpIC8gNSlcblxuICAgICAgICAvKiogb3JpZW50YXRpb24uIFNldCB0byA5MCB0byBzaG93IHNpZGVzIGFzIHNsb3BlIGxpbmVzIGZvciBleGFtcGxlLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXG5cbiAgICAgICAgLyoqIEEgZmlsbCBjb2xvciBmb3IgdGhlIGNlbGxzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3JcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICAvL2NvbXB1dGUgc3RhdHMgb24gY2VsbCB2YWx1ZXNcbiAgICAgICAgbGV0IHN0YXRWYWx1ZVxuICAgICAgICBpZiAodGhpcy52YWx1ZUNvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRWYWx1ZSA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMudmFsdWVDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPFNpZGU+fSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXG5cbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHIgKiAwLjAwMVxuXG4gICAgICAgIC8vbWFrZSBob3Jpem9udGFsIHNpZGVzXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB4IGFuZCB5XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnggPT0gYzEueCA/IGMxLnkgLSBjMi55IDogYzEueCAtIGMyLngpKVxuICAgICAgICBsZXQgYzEgPSBjZWxsc1swXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoYzEueSArIHIgLSBjMi55KSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGMxLnggLSBjMi54KSA8PSBlcHNpbG9uKVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSBjb2x1bW4gYW5kIHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB4OiBjMS54LFxuICAgICAgICAgICAgICAgICAgICB5OiBjMi55LFxuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZShjMVt0aGlzLnZhbHVlQ29sXSwgYzJbdGhpcy52YWx1ZUNvbF0sIHIsIHN0YXRWYWx1ZSwgemYpLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGRvIG5vdCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiB0b3Agb25lIGZvciBjMSwgYm90dG9tIGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB4OiBjMS54LFxuICAgICAgICAgICAgICAgICAgICB5OiBjMS55ICsgcixcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUoYzFbdGhpcy52YWx1ZUNvbF0sIHVuZGVmaW5lZCwgciwgc3RhdFZhbHVlLCB6ZiksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSxcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUodW5kZWZpbmVkLCBjMlt0aGlzLnZhbHVlQ29sXSwgciwgc3RhdFZhbHVlLCB6ZiksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG5cbiAgICAgICAgLy9tYWtlIHZlcnRpY2FsIHNpZGVzXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnkgPT0gYzEueSA/IGMxLnggLSBjMi54IDogYzEueSAtIGMyLnkpKVxuICAgICAgICBjMSA9IGNlbGxzWzBdXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXG5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjMS54ICsgciAtIGMyLngpIDw9IGVwc2lsb24gJiYgTWF0aC5hYnMoYzEueSAtIGMyLnkpIDw9IGVwc2lsb24pXG4gICAgICAgICAgICAgICAgLy9jZWxscyBpbiBzYW1lIHJvdyBhbmQgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSxcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUoYzFbdGhpcy52YWx1ZUNvbF0sIGMyW3RoaXMudmFsdWVDb2xdLCByLCBzdGF0VmFsdWUsIHpmKSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHJpZ2h0IG9uZSBmb3IgYzEsIGxlZnQgZm9yIGMyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByLFxuICAgICAgICAgICAgICAgICAgICB5OiBjMS55LFxuICAgICAgICAgICAgICAgICAgICBvcjogJ3YnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZShjMVt0aGlzLnZhbHVlQ29sXSwgdW5kZWZpbmVkLCByLCBzdGF0VmFsdWUsIHpmKSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB4OiBjMi54LFxuICAgICAgICAgICAgICAgICAgICB5OiBjMi55LFxuICAgICAgICAgICAgICAgICAgICBvcjogJ3YnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSh1bmRlZmluZWQsIGMyW3RoaXMudmFsdWVDb2xdLCByLCBzdGF0VmFsdWUsIHpmKSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjMSA9IGMyXG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgICAgIC8vY29tcHV0ZSBzdGF0cyBvbiBzaWRlc1xuICAgICAgICBjb25zdCBzdGF0U2lkZXMgPSBTaWRlU3R5bGUuZ2V0U2lkZVN0YXRpc3RpY3Moc2lkZXMsIHRydWUpXG5cbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xuICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vZHJhdyBjZWxscywgaWYgZmlsbENvbG9yIHNwZWNpZmllZFxuICAgICAgICBpZiAodGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbGxDb2xvcihjKVxuICAgICAgICAgICAgICAgIGlmICghZmMgfHwgZmMgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdChjLngsIGMueSwgciwgcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvL2RyYXcgc2lkZXNcbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSAnYnV0dCdcbiAgICAgICAgY29uc3QgcjIgPSByIC8gMlxuICAgICAgICBmb3IgKGxldCBzIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihzLCByLCBzdGF0U2lkZXMsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzLCByLCBzdGF0U2lkZXMsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PSA5MCkge1xuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8ocy54ICsgcjIsIHMueSArIHIyKVxuICAgICAgICAgICAgICAgIGlmIChzLm9yID09PSAnaCcpIGNnLmN0eC5saW5lVG8ocy54ICsgcjIsIHMueSAtIHIyKVxuICAgICAgICAgICAgICAgIGVsc2UgY2cuY3R4LmxpbmVUbyhzLnggLSByMiwgcy55ICsgcjIpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8ocy54LCBzLnkpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhzLnggKyAocy5vciA9PT0gJ2gnID8gciA6IDApLCBzLnkgKyAocy5vciA9PT0gJ3YnID8gciA6IDApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHNvbWUgc3RhdGlzdGljcyBvbiBhIHZhbHVlIG9mIHNvbWUgc2lkZXMuXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGRlZmluZSBob3cgdG8gZHJhdyBzcGVjaWZpY2FsbHkgdGhlIHNpZGVzIHdpdGhpbiB0aGUgdmlldy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPFNpZGU+fSBzaWRlc1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlWmVyb3NcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB8IHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0U2lkZVN0YXRpc3RpY3Moc2lkZXMsIGlnbm9yZVplcm9zKSB7XG4gICAgICAgIGlmICghc2lkZXMgfHwgc2lkZXMubGVuZ3RoID09IDApIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgbGV0IG1pbiA9IEluZmluaXR5XG4gICAgICAgIGxldCBtYXggPSAtSW5maW5pdHlcbiAgICAgICAgLy9sZXQgc3VtID0gMFxuICAgICAgICAvL2xldCBuYiA9IDBcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gcy52YWx1ZVxuICAgICAgICAgICAgaWYgKGlnbm9yZVplcm9zICYmICF2KSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHZcbiAgICAgICAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2XG4gICAgICAgICAgICAvL3N1bSArPSB2XG4gICAgICAgICAgICAvL25iKytcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtaW46IG1pbiwgbWF4OiBtYXggfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcbmltcG9ydCB7IG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQuanMnXG5pbXBvcnQgeyBtb25pdG9yLCBtb25pdG9yRHVyYXRpb24gfSBmcm9tICcuLi91dGlscy9VdGlscy5qcydcblxuLyoqXG4gKiBTdHlsZSBiYXNlZCBvbiB3ZWJHTFxuICogVG8gc2hvdyBjZWxscyBhcyBjb2xvcmVkIHNxdWFyZXMsIGZyb20gY2F0ZWdvcmllcy5cbiAqIEFsbHMgc3F1YXJlcyB3aXRoIHRoZSBzYW1lIHNpemVcbiAqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTcXVhcmVDb2xvckNhdFdHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgY2F0ZWdvcnkgb2YgdGhlIGNlbGwsIGZvciBjb2xvcmluZy5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgb3B0cy5jb2xvciA9IG9wdHMuY29sb3IgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPHN0cmluZz4gfSBAcHJpdmF0ZSAqL1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcblxuICAgICAgICAvKiogQHR5cGUgeyBvYmplY3QgfSBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgdGhpcy5jYXRUb0lba2V5c1tpXV0gPSBpICsgJydcblxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9IEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuY29sb3JzID0gW11cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBrZXlzW2ldXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgY2VsbHMsIGluIGdlb2dyYXBoaWNhbCB1bml0LiBBbGwgY2VsbHMgaGF2ZSB0aGUgc2FtZSBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgLy8gKHJlc29sdXRpb24sIHpmKSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSAqL1xuICAgICAgICB0aGlzLndncCA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQodGhpcy5jb2xvcnMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogU3F1YXJlQ29sb3JDYXRXR0xTdHlsZSBkcmF3JylcblxuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgLy9hZGQgdmVydGljZSBhbmQgZnJhZ21lbnQgZGF0YVxuICAgICAgICBjb25zdCByMiA9IHIgLyAyXG4gICAgICAgIGxldCBjLFxuICAgICAgICAgICAgbmIgPSBjZWxscy5sZW5ndGhcbiAgICAgICAgY29uc3QgdmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICBjb25zdCBpQnVmZmVyID0gW11cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBjID0gY2VsbHNbaV1cbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IGNbdGhpcy5jb2xvckNvbF1cbiAgICAgICAgICAgIGlmIChjYXQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuZXhwZWN0ZWQgY2F0ZWdvcnk6ICcgKyBjYXQpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgY29uc3QgaV8gPSB0aGlzLmNhdFRvSVtjYXRdXG4gICAgICAgICAgICBpZiAoaXNOYU4oK2lfKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5IGluZGV4OiAnICsgY2F0ICsgJyAnICsgaV8pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goYy54ICsgcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgaUJ1ZmZlci5wdXNoKCtpXylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIHByb2dyYW0gaW5wdXRzIHByZXBhcmF0aW9uJylcblxuICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKGNnLncgKyAnJywgY2cuaCArICcnKVxuICAgICAgICBpZiAoIWN2V0dMKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWIgR0wgY2FudmFzIGNyZWF0aW9uJylcblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgY29uc3Qgc2l6ZUdlbyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShyLCB6ZikgOiByICsgMC4yICogemZcbiAgICAgICAgdGhpcy53Z3AuZHJhdyhjdldHTC5nbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIGNnLmdldFdlYkdMVHJhbnNmb3JtKCksIHNpemVHZW8gLyB6ZilcblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWJnbCBkcmF3aW5nJylcblxuICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICBjZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgY2cuY3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXG5cbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgY2FudmFzIGRyYXdpbmcnKVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHIsIHpmOiB6ZiB9KVxuXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBTcXVhcmVDb2xvckNhdFdHTFN0eWxlIGVuZCBkcmF3JylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzJ1xuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXG5cbi8qKlxuICogU3R5bGUgYmFzZWQgb24gd2ViR0xcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCB3aXRoIGNvbXB1dGF0aW9uIG9mIHRoZSBjb2xvcnMgb24gR1BVIHNpZGUgKGZhc3RlciB0aGFuIEphdmFTY3JpcHQgc2lkZSkuXG4gKiBBbGxzIHNxdWFyZXMgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JXR0xTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHQgdmFsdWUgKHdpdGhpbiBbMCwxXSkgb2YgdGhlIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIHx8ICgodiwgciwgcykgPT4gdiAvIHMubWF4KVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXG4gICAgICAgICAqIFRoZSBzdHJldGNoaW5nIGlzIHBlcmZvcm1lZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKS5cbiAgICAgICAgICogQHR5cGUge3sgZnVuOnN0cmluZywgYWxwaGE6bnVtYmVyIH19ICovXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxuICAgICAgICAgKiBUaGUgY29sb3IgaXMgY29tcHV0ZWQgb24gR1BVIHNpZGUgKGZyYWdtZW50IHNoYWRlcikgYmFzZWQgb24gdGhvc2UgdmFsdWVzIChsaW5lYXIgaW50ZXJwb2xhdGlvbikuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPVxuICAgICAgICAgICAgb3B0cy5jb2xvcnMgfHxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcbiAgICAgICAgICAgICAgICAncmdiKDI0OCwgMTQyLCA4MyknLFxuICAgICAgICAgICAgICAgICdyZ2IoMjUxLCAyNDgsIDE3NiknLFxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxuICAgICAgICAgICAgICAgICdyZ2IoOTQsIDc5LCAxNjIpJyxcbiAgICAgICAgICAgIF0ucmV2ZXJzZSgpXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxuICAgICAgICAgICAgdGhpcy5jb2xvcnMgPSBbXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwKSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjQpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMC42KSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigxKSxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lIHRoZSBvcGFjaXR5IG9mIHRoZSBzdHlsZSwgd2l0aGluIFswLDFdLlxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3BhY2l0eSA9IG9wdHMub3BhY2l0eSAvLyAocix6ZikgPT4gLi4uXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscywgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuIEFsbCBjZWxscyBoYXZlIHRoZSBzYW1lIHNpemUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSAvLyAocmVzb2x1dGlvbiwgemYpID0+IC4uLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIFNxdWFyZUNvbG9yV0dMU3R5bGUgZHJhdycpXG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgIGNvbnN0IHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICBjb2xvciBzdGF0cyBjb21wdXRhdGlvbicpXG5cbiAgICAgICAgaWYgKCFzdGF0Q29sb3IpIHJldHVyblxuXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcbiAgICAgICAgLy9mb3Igb3BhY2l0eSBjb250cm9sLCBzZWU6IGh0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvd2ViZ2wtYW5kLWFscGhhLmh0bWxcbiAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoXG4gICAgICAgICAgICBjZy53ICsgJycsXG4gICAgICAgICAgICBjZy5oICsgJycsXG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgIT0gdW5kZWZpbmVkID8geyBwcmVtdWx0aXBsaWVkQWxwaGE6IGZhbHNlIH0gOiB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgICBpZiAoIWN2V0dMKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWIgR0wgY2FudmFzIGNyZWF0aW9uJylcblxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXG4gICAgICAgIGNvbnN0IHIyID0gciAvIDJcbiAgICAgICAgY29uc3QgdmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICBjb25zdCB0QnVmZmVyID0gW11cbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMudEZ1bihjW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IpXG4gICAgICAgICAgICBpZiAodCA9PSBudWxsIHx8IHQgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgdmVydGljZXNCdWZmZXIucHVzaChjLnggKyByMiwgYy55ICsgcjIpXG4gICAgICAgICAgICB0QnVmZmVyLnB1c2godCA+IDEgPyAxIDogdCA8IDAgPyAwIDogdClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIGRyYXdpbmcgZGF0YSBwcmVwYXJhdGlvbicpXG5cbiAgICAgICAgLy9jb21wdXRlIHBpeGVsIHNpemVcbiAgICAgICAgY29uc3Qgc2l6ZUdlbyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShyLCB6ZikgOiByICsgMC4yICogemZcblxuICAgICAgICAvL2NvbXB1dGUgb3BhY2l0eVxuICAgICAgICBjb25zdCBvcCA9IHRoaXMub3BhY2l0eSA/IHRoaXMub3BhY2l0eShyLCB6ZikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB3Z3AgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkKGN2V0dMLmdsLCB0aGlzLmNvbG9ycywgdGhpcy5zdHJldGNoaW5nLCBzaXplR2VvIC8gemYsIG9wKVxuXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIHByb2dyYW0gcHJlcGFyYXRpb24nKVxuXG4gICAgICAgIC8vZHJhd1xuICAgICAgICB3Z3AuZHJhdyh2ZXJ0aWNlc0J1ZmZlciwgdEJ1ZmZlciwgY2cuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWJnbCBkcmF3aW5nJylcblxuICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICBjZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgY2cuY3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXG5cbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgY2FudmFzIGRyYXdpbmcnKVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHIsIHpmOiB6Ziwgc0NvbG9yOiBzdGF0Q29sb3IgfSlcblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogU3F1YXJlQ29sb3JXR0xTdHlsZSBlbmQgZHJhdycpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xuXG4vKipcbiAqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJva2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zdHJva2VDb2xvckNvbCA9IG9wdHMuc3Ryb2tlQ29sb3JDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBzdHJva2UuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICgoKSA9PiAnIzY2NicpXG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNpemVDb2wgPSBvcHRzLnNpemVDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplXG5cbiAgICAgICAgLyoqIFRoZSBzdHJva2UgbGluZSB3aWR0aCwgaW4gcGl4ZWxzLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoQ29sID0gb3B0cy5zdHJva2VXaWR0aENvbFxuXG4gICAgICAgIC8qKiBUaGUgc3Ryb2tlIGxpbmUgd2lkdGggaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCAvLyAodixyLHMseik9Pi4uLlxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTppbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKCgpID0+ICdzcXVhcmUnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIGxldCBzdGF0Q29sb3JcbiAgICAgICAgaWYgKHRoaXMuc3Ryb2tlQ29sb3JDb2wpIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuc3Ryb2tlQ29sb3JDb2xdLCB0cnVlKVxuXG4gICAgICAgIGxldCBzdGF0U2l6ZVxuICAgICAgICBpZiAodGhpcy5zaXplQ29sKSBzdGF0U2l6ZSA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuc2l6ZUNvbF0sIHRydWUpXG5cbiAgICAgICAgbGV0IHN0YXRXaWR0aFxuICAgICAgICBpZiAodGhpcy5zdHJva2VXaWR0aENvbCkgc3RhdFdpZHRoID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5zdHJva2VXaWR0aENvbF0sIHRydWUpXG5cbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcbiAgICAgICAgLy9pbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBjb25zdCByMiA9IHIgKiAwLjVcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5zdHJva2VDb2xvclxuICAgICAgICAgICAgICAgID8gdGhpcy5zdHJva2VDb2xvcihjZWxsW3RoaXMuc3Ryb2tlQ29sb3JDb2xdLCByLCBzdGF0Q29sb3IpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vc2l6ZVxuICAgICAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICAgICAgbGV0IHNfID0gdGhpcy5zaXplIHx8ICgoKSA9PiByKVxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcbiAgICAgICAgICAgIGNvbnN0IHNHID0gc18oY2VsbFt0aGlzLnNpemVDb2xdLCByLCBzdGF0U2l6ZSwgemYpXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IHdpID0gdGhpcy5zdHJva2VXaWR0aFxuICAgICAgICAgICAgICAgID8gdGhpcy5zdHJva2VXaWR0aChjZWxsW3RoaXMuc3Ryb2tlV2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKVxuICAgICAgICAgICAgICAgIDogMSAqIHpmXG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXG4gICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd2lcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjZWxsKSA6ICdzcXVhcmUnXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6ZilcblxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmVcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gciAqICgxIC0gc0cgLyByKSAqIDAuNVxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5yZWN0KGNlbGwueCArIGQgKyBvZmZzZXQuZHgsIGNlbGwueSArIGQgKyBvZmZzZXQuZHksIHNHLCBzRylcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoY2VsbC54ICsgcjIgKyBvZmZzZXQuZHgsIGNlbGwueSArIHIyICsgb2Zmc2V0LmR5LCBzRyAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RpYW1vbmQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgczIgPSBzRyAqIDAuNVxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY2VsbC54ICsgcjIgLSBzMiwgY2VsbC55ICsgcjIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiwgY2VsbC55ICsgcjIgKyBzMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyICsgczIsIGNlbGwueSArIHIyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIsIGNlbGwueSArIHIyIC0gczIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiAtIHMyLCBjZWxsLnkgKyByMilcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkb251dCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICAvL3RoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByZXNvbHV0aW9uLCB6ZjogemYsIHNTaXplOiBzdGF0U2l6ZSwgc0NvbG9yOiBzdGF0Q29sb3IgfSk7XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTcXVhcmVDb2xvcldHTFN0eWxlIH0gZnJvbSAnLi9TcXVhcmVDb2xvcldHTFN0eWxlLmpzJ1xuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9tYW5pZm9sZC5uZXQvZG9jL21mZDkvZXhhbXBsZV9fdGFuYWthX2NvbnRvdXJzLmh0bVxuICpcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRhbmFrYVN0eWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPGltcG9ydChcIi4uL1N0eWxlXCIpLlN0eWxlPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0KGNvbCwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vZ2V0IGNvbG9ycyBmcm9tIGQzIHJhbXBzLCBpZiAnbmInIGlzIHNwZWNpZmllZFxuICAgICAgICBpZiAob3B0cy5uYiAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLm5iIDwgMikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbG9ycyBpbiB0YW5ha2EgKDwyKTogJyArIG9wdHMubmIpXG4gICAgICAgICAgICAgICAgb3B0cy5uYiA9IDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0cy5jb2xvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NvbG9yIGZ1bmN0aW9uIG5vdCBkZWZpbmVkIGluIHRhbmFrYScpXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvciA9ICgpID0+ICdncmF5J1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0cy5jb2xvcnMgPSBbXVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRzLm5iOyBpKyspIG9wdHMuY29sb3JzLnB1c2gob3B0cy5jb2xvcihpIC8gKG9wdHMubmIgLSAxKSkpXG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNvbG9ycy5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xuICAgICAgICBvcHRzLmNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFsnI2E5YmI5ZScsICcjYzlkY2FhJywgJyNmZGU4OWYnLCAnI2Y5YTU3OScsICcjZWI0NDRiJ11cbiAgICAgICAgY29uc3QgbmIgPSBvcHRzLmNvbG9ycy5sZW5ndGhcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiB0byBjb21wdXRlICd0JyBmcm9tIHRoZSB2YWx1ZSB2XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQpOm51bWJlcn0gKi9cbiAgICAgICAgb3B0cy50RnVuID0gb3B0cy50RnVuIHx8ICgodiwgciwgcykgPT4gKHYgLSBzLm1pbikgLyAocy5tYXggLSBzLm1pbikpXG5cbiAgICAgICAgLy9zaGFkb3cgY29sb3JzXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzExMSdcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2RkZCdcblxuICAgICAgICAvL3dpZHRoIG9mIHRoZSBzZWdtZW50IChzaGFyZSBvZiB0aGUgcmVzb2x1dGlvbilcbiAgICAgICAgb3B0cy53aWR0aEZhY3RvciA9IG9wdHMud2lkdGhGYWN0b3IgfHwgMC4wOFxuXG4gICAgICAgIC8vc2hhZGluZ1xuICAgICAgICBvcHRzLm5ld1NoYWRpbmcgPSBvcHRzLm5ld1NoYWRpbmdcbiAgICAgICAgb3B0cy5uZXdTaGFkaW5nV2lkdGhQaXggPSBvcHRzLm5ld1NoYWRpbmdXaWR0aFBpeCB8fCAyXG4gICAgICAgIC8vdHJhbnNwYXJlbmN5IHZhbHVlLCB3aXRoaW4gWzAsMV1cbiAgICAgICAgb3B0cy5uZXdTaGFkaW5nVHIgPVxuICAgICAgICAgICAgb3B0cy5uZXdTaGFkaW5nVHIgfHxcbiAgICAgICAgICAgICgoc2lkZVZhbHVlLCBzaWRlU3RhdCkgPT5cbiAgICAgICAgICAgICAgICBNYXRoLmFicyhzaWRlVmFsdWUpIC8gTWF0aC5tYXgoTWF0aC5hYnMoc2lkZVN0YXQubWluKSwgTWF0aC5hYnMoc2lkZVN0YXQubWF4KSkpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0IEEgY2VsbCB0IHZhbHVlLCB3aXRoaW4gWzAsMV0uXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSBjbGFzcyBudW1iZXIgZm9yIHRoZSB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZ2V0Q2xhc3MgPSAodCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTmFOKHQpIHx8IHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCB0IHZhbHVlIDE6ICcgKyB0KVxuICAgICAgICAgICAgICAgIHJldHVybiAtOVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSBpZiAodCA8PSAoaSArIDEpIC8gbmIpIHJldHVybiBpXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHQgdmFsdWUgMjogJyArIHQpXG4gICAgICAgICAgICByZXR1cm4gLTlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbFN0eWxlID0gbmV3IFNxdWFyZUNvbG9yV0dMU3R5bGUoe1xuICAgICAgICAgICAgY29sb3JDb2w6IGNvbCxcbiAgICAgICAgICAgIGNvbG9yczogb3B0cy5jb2xvcnMsXG4gICAgICAgICAgICB0RnVuOiAodiwgciwgcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBvcHRzLnRGdW4odiwgciwgcylcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gZ2V0Q2xhc3ModClcbiAgICAgICAgICAgICAgICByZXR1cm4gYyAvIChuYiAtIDEpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy9zdHJldGNoaW5nOiB7IGZ1bjogXCJleHBSZXZcIiwgYWxwaGE6IC03IH0sXG4gICAgICAgICAgICBzaXplOiAociwgemYpID0+IHIgKyAwLjUgKiB6ZiwgLy90aGF0IGlzIHRvIGVuc3VyZSBubyBnYXAgYmV0d2VlbiBzYW1lIGNsYXNzIGNlbGxzIGlzIHZpc2libGVcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLypcbiAgICAgICAgaWYgbm8gd2ViIGdsOiAgICBcbiAgICAgICAgICAgIGNvbnN0IGNvbFN0eWxlID0gbmV3IFNoYXBlQ29sb3JTaXplU3R5bGUoe1xuICAgICAgICAgICAgICAgIGNvbG9yQ29sOiBjb2wsXG4gICAgICAgICAgICAgICAgLy90aGUgY29sb3IgY29ycmVzcG9uZGluZyB0byB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb2xvcjogKHYsIHIsIHMsIHpmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2ID09IDAgJiYgb3B0cy50RnVuICYmIGlzTmFOKG9wdHMudEZ1bih2LCByLCBzKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLmNvbG9yc1tnZXRDbGFzcyhvcHRzLnRGdW4gPyBvcHRzLnRGdW4odiwgciwgcykgOiB2KV1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBcInNxdWFyZVwiLFxuICAgICAgICAgICAgICAgIHNpemU6ICh2LCByLCBzLCB6ZikgPT4gciArIDAuNSAqIHpmLCAvL3RoYXQgaXMgdG8gZW5zdXJlIG5vIGdhcCBiZXR3ZWVuIHNhbWUgY2xhc3MgY2VsbHMgaXMgdmlzaWJsZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKi9cblxuICAgICAgICAvKiogVGhlIHNpZGUgc3R5bGUsIGZvciB0aGUgc2hhZG93IGVmZmVjdCAqL1xuICAgICAgICBjb25zdCBzaWRlU3R5bGUgPSBuZXcgU2lkZVN0eWxlKHtcbiAgICAgICAgICAgIHZhbHVlQ29sOiBjb2wsXG4gICAgICAgICAgICB2YWx1ZTogKHYxLCB2MiwgciwgcywgemYpID0+IHtcbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgdGhlIG51bWJlciBvZiBjbGFzc2VzIG9mIGRpZmZlcmVuY2VcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZCAmJiB2MiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMFxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG9wdHMudEZ1bih2MSwgciwgcylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHQpKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdmFsdWU6ICcgKyB2MSArICcgLSAnICsgdClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGdldENsYXNzKHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjICsgMVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodjEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gb3B0cy50RnVuKHYyLCByLCBzKVxuICAgICAgICAgICAgICAgICAgICBpZiAodCA9PSB1bmRlZmluZWQgfHwgaXNOYU4odCkpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB2YWx1ZTogJyArIHYyICsgJyAtICcgKyB0KVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZ2V0Q2xhc3ModClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1jIC0gMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB0MSA9IG9wdHMudEZ1bih2MSwgciwgcylcbiAgICAgICAgICAgICAgICBpZiAodDEgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHQxKSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjEgKyAnIC0gJyArIHQxKVxuICAgICAgICAgICAgICAgIGNvbnN0IHQyID0gb3B0cy50RnVuKHYyLCByLCBzKVxuICAgICAgICAgICAgICAgIGlmICh0MiA9PSB1bmRlZmluZWQgfHwgaXNOYU4odDIpKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdmFsdWU6ICcgKyB2MiArICcgLSAnICsgdDIpXG4gICAgICAgICAgICAgICAgY29uc3QgYzEgPSBnZXRDbGFzcyh0MSlcbiAgICAgICAgICAgICAgICBjb25zdCBjMiA9IGdldENsYXNzKHQyKVxuICAgICAgICAgICAgICAgIHJldHVybiAtYzIgKyBjMVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY29sb3I6IG9wdHMubmV3U2hhZGluZ1xuICAgICAgICAgICAgICAgID8gLy9ibGFjayB3aXRoIHRyYW5zcGFyZW5jeSBkZXBlbmRpbmcgb24gZGlmZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgKHNpZGUsIHIsIHMsIHopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ciA9IG9wdHMubmV3U2hhZGluZ1RyKHNpZGUudmFsdWUsIHMpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzaWRlLnZhbHVlID4gMCAmJiBzaWRlLm9yID09PSAnaCcpIHx8IChzaWRlLnZhbHVlIDwgMCAmJiBzaWRlLm9yID09PSAndicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JnYmEoMjU1LDI1NSwxMDAsJyArIHRyICsgJyknXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3JnYmEoMCwwLDAsJyArIHRyICsgJyknXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiAvL3doaXRlIG9yIGJsYWNrLCBkZXBlbmRpbmcgb24gb3JpZW50YXRpb24gYW5kIHZhbHVlXG4gICAgICAgICAgICAgICAgICAoc2lkZSwgciwgcywgeikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWRlLnZhbHVlID09PSAwKSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBcImdyYXlcIlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWRlLm9yID09PSAndicpIHJldHVybiBzaWRlLnZhbHVlIDwgMCA/IG9wdHMuY29sQnJpZ2h0IDogb3B0cy5jb2xEYXJrXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGUudmFsdWUgPCAwID8gb3B0cy5jb2xEYXJrIDogb3B0cy5jb2xCcmlnaHRcbiAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHdpZHRoOiBvcHRzLm5ld1NoYWRpbmdcbiAgICAgICAgICAgICAgICA/IC8vZmlsbCBzaXplXG4gICAgICAgICAgICAgICAgICAoc2lkZSwgciwgcywgeikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLm5ld1NoYWRpbmdXaWR0aFBpeCAqIHpcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IC8vd2lkdGggZGVwZW5kcyBvbiB0aGUgdmFsdWUsIHRoYXQgaXMgdGhlIG51bWJlciBvZiBjbGFzc2VzIG9mIGRpZmZlcmVuY2VcbiAgICAgICAgICAgICAgICAgIChzaWRlLCByLCBzLCB6KSA9PlxuICAgICAgICAgICAgICAgICAgICAgIG9wdHMud2lkdGhGYWN0b3IgKiByICogTWF0aC5hYnMoc2lkZS52YWx1ZSkgKiAoc2lkZS5vciA9PT0gJ3YnID8gMC41IDogMSksXG5cbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIFtjb2xTdHlsZSwgc2lkZVN0eWxlXVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgVGV4dFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIHRleHQuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudGV4dENvbCA9IG9wdHMudGV4dENvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdGV4dCBvZiBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnRleHQgPSBvcHRzLnRleHQgfHwgKCh2LCByLCBzLCB6KSA9PiAnWCcpXG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJylcblxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIGZvbnQgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mb250U2l6ZUNvbCA9IG9wdHMuZm9udFNpemVDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZvbnQgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAoKHYsIHIsIHMsIHopID0+IHIgKiAwLjgpXG5cbiAgICAgICAgLyoqIFRoZSB0ZXh0IGZvbnQgZmFtaWx5LlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSBvcHRzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsJ1xuXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IHdlaWdodC5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mb250V2VpZ2h0ID0gb3B0cy5mb250V2VpZ2h0IHx8ICdib2xkJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIGxldCBzdGF0VGV4dFxuICAgICAgICBpZiAodGhpcy50ZXh0Q29sKSB7XG4gICAgICAgICAgICAvL2NvbXB1dGUgdGV4dCB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0VGV4dCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMudGV4dENvbF0sIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhdENvbG9yXG4gICAgICAgIGlmICh0aGlzLmNvbG9yQ29sKSB7XG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdENvbG9yID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5jb2xvckNvbF0sIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhdEZvbnRTaXplXG4gICAgICAgIGlmICh0aGlzLmZvbnRTaXplQ29sKSB7XG4gICAgICAgICAgICAvL2lmIHNpemUgaXMgdXNlZCwgc29ydCBjZWxscyBieSBzaXplIHNvIHRoYXQgdGhlIGJpZ2dlc3QgYXJlIGRyYXduIGZpcnN0XG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMuZm9udFNpemVDb2xdIC0gYzFbdGhpcy5mb250U2l6ZUNvbF0pXG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdEZvbnRTaXplID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5mb250U2l6ZUNvbF0sIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xuICAgICAgICAvL2luIHNjcmVlbiBjb29yZGluYXRlc1xuICAgICAgICBjZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2dldCBjZWxsIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQgPyB0aGlzLnRleHQoY2VsbFt0aGlzLnRleHRDb2xdLCByLCBzdGF0VGV4dCwgemYpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAodGV4dCA9PSB1bmRlZmluZWQgfHwgdGV4dCA9PSBudWxsIHx8IHRleHQgKyAnJyA9PT0gJycpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGxbdGhpcy5jb2xvckNvbF0sIHIsIHN0YXRDb2xvciwgemYpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9mb250IHNpemVcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIHBpeGVsIHVuaXRcbiAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplUGl4ID0gdGhpcy5mb250U2l6ZShjZWxsW3RoaXMuZm9udFNpemVDb2xdLCByLCBzdGF0Rm9udFNpemUsIHpmKSAvIHpmXG5cbiAgICAgICAgICAgIC8vc2V0IGZvbnRcbiAgICAgICAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsJ1xuICAgICAgICAgICAgY29uc3QgZm9udFdlaWdodCA9IHRoaXMuZm9udFdlaWdodCB8fCAnYm9sZCdcbiAgICAgICAgICAgIGNnLmN0eC5mb250ID0gZm9udFdlaWdodCArICcgJyArIGZvbnRTaXplUGl4ICsgJ3B4ICcgKyBmb250RmFtaWx5XG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgemYpXG5cbiAgICAgICAgICAgIC8vdGV4dCBwb3NpdGlvblxuICAgICAgICAgICAgY2cuY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInXG4gICAgICAgICAgICBjb25zdCB0eCA9IGNnLmdlb1RvUGl4WChjZWxsLnggKyByICogMC41ICsgb2Zmc2V0LmR4KVxuICAgICAgICAgICAgY29uc3QgdHkgPSBjZy5nZW9Ub1BpeFkoY2VsbC55ICsgciAqIDAuNSArIG9mZnNldC5keSkgKyBmb250U2l6ZVBpeCAqIDAuMyAvL2l0IHNob3VsZCBiZSAwLjUgYnV0IDAuMyBzZWVtcyB0byB3b3JrIGJldHRlclxuXG4gICAgICAgICAgICAvL2RyYXcgdGhlIHRleHRcbiAgICAgICAgICAgIGNnLmN0eC5maWxsVGV4dCh0ZXh0LCB0eCwgdHkpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYsIHNDb2xvcjogc3RhdENvbG9yIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGQgYSBmdW5jdGlvbiBbMCwxXS0+c3RyaW5nIGZvciBjaGFyYWN0ZXJzIGxlZ2VuZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY2hhcnNcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldENoYXJMZWdlbmRGdW4oY2hhcnMpIHtcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcbiAgICAgICAgcmV0dXJuICh0KSA9PiAodCA9PSAwID8gJycgOiB0ID09IDEgPyBjaGFyc1tuYiAtIDFdIDogY2hhcnNbTWF0aC5mbG9vcih0ICogbmIpXSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7XCJmaXJzdFwifFwiYm90dG9tXCJ8XCJjZW50ZXJcInxcInRvcFwifFwibGFzdFwifSBBbmNob3JNb2RlWUVudW0gKi9cblxuLyoqXG4gKiBTaG93IGNlbGwgYXMgdGltZXNlcmllcyBjaGFydFxuICogQ2FuIGJlIHVzZWQgZm9yIHNwYXJrbGluZSBtYXAgb2YgaHR0cHM6Ly9kYXRhZ2lzdGlwcy5oeXBvdGhlc2VzLm9yZy80ODhcbiAqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lU2VyaWVzU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgY29sdW1ucyBvZiB0aGUgdGltZSBzZXJpZXMsIG9yZGVyZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xuICAgICAgICB0aGlzLnRzID0gb3B0cy50c1xuXG4gICAgICAgIC8veFxuICAgICAgICAvKiogaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub2Zmc2V0WCA9IG9wdHMub2Zmc2V0WCB8fCAoKGMsIHIsIHpmKSA9PiAwKVxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoYywgciwgemYpID0+IHIpXG5cbiAgICAgICAgLy95XG4gICAgICAgIC8qKiBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRZID0gb3B0cy5vZmZzZXRZIHx8ICgoYywgciwgemYpID0+IDApXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGMsIHIsIHpmKSA9PiByKVxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpBbmNob3JNb2RlWUVudW19ICovXG4gICAgICAgIHRoaXMuYW5jaG9yTW9kZVkgPSBvcHRzLmFuY2hvck1vZGVZIHx8ICgoYywgciwgemYpID0+IFwiY2VudGVyXCIpXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5saW5lV2lkdGhDb2wgPSBvcHRzLmxpbmVXaWR0aENvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlLmpzXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgodiwgciwgcywgemYpID0+IDEuNSAqIHpmKVxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGUuanNcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgodiwgciwgcywgemYpID0+ICdibGFjaycpXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBjZ1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIGxldCBzdGF0V2lkdGhcbiAgICAgICAgaWYgKHRoaXMubGluZVdpZHRoQ29sKSB7XG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdFdpZHRoID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5saW5lV2lkdGhDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRDb2xvclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIGNlbGwgYW1wbGl0dWRlXG4gICAgICAgIGNvbnN0IGdldEFtcGxpdHVkZSA9IGMgPT4ge1xuICAgICAgICAgICAgbGV0IG1pbiwgbWF4XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjW3RdO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGlmIChtaW4gPT0gdW5kZWZpbmVkIHx8IHZhbCA8IG1pbikgbWluID0gdmFsXG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PSB1bmRlZmluZWQgfHwgdmFsID4gbWF4KSBtYXggPSB2YWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtaW4gPT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICByZXR1cm4gbWF4IC0gbWluXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgbWF4IGFtcGxpdHVkZVxuICAgICAgICBsZXQgYW1wTWF4XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtcCA9IGdldEFtcGxpdHVkZShjKVxuICAgICAgICAgICAgaWYgKGFtcCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoYW1wTWF4ID09IHVuZGVmaW5lZCB8fCBhbXAgPiBhbXBNYXgpIGFtcE1heCA9IGFtcFxuICAgICAgICB9XG4gICAgICAgIGlmICghYW1wTWF4KSByZXR1cm5cblxuICAgICAgICBjb25zdCBuYiA9IHRoaXMudHMubGVuZ3RoXG5cbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcbiAgICAgICAgLy9pbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICBjZy5jdHgubGluZUNhcCA9ICdidXR0J1xuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG5cbiAgICAgICAgICAgIC8vbGluZSB3aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLmxpbmVXaWR0aCA/IHRoaXMubGluZVdpZHRoKGNbdGhpcy5saW5lV2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGluZSBjb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY1t0aGlzLmNvbG9yQ29sXSwgciwgc3RhdENvbG9yLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuXG5cbiAgICAgICAgICAgIC8veFxuICAgICAgICAgICAgY29uc3Qgb2ZmWCA9IHRoaXMub2Zmc2V0WCA/IHRoaXMub2Zmc2V0WChjLCByLCB6ZikgOiAwXG4gICAgICAgICAgICBpZiAob2ZmWCA9PSB1bmRlZmluZWQgfHwgaXNOYU4ob2ZmWCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoYywgciwgemYpIDogclxuICAgICAgICAgICAgaWYgKHcgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHcpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3lcbiAgICAgICAgICAgIGNvbnN0IG9mZlkgPSB0aGlzLm9mZnNldFkgPyB0aGlzLm9mZnNldFkoYywgciwgemYpIDogMFxuICAgICAgICAgICAgaWYgKG9mZlkgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9mZlkpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoYywgciwgemYpIDogclxuICAgICAgICAgICAgaWYgKGggPT0gdW5kZWZpbmVkIHx8IGlzTmFOKGgpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgYW5jaFkgPSB0aGlzLmFuY2hvck1vZGVZID8gdGhpcy5hbmNob3JNb2RlWShjLCByLCB6ZikgOiBcImNlbnRlclwiXG4gICAgICAgICAgICBpZiAoIWFuY2hZKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgYW5jaG9yIFkgZmlndXJlc1xuICAgICAgICAgICAgbGV0IHZhbDAsIHkwXG4gICAgICAgICAgICBpZiAoYW5jaFkgPT09IFwiZmlyc3RcIikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGZpcnN0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFsMCA9IGNbdGhpcy50c1swXV1cbiAgICAgICAgICAgICAgICB5MCA9IDBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwibGFzdFwiKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgbGFzdCB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhbDAgPSBjW3RoaXMudHNbdGhpcy50cy5sZW5ndGggLSAxXV1cbiAgICAgICAgICAgICAgICB5MCA9IDBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtaW5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gK2NbdF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsMCA9PSB1bmRlZmluZWQgfHwgdmFsIDwgdmFsMCkgdmFsMCA9IHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5MCA9IDBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwidG9wXCIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtYXhcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gK2NbdF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsMCA9PSB1bmRlZmluZWQgfHwgdmFsID4gdmFsMCkgdmFsMCA9IHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5MCA9IHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwiY2VudGVyXCIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtaW4gYW5kIG1heFxuICAgICAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjW3RdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiA9PSB1bmRlZmluZWQgfHwgdmFsIDwgbWluKSBtaW4gPSB2YWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA9PSB1bmRlZmluZWQgfHwgdmFsID4gbWF4KSBtYXggPSB2YWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsMCA9ICgrbWF4ICsgK21pbikgKiAwLjVcbiAgICAgICAgICAgICAgICB5MCA9IHIgLyAyXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5leHBlY3RlZCBhbmNob3JNb2RlWTogXCIgKyBhbmNoWSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbDApKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2RyYXcgbGluZVxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjb25zdCBzWCA9IHcgLyAobmIgLSAxKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0aGlzLnRzW2ldXVxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBicmVha1xuICAgICAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgfVxuXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEdldCB0aGUgY2xhc3MgaWQgZnJvbSBhIHZhbHVlIGFuZCBjbGFzcyBicmVhayB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdiB0aGUgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKiBAcmV0dXJucyBUaGUgY2xhc3MgaWQsIGZyb20gMCB0byBicmVha3MubGVuZ3RoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGFzcyh2LCBicmVha3MpIHtcbiAgICBpZiAoIWJyZWFrcykgcmV0dXJuXG4gICAgaWYgKGJyZWFrcy5sZW5ndGggPT0gMCkgcmV0dXJuIDBcbiAgICBpZiAodiA8PSBicmVha3NbMF0pIHJldHVybiAwXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBicmVha3MubGVuZ3RoOyBpKyspIGlmIChicmVha3NbaSAtIDFdIDwgdiAmJiB2IDw9IGJyZWFrc1tpXSkgcmV0dXJuIGlcbiAgICByZXR1cm4gYnJlYWtzLmxlbmd0aFxufVxuXG5leHBvcnQgbGV0IG1vbml0b3IgPSBmYWxzZVxuXG5sZXQgcHJldmlvdXNEYXRlXG5leHBvcnQgZnVuY3Rpb24gbW9uaXRvckR1cmF0aW9uKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBub3dEYXRlID0gRGF0ZS5ub3coKVxuXG4gICAgLy9maXJzdCBjYWxsXG4gICAgaWYgKCFwcmV2aW91c0RhdGUpIHtcbiAgICAgICAgcHJldmlvdXNEYXRlID0gbm93RGF0ZVxuICAgICAgICBjb25zb2xlLmxvZyhwcmV2aW91c0RhdGUsIG1lc3NhZ2UpXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGQgPSBub3dEYXRlIC0gcHJldmlvdXNEYXRlXG4gICAgcHJldmlvdXNEYXRlID0gbm93RGF0ZVxuICAgIGNvbnNvbGUubG9nKGQsIG1lc3NhZ2UpXG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZyB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihnbCwgc2l6ZVBpeCkge1xuICAgICAgICB0aGlzLmdsID0gZ2xcbiAgICAgICAgdGhpcy5zaXplUGl4ID0gc2l6ZVBpeCB8fCAxMC4wXG5cbiAgICAgICAgdGhpcy5wcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICBnbCxcbiAgICAgICAgICAgIGNyZWF0ZVNoYWRlcihcbiAgICAgICAgICAgICAgICBnbCxcbiAgICAgICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIGF0dHJpYnV0ZSB2ZWMyIHBvcztcbiAgICAgICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XG4gICAgICAgICAgICBhdHRyaWJ1dGUgdmVjNCBjb2xvcjtcbiAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2Q29sb3I7XG4gICAgICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcbiAgICAgICAgICAgICAgZ2xfUG9pbnRTaXplID0gc2l6ZVBpeDtcbiAgICAgICAgICAgICAgdkNvbG9yID0gY29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgYFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNyZWF0ZVNoYWRlcihcbiAgICAgICAgICAgICAgICBnbCxcbiAgICAgICAgICAgICAgICBnbC5GUkFHTUVOVF9TSEFERVIsXG4gICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuICAgICAgICAgICAgdm9pZCBtYWluKHZvaWQpIHtcbiAgICAgICAgICAgICAgICB2ZWM0IHZDb2xvcl8gPSB2Q29sb3IgLyAyNTUuMDtcbiAgICAgICAgICAgICAgICB2Q29sb3JfWzNdID0gMjU1LjAgKiB2Q29sb3JfWzNdO1xuICAgICAgICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHZDb2xvcl87XG4gICAgICAgICAgICB9YFxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKVxuXG4gICAgICAgIC8vYnVmZmVyIGRhdGFcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlciA9IFtdXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyID0gW11cbiAgICB9XG5cbiAgICAvKiogQWRkIGRhdGEgdG8gdmVydGljZXMvc2l6ZS9jb2xvciBidWZmZXJzIGZvciBjb2xvciBzcXVhcmVzIGRyYXdpbmcgKi9cbiAgICBhZGRQb2ludERhdGEoeEMsIHlDLCBjb2wpIHtcbiAgICAgICAgLy9jb252ZXJ0IGNvbG9yXG4gICAgICAgIGNvbnN0IGNjID0gY29sb3IoY29sKVxuICAgICAgICAvL2NvbnN0IGNjID0ge3I6NDUsZzo4NyxiOjk4LG9wYWNpdHk6MC45fVxuICAgICAgICBpZiAoIWNjKSByZXR1cm5cblxuICAgICAgICAvL3ZlcnRpY2VzXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIucHVzaCh4QywgeUMpXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIucHVzaChjYy5yLCBjYy5nLCBjYy5iLCBjYy5vcGFjaXR5KVxuICAgIH1cblxuICAgIGFkZFBvaW50RGF0YTIoeEMsIHlDLCByLCBnLCBiLCBvcGFjaXR5KSB7XG4gICAgICAgIC8vdmVydGljZXNcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlci5wdXNoKHhDLCB5QylcbiAgICAgICAgLy9jb2xvclxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlci5wdXNoKHIsIGcsIGIsIG9wYWNpdHkpXG4gICAgfVxuXG4gICAgLyoqICAqL1xuICAgIGRyYXcodHJhbnNmb01hdCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2xcblxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRoaXMudmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sICdwb3MnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcbiAgICAgICAgICAgIGdsLkZMT0FULCAvL3R5cGVcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcbiAgICAgICAgICAgIDAgLy9vZmZzZXRcbiAgICAgICAgKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcblxuICAgICAgICAvL2NvbG9yIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0aGlzLmNvbG9yc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICB2YXIgY29sb3IgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sICdjb2xvcicpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoY29sb3IsIDQsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoY29sb3IpXG5cbiAgICAgICAgLy9zaXplUGl4XG4gICAgICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnc2l6ZVBpeCcpLCAxLjAgKiB0aGlzLnNpemVQaXgpXG5cbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXG5cbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xuXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB0aGlzLnZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcblxuLyoqXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cbiAqIFRoZSBjb2xvciBpbnRlcnBvbGF0aW9uIGlzIGNvbXB1dGVkIGluIHRoZSBmcmFnbWVudCBzaGFkZXIgcHJvZ3JhbSwgYnkgdGhlIEdQVSwgdGh1cyBpdCBpcyBsZXNzIGZsZXhpYmxlIGJ1dCBmYXN0ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQge1xuICAgIC8vc2VlOlxuICAgIC8vaHR0cHM6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy9mci93ZWJnbC1zaGFkZXJzLWFuZC1nbHNsLmh0bWwjbGVzLXVuaWZvcm1zLWRhbnMtbGVzLXNoYWRlcnMtZGUtdmVydGV4XG4gICAgLy9odHRwczovL3RoZWJvb2tvZnNoYWRlcnMuY29tL2dsb3NzYXJ5Lz9zZWFyY2g9bWl4XG4gICAgLy9odHRwczovL3RoZWJvb2tvZnNoYWRlcnMuY29tLzA2L1xuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS9nbG9zc2FyeS9cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSBnbFxuICAgICAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IGNvbG9yc1xuICAgICAqIEBwYXJhbSB7e2Z1bjpzdHJpbmcsYWxwaGE6bnVtYmVyfX0gc3RyZXRjaGluZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplUGl4XG4gICAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSBnbG9iYWxPcGFjaXR5XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ2wsIGNvbG9ycywgc3RyZXRjaGluZywgc2l6ZVBpeCA9IDEwLCBnbG9iYWxPcGFjaXR5ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSAqL1xuICAgICAgICB0aGlzLmdsID0gZ2xcbiAgICAgICAgLy9nbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRydWUpO1xuICAgICAgICAvL2dsLmJsZW5kRnVuYyhnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuICAgICAgICAvL2dsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXG4gICAgICAgIGNvbnN0IHZTaGFkZXIgPSBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICBnbCxcbiAgICAgICAgICAgIGdsLlZFUlRFWF9TSEFERVIsXG4gICAgICAgICAgICBgXG4gICAgICAgIGF0dHJpYnV0ZSB2ZWMyIHBvcztcbiAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xuICAgICAgICB1bmlmb3JtIG1hdDMgbWF0O1xuXG4gICAgICAgIGF0dHJpYnV0ZSBmbG9hdCB0O1xuICAgICAgICB2YXJ5aW5nIGZsb2F0IHZ0O1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XG4gICAgICAgICAgZ2xfUG9pbnRTaXplID0gc2l6ZVBpeDtcbiAgICAgICAgICB2dCA9IHQ7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICAgICAgKVxuXG4gICAgICAgIC8vcHJlcGFyZSBmcmFnbWVudCBzaGFkZXIgY29kZVxuICAgICAgICAvL2RlY2xhcmUgdGhlIHVuaWZvcm0gYW5kIG90aGVyIHZhcmlhYmxlc1xuICAgICAgICBsZXQgZnNoU3RyaW5nID1cbiAgICAgICAgICAgICcnICtcbiAgICAgICAgICAgICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG4nICtcbiAgICAgICAgICAgICd2YXJ5aW5nIGZsb2F0IHZ0O1xcbicgK1xuICAgICAgICAgICAgJ3VuaWZvcm0gZmxvYXQgYWxwaGE7XFxuJyArXG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIG91dC5wdXNoKCd1bmlmb3JtIHZlYzQgYycgKyBpICsgJztcXG4nKVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXQuam9pbignJylcbiAgICAgICAgICAgIH0pKCkgK1xuICAgICAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvbiwgYXBwbHkgdGhlIHN0cmV0Y2hpbmcgb2YgdFxuICAgICAgICAgICAgJ3ZvaWQgbWFpbih2b2lkKSB7XFxuJ1xuXG4gICAgICAgIGlmIChzdHJldGNoaW5nKSB7XG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ3BvdycpXG4gICAgICAgICAgICAgICAgLy9zUG93ID0gKHQsIGFscGhhID0gMykgPT4gTWF0aC5wb3codCwgYWxwaGEpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHBvdyh2dCwgYWxwaGEpO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdwb3dSZXYnKVxuICAgICAgICAgICAgICAgIC8vc1Bvd1JldiA9ICh0LCBhbHBoYSA9IDMpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgMSAvIGFscGhhKTtcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSAxLjAtcG93KDEuMC12dCwgMS4wL2FscGhhKTtcXG4nXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnZXhwJylcbiAgICAgICAgICAgICAgICAvL3NFeHAgPSAodCwgYWxwaGEgPSAzKSA9PiBhbHBoYSA9PSAwID8gdCA6IChNYXRoLmV4cCh0ICogYWxwaGEpIC0gMSkgLyAoTWF0aC5leHAoYWxwaGEpIC0gMSk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hpbmcuYWxwaGEgPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyAgIGZsb2F0IHQgPSAoZXhwKHZ0ICogYWxwaGEpIC0gMS4wKSAvIChleHAoYWxwaGEpIC0gMS4wKTtcXG4nXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnZXhwUmV2JylcbiAgICAgICAgICAgICAgICAvL3NFeHBSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiBhbHBoYSA9PSAwID8gdCA6IDEgLSAoMSAvIGFscGhhKSAqIE1hdGgubG9nKE1hdGguZXhwKGFscGhhKSAqICgxIC0gdCkgKyB0KTtcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgc3RyZXRjaGluZy5hbHBoYSA9PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBmbG9hdCB0ID0gdnQ7YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnICAgZmxvYXQgdCA9IDEuMCAtICgxLjAgLyBhbHBoYSkgKiBsb2coZXhwKGFscGhhKSAqICgxLjAgLSB2dCkgKyB2dCk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2NpcmNsZUxvdycpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGFscGhhID09IDEpIHJldHVybiBNYXRoLnNxcnQoMiAqIHQgLSB0ICogdCk7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHNxcnQodnQgKiAoMi4wIC0gdnQpKTtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgYSA9IGFscGhhIC8gKDEgLSBhbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguc3FydCgxIC8gKGEgKiBhKSArIHQgKiAoMiAvIGEgKyAyIC0gdCkpIC0gMSAvIGE7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IGEgPSBhbHBoYSAvICgxLjAgLSBhbHBoYSk7XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgdCA9IHNxcnQoMS4wIC8gKGEgKiBhKSArIHZ0ICogKCAyLjAvYSArIDIuMCAtIHZ0ICkpIC0gMS4wIC8gYTtcXG4nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnY2lyY2xlSGlnaCcpIHtcbiAgICAgICAgICAgICAgICAvLyAxIC0gc0NpcmNsZUxvdygxIC0gdCwgYWxwaGEpXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSAxLjAgLSBzcXJ0KCgxLjAgLSB2dCkgKiAoMS4wICsgdnQpKTtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgYSA9IGFscGhhIC8gKDEgLSBhbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguc3FydCgxIC8gKGEgKiBhKSArICgyICogdCkgLyBhICsgMiAqIHQgLSB0ICogdCkgLSAxIC8gYTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgxLjAgLyAoYSAqIGEpICsgKDEuMC12dCkgKiAoIDIuMC9hICsgMS4wICsgdnQgKSkgKyAxLjAgLyBhO1xcbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgc3RyZXRjaGluZyBmdW5jdGlvbiBjb2RlOiAnICsgc3RyZXRjaGluZy5mdW4pXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICB2ZWM0IGNJPWMwO1xcbiAgIHZlYzQgY0Y9YzA7XFxuJ1xuICAgICAgICBlbHNlIGlmIChjb2xvcnMubGVuZ3RoID09IDIpIGZzaFN0cmluZyArPSAnICAgdmVjNCBjST1jMDtcXG4gICB2ZWM0IGNGPWMxO1xcbidcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGggLSAxXG4gICAgICAgICAgICBjb25zdCBuYnMgPSBuYiArICcuMCdcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0Y7XFxuJ1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBpZih0PDEuMC8nICsgbmJzICsgJykgeyBjST1jMDsgY0Y9YzE7IHQ9dConICsgbmJzICsgJzsgfVxcbidcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgJyAgIGVsc2UgaWYodDwnICtcbiAgICAgICAgICAgICAgICAgICAgaSArXG4gICAgICAgICAgICAgICAgICAgICcuMC8nICtcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnOyBjRj1jJyArXG4gICAgICAgICAgICAgICAgICAgIGkgK1xuICAgICAgICAgICAgICAgICAgICAnOyB0PScgK1xuICAgICAgICAgICAgICAgICAgICBuYnMgK1xuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnLjA7IH1cXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAnICAgZWxzZSB7IGNJPWMnICsgKG5iIC0gMSkgKyAnOyBjRj1jJyArIG5iICsgJzsgdD0nICsgbmJzICsgJyp0LScgKyAobmIgLSAxKSArICcuMDsgfVxcbidcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb25lIHNpbmdsZSBjb2xvclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoYzBbMF0sIGMwWzFdLCBjMFsyXSwgYzBbM10pO31cXG4nXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcbiAgICAgICAgZWxzZSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IG1peChjSSwgY0YsIHQpO31cXG4nXG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW19ICovXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2FscGhhJyksIHN0cmV0Y2hpbmcgPyAxLjAgKiBzdHJldGNoaW5nLmFscGhhIDogMC4wKVxuXG4gICAgICAgIC8vY29sb3JzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IoY29sb3JzW2ldKVxuXG4gICAgICAgICAgICBsZXQgb3BhY2l0eSA9IGMub3BhY2l0eVxuICAgICAgICAgICAgaWYgKGMub3BhY2l0eSA9PSAxICYmIGdsb2JhbE9wYWNpdHkgIT0gdW5kZWZpbmVkKSBvcGFjaXR5ID0gZ2xvYmFsT3BhY2l0eVxuXG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdjJyArIGkpLCBbXG4gICAgICAgICAgICAgICAgK2MuciAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK29wYWNpdHksXG4gICAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqICAqL1xuICAgIGRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnByb2dyYW1cblxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vdCBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodEJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCB0ID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3QnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXG5cbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xuXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBDb2xvciBiYXNlZCBvbiBjYXRlZ29yaWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xvcnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBjb2xvcnNcblxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudnNoU3RyaW5nID0gYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgaTtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2aTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdmkgPSBpO1xuICAgICAgICB9XG4gICAgICAgIGBcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgY29uc3Qgb3V0ID0gW11cbiAgICAgICAgb3V0LnB1c2goJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbnZhcnlpbmcgZmxvYXQgdmk7XFxuJylcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcbiAgICAgICAgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcbiAgICAgICAgICAgIG91dC5wdXNoKCcgYycgKyBpKVxuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcbiAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvblxuICAgICAgICBvdXQucHVzaCgndm9pZCBtYWluKHZvaWQpIHtcXG4nKVxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCdlbHNlICcpXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJy4wKSBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMF0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMl0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbM10pO1xcbicpXG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxuICAgICAgICAvKiogRnJhZ21lbnQgc2hhZGVyIHByb2dyYW1cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyhnbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIHRyYW5zZm9NYXQsIHNpemVQaXggPSAxMCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXG4gICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9jb2xvcnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKHRoaXMuY29sb3JzW2ldKVxuICAgICAgICAgICAgZ2wudW5pZm9ybTRmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ2MnICsgaSksIFtcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2MuZyAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9pIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShpQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoaSwgMSwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFNvbWUgZnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXVyb3N0YXQvZ3JpZHZpei9ibG9iL21hc3Rlci9kb2NzL3JlZmVyZW5jZS5tZCNzdHJldGNoaW5nXG4gKiBAc2VlIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AamdhZmZ1cmkvc3RyZXRjaGluZ1xuICovXG5cbi8qKlxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogUG9seW5vbWlhbFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAxOiBubyBzdHJldGNoaW5nLiA8MTogc2hvdyBsb3cgdmFsdWVzLiA+MTogc2hvdyBoaWdoIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxuICovXG5leHBvcnQgY29uc3Qgc1BvdyA9ICh0LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHQsIGFscGhhKVxuXG4vKipcbiAqIEZ1bmN0aW9uIFswLDFdLT5bMCwxXSB0byBzdHJldGNoIHJhbmdlIG9mIHZhbHVlcy5cbiAqIFBvbHlub21pYWwgKHJldmVyc2UpXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHQgVGhlIHZhbHVlIHRvIHN0cmV0Y2gsIHdpdGhpbiBbMCwxXVxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDE6IG5vIHN0cmV0Y2hpbmcuIDwxOiBzaG93IGxvdyB2YWx1ZXMuID4xOiBzaG93IGhpZ2ggdmFsdWVzLlxuICogQHJldHVybnMge251bWJlcn0gVGhlIHN0cmV0Y2hlZCB2YWx1ZSwgd2l0aGluIFswLDFdXG4gKi9cbmV4cG9ydCBjb25zdCBzUG93UmV2ID0gKHQsIGFscGhhID0gMykgPT4gMSAtIE1hdGgucG93KDEgLSB0LCAxIC8gYWxwaGEpXG5cbi8qKlxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogRXhwb25lbnRpYWxcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdCBUaGUgdmFsdWUgdG8gc3RyZXRjaCwgd2l0aGluIFswLDFdXG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgMDogbm8gc3RyZXRjaGluZy4gLUluZjogc2hvdyBsb3cgdmFsdWVzLiBJbmY6IHNob3cgaGlnaCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RyZXRjaGVkIHZhbHVlLCB3aXRoaW4gWzAsMV1cbiAqL1xuZXhwb3J0IGNvbnN0IHNFeHAgPSAodCwgYWxwaGEgPSAzKSA9PiAoYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpKVxuXG4vKipcbiAqIEZ1bmN0aW9uIFswLDFdLT5bMCwxXSB0byBzdHJldGNoIHJhbmdlIG9mIHZhbHVlcy5cbiAqIEV4cG9uZW50aWFsIChyZXZlcnNlKVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAwOiBubyBzdHJldGNoaW5nLiAtSW5mOiBzaG93IGxvdyB2YWx1ZXMuIEluZjogc2hvdyBoaWdoIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxuICovXG5leHBvcnQgY29uc3Qgc0V4cFJldiA9ICh0LCBhbHBoYSA9IDMpID0+XG4gICAgYWxwaGEgPT0gMCA/IHQgOiAxIC0gKDEgLyBhbHBoYSkgKiBNYXRoLmxvZyhNYXRoLmV4cChhbHBoYSkgKiAoMSAtIHQpICsgdClcblxuLyoqXG4gKiBGdW5jdGlvbiBbMCwxXS0+WzAsMV0gdG8gc3RyZXRjaCByYW5nZSBvZiB2YWx1ZXMuXG4gKiBDaXJjbGUsIHNob3cgbG93IHZhbHVlc1xuICogTkI6IHNDaXJjbGVIaWdoIGFuZCBzQ2lyY2xlTG93IGFyZSBpbnZlcnNlIGZ1bmN0aW9ucyBvZiBlYWNoIG90aGVyLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAwOiBubyBzdHJldGNoaW5nLiAxOiBwZXJmZWN0IGNpcmNsZSBzZWN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RyZXRjaGVkIHZhbHVlLCB3aXRoaW4gWzAsMV1cbiAqL1xuZXhwb3J0IGNvbnN0IHNDaXJjbGVMb3cgPSAodCwgYWxwaGEgPSAwLjgpID0+IHtcbiAgICBpZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHRcbiAgICBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCh0ICogKDIgLSB0KSlcbiAgICBjb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKVxuICAgIHJldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhXG59XG5cbi8qKlxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogQ2lyY2xlLCBzaG93IGhpZ2ggdmFsdWVzXG4gKiBOQjogc0NpcmNsZUhpZ2ggYW5kIHNDaXJjbGVMb3cgYXJlIGludmVyc2UgZnVuY3Rpb25zIG9mIGVhY2ggb3RoZXIuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHQgVGhlIHZhbHVlIHRvIHN0cmV0Y2gsIHdpdGhpbiBbMCwxXVxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDA6IG5vIHN0cmV0Y2hpbmcuIDE6IHBlcmZlY3QgY2lyY2xlIHNlY3Rpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxuICovXG5leHBvcnQgY29uc3Qgc0NpcmNsZUhpZ2ggPSAodCwgYWxwaGEgPSAwLjgpID0+IDEgLSBzQ2lyY2xlTG93KDEgLSB0LCBhbHBoYSlcblxuLyoqXG4gKiBJbnZlcnNlIGZ1bmN0aW9uc1xuICovXG5cbi8qKlxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzRXhwXG4gKiBAcGFyYW0ge251bWJlcn0geVxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3Qgc0V4cEludmVyc2UgPSAoeSwgYWxwaGEgPSAzKSA9PlxuICAgIGFscGhhID09IDAgPyB5IDogKDEgLyBhbHBoYSkgKiBNYXRoLmxvZygxIC0geSArIHkgKiBNYXRoLmV4cChhbHBoYSkpXG5cbi8qKlxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzRXhwUmV2XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3Qgc0V4cFJldkludmVyc2UgPSAoeSwgYWxwaGEgPSAzKSA9PiAoTWF0aC5leHAoLWFscGhhICogeSkgLSAxKSAvIChNYXRoLmV4cCgtYWxwaGEpIC0gMSlcblxuLyoqXG4gKiBJbnZlcnNlIGZ1bmN0aW9uIG9mIHNQb3dcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGFcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblxuZXhwb3J0IGNvbnN0IHNQb3dJbnZlcnNlID0gKHksIGFscGhhID0gMykgPT4gTWF0aC5wb3coeSwgMSAvIGFscGhhKVxuXG4vKipcbiAqIEludmVyc2UgZnVuY3Rpb24gb2Ygc1Bvd1JldlxuICogQHBhcmFtIHtudW1iZXJ9IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IHNQb3dSZXZJbnZlcnNlID0gKHksIGFscGhhID0gMykgPT4gMSAtIE1hdGgucG93KDEgLSB5LCBhbHBoYSlcblxuLy90ZXN0IGNvZGVcbi8qXG5mb3IgKGxldCBpID0gMDsgaSA8PSAxOyBpICs9IDAuMDAxKSB7XG4gIC8vY29uc3QgdiA9IGd2aXouc0V4cChndml6LnNFeHBJbnZlcnNlKGkpKTtcbiAgLy9jb25zdCB2ID0gZ3Zpei5zRXhwSW52ZXJzZShndml6LnNFeHAoaSkpO1xuICAvL2NvbnN0IHYgPSBndml6LnNFeHBSZXYoZ3Zpei5zRXhwUmV2SW52ZXJzZShpKSk7XG4gIC8vY29uc3QgdiA9IGd2aXouc0V4cFJldkludmVyc2UoZ3Zpei5zRXhwUmV2KGkpKTtcbiAgLy9jb25zdCB2ID0gZ3Zpei5zUG93KGd2aXouc1Bvd0ludmVyc2UoaSkpO1xuICAvL2NvbnN0IHYgPSBndml6LnNQb3dJbnZlcnNlKGd2aXouc1BvdyhpKSk7XG4gIC8vY29uc3QgdiA9IGd2aXouc1Bvd1Jldihndml6LnNQb3dSZXZJbnZlcnNlKGkpKTtcbiAgLy9jb25zdCB2ID0gZ3Zpei5zUG93UmV2SW52ZXJzZShndml6LnNQb3dSZXYoaSkpO1xuICAvL2NvbnN0IHYgPSBndml6LnNDaXJjbGVMb3coZ3Zpei5zQ2lyY2xlSGlnaChpKSk7XG4gIC8vY29uc3QgdiA9IGd2aXouc0NpcmNsZUhpZ2goZ3Zpei5zQ2lyY2xlTG93KGkpKTtcbiAgY29uc29sZS5sb2coaSAtIHYpXG59XG4qL1xuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB3aWR0aFxuICogQHBhcmFtIHtzdHJpbmd9IGhlaWdodFxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEByZXR1cm5zIHt7Y2FudmFzOkhUTUxDYW52YXNFbGVtZW50LCBnbDpXZWJHTFJlbmRlcmluZ0NvbnRleHR9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVdlYkdMQ2FudmFzKHdpZHRoLCBoZWlnaHQsIG9wdHMpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgpXG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaGVpZ2h0KVxuICAgIGNvbnN0IGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgb3B0cylcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGluaXRpYWxpemUgV2ViR0wuIFlvdXIgYnJvd3NlciBvciBtYWNoaW5lIG1heSBub3Qgc3VwcG9ydCBpdC4nKVxuICAgIH1cbiAgICByZXR1cm4geyBjYW52YXM6IGNhbnZhcywgZ2w6IGdsIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgc2hhZGVyIHByb2dyYW0sIHNvIFdlYkdMIGtub3dzIGhvdyB0byBkcmF3IG91ciBkYXRhXG4gKlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gKiBAcGFyYW0gIHsuLi5XZWJHTFNoYWRlcn0gc2hhZGVyc1xuICogQHJldHVybnMge1dlYkdMUHJvZ3JhbX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRTaGFkZXJQcm9ncmFtKGdsLCAuLi5zaGFkZXJzKSB7XG4gICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW18bnVsbH0gKi9cbiAgICBjb25zdCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpXG4gICAgaWYgKHByb2dyYW0gPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHdlYkdMIHByb2dyYW0nKVxuICAgIGZvciAoY29uc3Qgc2hhZGVyIG9mIHNoYWRlcnMpIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSlcbiAgICBpZiAoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHJldHVybiBwcm9ncmFtXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pIHx8ICdDYW5ub3QgY3JlYXRlIHdlYkdMIHByb2dyYW0gKDIpJylcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hhZGVyIG9mIHRoZSBnaXZlbiB0eXBlLCB1cGxvYWRzIHRoZSBzb3VyY2UgYW5kIGNvbXBpbGVzIGl0LlxuICpcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEBwYXJhbSAgey4uLnN0cmluZ30gc291cmNlc1xuICogQHJldHVybnMge1dlYkdMU2hhZGVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2hhZGVyKGdsLCB0eXBlLCAuLi5zb3VyY2VzKSB7XG4gICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcnxudWxsfSAqL1xuICAgIGNvbnN0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKVxuICAgIGlmIChzaGFkZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHdlYkdMIHNoYWRlcicpXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlcy5qb2luKCdcXG4nKSlcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcilcbiAgICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSByZXR1cm4gc2hhZGVyXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXIgKDIpJylcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB3ZWJHTCBpcyBzdXBwb3J0ZWRcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrV2ViR0xTdXBwb3J0KCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgIHJldHVybiAhIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQgJiZcbiAgICAgICAgICAgIChjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJykpXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogZmFsc2VcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8vIHRoZSBhcHBsaWNhdGlvblxuZXhwb3J0IHsgQXBwIH0gZnJvbSAnLi9BcHAuanMnXG5leHBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL0dlb0NhbnZhcy5qcydcbmV4cG9ydCB7IFN0eWxlIH0gZnJvbSAnLi9TdHlsZS5qcydcbmV4cG9ydCB7IExheWVyIH0gZnJvbSAnLi9MYXllci5qcydcbmV4cG9ydCB7IERhdGFzZXQgfSBmcm9tICcuL0RhdGFzZXQuanMnXG5leHBvcnQgeyBEYXRhc2V0Q29tcG9uZW50IH0gZnJvbSAnLi9EYXRhc2V0Q29tcG9uZW50LmpzJ1xuXG4vLyBleHBvcnQgZGF0YXNldCB0eXBlc1xuZXhwb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcbmV4cG9ydCB7IEdyaWRUaWxlIH0gZnJvbSAnLi9kYXRhc2V0L0dyaWRUaWxlLmpzJ1xuZXhwb3J0IHsgQ1NWR3JpZCB9IGZyb20gJy4vZGF0YXNldC9DU1ZHcmlkLmpzJ1xuLy9leHBvcnQgeyBHZW9USUZGIH0gZnJvbSBcIi4vZGF0YXNldC9HZW9USUZGXCJcblxuLy8gZXhwb3J0IHN0eWxlc1xuZXhwb3J0IHsgU2hhcGVDb2xvclNpemVTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2hhcGVDb2xvclNpemVTdHlsZS5qcydcbmV4cG9ydCB7IFN0cm9rZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TdHJva2VTdHlsZS5qcydcbmV4cG9ydCB7IEpveVBsb3RTdHlsZSB9IGZyb20gJy4vc3R5bGUvSm95UGxvdFN0eWxlLmpzJ1xuZXhwb3J0IHsgQ29tcG9zaXRpb25TdHlsZSB9IGZyb20gJy4vc3R5bGUvQ29tcG9zaXRpb25TdHlsZS5qcydcbmV4cG9ydCB7IFNlZ21lbnRTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2VnbWVudFN0eWxlLmpzJ1xuZXhwb3J0IHsgVGV4dFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9UZXh0U3R5bGUuanMnXG5leHBvcnQgeyBQaWxsYXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvUGlsbGFyU3R5bGUuanMnXG5leHBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVTdHlsZS5qcydcbmV4cG9ydCB7IENvbnRvdXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvQ29udG91clN0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZUNhdFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlQ2F0U3R5bGUuanMnXG5leHBvcnQgeyBEb3REZW5zaXR5U3R5bGUgfSBmcm9tICcuL3N0eWxlL0RvdERlbnNpdHlTdHlsZS5qcydcbmV4cG9ydCB7IFRhbmFrYVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9UYW5ha2FTdHlsZS5qcydcbmV4cG9ydCB7IExlZ29TdHlsZSB9IGZyb20gJy4vc3R5bGUvTGVnb1N0eWxlLmpzJ1xuZXhwb3J0IHsgU3F1YXJlQ29sb3JXR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JXR0xTdHlsZS5qcydcbmV4cG9ydCB7IFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NxdWFyZUNvbG9yQ2F0V0dMU3R5bGUuanMnXG5leHBvcnQgeyBNb3NhaWNTdHlsZSB9IGZyb20gJy4vc3R5bGUvTW9zYWljU3R5bGUuanMnXG5leHBvcnQgeyBOaW5qYVN0YXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvTmluamFTdGFyU3R5bGUuanMnXG5leHBvcnQgeyBUaW1lU2VyaWVzU3R5bGUgfSBmcm9tICcuL3N0eWxlL1RpbWVTZXJpZXNTdHlsZS5qcydcblxuLy8gZXhwb3J0IGFkZGl0aW9uYWwgbGF5ZXJzXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXIgfSBmcm9tICcuL0JhY2tncm91bmRMYXllci5qcydcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllcldNUyB9IGZyb20gJy4vQmFja2dyb3VuZExheWVyV01TLmpzJ1xuZXhwb3J0IHsgTGFiZWxMYXllciB9IGZyb20gJy4vTGFiZWxMYXllci5qcydcbmV4cG9ydCB7IExpbmVMYXllciBhcyBCb3VuZGFyeUxheWVyIH0gZnJvbSAnLi9MaW5lTGF5ZXIuanMnXG5cbi8vIGV4cG9ydCBsZWdlbmRzXG5leHBvcnQgeyBDb2xvckxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yTGVnZW5kLmpzJ1xuZXhwb3J0IHsgQ29sb3JEaXNjcmV0ZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMnXG5leHBvcnQgeyBDb2xvckNhdGVnb3J5TGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JDYXRlZ29yeUxlZ2VuZC5qcydcbmV4cG9ydCB7IFNpemVMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9TaXplTGVnZW5kLmpzJ1xuZXhwb3J0IHsgU2VnbWVudFdpZHRoTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvU2VnbWVudFdpZHRoTGVnZW5kLmpzJ1xuZXhwb3J0IHsgU2VnbWVudE9yaWVudGF0aW9uTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvU2VnbWVudE9yaWVudGF0aW9uTGVnZW5kLmpzJ1xuXG4vLyBleHBvcnQgeyBnb1RvU3RyYWlnaHQsIHpvb21UbyB9IGZyb20gXCIuL3V0aWxzL3pvb21VdGlsc1wiXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3N0cmV0Y2hpbmcuanMnXG5cbmV4cG9ydCB7IGdldENsYXNzIH0gZnJvbSAnLi91dGlscy9VdGlscy5qcydcblxuXG5cblxuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9HZW9DYW52YXMuanMnXG5pbXBvcnQgeyBnZW9BemltdXRoYWxFcXVhbEFyZWEgfSBmcm9tICdkMy1nZW8nXG5cbi8qKlxuICogUmV0dXJucyBsYWJlbCBsYXllciBmcm9tIEV1cm9zdGF0LCBmb3IgRVRSUzg5LUxBRUEgZ3JpZHMuXG4gKiBGcm9tIEV1cm9ueW0gZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2V1cm9ueW1cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5leHBvcnQgY29uc3QgZ2V0RXVyb255bWVMYWJlbExheWVyID0gZnVuY3Rpb24gKGNjID0gJ0VVUicsIHJlcyA9IDUwLCBvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICBjb25zdCBleCA9IG9wdHMuZXggfHwgMS4yXG4gICAgY29uc3QgZm9udEZhbWlseSA9IG9wdHMuZm9udEZhbWlseSB8fCAnQXJpYWwnXG4gICAgY29uc3QgZXhTaXplID0gb3B0cy5leFNpemUgfHwgMVxuICAgIG9wdHMuc3R5bGUgPVxuICAgICAgICBvcHRzLnN0eWxlIHx8XG4gICAgICAgICgobGIsIHpmKSA9PiB7XG4gICAgICAgICAgICBpZiAobGIucnMgPCBleCAqIHpmKSByZXR1cm5cbiAgICAgICAgICAgIGlmIChsYi5yMSA8IGV4ICogemYpIHJldHVybiBleFNpemUgKyAnZW0gJyArIGZvbnRGYW1pbHlcbiAgICAgICAgICAgIHJldHVybiBleFNpemUgKiAxLjUgKyAnZW0gJyArIGZvbnRGYW1pbHlcbiAgICAgICAgfSlcbiAgICAvL0VUUlM4OS1MQUVBIHByb2plY3Rpb25cbiAgICBvcHRzLnByb2ogPVxuICAgICAgICBvcHRzLnByb2ogfHxcbiAgICAgICAgZ2VvQXppbXV0aGFsRXF1YWxBcmVhKClcbiAgICAgICAgICAgIC5yb3RhdGUoWy0xMCwgLTUyXSlcbiAgICAgICAgICAgIC5yZWZsZWN0WChmYWxzZSlcbiAgICAgICAgICAgIC5yZWZsZWN0WSh0cnVlKVxuICAgICAgICAgICAgLnNjYWxlKDYzNzgxMzcpXG4gICAgICAgICAgICAudHJhbnNsYXRlKFs0MzIxMDAwLCAzMjEwMDAwXSlcbiAgICBvcHRzLnByZXByb2Nlc3MgPSAobGIpID0+IHtcbiAgICAgICAgLy9leGNsdWRlIGNvdW50cmllc1xuICAgICAgICAvL2lmKG9wdHMuY2NPdXQgJiYgbGIuY2MgJiYgb3B0cy5jY091dC5pbmNsdWRlcyhsYi5jYykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG9wdHMuY2NJbiAmJiBsYi5jYyAmJiAhKG9wdHMuY2NJbi5pbmRleE9mKGxiLmNjKSA+PSAwKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgLy9wcm9qZWN0IGZyb20gZ2VvIGNvb3JkaW5hdGVzIHRvIEVUUlM4OS1MQUVBXG4gICAgICAgIGNvbnN0IHAgPSBvcHRzLnByb2ooW2xiLmxvbiwgbGIubGF0XSlcbiAgICAgICAgbGIueCA9IHBbMF1cbiAgICAgICAgbGIueSA9IHBbMV1cbiAgICAgICAgZGVsZXRlIGxiLmxvblxuICAgICAgICBkZWxldGUgbGIubGF0XG4gICAgfVxuICAgIG9wdHMuYmFzZVVSTCA9IG9wdHMuYmFzZVVSTCB8fCAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2V1cm9zdGF0L2V1cm9ueW0vbWFpbi9wdWIvdjIvVVRGLydcbiAgICBvcHRzLnVybCA9IG9wdHMuYmFzZVVSTCArIHJlcyArICcvJyArIGNjICsgJy5jc3YnXG4gICAgcmV0dXJuIG9wdHNcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5leHBvcnQgY29uc3QgZ2V0RXVyb3N0YXRCb3VuZGFyaWVzTGF5ZXIgPSBmdW5jdGlvbiAob3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgY29uc3QgbnV0c1llYXIgPSBvcHRzLm51dHNZZWFyIHx8ICcyMDIxJ1xuICAgIGNvbnN0IGNycyA9IG9wdHMuY3JzIHx8ICczMDM1J1xuICAgIGNvbnN0IHNjYWxlID0gb3B0cy5zY2FsZSB8fCAnMDNNJ1xuICAgIGNvbnN0IG51dHNMZXZlbCA9IG9wdHMubnV0c0xldmVsIHx8ICczJ1xuICAgIGNvbnN0IGNvbCA9IG9wdHMuY29sIHx8ICcjODg4J1xuICAgIGNvbnN0IGNvbEtvc292byA9IG9wdHMuY29sS29zb3ZvIHx8ICcjYmNiY2JjJ1xuICAgIGNvbnN0IHNob3dPdGggPSBvcHRzLnNob3dPdGggPT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdHMuc2hvd090aFxuXG4gICAgb3B0cy5jb2xvciA9XG4gICAgICAgIG9wdHMuY29sb3IgfHxcbiAgICAgICAgKChmLCB6ZikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcCA9IGYucHJvcGVydGllc1xuICAgICAgICAgICAgaWYgKCFzaG93T3RoIC8qJiYgcC5jbyA9PSBcIkZcIiovICYmIHAuZXUgIT0gJ1QnICYmIHAuY2MgIT0gJ1QnICYmIHAuZWZ0YSAhPSAnVCcgJiYgcC5vdGggPT09ICdUJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIGlmIChwLmlkID49IDEwMDAwMCkgcmV0dXJuIGNvbEtvc292b1xuICAgICAgICAgICAgaWYgKHAuY28gPT09ICdUJykgcmV0dXJuIGNvbFxuICAgICAgICAgICAgaWYgKHpmIDwgNDAwKSByZXR1cm4gY29sXG4gICAgICAgICAgICBlbHNlIGlmICh6ZiA8IDEwMDApIHJldHVybiBwLmx2bCA+PSAzID8gJycgOiBjb2xcbiAgICAgICAgICAgIGVsc2UgaWYgKHpmIDwgMjAwMCkgcmV0dXJuIHAubHZsID49IDIgPyAnJyA6IGNvbFxuICAgICAgICAgICAgZWxzZSByZXR1cm4gcC5sdmwgPj0gMSA/ICcnIDogY29sXG4gICAgICAgIH0pXG5cbiAgICBvcHRzLndpZHRoID1cbiAgICAgICAgb3B0cy53aWR0aCB8fFxuICAgICAgICAoKGYsIHpmKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwID0gZi5wcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAocC5jbyA9PT0gJ1QnKSByZXR1cm4gMC41XG4gICAgICAgICAgICBpZiAoemYgPCA0MDApIHJldHVybiBwLmx2bCA9PSAzID8gMi4yIDogcC5sdmwgPT0gMiA/IDIuMiA6IHAubHZsID09IDEgPyAyLjIgOiA0XG4gICAgICAgICAgICBlbHNlIGlmICh6ZiA8IDEwMDApIHJldHVybiBwLmx2bCA9PSAyID8gMS44IDogcC5sdmwgPT0gMSA/IDEuOCA6IDIuNVxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAyMDAwKSByZXR1cm4gcC5sdmwgPT0gMSA/IDEuOCA6IDIuNVxuICAgICAgICAgICAgZWxzZSByZXR1cm4gMS4yXG4gICAgICAgIH0pXG5cbiAgICBvcHRzLmxpbmVEYXNoID1cbiAgICAgICAgb3B0cy5saW5lRGFzaCB8fFxuICAgICAgICAoKGYsIHpmKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwID0gZi5wcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAocC5jbyA9PT0gJ1QnKSByZXR1cm4gW11cbiAgICAgICAgICAgIGlmICh6ZiA8IDQwMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5sdmwgPT0gM1xuICAgICAgICAgICAgICAgICAgICA/IFsyICogemYsIDIgKiB6Zl1cbiAgICAgICAgICAgICAgICAgICAgOiBwLmx2bCA9PSAyXG4gICAgICAgICAgICAgICAgICAgID8gWzUgKiB6ZiwgMiAqIHpmXVxuICAgICAgICAgICAgICAgICAgICA6IHAubHZsID09IDFcbiAgICAgICAgICAgICAgICAgICAgPyBbNSAqIHpmLCAyICogemZdXG4gICAgICAgICAgICAgICAgICAgIDogWzEwICogemYsIDMgKiB6Zl1cbiAgICAgICAgICAgIGVsc2UgaWYgKHpmIDwgMTAwMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5sdmwgPT0gMiA/IFs1ICogemYsIDIgKiB6Zl0gOiBwLmx2bCA9PSAxID8gWzUgKiB6ZiwgMiAqIHpmXSA6IFsxMCAqIHpmLCAzICogemZdXG4gICAgICAgICAgICBlbHNlIGlmICh6ZiA8IDIwMDApIHJldHVybiBwLmx2bCA9PSAxID8gWzUgKiB6ZiwgMiAqIHpmXSA6IFsxMCAqIHpmLCAzICogemZdXG4gICAgICAgICAgICBlbHNlIHJldHVybiBbMTAgKiB6ZiwgMyAqIHpmXVxuICAgICAgICB9KVxuXG4gICAgb3B0cy5iYXNlVVJMID0gb3B0cy5iYXNlVVJMIHx8ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZXVyb3N0YXQvTnV0czJqc29uL21hc3Rlci9wdWIvdjIvJ1xuICAgIG9wdHMudXJsID0gb3B0cy5iYXNlVVJMICsgbnV0c1llYXIgKyAnLycgKyBjcnMgKyAnLycgKyBzY2FsZSArICcvbnV0c2JuXycgKyBudXRzTGV2ZWwgKyAnLmpzb24nXG4gICAgcmV0dXJuIG9wdHNcbn1cblxuZXhwb3J0IGNvbnN0IGdldFBhcmFtZXRlckJ5TmFtZSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWVcblxuLy8gc2V0IGRlZmF1bHQgZDMgbG9jYWxlXG5pbXBvcnQgeyBmb3JtYXREZWZhdWx0TG9jYWxlIH0gZnJvbSAnZDMtZm9ybWF0J1xuZm9ybWF0RGVmYXVsdExvY2FsZSh7XG4gICAgZGVjaW1hbDogJy4nLFxuICAgIHRob3VzYW5kczogJyAnLFxuICAgIGdyb3VwaW5nOiBbM10sXG4gICAgY3VycmVuY3k6IFsnJywgJ+KCrCddLFxufSlcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
16257
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHZpei5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSMkM7O0FBRXBDOztBQUVBO0FBQ0E7O0FBRVA7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLElBQUk7QUFDN0Isd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQ25FLDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQ25FLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsMENBQTBDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7O0FBRW5FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzREFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFTywyQkFBMkIsb0RBQVM7O0FBRTNDO0FBQ0EsQ0FBK0M7QUFDL0Msc0RBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2d2aXovd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2ZzdW0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9kcmFnLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvY3N2LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9kc3YuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL3Rzdi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9qc29uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2V4cG9uZW50LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXREZWNpbWFsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFByZWZpeEF1dG8uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFNwZWNpZmllci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9sb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NhcnRlc2lhbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2lyY2xlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2FudGltZXJpZGlhbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2xpcC9idWZmZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvY2lyY2xlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2xpbmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvcmVjdGFuZ2xlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL3Jlam9pbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9tYXRoLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9ub29wLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wYXRoL2JvdW5kcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcG9pbnRFcXVhbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcG9seWdvbkNvbnRhaW5zLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2F6aW11dGhhbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9hemltdXRoYWxFcXVhbEFyZWEuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vZml0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL3Jlc2FtcGxlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9yb3RhdGlvbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvc3RyZWFtLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXNDbG9zZWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL2RlZmF1bHRTb3VyY2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL25vcm1hbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvYXJyYXkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdG9yLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jYWxsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xhc3NlZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0YS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGVzLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmFpc2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2l6ZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3RvckFsbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc291cmNlRXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvYWN0aXZlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL29uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dFR3ZWVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL25vZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy96b29tLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvQXBwLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvQmFja2dyb3VuZExheWVyLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvQmFja2dyb3VuZExheWVyV01TLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvRGF0YXNldC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0RhdGFzZXRDb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9HZW9DYW52YXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9MYWJlbExheWVyLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9MZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9MaW5lTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9TdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL1Rvb2x0aXAuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9kYXRhc2V0L0NTVkdyaWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9kYXRhc2V0L0dyaWRUaWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvZGF0YXNldC9UaWxlZEdyaWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9sZWdlbmQvQ29sb3JDYXRlZ29yeUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2xlZ2VuZC9Db2xvckRpc2NyZXRlTGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvbGVnZW5kL0NvbG9yTGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvbGVnZW5kL1NlZ21lbnRPcmllbnRhdGlvbkxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2xlZ2VuZC9TZWdtZW50V2lkdGhMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9sZWdlbmQvU2l6ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0NvbXBvc2l0aW9uU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9Db250b3VyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9Kb3lQbG90U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9MZWdvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9Nb3NhaWNTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL05pbmphU3RhclN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvUGlsbGFyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TZWdtZW50U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU2lkZUNhdFN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU2lkZVN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU3F1YXJlQ29sb3JDYXRXR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1NxdWFyZUNvbG9yV0dMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TdHJva2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1RhbmFrYVN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvVGV4dFN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvVGltZVNlcmllc1N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvVXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvc3RyZXRjaGluZy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3V0aWxzL3dlYkdMVXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9ndml6L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9ndml6L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZ3Zpei93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2d2aXovLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZ3ZpelwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJndml6XCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vY3B5dGhvbi9ibG9iL2E3NGVlYTIzOGY1YmFiYTE1Nzk3ZTJlOGI1NzBkMTUzYmM4NjkwYTcvTW9kdWxlcy9tYXRobW9kdWxlLmMjTDE0MjNcbmV4cG9ydCBjbGFzcyBBZGRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3BhcnRpYWxzID0gbmV3IEZsb2F0NjRBcnJheSgzMik7XG4gICAgdGhpcy5fbiA9IDA7XG4gIH1cbiAgYWRkKHgpIHtcbiAgICBjb25zdCBwID0gdGhpcy5fcGFydGlhbHM7XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fbiAmJiBqIDwgMzI7IGorKykge1xuICAgICAgY29uc3QgeSA9IHBbal0sXG4gICAgICAgIGhpID0geCArIHksXG4gICAgICAgIGxvID0gTWF0aC5hYnMoeCkgPCBNYXRoLmFicyh5KSA/IHggLSAoaGkgLSB5KSA6IHkgLSAoaGkgLSB4KTtcbiAgICAgIGlmIChsbykgcFtpKytdID0gbG87XG4gICAgICB4ID0gaGk7XG4gICAgfVxuICAgIHBbaV0gPSB4O1xuICAgIHRoaXMuX24gPSBpICsgMTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YWx1ZU9mKCkge1xuICAgIGNvbnN0IHAgPSB0aGlzLl9wYXJ0aWFscztcbiAgICBsZXQgbiA9IHRoaXMuX24sIHgsIHksIGxvLCBoaSA9IDA7XG4gICAgaWYgKG4gPiAwKSB7XG4gICAgICBoaSA9IHBbLS1uXTtcbiAgICAgIHdoaWxlIChuID4gMCkge1xuICAgICAgICB4ID0gaGk7XG4gICAgICAgIHkgPSBwWy0tbl07XG4gICAgICAgIGhpID0geCArIHk7XG4gICAgICAgIGxvID0geSAtIChoaSAtIHgpO1xuICAgICAgICBpZiAobG8pIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG4gPiAwICYmICgobG8gPCAwICYmIHBbbiAtIDFdIDwgMCkgfHwgKGxvID4gMCAmJiBwW24gLSAxXSA+IDApKSkge1xuICAgICAgICB5ID0gbG8gKiAyO1xuICAgICAgICB4ID0gaGkgKyB5O1xuICAgICAgICBpZiAoeSA9PSB4IC0gaGkpIGhpID0geDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmc3VtKHZhbHVlcywgdmFsdWVvZikge1xuICBjb25zdCBhZGRlciA9IG5ldyBBZGRlcigpO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgPSArdmFsdWUpIHtcbiAgICAgICAgYWRkZXIuYWRkKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgPSArdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkge1xuICAgICAgICBhZGRlci5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gK2FkZGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmN1bXN1bSh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgY29uc3QgYWRkZXIgPSBuZXcgQWRkZXIoKTtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIHJldHVybiBGbG9hdDY0QXJyYXkuZnJvbSh2YWx1ZXMsIHZhbHVlb2YgPT09IHVuZGVmaW5lZFxuICAgICAgPyB2ID0+IGFkZGVyLmFkZCgrdiB8fCAwKVxuICAgICAgOiB2ID0+IGFkZGVyLmFkZCgrdmFsdWVvZih2LCArK2luZGV4LCB2YWx1ZXMpIHx8IDApXG4gICk7XG59XG4iLCJmdW5jdGlvbiogZmxhdHRlbihhcnJheXMpIHtcbiAgZm9yIChjb25zdCBhcnJheSBvZiBhcnJheXMpIHtcbiAgICB5aWVsZCogYXJyYXk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2UoYXJyYXlzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGZsYXR0ZW4oYXJyYXlzKSk7XG59XG4iLCJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbG9yKCkge31cblxuZXhwb3J0IHZhciBkYXJrZXIgPSAwLjc7XG5leHBvcnQgdmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjtcblxudmFyIHJlSSA9IFwiXFxcXHMqKFsrLV0/XFxcXGQrKVxcXFxzKlwiLFxuICAgIHJlTiA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KVxcXFxzKlwiLFxuICAgIHJlUCA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFxcXCkkYCksXG4gICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbGFcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBjb3B5KGNoYW5uZWxzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTtcbiAgfSxcbiAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogY29sb3JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LFxuICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCxcbiAgZm9ybWF0UmdiOiBjb2xvcl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2Jcbn0pO1xuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCgpIHtcbiAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbSwgbDtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMFxuICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwXG4gICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMFxuICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwXG4gICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4XG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjtcbiAgbyA9IG8ucmdiKCk7XG4gIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IFJnYihjbGFtcGkodGhpcy5yKSwgY2xhbXBpKHRoaXMuZyksIGNsYW1waSh0aGlzLmIpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBoZXg6IHJnYl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogcmdiX2Zvcm1hdEhleDgsXG4gIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2Jcbn0pKTtcblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7XG4gIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgcmV0dXJuIGAke2EgPT09IDEgPyBcInJnYihcIiA6IFwicmdiYShcIn0ke2NsYW1waSh0aGlzLnIpfSwgJHtjbGFtcGkodGhpcy5nKX0sICR7Y2xhbXBpKHRoaXMuYil9JHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbn1cblxuZnVuY3Rpb24gY2xhbXBhKG9wYWNpdHkpIHtcbiAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTtcbn1cblxuZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbn1cblxuZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gIHZhbHVlID0gY2xhbXBpKHZhbHVlKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBIc2woY2xhbXBoKHRoaXMuaCksIGNsYW1wdCh0aGlzLnMpLCBjbGFtcHQodGhpcy5sKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpXG4gICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgZm9ybWF0SHNsKCkge1xuICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgICByZXR1cm4gYCR7YSA9PT0gMSA/IFwiaHNsKFwiIDogXCJoc2xhKFwifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24gY2xhbXBoKHZhbHVlKSB7XG4gIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwO1xuICByZXR1cm4gdmFsdWUgPCAwID8gdmFsdWUgKyAzNjAgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2xhbXB0KHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSB8fCAwKSk7XG59XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCJpbXBvcnQge3NlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZXZlbnQsIHtub25wYXNzaXZlY2FwdHVyZX0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2aWV3KSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0O1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IFwibm9uZVwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5ZXNkcmFnKHZpZXcsIG5vY2xpY2spIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG51bGwpO1xuICBpZiAobm9jbGljaykge1xuICAgIHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbnVsbCk7IH0sIDApO1xuICB9XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7XG4gICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDtcbiAgfVxufVxuIiwiLy8gVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9ldmVudCB0byBlbnN1cmUgdGhhdCB3ZSBjYW5cbi8vIHByZXZlbnREZWZhdWx0IG9uIHRoZSBldmVudC5cbmV4cG9ydCBjb25zdCBub25wYXNzaXZlID0ge3Bhc3NpdmU6IGZhbHNlfTtcbmV4cG9ydCBjb25zdCBub25wYXNzaXZlY2FwdHVyZSA9IHtjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZX07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciBjc3YgPSBkc3YoXCIsXCIpO1xuXG5leHBvcnQgdmFyIGNzdlBhcnNlID0gY3N2LnBhcnNlO1xuZXhwb3J0IHZhciBjc3ZQYXJzZVJvd3MgPSBjc3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciBjc3ZGb3JtYXQgPSBjc3YuZm9ybWF0O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRCb2R5ID0gY3N2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Um93ID0gY3N2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0VmFsdWUgPSBjc3YuZm9ybWF0VmFsdWU7XG4iLCJ2YXIgRU9MID0ge30sXG4gICAgRU9GID0ge30sXG4gICAgUVVPVEUgPSAzNCxcbiAgICBORVdMSU5FID0gMTAsXG4gICAgUkVUVVJOID0gMTM7XG5cbmZ1bmN0aW9uIG9iamVjdENvbnZlcnRlcihjb2x1bW5zKSB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb24oXCJkXCIsIFwicmV0dXJuIHtcIiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uKG5hbWUsIGkpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobmFtZSkgKyBcIjogZFtcIiArIGkgKyBcIl0gfHwgXFxcIlxcXCJcIjtcbiAgfSkuam9pbihcIixcIikgKyBcIn1cIik7XG59XG5cbmZ1bmN0aW9uIGN1c3RvbUNvbnZlcnRlcihjb2x1bW5zLCBmKSB7XG4gIHZhciBvYmplY3QgPSBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucyk7XG4gIHJldHVybiBmdW5jdGlvbihyb3csIGkpIHtcbiAgICByZXR1cm4gZihvYmplY3Qocm93KSwgaSwgY29sdW1ucyk7XG4gIH07XG59XG5cbi8vIENvbXB1dGUgdW5pcXVlIGNvbHVtbnMgaW4gb3JkZXIgb2YgZGlzY292ZXJ5LlxuZnVuY3Rpb24gaW5mZXJDb2x1bW5zKHJvd3MpIHtcbiAgdmFyIGNvbHVtblNldCA9IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICBjb2x1bW5zID0gW107XG5cbiAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvdykge1xuICAgIGZvciAodmFyIGNvbHVtbiBpbiByb3cpIHtcbiAgICAgIGlmICghKGNvbHVtbiBpbiBjb2x1bW5TZXQpKSB7XG4gICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW5TZXRbY29sdW1uXSA9IGNvbHVtbik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29sdW1ucztcbn1cblxuZnVuY3Rpb24gcGFkKHZhbHVlLCB3aWR0aCkge1xuICB2YXIgcyA9IHZhbHVlICsgXCJcIiwgbGVuZ3RoID0gcy5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oMCkgKyBzIDogcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyIDwgMCA/IFwiLVwiICsgcGFkKC15ZWFyLCA2KVxuICAgIDogeWVhciA+IDk5OTkgPyBcIitcIiArIHBhZCh5ZWFyLCA2KVxuICAgIDogcGFkKHllYXIsIDQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHtcbiAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpLFxuICAgICAgbWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLFxuICAgICAgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gXCJJbnZhbGlkIERhdGVcIlxuICAgICAgOiBmb3JtYXRZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwgNCkgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyKSArIFwiLVwiICsgcGFkKGRhdGUuZ2V0VVRDRGF0ZSgpLCAyKVxuICAgICAgKyAobWlsbGlzZWNvbmRzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIjpcIiArIHBhZChzZWNvbmRzLCAyKSArIFwiLlwiICsgcGFkKG1pbGxpc2Vjb25kcywgMykgKyBcIlpcIlxuICAgICAgOiBzZWNvbmRzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIjpcIiArIHBhZChzZWNvbmRzLCAyKSArIFwiWlwiXG4gICAgICA6IG1pbnV0ZXMgfHwgaG91cnMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiWlwiXG4gICAgICA6IFwiXCIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWxpbWl0ZXIpIHtcbiAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cChcIltcXFwiXCIgKyBkZWxpbWl0ZXIgKyBcIlxcblxccl1cIiksXG4gICAgICBERUxJTUlURVIgPSBkZWxpbWl0ZXIuY2hhckNvZGVBdCgwKTtcblxuICBmdW5jdGlvbiBwYXJzZSh0ZXh0LCBmKSB7XG4gICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3MgPSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgICBpZiAoY29udmVydCkgcmV0dXJuIGNvbnZlcnQocm93LCBpIC0gMSk7XG4gICAgICBjb2x1bW5zID0gcm93LCBjb252ZXJ0ID0gZiA/IGN1c3RvbUNvbnZlcnRlcihyb3csIGYpIDogb2JqZWN0Q29udmVydGVyKHJvdyk7XG4gICAgfSk7XG4gICAgcm93cy5jb2x1bW5zID0gY29sdW1ucyB8fCBbXTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlUm93cyh0ZXh0LCBmKSB7XG4gICAgdmFyIHJvd3MgPSBbXSwgLy8gb3V0cHV0IHJvd3NcbiAgICAgICAgTiA9IHRleHQubGVuZ3RoLFxuICAgICAgICBJID0gMCwgLy8gY3VycmVudCBjaGFyYWN0ZXIgaW5kZXhcbiAgICAgICAgbiA9IDAsIC8vIGN1cnJlbnQgbGluZSBudW1iZXJcbiAgICAgICAgdCwgLy8gY3VycmVudCB0b2tlblxuICAgICAgICBlb2YgPSBOIDw9IDAsIC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9GP1xuICAgICAgICBlb2wgPSBmYWxzZTsgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0w/XG5cbiAgICAvLyBTdHJpcCB0aGUgdHJhaWxpbmcgbmV3bGluZS5cbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gTkVXTElORSkgLS1OO1xuICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoTiAtIDEpID09PSBSRVRVUk4pIC0tTjtcblxuICAgIGZ1bmN0aW9uIHRva2VuKCkge1xuICAgICAgaWYgKGVvZikgcmV0dXJuIEVPRjtcbiAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MO1xuXG4gICAgICAvLyBVbmVzY2FwZSBxdW90ZXMuXG4gICAgICB2YXIgaSwgaiA9IEksIGM7XG4gICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGopID09PSBRVU9URSkge1xuICAgICAgICB3aGlsZSAoSSsrIDwgTiAmJiB0ZXh0LmNoYXJDb2RlQXQoSSkgIT09IFFVT1RFIHx8IHRleHQuY2hhckNvZGVBdCgrK0kpID09PSBRVU9URSk7XG4gICAgICAgIGlmICgoaSA9IEkpID49IE4pIGVvZiA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KEkrKykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4pIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gTkVXTElORSkgKytJOyB9XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGogKyAxLCBpIC0gMSkucmVwbGFjZSgvXCJcIi9nLCBcIlxcXCJcIik7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgbmV4dCBkZWxpbWl0ZXIgb3IgbmV3bGluZS5cbiAgICAgIHdoaWxlIChJIDwgTikge1xuICAgICAgICBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoaSA9IEkrKykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4pIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gTkVXTElORSkgKytJOyB9XG4gICAgICAgIGVsc2UgaWYgKGMgIT09IERFTElNSVRFUikgY29udGludWU7XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGosIGkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gbGFzdCB0b2tlbiBiZWZvcmUgRU9GLlxuICAgICAgcmV0dXJuIGVvZiA9IHRydWUsIHRleHQuc2xpY2UoaiwgTik7XG4gICAgfVxuXG4gICAgd2hpbGUgKCh0ID0gdG9rZW4oKSkgIT09IEVPRikge1xuICAgICAgdmFyIHJvdyA9IFtdO1xuICAgICAgd2hpbGUgKHQgIT09IEVPTCAmJiB0ICE9PSBFT0YpIHJvdy5wdXNoKHQpLCB0ID0gdG9rZW4oKTtcbiAgICAgIGlmIChmICYmIChyb3cgPSBmKHJvdywgbisrKSkgPT0gbnVsbCkgY29udGludWU7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIHJldHVybiByb3dzLm1hcChmdW5jdGlvbihyb3cpIHtcbiAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTtcbiAgICAgIH0pLmpvaW4oZGVsaW1pdGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdChyb3dzLCBjb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICByZXR1cm4gW2NvbHVtbnMubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcildLmNvbmNhdChwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICByZXR1cm4gcHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Um93cyhyb3dzKSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKGZvcm1hdFJvdykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvdyhyb3cpIHtcbiAgICByZXR1cm4gcm93Lm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCJcbiAgICAgICAgOiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyBmb3JtYXREYXRlKHZhbHVlKVxuICAgICAgICA6IHJlRm9ybWF0LnRlc3QodmFsdWUgKz0gXCJcIikgPyBcIlxcXCJcIiArIHZhbHVlLnJlcGxhY2UoL1wiL2csIFwiXFxcIlxcXCJcIikgKyBcIlxcXCJcIlxuICAgICAgICA6IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgcGFyc2VSb3dzOiBwYXJzZVJvd3MsXG4gICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgZm9ybWF0Qm9keTogZm9ybWF0Qm9keSxcbiAgICBmb3JtYXRSb3dzOiBmb3JtYXRSb3dzLFxuICAgIGZvcm1hdFJvdzogZm9ybWF0Um93LFxuICAgIGZvcm1hdFZhbHVlOiBmb3JtYXRWYWx1ZVxuICB9O1xufVxuIiwiaW1wb3J0IGRzdiBmcm9tIFwiLi9kc3YuanNcIjtcblxudmFyIHRzdiA9IGRzdihcIlxcdFwiKTtcblxuZXhwb3J0IHZhciB0c3ZQYXJzZSA9IHRzdi5wYXJzZTtcbmV4cG9ydCB2YXIgdHN2UGFyc2VSb3dzID0gdHN2LnBhcnNlUm93cztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDtcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Qm9keSA9IHRzdi5mb3JtYXRCb2R5O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRSb3dzID0gdHN2LmZvcm1hdFJvd3M7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFJvdyA9IHRzdi5mb3JtYXRSb3c7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFZhbHVlID0gdHN2LmZvcm1hdFZhbHVlO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCJpbXBvcnQge2NzdlBhcnNlLCBkc3ZGb3JtYXQsIHRzdlBhcnNlfSBmcm9tIFwiZDMtZHN2XCI7XG5pbXBvcnQgdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5cbmZ1bmN0aW9uIGRzdlBhcnNlKHBhcnNlKSB7XG4gIHJldHVybiBmdW5jdGlvbihpbnB1dCwgaW5pdCwgcm93KSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGluaXQgPT09IFwiZnVuY3Rpb25cIikgcm93ID0gaW5pdCwgaW5pdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHBhcnNlKHJlc3BvbnNlLCByb3cpO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkc3YoZGVsaW1pdGVyLCBpbnB1dCwgaW5pdCwgcm93KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7XG4gIHZhciBmb3JtYXQgPSBkc3ZGb3JtYXQoZGVsaW1pdGVyKTtcbiAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZm9ybWF0LnBhcnNlKHJlc3BvbnNlLCByb3cpO1xuICB9KTtcbn1cblxuZXhwb3J0IHZhciBjc3YgPSBkc3ZQYXJzZShjc3ZQYXJzZSk7XG5leHBvcnQgdmFyIHRzdiA9IGRzdlBhcnNlKHRzdlBhcnNlKTtcbiIsImZ1bmN0aW9uIHJlc3BvbnNlSnNvbihyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0IHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA1KSByZXR1cm47XG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZUpzb24pO1xufVxuIiwiZnVuY3Rpb24gcmVzcG9uc2VUZXh0KHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VUZXh0KTtcbn1cbiIsImltcG9ydCBmb3JtYXRMb2NhbGUgZnJvbSBcIi4vbG9jYWxlLmpzXCI7XG5cbnZhciBsb2NhbGU7XG5leHBvcnQgdmFyIGZvcm1hdDtcbmV4cG9ydCB2YXIgZm9ybWF0UHJlZml4O1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgdGhvdXNhbmRzOiBcIixcIixcbiAgZ3JvdXBpbmc6IFszXSxcbiAgY3VycmVuY3k6IFtcIiRcIiwgXCJcIl1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICBmb3JtYXQgPSBsb2NhbGUuZm9ybWF0O1xuICBmb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4O1xuICByZXR1cm4gbG9jYWxlO1xufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWxQYXJ0cyhNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gTWF0aC5hYnMoeCA9IE1hdGgucm91bmQoeCkpID49IDFlMjFcbiAgICAgID8geC50b0xvY2FsZVN0cmluZyhcImVuXCIpLnJlcGxhY2UoLywvZywgXCJcIilcbiAgICAgIDogeC50b1N0cmluZygxMCk7XG59XG5cbi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGhcbi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLlxuLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWxQYXJ0cygxLjIzKSByZXR1cm5zIFtcIjEyM1wiLCAwXS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCkge1xuICBpZiAoKGkgPSAoeCA9IHAgPyB4LnRvRXhwb25lbnRpYWwocCAtIDEpIDogeC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoXCJlXCIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHlcbiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTtcblxuICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcXGRcXC5cXGQrZVstK11cXGQrXG4gIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxcZGVbLStdXFxkKyAoZS5nLiwgMWUrMykuXG4gIHJldHVybiBbXG4gICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCxcbiAgICAreC5zbGljZShpICsgMSlcbiAgXTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGdyb3VwaW5nLCB0aG91c2FuZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkge1xuICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLFxuICAgICAgICB0ID0gW10sXG4gICAgICAgIGogPSAwLFxuICAgICAgICBnID0gZ3JvdXBpbmdbMF0sXG4gICAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICB3aGlsZSAoaSA+IDAgJiYgZyA+IDApIHtcbiAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpO1xuICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICBpZiAoKGxlbmd0aCArPSBnICsgMSkgPiB3aWR0aCkgYnJlYWs7XG4gICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdO1xuICAgIH1cblxuICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCB2YXIgcHJlZml4RXhwb25lbnQ7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdLFxuICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDtcbiAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudFxuICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoaSlcbiAgICAgIDogXCIwLlwiICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKFwiMFwiKSArIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IVxufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV07XG4gIHJldHVybiBleHBvbmVudCA8IDAgPyBcIjAuXCIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKFwiMFwiKSArIGNvZWZmaWNpZW50XG4gICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSlcbiAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKFwiMFwiKTtcbn1cbiIsIi8vIFtbZmlsbF1hbGlnbl1bc2lnbl1bc3ltYm9sXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bfl1bdHlwZV1cbnZhciByZSA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcXC0oIF0pPyhbJCNdKT8oMCk/KFxcZCspPygsKT8oXFwuXFxkKyk/KH4pPyhbYS16JV0pPyQvaTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICBpZiAoIShtYXRjaCA9IHJlLmV4ZWMoc3BlY2lmaWVyKSkpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0OiBcIiArIHNwZWNpZmllcik7XG4gIHZhciBtYXRjaDtcbiAgcmV0dXJuIG5ldyBGb3JtYXRTcGVjaWZpZXIoe1xuICAgIGZpbGw6IG1hdGNoWzFdLFxuICAgIGFsaWduOiBtYXRjaFsyXSxcbiAgICBzaWduOiBtYXRjaFszXSxcbiAgICBzeW1ib2w6IG1hdGNoWzRdLFxuICAgIHplcm86IG1hdGNoWzVdLFxuICAgIHdpZHRoOiBtYXRjaFs2XSxcbiAgICBjb21tYTogbWF0Y2hbN10sXG4gICAgcHJlY2lzaW9uOiBtYXRjaFs4XSAmJiBtYXRjaFs4XS5zbGljZSgxKSxcbiAgICB0cmltOiBtYXRjaFs5XSxcbiAgICB0eXBlOiBtYXRjaFsxMF1cbiAgfSk7XG59XG5cbmZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mXG5cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIHRoaXMuZmlsbCA9IHNwZWNpZmllci5maWxsID09PSB1bmRlZmluZWQgPyBcIiBcIiA6IHNwZWNpZmllci5maWxsICsgXCJcIjtcbiAgdGhpcy5hbGlnbiA9IHNwZWNpZmllci5hbGlnbiA9PT0gdW5kZWZpbmVkID8gXCI+XCIgOiBzcGVjaWZpZXIuYWxpZ24gKyBcIlwiO1xuICB0aGlzLnNpZ24gPSBzcGVjaWZpZXIuc2lnbiA9PT0gdW5kZWZpbmVkID8gXCItXCIgOiBzcGVjaWZpZXIuc2lnbiArIFwiXCI7XG4gIHRoaXMuc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci5zeW1ib2wgKyBcIlwiO1xuICB0aGlzLnplcm8gPSAhIXNwZWNpZmllci56ZXJvO1xuICB0aGlzLndpZHRoID0gc3BlY2lmaWVyLndpZHRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLndpZHRoO1xuICB0aGlzLmNvbW1hID0gISFzcGVjaWZpZXIuY29tbWE7XG4gIHRoaXMucHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci5wcmVjaXNpb247XG4gIHRoaXMudHJpbSA9ICEhc3BlY2lmaWVyLnRyaW07XG4gIHRoaXMudHlwZSA9IHNwZWNpZmllci50eXBlID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnR5cGUgKyBcIlwiO1xufVxuXG5Gb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmZpbGxcbiAgICAgICsgdGhpcy5hbGlnblxuICAgICAgKyB0aGlzLnNpZ25cbiAgICAgICsgdGhpcy5zeW1ib2xcbiAgICAgICsgKHRoaXMuemVybyA/IFwiMFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMud2lkdGggPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpXG4gICAgICArICh0aGlzLmNvbW1hID8gXCIsXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBcIi5cIiArIE1hdGgubWF4KDAsIHRoaXMucHJlY2lzaW9uIHwgMCkpXG4gICAgICArICh0aGlzLnRyaW0gPyBcIn5cIiA6IFwiXCIpXG4gICAgICArIHRoaXMudHlwZTtcbn07XG4iLCIvLyBUcmltcyBpbnNpZ25pZmljYW50IHplcm9zLCBlLmcuLCByZXBsYWNlcyAxLjIwMDBrIHdpdGggMS4yay5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHMpIHtcbiAgb3V0OiBmb3IgKHZhciBuID0gcy5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkge1xuICAgIHN3aXRjaCAoc1tpXSkge1xuICAgICAgY2FzZSBcIi5cIjogaTAgPSBpMSA9IGk7IGJyZWFrO1xuICAgICAgY2FzZSBcIjBcIjogaWYgKGkwID09PSAwKSBpMCA9IGk7IGkxID0gaTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBpZiAoIStzW2ldKSBicmVhayBvdXQ7IGlmIChpMCA+IDApIGkwID0gMDsgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBpMCA+IDAgPyBzLnNsaWNlKDAsIGkwKSArIHMuc2xpY2UoaTEgKyAxKSA6IHM7XG59XG4iLCJpbXBvcnQgZm9ybWF0RGVjaW1hbCBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5pbXBvcnQgZm9ybWF0UHJlZml4QXV0byBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgZm9ybWF0Um91bmRlZCBmcm9tIFwiLi9mb3JtYXRSb3VuZGVkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgXCIlXCI6ICh4LCBwKSA9PiAoeCAqIDEwMCkudG9GaXhlZChwKSxcbiAgXCJiXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpLFxuICBcImNcIjogKHgpID0+IHggKyBcIlwiLFxuICBcImRcIjogZm9ybWF0RGVjaW1hbCxcbiAgXCJlXCI6ICh4LCBwKSA9PiB4LnRvRXhwb25lbnRpYWwocCksXG4gIFwiZlwiOiAoeCwgcCkgPT4geC50b0ZpeGVkKHApLFxuICBcImdcIjogKHgsIHApID0+IHgudG9QcmVjaXNpb24ocCksXG4gIFwib1wiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KSxcbiAgXCJwXCI6ICh4LCBwKSA9PiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApLFxuICBcInJcIjogZm9ybWF0Um91bmRlZCxcbiAgXCJzXCI6IGZvcm1hdFByZWZpeEF1dG8sXG4gIFwiWFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSxcbiAgXCJ4XCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcbmltcG9ydCBmb3JtYXRHcm91cCBmcm9tIFwiLi9mb3JtYXRHcm91cC5qc1wiO1xuaW1wb3J0IGZvcm1hdE51bWVyYWxzIGZyb20gXCIuL2Zvcm1hdE51bWVyYWxzLmpzXCI7XG5pbXBvcnQgZm9ybWF0U3BlY2lmaWVyIGZyb20gXCIuL2Zvcm1hdFNwZWNpZmllci5qc1wiO1xuaW1wb3J0IGZvcm1hdFRyaW0gZnJvbSBcIi4vZm9ybWF0VHJpbS5qc1wiO1xuaW1wb3J0IGZvcm1hdFR5cGVzIGZyb20gXCIuL2Zvcm1hdFR5cGVzLmpzXCI7XG5pbXBvcnQge3ByZWZpeEV4cG9uZW50fSBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcblxudmFyIG1hcCA9IEFycmF5LnByb3RvdHlwZS5tYXAsXG4gICAgcHJlZml4ZXMgPSBbXCJ5XCIsXCJ6XCIsXCJhXCIsXCJmXCIsXCJwXCIsXCJuXCIsXCLCtVwiLFwibVwiLFwiXCIsXCJrXCIsXCJNXCIsXCJHXCIsXCJUXCIsXCJQXCIsXCJFXCIsXCJaXCIsXCJZXCJdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsb2NhbGUpIHtcbiAgdmFyIGdyb3VwID0gbG9jYWxlLmdyb3VwaW5nID09PSB1bmRlZmluZWQgfHwgbG9jYWxlLnRob3VzYW5kcyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXRHcm91cChtYXAuY2FsbChsb2NhbGUuZ3JvdXBpbmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyBcIlwiKSxcbiAgICAgIGN1cnJlbmN5UHJlZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzBdICsgXCJcIixcbiAgICAgIGN1cnJlbmN5U3VmZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzFdICsgXCJcIixcbiAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCA9PT0gdW5kZWZpbmVkID8gXCIuXCIgOiBsb2NhbGUuZGVjaW1hbCArIFwiXCIsXG4gICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXROdW1lcmFscyhtYXAuY2FsbChsb2NhbGUubnVtZXJhbHMsIFN0cmluZykpLFxuICAgICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyBcIiVcIiA6IGxvY2FsZS5wZXJjZW50ICsgXCJcIixcbiAgICAgIG1pbnVzID0gbG9jYWxlLm1pbnVzID09PSB1bmRlZmluZWQgPyBcIuKIklwiIDogbG9jYWxlLm1pbnVzICsgXCJcIixcbiAgICAgIG5hbiA9IGxvY2FsZS5uYW4gPT09IHVuZGVmaW5lZCA/IFwiTmFOXCIgOiBsb2NhbGUubmFuICsgXCJcIjtcblxuICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyKSB7XG4gICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcik7XG5cbiAgICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLFxuICAgICAgICBhbGlnbiA9IHNwZWNpZmllci5hbGlnbixcbiAgICAgICAgc2lnbiA9IHNwZWNpZmllci5zaWduLFxuICAgICAgICBzeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sLFxuICAgICAgICB6ZXJvID0gc3BlY2lmaWVyLnplcm8sXG4gICAgICAgIHdpZHRoID0gc3BlY2lmaWVyLndpZHRoLFxuICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSxcbiAgICAgICAgcHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbixcbiAgICAgICAgdHJpbSA9IHNwZWNpZmllci50cmltLFxuICAgICAgICB0eXBlID0gc3BlY2lmaWVyLnR5cGU7XG5cbiAgICAvLyBUaGUgXCJuXCIgdHlwZSBpcyBhbiBhbGlhcyBmb3IgXCIsZ1wiLlxuICAgIGlmICh0eXBlID09PSBcIm5cIikgY29tbWEgPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBUaGUgXCJcIiB0eXBlLCBhbmQgYW55IGludmFsaWQgdHlwZSwgaXMgYW4gYWxpYXMgZm9yIFwiLjEyfmdcIi5cbiAgICBlbHNlIGlmICghZm9ybWF0VHlwZXNbdHlwZV0pIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkICYmIChwcmVjaXNpb24gPSAxMiksIHRyaW0gPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy5cbiAgICBpZiAoemVybyB8fCAoZmlsbCA9PT0gXCIwXCIgJiYgYWxpZ24gPT09IFwiPVwiKSkgemVybyA9IHRydWUsIGZpbGwgPSBcIjBcIiwgYWxpZ24gPSBcIj1cIjtcblxuICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLlxuICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lQcmVmaXggOiBzeW1ib2wgPT09IFwiI1wiICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyBcIjBcIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6IFwiXCIsXG4gICAgICAgIHN1ZmZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVN1ZmZpeCA6IC9bJXBdLy50ZXN0KHR5cGUpID8gcGVyY2VudCA6IFwiXCI7XG5cbiAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlP1xuICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlP1xuICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/XG4gICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlc1t0eXBlXSxcbiAgICAgICAgbWF5YmVTdWZmaXggPSAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTtcblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCxcbiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLlxuICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS5cbiAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uXG4gICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyA2XG4gICAgICAgIDogL1tncHJzXS8udGVzdCh0eXBlKSA/IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBwcmVjaXNpb24pKVxuICAgICAgICA6IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSkge1xuICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LFxuICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LFxuICAgICAgICAgIGksIG4sIGM7XG5cbiAgICAgIGlmICh0eXBlID09PSBcImNcIikge1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gK3ZhbHVlO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgc2lnbi4gLTAgaXMgbm90IGxlc3MgdGhhbiAwLCBidXQgMSAvIC0wIGlzIVxuICAgICAgICB2YXIgdmFsdWVOZWdhdGl2ZSA9IHZhbHVlIDwgMCB8fCAxIC8gdmFsdWUgPCAwO1xuXG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgZm9ybWF0dGluZy5cbiAgICAgICAgdmFsdWUgPSBpc05hTih2YWx1ZSkgPyBuYW4gOiBmb3JtYXRUeXBlKE1hdGguYWJzKHZhbHVlKSwgcHJlY2lzaW9uKTtcblxuICAgICAgICAvLyBUcmltIGluc2lnbmlmaWNhbnQgemVyb3MuXG4gICAgICAgIGlmICh0cmltKSB2YWx1ZSA9IGZvcm1hdFRyaW0odmFsdWUpO1xuXG4gICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gYWZ0ZXIgZm9ybWF0dGluZywgYW5kIG5vIGV4cGxpY2l0IHBvc2l0aXZlIHNpZ24gaXMgcmVxdWVzdGVkLCBoaWRlIHRoZSBzaWduLlxuICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDAgJiYgc2lnbiAhPT0gXCIrXCIpIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSBcIihcIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09PSBcIi1cIiB8fCBzaWduID09PSBcIihcIiA/IFwiXCIgOiBzaWduKSArIHZhbHVlUHJlZml4O1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9ICh0eXBlID09PSBcInNcIiA/IHByZWZpeGVzWzggKyBwcmVmaXhFeHBvbmVudCAvIDNdIDogXCJcIikgKyB2YWx1ZVN1ZmZpeCArICh2YWx1ZU5lZ2F0aXZlICYmIHNpZ24gPT09IFwiKFwiID8gXCIpXCIgOiBcIlwiKTtcblxuICAgICAgICAvLyBCcmVhayB0aGUgZm9ybWF0dGVkIHZhbHVlIGludG8gdGhlIGludGVnZXIg4oCcdmFsdWXigJ0gcGFydCB0aGF0IGNhbiBiZVxuICAgICAgICAvLyBncm91cGVkLCBhbmQgZnJhY3Rpb25hbCBvciBleHBvbmVudGlhbCDigJxzdWZmaXjigJ0gcGFydCB0aGF0IGlzIG5vdC5cbiAgICAgICAgaWYgKG1heWJlU3VmZml4KSB7XG4gICAgICAgICAgaSA9IC0xLCBuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgICBpZiAoYyA9IHZhbHVlLmNoYXJDb2RlQXQoaSksIDQ4ID4gYyB8fCBjID4gNTcpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdWZmaXggPSAoYyA9PT0gNDYgPyBkZWNpbWFsICsgdmFsdWUuc2xpY2UoaSArIDEpIDogdmFsdWUuc2xpY2UoaSkpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgbm90IFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGJlZm9yZSBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmICF6ZXJvKSB2YWx1ZSA9IGdyb3VwKHZhbHVlLCBJbmZpbml0eSk7XG5cbiAgICAgIC8vIENvbXB1dGUgdGhlIHBhZGRpbmcuXG4gICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLFxuICAgICAgICAgIHBhZGRpbmcgPSBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgOiBcIlwiO1xuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYWZ0ZXIgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiB6ZXJvKSB2YWx1ZSA9IGdyb3VwKHBhZGRpbmcgKyB2YWx1ZSwgcGFkZGluZy5sZW5ndGggPyB3aWR0aCAtIHZhbHVlU3VmZml4Lmxlbmd0aCA6IEluZmluaXR5KSwgcGFkZGluZyA9IFwiXCI7XG5cbiAgICAgIC8vIFJlY29uc3RydWN0IHRoZSBmaW5hbCBvdXRwdXQgYmFzZWQgb24gdGhlIGRlc2lyZWQgYWxpZ25tZW50LlxuICAgICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgICBjYXNlIFwiPFwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiPVwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgcGFkZGluZyArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiXlwiOiB2YWx1ZSA9IHBhZGRpbmcuc2xpY2UoMCwgbGVuZ3RoID0gcGFkZGluZy5sZW5ndGggPj4gMSkgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nLnNsaWNlKGxlbmd0aCk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB2YWx1ZSA9IHBhZGRpbmcgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVtZXJhbHModmFsdWUpO1xuICAgIH1cblxuICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNwZWNpZmllciArIFwiXCI7XG4gICAgfTtcblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkge1xuICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSBcImZcIiwgc3BlY2lmaWVyKSksXG4gICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyxcbiAgICAgICAgayA9IE1hdGgucG93KDEwLCAtZSksXG4gICAgICAgIHByZWZpeCA9IHByZWZpeGVzWzggKyBlIC8gM107XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4O1xuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdDogbmV3Rm9ybWF0LFxuICAgIGZvcm1hdFByZWZpeDogZm9ybWF0UHJlZml4XG4gIH07XG59XG4iLCJpbXBvcnQge2FzaW4sIGF0YW4yLCBjb3MsIHNpbiwgc3FydH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BoZXJpY2FsKGNhcnRlc2lhbikge1xuICByZXR1cm4gW2F0YW4yKGNhcnRlc2lhblsxXSwgY2FydGVzaWFuWzBdKSwgYXNpbihjYXJ0ZXNpYW5bMl0pXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhbihzcGhlcmljYWwpIHtcbiAgdmFyIGxhbWJkYSA9IHNwaGVyaWNhbFswXSwgcGhpID0gc3BoZXJpY2FsWzFdLCBjb3NQaGkgPSBjb3MocGhpKTtcbiAgcmV0dXJuIFtjb3NQaGkgKiBjb3MobGFtYmRhKSwgY29zUGhpICogc2luKGxhbWJkYSksIHNpbihwaGkpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhbkRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW5Dcm9zcyhhLCBiKSB7XG4gIHJldHVybiBbYVsxXSAqIGJbMl0gLSBhWzJdICogYlsxXSwgYVsyXSAqIGJbMF0gLSBhWzBdICogYlsyXSwgYVswXSAqIGJbMV0gLSBhWzFdICogYlswXV07XG59XG5cbi8vIFRPRE8gcmV0dXJuIGFcbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW5BZGRJblBsYWNlKGEsIGIpIHtcbiAgYVswXSArPSBiWzBdLCBhWzFdICs9IGJbMV0sIGFbMl0gKz0gYlsyXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhblNjYWxlKHZlY3Rvciwgaykge1xuICByZXR1cm4gW3ZlY3RvclswXSAqIGssIHZlY3RvclsxXSAqIGssIHZlY3RvclsyXSAqIGtdO1xufVxuXG4vLyBUT0RPIHJldHVybiBkXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShkKSB7XG4gIHZhciBsID0gc3FydChkWzBdICogZFswXSArIGRbMV0gKiBkWzFdICsgZFsyXSAqIGRbMl0pO1xuICBkWzBdIC89IGwsIGRbMV0gLz0gbCwgZFsyXSAvPSBsO1xufVxuIiwiaW1wb3J0IHtjYXJ0ZXNpYW4sIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UsIHNwaGVyaWNhbH0gZnJvbSBcIi4vY2FydGVzaWFuLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCB7YWNvcywgY29zLCBkZWdyZWVzLCBlcHNpbG9uLCByYWRpYW5zLCBzaW4sIHRhdX0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuaW1wb3J0IHtyb3RhdGVSYWRpYW5zfSBmcm9tIFwiLi9yb3RhdGlvbi5qc1wiO1xuXG4vLyBHZW5lcmF0ZXMgYSBjaXJjbGUgY2VudGVyZWQgYXQgWzDCsCwgMMKwXSwgd2l0aCBhIGdpdmVuIHJhZGl1cyBhbmQgcHJlY2lzaW9uLlxuZXhwb3J0IGZ1bmN0aW9uIGNpcmNsZVN0cmVhbShzdHJlYW0sIHJhZGl1cywgZGVsdGEsIGRpcmVjdGlvbiwgdDAsIHQxKSB7XG4gIGlmICghZGVsdGEpIHJldHVybjtcbiAgdmFyIGNvc1JhZGl1cyA9IGNvcyhyYWRpdXMpLFxuICAgICAgc2luUmFkaXVzID0gc2luKHJhZGl1cyksXG4gICAgICBzdGVwID0gZGlyZWN0aW9uICogZGVsdGE7XG4gIGlmICh0MCA9PSBudWxsKSB7XG4gICAgdDAgPSByYWRpdXMgKyBkaXJlY3Rpb24gKiB0YXU7XG4gICAgdDEgPSByYWRpdXMgLSBzdGVwIC8gMjtcbiAgfSBlbHNlIHtcbiAgICB0MCA9IGNpcmNsZVJhZGl1cyhjb3NSYWRpdXMsIHQwKTtcbiAgICB0MSA9IGNpcmNsZVJhZGl1cyhjb3NSYWRpdXMsIHQxKTtcbiAgICBpZiAoZGlyZWN0aW9uID4gMCA/IHQwIDwgdDEgOiB0MCA+IHQxKSB0MCArPSBkaXJlY3Rpb24gKiB0YXU7XG4gIH1cbiAgZm9yICh2YXIgcG9pbnQsIHQgPSB0MDsgZGlyZWN0aW9uID4gMCA/IHQgPiB0MSA6IHQgPCB0MTsgdCAtPSBzdGVwKSB7XG4gICAgcG9pbnQgPSBzcGhlcmljYWwoW2Nvc1JhZGl1cywgLXNpblJhZGl1cyAqIGNvcyh0KSwgLXNpblJhZGl1cyAqIHNpbih0KV0pO1xuICAgIHN0cmVhbS5wb2ludChwb2ludFswXSwgcG9pbnRbMV0pO1xuICB9XG59XG5cbi8vIFJldHVybnMgdGhlIHNpZ25lZCBhbmdsZSBvZiBhIGNhcnRlc2lhbiBwb2ludCByZWxhdGl2ZSB0byBbY29zUmFkaXVzLCAwLCAwXS5cbmZ1bmN0aW9uIGNpcmNsZVJhZGl1cyhjb3NSYWRpdXMsIHBvaW50KSB7XG4gIHBvaW50ID0gY2FydGVzaWFuKHBvaW50KSwgcG9pbnRbMF0gLT0gY29zUmFkaXVzO1xuICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKHBvaW50KTtcbiAgdmFyIHJhZGl1cyA9IGFjb3MoLXBvaW50WzFdKTtcbiAgcmV0dXJuICgoLXBvaW50WzJdIDwgMCA/IC1yYWRpdXMgOiByYWRpdXMpICsgdGF1IC0gZXBzaWxvbikgJSB0YXU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2VudGVyID0gY29uc3RhbnQoWzAsIDBdKSxcbiAgICAgIHJhZGl1cyA9IGNvbnN0YW50KDkwKSxcbiAgICAgIHByZWNpc2lvbiA9IGNvbnN0YW50KDYpLFxuICAgICAgcmluZyxcbiAgICAgIHJvdGF0ZSxcbiAgICAgIHN0cmVhbSA9IHtwb2ludDogcG9pbnR9O1xuXG4gIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHtcbiAgICByaW5nLnB1c2goeCA9IHJvdGF0ZSh4LCB5KSk7XG4gICAgeFswXSAqPSBkZWdyZWVzLCB4WzFdICo9IGRlZ3JlZXM7XG4gIH1cblxuICBmdW5jdGlvbiBjaXJjbGUoKSB7XG4gICAgdmFyIGMgPSBjZW50ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgciA9IHJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICogcmFkaWFucyxcbiAgICAgICAgcCA9IHByZWNpc2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpICogcmFkaWFucztcbiAgICByaW5nID0gW107XG4gICAgcm90YXRlID0gcm90YXRlUmFkaWFucygtY1swXSAqIHJhZGlhbnMsIC1jWzFdICogcmFkaWFucywgMCkuaW52ZXJ0O1xuICAgIGNpcmNsZVN0cmVhbShzdHJlYW0sIHIsIHAsIDEpO1xuICAgIGMgPSB7dHlwZTogXCJQb2x5Z29uXCIsIGNvb3JkaW5hdGVzOiBbcmluZ119O1xuICAgIHJpbmcgPSByb3RhdGUgPSBudWxsO1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgY2lyY2xlLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjZW50ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFsrX1swXSwgK19bMV1dKSwgY2lyY2xlKSA6IGNlbnRlcjtcbiAgfTtcblxuICBjaXJjbGUucmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBjaXJjbGUpIDogcmFkaXVzO1xuICB9O1xuXG4gIGNpcmNsZS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJlY2lzaW9uID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGNpcmNsZSkgOiBwcmVjaXNpb247XG4gIH07XG5cbiAgcmV0dXJuIGNpcmNsZTtcbn1cbiIsImltcG9ydCBjbGlwIGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge2FicywgYXRhbiwgY29zLCBlcHNpbG9uLCBoYWxmUGksIHBpLCBzaW59IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsaXAoXG4gIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSxcbiAgY2xpcEFudGltZXJpZGlhbkxpbmUsXG4gIGNsaXBBbnRpbWVyaWRpYW5JbnRlcnBvbGF0ZSxcbiAgWy1waSwgLWhhbGZQaV1cbik7XG5cbi8vIFRha2VzIGEgbGluZSBhbmQgY3V0cyBpbnRvIHZpc2libGUgc2VnbWVudHMuIFJldHVybiB2YWx1ZXM6IDAgLSB0aGVyZSB3ZXJlXG4vLyBpbnRlcnNlY3Rpb25zIG9yIHRoZSBsaW5lIHdhcyBlbXB0eTsgMSAtIG5vIGludGVyc2VjdGlvbnM7IDIgLSB0aGVyZSB3ZXJlXG4vLyBpbnRlcnNlY3Rpb25zLCBhbmQgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzIHNob3VsZCBiZSByZWpvaW5lZC5cbmZ1bmN0aW9uIGNsaXBBbnRpbWVyaWRpYW5MaW5lKHN0cmVhbSkge1xuICB2YXIgbGFtYmRhMCA9IE5hTixcbiAgICAgIHBoaTAgPSBOYU4sXG4gICAgICBzaWduMCA9IE5hTixcbiAgICAgIGNsZWFuOyAvLyBubyBpbnRlcnNlY3Rpb25zXG5cbiAgcmV0dXJuIHtcbiAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgY2xlYW4gPSAxO1xuICAgIH0sXG4gICAgcG9pbnQ6IGZ1bmN0aW9uKGxhbWJkYTEsIHBoaTEpIHtcbiAgICAgIHZhciBzaWduMSA9IGxhbWJkYTEgPiAwID8gcGkgOiAtcGksXG4gICAgICAgICAgZGVsdGEgPSBhYnMobGFtYmRhMSAtIGxhbWJkYTApO1xuICAgICAgaWYgKGFicyhkZWx0YSAtIHBpKSA8IGVwc2lsb24pIHsgLy8gbGluZSBjcm9zc2VzIGEgcG9sZVxuICAgICAgICBzdHJlYW0ucG9pbnQobGFtYmRhMCwgcGhpMCA9IChwaGkwICsgcGhpMSkgLyAyID4gMCA/IGhhbGZQaSA6IC1oYWxmUGkpO1xuICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjAsIHBoaTApO1xuICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgIHN0cmVhbS5wb2ludChzaWduMSwgcGhpMCk7XG4gICAgICAgIHN0cmVhbS5wb2ludChsYW1iZGExLCBwaGkwKTtcbiAgICAgICAgY2xlYW4gPSAwO1xuICAgICAgfSBlbHNlIGlmIChzaWduMCAhPT0gc2lnbjEgJiYgZGVsdGEgPj0gcGkpIHsgLy8gbGluZSBjcm9zc2VzIGFudGltZXJpZGlhblxuICAgICAgICBpZiAoYWJzKGxhbWJkYTAgLSBzaWduMCkgPCBlcHNpbG9uKSBsYW1iZGEwIC09IHNpZ24wICogZXBzaWxvbjsgLy8gaGFuZGxlIGRlZ2VuZXJhY2llc1xuICAgICAgICBpZiAoYWJzKGxhbWJkYTEgLSBzaWduMSkgPCBlcHNpbG9uKSBsYW1iZGExIC09IHNpZ24xICogZXBzaWxvbjtcbiAgICAgICAgcGhpMCA9IGNsaXBBbnRpbWVyaWRpYW5JbnRlcnNlY3QobGFtYmRhMCwgcGhpMCwgbGFtYmRhMSwgcGhpMSk7XG4gICAgICAgIHN0cmVhbS5wb2ludChzaWduMCwgcGhpMCk7XG4gICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24xLCBwaGkwKTtcbiAgICAgICAgY2xlYW4gPSAwO1xuICAgICAgfVxuICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTAgPSBsYW1iZGExLCBwaGkwID0gcGhpMSk7XG4gICAgICBzaWduMCA9IHNpZ24xO1xuICAgIH0sXG4gICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgbGFtYmRhMCA9IHBoaTAgPSBOYU47XG4gICAgfSxcbiAgICBjbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gMiAtIGNsZWFuOyAvLyBpZiBpbnRlcnNlY3Rpb25zLCByZWpvaW4gZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHNcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsaXBBbnRpbWVyaWRpYW5JbnRlcnNlY3QobGFtYmRhMCwgcGhpMCwgbGFtYmRhMSwgcGhpMSkge1xuICB2YXIgY29zUGhpMCxcbiAgICAgIGNvc1BoaTEsXG4gICAgICBzaW5MYW1iZGEwTGFtYmRhMSA9IHNpbihsYW1iZGEwIC0gbGFtYmRhMSk7XG4gIHJldHVybiBhYnMoc2luTGFtYmRhMExhbWJkYTEpID4gZXBzaWxvblxuICAgICAgPyBhdGFuKChzaW4ocGhpMCkgKiAoY29zUGhpMSA9IGNvcyhwaGkxKSkgKiBzaW4obGFtYmRhMSlcbiAgICAgICAgICAtIHNpbihwaGkxKSAqIChjb3NQaGkwID0gY29zKHBoaTApKSAqIHNpbihsYW1iZGEwKSlcbiAgICAgICAgICAvIChjb3NQaGkwICogY29zUGhpMSAqIHNpbkxhbWJkYTBMYW1iZGExKSlcbiAgICAgIDogKHBoaTAgKyBwaGkxKSAvIDI7XG59XG5cbmZ1bmN0aW9uIGNsaXBBbnRpbWVyaWRpYW5JbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHtcbiAgdmFyIHBoaTtcbiAgaWYgKGZyb20gPT0gbnVsbCkge1xuICAgIHBoaSA9IGRpcmVjdGlvbiAqIGhhbGZQaTtcbiAgICBzdHJlYW0ucG9pbnQoLXBpLCBwaGkpO1xuICAgIHN0cmVhbS5wb2ludCgwLCBwaGkpO1xuICAgIHN0cmVhbS5wb2ludChwaSwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQocGksIDApO1xuICAgIHN0cmVhbS5wb2ludChwaSwgLXBoaSk7XG4gICAgc3RyZWFtLnBvaW50KDAsIC1waGkpO1xuICAgIHN0cmVhbS5wb2ludCgtcGksIC1waGkpO1xuICAgIHN0cmVhbS5wb2ludCgtcGksIDApO1xuICAgIHN0cmVhbS5wb2ludCgtcGksIHBoaSk7XG4gIH0gZWxzZSBpZiAoYWJzKGZyb21bMF0gLSB0b1swXSkgPiBlcHNpbG9uKSB7XG4gICAgdmFyIGxhbWJkYSA9IGZyb21bMF0gPCB0b1swXSA/IHBpIDogLXBpO1xuICAgIHBoaSA9IGRpcmVjdGlvbiAqIGxhbWJkYSAvIDI7XG4gICAgc3RyZWFtLnBvaW50KC1sYW1iZGEsIHBoaSk7XG4gICAgc3RyZWFtLnBvaW50KDAsIHBoaSk7XG4gICAgc3RyZWFtLnBvaW50KGxhbWJkYSwgcGhpKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJlYW0ucG9pbnQodG9bMF0sIHRvWzFdKTtcbiAgfVxufVxuIiwiaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBsaW5lcyA9IFtdLFxuICAgICAgbGluZTtcbiAgcmV0dXJuIHtcbiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSwgbSkge1xuICAgICAgbGluZS5wdXNoKFt4LCB5LCBtXSk7XG4gICAgfSxcbiAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgbGluZXMucHVzaChsaW5lID0gW10pO1xuICAgIH0sXG4gICAgbGluZUVuZDogbm9vcCxcbiAgICByZWpvaW46IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIGxpbmVzLnB1c2gobGluZXMucG9wKCkuY29uY2F0KGxpbmVzLnNoaWZ0KCkpKTtcbiAgICB9LFxuICAgIHJlc3VsdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbGluZXM7XG4gICAgICBsaW5lcyA9IFtdO1xuICAgICAgbGluZSA9IG51bGw7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7Y2FydGVzaWFuLCBjYXJ0ZXNpYW5BZGRJblBsYWNlLCBjYXJ0ZXNpYW5Dcm9zcywgY2FydGVzaWFuRG90LCBjYXJ0ZXNpYW5TY2FsZSwgc3BoZXJpY2FsfSBmcm9tIFwiLi4vY2FydGVzaWFuLmpzXCI7XG5pbXBvcnQge2NpcmNsZVN0cmVhbX0gZnJvbSBcIi4uL2NpcmNsZS5qc1wiO1xuaW1wb3J0IHthYnMsIGNvcywgZXBzaWxvbiwgcGksIHJhZGlhbnMsIHNxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQgcG9pbnRFcXVhbCBmcm9tIFwiLi4vcG9pbnRFcXVhbC5qc1wiO1xuaW1wb3J0IGNsaXAgZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocmFkaXVzKSB7XG4gIHZhciBjciA9IGNvcyhyYWRpdXMpLFxuICAgICAgZGVsdGEgPSA2ICogcmFkaWFucyxcbiAgICAgIHNtYWxsUmFkaXVzID0gY3IgPiAwLFxuICAgICAgbm90SGVtaXNwaGVyZSA9IGFicyhjcikgPiBlcHNpbG9uOyAvLyBUT0RPIG9wdGltaXNlIGZvciB0aGlzIGNvbW1vbiBjYXNlXG5cbiAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7XG4gICAgY2lyY2xlU3RyZWFtKHN0cmVhbSwgcmFkaXVzLCBkZWx0YSwgZGlyZWN0aW9uLCBmcm9tLCB0byk7XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlKGxhbWJkYSwgcGhpKSB7XG4gICAgcmV0dXJuIGNvcyhsYW1iZGEpICogY29zKHBoaSkgPiBjcjtcbiAgfVxuXG4gIC8vIFRha2VzIGEgbGluZSBhbmQgY3V0cyBpbnRvIHZpc2libGUgc2VnbWVudHMuIFJldHVybiB2YWx1ZXMgdXNlZCBmb3IgcG9seWdvblxuICAvLyBjbGlwcGluZzogMCAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMgZW1wdHk7IDEgLSBub1xuICAvLyBpbnRlcnNlY3Rpb25zIDIgLSB0aGVyZSB3ZXJlIGludGVyc2VjdGlvbnMsIGFuZCB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHNcbiAgLy8gc2hvdWxkIGJlIHJlam9pbmVkLlxuICBmdW5jdGlvbiBjbGlwTGluZShzdHJlYW0pIHtcbiAgICB2YXIgcG9pbnQwLCAvLyBwcmV2aW91cyBwb2ludFxuICAgICAgICBjMCwgLy8gY29kZSBmb3IgcHJldmlvdXMgcG9pbnRcbiAgICAgICAgdjAsIC8vIHZpc2liaWxpdHkgb2YgcHJldmlvdXMgcG9pbnRcbiAgICAgICAgdjAwLCAvLyB2aXNpYmlsaXR5IG9mIGZpcnN0IHBvaW50XG4gICAgICAgIGNsZWFuOyAvLyBubyBpbnRlcnNlY3Rpb25zXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHYwMCA9IHYwID0gZmFsc2U7XG4gICAgICAgIGNsZWFuID0gMTtcbiAgICAgIH0sXG4gICAgICBwb2ludDogZnVuY3Rpb24obGFtYmRhLCBwaGkpIHtcbiAgICAgICAgdmFyIHBvaW50MSA9IFtsYW1iZGEsIHBoaV0sXG4gICAgICAgICAgICBwb2ludDIsXG4gICAgICAgICAgICB2ID0gdmlzaWJsZShsYW1iZGEsIHBoaSksXG4gICAgICAgICAgICBjID0gc21hbGxSYWRpdXNcbiAgICAgICAgICAgICAgPyB2ID8gMCA6IGNvZGUobGFtYmRhLCBwaGkpXG4gICAgICAgICAgICAgIDogdiA/IGNvZGUobGFtYmRhICsgKGxhbWJkYSA8IDAgPyBwaSA6IC1waSksIHBoaSkgOiAwO1xuICAgICAgICBpZiAoIXBvaW50MCAmJiAodjAwID0gdjAgPSB2KSkgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICBpZiAodiAhPT0gdjApIHtcbiAgICAgICAgICBwb2ludDIgPSBpbnRlcnNlY3QocG9pbnQwLCBwb2ludDEpO1xuICAgICAgICAgIGlmICghcG9pbnQyIHx8IHBvaW50RXF1YWwocG9pbnQwLCBwb2ludDIpIHx8IHBvaW50RXF1YWwocG9pbnQxLCBwb2ludDIpKVxuICAgICAgICAgICAgcG9pbnQxWzJdID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodiAhPT0gdjApIHtcbiAgICAgICAgICBjbGVhbiA9IDA7XG4gICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIC8vIG91dHNpZGUgZ29pbmcgaW5cbiAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCk7XG4gICAgICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbnNpZGUgZ29pbmcgb3V0XG4gICAgICAgICAgICBwb2ludDIgPSBpbnRlcnNlY3QocG9pbnQwLCBwb2ludDEpO1xuICAgICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MlswXSwgcG9pbnQyWzFdLCAyKTtcbiAgICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50MCA9IHBvaW50MjtcbiAgICAgICAgfSBlbHNlIGlmIChub3RIZW1pc3BoZXJlICYmIHBvaW50MCAmJiBzbWFsbFJhZGl1cyBeIHYpIHtcbiAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAvLyBJZiB0aGUgY29kZXMgZm9yIHR3byBwb2ludHMgYXJlIGRpZmZlcmVudCwgb3IgYXJlIGJvdGggemVybyxcbiAgICAgICAgICAvLyBhbmQgdGhlcmUgdGhpcyBzZWdtZW50IGludGVyc2VjdHMgd2l0aCB0aGUgc21hbGwgY2lyY2xlLlxuICAgICAgICAgIGlmICghKGMgJiBjMCkgJiYgKHQgPSBpbnRlcnNlY3QocG9pbnQxLCBwb2ludDAsIHRydWUpKSkge1xuICAgICAgICAgICAgY2xlYW4gPSAwO1xuICAgICAgICAgICAgaWYgKHNtYWxsUmFkaXVzKSB7XG4gICAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMF1bMF0sIHRbMF1bMV0pO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFsxXVswXSwgdFsxXVsxXSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFsxXVswXSwgdFsxXVsxXSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMF1bMF0sIHRbMF1bMV0sIDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodiAmJiAoIXBvaW50MCB8fCAhcG9pbnRFcXVhbChwb2ludDAsIHBvaW50MSkpKSB7XG4gICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MVswXSwgcG9pbnQxWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBwb2ludDAgPSBwb2ludDEsIHYwID0gdiwgYzAgPSBjO1xuICAgICAgfSxcbiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodjApIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgIHBvaW50MCA9IG51bGw7XG4gICAgICB9LFxuICAgICAgLy8gUmVqb2luIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzIGlmIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucyBhbmQgdGhlIGZpcnN0XG4gICAgICAvLyBhbmQgbGFzdCBwb2ludHMgd2VyZSB2aXNpYmxlLlxuICAgICAgY2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gY2xlYW4gfCAoKHYwMCAmJiB2MCkgPDwgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIEludGVyc2VjdHMgdGhlIGdyZWF0IGNpcmNsZSBiZXR3ZWVuIGEgYW5kIGIgd2l0aCB0aGUgY2xpcCBjaXJjbGUuXG4gIGZ1bmN0aW9uIGludGVyc2VjdChhLCBiLCB0d28pIHtcbiAgICB2YXIgcGEgPSBjYXJ0ZXNpYW4oYSksXG4gICAgICAgIHBiID0gY2FydGVzaWFuKGIpO1xuXG4gICAgLy8gV2UgaGF2ZSB0d28gcGxhbmVzLCBuMS5wID0gZDEgYW5kIG4yLnAgPSBkMi5cbiAgICAvLyBGaW5kIGludGVyc2VjdGlvbiBsaW5lIHAodCkgPSBjMSBuMSArIGMyIG4yICsgdCAobjEg4qivIG4yKS5cbiAgICB2YXIgbjEgPSBbMSwgMCwgMF0sIC8vIG5vcm1hbFxuICAgICAgICBuMiA9IGNhcnRlc2lhbkNyb3NzKHBhLCBwYiksXG4gICAgICAgIG4ybjIgPSBjYXJ0ZXNpYW5Eb3QobjIsIG4yKSxcbiAgICAgICAgbjFuMiA9IG4yWzBdLCAvLyBjYXJ0ZXNpYW5Eb3QobjEsIG4yKSxcbiAgICAgICAgZGV0ZXJtaW5hbnQgPSBuMm4yIC0gbjFuMiAqIG4xbjI7XG5cbiAgICAvLyBUd28gcG9sYXIgcG9pbnRzLlxuICAgIGlmICghZGV0ZXJtaW5hbnQpIHJldHVybiAhdHdvICYmIGE7XG5cbiAgICB2YXIgYzEgPSAgY3IgKiBuMm4yIC8gZGV0ZXJtaW5hbnQsXG4gICAgICAgIGMyID0gLWNyICogbjFuMiAvIGRldGVybWluYW50LFxuICAgICAgICBuMXhuMiA9IGNhcnRlc2lhbkNyb3NzKG4xLCBuMiksXG4gICAgICAgIEEgPSBjYXJ0ZXNpYW5TY2FsZShuMSwgYzEpLFxuICAgICAgICBCID0gY2FydGVzaWFuU2NhbGUobjIsIGMyKTtcbiAgICBjYXJ0ZXNpYW5BZGRJblBsYWNlKEEsIEIpO1xuXG4gICAgLy8gU29sdmUgfHAodCl8XjIgPSAxLlxuICAgIHZhciB1ID0gbjF4bjIsXG4gICAgICAgIHcgPSBjYXJ0ZXNpYW5Eb3QoQSwgdSksXG4gICAgICAgIHV1ID0gY2FydGVzaWFuRG90KHUsIHUpLFxuICAgICAgICB0MiA9IHcgKiB3IC0gdXUgKiAoY2FydGVzaWFuRG90KEEsIEEpIC0gMSk7XG5cbiAgICBpZiAodDIgPCAwKSByZXR1cm47XG5cbiAgICB2YXIgdCA9IHNxcnQodDIpLFxuICAgICAgICBxID0gY2FydGVzaWFuU2NhbGUodSwgKC13IC0gdCkgLyB1dSk7XG4gICAgY2FydGVzaWFuQWRkSW5QbGFjZShxLCBBKTtcbiAgICBxID0gc3BoZXJpY2FsKHEpO1xuXG4gICAgaWYgKCF0d28pIHJldHVybiBxO1xuXG4gICAgLy8gVHdvIGludGVyc2VjdGlvbiBwb2ludHMuXG4gICAgdmFyIGxhbWJkYTAgPSBhWzBdLFxuICAgICAgICBsYW1iZGExID0gYlswXSxcbiAgICAgICAgcGhpMCA9IGFbMV0sXG4gICAgICAgIHBoaTEgPSBiWzFdLFxuICAgICAgICB6O1xuXG4gICAgaWYgKGxhbWJkYTEgPCBsYW1iZGEwKSB6ID0gbGFtYmRhMCwgbGFtYmRhMCA9IGxhbWJkYTEsIGxhbWJkYTEgPSB6O1xuXG4gICAgdmFyIGRlbHRhID0gbGFtYmRhMSAtIGxhbWJkYTAsXG4gICAgICAgIHBvbGFyID0gYWJzKGRlbHRhIC0gcGkpIDwgZXBzaWxvbixcbiAgICAgICAgbWVyaWRpYW4gPSBwb2xhciB8fCBkZWx0YSA8IGVwc2lsb247XG5cbiAgICBpZiAoIXBvbGFyICYmIHBoaTEgPCBwaGkwKSB6ID0gcGhpMCwgcGhpMCA9IHBoaTEsIHBoaTEgPSB6O1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgZmlyc3QgcG9pbnQgaXMgYmV0d2VlbiBhIGFuZCBiLlxuICAgIGlmIChtZXJpZGlhblxuICAgICAgICA/IHBvbGFyXG4gICAgICAgICAgPyBwaGkwICsgcGhpMSA+IDAgXiBxWzFdIDwgKGFicyhxWzBdIC0gbGFtYmRhMCkgPCBlcHNpbG9uID8gcGhpMCA6IHBoaTEpXG4gICAgICAgICAgOiBwaGkwIDw9IHFbMV0gJiYgcVsxXSA8PSBwaGkxXG4gICAgICAgIDogZGVsdGEgPiBwaSBeIChsYW1iZGEwIDw9IHFbMF0gJiYgcVswXSA8PSBsYW1iZGExKSkge1xuICAgICAgdmFyIHExID0gY2FydGVzaWFuU2NhbGUodSwgKC13ICsgdCkgLyB1dSk7XG4gICAgICBjYXJ0ZXNpYW5BZGRJblBsYWNlKHExLCBBKTtcbiAgICAgIHJldHVybiBbcSwgc3BoZXJpY2FsKHExKV07XG4gICAgfVxuICB9XG5cbiAgLy8gR2VuZXJhdGVzIGEgNC1iaXQgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgYSBwb2ludCByZWxhdGl2ZSB0b1xuICAvLyB0aGUgc21hbGwgY2lyY2xlJ3MgYm91bmRpbmcgYm94LlxuICBmdW5jdGlvbiBjb2RlKGxhbWJkYSwgcGhpKSB7XG4gICAgdmFyIHIgPSBzbWFsbFJhZGl1cyA/IHJhZGl1cyA6IHBpIC0gcmFkaXVzLFxuICAgICAgICBjb2RlID0gMDtcbiAgICBpZiAobGFtYmRhIDwgLXIpIGNvZGUgfD0gMTsgLy8gbGVmdFxuICAgIGVsc2UgaWYgKGxhbWJkYSA+IHIpIGNvZGUgfD0gMjsgLy8gcmlnaHRcbiAgICBpZiAocGhpIDwgLXIpIGNvZGUgfD0gNDsgLy8gYmVsb3dcbiAgICBlbHNlIGlmIChwaGkgPiByKSBjb2RlIHw9IDg7IC8vIGFib3ZlXG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuICByZXR1cm4gY2xpcCh2aXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHNtYWxsUmFkaXVzID8gWzAsIC1yYWRpdXNdIDogWy1waSwgcmFkaXVzIC0gcGldKTtcbn1cbiIsImltcG9ydCBjbGlwQnVmZmVyIGZyb20gXCIuL2J1ZmZlci5qc1wiO1xuaW1wb3J0IGNsaXBSZWpvaW4gZnJvbSBcIi4vcmVqb2luLmpzXCI7XG5pbXBvcnQge2Vwc2lsb24sIGhhbGZQaX0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCBwb2x5Z29uQ29udGFpbnMgZnJvbSBcIi4uL3BvbHlnb25Db250YWlucy5qc1wiO1xuaW1wb3J0IHttZXJnZX0gZnJvbSBcImQzLWFycmF5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBvaW50VmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBzdGFydCkge1xuICByZXR1cm4gZnVuY3Rpb24oc2luaykge1xuICAgIHZhciBsaW5lID0gY2xpcExpbmUoc2luayksXG4gICAgICAgIHJpbmdCdWZmZXIgPSBjbGlwQnVmZmVyKCksXG4gICAgICAgIHJpbmdTaW5rID0gY2xpcExpbmUocmluZ0J1ZmZlciksXG4gICAgICAgIHBvbHlnb25TdGFydGVkID0gZmFsc2UsXG4gICAgICAgIHBvbHlnb24sXG4gICAgICAgIHNlZ21lbnRzLFxuICAgICAgICByaW5nO1xuXG4gICAgdmFyIGNsaXAgPSB7XG4gICAgICBwb2ludDogcG9pbnQsXG4gICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnRSaW5nO1xuICAgICAgICBjbGlwLmxpbmVTdGFydCA9IHJpbmdTdGFydDtcbiAgICAgICAgY2xpcC5saW5lRW5kID0gcmluZ0VuZDtcbiAgICAgICAgc2VnbWVudHMgPSBbXTtcbiAgICAgICAgcG9seWdvbiA9IFtdO1xuICAgICAgfSxcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgIGNsaXAubGluZVN0YXJ0ID0gbGluZVN0YXJ0O1xuICAgICAgICBjbGlwLmxpbmVFbmQgPSBsaW5lRW5kO1xuICAgICAgICBzZWdtZW50cyA9IG1lcmdlKHNlZ21lbnRzKTtcbiAgICAgICAgdmFyIHN0YXJ0SW5zaWRlID0gcG9seWdvbkNvbnRhaW5zKHBvbHlnb24sIHN0YXJ0KTtcbiAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICBjbGlwUmVqb2luKHNlZ21lbnRzLCBjb21wYXJlSW50ZXJzZWN0aW9uLCBzdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIHNpbmspO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0SW5zaWRlKSB7XG4gICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7XG4gICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgc2luayk7XG4gICAgICAgICAgc2luay5saW5lRW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25FbmQoKSwgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgc2VnbWVudHMgPSBwb2x5Z29uID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzaW5rLnBvbHlnb25TdGFydCgpO1xuICAgICAgICBzaW5rLmxpbmVTdGFydCgpO1xuICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzaW5rKTtcbiAgICAgICAgc2luay5saW5lRW5kKCk7XG4gICAgICAgIHNpbmsucG9seWdvbkVuZCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwb2ludChsYW1iZGEsIHBoaSkge1xuICAgICAgaWYgKHBvaW50VmlzaWJsZShsYW1iZGEsIHBoaSkpIHNpbmsucG9pbnQobGFtYmRhLCBwaGkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvaW50TGluZShsYW1iZGEsIHBoaSkge1xuICAgICAgbGluZS5wb2ludChsYW1iZGEsIHBoaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xuICAgICAgY2xpcC5wb2ludCA9IHBvaW50TGluZTtcbiAgICAgIGxpbmUubGluZVN0YXJ0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgIGNsaXAucG9pbnQgPSBwb2ludDtcbiAgICAgIGxpbmUubGluZUVuZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvaW50UmluZyhsYW1iZGEsIHBoaSkge1xuICAgICAgcmluZy5wdXNoKFtsYW1iZGEsIHBoaV0pO1xuICAgICAgcmluZ1NpbmsucG9pbnQobGFtYmRhLCBwaGkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHtcbiAgICAgIHJpbmdTaW5rLmxpbmVTdGFydCgpO1xuICAgICAgcmluZyA9IFtdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7XG4gICAgICBwb2ludFJpbmcocmluZ1swXVswXSwgcmluZ1swXVsxXSk7XG4gICAgICByaW5nU2luay5saW5lRW5kKCk7XG5cbiAgICAgIHZhciBjbGVhbiA9IHJpbmdTaW5rLmNsZWFuKCksXG4gICAgICAgICAgcmluZ1NlZ21lbnRzID0gcmluZ0J1ZmZlci5yZXN1bHQoKSxcbiAgICAgICAgICBpLCBuID0gcmluZ1NlZ21lbnRzLmxlbmd0aCwgbSxcbiAgICAgICAgICBzZWdtZW50LFxuICAgICAgICAgIHBvaW50O1xuXG4gICAgICByaW5nLnBvcCgpO1xuICAgICAgcG9seWdvbi5wdXNoKHJpbmcpO1xuICAgICAgcmluZyA9IG51bGw7XG5cbiAgICAgIGlmICghbikgcmV0dXJuO1xuXG4gICAgICAvLyBObyBpbnRlcnNlY3Rpb25zLlxuICAgICAgaWYgKGNsZWFuICYgMSkge1xuICAgICAgICBzZWdtZW50ID0gcmluZ1NlZ21lbnRzWzBdO1xuICAgICAgICBpZiAoKG0gPSBzZWdtZW50Lmxlbmd0aCAtIDEpID4gMCkge1xuICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICBzaW5rLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHNpbmsucG9pbnQoKHBvaW50ID0gc2VnbWVudFtpXSlbMF0sIHBvaW50WzFdKTtcbiAgICAgICAgICBzaW5rLmxpbmVFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJlam9pbiBjb25uZWN0ZWQgc2VnbWVudHMuXG4gICAgICAvLyBUT0RPIHJldXNlIHJpbmdCdWZmZXIucmVqb2luKCk/XG4gICAgICBpZiAobiA+IDEgJiYgY2xlYW4gJiAyKSByaW5nU2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMucG9wKCkuY29uY2F0KHJpbmdTZWdtZW50cy5zaGlmdCgpKSk7XG5cbiAgICAgIHNlZ21lbnRzLnB1c2gocmluZ1NlZ21lbnRzLmZpbHRlcih2YWxpZFNlZ21lbnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdmFsaWRTZWdtZW50KHNlZ21lbnQpIHtcbiAgcmV0dXJuIHNlZ21lbnQubGVuZ3RoID4gMTtcbn1cblxuLy8gSW50ZXJzZWN0aW9ucyBhcmUgc29ydGVkIGFsb25nIHRoZSBjbGlwIGVkZ2UuIEZvciBib3RoIGFudGltZXJpZGlhbiBjdXR0aW5nXG4vLyBhbmQgY2lyY2xlIGNsaXBwaW5nLCB0aGUgc2FtZSBjb21wYXJpc29uIGlzIHVzZWQuXG5mdW5jdGlvbiBjb21wYXJlSW50ZXJzZWN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuICgoYSA9IGEueClbMF0gPCAwID8gYVsxXSAtIGhhbGZQaSAtIGVwc2lsb24gOiBoYWxmUGkgLSBhWzFdKVxuICAgICAgIC0gKChiID0gYi54KVswXSA8IDAgPyBiWzFdIC0gaGFsZlBpIC0gZXBzaWxvbiA6IGhhbGZQaSAtIGJbMV0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYiwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIHQwID0gMCxcbiAgICAgIHQxID0gMSxcbiAgICAgIGR4ID0gYnggLSBheCxcbiAgICAgIGR5ID0gYnkgLSBheSxcbiAgICAgIHI7XG5cbiAgciA9IHgwIC0gYXg7XG4gIGlmICghZHggJiYgciA+IDApIHJldHVybjtcbiAgciAvPSBkeDtcbiAgaWYgKGR4IDwgMCkge1xuICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gIH0gZWxzZSBpZiAoZHggPiAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfVxuXG4gIHIgPSB4MSAtIGF4O1xuICBpZiAoIWR4ICYmIHIgPCAwKSByZXR1cm47XG4gIHIgLz0gZHg7XG4gIGlmIChkeCA8IDApIHtcbiAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICB9IGVsc2UgaWYgKGR4ID4gMCkge1xuICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gIH1cblxuICByID0geTAgLSBheTtcbiAgaWYgKCFkeSAmJiByID4gMCkgcmV0dXJuO1xuICByIC89IGR5O1xuICBpZiAoZHkgPCAwKSB7XG4gICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xuICAgIGlmIChyIDwgdDEpIHQxID0gcjtcbiAgfSBlbHNlIGlmIChkeSA+IDApIHtcbiAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICB9XG5cbiAgciA9IHkxIC0gYXk7XG4gIGlmICghZHkgJiYgciA8IDApIHJldHVybjtcbiAgciAvPSBkeTtcbiAgaWYgKGR5IDwgMCkge1xuICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gIH0gZWxzZSBpZiAoZHkgPiAwKSB7XG4gICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xuICAgIGlmIChyIDwgdDEpIHQxID0gcjtcbiAgfVxuXG4gIGlmICh0MCA+IDApIGFbMF0gPSBheCArIHQwICogZHgsIGFbMV0gPSBheSArIHQwICogZHk7XG4gIGlmICh0MSA8IDEpIGJbMF0gPSBheCArIHQxICogZHgsIGJbMV0gPSBheSArIHQxICogZHk7XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHthYnMsIGVwc2lsb259IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQgY2xpcEJ1ZmZlciBmcm9tIFwiLi9idWZmZXIuanNcIjtcbmltcG9ydCBjbGlwTGluZSBmcm9tIFwiLi9saW5lLmpzXCI7XG5pbXBvcnQgY2xpcFJlam9pbiBmcm9tIFwiLi9yZWpvaW4uanNcIjtcbmltcG9ydCB7bWVyZ2V9IGZyb20gXCJkMy1hcnJheVwiO1xuXG52YXIgY2xpcE1heCA9IDFlOSwgY2xpcE1pbiA9IC1jbGlwTWF4O1xuXG4vLyBUT0RPIFVzZSBkMy1wb2x5Z29u4oCZcyBwb2x5Z29uQ29udGFpbnMgaGVyZSBmb3IgdGhlIHJpbmcgY2hlY2s/XG4vLyBUT0RPIEVsaW1pbmF0ZSBkdXBsaWNhdGUgYnVmZmVyaW5nIGluIGNsaXBCdWZmZXIgYW5kIHBvbHlnb24ucHVzaD9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xpcFJlY3RhbmdsZSh4MCwgeTAsIHgxLCB5MSkge1xuXG4gIGZ1bmN0aW9uIHZpc2libGUoeCwgeSkge1xuICAgIHJldHVybiB4MCA8PSB4ICYmIHggPD0geDEgJiYgeTAgPD0geSAmJiB5IDw9IHkxO1xuICB9XG5cbiAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7XG4gICAgdmFyIGEgPSAwLCBhMSA9IDA7XG4gICAgaWYgKGZyb20gPT0gbnVsbFxuICAgICAgICB8fCAoYSA9IGNvcm5lcihmcm9tLCBkaXJlY3Rpb24pKSAhPT0gKGExID0gY29ybmVyKHRvLCBkaXJlY3Rpb24pKVxuICAgICAgICB8fCBjb21wYXJlUG9pbnQoZnJvbSwgdG8pIDwgMCBeIGRpcmVjdGlvbiA+IDApIHtcbiAgICAgIGRvIHN0cmVhbS5wb2ludChhID09PSAwIHx8IGEgPT09IDMgPyB4MCA6IHgxLCBhID4gMSA/IHkxIDogeTApO1xuICAgICAgd2hpbGUgKChhID0gKGEgKyBkaXJlY3Rpb24gKyA0KSAlIDQpICE9PSBhMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS5wb2ludCh0b1swXSwgdG9bMV0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcm5lcihwLCBkaXJlY3Rpb24pIHtcbiAgICByZXR1cm4gYWJzKHBbMF0gLSB4MCkgPCBlcHNpbG9uID8gZGlyZWN0aW9uID4gMCA/IDAgOiAzXG4gICAgICAgIDogYWJzKHBbMF0gLSB4MSkgPCBlcHNpbG9uID8gZGlyZWN0aW9uID4gMCA/IDIgOiAxXG4gICAgICAgIDogYWJzKHBbMV0gLSB5MCkgPCBlcHNpbG9uID8gZGlyZWN0aW9uID4gMCA/IDEgOiAwXG4gICAgICAgIDogZGlyZWN0aW9uID4gMCA/IDMgOiAyOyAvLyBhYnMocFsxXSAtIHkxKSA8IGVwc2lsb25cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBhcmVJbnRlcnNlY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBjb21wYXJlUG9pbnQoYS54LCBiLngpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcGFyZVBvaW50KGEsIGIpIHtcbiAgICB2YXIgY2EgPSBjb3JuZXIoYSwgMSksXG4gICAgICAgIGNiID0gY29ybmVyKGIsIDEpO1xuICAgIHJldHVybiBjYSAhPT0gY2IgPyBjYSAtIGNiXG4gICAgICAgIDogY2EgPT09IDAgPyBiWzFdIC0gYVsxXVxuICAgICAgICA6IGNhID09PSAxID8gYVswXSAtIGJbMF1cbiAgICAgICAgOiBjYSA9PT0gMiA/IGFbMV0gLSBiWzFdXG4gICAgICAgIDogYlswXSAtIGFbMF07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgdmFyIGFjdGl2ZVN0cmVhbSA9IHN0cmVhbSxcbiAgICAgICAgYnVmZmVyU3RyZWFtID0gY2xpcEJ1ZmZlcigpLFxuICAgICAgICBzZWdtZW50cyxcbiAgICAgICAgcG9seWdvbixcbiAgICAgICAgcmluZyxcbiAgICAgICAgeF9fLCB5X18sIHZfXywgLy8gZmlyc3QgcG9pbnRcbiAgICAgICAgeF8sIHlfLCB2XywgLy8gcHJldmlvdXMgcG9pbnRcbiAgICAgICAgZmlyc3QsXG4gICAgICAgIGNsZWFuO1xuXG4gICAgdmFyIGNsaXBTdHJlYW0gPSB7XG4gICAgICBwb2ludDogcG9pbnQsXG4gICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICBwb2x5Z29uU3RhcnQ6IHBvbHlnb25TdGFydCxcbiAgICAgIHBvbHlnb25FbmQ6IHBvbHlnb25FbmRcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgICAgaWYgKHZpc2libGUoeCwgeSkpIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2x5Z29uSW5zaWRlKCkge1xuICAgICAgdmFyIHdpbmRpbmcgPSAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHBvbHlnb24ubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGZvciAodmFyIHJpbmcgPSBwb2x5Z29uW2ldLCBqID0gMSwgbSA9IHJpbmcubGVuZ3RoLCBwb2ludCA9IHJpbmdbMF0sIGEwLCBhMSwgYjAgPSBwb2ludFswXSwgYjEgPSBwb2ludFsxXTsgaiA8IG07ICsraikge1xuICAgICAgICAgIGEwID0gYjAsIGExID0gYjEsIHBvaW50ID0gcmluZ1tqXSwgYjAgPSBwb2ludFswXSwgYjEgPSBwb2ludFsxXTtcbiAgICAgICAgICBpZiAoYTEgPD0geTEpIHsgaWYgKGIxID4geTEgJiYgKGIwIC0gYTApICogKHkxIC0gYTEpID4gKGIxIC0gYTEpICogKHgwIC0gYTApKSArK3dpbmRpbmc7IH1cbiAgICAgICAgICBlbHNlIHsgaWYgKGIxIDw9IHkxICYmIChiMCAtIGEwKSAqICh5MSAtIGExKSA8IChiMSAtIGExKSAqICh4MCAtIGEwKSkgLS13aW5kaW5nOyB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdpbmRpbmc7XG4gICAgfVxuXG4gICAgLy8gQnVmZmVyIGdlb21ldHJ5IHdpdGhpbiBhIHBvbHlnb24gYW5kIHRoZW4gY2xpcCBpdCBlbiBtYXNzZS5cbiAgICBmdW5jdGlvbiBwb2x5Z29uU3RhcnQoKSB7XG4gICAgICBhY3RpdmVTdHJlYW0gPSBidWZmZXJTdHJlYW0sIHNlZ21lbnRzID0gW10sIHBvbHlnb24gPSBbXSwgY2xlYW4gPSB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvbHlnb25FbmQoKSB7XG4gICAgICB2YXIgc3RhcnRJbnNpZGUgPSBwb2x5Z29uSW5zaWRlKCksXG4gICAgICAgICAgY2xlYW5JbnNpZGUgPSBjbGVhbiAmJiBzdGFydEluc2lkZSxcbiAgICAgICAgICB2aXNpYmxlID0gKHNlZ21lbnRzID0gbWVyZ2Uoc2VnbWVudHMpKS5sZW5ndGg7XG4gICAgICBpZiAoY2xlYW5JbnNpZGUgfHwgdmlzaWJsZSkge1xuICAgICAgICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gICAgICAgIGlmIChjbGVhbkluc2lkZSkge1xuICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzdHJlYW0pO1xuICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICBjbGlwUmVqb2luKHNlZ21lbnRzLCBjb21wYXJlSW50ZXJzZWN0aW9uLCBzdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtLnBvbHlnb25FbmQoKTtcbiAgICAgIH1cbiAgICAgIGFjdGl2ZVN0cmVhbSA9IHN0cmVhbSwgc2VnbWVudHMgPSBwb2x5Z29uID0gcmluZyA9IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xuICAgICAgY2xpcFN0cmVhbS5wb2ludCA9IGxpbmVQb2ludDtcbiAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29uLnB1c2gocmluZyA9IFtdKTtcbiAgICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICAgIHZfID0gZmFsc2U7XG4gICAgICB4XyA9IHlfID0gTmFOO1xuICAgIH1cblxuICAgIC8vIFRPRE8gcmF0aGVyIHRoYW4gc3BlY2lhbC1jYXNlIHBvbHlnb25zLCBzaW1wbHkgaGFuZGxlIHRoZW0gc2VwYXJhdGVseS5cbiAgICAvLyBJZGVhbGx5LCBjb2luY2lkZW50IGludGVyc2VjdGlvbiBwb2ludHMgc2hvdWxkIGJlIGppdHRlcmVkIHRvIGF2b2lkXG4gICAgLy8gY2xpcHBpbmcgaXNzdWVzLlxuICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7XG4gICAgICBpZiAoc2VnbWVudHMpIHtcbiAgICAgICAgbGluZVBvaW50KHhfXywgeV9fKTtcbiAgICAgICAgaWYgKHZfXyAmJiB2XykgYnVmZmVyU3RyZWFtLnJlam9pbigpO1xuICAgICAgICBzZWdtZW50cy5wdXNoKGJ1ZmZlclN0cmVhbS5yZXN1bHQoKSk7XG4gICAgICB9XG4gICAgICBjbGlwU3RyZWFtLnBvaW50ID0gcG9pbnQ7XG4gICAgICBpZiAodl8pIGFjdGl2ZVN0cmVhbS5saW5lRW5kKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZVBvaW50KHgsIHkpIHtcbiAgICAgIHZhciB2ID0gdmlzaWJsZSh4LCB5KTtcbiAgICAgIGlmIChwb2x5Z29uKSByaW5nLnB1c2goW3gsIHldKTtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICB4X18gPSB4LCB5X18gPSB5LCB2X18gPSB2O1xuICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgIGFjdGl2ZVN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2ICYmIHZfKSBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBhID0gW3hfID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeF8pKSwgeV8gPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB5XykpXSxcbiAgICAgICAgICAgICAgYiA9IFt4ID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeCkpLCB5ID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeSkpXTtcbiAgICAgICAgICBpZiAoY2xpcExpbmUoYSwgYiwgeDAsIHkwLCB4MSwgeTEpKSB7XG4gICAgICAgICAgICBpZiAoIXZfKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KGFbMF0sIGFbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KGJbMF0sIGJbMV0pO1xuICAgICAgICAgICAgaWYgKCF2KSBhY3RpdmVTdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICAgICAgY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHYpIHtcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB4XyA9IHgsIHlfID0geSwgdl8gPSB2O1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwU3RyZWFtO1xuICB9O1xufVxuIiwiaW1wb3J0IHBvaW50RXF1YWwgZnJvbSBcIi4uL3BvaW50RXF1YWwuanNcIjtcbmltcG9ydCB7ZXBzaWxvbn0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZnVuY3Rpb24gSW50ZXJzZWN0aW9uKHBvaW50LCBwb2ludHMsIG90aGVyLCBlbnRyeSkge1xuICB0aGlzLnggPSBwb2ludDtcbiAgdGhpcy56ID0gcG9pbnRzO1xuICB0aGlzLm8gPSBvdGhlcjsgLy8gYW5vdGhlciBpbnRlcnNlY3Rpb25cbiAgdGhpcy5lID0gZW50cnk7IC8vIGlzIGFuIGVudHJ5P1xuICB0aGlzLnYgPSBmYWxzZTsgLy8gdmlzaXRlZFxuICB0aGlzLm4gPSB0aGlzLnAgPSBudWxsOyAvLyBuZXh0ICYgcHJldmlvdXNcbn1cblxuLy8gQSBnZW5lcmFsaXplZCBwb2x5Z29uIGNsaXBwaW5nIGFsZ29yaXRobTogZ2l2ZW4gYSBwb2x5Z29uIHRoYXQgaGFzIGJlZW4gY3V0XG4vLyBpbnRvIGl0cyB2aXNpYmxlIGxpbmUgc2VnbWVudHMsIGFuZCByZWpvaW5zIHRoZSBzZWdtZW50cyBieSBpbnRlcnBvbGF0aW5nXG4vLyBhbG9uZyB0aGUgY2xpcCBlZGdlLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc3RyZWFtKSB7XG4gIHZhciBzdWJqZWN0ID0gW10sXG4gICAgICBjbGlwID0gW10sXG4gICAgICBpLFxuICAgICAgbjtcblxuICBzZWdtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHNlZ21lbnQpIHtcbiAgICBpZiAoKG4gPSBzZWdtZW50Lmxlbmd0aCAtIDEpIDw9IDApIHJldHVybjtcbiAgICB2YXIgbiwgcDAgPSBzZWdtZW50WzBdLCBwMSA9IHNlZ21lbnRbbl0sIHg7XG5cbiAgICBpZiAocG9pbnRFcXVhbChwMCwgcDEpKSB7XG4gICAgICBpZiAoIXAwWzJdICYmICFwMVsyXSkge1xuICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHN0cmVhbS5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pO1xuICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBoYW5kbGUgZGVnZW5lcmF0ZSBjYXNlcyBieSBtb3ZpbmcgdGhlIHBvaW50XG4gICAgICBwMVswXSArPSAyICogZXBzaWxvbjtcbiAgICB9XG5cbiAgICBzdWJqZWN0LnB1c2goeCA9IG5ldyBJbnRlcnNlY3Rpb24ocDAsIHNlZ21lbnQsIG51bGwsIHRydWUpKTtcbiAgICBjbGlwLnB1c2goeC5vID0gbmV3IEludGVyc2VjdGlvbihwMCwgbnVsbCwgeCwgZmFsc2UpKTtcbiAgICBzdWJqZWN0LnB1c2goeCA9IG5ldyBJbnRlcnNlY3Rpb24ocDEsIHNlZ21lbnQsIG51bGwsIGZhbHNlKSk7XG4gICAgY2xpcC5wdXNoKHgubyA9IG5ldyBJbnRlcnNlY3Rpb24ocDEsIG51bGwsIHgsIHRydWUpKTtcbiAgfSk7XG5cbiAgaWYgKCFzdWJqZWN0Lmxlbmd0aCkgcmV0dXJuO1xuXG4gIGNsaXAuc29ydChjb21wYXJlSW50ZXJzZWN0aW9uKTtcbiAgbGluayhzdWJqZWN0KTtcbiAgbGluayhjbGlwKTtcblxuICBmb3IgKGkgPSAwLCBuID0gY2xpcC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBjbGlwW2ldLmUgPSBzdGFydEluc2lkZSA9ICFzdGFydEluc2lkZTtcbiAgfVxuXG4gIHZhciBzdGFydCA9IHN1YmplY3RbMF0sXG4gICAgICBwb2ludHMsXG4gICAgICBwb2ludDtcblxuICB3aGlsZSAoMSkge1xuICAgIC8vIEZpbmQgZmlyc3QgdW52aXNpdGVkIGludGVyc2VjdGlvbi5cbiAgICB2YXIgY3VycmVudCA9IHN0YXJ0LFxuICAgICAgICBpc1N1YmplY3QgPSB0cnVlO1xuICAgIHdoaWxlIChjdXJyZW50LnYpIGlmICgoY3VycmVudCA9IGN1cnJlbnQubikgPT09IHN0YXJ0KSByZXR1cm47XG4gICAgcG9pbnRzID0gY3VycmVudC56O1xuICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICBkbyB7XG4gICAgICBjdXJyZW50LnYgPSBjdXJyZW50Lm8udiA9IHRydWU7XG4gICAgICBpZiAoY3VycmVudC5lKSB7XG4gICAgICAgIGlmIChpc1N1YmplY3QpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBuID0gcG9pbnRzLmxlbmd0aDsgaSA8IG47ICsraSkgc3RyZWFtLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnRlcnBvbGF0ZShjdXJyZW50LngsIGN1cnJlbnQubi54LCAxLCBzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTdWJqZWN0KSB7XG4gICAgICAgICAgcG9pbnRzID0gY3VycmVudC5wLno7XG4gICAgICAgICAgZm9yIChpID0gcG9pbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSBzdHJlYW0ucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5wLngsIC0xLCBzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnA7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5vO1xuICAgICAgcG9pbnRzID0gY3VycmVudC56O1xuICAgICAgaXNTdWJqZWN0ID0gIWlzU3ViamVjdDtcbiAgICB9IHdoaWxlICghY3VycmVudC52KTtcbiAgICBzdHJlYW0ubGluZUVuZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpbmsoYXJyYXkpIHtcbiAgaWYgKCEobiA9IGFycmF5Lmxlbmd0aCkpIHJldHVybjtcbiAgdmFyIG4sXG4gICAgICBpID0gMCxcbiAgICAgIGEgPSBhcnJheVswXSxcbiAgICAgIGI7XG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgYS5uID0gYiA9IGFycmF5W2ldO1xuICAgIGIucCA9IGE7XG4gICAgYSA9IGI7XG4gIH1cbiAgYS5uID0gYiA9IGFycmF5WzBdO1xuICBiLnAgPSBhO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuXG4gIGZ1bmN0aW9uIGNvbXBvc2UoeCwgeSkge1xuICAgIHJldHVybiB4ID0gYSh4LCB5KSwgYih4WzBdLCB4WzFdKTtcbiAgfVxuXG4gIGlmIChhLmludmVydCAmJiBiLmludmVydCkgY29tcG9zZS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPSBiLmludmVydCh4LCB5KSwgeCAmJiBhLmludmVydCh4WzBdLCB4WzFdKTtcbiAgfTtcblxuICByZXR1cm4gY29tcG9zZTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgeCA9PiB4O1xuIiwiZXhwb3J0IHZhciBlcHNpbG9uID0gMWUtNjtcbmV4cG9ydCB2YXIgZXBzaWxvbjIgPSAxZS0xMjtcbmV4cG9ydCB2YXIgcGkgPSBNYXRoLlBJO1xuZXhwb3J0IHZhciBoYWxmUGkgPSBwaSAvIDI7XG5leHBvcnQgdmFyIHF1YXJ0ZXJQaSA9IHBpIC8gNDtcbmV4cG9ydCB2YXIgdGF1ID0gcGkgKiAyO1xuXG5leHBvcnQgdmFyIGRlZ3JlZXMgPSAxODAgLyBwaTtcbmV4cG9ydCB2YXIgcmFkaWFucyA9IHBpIC8gMTgwO1xuXG5leHBvcnQgdmFyIGFicyA9IE1hdGguYWJzO1xuZXhwb3J0IHZhciBhdGFuID0gTWF0aC5hdGFuO1xuZXhwb3J0IHZhciBhdGFuMiA9IE1hdGguYXRhbjI7XG5leHBvcnQgdmFyIGNvcyA9IE1hdGguY29zO1xuZXhwb3J0IHZhciBjZWlsID0gTWF0aC5jZWlsO1xuZXhwb3J0IHZhciBleHAgPSBNYXRoLmV4cDtcbmV4cG9ydCB2YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuZXhwb3J0IHZhciBoeXBvdCA9IE1hdGguaHlwb3Q7XG5leHBvcnQgdmFyIGxvZyA9IE1hdGgubG9nO1xuZXhwb3J0IHZhciBwb3cgPSBNYXRoLnBvdztcbmV4cG9ydCB2YXIgc2luID0gTWF0aC5zaW47XG5leHBvcnQgdmFyIHNpZ24gPSBNYXRoLnNpZ24gfHwgZnVuY3Rpb24oeCkgeyByZXR1cm4geCA+IDAgPyAxIDogeCA8IDAgPyAtMSA6IDA7IH07XG5leHBvcnQgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7XG5leHBvcnQgdmFyIHRhbiA9IE1hdGgudGFuO1xuXG5leHBvcnQgZnVuY3Rpb24gYWNvcyh4KSB7XG4gIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBwaSA6IE1hdGguYWNvcyh4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzaW4oeCkge1xuICByZXR1cm4geCA+IDEgPyBoYWxmUGkgOiB4IDwgLTEgPyAtaGFsZlBpIDogTWF0aC5hc2luKHgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGF2ZXJzaW4oeCkge1xuICByZXR1cm4gKHggPSBzaW4oeCAvIDIpKSAqIHg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub29wKCkge31cbiIsImltcG9ydCBub29wIGZyb20gXCIuLi9ub29wLmpzXCI7XG5cbnZhciB4MCA9IEluZmluaXR5LFxuICAgIHkwID0geDAsXG4gICAgeDEgPSAteDAsXG4gICAgeTEgPSB4MTtcblxudmFyIGJvdW5kc1N0cmVhbSA9IHtcbiAgcG9pbnQ6IGJvdW5kc1BvaW50LFxuICBsaW5lU3RhcnQ6IG5vb3AsXG4gIGxpbmVFbmQ6IG5vb3AsXG4gIHBvbHlnb25TdGFydDogbm9vcCxcbiAgcG9seWdvbkVuZDogbm9vcCxcbiAgcmVzdWx0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYm91bmRzID0gW1t4MCwgeTBdLCBbeDEsIHkxXV07XG4gICAgeDEgPSB5MSA9IC0oeTAgPSB4MCA9IEluZmluaXR5KTtcbiAgICByZXR1cm4gYm91bmRzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBib3VuZHNQb2ludCh4LCB5KSB7XG4gIGlmICh4IDwgeDApIHgwID0geDtcbiAgaWYgKHggPiB4MSkgeDEgPSB4O1xuICBpZiAoeSA8IHkwKSB5MCA9IHk7XG4gIGlmICh5ID4geTEpIHkxID0geTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYm91bmRzU3RyZWFtO1xuIiwiaW1wb3J0IHthYnMsIGVwc2lsb259IGZyb20gXCIuL21hdGguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYWJzKGFbMF0gLSBiWzBdKSA8IGVwc2lsb24gJiYgYWJzKGFbMV0gLSBiWzFdKSA8IGVwc2lsb247XG59XG4iLCJpbXBvcnQge0FkZGVyfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7Y2FydGVzaWFuLCBjYXJ0ZXNpYW5Dcm9zcywgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZX0gZnJvbSBcIi4vY2FydGVzaWFuLmpzXCI7XG5pbXBvcnQge2FicywgYXNpbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgZXBzaWxvbjIsIGhhbGZQaSwgcGksIHF1YXJ0ZXJQaSwgc2lnbiwgc2luLCB0YXV9IGZyb20gXCIuL21hdGguanNcIjtcblxuZnVuY3Rpb24gbG9uZ2l0dWRlKHBvaW50KSB7XG4gIHJldHVybiBhYnMocG9pbnRbMF0pIDw9IHBpID8gcG9pbnRbMF0gOiBzaWduKHBvaW50WzBdKSAqICgoYWJzKHBvaW50WzBdKSArIHBpKSAlIHRhdSAtIHBpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocG9seWdvbiwgcG9pbnQpIHtcbiAgdmFyIGxhbWJkYSA9IGxvbmdpdHVkZShwb2ludCksXG4gICAgICBwaGkgPSBwb2ludFsxXSxcbiAgICAgIHNpblBoaSA9IHNpbihwaGkpLFxuICAgICAgbm9ybWFsID0gW3NpbihsYW1iZGEpLCAtY29zKGxhbWJkYSksIDBdLFxuICAgICAgYW5nbGUgPSAwLFxuICAgICAgd2luZGluZyA9IDA7XG5cbiAgdmFyIHN1bSA9IG5ldyBBZGRlcigpO1xuXG4gIGlmIChzaW5QaGkgPT09IDEpIHBoaSA9IGhhbGZQaSArIGVwc2lsb247XG4gIGVsc2UgaWYgKHNpblBoaSA9PT0gLTEpIHBoaSA9IC1oYWxmUGkgLSBlcHNpbG9uO1xuXG4gIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoIShtID0gKHJpbmcgPSBwb2x5Z29uW2ldKS5sZW5ndGgpKSBjb250aW51ZTtcbiAgICB2YXIgcmluZyxcbiAgICAgICAgbSxcbiAgICAgICAgcG9pbnQwID0gcmluZ1ttIC0gMV0sXG4gICAgICAgIGxhbWJkYTAgPSBsb25naXR1ZGUocG9pbnQwKSxcbiAgICAgICAgcGhpMCA9IHBvaW50MFsxXSAvIDIgKyBxdWFydGVyUGksXG4gICAgICAgIHNpblBoaTAgPSBzaW4ocGhpMCksXG4gICAgICAgIGNvc1BoaTAgPSBjb3MocGhpMCk7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraiwgbGFtYmRhMCA9IGxhbWJkYTEsIHNpblBoaTAgPSBzaW5QaGkxLCBjb3NQaGkwID0gY29zUGhpMSwgcG9pbnQwID0gcG9pbnQxKSB7XG4gICAgICB2YXIgcG9pbnQxID0gcmluZ1tqXSxcbiAgICAgICAgICBsYW1iZGExID0gbG9uZ2l0dWRlKHBvaW50MSksXG4gICAgICAgICAgcGhpMSA9IHBvaW50MVsxXSAvIDIgKyBxdWFydGVyUGksXG4gICAgICAgICAgc2luUGhpMSA9IHNpbihwaGkxKSxcbiAgICAgICAgICBjb3NQaGkxID0gY29zKHBoaTEpLFxuICAgICAgICAgIGRlbHRhID0gbGFtYmRhMSAtIGxhbWJkYTAsXG4gICAgICAgICAgc2lnbiA9IGRlbHRhID49IDAgPyAxIDogLTEsXG4gICAgICAgICAgYWJzRGVsdGEgPSBzaWduICogZGVsdGEsXG4gICAgICAgICAgYW50aW1lcmlkaWFuID0gYWJzRGVsdGEgPiBwaSxcbiAgICAgICAgICBrID0gc2luUGhpMCAqIHNpblBoaTE7XG5cbiAgICAgIHN1bS5hZGQoYXRhbjIoayAqIHNpZ24gKiBzaW4oYWJzRGVsdGEpLCBjb3NQaGkwICogY29zUGhpMSArIGsgKiBjb3MoYWJzRGVsdGEpKSk7XG4gICAgICBhbmdsZSArPSBhbnRpbWVyaWRpYW4gPyBkZWx0YSArIHNpZ24gKiB0YXUgOiBkZWx0YTtcblxuICAgICAgLy8gQXJlIHRoZSBsb25naXR1ZGVzIGVpdGhlciBzaWRlIG9mIHRoZSBwb2ludOKAmXMgbWVyaWRpYW4gKGxhbWJkYSksXG4gICAgICAvLyBhbmQgYXJlIHRoZSBsYXRpdHVkZXMgc21hbGxlciB0aGFuIHRoZSBwYXJhbGxlbCAocGhpKT9cbiAgICAgIGlmIChhbnRpbWVyaWRpYW4gXiBsYW1iZGEwID49IGxhbWJkYSBeIGxhbWJkYTEgPj0gbGFtYmRhKSB7XG4gICAgICAgIHZhciBhcmMgPSBjYXJ0ZXNpYW5Dcm9zcyhjYXJ0ZXNpYW4ocG9pbnQwKSwgY2FydGVzaWFuKHBvaW50MSkpO1xuICAgICAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGFyYyk7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjYXJ0ZXNpYW5Dcm9zcyhub3JtYWwsIGFyYyk7XG4gICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoaW50ZXJzZWN0aW9uKTtcbiAgICAgICAgdmFyIHBoaUFyYyA9IChhbnRpbWVyaWRpYW4gXiBkZWx0YSA+PSAwID8gLTEgOiAxKSAqIGFzaW4oaW50ZXJzZWN0aW9uWzJdKTtcbiAgICAgICAgaWYgKHBoaSA+IHBoaUFyYyB8fCBwaGkgPT09IHBoaUFyYyAmJiAoYXJjWzBdIHx8IGFyY1sxXSkpIHtcbiAgICAgICAgICB3aW5kaW5nICs9IGFudGltZXJpZGlhbiBeIGRlbHRhID49IDAgPyAxIDogLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFNvdXRoIHBvbGUgaXMgaW5zaWRlIG9yIG91dHNpZGU6XG4gIC8vXG4gIC8vIEl0IGlzIGluc2lkZSBpZjpcbiAgLy8gKiB0aGUgcG9seWdvbiB3aW5kcyBhcm91bmQgaXQgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLlxuICAvLyAqIHRoZSBwb2x5Z29uIGRvZXMgbm90IChjdW11bGF0aXZlbHkpIHdpbmQgYXJvdW5kIGl0LCBidXQgaGFzIGEgbmVnYXRpdmVcbiAgLy8gICAoY291bnRlci1jbG9ja3dpc2UpIGFyZWEuXG4gIC8vXG4gIC8vIFNlY29uZCwgY291bnQgdGhlIChzaWduZWQpIG51bWJlciBvZiB0aW1lcyBhIHNlZ21lbnQgY3Jvc3NlcyBhIGxhbWJkYVxuICAvLyBmcm9tIHRoZSBwb2ludCB0byB0aGUgU291dGggcG9sZS4gIElmIGl0IGlzIHplcm8sIHRoZW4gdGhlIHBvaW50IGlzIHRoZVxuICAvLyBzYW1lIHNpZGUgYXMgdGhlIFNvdXRoIHBvbGUuXG5cbiAgcmV0dXJuIChhbmdsZSA8IC1lcHNpbG9uIHx8IGFuZ2xlIDwgZXBzaWxvbiAmJiBzdW0gPCAtZXBzaWxvbjIpIF4gKHdpbmRpbmcgJiAxKTtcbn1cbiIsImltcG9ydCB7YXNpbiwgYXRhbjIsIGNvcywgc2luLCBzcXJ0fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYXppbXV0aGFsUmF3KHNjYWxlKSB7XG4gIHJldHVybiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIGN4ID0gY29zKHgpLFxuICAgICAgICBjeSA9IGNvcyh5KSxcbiAgICAgICAgayA9IHNjYWxlKGN4ICogY3kpO1xuICAgICAgICBpZiAoayA9PT0gSW5maW5pdHkpIHJldHVybiBbMiwgMF07XG4gICAgcmV0dXJuIFtcbiAgICAgIGsgKiBjeSAqIHNpbih4KSxcbiAgICAgIGsgKiBzaW4oeSlcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhemltdXRoYWxJbnZlcnQoYW5nbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB2YXIgeiA9IHNxcnQoeCAqIHggKyB5ICogeSksXG4gICAgICAgIGMgPSBhbmdsZSh6KSxcbiAgICAgICAgc2MgPSBzaW4oYyksXG4gICAgICAgIGNjID0gY29zKGMpO1xuICAgIHJldHVybiBbXG4gICAgICBhdGFuMih4ICogc2MsIHogKiBjYyksXG4gICAgICBhc2luKHogJiYgeSAqIHNjIC8geilcbiAgICBdO1xuICB9XG59XG4iLCJpbXBvcnQge2FzaW4sIHNxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQge2F6aW11dGhhbFJhdywgYXppbXV0aGFsSW52ZXJ0fSBmcm9tIFwiLi9hemltdXRoYWwuanNcIjtcbmltcG9ydCBwcm9qZWN0aW9uIGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCB2YXIgYXppbXV0aGFsRXF1YWxBcmVhUmF3ID0gYXppbXV0aGFsUmF3KGZ1bmN0aW9uKGN4Y3kpIHtcbiAgcmV0dXJuIHNxcnQoMiAvICgxICsgY3hjeSkpO1xufSk7XG5cbmF6aW11dGhhbEVxdWFsQXJlYVJhdy5pbnZlcnQgPSBhemltdXRoYWxJbnZlcnQoZnVuY3Rpb24oeikge1xuICByZXR1cm4gMiAqIGFzaW4oeiAvIDIpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcHJvamVjdGlvbihhemltdXRoYWxFcXVhbEFyZWFSYXcpXG4gICAgICAuc2NhbGUoMTI0Ljc1KVxuICAgICAgLmNsaXBBbmdsZSgxODAgLSAxZS0zKTtcbn1cbiIsImltcG9ydCB7ZGVmYXVsdCBhcyBnZW9TdHJlYW19IGZyb20gXCIuLi9zdHJlYW0uanNcIjtcbmltcG9ydCBib3VuZHNTdHJlYW0gZnJvbSBcIi4uL3BhdGgvYm91bmRzLmpzXCI7XG5cbmZ1bmN0aW9uIGZpdChwcm9qZWN0aW9uLCBmaXRCb3VuZHMsIG9iamVjdCkge1xuICB2YXIgY2xpcCA9IHByb2plY3Rpb24uY2xpcEV4dGVudCAmJiBwcm9qZWN0aW9uLmNsaXBFeHRlbnQoKTtcbiAgcHJvamVjdGlvbi5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwgMF0pO1xuICBpZiAoY2xpcCAhPSBudWxsKSBwcm9qZWN0aW9uLmNsaXBFeHRlbnQobnVsbCk7XG4gIGdlb1N0cmVhbShvYmplY3QsIHByb2plY3Rpb24uc3RyZWFtKGJvdW5kc1N0cmVhbSkpO1xuICBmaXRCb3VuZHMoYm91bmRzU3RyZWFtLnJlc3VsdCgpKTtcbiAgaWYgKGNsaXAgIT0gbnVsbCkgcHJvamVjdGlvbi5jbGlwRXh0ZW50KGNsaXApO1xuICByZXR1cm4gcHJvamVjdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdEV4dGVudChwcm9qZWN0aW9uLCBleHRlbnQsIG9iamVjdCkge1xuICByZXR1cm4gZml0KHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHtcbiAgICB2YXIgdyA9IGV4dGVudFsxXVswXSAtIGV4dGVudFswXVswXSxcbiAgICAgICAgaCA9IGV4dGVudFsxXVsxXSAtIGV4dGVudFswXVsxXSxcbiAgICAgICAgayA9IE1hdGgubWluKHcgLyAoYlsxXVswXSAtIGJbMF1bMF0pLCBoIC8gKGJbMV1bMV0gLSBiWzBdWzFdKSksXG4gICAgICAgIHggPSArZXh0ZW50WzBdWzBdICsgKHcgLSBrICogKGJbMV1bMF0gKyBiWzBdWzBdKSkgLyAyLFxuICAgICAgICB5ID0gK2V4dGVudFswXVsxXSArIChoIC0gayAqIChiWzFdWzFdICsgYlswXVsxXSkpIC8gMjtcbiAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pO1xuICB9LCBvYmplY3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml0U2l6ZShwcm9qZWN0aW9uLCBzaXplLCBvYmplY3QpIHtcbiAgcmV0dXJuIGZpdEV4dGVudChwcm9qZWN0aW9uLCBbWzAsIDBdLCBzaXplXSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdFdpZHRoKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpIHtcbiAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlvbihiKSB7XG4gICAgdmFyIHcgPSArd2lkdGgsXG4gICAgICAgIGsgPSB3IC8gKGJbMV1bMF0gLSBiWzBdWzBdKSxcbiAgICAgICAgeCA9ICh3IC0gayAqIChiWzFdWzBdICsgYlswXVswXSkpIC8gMixcbiAgICAgICAgeSA9IC1rICogYlswXVsxXTtcbiAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pO1xuICB9LCBvYmplY3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml0SGVpZ2h0KHByb2plY3Rpb24sIGhlaWdodCwgb2JqZWN0KSB7XG4gIHJldHVybiBmaXQocHJvamVjdGlvbiwgZnVuY3Rpb24oYikge1xuICAgIHZhciBoID0gK2hlaWdodCxcbiAgICAgICAgayA9IGggLyAoYlsxXVsxXSAtIGJbMF1bMV0pLFxuICAgICAgICB4ID0gLWsgKiBiWzBdWzBdLFxuICAgICAgICB5ID0gKGggLSBrICogKGJbMV1bMV0gKyBiWzBdWzFdKSkgLyAyO1xuICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJhbnNsYXRlKFt4LCB5XSk7XG4gIH0sIG9iamVjdCk7XG59XG4iLCJpbXBvcnQgY2xpcEFudGltZXJpZGlhbiBmcm9tIFwiLi4vY2xpcC9hbnRpbWVyaWRpYW4uanNcIjtcbmltcG9ydCBjbGlwQ2lyY2xlIGZyb20gXCIuLi9jbGlwL2NpcmNsZS5qc1wiO1xuaW1wb3J0IGNsaXBSZWN0YW5nbGUgZnJvbSBcIi4uL2NsaXAvcmVjdGFuZ2xlLmpzXCI7XG5pbXBvcnQgY29tcG9zZSBmcm9tIFwiLi4vY29tcG9zZS5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHtjb3MsIGRlZ3JlZXMsIHJhZGlhbnMsIHNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7cm90YXRlUmFkaWFuc30gZnJvbSBcIi4uL3JvdGF0aW9uLmpzXCI7XG5pbXBvcnQge3RyYW5zZm9ybWVyfSBmcm9tIFwiLi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQge2ZpdEV4dGVudCwgZml0U2l6ZSwgZml0V2lkdGgsIGZpdEhlaWdodH0gZnJvbSBcIi4vZml0LmpzXCI7XG5pbXBvcnQgcmVzYW1wbGUgZnJvbSBcIi4vcmVzYW1wbGUuanNcIjtcblxudmFyIHRyYW5zZm9ybVJhZGlhbnMgPSB0cmFuc2Zvcm1lcih7XG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5zdHJlYW0ucG9pbnQoeCAqIHJhZGlhbnMsIHkgKiByYWRpYW5zKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVJvdGF0ZShyb3RhdGUpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyKHtcbiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgdmFyIHIgPSByb3RhdGUoeCwgeSk7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucG9pbnQoclswXSwgclsxXSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGUoaywgZHgsIGR5LCBzeCwgc3kpIHtcbiAgZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHkpIHtcbiAgICB4ICo9IHN4OyB5ICo9IHN5O1xuICAgIHJldHVybiBbZHggKyBrICogeCwgZHkgLSBrICogeV07XG4gIH1cbiAgdHJhbnNmb3JtLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4gWyh4IC0gZHgpIC8gayAqIHN4LCAoZHkgLSB5KSAvIGsgKiBzeV07XG4gIH07XG4gIHJldHVybiB0cmFuc2Zvcm07XG59XG5cbmZ1bmN0aW9uIHNjYWxlVHJhbnNsYXRlUm90YXRlKGssIGR4LCBkeSwgc3gsIHN5LCBhbHBoYSkge1xuICBpZiAoIWFscGhhKSByZXR1cm4gc2NhbGVUcmFuc2xhdGUoaywgZHgsIGR5LCBzeCwgc3kpO1xuICB2YXIgY29zQWxwaGEgPSBjb3MoYWxwaGEpLFxuICAgICAgc2luQWxwaGEgPSBzaW4oYWxwaGEpLFxuICAgICAgYSA9IGNvc0FscGhhICogayxcbiAgICAgIGIgPSBzaW5BbHBoYSAqIGssXG4gICAgICBhaSA9IGNvc0FscGhhIC8gayxcbiAgICAgIGJpID0gc2luQWxwaGEgLyBrLFxuICAgICAgY2kgPSAoc2luQWxwaGEgKiBkeSAtIGNvc0FscGhhICogZHgpIC8gayxcbiAgICAgIGZpID0gKHNpbkFscGhhICogZHggKyBjb3NBbHBoYSAqIGR5KSAvIGs7XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybSh4LCB5KSB7XG4gICAgeCAqPSBzeDsgeSAqPSBzeTtcbiAgICByZXR1cm4gW2EgKiB4IC0gYiAqIHkgKyBkeCwgZHkgLSBiICogeCAtIGEgKiB5XTtcbiAgfVxuICB0cmFuc2Zvcm0uaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiBbc3ggKiAoYWkgKiB4IC0gYmkgKiB5ICsgY2kpLCBzeSAqIChmaSAtIGJpICogeCAtIGFpICogeSldO1xuICB9O1xuICByZXR1cm4gdHJhbnNmb3JtO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwcm9qZWN0aW9uKHByb2plY3QpIHtcbiAgcmV0dXJuIHByb2plY3Rpb25NdXRhdG9yKGZ1bmN0aW9uKCkgeyByZXR1cm4gcHJvamVjdDsgfSkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3Rpb25NdXRhdG9yKHByb2plY3RBdCkge1xuICB2YXIgcHJvamVjdCxcbiAgICAgIGsgPSAxNTAsIC8vIHNjYWxlXG4gICAgICB4ID0gNDgwLCB5ID0gMjUwLCAvLyB0cmFuc2xhdGVcbiAgICAgIGxhbWJkYSA9IDAsIHBoaSA9IDAsIC8vIGNlbnRlclxuICAgICAgZGVsdGFMYW1iZGEgPSAwLCBkZWx0YVBoaSA9IDAsIGRlbHRhR2FtbWEgPSAwLCByb3RhdGUsIC8vIHByZS1yb3RhdGVcbiAgICAgIGFscGhhID0gMCwgLy8gcG9zdC1yb3RhdGUgYW5nbGVcbiAgICAgIHN4ID0gMSwgLy8gcmVmbGVjdFhcbiAgICAgIHN5ID0gMSwgLy8gcmVmbGVjdFhcbiAgICAgIHRoZXRhID0gbnVsbCwgcHJlY2xpcCA9IGNsaXBBbnRpbWVyaWRpYW4sIC8vIHByZS1jbGlwIGFuZ2xlXG4gICAgICB4MCA9IG51bGwsIHkwLCB4MSwgeTEsIHBvc3RjbGlwID0gaWRlbnRpdHksIC8vIHBvc3QtY2xpcCBleHRlbnRcbiAgICAgIGRlbHRhMiA9IDAuNSwgLy8gcHJlY2lzaW9uXG4gICAgICBwcm9qZWN0UmVzYW1wbGUsXG4gICAgICBwcm9qZWN0VHJhbnNmb3JtLFxuICAgICAgcHJvamVjdFJvdGF0ZVRyYW5zZm9ybSxcbiAgICAgIGNhY2hlLFxuICAgICAgY2FjaGVTdHJlYW07XG5cbiAgZnVuY3Rpb24gcHJvamVjdGlvbihwb2ludCkge1xuICAgIHJldHVybiBwcm9qZWN0Um90YXRlVHJhbnNmb3JtKHBvaW50WzBdICogcmFkaWFucywgcG9pbnRbMV0gKiByYWRpYW5zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmVydChwb2ludCkge1xuICAgIHBvaW50ID0gcHJvamVjdFJvdGF0ZVRyYW5zZm9ybS5pbnZlcnQocG9pbnRbMF0sIHBvaW50WzFdKTtcbiAgICByZXR1cm4gcG9pbnQgJiYgW3BvaW50WzBdICogZGVncmVlcywgcG9pbnRbMV0gKiBkZWdyZWVzXTtcbiAgfVxuXG4gIHByb2plY3Rpb24uc3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNoZSA6IGNhY2hlID0gdHJhbnNmb3JtUmFkaWFucyh0cmFuc2Zvcm1Sb3RhdGUocm90YXRlKShwcmVjbGlwKHByb2plY3RSZXNhbXBsZShwb3N0Y2xpcChjYWNoZVN0cmVhbSA9IHN0cmVhbSkpKSkpO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucHJlY2xpcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcmVjbGlwID0gXywgdGhldGEgPSB1bmRlZmluZWQsIHJlc2V0KCkpIDogcHJlY2xpcDtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnBvc3RjbGlwID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvc3RjbGlwID0gXywgeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCByZXNldCgpKSA6IHBvc3RjbGlwO1xuICB9O1xuXG4gIHByb2plY3Rpb24uY2xpcEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNsaXAgPSArXyA/IGNsaXBDaXJjbGUodGhldGEgPSBfICogcmFkaWFucykgOiAodGhldGEgPSBudWxsLCBjbGlwQW50aW1lcmlkaWFuKSwgcmVzZXQoKSkgOiB0aGV0YSAqIGRlZ3JlZXM7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvc3RjbGlwID0gXyA9PSBudWxsID8gKHgwID0geTAgPSB4MSA9IHkxID0gbnVsbCwgaWRlbnRpdHkpIDogY2xpcFJlY3RhbmdsZSh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5MSA9ICtfWzFdWzFdKSwgcmVzZXQoKSkgOiB4MCA9PSBudWxsID8gbnVsbCA6IFtbeDAsIHkwXSwgW3gxLCB5MV1dO1xuICB9O1xuXG4gIHByb2plY3Rpb24uc2NhbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoayA9ICtfLCByZWNlbnRlcigpKSA6IGs7XG4gIH07XG5cbiAgcHJvamVjdGlvbi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9ICtfWzBdLCB5ID0gK19bMV0sIHJlY2VudGVyKCkpIDogW3gsIHldO1xuICB9O1xuXG4gIHByb2plY3Rpb24uY2VudGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxhbWJkYSA9IF9bMF0gJSAzNjAgKiByYWRpYW5zLCBwaGkgPSBfWzFdICUgMzYwICogcmFkaWFucywgcmVjZW50ZXIoKSkgOiBbbGFtYmRhICogZGVncmVlcywgcGhpICogZGVncmVlc107XG4gIH07XG5cbiAgcHJvamVjdGlvbi5yb3RhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGVsdGFMYW1iZGEgPSBfWzBdICUgMzYwICogcmFkaWFucywgZGVsdGFQaGkgPSBfWzFdICUgMzYwICogcmFkaWFucywgZGVsdGFHYW1tYSA9IF8ubGVuZ3RoID4gMiA/IF9bMl0gJSAzNjAgKiByYWRpYW5zIDogMCwgcmVjZW50ZXIoKSkgOiBbZGVsdGFMYW1iZGEgKiBkZWdyZWVzLCBkZWx0YVBoaSAqIGRlZ3JlZXMsIGRlbHRhR2FtbWEgKiBkZWdyZWVzXTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhID0gXyAlIDM2MCAqIHJhZGlhbnMsIHJlY2VudGVyKCkpIDogYWxwaGEgKiBkZWdyZWVzO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucmVmbGVjdFggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ggPSBfID8gLTEgOiAxLCByZWNlbnRlcigpKSA6IHN4IDwgMDtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnJlZmxlY3RZID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN5ID0gXyA/IC0xIDogMSwgcmVjZW50ZXIoKSkgOiBzeSA8IDA7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJvamVjdFJlc2FtcGxlID0gcmVzYW1wbGUocHJvamVjdFRyYW5zZm9ybSwgZGVsdGEyID0gXyAqIF8pLCByZXNldCgpKSA6IHNxcnQoZGVsdGEyKTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdEV4dGVudChwcm9qZWN0aW9uLCBleHRlbnQsIG9iamVjdCk7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5maXRTaXplID0gZnVuY3Rpb24oc2l6ZSwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdFNpemUocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmZpdFdpZHRoID0gZnVuY3Rpb24od2lkdGgsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRXaWR0aChwcm9qZWN0aW9uLCB3aWR0aCwgb2JqZWN0KTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdEhlaWdodChwcm9qZWN0aW9uLCBoZWlnaHQsIG9iamVjdCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVjZW50ZXIoKSB7XG4gICAgdmFyIGNlbnRlciA9IHNjYWxlVHJhbnNsYXRlUm90YXRlKGssIDAsIDAsIHN4LCBzeSwgYWxwaGEpLmFwcGx5KG51bGwsIHByb2plY3QobGFtYmRhLCBwaGkpKSxcbiAgICAgICAgdHJhbnNmb3JtID0gc2NhbGVUcmFuc2xhdGVSb3RhdGUoaywgeCAtIGNlbnRlclswXSwgeSAtIGNlbnRlclsxXSwgc3gsIHN5LCBhbHBoYSk7XG4gICAgcm90YXRlID0gcm90YXRlUmFkaWFucyhkZWx0YUxhbWJkYSwgZGVsdGFQaGksIGRlbHRhR2FtbWEpO1xuICAgIHByb2plY3RUcmFuc2Zvcm0gPSBjb21wb3NlKHByb2plY3QsIHRyYW5zZm9ybSk7XG4gICAgcHJvamVjdFJvdGF0ZVRyYW5zZm9ybSA9IGNvbXBvc2Uocm90YXRlLCBwcm9qZWN0VHJhbnNmb3JtKTtcbiAgICBwcm9qZWN0UmVzYW1wbGUgPSByZXNhbXBsZShwcm9qZWN0VHJhbnNmb3JtLCBkZWx0YTIpO1xuICAgIHJldHVybiByZXNldCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgY2FjaGUgPSBjYWNoZVN0cmVhbSA9IG51bGw7XG4gICAgcmV0dXJuIHByb2plY3Rpb247XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcHJvamVjdCA9IHByb2plY3RBdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHByb2plY3Rpb24uaW52ZXJ0ID0gcHJvamVjdC5pbnZlcnQgJiYgaW52ZXJ0O1xuICAgIHJldHVybiByZWNlbnRlcigpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtjYXJ0ZXNpYW59IGZyb20gXCIuLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCB7YWJzLCBhc2luLCBhdGFuMiwgY29zLCBlcHNpbG9uLCByYWRpYW5zLCBzcXJ0fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHt0cmFuc2Zvcm1lcn0gZnJvbSBcIi4uL3RyYW5zZm9ybS5qc1wiO1xuXG52YXIgbWF4RGVwdGggPSAxNiwgLy8gbWF4aW11bSBkZXB0aCBvZiBzdWJkaXZpc2lvblxuICAgIGNvc01pbkRpc3RhbmNlID0gY29zKDMwICogcmFkaWFucyk7IC8vIGNvcyhtaW5pbXVtIGFuZ3VsYXIgZGlzdGFuY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHByb2plY3QsIGRlbHRhMikge1xuICByZXR1cm4gK2RlbHRhMiA/IHJlc2FtcGxlKHByb2plY3QsIGRlbHRhMikgOiByZXNhbXBsZU5vbmUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIHJlc2FtcGxlTm9uZShwcm9qZWN0KSB7XG4gIHJldHVybiB0cmFuc2Zvcm1lcih7XG4gICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHggPSBwcm9qZWN0KHgsIHkpO1xuICAgICAgdGhpcy5zdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzYW1wbGUocHJvamVjdCwgZGVsdGEyKSB7XG5cbiAgZnVuY3Rpb24gcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MSwgeTEsIGxhbWJkYTEsIGExLCBiMSwgYzEsIGRlcHRoLCBzdHJlYW0pIHtcbiAgICB2YXIgZHggPSB4MSAtIHgwLFxuICAgICAgICBkeSA9IHkxIC0geTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgaWYgKGQyID4gNCAqIGRlbHRhMiAmJiBkZXB0aC0tKSB7XG4gICAgICB2YXIgYSA9IGEwICsgYTEsXG4gICAgICAgICAgYiA9IGIwICsgYjEsXG4gICAgICAgICAgYyA9IGMwICsgYzEsXG4gICAgICAgICAgbSA9IHNxcnQoYSAqIGEgKyBiICogYiArIGMgKiBjKSxcbiAgICAgICAgICBwaGkyID0gYXNpbihjIC89IG0pLFxuICAgICAgICAgIGxhbWJkYTIgPSBhYnMoYWJzKGMpIC0gMSkgPCBlcHNpbG9uIHx8IGFicyhsYW1iZGEwIC0gbGFtYmRhMSkgPCBlcHNpbG9uID8gKGxhbWJkYTAgKyBsYW1iZGExKSAvIDIgOiBhdGFuMihiLCBhKSxcbiAgICAgICAgICBwID0gcHJvamVjdChsYW1iZGEyLCBwaGkyKSxcbiAgICAgICAgICB4MiA9IHBbMF0sXG4gICAgICAgICAgeTIgPSBwWzFdLFxuICAgICAgICAgIGR4MiA9IHgyIC0geDAsXG4gICAgICAgICAgZHkyID0geTIgLSB5MCxcbiAgICAgICAgICBkeiA9IGR5ICogZHgyIC0gZHggKiBkeTI7XG4gICAgICBpZiAoZHogKiBkeiAvIGQyID4gZGVsdGEyIC8vIHBlcnBlbmRpY3VsYXIgcHJvamVjdGVkIGRpc3RhbmNlXG4gICAgICAgICAgfHwgYWJzKChkeCAqIGR4MiArIGR5ICogZHkyKSAvIGQyIC0gMC41KSA+IDAuMyAvLyBtaWRwb2ludCBjbG9zZSB0byBhbiBlbmRcbiAgICAgICAgICB8fCBhMCAqIGExICsgYjAgKiBiMSArIGMwICogYzEgPCBjb3NNaW5EaXN0YW5jZSkgeyAvLyBhbmd1bGFyIGRpc3RhbmNlXG4gICAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDIsIHkyLCBsYW1iZGEyLCBhIC89IG0sIGIgLz0gbSwgYywgZGVwdGgsIHN0cmVhbSk7XG4gICAgICAgIHN0cmVhbS5wb2ludCh4MiwgeTIpO1xuICAgICAgICByZXNhbXBsZUxpbmVUbyh4MiwgeTIsIGxhbWJkYTIsIGEsIGIsIGMsIHgxLCB5MSwgbGFtYmRhMSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICB2YXIgbGFtYmRhMDAsIHgwMCwgeTAwLCBhMDAsIGIwMCwgYzAwLCAvLyBmaXJzdCBwb2ludFxuICAgICAgICBsYW1iZGEwLCB4MCwgeTAsIGEwLCBiMCwgYzA7IC8vIHByZXZpb3VzIHBvaW50XG5cbiAgICB2YXIgcmVzYW1wbGVTdHJlYW0gPSB7XG4gICAgICBwb2ludDogcG9pbnQsXG4gICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgeyBzdHJlYW0ucG9seWdvblN0YXJ0KCk7IHJlc2FtcGxlU3RyZWFtLmxpbmVTdGFydCA9IHJpbmdTdGFydDsgfSxcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgeyBzdHJlYW0ucG9seWdvbkVuZCgpOyByZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7IH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgICAgeCA9IHByb2plY3QoeCwgeSk7XG4gICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xuICAgICAgeDAgPSBOYU47XG4gICAgICByZXNhbXBsZVN0cmVhbS5wb2ludCA9IGxpbmVQb2ludDtcbiAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lUG9pbnQobGFtYmRhLCBwaGkpIHtcbiAgICAgIHZhciBjID0gY2FydGVzaWFuKFtsYW1iZGEsIHBoaV0pLCBwID0gcHJvamVjdChsYW1iZGEsIHBoaSk7XG4gICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgwID0gcFswXSwgeTAgPSBwWzFdLCBsYW1iZGEwID0gbGFtYmRhLCBhMCA9IGNbMF0sIGIwID0gY1sxXSwgYzAgPSBjWzJdLCBtYXhEZXB0aCwgc3RyZWFtKTtcbiAgICAgIHN0cmVhbS5wb2ludCh4MCwgeTApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7XG4gICAgICByZXNhbXBsZVN0cmVhbS5wb2ludCA9IHBvaW50O1xuICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByaW5nU3RhcnQoKSB7XG4gICAgICBsaW5lU3RhcnQoKTtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gcmluZ1BvaW50O1xuICAgICAgcmVzYW1wbGVTdHJlYW0ubGluZUVuZCA9IHJpbmdFbmQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ1BvaW50KGxhbWJkYSwgcGhpKSB7XG4gICAgICBsaW5lUG9pbnQobGFtYmRhMDAgPSBsYW1iZGEsIHBoaSksIHgwMCA9IHgwLCB5MDAgPSB5MCwgYTAwID0gYTAsIGIwMCA9IGIwLCBjMDAgPSBjMDtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gbGluZVBvaW50O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7XG4gICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgwMCwgeTAwLCBsYW1iZGEwMCwgYTAwLCBiMDAsIGMwMCwgbWF4RGVwdGgsIHN0cmVhbSk7XG4gICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5kID0gbGluZUVuZDtcbiAgICAgIGxpbmVFbmQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzYW1wbGVTdHJlYW07XG4gIH07XG59XG4iLCJpbXBvcnQgY29tcG9zZSBmcm9tIFwiLi9jb21wb3NlLmpzXCI7XG5pbXBvcnQge2FicywgYXNpbiwgYXRhbjIsIGNvcywgZGVncmVlcywgcGksIHJhZGlhbnMsIHNpbiwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIHJvdGF0aW9uSWRlbnRpdHkobGFtYmRhLCBwaGkpIHtcbiAgcmV0dXJuIFthYnMobGFtYmRhKSA+IHBpID8gbGFtYmRhICsgTWF0aC5yb3VuZCgtbGFtYmRhIC8gdGF1KSAqIHRhdSA6IGxhbWJkYSwgcGhpXTtcbn1cblxucm90YXRpb25JZGVudGl0eS5pbnZlcnQgPSByb3RhdGlvbklkZW50aXR5O1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlUmFkaWFucyhkZWx0YUxhbWJkYSwgZGVsdGFQaGksIGRlbHRhR2FtbWEpIHtcbiAgcmV0dXJuIChkZWx0YUxhbWJkYSAlPSB0YXUpID8gKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyBjb21wb3NlKHJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSwgcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSkpXG4gICAgOiByb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSkpXG4gICAgOiAoZGVsdGFQaGkgfHwgZGVsdGFHYW1tYSA/IHJvdGF0aW9uUGhpR2FtbWEoZGVsdGFQaGksIGRlbHRhR2FtbWEpXG4gICAgOiByb3RhdGlvbklkZW50aXR5KTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSB7XG4gIHJldHVybiBmdW5jdGlvbihsYW1iZGEsIHBoaSkge1xuICAgIHJldHVybiBsYW1iZGEgKz0gZGVsdGFMYW1iZGEsIFtsYW1iZGEgPiBwaSA/IGxhbWJkYSAtIHRhdSA6IGxhbWJkYSA8IC1waSA/IGxhbWJkYSArIHRhdSA6IGxhbWJkYSwgcGhpXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpIHtcbiAgdmFyIHJvdGF0aW9uID0gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKTtcbiAgcm90YXRpb24uaW52ZXJ0ID0gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKC1kZWx0YUxhbWJkYSk7XG4gIHJldHVybiByb3RhdGlvbjtcbn1cblxuZnVuY3Rpb24gcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSkge1xuICB2YXIgY29zRGVsdGFQaGkgPSBjb3MoZGVsdGFQaGkpLFxuICAgICAgc2luRGVsdGFQaGkgPSBzaW4oZGVsdGFQaGkpLFxuICAgICAgY29zRGVsdGFHYW1tYSA9IGNvcyhkZWx0YUdhbW1hKSxcbiAgICAgIHNpbkRlbHRhR2FtbWEgPSBzaW4oZGVsdGFHYW1tYSk7XG5cbiAgZnVuY3Rpb24gcm90YXRpb24obGFtYmRhLCBwaGkpIHtcbiAgICB2YXIgY29zUGhpID0gY29zKHBoaSksXG4gICAgICAgIHggPSBjb3MobGFtYmRhKSAqIGNvc1BoaSxcbiAgICAgICAgeSA9IHNpbihsYW1iZGEpICogY29zUGhpLFxuICAgICAgICB6ID0gc2luKHBoaSksXG4gICAgICAgIGsgPSB6ICogY29zRGVsdGFQaGkgKyB4ICogc2luRGVsdGFQaGk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGF0YW4yKHkgKiBjb3NEZWx0YUdhbW1hIC0gayAqIHNpbkRlbHRhR2FtbWEsIHggKiBjb3NEZWx0YVBoaSAtIHogKiBzaW5EZWx0YVBoaSksXG4gICAgICBhc2luKGsgKiBjb3NEZWx0YUdhbW1hICsgeSAqIHNpbkRlbHRhR2FtbWEpXG4gICAgXTtcbiAgfVxuXG4gIHJvdGF0aW9uLmludmVydCA9IGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7XG4gICAgdmFyIGNvc1BoaSA9IGNvcyhwaGkpLFxuICAgICAgICB4ID0gY29zKGxhbWJkYSkgKiBjb3NQaGksXG4gICAgICAgIHkgPSBzaW4obGFtYmRhKSAqIGNvc1BoaSxcbiAgICAgICAgeiA9IHNpbihwaGkpLFxuICAgICAgICBrID0geiAqIGNvc0RlbHRhR2FtbWEgLSB5ICogc2luRGVsdGFHYW1tYTtcbiAgICByZXR1cm4gW1xuICAgICAgYXRhbjIoeSAqIGNvc0RlbHRhR2FtbWEgKyB6ICogc2luRGVsdGFHYW1tYSwgeCAqIGNvc0RlbHRhUGhpICsgayAqIHNpbkRlbHRhUGhpKSxcbiAgICAgIGFzaW4oayAqIGNvc0RlbHRhUGhpIC0geCAqIHNpbkRlbHRhUGhpKVxuICAgIF07XG4gIH07XG5cbiAgcmV0dXJuIHJvdGF0aW9uO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyb3RhdGUpIHtcbiAgcm90YXRlID0gcm90YXRlUmFkaWFucyhyb3RhdGVbMF0gKiByYWRpYW5zLCByb3RhdGVbMV0gKiByYWRpYW5zLCByb3RhdGUubGVuZ3RoID4gMiA/IHJvdGF0ZVsyXSAqIHJhZGlhbnMgOiAwKTtcblxuICBmdW5jdGlvbiBmb3J3YXJkKGNvb3JkaW5hdGVzKSB7XG4gICAgY29vcmRpbmF0ZXMgPSByb3RhdGUoY29vcmRpbmF0ZXNbMF0gKiByYWRpYW5zLCBjb29yZGluYXRlc1sxXSAqIHJhZGlhbnMpO1xuICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkZWdyZWVzLCBjb29yZGluYXRlc1sxXSAqPSBkZWdyZWVzLCBjb29yZGluYXRlcztcbiAgfVxuXG4gIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHtcbiAgICBjb29yZGluYXRlcyA9IHJvdGF0ZS5pbnZlcnQoY29vcmRpbmF0ZXNbMF0gKiByYWRpYW5zLCBjb29yZGluYXRlc1sxXSAqIHJhZGlhbnMpO1xuICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkZWdyZWVzLCBjb29yZGluYXRlc1sxXSAqPSBkZWdyZWVzLCBjb29yZGluYXRlcztcbiAgfTtcblxuICByZXR1cm4gZm9yd2FyZDtcbn1cbiIsImZ1bmN0aW9uIHN0cmVhbUdlb21ldHJ5KGdlb21ldHJ5LCBzdHJlYW0pIHtcbiAgaWYgKGdlb21ldHJ5ICYmIHN0cmVhbUdlb21ldHJ5VHlwZS5oYXNPd25Qcm9wZXJ0eShnZW9tZXRyeS50eXBlKSkge1xuICAgIHN0cmVhbUdlb21ldHJ5VHlwZVtnZW9tZXRyeS50eXBlXShnZW9tZXRyeSwgc3RyZWFtKTtcbiAgfVxufVxuXG52YXIgc3RyZWFtT2JqZWN0VHlwZSA9IHtcbiAgRmVhdHVyZTogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBzdHJlYW1HZW9tZXRyeShvYmplY3QuZ2VvbWV0cnksIHN0cmVhbSk7XG4gIH0sXG4gIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBmZWF0dXJlcyA9IG9iamVjdC5mZWF0dXJlcywgaSA9IC0xLCBuID0gZmVhdHVyZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1HZW9tZXRyeShmZWF0dXJlc1tpXS5nZW9tZXRyeSwgc3RyZWFtKTtcbiAgfVxufTtcblxudmFyIHN0cmVhbUdlb21ldHJ5VHlwZSA9IHtcbiAgU3BoZXJlOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHN0cmVhbS5zcGhlcmUoKTtcbiAgfSxcbiAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0LmNvb3JkaW5hdGVzO1xuICAgIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTtcbiAgfSxcbiAgTXVsdGlQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgb2JqZWN0ID0gY29vcmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTtcbiAgfSxcbiAgTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBzdHJlYW1MaW5lKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtLCAwKTtcbiAgfSxcbiAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0sIDApO1xuICB9LFxuICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHN0cmVhbVBvbHlnb24ob2JqZWN0LmNvb3JkaW5hdGVzLCBzdHJlYW0pO1xuICB9LFxuICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSk7XG4gIH0sXG4gIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgZ2VvbWV0cmllcyA9IG9iamVjdC5nZW9tZXRyaWVzLCBpID0gLTEsIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgc3RyZWFtKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gc3RyZWFtTGluZShjb29yZGluYXRlcywgc3RyZWFtLCBjbG9zZWQpIHtcbiAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCAtIGNsb3NlZCwgY29vcmRpbmF0ZTtcbiAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICB3aGlsZSAoKytpIDwgbikgY29vcmRpbmF0ZSA9IGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0ucG9pbnQoY29vcmRpbmF0ZVswXSwgY29vcmRpbmF0ZVsxXSwgY29vcmRpbmF0ZVsyXSk7XG4gIHN0cmVhbS5saW5lRW5kKCk7XG59XG5cbmZ1bmN0aW9uIHN0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXMsIHN0cmVhbSkge1xuICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0sIDEpO1xuICBzdHJlYW0ucG9seWdvbkVuZCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICBpZiAob2JqZWN0ICYmIHN0cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7XG4gICAgc3RyZWFtT2JqZWN0VHlwZVtvYmplY3QudHlwZV0ob2JqZWN0LCBzdHJlYW0pO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbUdlb21ldHJ5KG9iamVjdCwgc3RyZWFtKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWV0aG9kcykge1xuICByZXR1cm4ge1xuICAgIHN0cmVhbTogdHJhbnNmb3JtZXIobWV0aG9kcylcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybWVyKG1ldGhvZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHZhciBzID0gbmV3IFRyYW5zZm9ybVN0cmVhbTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWV0aG9kcykgc1trZXldID0gbWV0aG9kc1trZXldO1xuICAgIHMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHJldHVybiBzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0oKSB7fVxuXG5UcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtU3RyZWFtLFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLnN0cmVhbS5wb2ludCh4LCB5KTsgfSxcbiAgc3BoZXJlOiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0uc3BoZXJlKCk7IH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLmxpbmVTdGFydCgpOyB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ubGluZUVuZCgpOyB9LFxuICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKTsgfSxcbiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnBvbHlnb25FbmQoKTsgfVxufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gIH07XG59XG4iLCJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXMuanNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJpbXBvcnQgZGVjb21wb3NlLCB7aWRlbnRpdHl9IGZyb20gXCIuL2RlY29tcG9zZS5qc1wiO1xuXG52YXIgc3ZnTm9kZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkge1xuICBjb25zdCBtID0gbmV3ICh0eXBlb2YgRE9NTWF0cml4ID09PSBcImZ1bmN0aW9uXCIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgXCJcIik7XG4gIHJldHVybiBtLmlzSWRlbnRpdHkgPyBpZGVudGl0eSA6IGRlY29tcG9zZShtLmEsIG0uYiwgbS5jLCBtLmQsIG0uZSwgbS5mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdmFsdWUpO1xuICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eTtcbiAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7XG4gIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7XG59XG4iLCJ2YXIgZXBzaWxvbjIgPSAxZS0xMjtcblxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiBzaW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHRhbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHpvb21SaG8ocmhvLCByaG8yLCByaG80KSB7XG5cbiAgLy8gcDAgPSBbdXgwLCB1eTAsIHcwXVxuICAvLyBwMSA9IFt1eDEsIHV5MSwgdzFdXG4gIGZ1bmN0aW9uIHpvb20ocDAsIHAxKSB7XG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSxcbiAgICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgICBkeCA9IHV4MSAtIHV4MCxcbiAgICAgICAgZHkgPSB1eTEgLSB1eTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICAgIGksXG4gICAgICAgIFM7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS5cbiAgICBpZiAoZDIgPCBlcHNpbG9uMikge1xuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB0ICogZHgsXG4gICAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhbCBjYXNlLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSxcbiAgICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSxcbiAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksXG4gICAgICAgICAgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpO1xuICAgICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHZhciBzID0gdCAqIFMsXG4gICAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEpICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgICAgdXkwICsgdSAqIGR5LFxuICAgICAgICAgIHcwICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwICogcmhvIC8gTWF0aC5TUVJUMjtcblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgem9vbS5yaG8gPSBmdW5jdGlvbihfKSB7XG4gICAgdmFyIF8xID0gTWF0aC5tYXgoMWUtMywgK18pLCBfMiA9IF8xICogXzEsIF80ID0gXzIgKiBfMjtcbiAgICByZXR1cm4gem9vbVJobyhfMSwgXzIsIF80KTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn0pKE1hdGguU1FSVDIsIDIsIDQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgTWF0aC5yYW5kb207XG4iLCJpbXBvcnQgZGVmYXVsdFNvdXJjZSBmcm9tIFwiLi9kZWZhdWx0U291cmNlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Ob3JtYWwoc291cmNlKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbU5vcm1hbChtdSwgc2lnbWEpIHtcbiAgICB2YXIgeCwgcjtcbiAgICBtdSA9IG11ID09IG51bGwgPyAwIDogK211O1xuICAgIHNpZ21hID0gc2lnbWEgPT0gbnVsbCA/IDEgOiArc2lnbWE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHk7XG5cbiAgICAgIC8vIElmIGF2YWlsYWJsZSwgdXNlIHRoZSBzZWNvbmQgcHJldmlvdXNseS1nZW5lcmF0ZWQgdW5pZm9ybSByYW5kb20uXG4gICAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgZ2VuZXJhdGUgYSBuZXcgeCBhbmQgeS5cbiAgICAgIGVsc2UgZG8ge1xuICAgICAgICB4ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgeSA9IHNvdXJjZSgpICogMiAtIDE7XG4gICAgICAgIHIgPSB4ICogeCArIHkgKiB5O1xuICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpO1xuXG4gICAgICByZXR1cm4gbXUgKyBzaWdtYSAqIHkgKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xuICAgIH07XG4gIH1cblxuICByYW5kb21Ob3JtYWwuc291cmNlID0gc291cmNlUmFuZG9tTm9ybWFsO1xuXG4gIHJldHVybiByYW5kb21Ob3JtYWw7XG59KShkZWZhdWx0U291cmNlKTtcbiIsIi8vIEdpdmVuIHNvbWV0aGluZyBhcnJheSBsaWtlIChvciBudWxsKSwgcmV0dXJucyBzb21ldGhpbmcgdGhhdCBpcyBzdHJpY3RseSBhblxuLy8gYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBhcnJheS1saWtlIG9iamVjdHMgcGFzc2VkIHRvIGQzLnNlbGVjdEFsbFxuLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGFcbi8vIHNlbGVjdGlvbjsgd2UgZG9u4oCZdCBldmVyIHdhbnQgdG8gY3JlYXRlIGEgc2VsZWN0aW9uIGJhY2tlZCBieSBhIGxpdmVcbi8vIEhUTUxDb2xsZWN0aW9uIG9yIE5vZGVMaXN0LiBIb3dldmVyLCBub3RlIHRoYXQgc2VsZWN0aW9uLnNlbGVjdEFsbCB3aWxsIHVzZSBhXG4vLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXJyYXkoeCkge1xuICByZXR1cm4geCA9PSBudWxsID8gW10gOiBBcnJheS5pc0FycmF5KHgpID8geCA6IEFycmF5LmZyb20oeCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwiaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBwcmVmaXggPSBuYW1lICs9IFwiXCIsIGkgPSBwcmVmaXguaW5kZXhPZihcIjpcIik7XG4gIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xufVxuIiwiZXhwb3J0IHZhciB4aHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB4aHRtbDogeGh0bWwsXG4gIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgeG1sOiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG59O1xuIiwiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2UuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG59XG5cbmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7XG4gIHRoaXMuX25vZGUgPSBub2RlO1xuICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiKTtcbn1cblxuQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArIFwiXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZVxuICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpO1xufVxuIiwiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0gbmV3IE1hcCxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSxcbiAgICAgIGtleVZhbHVlO1xuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLlxuICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkgKyBcIlwiO1xuICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHtcbiAgICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS5cbiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS5cbiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLlxuICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAga2V5VmFsdWUgPSBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpICsgXCJcIjtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlc1tpXSkgPT09IG5vZGUpKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0dW0obm9kZSkge1xuICByZXR1cm4gbm9kZS5fX2RhdGFfXztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBBcnJheS5mcm9tKHRoaXMsIGRhdHVtKTtcblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTtcblxuICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTtcblxuICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdFxuICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuXG4gICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHtcbiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7XG4gICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7XG4gICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTtcbiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbih1cGRhdGUsIHBhcmVudHMpO1xuICB1cGRhdGUuX2VudGVyID0gZW50ZXI7XG4gIHVwZGF0ZS5fZXhpdCA9IGV4aXQ7XG4gIHJldHVybiB1cGRhdGU7XG59XG5cbi8vIEdpdmVuIHNvbWUgZGF0YSwgdGhpcyByZXR1cm5zIGFuIGFycmF5LWxpa2UgdmlldyBvZiBpdDogYW4gb2JqZWN0IHRoYXRcbi8vIGV4cG9zZXMgYSBsZW5ndGggcHJvcGVydHkgYW5kIGFsbG93cyBudW1lcmljIGluZGV4aW5nLiBOb3RlIHRoYXQgdW5saWtlXG4vLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nXG4vLyBhcnJheSB3aWxsIG9ubHkgYmUgdXNlZCBicmllZmx5IHdoaWxlIGRhdGEgaXMgYmVpbmcgYm91bmQuIChJdCBpcyBwb3NzaWJsZSB0b1xuLy8gY2F1c2UgdGhlIGRhdGEgdG8gY2hhbmdlIHdoaWxlIGl0ZXJhdGluZyBieSB1c2luZyBhIGtleSBmdW5jdGlvbiwgYnV0IHBsZWFzZVxuLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pXG5mdW5jdGlvbiBhcnJheWxpa2UoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiBkYXRhXG4gICAgPyBkYXRhIC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbShkYXRhKTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykge1xuICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksXG4gICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGRpc3BhdGNoRnVuY3Rpb25cbiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaGVyIGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkge1xuICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTtcbiAgaWYgKHR5cGVvZiBvbmVudGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpO1xuICAgIGlmIChlbnRlcikgZW50ZXIgPSBlbnRlci5zZWxlY3Rpb24oKTtcbiAgfSBlbHNlIHtcbiAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgXCJcIik7XG4gIH1cbiAgaWYgKG9udXBkYXRlICE9IG51bGwpIHtcbiAgICB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpO1xuICAgIGlmICh1cGRhdGUpIHVwZGF0ZSA9IHVwZGF0ZS5zZWxlY3Rpb24oKTtcbiAgfVxuICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpO1xuICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlO1xufVxuIiwiZnVuY3Rpb24gbG93ZXIoKSB7XG4gIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0O1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwiZnVuY3Rpb24gcmFpc2UoKSB7XG4gIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nO1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHtcbiAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpO1xufVxuXG5mdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xufVxuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZnVuY3Rpb24gZW1wdHkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgbGV0IHNvdXJjZUV2ZW50O1xuICB3aGlsZSAoc291cmNlRXZlbnQgPSBldmVudC5zb3VyY2VFdmVudCkgZXZlbnQgPSBzb3VyY2VFdmVudDtcbiAgcmV0dXJuIGV2ZW50O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlXG4gICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93XG4gICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbn1cbiIsImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGVsYXBzZWQgPT4ge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQge1NDSEVEVUxFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG52YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGk7XG5cbiAgaWYgKHNjaGVkdWxlcykge1xuICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QsIG5hbWUsICtpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFjdGl2ZX0gZnJvbSBcIi4vYWN0aXZlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJydXB0fSBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbiIsImltcG9ydCB7U1RBUlRJTkcsIEVORElORywgRU5ERUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGVtcHR5ID0gdHJ1ZSxcbiAgICAgIGk7XG5cbiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjtcblxuICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuXG4gIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9XG4gICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyAmJiBzY2hlZHVsZS5zdGF0ZSA8IEVORElORztcbiAgICBzY2hlZHVsZS5zdGF0ZSA9IEVOREVEO1xuICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTtcbiAgICBzY2hlZHVsZS5vbi5jYWxsKGFjdGl2ZSA/IFwiaW50ZXJydXB0XCIgOiBcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gIH1cblxuICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBlbXB0eSwgcmVzb2x2ZSBlbmQgaW1tZWRpYXRlbHlcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG4gIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFydChuYW1lKSB7XG4gIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykuZXZlcnkoZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4gIXQgfHwgdCA9PT0gXCJzdGFydFwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQ7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDJcbiAgICAgID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSlcbiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXIsIHRpbWVvdXR9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZW1wdHlPbiA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJjYW5jZWxcIiwgXCJpbnRlcnJ1cHRcIik7XG52YXIgZW1wdHlUd2VlbiA9IFtdO1xuXG5leHBvcnQgdmFyIENSRUFURUQgPSAwO1xuZXhwb3J0IHZhciBTQ0hFRFVMRUQgPSAxO1xuZXhwb3J0IHZhciBTVEFSVElORyA9IDI7XG5leHBvcnQgdmFyIFNUQVJURUQgPSAzO1xuZXhwb3J0IHZhciBSVU5OSU5HID0gNDtcbmV4cG9ydCB2YXIgRU5ESU5HID0gNTtcbmV4cG9ydCB2YXIgRU5ERUQgPSA2O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTtcbiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47XG4gIGNyZWF0ZShub2RlLCBpZCwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgb246IGVtcHR5T24sXG4gICAgdHdlZW46IGVtcHR5VHdlZW4sXG4gICAgdGltZTogdGltaW5nLnRpbWUsXG4gICAgZGVsYXk6IHRpbWluZy5kZWxheSxcbiAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLFxuICAgIGVhc2U6IHRpbWluZy5lYXNlLFxuICAgIHRpbWVyOiBudWxsLFxuICAgIHN0YXRlOiBDUkVBVEVEXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcihcInRyYW5zaXRpb24gbm90IGZvdW5kXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICB0d2VlbjtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC5cbiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shXG4gIHNjaGVkdWxlc1tpZF0gPSBzZWxmO1xuICBzZWxmLnRpbWVyID0gdGltZXIoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7XG4gICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuXG4gICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkge1xuICAgIHZhciBpLCBqLCBuLCBvO1xuXG4gICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LlxuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7XG5cbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBvID0gc2NoZWR1bGVzW2ldO1xuICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSxcbiAgICAgIC8vIGRlZmVyIHN0YXJ0aW5nIGFuIGludGVycnVwdGluZyB0cmFuc2l0aW9uIHVudGlsIHRoYXQgdHJhbnNpdGlvbiBoYXMgYVxuICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCFcbiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dChzdGFydCk7XG5cbiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS5cbiAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImludGVycnVwdFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLlxuICAgICAgZWxzZSBpZiAoK2kgPCBpZCkge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni5cbiAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIVxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiFcbiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suXG4gICAgdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HO1xuICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcbiAgICAgICAgdGljayhlbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC5cbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLlxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORztcbiAgICBzZWxmLm9uLmNhbGwoXCJzdGFydFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkcpIHJldHVybjsgLy8gaW50ZXJydXB0ZWRcbiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLlxuICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkge1xuICAgICAgICB0d2VlblsrK2pdID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHtcbiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpO1xuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykge1xuICAgICAgc2VsZi5vbi5jYWxsKFwiZW5kXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgICAgc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc2VsZi5zdGF0ZSA9IEVOREVEO1xuICAgIHNlbGYudGltZXIuc3RvcCgpO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdO1xuICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTtcbiAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xW2ldID0gdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICBuYW1lICs9IFwiXCI7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDtcblxuICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTtcbiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgdGFyZ2V0LFxuICB0cmFuc2Zvcm0sXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0cmFuc2Zvcm06IHt2YWx1ZTogdHJhbnNmb3JtLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHpvb219IGZyb20gXCIuL3pvb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tVHJhbnNmb3JtLCBpZGVudGl0eSBhcyB6b29tSWRlbnRpdHksIFRyYW5zZm9ybSBhcyBab29tVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbiIsImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgWm9vbUV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQge1RyYW5zZm9ybSwgaWRlbnRpdHl9IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuLy8gZXhjZXB0IGZvciBwaW5jaC10by16b29tLCB3aGljaCBpcyBzZW50IGFzIGEgd2hlZWwrY3RybEtleSBldmVudFxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7XG4gIHZhciBlID0gdGhpcztcbiAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7XG4gICAgaWYgKGUuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgICAgZSA9IGUudmlld0JveC5iYXNlVmFsO1xuICAgICAgcmV0dXJuIFtbZS54LCBlLnldLCBbZS54ICsgZS53aWR0aCwgZS55ICsgZS5oZWlnaHRdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbMCwgMF0sIFtlLndpZHRoLmJhc2VWYWwudmFsdWUsIGUuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0oKSB7XG4gIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFdoZWVsRGVsdGEoZXZlbnQpIHtcbiAgcmV0dXJuIC1ldmVudC5kZWx0YVkgKiAoZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMC4wNSA6IGV2ZW50LmRlbHRhTW9kZSA/IDEgOiAwLjAwMikgKiAoZXZlbnQuY3RybEtleSA/IDEwIDogMSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkge1xuICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSxcbiAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sXG4gICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLFxuICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTtcbiAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoXG4gICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLFxuICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgY29uc3RyYWluID0gZGVmYXVsdENvbnN0cmFpbixcbiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxEZWx0YSxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBzY2FsZUV4dGVudCA9IFswLCBJbmZpbml0eV0sXG4gICAgICB0cmFuc2xhdGVFeHRlbnQgPSBbWy1JbmZpbml0eSwgLUluZmluaXR5XSwgW0luZmluaXR5LCBJbmZpbml0eV1dLFxuICAgICAgZHVyYXRpb24gPSAyNTAsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJ6b29tXCIsIFwiZW5kXCIpLFxuICAgICAgdG91Y2hzdGFydGluZyxcbiAgICAgIHRvdWNoZmlyc3QsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIHRvdWNoRGVsYXkgPSA1MDAsXG4gICAgICB3aGVlbERlbGF5ID0gMTUwLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwLFxuICAgICAgdGFwRGlzdGFuY2UgPSAxMDtcblxuICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSlcbiAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCB3aGVlbGVkLCB7cGFzc2l2ZTogZmFsc2V9KVxuICAgICAgICAub24oXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZWRvd25lZClcbiAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbVwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uO1xuICAgIHNlbGVjdGlvbi5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKTtcbiAgICBpZiAoY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uKSB7XG4gICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAuZXZlbnQoZXZlbnQpXG4gICAgICAgICAgLnN0YXJ0KClcbiAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRyYW5zZm9ybSlcbiAgICAgICAgICAuZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20uc2NhbGVUbyhzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uayxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGswICogazE7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcCxcbiAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIG51bGwsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7XG4gICAgICByZXR1cm4gY29uc3RyYWluKGlkZW50aXR5LnRyYW5zbGF0ZShwMFswXSwgcDBbMV0pLnNjYWxlKHQuaykudHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8gLXguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC14LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8gLXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC15XG4gICAgICApLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHtcbiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7XG4gICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHRyYW5zZm9ybSwgcDAsIHAxKSB7XG4gICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7XG4gICAgcmV0dXJuIHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7XG4gIH1cblxuICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHtcbiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHRyYW5zaXRpb25cbiAgICAgICAgLm9uKFwic3RhcnQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5zdGFydCgpOyB9KVxuICAgICAgICAub24oXCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5lbmQoKTsgfSlcbiAgICAgICAgLnR3ZWVuKFwiem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgICAgICAgZSA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKSxcbiAgICAgICAgICAgICAgcCA9IHBvaW50ID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwb2ludCA9PT0gXCJmdW5jdGlvblwiID8gcG9pbnQuYXBwbHkodGhhdCwgYXJncykgOiBwb2ludCxcbiAgICAgICAgICAgICAgdyA9IE1hdGgubWF4KGVbMV1bMF0gLSBlWzBdWzBdLCBlWzFdWzFdIC0gZVswXVsxXSksXG4gICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSxcbiAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6IHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKGEuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYS5rKSwgYi5pbnZlcnQocCkuY29uY2F0KHcgLyBiLmspKTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvciBvbiBlbmQuXG4gICAgICAgICAgICBlbHNlIHsgdmFyIGwgPSBpKHQpLCBrID0gdyAvIGxbMl07IHQgPSBuZXcgVHJhbnNmb3JtKGssIHBbMF0gLSBsWzBdICogaywgcFsxXSAtIGxbMV0gKiBrKTsgfVxuICAgICAgICAgICAgZy56b29tKG51bGwsIHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VzdHVyZSh0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX196b29taW5nKSB8fCBuZXcgR2VzdHVyZSh0aGF0LCBhcmdzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEdlc3R1cmUodGhhdCwgYXJncykge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5zb3VyY2VFdmVudCA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgdGhpcy50YXBzID0gMDtcbiAgfVxuXG4gIEdlc3R1cmUucHJvdG90eXBlID0ge1xuICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSB0aGlzLnNvdXJjZUV2ZW50ID0gZXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7XG4gICAgICAgIHRoaXMudGhhdC5fX3pvb21pbmcgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdGFydFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgem9vbTogZnVuY3Rpb24oa2V5LCB0cmFuc2Zvcm0pIHtcbiAgICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gXCJtb3VzZVwiKSB0aGlzLm1vdXNlWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLm1vdXNlWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDBbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDFbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKTtcbiAgICAgIHRoaXMudGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07XG4gICAgICB0aGlzLmVtaXQoXCJ6b29tXCIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmc7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IFpvb21FdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IHRoaXMuc291cmNlRXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiB6b29tLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLnRoYXQuX196b29tLFxuICAgICAgICAgIGRpc3BhdGNoOiBsaXN0ZW5lcnNcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBtb3VzZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LlxuICAgIC8vIElmIHRoZXJlIHdlcmUgcmVjZW50IHdoZWVsIGV2ZW50cywgcmVzZXQgdGhlIHdoZWVsIGlkbGUgdGltZW91dC5cbiAgICBpZiAoZy53aGVlbCkge1xuICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0gfHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkge1xuICAgICAgICBnLm1vdXNlWzFdID0gdC5pbnZlcnQoZy5tb3VzZVswXSA9IHApO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29u4oCZdCB0cmlnZ2VyIGEgdHJhbnNmb3JtIGNoYW5nZSwgaWdub3JlIGl0LlxuICAgIGVsc2UgaWYgKHQuayA9PT0gaykgcmV0dXJuO1xuXG4gICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQgdGhlIHN0YXJ0LlxuICAgIGVsc2Uge1xuICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCB0cnVlKS5ldmVudChldmVudCksXG4gICAgICAgIHYgPSBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuem9vbVwiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuem9vbVwiLCBtb3VzZXVwcGVkLCB0cnVlKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLFxuICAgICAgICB4MCA9IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHkwID0gZXZlbnQuY2xpZW50WTtcblxuICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTtcbiAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgZy5zdGFydCgpO1xuXG4gICAgZnVuY3Rpb24gbW91c2Vtb3ZlZChldmVudCkge1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBpZiAoIWcubW92ZWQpIHtcbiAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIHgwLCBkeSA9IGV2ZW50LmNsaWVudFkgLSB5MDtcbiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgICB9XG4gICAgICBnLmV2ZW50KGV2ZW50KVxuICAgICAgIC56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW91c2V1cHBlZChldmVudCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGcuZXZlbnQoZXZlbnQpLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgIHAwID0gcG9pbnRlcihldmVudC5jaGFuZ2VkVG91Y2hlcyA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQsIHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3MpLCB0cmFuc2xhdGVFeHRlbnQpO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwLCBldmVudCk7XG4gICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEsIHAwLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC50b3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gbikuZXZlbnQoZXZlbnQpLFxuICAgICAgICBzdGFydGVkLCBpLCB0LCBwO1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCksIHQuaWRlbnRpZmllcl07XG4gICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHAsIHN0YXJ0ZWQgPSB0cnVlLCBnLnRhcHMgPSAxICsgISF0b3VjaHN0YXJ0aW5nO1xuICAgICAgZWxzZSBpZiAoIWcudG91Y2gxICYmIGcudG91Y2gwWzJdICE9PSBwWzJdKSBnLnRvdWNoMSA9IHAsIGcudGFwcyA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoZmlyc3QgPSBwWzBdLCB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwO1xuICAgIH1cbiAgICB0ID0gZy50aGF0Ll9fem9vbTtcbiAgICBpZiAoZy50b3VjaDEpIHtcbiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLFxuICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sXG4gICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCxcbiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsO1xuICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7XG4gICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdO1xuICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdO1xuICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgZy56b29tKFwidG91Y2hcIiwgY29uc3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV07XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxO1xuICAgIH1cbiAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7XG4gICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7XG4gICAgZWxzZSB7XG4gICAgICBnLmVuZCgpO1xuICAgICAgLy8gSWYgdGhpcyB3YXMgYSBkYmx0YXAsIHJlcm91dGUgdG8gdGhlIChvcHRpb25hbCkgZGJsY2xpY2suem9vbSBoYW5kbGVyLlxuICAgICAgaWYgKGcudGFwcyA9PT0gMikge1xuICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgICAgaWYgKE1hdGguaHlwb3QodG91Y2hmaXJzdFswXSAtIHRbMF0sIHRvdWNoZmlyc3RbMV0gLSB0WzFdKSA8IHRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgdmFyIHAgPSBzZWxlY3QodGhpcykub24oXCJkYmxjbGljay56b29tXCIpO1xuICAgICAgICAgIGlmIChwKSBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7XG4gIH07XG5cbiAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IGZpbHRlcjtcbiAgfTtcblxuICB6b29tLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDtcbiAgfTtcblxuICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlRXh0ZW50WzBdWzBdID0gK19bMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVswXSA9ICtfWzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV0gPSArX1swXVsxXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdID0gK19bMV1bMV0sIHpvb20pIDogW1t0cmFuc2xhdGVFeHRlbnRbMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXV0sIFt0cmFuc2xhdGVFeHRlbnRbMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXV1dO1xuICB9O1xuXG4gIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluO1xuICB9O1xuXG4gIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjtcbiAgfTtcblxuICB6b29tLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgem9vbSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICB6b29tLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICB6b29tLnRhcERpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcERpc3RhbmNlID0gK18sIHpvb20pIDogdGFwRGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8vIGludGVybmFsIGltcG9ydHNcbmltcG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vR2VvQ2FudmFzLmpzJ1xuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuL0xheWVyLmpzJ1xuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4vRGF0YXNldC5qcydcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuL1Rvb2x0aXAuanMnXG5pbXBvcnQgeyBDU1ZHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L0NTVkdyaWQuanMnXG5pbXBvcnQgeyBUaWxlZEdyaWQgfSBmcm9tICcuL2RhdGFzZXQvVGlsZWRHcmlkLmpzJ1xuaW1wb3J0IHsgQmFja2dyb3VuZExheWVyIH0gZnJvbSAnLi9CYWNrZ3JvdW5kTGF5ZXIuanMnXG5pbXBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXJXTVMgfSBmcm9tICcuL0JhY2tncm91bmRMYXllcldNUy5qcydcbmltcG9ydCB7IExhYmVsTGF5ZXIgfSBmcm9tICcuL0xhYmVsTGF5ZXIuanMnXG5pbXBvcnQgeyBMaW5lTGF5ZXIgfSBmcm9tICcuL0xpbmVMYXllci5qcydcbmltcG9ydCB7IG1vbml0b3IsIG1vbml0b3JEdXJhdGlvbiB9IGZyb20gJy4vdXRpbHMvVXRpbHMuanMnXG5cbi8vIGV4dGVybmFsIGltcG9ydHNcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcblxuLyoqXG4gKiBBIGdyaWR2aXogYXBwbGljYXRpb24uXG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbGF5ZXJzLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPExheWVyPn1cbiAgICAgICAgICogKi9cbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxuXG4gICAgICAgIC8vZ2V0IGNvbnRhaW5lciBlbGVtZW50XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmlkdml6JylcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGZpbmQgZ3JpZHZpeiBjb250YWluZXIgZWxlbWVudC4nKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL3NldCBkaW1lbnNpb25zXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLncgPSBvcHRzLncgfHwgdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IG9wdHMuaCB8fCB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHRcblxuICAgICAgICAvL2NyZWF0ZSBjYW52YXMgZWxlbWVudCBpZiB1c2VyIGRvZXNudCBzcGVjaWZ5IG9uZVxuICAgICAgICAvKiogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fSAqL1xuICAgICAgICBsZXQgY2FudmFzID0gb3B0cy5jYW52YXMgfHwgbnVsbFxuICAgICAgICBpZiAoIWNhbnZhcykge1xuICAgICAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXG4gICAgICAgICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGNhbnZhcylcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBNYWtlIGdlbyBjYW52YXNcbiAgICAgICAgICogQHR5cGUge0dlb0NhbnZhc31cbiAgICAgICAgICogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jZyA9IG5ldyBHZW9DYW52YXMoY2FudmFzLCB1bmRlZmluZWQsIDEsIG9wdHMpXG4gICAgICAgIHRoaXMuY2cucmVkcmF3ID0gKHN0cm9uZyA9IHRydWUpID0+IHtcbiAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ1N0YXJ0IHJlZHJhdycpXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiP3g9XCIgKyB0aGlzLmNnLmdldENlbnRlcigpLnggKyBcIiZ5PVwiICsgdGhpcy5jZy5nZXRDZW50ZXIoKS55ICsgXCImej1cIiArIHRoaXMuY2cuZ2V0WmYoKSlcblxuICAgICAgICAgICAgLy9yZW1vdmUgbGVnZW5kIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAodGhpcy5sZWdlbmQgJiYgc3Ryb25nKSB0aGlzLmxlZ2VuZC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgICAgICAvL2NsZWFyXG4gICAgICAgICAgICB0aGlzLmNnLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgdGhpcy5jZy5jbGVhcih0aGlzLmNnLmJhY2tncm91bmRDb2xvcilcblxuICAgICAgICAgICAgY29uc3QgemYgPSB0aGlzLmdldFpvb21GYWN0b3IoKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGJhY2tncm91bmQgbGF5ZXJzXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93QmdMYXllcnMpXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmJnTGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgbGF5ZXIgaXMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyLnZpc2libGUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh6ZiA+IGxheWVyLm1heFpvb20pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh6ZiA8IGxheWVyLm1pblpvb20pIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGxheWVyXG4gICAgICAgICAgICAgICAgICAgIGxheWVyLmRyYXcodGhpcy5jZylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgLy9jaGVjayBpZiBsYXllciBpcyB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFsYXllci52aXNpYmxlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGlmICh6ZiA+IGxheWVyLm1heFpvb20pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKHpmIDwgbGF5ZXIubWluWm9vbSkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZ2V0IGxheWVyIGRhdGFzZXQgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4vRGF0YXNldENvbXBvbmVudCcpLkRhdGFzZXRDb21wb25lbnR8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXRDb21wb25lbnQoemYpXG4gICAgICAgICAgICAgICAgaWYgKCFkc2MpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL2xhdW5jaCBkYXRhIGRvd25sb2FkLCBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICBpZiAoc3Ryb25nKVxuICAgICAgICAgICAgICAgICAgICBkc2MuZ2V0RGF0YSh0aGlzLmNnLmV4dEdlbywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy91cGRhdGUgZGF0YXNldCB2aWV3IGNhY2hlXG4gICAgICAgICAgICAgICAgaWYgKHN0cm9uZykgZHNjLnVwZGF0ZVZpZXdDYWNoZSh0aGlzLmNnLmV4dEdlbylcblxuICAgICAgICAgICAgICAgIC8vc2V0IGxheWVyIGFscGhhIGFuZCBibGVuZCBtb2RlXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHguZ2xvYmFsQWxwaGEgPSBsYXllci5hbHBoYSA/IGxheWVyLmFscGhhKHpmKSA6IDEuMFxuICAgICAgICAgICAgICAgIHRoaXMuY2cuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGxheWVyLmJsZW5kT3BlcmF0aW9uKHpmKVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNlbGxzLCBzdHlsZSBieSBzdHlsZVxuICAgICAgICAgICAgICAgIGlmIChzdHJvbmcpXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBsYXllci5zdHlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgc3R5bGUgaXMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLnZpc2libGUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPiBzLm1heFpvb20pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPCBzLm1pblpvb20pIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IHN0eWxlIGFscGhhIGFuZCBibGVuZCBtb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IG11bHRpcGx5IGJ5IGxheWVyIGFscGhhID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2cuY3R4Lmdsb2JhbEFscGhhID0gcy5hbHBoYSA/IHMuYWxwaGEoemYpIDogMS4wXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBzLmJsZW5kT3BlcmF0aW9uKHpmKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzLmRyYXcoZHNjLmdldFZpZXdDYWNoZSgpLCBkc2MuZ2V0UmVzb2x1dGlvbigpLCB0aGlzLmNnKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2FkZCBsZWdlbmQgZWxlbWVudFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZ2VuZCAmJiBzdHJvbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGxheWVyLnN0eWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmID4gcy5tYXhab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmIDwgcy5taW5ab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsZyBvZiBzLmxlZ2VuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHMsIGxnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5sZWdlbmQuYXBwZW5kKGxnLmRpdilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3MxLm5vZGUoKS5hcHBlbmRDaGlsZChzMi5ub2RlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWdlbmQubm9kZSgpLmFwcGVuZChsZy5kaXYubm9kZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2Nhc2UgZm9yIHN0eWxlcyBvZiBzdHlsZXMsIGxpa2Uga2VybmVsIHNtb290aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGRvIGJldHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbJ3N0eWxlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzMiBvZiBzLnN0eWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPiBzMi5tYXhab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPCBzMi5taW5ab29tKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxnIG9mIHMyLmxlZ2VuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocywgbGcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMubGVnZW5kLmFwcGVuZChsZy5kaXYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3MxLm5vZGUoKS5hcHBlbmRDaGlsZChzMi5ub2RlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZ2VuZC5ub2RlKCkuYXBwZW5kKGxnLmRpdi5ub2RlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL3Jlc3RvcmUgZGVmYXVsdCBhbHBoYSBhbmQgYmxlbmQgb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHguZ2xvYmFsQWxwaGEgPSAxLjBcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcIm5vcm1hbFwiXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBib3VuZGFyeSBsYXllclxuICAgICAgICAgICAgLy9pZiAoc3Ryb25nKVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0JvdW5kYXJpZXMgJiYgdGhpcy5ib3VuZGFyeUxheWVyKSB0aGlzLmJvdW5kYXJ5TGF5ZXIuZHJhdyh0aGlzLmNnKVxuXG4gICAgICAgICAgICAvL2RyYXcgbGFiZWwgbGF5ZXJcbiAgICAgICAgICAgIC8vaWYgKHN0cm9uZylcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dMYWJlbHMgJiYgdGhpcy5sYWJlbExheWVyKSB0aGlzLmxhYmVsTGF5ZXIuZHJhdyh0aGlzLmNnKVxuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gbnVsbFxuXG4gICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdFbmQgcmVkcmF3JylcblxuICAgICAgICAgICAgLy8gbGlzdGVuIGZvciByZXNpemUgZXZlbnRzIG9uIHRoZSBBcHAncyBjb250YWluZXIgYW5kIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICB0aGlzLmRlZmluZVJlc2l6ZU9ic2VydmVyKHRoaXMuY29udGFpbmVyLCBjYW52YXMpXG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgIH1cblxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxCYWNrZ3JvdW5kTGF5ZXJ8QmFja2dyb3VuZExheWVyV01TPn0gKi9cbiAgICAgICAgdGhpcy5iZ0xheWVycyA9IFtdXG4gICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zaG93QmdMYXllcnMgPSB0cnVlXG5cbiAgICAgICAgLyoqIEB0eXBlIHtMYWJlbExheWVyIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxhYmVsTGF5ZXIgPSB1bmRlZmluZWRcbiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnNob3dMYWJlbHMgPSB0cnVlXG5cbiAgICAgICAgLyoqIEB0eXBlIHtMaW5lTGF5ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuYm91bmRhcnlMYXllciA9IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMuc2hvd0JvdW5kYXJpZXMgPSB0cnVlXG5cbiAgICAgICAgLy9sZWdlbmQgZGl2XG5cbiAgICAgICAgdGhpcy5sZWdlbmREaXZJZCA9IG9wdHMubGVnZW5kRGl2SWQgfHwgJ2d2aXpMZWdlbmQnXG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KCcjJyArIHRoaXMubGVnZW5kRGl2SWQpXG4gICAgICAgIGlmICh0aGlzLmxlZ2VuZC5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmxlZ2VuZCA9IHNlbGVjdChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5pZCAmJiB0aGlzLmNvbnRhaW5lci5pZCAhPSAnJyA/ICcjJyArIHRoaXMuY29udGFpbmVyLmlkIDogJ2JvZHknXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCB0aGlzLmxlZ2VuZERpdklkKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnd2lkdGgnLCAnYXV0bycpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdoZWlnaHQnLCAnYXV0bycpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkZDQycpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJwYWRkaW5nXCIsIHRoaXMucGFkZGluZylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2JvcmRlcicsICcwcHgnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYm94LXNoYWRvdycsICczcHggM3B4IDNweCBncmV5LCAtM3B4IC0zcHggM3B4ICNkZGQnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1mYW1pbHknLCAnSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZicpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd0b3AnLCAnMjBweCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdyaWdodCcsICcyMHB4JylcbiAgICAgICAgICAgIC8vaGlkZVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXG4gICAgICAgIH1cblxuICAgICAgICAvL3Rvb2x0aXBcblxuICAgICAgICAvLyBzZXQgQXBwIGNvbnRhaW5lciBhcyBkZWZhdWx0IHBhcmVudCBlbGVtZW50IGZvciB0b29sdGlwXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwKSBvcHRzLnRvb2x0aXAgPSB7fVxuICAgICAgICBpZiAoIW9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50KSBvcHRzLnRvb2x0aXAucGFyZW50RWxlbWVudCA9IHRoaXMuY29udGFpbmVyXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtUb29sdGlwfSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcChvcHRzLnRvb2x0aXApXG5cbiAgICAgICAgLyoqIEBwYXJhbSB7TW91c2VFdmVudH0gZSAqL1xuICAgICAgICBjb25zdCBmb2N1c0NlbGwgPSAoZSkgPT4ge1xuICAgICAgICAgICAgLy9jb21wdXRlIG1vdXNlIGdlbyBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgbW91c2VQb3NpdGlvbkdlbyA9IHtcbiAgICAgICAgICAgICAgICB4OiB0aGlzLmNnLnBpeFRvR2VvWChlLm9mZnNldFggKyB0aGlzLnRvb2x0aXAueE1vdXNlT2Zmc2V0KSxcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNnLnBpeFRvR2VvWShlLm9mZnNldFkgKyB0aGlzLnRvb2x0aXAueU1vdXNlT2Zmc2V0KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7e2NlbGw6aW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLGh0bWw6c3RyaW5nLHJlc29sdXRpb246bnVtYmVyfSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy5nZXRDZWxsRm9jdXNJbmZvKG1vdXNlUG9zaXRpb25HZW8pXG5cbiAgICAgICAgICAgIC8vIHRyYW5zcGFyZW50IGJhY2tncm91bmQgKGUuZy4gbGVhZmxldCkgJ3JlZCBwYWludGluZycgZml4XG4gICAgICAgICAgICBpZiAob3B0cy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zaG93KClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoZm9jdXMuaHRtbClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UodGhpcy5jZy5jYW52YXMsIDAsIDApXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNob3coKVxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGZvY3VzLmh0bWwpXG5cbiAgICAgICAgICAgICAgICAvL3Nob3cgY2VsbCBwb3NpdGlvbiBhcyBhIHJlY3RhbmdsZVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYW52YXNTYXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UodGhpcy5jZy5jYW52YXMsIDAsIDApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgaW1hZ2Ugc2F2ZWQgKyBkcmF3IHJlY3RhbmdsZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3RXUGl4ID0gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXgoZm9jdXMucmVzb2x1dGlvbiwgdGhpcy5nZXRab29tRmFjdG9yKCkpXG4gICAgICAgICAgICAgICAgICAgIDogNFxuICAgICAgICAgICAgICAgIHRoaXMuY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHgubGluZVdpZHRoID0gcmVjdFdQaXhcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5iZWdpblBhdGgoKVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHgucmVjdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5nZW9Ub1BpeFgoZm9jdXMuY2VsbC54KSAtIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5nZW9Ub1BpeFkoZm9jdXMuY2VsbC55KSArIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICAgICAgZm9jdXMucmVzb2x1dGlvbiAvIHRoaXMuZ2V0Wm9vbUZhY3RvcigpICsgcmVjdFdQaXgsXG4gICAgICAgICAgICAgICAgICAgIC1mb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZXRab29tRmFjdG9yKCkgLSByZWN0V1BpeFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZSkgdGhpcy5jZy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lcnMgdG8gY29udGFpbmVyXG4gICAgICAgIHRoaXMubW91c2VPdmVySGFuZGxlciA9IChlKSA9PiBmb2N1c0NlbGwoZSlcbiAgICAgICAgdGhpcy5tb3VzZU1vdmVIYW5kbGVyID0gKGUpID0+IGZvY3VzQ2VsbChlKVxuICAgICAgICB0aGlzLm1vdXNlT3V0SGFuZGxlciA9IChlKSA9PiB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIGFkZCBleHRyYSBsb2dpYyB0byBvblpvb21TdGFydEZ1blxuICAgICAgICB0aGlzLmNnLm9uWm9vbVN0YXJ0RnVuID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRzLm9uWm9vbVN0YXJ0RnVuKSBvcHRzLm9uWm9vbVN0YXJ0RnVuKGUpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBtb3VzZSBvdmVyXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR8bnVsbH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gbnVsbFxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yIHx8ICdyZWQnXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4IHx8ICgoKSA9PiA0KSAvLyhyLHpmKSA9PiB7fVxuXG4gICAgICAgIC8vXG4gICAgICAgIC8vY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGUgPT4geyBjb25zb2xlLmxvZyhhcmd1bWVudHMpIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoJy4vRGF0YXNldCcpLkVudmVsb3BlfVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZy51cGRhdGVFeHRlbnRHZW8obWFyZ2luUHgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjZWxsIEhUTUwgaW5mbyBhdCBhIGdpdmVuIGdlbyBwb3NpdGlvbi5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVycywgc3RhcnRpbmcgZnJvbSB0b3BcbiAgICAgICAgY29uc3QgemYgPSB0aGlzLmdldFpvb21GYWN0b3IoKVxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7TGF5ZXJ9ICovXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzW2ldXG4gICAgICAgICAgICBpZiAoIWxheWVyLnZpc2libGUpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoIWxheWVyLmNlbGxJbmZvSFRNTCkgY29udGludWVcbiAgICAgICAgICAgIGlmIChsYXllci5jZWxsSW5mb0hUTUwgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXRDb21wb25lbnQoemYpXG4gICAgICAgICAgICBpZiAoIWRzYykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgY2VsbCBhdCBtb3VzZSBwb3NpdGlvblxuICAgICAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGx8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGRzYy5nZXRDZWxsRnJvbVBvc2l0aW9uKHBvc0dlbywgZHNjLmdldFZpZXdDYWNoZSgpKVxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICBjb25zdCBodG1sID0gbGF5ZXIuY2VsbEluZm9IVE1MKGNlbGwsIGRzYy5nZXRSZXNvbHV0aW9uKCkpXG4gICAgICAgICAgICBpZiAoIWh0bWwpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIHJldHVybiB7IGNlbGw6IGNlbGwsIGh0bWw6IGh0bWwsIHJlc29sdXRpb246IGRzYy5nZXRSZXNvbHV0aW9uKCkgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXG5cbiAgICAvKiogQHJldHVybnMge3t4Om51bWJlcix5Om51bWJlcn19ICovXG4gICAgZ2V0R2VvQ2VudGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZy5nZXRDZW50ZXIoKVxuICAgIH1cbiAgICAvKiogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0R2VvQ2VudGVyKHZhbCkge1xuICAgICAgICB0aGlzLmNnLnNldENlbnRlcih2YWwpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gICAgZ2V0Wm9vbUZhY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuZ2V0WmYoKVxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRab29tRmFjdG9yKHZhbCkge1xuICAgICAgICB0aGlzLmNnLnNldFpmKHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21GYWN0b3JFeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNnLmdldFpmRXh0ZW50KClcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRab29tRmFjdG9yRXh0ZW50KHZhbCkge1xuICAgICAgICB0aGlzLmNnLnNldFpmRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgICBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNnLmJhY2tncm91bmRDb2xvclxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRCYWNrZ3JvdW5kQ29sb3IodmFsKSB7XG4gICAgICAgIHRoaXMuY2cuYmFja2dyb3VuZENvbG9yID0gdmFsXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtMaW5lTGF5ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgZ2V0Qm91bmRhcnlMYXllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRhcnlMYXllclxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Qm91bmRhcnlMYXllcihvcHRzKSB7XG4gICAgICAgIHRoaXMuYm91bmRhcnlMYXllciA9IG5ldyBMaW5lTGF5ZXIob3B0cylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0xhYmVsTGF5ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgZ2V0TGFiZWxMYXllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxMYXllclxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0TGFiZWxMYXllcihvcHRzKSB7XG4gICAgICAgIHRoaXMubGFiZWxMYXllciA9IG5ldyBMYWJlbExheWVyKG9wdHMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHJlZHJhdygpIHtcbiAgICAgICAgdGhpcy5jZy5yZWRyYXcoKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxheWVyIHRvIHRoZSBhcHAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGFzZXR9IGRhdGFzZXQgVGhlIGRhdGFzZXQgb2YgdGhlIGxheWVyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL1N0eWxlJykuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcyBvZiB0aGUgbGF5ZXJcbiAgICAgKiBAcGFyYW0ge3t2aXNpYmxlPzpib29sZWFuLG1pblpvb20/Om51bWJlcixtYXhab29tPzpudW1iZXIscGl4TmI/Om51bWJlcixjZWxsSW5mb0hUTUw/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6c3RyaW5nfX0gb3B0cyBUaGUgbGF5ZXIgb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRMYXllckZyb21EYXRhc2V0KGRhdGFzZXQsIHN0eWxlcywgb3B0cykge1xuICAgICAgICBjb25zdCBsYXkgPSBuZXcgTGF5ZXIoZGF0YXNldCwgc3R5bGVzLCBvcHRzKVxuICAgICAgICB0aGlzLmxheWVycy5wdXNoKGxheSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvL2RhdGFzZXQgY3JlYXRpb25cblxuICAgIC8qKlxuICAgICAqIE1ha2UgYSBDU1YgZ3JpZCBkYXRhc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxuICAgICAqL1xuICAgIG1ha2VDU1ZHcmlkRGF0YXNldCh1cmwsIHJlc29sdXRpb24sIG9wdHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhc2V0KFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIG5ldyBDU1ZHcmlkKHVybCwgcmVzb2x1dGlvbiwgb3B0cykuZ2V0RGF0YSh1bmRlZmluZWQsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgb3B0c1xuICAgICAgICApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZSBhIHRpbGVkIGdyaWQgZGF0YXNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW59fSBvcHRzXG4gICAgICogQHJldHVybnMge0RhdGFzZXR9XG4gICAgICovXG4gICAgbWFrZVRpbGVkR3JpZERhdGFzZXQodXJsLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YXNldChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBuZXcgVGlsZWRHcmlkKHVybCwgdGhpcywgb3B0cykubG9hZEluZm8oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBvcHRzXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvL211bHRpIHNjYWxlIGRhdGFzZXQgY3JlYXRpb25cblxuICAgIC8qKlxuICAgICAqIE1ha2UgYSBtdWx0aSBzY2FsZSBDU1YgZ3JpZCBkYXRhc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnNcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSByZXNUb1VSTFxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7RGF0YXNldH1cbiAgICAgKi9cbiAgICBtYWtlTXVsdGlTY2FsZUNTVkdyaWREYXRhc2V0KHJlc29sdXRpb25zLCByZXNUb1VSTCwgb3B0cykge1xuICAgICAgICByZXR1cm4gRGF0YXNldC5tYWtlKFxuICAgICAgICAgICAgcmVzb2x1dGlvbnMsXG4gICAgICAgICAgICAocmVzKSA9PlxuICAgICAgICAgICAgICAgIG5ldyBDU1ZHcmlkKHJlc1RvVVJMKHJlcyksIHJlcywgb3B0cykuZ2V0RGF0YSh1bmRlZmluZWQsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgb3B0c1xuICAgICAgICApXG4gICAgfVxuXG4gICAgLy90aWxlZCBtdWx0aXNjYWxlXG5cbiAgICAvKipcbiAgICAgKiBNYWtlIGEgbXVsdGkgc2NhbGUgdGlsZWQgZ3JpZCBkYXRhc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnNcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSByZXNUb1VSTFxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7RGF0YXNldH1cbiAgICAgKi9cbiAgICBtYWtlTXVsdGlTY2FsZVRpbGVkR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiBEYXRhc2V0Lm1ha2UoXG4gICAgICAgICAgICByZXNvbHV0aW9ucyxcbiAgICAgICAgICAgIChyZXMpID0+XG4gICAgICAgICAgICAgICAgbmV3IFRpbGVkR3JpZChyZXNUb1VSTChyZXMpLCB0aGlzLCBvcHRzKS5sb2FkSW5mbygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2cucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG9wdHNcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8vIGRpcmVjdCBsYXllciBjcmVhdGlvblxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGF5ZXIgZnJvbSBhIENTViBncmlkIGRhdGFzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzLCBvcmRlcmVkIGluIGRyYXdpbmcgb3JkZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0IGFuZCBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRDU1ZHcmlkTGF5ZXIodXJsLCByZXNvbHV0aW9uLCBzdHlsZXMsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgZHMgPSB0aGlzLm1ha2VDU1ZHcmlkRGF0YXNldCh1cmwsIHJlc29sdXRpb24sIG9wdHMpXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlc1xuICAgICAqIEBwYXJhbSB7e3Zpc2libGU/OmJvb2xlYW4sbWluWm9vbT86bnVtYmVyLG1heFpvb20/Om51bWJlcixwaXhOYj86bnVtYmVyLGNlbGxJbmZvSFRNTD86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpzdHJpbmcsIHByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRUaWxlZEdyaWRMYXllcih1cmwsIHN0eWxlcywgb3B0cykge1xuICAgICAgICBjb25zdCBkcyA9IHRoaXMubWFrZVRpbGVkR3JpZERhdGFzZXQodXJsLCBvcHRzKVxuICAgICAgICByZXR1cm4gdGhpcy5hZGRMYXllckZyb21EYXRhc2V0KGRzLCBzdHlsZXMsIG9wdHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGF5ZXIgZnJvbSBhIENTViBncmlkIGRhdGFzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IHJlc1RvVVJMXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL1N0eWxlJykuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0cyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZGF0YXNldCBhbmQgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgYWRkTXVsdGlTY2FsZUNTVkdyaWRMYXllcihyZXNvbHV0aW9ucywgcmVzVG9VUkwsIHN0eWxlcywgb3B0cykge1xuICAgICAgICBjb25zdCBkcyA9IHRoaXMubWFrZU11bHRpU2NhbGVDU1ZHcmlkRGF0YXNldChyZXNvbHV0aW9ucywgcmVzVG9VUkwsIG9wdHMpXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IHJlc1RvVVJMXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL1N0eWxlJykuU3R5bGU+fSBzdHlsZXNcbiAgICAgKiBAcGFyYW0ge3t2aXNpYmxlPzpib29sZWFuLG1pblpvb20/Om51bWJlcixtYXhab29tPzpudW1iZXIscGl4TmI/Om51bWJlcixjZWxsSW5mb0hUTUw/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6c3RyaW5nLCBwcmVwcm9jZXNzPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW59fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgYWRkTXVsdGlTY2FsZVRpbGVkR3JpZExheWVyKHJlc29sdXRpb25zLCByZXNUb1VSTCwgc3R5bGVzLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlTXVsdGlTY2FsZVRpbGVkR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKVxuICAgICAgICByZXR1cm4gdGhpcy5hZGRMYXllckZyb21EYXRhc2V0KGRzLCBzdHlsZXMsIG9wdHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgYmFja2dyb3VuZCBsYXllciB0byB0aGUgYXBwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRCYWNrZ3JvdW5kTGF5ZXIob3B0cykge1xuICAgICAgICB0aGlzLmJnTGF5ZXJzLnB1c2gobmV3IEJhY2tncm91bmRMYXllcihvcHRzKSlcbiAgICAgICAgdGhpcy5yZWRyYXcoKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIFdNUyBiYWNrZ3JvdW5kIGxheWVyIHRvIHRoZSBhcHAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZEJhY2tncm91bmRMYXllcldNUyhvcHRzKSB7XG4gICAgICAgIHRoaXMuYmdMYXllcnMucHVzaChuZXcgQmFja2dyb3VuZExheWVyV01TKG9wdHMpKVxuICAgICAgICB0aGlzLnJlZHJhdygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZFpvb21TbGlkZXIoaWQsIG9wdHMpIHtcbiAgICAgICAgdGhpcy5jZy5hZGRab29tU2xpZGVyKGlkLCBvcHRzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRWaWV3RnJvbVVSTCgpIHtcbiAgICAgICAgdGhpcy5jZy5zZXRWaWV3RnJvbVVSTCgpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCBhIHJlc2l6ZSBldmVudCBvYnNlcnZlciB0byB0aGUgQXBwcyBjb250YWluZXIgYW5kIHVwZGF0ZSB0aGUgY2FudmFzIGFjY29yZGluZ2x5XG4gICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gY29udGFpbmVyIFRoZSBBcHAncyBjb250YWluZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyBUaGUgQXBwIGNhbnZhcyBlbGVtZW50XG4gICAgICogQG1lbWJlcm9mIEFwcFxuICAgICAqL1xuICAgIGRlZmluZVJlc2l6ZU9ic2VydmVyKGNvbnRhaW5lciwgY2FudmFzKSB7XG4gICAgICAgIC8vIGxpc3RlbiB0byByZXNpemUgZXZlbnRzXG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2FudmFzIGhhcyBiZWVuIGJ1aWx0XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLmNsaWVudFdpZHRoID4gMCAmJiBjb250YWluZXIuY2xpZW50SGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb250IGV4Y2VlZCBsb29wIGxpbWl0IGZpcnN0XG4gICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTM4NDEyMC9yZXNpemVvYnNlcnZlci1sb29wLWxpbWl0LWV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSB8fCAhZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXBwIGFuZCBjYW52YXMgc2l6ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oICE9PSBjb250YWluZXIuY2xpZW50SGVpZ2h0IHx8IHRoaXMudyAhPT0gY29udGFpbmVyLmNsaWVudFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmggPSBjb250YWluZXIuY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLncgPSBjb250YWluZXIuY2xpZW50V2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2cuaCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2cudyA9IGNvbnRhaW5lci5jbGllbnRXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVzdHJveSB0aGUgYXBwIGFuZCBpdCdzIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIFRoaXMgc2hvdWxkIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSBtZW1vcnkgdXNlZCB3aGVuIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGdyaWR2aXogYXBwIGluc3RhbmNlcyAoZm9yIGV4YW1wbGUgaW4gbGVhZmxldC1ncmlkdml6KVxuICAgICAqIEBtZW1iZXJvZiBBcHBcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICAvLyBjbGVhciBsYXllcnNcbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cblxuICAgICAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIHJlbW92ZSBjYW52YXNcbiAgICAgICAgdGhpcy5jZy5jYW52YXMucmVtb3ZlKClcblxuICAgICAgICAvLyByZW1vdmUgbGVnZW5kXG4gICAgICAgIHRoaXMubGVnZW5kPy5yZW1vdmUoKVxuXG4gICAgICAgIC8vIHJlbW92ZSB0b29sdGlwXG4gICAgICAgIHRoaXMudG9vbHRpcC50b29sdGlwPy5yZW1vdmUoKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKlxuICogQSBtYXAgYmFja2dyb3VuZCBsYXllciBpbiBcIlNsaXBweSBtYXBcIiBYWVogc3RhbmRhcmQuXG4gKiBTZWUgaHR0cHM6Ly93aWtpLm9wZW5zdHJlZXRtYXAub3JnL3dpa2kvU2xpcHB5X21hcF90aWxlbmFtZXNcbiAqIGh0dHBzOi8vd3d3Lm1hcHRpbGVyLmNvbS9nb29nbGUtbWFwcy1jb29yZGluYXRlcy10aWxlLWJvdW5kcy1wcm9qZWN0aW9uLyM2LzI3Ljg4LzQ0LjQ4XG4gKiBcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEFuIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGlmIGEgbGF5ZXIgc2hvdWxkIGJlIGRyYXduIG9yIG5vdFxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy52aXNpYmxlID0gb3B0cy52aXNpYmxlID09IGZhbHNlID8gZmFsc2UgOiB0cnVlXG5cbiAgICAgICAgLyoqIFRoZSBtaW5pbXVtIHpvb20gZmFjdG9yOiBCZWxvdyB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1pblpvb20gPSBvcHRzLm1pblpvb20gfHwgMFxuXG4gICAgICAgIC8qKiBUaGUgbWF4aW11bSB6b29tIGZhY3RvcjogQWJvdmUgdGhpcyBsZXZlbCwgdGhlIGxheWVyIGlzIG5vdCBzaG93bi5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XG5cbiAgICAgICAgLy9lbnN1cmUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoZSB6b29tIGxpbWl0cy5cbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgem9vbSBsaW1pdHMgZm9yIGxheWVyLiBab29tIG1pbiBzaG91bGQgYmUgc21hbGxlciB0aGFuIHpvb20gbWF4LicpXG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBjYWNoZSwgaW5kZXhlZCBieSB6L3kveCAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsRnVuID0gb3B0cy51cmxGdW4gfHwgKCh4LCB5LCB6KSA9PiB0aGlzLnVybCArIHogKyAnLycgKyB4ICsgJy8nICsgeSArICcucG5nJylcblxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gb3B0cy5yZXNvbHV0aW9uc1xuICAgICAgICBpZiAoIXRoaXMucmVzb2x1dGlvbnMgfHwgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVzb2x1dGlvbnMgcHJvdmlkZWQgZm9yIGJhY2tncm91bmQgbGF5ZXInKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm5iUGl4ID0gb3B0cy5uYlBpeCB8fCAyNTZcbiAgICAgICAgLyoqIENSUyBjb29yZGluYXRlcyBvZiB0b3AgbGVmdCBjb3JuZXJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLm9yaWdpbiA9IG9wdHMub3JpZ2luIHx8IFswLCAwXVxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy56MCA9IG9wdHMuejAgfHwgMFxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZmlsdGVyQ29sb3IgPSBvcHRzLmZpbHRlckNvbG9yIC8vICh6ZikgPT4gXCIjZWVlN1wiXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHoveC95IGNhY2hlIGRhdGEuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHJldHVybnMge0hUTUxJbWFnZUVsZW1lbnR8c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCh6LCB4LCB5KSB7XG4gICAgICAgIGxldCBkID0gdGhpcy5jYWNoZVt6XVxuICAgICAgICBpZiAoIWQpIHJldHVyblxuICAgICAgICBkID0gZFt4XVxuICAgICAgICBpZiAoIWQpIHJldHVyblxuICAgICAgICByZXR1cm4gZFt5XVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB6L3gveSBjYWNoZSBkYXRhLlxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd9IGltZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxuICAgICAqIEByZXR1cm5zXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwdXQoaW1nLCB6LCB4LCB5KSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XSkgdGhpcy5jYWNoZVt6XSA9IHt9XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XVt4XSkgdGhpcy5jYWNoZVt6XVt4XSA9IHt9XG4gICAgICAgIHRoaXMuY2FjaGVbel1beF1beV0gPSBpbWdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2cgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGNnKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyByZXNvbHV0aW9ucyBwcm92aWRlZCBmb3IgYmFja2dyb3VuZCBsYXllcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuICAgICAgICBjb25zdCB4MCA9IHRoaXMub3JpZ2luWzBdLFxuICAgICAgICAgICAgeTAgPSB0aGlzLm9yaWdpblsxXVxuXG4gICAgICAgIC8vZ2V0IHpvb20gbGV2ZWwgYW5kIHJlc29sdXRpb25cbiAgICAgICAgbGV0IHogPSAwXG4gICAgICAgIGZvciAoeiA9IDA7IHogPCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aDsgeisrKSBpZiAodGhpcy5yZXNvbHV0aW9uc1t6XSA8IHpmKSBicmVha1xuICAgICAgICB6IC09IDFcbiAgICAgICAgeiA9IE1hdGgubWF4KDAsIHopXG4gICAgICAgIHogPSBNYXRoLm1pbih6LCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCAtIDEpXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5yZXNvbHV0aW9ucy5sZW5ndGgsIHopXG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucmVzb2x1dGlvbnNbel1cblxuICAgICAgICB6ICs9IHRoaXMuejBcblxuICAgICAgICBjb25zdCBzaXplRyA9IHRoaXMubmJQaXggKiByZXNcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVHIC8gemZcblxuICAgICAgICAvL2dldCB0aWxlIG51bWJlcnNcbiAgICAgICAgY29uc3QgeEdlb1RvVE1TID0gKHgpID0+IE1hdGguY2VpbCgoeCAtIHgwKSAvIHNpemVHKVxuICAgICAgICBjb25zdCB5R2VvVG9UTVMgPSAoeSkgPT4gTWF0aC5jZWlsKC0oeSAtIHkwKSAvIHNpemVHKVxuICAgICAgICBjb25zdCB4TWluID0geEdlb1RvVE1TKGNnLmV4dEdlby54TWluKSAtIDFcbiAgICAgICAgY29uc3QgeE1heCA9IHhHZW9Ub1RNUyhjZy5leHRHZW8ueE1heClcbiAgICAgICAgY29uc3QgeU1heCA9IHlHZW9Ub1RNUyhjZy5leHRHZW8ueU1pbilcbiAgICAgICAgY29uc3QgeU1pbiA9IHlHZW9Ub1RNUyhjZy5leHRHZW8ueU1heCkgLSAxXG5cbiAgICAgICAgLy9UT0RPID9cbiAgICAgICAgLy9jZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vaGFuZGxlIGltYWdlc1xuICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IHlNaW47IHkgPCB5TWF4OyB5KyspIHtcbiAgICAgICAgICAgICAgICAvL2dldCBpbWFnZVxuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldCh6LCB4LCB5KVxuXG4gICAgICAgICAgICAgICAgLy9sb2FkIGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKCFpbWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXQoaW1nLCB6LCB4LCB5KVxuICAgICAgICAgICAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2cucmVkcmF3KClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1dCgnZmFpbGVkJywgeiwgeCwgeSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbWcuc3JjID0gdGhpcy51cmxGdW4oeCwgeSwgeilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2Nhc2Ugd2hlbiBubyBpbWFnZVxuICAgICAgICAgICAgICAgIGlmIChpbWcgPT09ICdmYWlsZWQnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGlmICghKGltZyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGltZylcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGltZy53aWR0aCA9PSAwIHx8IGltZy5oZWlnaHQgPT0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHhHZW8gPSB4MCArIHggKiBzaXplR1xuICAgICAgICAgICAgICAgIGNvbnN0IHlHZW8gPSB5MCAtIHkgKiBzaXplR1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5kcmF3SW1hZ2UoaW1nLCBjZy5nZW9Ub1BpeFgoeEdlbyksIGNnLmdlb1RvUGl4WSh5R2VvKSwgc2l6ZSwgc2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgLy9jZy5jdHguZHJhd0ltYWdlKGltZywgeEdlbywgeUdlbywgc2l6ZUcsIC1zaXplRylcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vYXBwbHkgZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckNvbG9yKSB7XG4gICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsdGVyQ29sb3IoemYpXG4gICAgICAgICAgICBpZiAoZmMgJiYgZmMgIT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGZjXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KDAsIDAsIGNnLncsIGNnLmgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICpcbiAqIEEgbWFwIFdNUyBiYWNrZ3JvdW5kIGxheWVyLlxuICogXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXJXTVMge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBbiBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBhIGxheWVyIHNob3VsZCBiZSBkcmF3biBvciBub3RcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IG9wdHMudmlzaWJsZSA9PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVxuXG4gICAgICAgIC8qKiBUaGUgbWluaW11bSB6b29tIGZhY3RvcjogQmVsb3cgdGhpcyBsZXZlbCwgdGhlIGxheWVyIGlzIG5vdCBzaG93bi5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5taW5ab29tID0gb3B0cy5taW5ab29tIHx8IDBcblxuICAgICAgICAvKiogVGhlIG1heGltdW0gem9vbSBmYWN0b3I6IEFib3ZlIHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubWF4Wm9vbSA9IG9wdHMubWF4Wm9vbSB8fCBJbmZpbml0eVxuXG4gICAgICAgIC8vZW5zdXJlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgem9vbSBsaW1pdHMuXG4gICAgICAgIGlmICh0aGlzLm1pblpvb20gPj0gdGhpcy5tYXhab29tKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHpvb20gbGltaXRzIGZvciBsYXllci4gWm9vbSBtaW4gc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiB6b29tIG1heC4nKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWx0ZXJDb2xvciA9IG9wdHMuZmlsdGVyQ29sb3IgLy8gKHpmKSA9PiBcIiNlZWU3XCJcblxuICAgICAgICAvKiogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueE1pbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnhNYXggPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWluID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueU1heCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogQ2hlY2sgaWYgdGhlIHZpZXcgaGFzIG1vdmVkIGFuZCBhIG5ldyBpbWFnZSBuZWVkcyB0byBiZSByZXRyaWV2ZWQuXG4gICAgICogQHByaXZhdGUgKi9cbiAgICBoYXNNb3ZlZChleHRHZW8pIHtcbiAgICAgICAgaWYgKChleHRHZW8ueE1pbikgIT0gdGhpcy54TWluKSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIGlmICgoZXh0R2VvLnhNYXgpICE9IHRoaXMueE1heCkgcmV0dXJuIHRydWVcbiAgICAgICAgZWxzZSBpZiAoKGV4dEdlby55TWluKSAhPSB0aGlzLnlNaW4pIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1heCkgIT0gdGhpcy55TWF4KSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIHJldHVybiBmYWxzZVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhjZykge1xuXG4gICAgICAgIC8vdXBkYXRlIG1hcCBleHRlbnRcbiAgICAgICAgY2cudXBkYXRlRXh0ZW50R2VvKDApXG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc01vdmVkKGNnLmV4dEdlbykgJiYgdGhpcy5pbWcpIHtcbiAgICAgICAgICAgIC8vdGhlIG1hcCBkaWQgbm90IG1vdmUgYW5kIHRoZSBpbWFnZSB3YXMgYWxyZWFkeSBkb3dubG9hZGVkOiBkcmF3IHRoZSBpbWFnZVxuICAgICAgICAgICAgY2cuY3R4LmRyYXdJbWFnZSh0aGlzLmltZywgMCwgMCwgY2cudywgY2cuaClcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy90aGUgbWFwIG1vdmVkOiByZXRyaWV2ZSBuZXcgaW1hZ2VcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMueE1pbiA9IGNnLmV4dEdlby54TWluXG4gICAgICAgICAgICB0aGlzLnhNYXggPSBjZy5leHRHZW8ueE1heFxuICAgICAgICAgICAgdGhpcy55TWluID0gY2cuZXh0R2VvLnlNaW5cbiAgICAgICAgICAgIHRoaXMueU1heCA9IGNnLmV4dEdlby55TWF4XG5cbiAgICAgICAgICAgIC8vYnVpbGQgV01TIFVSTFxuICAgICAgICAgICAgY29uc3QgdXJsID0gW11cbiAgICAgICAgICAgIHVybC5wdXNoKHRoaXMudXJsKVxuICAgICAgICAgICAgdXJsLnB1c2goXCImd2lkdGg9XCIpXG4gICAgICAgICAgICB1cmwucHVzaChjZy53KVxuICAgICAgICAgICAgdXJsLnB1c2goXCImaGVpZ2h0PVwiKVxuICAgICAgICAgICAgdXJsLnB1c2goY2cuaClcbiAgICAgICAgICAgIC8vYmJveDogeG1pbiB5bWluIHhtYXggeW1heFxuICAgICAgICAgICAgdXJsLnB1c2goXCImYmJveD1cIilcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLmV4dEdlby54TWluKVxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXG4gICAgICAgICAgICB1cmwucHVzaChjZy5leHRHZW8ueU1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKFwiLFwiKVxuICAgICAgICAgICAgdXJsLnB1c2goY2cuZXh0R2VvLnhNYXgpXG4gICAgICAgICAgICB1cmwucHVzaChcIixcIilcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLmV4dEdlby55TWF4KVxuXG4gICAgICAgICAgICBjb25zdCB1cmxTID0gdXJsLmpvaW4oXCJcIilcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codXJsUylcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmltZykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1nID0gbmV3IEltYWdlKClcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNnLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCByZXRyaWV2ZSBXTVMgYmFja2dyb3VuZCBpbWFnZSBmcm9tXCIsIHVybFMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3NldCBVUkwgdG8gbGF1bmNoIHRoZSBkb3dubG9hZFxuICAgICAgICAgICAgdGhpcy5pbWcuc3JjID0gdXJsU1xuICAgICAgICB9XG5cbiAgICAgICAgLy9hcHBseSBmaWx0ZXJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckNvbG9yKSB7XG4gICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsdGVyQ29sb3IoemYpXG4gICAgICAgICAgICBpZiAoZmMgJiYgZmMgIT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGZjXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KDAsIDAsIGNnLncsIGNnLmgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQSBncmlkIGNlbGwuXG4gKiBAdHlwZWRlZiB7e3g6IG51bWJlciwgeTogbnVtYmVyfX0gQ2VsbCAqL1xuLyoqXG4gKiBBbiBlbnZlbG9wZS5cbiAqIEB0eXBlZGVmIHsge3hNaW46IG51bWJlciwgeE1heDogbnVtYmVyLCB5TWluOiBudW1iZXIsIHlNYXg6IG51bWJlcn0gfSBFbnZlbG9wZSAqL1xuXG4vKipcbiAqIEEgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0IG9mIGdyaWQgY2VsbHMuXG4gKiBJdCBjb25zaXN0cyBvZiBkaWZmZXJlbnQge0BsaW5rIERhdGFzZXRDb21wb25lbnR9cyBmb3IgZWFjaCByZXNvbHV0aW9uLlxuICpcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldENvbXBvbmVudFwiKS5EYXRhc2V0Q29tcG9uZW50Pn0gZGF0YXNldENvbXBvbmVudHMgVGhlIGRhdGFzZXQgY29tcG9uZW50c1xuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldCBjb21wb25lbnRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXRcbiAgICAgKiBAcGFyYW0geyB7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oQ2VsbCk6Ym9vbGVhbn0gfSBvcHRzIE9wdGlvbnMuIHByZXByb2Nlc3M6IEEgZnVuY3Rpb24gdG8gYXBwbHkgb24gZWFjaCBkYXRhc2V0IGNlbGwgdG8gcHJlcGFyZSBpdHMgdmFsdWVzLiBDYW4gYmUgdXNlZCBhbHNvIHRvIHNlbGVjdCBjZWxscyB0byBrZWVwLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGFzZXRDb21wb25lbnRzLCByZXNvbHV0aW9ucywgb3B0cyA9IHt9KSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBkYXRhc2V0IGNvbXBvbmVudHMuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0Q29tcG9uZW50XCIpLkRhdGFzZXRDb21wb25lbnQ+fSAqL1xuICAgICAgICB0aGlzLmRhdGFzZXRDb21wb25lbnRzID0gZGF0YXNldENvbXBvbmVudHNcblxuICAgICAgICAvKiogVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0IGNvbXBvbmVudHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gcmVzb2x1dGlvbnNcblxuICAgICAgICAvL3RoZXJlIG11c3QgYmUgYXMgbWFueSBkYXRhc2V0IGNvbXBvbmVudHMgYXMgcmVzb2x1dGlvbnNcbiAgICAgICAgaWYgKHRoaXMuZGF0YXNldENvbXBvbmVudHMubGVuZ3RoID4gMSAmJiB0aGlzLmRhdGFzZXRDb21wb25lbnRzLmxlbmd0aCAhPSB0aGlzLnJlc29sdXRpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnVW5jb21wYXRpYmxlIG51bWJlciBvZiBkYXRhc2V0cyBhbmQgcmVzb2x1dGlvbnM6ICcgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzZXRDb21wb25lbnRzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoXG4gICAgICAgICAgICApXG5cbiAgICAgICAgLy9zZXQgZGF0YXNldCBwcmVwcm9jZXNzZXMgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChvcHRzLnByZXByb2Nlc3MpIHRoaXMuc2V0UHJlcG9jZXNzZXMob3B0cy5wcmVwcm9jZXNzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhIHByZXByb2Nlc3MgZnVuY3Rpb24gZm9yIGFsbCBkYXRhc2V0IGNvbXBvbmVudHMuXG4gICAgICogVGhpcyBpcyBhIGZ1bmN0aW9uIGFwcGxpZWQgb24gZWFjaCBjZWxsIGFmdGVyIGl0IGhhcyBiZWVuIGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oQ2VsbCk6Ym9vbGVhbn0gcHJlcHJvY2Vzc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIHNldFByZXBvY2Vzc2VzKHByZXByb2Nlc3MpIHtcbiAgICAgICAgZm9yIChsZXQgZHMgb2YgdGhpcy5kYXRhc2V0Q29tcG9uZW50cykgZHMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHRvIGVhc2UgdGhlIGNyZWF0aW9uIG9mIGRhdGFzZXRzIGZyb20gdGhlaXIgY29tcG9uZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldCBjb21wb25lbnRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXRcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6aW1wb3J0KFwiLi9EYXRhc2V0Q29tcG9uZW50XCIpLkRhdGFzZXRDb21wb25lbnR9IHJlc1RvRGF0YXNldENvbXBvbmVudCBGdW5jdGlvbiByZXR1cm5pbmcgYSBkYXRhc2V0IGNvbXBvbmVudCBmcm9tIGEgcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7IHtwcmVwcm9jZXNzPzpmdW5jdGlvbihDZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXNcbiAgICAgKiBAcmV0dXJucyB7RGF0YXNldH1cbiAgICAgKi9cbiAgICBzdGF0aWMgbWFrZShyZXNvbHV0aW9ucywgcmVzVG9EYXRhc2V0Q29tcG9uZW50LCBvcHRzKSB7XG4gICAgICAgIC8vbWFrZSBkYXRhc2V0IGNvbXBvbmVudHNcbiAgICAgICAgY29uc3QgZHNjID0gW11cbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzb2x1dGlvbnMpIGRzYy5wdXNoKHJlc1RvRGF0YXNldENvbXBvbmVudChyZXMpKVxuICAgICAgICAvL21ha2UgZGF0YXNldFxuICAgICAgICByZXR1cm4gbmV3IERhdGFzZXQoZHNjLCByZXNvbHV0aW9ucywgb3B0cylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvbmVudCwgb2YgZ3JpZCBjZWxscy5cbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFzZXRDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uLCBpbiB0aGUgQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufX0gb3B0c1xuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCwgcmVzb2x1dGlvbiwgb3B0cyA9IHt9KSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB1cmwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSB1cmxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBjZWxsIGFmdGVyIGxvYWRpbmcuIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSBvciBjb21wdXRlIGEgbmV3IGNvbHVtbi4gQW5kIGFsc28gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGxzIHRvIGtlZXAgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbiApfCB1bmRlZmluZWQgfSAqL1xuICAgICAgICB0aGlzLnByZXByb2Nlc3MgPSBvcHRzLnByZXByb2Nlc3MgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIFRoZSBjZWxscyB3aXRoaW4gdGhlIHZpZXdcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsPn0gKi9cbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGV4dEdlb1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGdldERhdGEoZXh0R2VvLCBjYWxsYmFjaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBnZXREYXRhIG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZXh0R2VvIFRoZSB2aWV3IGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIHVwZGF0ZVZpZXdDYWNoZSBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjZWxsIHVuZGVyIGEgZ2l2ZW4gcG9zaXRpb24sIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gcG9zR2VvXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxscyBTb21lIGNlbGxzIGZyb20gdGhlIGRhdGFzZXQgKGEgc3Vic2V0IGlmIG5lY2Vzc2FyeSwgdXN1YWxseSB0aGUgdmlldyBjYWNoZSkuXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXRDZWxsRnJvbVBvc2l0aW9uKHBvc0dlbywgY2VsbHMpIHtcbiAgICAgICAgLy9jb21wdXRlIGNhbmRpZGF0ZSBjZWxsIHBvc2l0aW9uXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICBjb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIGNvbnN0IGNlbGxYID0gciAqIE1hdGguZmxvb3IocG9zR2VvLnggLyByKVxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgY29uc3QgY2VsbFkgPSByICogTWF0aC5mbG9vcihwb3NHZW8ueSAvIHIpXG5cbiAgICAgICAgLy9nZXQgY2VsbFxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGlmIChjZWxsLnggIT0gY2VsbFgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoY2VsbC55ICE9IGNlbGxZKSBjb250aW51ZVxuICAgICAgICAgICAgcmV0dXJuIGNlbGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXG5cbiAgICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgICBnZXRSZXNvbHV0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uXG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGw+fSAqL1xuICAgIGdldFZpZXdDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNWaWV3Q2FjaGVcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKiBAdHlwZWRlZiB7IHt4TWluOiBudW1iZXIsIHhNYXg6IG51bWJlciwgeU1pbjogbnVtYmVyLCB5TWF4OiBudW1iZXJ9IH0gRW52ZWxvcGUgKi9cblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgem9vbSwgem9vbUlkZW50aXR5IH0gZnJvbSAnZDMtem9vbSdcblxuLyoqXG4gKiBBIEhUTUwgY2FudmFzIGZvciBnZW8gZGF0YSBkaXNwbGF5LCBlbmhhbmNlZCB3aXRoIHpvb20gYW5kIHBhbiBjYXBhYmlsaXRpZXMuXG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR2VvQ2FudmFzIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY2VudGVyIEdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpmIFRoZSB6b29tIGZhY3RvciAocGl4ZWwgc2l6ZSwgaW4gZ3JvdW5kIG0pXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYW52YXMsIGNlbnRlciwgemYsIG9wdHMpIHtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9ICovXG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudyA9IHRoaXMuY2FudmFzLm9mZnNldFdpZHRoXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmggPSB0aGlzLmNhbnZhcy5vZmZzZXRIZWlnaHRcblxuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMud1xuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhcblxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gICAgICAgIGlmICghY3R4KSB0aHJvdyAnSW1wb3NzaWJsZSB0byBjcmVhdGUgY2FudmFzIDJEIGNvbnRleHQnXG4gICAgICAgIC8qKkB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9ICovXG4gICAgICAgIHRoaXMuY3R4ID0gY3R4XG5cbiAgICAgICAgLy8gc2V0IGdlbyBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyXG4gICAgICAgIHRoaXMuY2VudGVyID0gY2VudGVyIHx8IHsgeDogdGhpcy53ICogMC41LCB5OiB0aGlzLmggKiAwLjUgfVxuXG4gICAgICAgIC8vIHpvb20gZmFjdG9yOiBwaXhlbCBzaXplLCBpbiBtL3BpeFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy56ZiA9IHpmXG5cbiAgICAgICAgLyoqIEJhY2tncm91bmQgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gb3B0cy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3doaXRlJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbVN0YXJ0RnVuID0gb3B0cy5vblpvb21TdGFydEZ1blxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbUVuZEZ1biA9IG9wdHMub25ab29tRW5kRnVuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbigpOnZvaWR9ICovXG4gICAgICAgIHRoaXMub25ab29tRnVuID0gb3B0cy5vblpvb21GdW5cblxuICAgICAgICAvL2N1cnJlbnQgZXh0ZW50XG4gICAgICAgIC8qKiBAdHlwZSB7RW52ZWxvcGV9ICovXG4gICAgICAgIHRoaXMuZXh0R2VvID0geyB4TWluOiBOYU4sIHhNYXg6IE5hTiwgeU1pbjogTmFOLCB5TWF4OiBOYU4gfVxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgLy9yZWx5IG9uIGQzIHpvb20gZm9yIHBhbi96b29tXG4gICAgICAgIGlmICghb3B0cy5kaXNhYmxlWm9vbSkge1xuICAgICAgICAgICAgbGV0IHRQID0gem9vbUlkZW50aXR5XG4gICAgICAgICAgICBjb25zdCB6ID0gem9vbSgpXG4gICAgICAgICAgICAgICAgLy90byBtYWtlIHRoZSB6b29taW5nIGEgYml0IGZhc3RlclxuICAgICAgICAgICAgICAgIC53aGVlbERlbHRhKChlKSA9PiAtZS5kZWx0YVkgKiAoZS5kZWx0YU1vZGUgPT09IDEgPyAwLjA3IDogZS5kZWx0YU1vZGUgPyAxIDogMC4wMDQpKVxuICAgICAgICAgICAgICAgIC5vbignem9vbScsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlLnRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmID0gdFAuayAvIHQua1xuICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHggPSB0UC54IC0gdC54XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeSA9IHRQLnkgLSB0LnlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFuKGR4ICogdGhpcy5nZXRaZigpLCAtZHkgKiB0aGlzLmdldFpmKCkpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZSA9IGUuc291cmNlRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZSBpbnN0YW5jZW9mIFdoZWVsRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3pvb20gYXQgdGhlIG1vdXNlIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpeFRvR2VvWChlLnNvdXJjZUV2ZW50Lm9mZnNldFgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpeFRvR2VvWShlLnNvdXJjZUV2ZW50Lm9mZnNldFkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZSBpbnN0YW5jZW9mIFRvdWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgdG91Y2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eCA9IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHR0IG9mIHNlLnRhcmdldFRvdWNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggKz0gdHQuY2xpZW50WFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSArPSB0dC5jbGllbnRZXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC89IHNlLnRhcmdldFRvdWNoZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLz0gc2UudGFyZ2V0VG91Y2hlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3pvb20gYXQgdGhpcyBhdmVyYWdlIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKGYsIHRoaXMucGl4VG9HZW9YKHR4KSwgdGhpcy5waXhUb0dlb1kodHkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRQID0gdFxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbUZ1bikgdGhpcy5vblpvb21GdW4oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UodGhpcy5jYW52YXMsIDAsIDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gMFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiA9IDFcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21TdGFydEZ1bikgdGhpcy5vblpvb21TdGFydEZ1bihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdyh0cnVlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSB7IGM6IG51bGwsIGR4OiAwLCBkeTogMCwgZjogMSB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tRW5kRnVuKSB0aGlzLm9uWm9vbUVuZEZ1bihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB6KHNlbGVjdCh0aGlzLmNhbnZhcykpXG4gICAgICAgIH1cbiAgICAgICAgLy9zZWxlY3QodGhpcy5jYW52YXMpLmNhbGwoeik7XG5cbiAgICAgICAgLyoqIFpvb20gZXh0ZW50LCB0byBsaW1pdCB6b29tIGluIGFuZCBvdXRcbiAgICAgICAgICogIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy56ZkV4dGVudCA9IFswLCBJbmZpbml0eV1cblxuICAgICAgICAvKiogQ2FudmFzIHN0YXRlLCB0byBiZSB1c2VkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlZHJhd3Mgb24gem9vbS9wYW5cbiAgICAgICAgICogIEB0eXBlIHt7YzpIVE1MQ2FudmFzRWxlbWVudHxudWxsLGR4Om51bWJlcixkeTpudW1iZXIsZjpudW1iZXJ9fSAqL1xuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSB7IGM6IG51bGwsIGR4OiAwLCBkeTogMCwgZjogMSB9XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gdiBHZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciAqL1xuICAgIHNldENlbnRlcih2KSB7XG4gICAgICAgIHRoaXMuY2VudGVyID0gdlxuICAgIH1cbiAgICAvKiogQHJldHVybnMge3t4Om51bWJlcix5Om51bWJlcn19IEdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyICovXG4gICAgZ2V0Q2VudGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXJcbiAgICB9XG5cbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IHYgVGhlIHpvb20gZmFjdG9yIChwaXhlbCBzaXplLCBpbiBncm91bmQgbSkgKi9cbiAgICBzZXRaZih2KSB7XG4gICAgICAgIHRoaXMuemYgPSB2XG4gICAgICAgIGlmICh0aGlzLnNsaWRlcikgdGhpcy5zbGlkZXIuYXR0cigndmFsdWUnLCArdGhpcy56ZilcbiAgICB9XG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB6b29tIGZhY3RvciAocGl4ZWwgc2l6ZSwgaW4gZ3JvdW5kIG0pICovXG4gICAgZ2V0WmYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpmXG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cbiAgICBzZXRaZkV4dGVudCh2KSB7XG4gICAgICAgIHRoaXMuemZFeHRlbnQgPSB2XG4gICAgfVxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgZ2V0WmZFeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpmRXh0ZW50XG4gICAgfVxuXG4gICAgLyoqIEluaXRpYWxpc2UgY2FudmFzIHRyYW5zZm9ybSB3aXRoIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLiAqL1xuICAgIGluaXRDYW52YXNUcmFuc2Zvcm0oKSB7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIH1cblxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBnZW8gdG8gc2NyZWVuIHRyYW5zZm9ybWF0aW9uLCBzbyB0aGF0IGdlbyBvYmplY3RzIGNhbiBiZSBkcmF3biBkaXJlY3RseSBpbiBnZW8gY29vcmRpbmF0ZXMuICovXG4gICAgc2V0Q2FudmFzVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBrID0gMSAvIHRoaXMuZ2V0WmYoKVxuICAgICAgICBjb25zdCB0eCA9IC10aGlzLmNlbnRlci54IC8gdGhpcy5nZXRaZigpICsgdGhpcy53ICogMC41XG4gICAgICAgIGNvbnN0IHR5ID0gdGhpcy5jZW50ZXIueSAvIHRoaXMuZ2V0WmYoKSArIHRoaXMuaCAqIDAuNVxuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oaywgMCwgMCwgLWssIHR4LCB0eSlcbiAgICB9XG5cbiAgICAvKiogR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gd2ViR0wgc2NyZWVuIGNvb3JkaW5hdGVzLCB3aXRoaW4gWy0xLDFdKlstMSwxXSAqL1xuICAgIGdldFdlYkdMVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBreCA9IDIuMCAvICh0aGlzLncgKiB0aGlzLmdldFpmKCkpXG4gICAgICAgIGNvbnN0IGt5ID0gMi4wIC8gKHRoaXMuaCAqIHRoaXMuZ2V0WmYoKSlcbiAgICAgICAgcmV0dXJuIFtreCwgMC4wLCAwLjAsIDAuMCwga3ksIDAuMCwgLWt4ICogdGhpcy5jZW50ZXIueCwgLWt5ICogdGhpcy5jZW50ZXIueSwgMS4wXVxuICAgIH1cblxuICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyBob3cgdG8gZHJhdyB0aGUgbWFwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3Ryb25nICovXG4gICAgcmVkcmF3KHN0cm9uZyA9IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgcmVkcmF3IG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyLiBUbyBiZSB1c2VkIGJlZm9yZSBhIHJlZHJhdyBmb3IgZXhhbXBsZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3JcbiAgICAgKi9cbiAgICBjbGVhcihjb2xvciA9ICd3aGl0ZScpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eCkgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3JcbiAgICAgICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR4R2VvXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR5R2VvXG4gICAgICovXG4gICAgcGFuKGR4R2VvID0gMCwgZHlHZW8gPSAwKSB7XG4gICAgICAgIC8vVE9ETyBmb3JjZSBleHRlbmQgdG8gcmVtYWluXG4gICAgICAgIHRoaXMuY2VudGVyLnggKz0gZHhHZW9cbiAgICAgICAgdGhpcy5jZW50ZXIueSArPSBkeUdlb1xuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHggLT0gZHhHZW8gLyB0aGlzLmdldFpmKClcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSArPSBkeUdlbyAvIHRoaXMuZ2V0WmYoKVxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgICAgIC8vIHRoaXMgZG9lc250IHdvcmsgb24gbW9iaWxlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2lzc3Vlcy85OFxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZS5jLCB0aGlzLmNhbnZhc1NhdmUuZHgsIHRoaXMuY2FudmFzU2F2ZS5keSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb20uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGYgVGhlIHpvb20gZmFjdG9yLCB3aXRoaW4gXTAsIEluZmluaXR5XS4gMSBpcyBmb3Igbm8gY2hhbmdlLiA8MSB0byB6b29tLWluLCA+MSB0byB6b29tLW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBUaGUgeCBnZW8gcG9zaXRpb24gZml4ZWQgaW4gdGhlIHNjcmVlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geUdlbyBUaGUgeSBnZW8gcG9zaXRpb24gZml4ZWQgaW4gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICB6b29tKGYgPSAxLCB4R2VvID0gdGhpcy5jZW50ZXIueCwgeUdlbyA9IHRoaXMuY2VudGVyLnkpIHtcbiAgICAgICAgLy9UT0RPIGZvcmNlIGdlbyBleHRlbmQgdG8gcmVtYWluXG5cbiAgICAgICAgLy90cnlpbmcgdG8gem9vbSBpbi9vdXQgYmV5b25kIGxpbWl0XG4gICAgICAgIGlmICh0aGlzLnpmRXh0ZW50WzBdID09IHRoaXMuZ2V0WmYoKSAmJiBmIDw9IDEpIHJldHVyblxuICAgICAgICBpZiAodGhpcy56ZkV4dGVudFsxXSA9PSB0aGlzLmdldFpmKCkgJiYgZiA+PSAxKSByZXR1cm5cblxuICAgICAgICAvL2Vuc3VyZSB6b29tIGV4dGVudCBwcmVzZXJ2ZWRcbiAgICAgICAgY29uc3QgbmV3WmYgPSBmICogdGhpcy5nZXRaZigpXG4gICAgICAgIGlmIChuZXdaZiA8IHRoaXMuemZFeHRlbnRbMF0pIGYgPSB0aGlzLnpmRXh0ZW50WzBdIC8gdGhpcy5nZXRaZigpXG4gICAgICAgIGlmIChuZXdaZiA+IHRoaXMuemZFeHRlbnRbMV0pIGYgPSB0aGlzLnpmRXh0ZW50WzFdIC8gdGhpcy5nZXRaZigpXG5cbiAgICAgICAgdGhpcy5zZXRaZihmICogdGhpcy5nZXRaZigpKVxuICAgICAgICBjb25zdCBkeEdlbyA9ICh4R2VvIC0gdGhpcy5jZW50ZXIueCkgKiAoMSAtIGYpXG4gICAgICAgIHRoaXMuY2VudGVyLnggKz0gZHhHZW9cbiAgICAgICAgY29uc3QgZHlHZW8gPSAoeUdlbyAtIHRoaXMuY2VudGVyLnkpICogKDEgLSBmKVxuICAgICAgICB0aGlzLmNlbnRlci55ICs9IGR5R2VvXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvL1RPRE9cbiAgICAgICAgLy90aGlzLnJlZHJhdyhmYWxzZSlcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgLz0gZlxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4ID0gdGhpcy5nZW9Ub1BpeFgoeEdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gdGhpcy5nZW9Ub1BpeFkoeUdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYyxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHgsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5LFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mICogdGhpcy5jYW52YXNTYXZlLmMud2lkdGgsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy5oZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxuICAgICAqIEByZXR1cm5zIHtFbnZlbG9wZX0gVGhlIGVudmVsb3BlIG9mIHRoZSB2aWV3LCBpbiBnZW8gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgdXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4ID0gMjApIHtcbiAgICAgICAgdGhpcy5leHRHZW8gPSB7XG4gICAgICAgICAgICB4TWluOiB0aGlzLnBpeFRvR2VvWCgtbWFyZ2luUHgpLFxuICAgICAgICAgICAgeE1heDogdGhpcy5waXhUb0dlb1godGhpcy53ICsgbWFyZ2luUHgpLFxuICAgICAgICAgICAgeU1pbjogdGhpcy5waXhUb0dlb1kodGhpcy5oICsgbWFyZ2luUHgpLFxuICAgICAgICAgICAgeU1heDogdGhpcy5waXhUb0dlb1koLW1hcmdpblB4KSxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5leHRHZW9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgb2JqZWN0IGhhcyB0byBiZSBkcmF3blxuICAgICAqXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBvYmpcbiAgICAgKi9cbiAgICB0b0RyYXcob2JqKSB7XG4gICAgICAgIGlmIChvYmoueCA8IHRoaXMuZXh0R2VvLnhNaW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAob2JqLnggPiB0aGlzLmV4dEdlby54TWF4KSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG9iai55IDwgdGhpcy5leHRHZW8ueU1pbikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChvYmoueSA+IHRoaXMuZXh0R2VvLnlNYXgpIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vY29udmVyc2lvbiBmdW5jdGlvbnNcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKi9cbiAgICBnZW9Ub1BpeFgoeEdlbykge1xuICAgICAgICByZXR1cm4gKHhHZW8gLSB0aGlzLmNlbnRlci54KSAvIHRoaXMuZ2V0WmYoKSArIHRoaXMudyAqIDAuNVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geUdlbyBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKi9cbiAgICBnZW9Ub1BpeFkoeUdlbykge1xuICAgICAgICByZXR1cm4gLSh5R2VvIC0gdGhpcy5jZW50ZXIueSkgLyB0aGlzLmdldFpmKCkgKyB0aGlzLmggKiAwLjVcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggU2NyZWVuIHggY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB4IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICovXG4gICAgcGl4VG9HZW9YKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC0gdGhpcy53ICogMC41KSAqIHRoaXMuZ2V0WmYoKSArIHRoaXMuY2VudGVyLnhcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgU2NyZWVuIHkgY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB5IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICovXG4gICAgcGl4VG9HZW9ZKHkpIHtcbiAgICAgICAgcmV0dXJuIC0oeSAtIHRoaXMuaCAqIDAuNSkgKiB0aGlzLmdldFpmKCkgKyB0aGlzLmNlbnRlci55XG4gICAgfVxuXG4gICAgLyoqIEdldCB4LHkseiBlbGVtZW50cyBmcm9tIFVSTCBhbmQgYXNzaWduIHRoZW0gdG8gdGhlIHZpZXcgY2VudGVyIGFuZCB6b29tIGxldmVsLiAqL1xuICAgIHNldFZpZXdGcm9tVVJMKCkge1xuICAgICAgICBjb25zdCB4ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneCcpLFxuICAgICAgICAgICAgeSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3knKSxcbiAgICAgICAgICAgIHogPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd6JylcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuZ2V0Q2VudGVyKClcbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3gpKSBjLnggPSAreFxuICAgICAgICBpZiAoeSAhPSBudWxsICYmIHkgIT0gdW5kZWZpbmVkICYmICFpc05hTigreSkpIGMueSA9ICt5XG4gICAgICAgIGlmICh6ICE9IG51bGwgJiYgeiAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt6KSkgdGhpcy5zZXRaZigreilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgYWRkWm9vbVNsaWRlcihpZCwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuICAgICAgICBvcHRzLndpZHRoID0gb3B0cy53aWR0aCB8fCAnMzBweCdcbiAgICAgICAgb3B0cy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAnMzAwcHgnXG5cbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcbiAgICAgICAgY29uc3QgZGl2ID0gc2VsZWN0KCcjJyArIGlkKVxuICAgICAgICBpZiAoZGl2LmVtcHR5KCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGRpdiBlbGVtZW50IHRvIGJ1aWxkIHpvb20gc2xpZGVyLiBJZDogJyArIGlkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRoID0gdGhpc1xuICAgICAgICAvKiogKi9cbiAgICAgICAgdGhpcy5zbGlkZXIgPSBkaXZcbiAgICAgICAgICAgIC5hcHBlbmQoJ2lucHV0JylcbiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3JhbmdlJylcbiAgICAgICAgICAgIC5hdHRyKCdtaW4nLCB0aGlzLmdldFpmRXh0ZW50KClbMF0pXG4gICAgICAgICAgICAuYXR0cignbWF4JywgdGhpcy5nZXRaZkV4dGVudCgpWzFdKVxuICAgICAgICAgICAgLmF0dHIoJ3ZhbHVlJywgdGhpcy5nZXRaZigpKVxuICAgICAgICAgICAgLm9uKCdpbnB1dCcsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLnZhbHVlKSByZXR1cm5cbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gK3RoaXMudmFsdWVcbiAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cigndmFsdWUnLCB2KVxuICAgICAgICAgICAgICAgIHRoLnNldFpmKHYpXG4gICAgICAgICAgICAgICAgLy9yZWRyYXdcbiAgICAgICAgICAgICAgICB0aC5yZWRyYXcoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdHlsZSgnd2lkdGgnLCBvcHRzLndpZHRoKVxuICAgICAgICAgICAgLnN0eWxlKCdoZWlnaHQnLCBvcHRzLmhlaWdodClcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuNylcbiAgICAgICAgICAgIC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5zdHlsZSgnb3BhY2l0eScsIDAuNylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3R5bGUoJy13ZWJraXQtYXBwZWFyYW5jZScsICdzbGlkZXItdmVydGljYWwnKSAvL2ZvciBjaHJvbWVcbiAgICAgICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ2J0LWxyJykgLy9mb3IgSUUvZWRnZVxuICAgICAgICAgICAgLmF0dHIoJ29yaWVudCcsICd2ZXJ0aWNhbCcpIC8vZm9yIGZpcmVmb3hcbiAgICAgICAgICAgIC5zdHlsZSgnYmFja2dyb3VuZCcsICdsaWdodGdyYXknKVxuICAgICAgICAgICAgLnN0eWxlKCdvdXRsaW5lJywgJ25vbmUnKVxuICAgICAgICAgICAgLnN0eWxlKCctd2Via2l0LXRyYW5zaXRpb24nLCAnLjJzJylcbiAgICAgICAgICAgIC5zdHlsZSgndHJhbnNpdGlvbicsICdvcGFjaXR5IC4ycycpXG5cbiAgICAgICAgLy9UT0RPXG4gICAgICAgIC8qc2VsZWN0KFwiLnNsaWRlcjo6LXdlYmtpdC1zbGlkZXItdGh1bWJcIilcbiAgICAgICAgICAgIC5zdHlsZShcIi13ZWJraXQtYXBwZWFyYW5jZVwiLCBcIm5vbmVcIilcbiAgICAgICAgICAgIC5zdHlsZShcImFwcGVhcmFuY2VcIiwgXCJub25lXCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJ3aWR0aFwiLCBcIjMwcHhcIilcbiAgICAgICAgICAgIC5zdHlsZShcImhlaWdodFwiLCBcIjQwcHhcIilcbiAgICAgICAgICAgIC5zdHlsZShcImJhY2tncm91bmRcIiwgXCJibGFja1wiKVxuICAgICAgICAgICAgLnN0eWxlKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKSovXG5cbiAgICAgICAgLypzZWxlY3QoXCJzbGlkZXI6Oi1tb3otcmFuZ2UtdGh1bWJcIilcbiAgICAgICAgICAgIC5zdHlsZShcIi13ZWJraXQtYXBwZWFyYW5jZVwiLCBcIm5vbmVcIilcbiAgICAgICAgICAgIC5zdHlsZShcIndpZHRoXCIsIFwiMzBweFwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiaGVpZ2h0XCIsIFwiNDBweFwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiYmFja2dyb3VuZFwiLCBcIiMwNEFBNkRcIilcbiAgICAgICAgICAgIC5zdHlsZShcImN1cnNvclwiLCBcInBvaW50ZXJcIikqL1xuICAgICAgICAvKlxuICAgICAgICAgICAgLnNsaWRlcjo6bXMtdGh1bWIsXG4gICAgICAgIC5zbGlkZXI6Oi1tb3otcmFuZ2UtdGh1bWIge1xuICAgICAgICB9Ki9cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIFVSTCBwYXJhbWV0ZXIgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAgICovXG4gICAgc3RhdGljIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLywgJ1xcXFxbJykucmVwbGFjZSgvW1xcXV0vLCAnXFxcXF0nKVxuICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCdbXFxcXD8mXScgKyBuYW1lICsgJz0oW14mI10qKScpLFxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMobG9jYXRpb24uc2VhcmNoKVxuICAgICAgICByZXR1cm4gIXJlc3VsdHMgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMV0ucmVwbGFjZSgvXFwrL2csICcgJykpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBjc3YgfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqIEEgbGFiZWwuIFRoZSBuYW1lIGlzIHRoZSB0ZXh0IHRvIHNob3cuICh4LHkpIGFyZSB0aGUgY29vcmRpbmF0ZXMgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLlxuICogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHg6bnVtYmVyLCB5Om51bWJlciB9fSBMYWJlbCAqL1xuXG4vKipcbiAqIEEgKGdlbmVyaWMpIGxheWVyIGZvciBwbGFjZW5hbWUgbGFiZWxzLCB0byBiZSBzaG93biBvbiB0b3Agb2YgdGhlIGdyaWQgbGF5ZXJzLlxuICogVGhlIGlucHV0IGlzIGEgQ1NWIGZpbGUgd2l0aCB0aGUgcG9zaXRpb24gKHgsIHkpIG9mIHRoZSBsYWJlbHMgYW5kIG5hbWUgKyBzb21lIG90aGVyIGluZm8gb24gdGhlIGxhYmVsIGltcG9ydGFuY2UuXG4gKiBJZiB0aGUgbGFiZWwgZGF0YSBpcyBub3QgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdCBvciBpbiB0aGUgc2FtZSBDUlMgYXMgdGhlIGdyaWQsIGl0IGNhbiBiZSBjb3JyZWN0ZWQgd2l0aCB0aGUgXCJwcmVwcm9jZXNzXCIgZnVuY3Rpb24uXG4gKiBUaGUgc2VsZWN0aW9uIG9mIHRoZSBsYWJlbCwgdGhlaXIgc3R5bGUgKGZvbnQsIHdlaWdodCwgZXRjLikgYW5kIGNvbG9yIGNhbiBiZSBzcGVjaWZpZWQgZGVwZW5kaW5nIG9uIHRoZWlyIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIExhYmVsTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBsYWJlbCBkYXRhLCBhcyBDU1YgZmlsZS5cbiAgICAgICAgICogVGhlIGZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIGxhYmVsIHN1Y2ggYXMgdGhlIHRleHQsIHRoZSBwb3NpdGlvbiBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBkaXNwbGF5IG9mIHRoZSBsYWJlbCBhY2NvcmRpbmcgdG8gdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIElmIG5lY2Vzc2FyeSwgdGhpcyBkYXRhIGNhbiBiZSByZWZvcm1hdGVkIHdpdGggdGhlICdwcmVwcm9jZXNzJyBwYXJhbWV0ZXIuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogU3BlY2lmeSBpZiBhbmQgaG93IGEgbGFiZWwgc2hvdWxkIGJlIGRyYXduLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3R5bGUgPSBvcHRzLnN0eWxlIHx8ICgoKSA9PiAnYm9sZCAxZW0gQXJpYWwnKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAob3B0cy5kYXJrID8gKCkgPT4gJyNkZGQnIDogKCkgPT4gJyMyMjInKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaGFsb0NvbG9yID0gb3B0cy5oYWxvQ29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICcjMDAwMDAwQkInIDogKCkgPT4gJyNGRkZGRkZCQicpXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGhhbG8gd2lkdGgsIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oYWxvV2lkdGggPSBvcHRzLmhhbG9XaWR0aCB8fCAoKCkgPT4gNClcblxuICAgICAgICAvKiogVGhlIGFuY2hvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0LCBmcm9tIGxhYmVsIHBvc2l0aW9uLiBTZWUgSFRNTC1jYW52YXMgdGV4dEFsaWduIHByb3BlcnR5LlxuICAgICAgICAgKiBcImxlZnRcIiB8fCBcInJpZ2h0XCIgfHwgXCJjZW50ZXJcIiB8fCBcInN0YXJ0XCIgfHwgXCJlbmRcIlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7Q2FudmFzVGV4dEFsaWdufSAqL1xuICAgICAgICB0aGlzLnRleHRBbGlnbiA9IG9wdHMudGV4dEFsaWduIHx8ICdzdGFydCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLm9mZnNldFBpeCA9IG9wdHMub2Zmc2V0UGl4IHx8IFs1LCA1XVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggbGFiZWwgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlLCBmb3JtYXQgdGhlIGxhYmVsIGRhdGEsIHByb2plY3QgY29vcmRpbmF0ZXMsIGV0Yy5cbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGFiZWw+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxhYmVscyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgdGhlIGxhYmVsIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhjZykge1xuICAgICAgICAvL2xvYWQgbGFiZWxzLCBpZiBub3QgZG9uZSB5ZXQuXG4gICAgICAgIGlmICghdGhpcy5sYWJlbHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZChjZy5yZWRyYXcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgLy90ZXh0IGFsaWduXG4gICAgICAgIGNnLmN0eC50ZXh0QWxpZ24gPSB0aGlzLnRleHRBbGlnbiB8fCAnc3RhcnQnXG5cbiAgICAgICAgLy9saW5lIGpvaW4gYW5kIGNhcFxuICAgICAgICBjZy5jdHgubGluZUpvaW4gPSAnYmV2ZWwnIC8vfHwgXCJyb3VuZFwiIHx8IFwibWl0ZXJcIjtcbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSAnYnV0dCcgLy98fCBcInJvdW5kXCIgfHwgXCJzcXVhcmVcIjtcblxuICAgICAgICAvL2RyYXcgaW4gcGl4IGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vZHJhdyBsYWJlbHMsIG9uZSBieSBvbmVcbiAgICAgICAgZm9yIChjb25zdCBsYiBvZiB0aGlzLmxhYmVscykge1xuICAgICAgICAgICAgLy9nZXQgbGFiZWwgc3R5bGVcbiAgICAgICAgICAgIGNvbnN0IHN0ID0gdGhpcy5zdHlsZShsYiwgemYpXG4gICAgICAgICAgICBpZiAoIXN0KSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LmZvbnQgPSBzdFxuXG4gICAgICAgICAgICAvL2NoZWNrIGxhYmVsIHdpdGhpbiB0aGUgdmlldywgdG8gYmUgZHJhd25cbiAgICAgICAgICAgIGlmICghY2cudG9EcmF3KGxiKSkgY29udGludWVcblxuICAgICAgICAgICAgLy9wb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgeFAgPSBjZy5nZW9Ub1BpeFgobGIueCkgKyB0aGlzLm9mZnNldFBpeFswXVxuICAgICAgICAgICAgY29uc3QgeVAgPSBjZy5nZW9Ub1BpeFkobGIueSkgLSB0aGlzLm9mZnNldFBpeFsxXVxuXG4gICAgICAgICAgICAvL2xhYmVsIHN0cm9rZSwgZm9yIHRoZSBoYWxvXG4gICAgICAgICAgICBpZiAodGhpcy5oYWxvQ29sb3IgJiYgdGhpcy5oYWxvV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYyA9IHRoaXMuaGFsb0NvbG9yKGxiLCB6ZilcbiAgICAgICAgICAgICAgICBjb25zdCBodyA9IHRoaXMuaGFsb1dpZHRoKGxiLCB6ZilcbiAgICAgICAgICAgICAgICBpZiAoaGMgJiYgaHcgJiYgaHcgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGhjXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSBod1xuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlVGV4dChsYi5uYW1lLCB4UCwgeVApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2xhYmVsIGZpbGxcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihsYiwgemYpXG4gICAgICAgICAgICAgICAgaWYgKGNvbCkge1xuICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsVGV4dChsYi5uYW1lLCB4UCwgeVApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkYXRhIGZvciBsYWJlbHMsIGZyb20gVVJMIHRoaXMudXJsXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm5cblxuICAgICAgICAvL2xvYWQgZGF0YVxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPExhYmVsPiB9ICovXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxuXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2goYylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vc3RvcmUgbGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBkYXRhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG5cbiAgICAgICAgICAgIC8vcmVkcmF3XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHMgZnJvbSAnICsgdGhpcy51cmwpXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEEgbGF5ZXIsIHdoaWNoIHNwZWNpZmllcyBhIGRhdGFzZXQgdG8gYmUgc2hvd24gd2l0aCBzcGVjaWZpZWQgc3R5bGVzLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSBkYXRhc2V0IFRoZSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgdG8gc2hvdy5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuL1N0eWxlXCIpLlN0eWxlPn0gc3R5bGVzIFRoZSBzdHlsZXMsIG9yZGVyZWQgaW4gZHJhd2luZyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge3t2aXNpYmxlPzpib29sZWFuLGFscGhhPzpudW1iZXIsYmxlbmRPcGVyYXRpb24/Okdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyLHBpeE5iPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfX0gb3B0c1xuICAgICAqICAgICAgbWluWm9vbTogVGhlIG1pbmltdW0gem9vbSBsZXZlbCB3aGVuIHRvIHNob3cgdGhlIGxheWVyLiBtYXhab29tOiBUaGUgbWF4aW11bSB6b29tIGxldmVsIHdoZW4gdG8gc2hvdyB0aGUgbGF5ZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhc2V0LCBzdHlsZXMsIG9wdHMgPSB7fSkge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9ICovXG4gICAgICAgIHRoaXMuZGF0YXNldCA9IGRhdGFzZXRcbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9TdHlsZVwiKS5TdHlsZT59ICovXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzXG5cbiAgICAgICAgLyoqIEFuIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGlmIGEgbGF5ZXIgc2hvdWxkIGJlIGRyYXduIG9yIG5vdFxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy52aXNpYmxlID0gb3B0cy52aXNpYmxlID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYWxwaGEgKHRyYW5zcGFyZW5jeS9vcGFjaXR5KSwgYmV0d2VlbiAwLjAgKGZ1bGx5IHRyYW5zcGFyZW50KSBhbmQgMS4wIChmdWxseSBvcGFxdWUpLlxuICAgICAgICAgKiAgVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBmYWN0b3IuXG4gICAgICAgICAqIChzZWUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiBnbG9iYWxBbHBoYSBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5hbHBoYSA9IG9wdHMuYWxwaGFcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGJsZW5kIG9wZXJhdGlvbi4gVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBmYWN0b3IuXG4gICAgICAgICAqIChzZWUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiBnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gcHJvcGVydHkpXG4gICAgICAgICAqIEB0eXBlIHtHbG9iYWxDb21wb3NpdGVPcGVyYXRpb259ICovXG4gICAgICAgIHRoaXMuYmxlbmRPcGVyYXRpb24gPSBvcHRzLmJsZW5kT3BlcmF0aW9uIHx8ICh6ZiA9PiAnbm9ybWFsJylcblxuICAgICAgICAvKiogVGhlIG1pbmltdW0gem9vbSBmYWN0b3I6IEJlbG93IHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubWluWm9vbSA9IG9wdHMubWluWm9vbSB8fCAwXG5cbiAgICAgICAgLyoqIFRoZSBtYXhpbXVtIHpvb20gZmFjdG9yOiBBYm92ZSB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1heFpvb20gPSBvcHRzLm1heFpvb20gfHwgSW5maW5pdHlcblxuICAgICAgICAvL2Vuc3VyZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3IgdGhlIHpvb20gbGltaXRzLlxuICAgICAgICBpZiAodGhpcy5taW5ab29tID49IHRoaXMubWF4Wm9vbSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcblxuICAgICAgICAvKiogVW5pdDogbnVtYmVyIG9mIHBpeGVsc1xuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnBpeE5iID0gb3B0cy5waXhOYiB8fCAzXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmdW5jdGlvbiByZXR1cm5pbmcgY2VsbCBpbmZvcm1hdGlvbiBhcyBIVE1MLlxuICAgICAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciB0b29sdGlwIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwsIG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNlbGxJbmZvSFRNTCA9IG9wdHMuY2VsbEluZm9IVE1MIHx8IExheWVyLmRlZmF1bHRDZWxsSW5mb0hUTUxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJlbGV2YW50IGRhdGFzZXQgY29tcG9uZW50IGZvciBhIHNwZWNpZmllZCB6b29tIGZhY3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6ZlxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL0RhdGFzZXRDb21wb25lbnRcIikuRGF0YXNldENvbXBvbmVudHx1bmRlZmluZWR9XG4gICAgICogKi9cbiAgICBnZXREYXRhc2V0Q29tcG9uZW50KHpmKSB7XG4gICAgICAgIGlmICh6ZiA8IHRoaXMubWluWm9vbSB8fCB6ZiA+IHRoaXMubWF4Wm9vbSkgcmV0dXJuXG5cbiAgICAgICAgLy9zcGVjaWFsIGNhc2Ugd2hpdGggc2luZ2xlIGNvbXBvbmVudCBkYXRhc2V0XG4gICAgICAgIGlmICh0aGlzLmRhdGFzZXQuZGF0YXNldENvbXBvbmVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLmRhdGFzZXQuZGF0YXNldENvbXBvbmVudHNbMF1cblxuICAgICAgICBjb25zdCBycyA9IHRoaXMuZGF0YXNldC5yZXNvbHV0aW9uc1xuICAgICAgICBsZXQgaSA9IDBcbiAgICAgICAgbGV0IHogPSByc1tpXSAvIHRoaXMucGl4TmJcbiAgICAgICAgd2hpbGUgKHogPCB6ZiAmJiBpIDwgcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpKytcbiAgICAgICAgICAgIHogPSByc1tpXSAvIHRoaXMucGl4TmJcbiAgICAgICAgfVxuICAgICAgICAvL2lmIChpID09IDApIHJldHVybiB0aGlzLmRhdGFzZXQuZGF0YXNldENvbXBvbmVudHNbMF07XG4gICAgICAgIC8vcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50c1tpIC0gMV07XG4gICAgICAgIGlmIChpID09IHJzLmxlbmd0aCkgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50c1tycy5sZW5ndGggLSAxXVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzW2ldXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciB0b29sdGlwIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbH0gY2VsbFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHRDZWxsSW5mb0hUTUwoY2VsbCkge1xuICAgICAgICBjb25zdCBidWYgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjZWxsKSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3gnKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knKSBjb250aW51ZVxuICAgICAgICAgICAgYnVmLnB1c2goJzxiPicsIGtleSwgJzwvYj4nLCAnIDogJywgY2VsbFtrZXldLCAnPGJyPicpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGNvbnRhaW5lci5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWdlbmQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmlkID0gb3B0cy5pZFxuXG4gICAgICAgIC8vVE9ETyBzdG9wIHVzaW5nIGl0LiBVc2Ugc3R5bGUgbWV0aG9kIGJlbG93IGluc3RlYWQuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMudG9wID0gb3B0cy50b3BcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYm90dG9tID0gb3B0cy5ib3R0b21cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMubGVmdCA9IG9wdHMubGVmdFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5yaWdodCA9IG9wdHMucmlnaHRcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IG9wdHMuYmFja2dyb3VuZCB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMucGFkZGluZyA9IG9wdHMucGFkZGluZyB8fCAnNXB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5ib3JkZXIgPSBvcHRzLmJvcmRlciB8fCAnMHB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICdub25lJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICdub25lJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpc1snZm9udC1mYW1pbHknXSA9IG9wdHNbJ2ZvbnQtZmFtaWx5J10gfHwgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aFxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodFxuXG4gICAgICAgIC8vdGhlIGRpdiBlbGVtZW50XG4gICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdiA9IHNlbGVjdCgnIycgKyB0aGlzLmlkKVxuXG4gICAgICAgIGlmICghdGhpcy5kaXYgfHwgdGhpcy5kaXYuZW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXYgPSBzZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG4gICAgICAgICAgICBpZiAodGhpcy5pZCkgdGhpcy5kaXYuYXR0cignaWQnLCB0aGlzLmlkKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9zZXQgc3R5bGVcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JhY2tncm91bmQnLCB0aGlzLmJhY2tncm91bmQpXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdwYWRkaW5nJywgdGhpcy5wYWRkaW5nKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYm9yZGVyJywgdGhpcy5ib3JkZXIpXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXItcmFkaXVzJywgdGhpc1snYm9yZGVyLXJhZGl1cyddKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYm94LXNoYWRvdycsIHRoaXNbJ2JveC1zaGFkb3cnXSlcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgdGhpc1snZm9udC1mYW1pbHknXSlcblxuICAgICAgICBpZiAodGhpcy53aWR0aCkgdGhpcy5kaXYuc3R5bGUoJ3dpZHRoJywgdGhpcy53aWR0aClcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0KSB0aGlzLmRpdi5zdHlsZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBzdHlsZSB0byB0aGUgbGVnZW5kIGRpdi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2XG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTGVnZW5kIHVwZGF0ZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBqc29uIH0gZnJvbSAnZDMtZmV0Y2gnXG5cbi8qKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGluZUxheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggZmVhdHVyZSBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoZiwgemYpID0+ICdncmF5JylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoZiwgemYpID0+IDIpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6QXJyYXkuPG51bWJlcj58dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxpbmVEYXNoID0gb3B0cy5saW5lRGFzaCB8fCAoKGYsIHpmKSA9PiB1bmRlZmluZWQpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48b2JqZWN0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5mcyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgdGhlIGxheWVyLlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoY2cpIHtcbiAgICAgICAgLy9sb2FkIGRhdGEsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmZzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWQoY2cucmVkcmF3KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gc29ydCBsaW5lcyBieSB3aWR0aCA/XG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHRoaXMuZnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gZi5nZW9tZXRyeS5jb29yZGluYXRlc1xuICAgICAgICAgICAgaWYgKGNzLmxlbmd0aCA8IDIpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGYsIHpmKVxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL3NldCBsaW5ld2lkdGhcbiAgICAgICAgICAgIGNvbnN0IHdQID0gdGhpcy53aWR0aChmLCB6ZilcbiAgICAgICAgICAgIGlmICghd1AgfHwgd1AgPCAwKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdQICogemZcblxuICAgICAgICAgICAgLy9zZXQgbGluZSBkYXNoXG4gICAgICAgICAgICBjb25zdCBsZFAgPSB0aGlzLmxpbmVEYXNoKGYsIHpmKVxuICAgICAgICAgICAgaWYgKGxkUCkgY2cuY3R4LnNldExpbmVEYXNoKGxkUClcblxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjc1swXVswXSwgY3NbMF1bMV0pXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNzLmxlbmd0aDsgaSsrKSBjZy5jdHgubGluZVRvKGNzW2ldWzBdLCBjc1tpXVsxXSlcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8uLi5cbiAgICAgICAgY2cuY3R4LnNldExpbmVEYXNoKFtdKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGF0YSBmb3IgbGFiZWxzLCBmcm9tIFVSTCB0aGlzLnVybFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhXyA9IGF3YWl0IGpzb24odGhpcy51cmwpXG5cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxvYmplY3Q+IH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhXy5mZWF0dXJlc1xuXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcyA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBkYXRhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG5cbiAgICAgICAgICAgIC8vcmVkcmF3XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBib3VuZGFyaWVzIGZyb20gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5mcyA9IFtdXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFN0YXRpc3RpY3Mgb2YgYSBzZXQgb2YgdmFsdWVzXG4gKiBAdHlwZWRlZiB7e21pbjpudW1iZXIsbWF4Om51bWJlcn19IFN0YXQgKi9cblxuLyoqIEB0eXBlZGVmIHtcInNxdWFyZVwifFwiY2lyY2xlXCJ8XCJkaWFtb25kXCJ8XCJkb251dFwifFwibm9uZVwifSBTaGFwZSAqL1xuXG4vKipcbiAqIEEgc3R5bGUsIHRvIHNob3cgYSBncmlkIGRhdGFzZXQuXG4gKlxuICogQGFic3RyYWN0XG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3R5bGUge1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7e2ZpbHRlcj86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFuLG9mZnNldD86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfSx2aXNpYmxlPzpib29sZWFuLGFscGhhPzpmdW5jdGlvbihudW1iZXIpOm51bWJlcixibGVuZE9wZXJhdGlvbj86ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sbWluWm9vbT86bnVtYmVyLG1heFpvb20/Om51bWJlcn19IG9wdHNcbiAgICAgKiAgICAgIG1pblpvb206IFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgd2hlbiB0byBzaG93IHRoZSBsYXllci4gbWF4Wm9vbTogVGhlIG1heGltdW0gem9vbSBsZXZlbCB3aGVuIHRvIHNob3cgdGhlIGxheWVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZpbHRlciBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgY2VsbCBsaXN0LCB0byBmaWx0ZXIgb3V0IHNvbWUgY2VsbHMgbm90IHRvIGJlIGRyYXduIChzdWNoIGFzIGZvciBleGFtcGxlIHRoZSBjZWxscyB3aXRoIHZhbHVlPTApLlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW59ICovXG4gICAgICAgIHRoaXMuZmlsdGVyID0gb3B0cy5maWx0ZXIgfHwgKCgpID0+IHRydWUpXG5cbiAgICAgICAgLyoqIEFuIG9mZnNldC4gVGhpcyBpcyB0byBhbHRlciB0aGUgcG9zaXRpb24gb2YgYWxsIHN5bWJvbHMgaW4gYSBnaXZlbiBkaXJlY3Rpb24uIEluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9wdHMub2Zmc2V0IHx8ICgoYywgciwgemYpID0+ICh7IGR4OiAwLCBkeTogMCB9KSlcblxuICAgICAgICAvKiogQW4gYXR0cmlidXRlIHRvIHNwZWNpZnkgaWYgYSBzdHlsZSBzaG91bGQgYmUgZHJhd24gb3Igbm90XG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGUgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBhbHBoYSAodHJhbnNwYXJlbmN5L29wYWNpdHkpLCBiZXR3ZWVuIDAuMCAoZnVsbHkgdHJhbnNwYXJlbnQpIGFuZCAxLjAgKGZ1bGx5IG9wYXF1ZSkuXG4gICAgICAgICAqICBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGZhY3Rvci5cbiAgICAgICAgICogKHNlZSBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6IGdsb2JhbEFscGhhIHByb3BlcnR5KVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmFscGhhID0gb3B0cy5hbHBoYVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYmxlbmQgb3BlcmF0aW9uLiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGZhY3Rvci5cbiAgICAgICAgICogKHNlZSBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6IGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcik6R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9ufSAqL1xuICAgICAgICB0aGlzLmJsZW5kT3BlcmF0aW9uID0gb3B0cy5ibGVuZE9wZXJhdGlvbiB8fCAoemYgPT4gJ25vcm1hbCcpXG5cbiAgICAgICAgLyoqIFRoZSBtaW5pbXVtIHpvb20gZmFjdG9yOiBCZWxvdyB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiAqL1xuICAgICAgICB0aGlzLm1pblpvb20gPSBvcHRzLm1pblpvb20gfHwgMFxuXG4gICAgICAgIC8qKiBUaGUgbWF4aW11bSB6b29tIGZhY3RvcjogQWJvdmUgdGhpcyBsZXZlbCwgdGhlIGxheWVyIGlzIG5vdCBzaG93bi5cbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICogKi9cbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XG5cbiAgICAgICAgLy9lbnN1cmUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoZSB6b29tIGxpbWl0cy5cbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgem9vbSBsaW1pdHMgZm9yIGxheWVyLiBab29tIG1pbiBzaG91bGQgYmUgc21hbGxlciB0aGFuIHpvb20gbWF4LicpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwdWJsaWNcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xlZ2VuZFwiKS5MZWdlbmQ+fSAqL1xuICAgICAgICB0aGlzLmxlZ2VuZHMgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGVpciByZXNvbHV0aW9uIChpbiBnZW9ncmFwaGljIHVuaXQpXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGVtLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHJlc29sdXRpb24sIGNnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXG5cbiAgICAvKiogQHJldHVybnMge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCxudW1iZXIsbnVtYmVyKTp7ZHg6bnVtYmVyLGR5Om51bWJlcn19ICovXG4gICAgZ2V0T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXRcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldE9mZnNldCh2YWwpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSB2YWxcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogSGlkZSBhbGwgbGVnZW5kIGVsZW1lbnRzIG9mIHRoZSBzdHlsZSwgaWYgYW55XG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc30gKi9cbiAgICB1cGRhdGVMZWdlbmRzKG9wdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBsZyBvZiB0aGlzLmxlZ2VuZHMpIGxnLnVwZGF0ZShvcHRzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgc29tZSBzdGF0aXN0aWNzIG9uIGEgdmFsdWUgb2Ygc29tZSBjZWxscy5cbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZGVmaW5lIGhvdyB0byBkcmF3IHNwZWNpZmljYWxseSB0aGUgY2VsbHMgd2l0aGluIHRoZSB2aWV3LlxuICAgICAqIFRPRE86IGNvbXB1dGUgbWVkaWFuID9cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOm51bWJlcn0gdmFsRnVuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVaZXJvc1xuICAgICAqIEByZXR1cm5zIHtTdGF0IHwgdW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRTdGF0aXN0aWNzKGNlbGxzLCB2YWxGdW4sIGlnbm9yZVplcm9zKSB7XG4gICAgICAgIGlmICghY2VsbHMgfHwgY2VsbHMubGVuZ3RoID09IDApIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgbGV0IG1pbiA9IEluZmluaXR5XG4gICAgICAgIGxldCBtYXggPSAtSW5maW5pdHlcbiAgICAgICAgLy9sZXQgc3VtID0gMFxuICAgICAgICAvL2xldCBuYiA9IDBcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gK3ZhbEZ1bihjZWxsKVxuICAgICAgICAgICAgaWYgKGlnbm9yZVplcm9zICYmICF2KSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHZcbiAgICAgICAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2XG4gICAgICAgICAgICAvL3N1bSArPSB2XG4gICAgICAgICAgICAvL25iKytcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtaW46IG1pbiwgbWF4OiBtYXggfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuLy9pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcblxuLyoqXG4gKiBBIGdlbmVyaWMgY2xhc3MgdG8gbWFrZSBhIHRvb2x0aXAuXG4gKiBJdCBpcyBhIGRpdiBlbGVtZW50LCB3aGljaCBjYW4gYmUgbW92ZWQgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXIgYW5kIGZpbGxlZCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gaW4gaHRtbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRvb2x0aXAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmRpdiA9IG9wdHMuZGl2IHx8ICd0b29sdGlwX2V1cm9zdGF0J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5tYXhXaWR0aCA9IG9wdHMubWF4V2lkdGggfHwgJzIwZW0nXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMS4yZW0nXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ3doaXRlJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5wYWRkaW5nID0gb3B0cy5wYWRkaW5nIHx8ICc1cHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJvcmRlciA9IG9wdHMuYm9yZGVyIHx8ICcwcHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydib3JkZXItcmFkaXVzJ10gPSBvcHRzWydib3JkZXItcmFkaXVzJ10gfHwgJzVweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXNbJ2JveC1zaGFkb3cnXSA9IG9wdHNbJ2JveC1zaGFkb3cnXSB8fCAnNXB4IDVweCA1cHggZ3JleSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbiA9IG9wdHMudHJhbnNpdGlvbkR1cmF0aW9uIHx8IDEwMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy54T2Zmc2V0ID0gb3B0cy54T2Zmc2V0IHx8IDMwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnlPZmZzZXQgPSBvcHRzLnlPZmZzZXQgfHwgMjBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIC8vIGUuZy4gdG8gcHJldmVudCBtb3VzZSBjdXJzb3IgY292ZXJpbmcgY2VsbCBiZWluZyBoaWdobGlnaHRlZFxuICAgICAgICB0aGlzLnlNb3VzZU9mZnNldCA9IG9wdHMueU1vdXNlT2Zmc2V0IHx8IDBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueE1vdXNlT2Zmc2V0ID0gb3B0cy54TW91c2VPZmZzZXQgfHwgMFxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqL1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBvcHRzLnBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCJkMy1zZWxlY3Rpb25cIikuU2VsZWN0aW9ufSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoJyMnICsgdGhpcy5kaXYpXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXAuZW1wdHkoKSlcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IHNlbGVjdChcbiAgICAgICAgICAgICAgICAnIycgKyB0aGlzLnBhcmVudEVsZW1lbnQuaWQgJiYgdGhpcy5wYXJlbnRFbGVtZW50LmlkICE9ICcnXG4gICAgICAgICAgICAgICAgICAgID8gJyMnICsgdGhpcy5wYXJlbnRFbGVtZW50LmlkXG4gICAgICAgICAgICAgICAgICAgIDogJ2JvZHknXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCB0aGlzLmRpdilcblxuICAgICAgICAvL2luaXRpYWxpc2VcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdtYXgtd2lkdGgnLCB0aGlzLm1heFdpZHRoKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ292ZXJmbG93JywgJ2hpZGRlbicpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5mb250U2l6ZSlcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdiYWNrZ3JvdW5kJywgdGhpcy5iYWNrZ3JvdW5kKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm9yZGVyJywgdGhpcy5ib3JkZXIpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm9yZGVyLXJhZGl1cycsIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSlcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgdGhpc1snZm9udC1mYW1pbHknXSlcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnb3BhY2l0eScsICcwJylcblxuICAgICAgICAvLyBhcmlhLWxhYmVscyAodGhhbmtzIHRvIHdhaGxhdGxhcylcbiAgICAgICAgdGhpcy50b29sdGlwLmF0dHIoJ3JvbGUnLCAndG9vbHRpcCcpLmF0dHIoJ2FyaWEtbGl2ZScsICdwb2xpdGUnKVxuICAgIH1cblxuICAgIC8qKiBTaG93IHRoZSB0b29sdGlwICovXG4gICAgc2hvdygpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnRvb2x0aXAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgfVxuXG4gICAgLyoqIEhpZGUgdGhlIHRvb2x0aXAgKi9cbiAgICBoaWRlKCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHRvb2x0aXAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAgICAgKi9cbiAgICBodG1sKGh0bWwpIHtcbiAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoaHRtbClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sdGlwIGF0IHRoZSBtb3VzZSBldmVudCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgc2V0UG9zaXRpb24oZXZlbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudFJlY3QgPSB0aGlzLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcblxuICAgICAgICB0aGlzLnRvb2x0aXBcbiAgICAgICAgICAgIC5zdHlsZSgnbGVmdCcsIGV2ZW50LnBhZ2VYIC0gcGFyZW50UmVjdC5sZWZ0ICsgdGhpcy54T2Zmc2V0ICsgJ3B4JylcbiAgICAgICAgICAgIC5zdHlsZSgndG9wJywgZXZlbnQucGFnZVkgLSBwYXJlbnRSZWN0LnRvcCAtIHRoaXMueU9mZnNldCArICdweCcpXG5cbiAgICAgICAgdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKGV2ZW50LCBwYXJlbnRSZWN0KVxuICAgIH1cblxuICAgIC8qXG5cdG15Lm1vdXNlb3ZlciA9IGZ1bmN0aW9uIChldmVudCwgaHRtbCkge1xuXHRcdGlmIChodG1sKSBteS5odG1sKGh0bWwpO1xuXHRcdG15LnNldFBvc2l0aW9uKGV2ZW50KTtcblx0XHRteS5zaG93KClcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xuXHR9O1xuXHRcblx0bXkubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XG5cdH07XG5cdFxuXHRteS5tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRteS5oaWRlKCk7XG5cdH07Ki9cblxuICAgIHN0eWxlKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMudG9vbHRpcC5zdHlsZShrKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhdHRyKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMudG9vbHRpcC5hdHRyKGspXG4gICAgICAgIHRoaXMudG9vbHRpcC5hdHRyKGssIHYpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmVudHMgdGhlIHRvb2x0aXAgZnJvbSBvdmVyZmxvd2luZyBvdXQgb2YgdGhlIEFwcCBjb250YWluZXIgKGVuc3VyZXMgdGhhdCB0aGUgdG9vbHRpcCBpcyBpbnNpZGUgdGhlIGdyaWR2aXogY29udGFpbmVyKVxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAgICAgKiBAcGFyYW0ge0RPTVJlY3R9IHBhcmVudFJlY3RcbiAgICAgKi9cbiAgICBlbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyID0gZnVuY3Rpb24gKGV2ZW50LCBwYXJlbnRSZWN0KSB7XG4gICAgICAgIGxldCB0dE5vZGUgPSB0aGlzLnRvb2x0aXAubm9kZSgpXG5cbiAgICAgICAgLy90b28gZmFyIHJpZ2h0XG4gICAgICAgIGxldCBtYXhSaWdodCA9IHBhcmVudFJlY3Qud2lkdGhcbiAgICAgICAgbGV0IHR0UmlnaHQgPSB0dE5vZGUub2Zmc2V0TGVmdCArIHR0Tm9kZS5jbGllbnRXaWR0aFxuICAgICAgICBpZiAodHRSaWdodCA+IG1heFJpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gcGFyZW50UmVjdC5sZWZ0IC0gdHROb2RlLmNsaWVudFdpZHRoIC0gdGhpcy54T2Zmc2V0XG4gICAgICAgICAgICB0dE5vZGUuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBtb3VzZSBjb3ZlcnMgdG9vbHRpcFxuICAgICAgICAgICAgaWYgKHR0Tm9kZS5vZmZzZXRMZWZ0ICsgdHROb2RlLmNsaWVudFdpZHRoICsgcGFyZW50UmVjdC5sZWZ0ID4gZXZlbnQucGFnZVgpIHtcbiAgICAgICAgICAgICAgICAvL21vdmUgdG9vbHRpcCBsZWZ0IHNvIGl0IGRvZXNudCBjb3ZlciBtb3VzZVxuICAgICAgICAgICAgICAgIGxldCBsZWZ0MiA9IGV2ZW50LnBhZ2VYIC0gKHR0Tm9kZS5jbGllbnRXaWR0aCArIHRoaXMueE9mZnNldCArIHBhcmVudFJlY3QubGVmdClcbiAgICAgICAgICAgICAgICB0dE5vZGUuc3R5bGUubGVmdCA9IGxlZnQyICsgJ3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy90b28gZmFyIGRvd25cbiAgICAgICAgaWYgKHR0Tm9kZS5vZmZzZXRUb3AgKyB0dE5vZGUuY2xpZW50SGVpZ2h0ID4gcGFyZW50UmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgIHR0Tm9kZS5zdHlsZS50b3AgPSB0dE5vZGUub2Zmc2V0VG9wIC0gdHROb2RlLmNsaWVudEhlaWdodCArICdweCdcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqIEB0eXBlZGVmIHt7IGRpbXM6IG9iamVjdCwgY3JzOiBzdHJpbmcsIHRpbGVTaXplQ2VsbDogbnVtYmVyLCBvcmlnaW5Qb2ludDoge3g6bnVtYmVyLHk6bnVtYmVyfSwgcmVzb2x1dGlvbkdlbzogbnVtYmVyLCB0aWxpbmdCb3VuZHM6aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG5pbXBvcnQgeyBjc3YgfSBmcm9tICdkMy1mZXRjaCdcbmltcG9ydCB7IERhdGFzZXRDb21wb25lbnQgfSBmcm9tICcuLi9EYXRhc2V0Q29tcG9uZW50LmpzJ1xuXG4vKipcbiAqIEEgZGF0YXNldCBjb21wb3NlZCBvZiBhIHNpbmdsZSBDU1YgZmlsZSAobm90IHRpbGVkKS5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDU1ZHcmlkIGV4dGVuZHMgRGF0YXNldENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbil9fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIodXJsLCByZXNvbHV0aW9uLCBvcHRzKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59ICovXG4gICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cbiAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV8dW5kZWZpbmVkfSBlXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IHJlZHJhd1xuICAgICAqL1xuICAgIGdldERhdGEoZSwgcmVkcmF3KSB7XG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5pbmZvTG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuIHRoaXNcblxuICAgICAgICAvL2xvYWQgZGF0YVxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXG4gICAgICAgIDsoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxuXG4gICAgICAgICAgICAgICAgLy9jb252ZXJ0IGNvb3JkaW5hdGVzIGluIG51bWJlcnNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjLnggPSArYy54XG4gICAgICAgICAgICAgICAgICAgIGMueSA9ICtjLnlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gW11cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxscy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gZGF0YVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyBjaGVjayBpZiByZWRyYXcgaXMgbmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgLy90aGF0IGlzIGlmIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcblxuICAgICAgICAgICAgICAgIC8vZXhlY3V0ZSB0aGUgY2FsbGJhY2ssIHVzdWFsbHkgYSBkcmF3IGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHJlZHJhdykgcmVkcmF3KClcblxuICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvL21hcmsgYXMgZmFpbGVkXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgdGhpcy5jZWxscyA9IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL2RhdGEgbm90IGxvYWRlZCB5ZXRcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cblxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcbiAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBBIGdyaWQgdGlsZS5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmlkVGlsZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHMgVGhlIHRpbGUgY2VsbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhUIFRoZSBYIHBvc2l0aW9uIG9mIHRoZSB0aWxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5VCBUaGUgWSBwb3NpdGlvbiBvZiB0aGUgdGlsZS5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vQ1NWR3JpZFwiKS5HcmlkSW5mb30gZ3JpZEluZm8gVGhlIGdyaWQgaW5mbyBvYmplY3QuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2VsbHMsIHhULCB5VCwgZ3JpZEluZm8pIHtcbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gKi9cbiAgICAgICAgdGhpcy5jZWxscyA9IGNlbGxzXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnggPSB4VFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy55ID0geVRcblxuICAgICAgICBjb25zdCByID0gZ3JpZEluZm8ucmVzb2x1dGlvbkdlb1xuICAgICAgICBjb25zdCBzID0gZ3JpZEluZm8udGlsZVNpemVDZWxsXG5cbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfSAqL1xuICAgICAgICB0aGlzLmV4dEdlbyA9IHtcbiAgICAgICAgICAgIHhNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnggKyByICogcyAqIHRoaXMueCxcbiAgICAgICAgICAgIHhNYXg6IGdyaWRJbmZvLm9yaWdpblBvaW50LnggKyByICogcyAqICh0aGlzLnggKyAxKSxcbiAgICAgICAgICAgIHlNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqIHRoaXMueSxcbiAgICAgICAgICAgIHlNYXg6IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqICh0aGlzLnkgKyAxKSxcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29udmVydCBjZWxsIGNvb3JkaW5hdGVzIGludG8gZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICAgICAgY2VsbC54ID0gdGhpcy5leHRHZW8ueE1pbiArIGNlbGwueCAqIHJcbiAgICAgICAgICAgIGNlbGwueSA9IHRoaXMuZXh0R2VvLnlNaW4gKyBjZWxsLnkgKiByXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKiBAdHlwZWRlZiB7eyBkaW1zOiBvYmplY3QsIGNyczogc3RyaW5nLCB0aWxlU2l6ZUNlbGw6IG51bWJlciwgb3JpZ2luUG9pbnQ6IHt4Om51bWJlcix5Om51bWJlcn0sIHJlc29sdXRpb25HZW86IG51bWJlciwgdGlsaW5nQm91bmRzOmltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGUsIGZvcm1hdDppbXBvcnQoXCIuLi9EYXRhc2V0Q29tcG9uZW50XCIpLkZvcm1hdCB9fSBHcmlkSW5mbyAqL1xuXG4vLyBpbnRlcm5hbFxuaW1wb3J0IHsgR3JpZFRpbGUgfSBmcm9tICcuL0dyaWRUaWxlLmpzJ1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi4vQXBwLmpzJ1xuaW1wb3J0IHsgRGF0YXNldENvbXBvbmVudCB9IGZyb20gJy4uL0RhdGFzZXRDb21wb25lbnQuanMnXG5pbXBvcnQgeyBtb25pdG9yLCBtb25pdG9yRHVyYXRpb24gfSBmcm9tICcuLi91dGlscy9VdGlscy5qcydcblxuLy8gZXh0ZXJuYWxcbmltcG9ydCB7IGpzb24sIGNzdiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKipcbiAqIEEgdGlsZWQgZGF0YXNldCwgY29tcG9zZWQgb2YgQ1NWIHRpbGVzLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbGVkR3JpZCBleHRlbmRzIERhdGFzZXRDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cbiAgICAgKiBAcGFyYW0ge0FwcH0gYXBwIFRoZSBhcHBsaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzooZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFuKSB9fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCBhcHAsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcih1cmwsIDAsIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhcHAgYmVpbmcgdXNlZC5cbiAgICAgICAgICogQHR5cGUge0FwcH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXBwID0gYXBwXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBncmlkIGluZm8gb2JqZWN0LCBmcm9tIHRoZSBpbmZvLmpzb24gZmlsZS5cbiAgICAgICAgICogIEB0eXBlIHtHcmlkSW5mbyB8IHVuZGVmaW5lZH1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogICovXG4gICAgICAgIHRoaXMuaW5mbyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cbiAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjYWNoZSBvZiB0aGUgbG9hZGVkIHRpbGVzLiBJdCBpcyBkb3VibGUgaW5kZXhlZDogYnkgeFQgYW5kIHRoZW4geVQuXG4gICAgICAgICAqIEV4YW1wbGU6IHRoaXMuY2FjaGVbeFRdW3lUXSByZXR1cm5zIHRoZSB0aWxlIGF0IFt4VF1beVRdIGxvY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge31cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIGluZm8uanNvbiBmcm9tIHRoZSB1cmwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcbiAgICAgKiBAcmV0dXJucyB0aGlzXG4gICAgICovXG4gICAgbG9hZEluZm8oY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZm8gJiYgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ25vdExvYWRlZCcpIHtcbiAgICAgICAgICAgIDsgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQganNvbih0aGlzLnVybCArICdpbmZvLmpzb24nKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm8gPSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IGRhdGEucmVzb2x1dGlvbkdlb1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpXG4gICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2sgJiYgKHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdsb2FkZWQnIHx8IHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdmYWlsZWQnKSlcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIGEgdGlsaW5nIGVudmVsb3BlIGZyb20gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRvIGtub3cgd2hpY2ggdGlsZXMgdG8gZG93bmxvYWQgZm9yIGEgZ2VvZ3JhcGhpY2FsIHZpZXcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV9IGVcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9XG4gICAgICovXG4gICAgZ2V0VGlsaW5nRW52ZWxvcGUoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5mbykge1xuICAgICAgICAgICAgdGhpcy5sb2FkSW5mbygoKSA9PiB7IH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvID0gdGhpcy5pbmZvLm9yaWdpblBvaW50LFxuICAgICAgICAgICAgciA9IHRoaXMuaW5mby5yZXNvbHV0aW9uR2VvLFxuICAgICAgICAgICAgcyA9IHRoaXMuaW5mby50aWxlU2l6ZUNlbGxcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeE1pbjogTWF0aC5mbG9vcigoZS54TWluIC0gcG8ueCkgLyAociAqIHMpKSxcbiAgICAgICAgICAgIHhNYXg6IE1hdGguZmxvb3IoKGUueE1heCAtIHBvLngpIC8gKHIgKiBzKSksXG4gICAgICAgICAgICB5TWluOiBNYXRoLmZsb29yKChlLnlNaW4gLSBwby55KSAvIChyICogcykpLFxuICAgICAgICAgICAgeU1heDogTWF0aC5mbG9vcigoZS55TWF4IC0gcG8ueSkgLyAociAqIHMpKSxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gcmVkcmF3RnVuXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgZ2V0RGF0YShleHRHZW8sIHJlZHJhd0Z1bikge1xuICAgICAgICAvL1RPRE8gZW1wdHkgY2FjaGUgd2hlbiBpdCBnZXRzIHRvbyBiaWcgP1xuXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy90aWxlcyB3aXRoaW4gdGhlIHNjb3BlXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHRiID0gdGhpcy5nZXRUaWxpbmdFbnZlbG9wZShleHRHZW8pXG4gICAgICAgIGlmICghdGIpIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy9ncmlkIGJvdW5kc1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV9ICovXG4gICAgICAgIGNvbnN0IGdiID0gdGhpcy5pbmZvLnRpbGluZ0JvdW5kc1xuXG4gICAgICAgIGZvciAobGV0IHhUID0gTWF0aC5tYXgodGIueE1pbiwgZ2IueE1pbik7IHhUIDw9IE1hdGgubWluKHRiLnhNYXgsIGdiLnhNYXgpOyB4VCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5VCA9IE1hdGgubWF4KHRiLnlNaW4sIGdiLnlNaW4pOyB5VCA8PSBNYXRoLm1pbih0Yi55TWF4LCBnYi55TWF4KTsgeVQrKykge1xuICAgICAgICAgICAgICAgIC8vcHJlcGFyZSBjYWNoZVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYWNoZVt4VF0pIHRoaXMuY2FjaGVbeFRdID0ge31cblxuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGlsZSBleGlzdHMgaW4gdGhlIGNhY2hlXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtHcmlkVGlsZX0gKi9cbiAgICAgICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMuY2FjaGVbeFRdW3lUXVxuICAgICAgICAgICAgICAgIGlmICh0aWxlKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9tYXJrIHRpbGUgYXMgbG9hZGluZ1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdsb2FkaW5nJ1xuICAgICAgICAgICAgICAgICAgICA7IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3JlcXVlc3QgdGlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gICovXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbHNcblxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGNzdih0aGlzLnVybCArIHhUICsgJy8nICsgeVQgKyAnLmNzdicpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIHN0YXJ0JylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMucHVzaChjKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbigncHJlcHJvY2VzcyAvIGZpbHRlcicpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIHRpbGUgaW4gY2FjaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGlsZSBpbmZvIGlua25vd24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlsZV8gPSBuZXcgR3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgdGhpcy5pbmZvKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt4VF1beVRdID0gdGlsZV9cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignc3RvcmFnZScpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbm8gcmVkcmF3IGlzIHNwZWNpZmllZCwgdGhlbiBsZWF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRyYXdGdW4pIHJldHVyblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHJlZHJhdyBpcyByZWFsbHkgbmVlZGVkLCB0aGF0IGlzIGlmOlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiB0aGUgZGF0YXNldCBiZWxvbmdzIHRvIGEgbGF5ZXIgd2hpY2ggaXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVkcmF3ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6ZiA9IHRoaXMuYXBwLmdldFpvb21GYWN0b3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5hcHAubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXkudmlzaWJsZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5LmdldERhdGFzZXRDb21wb25lbnQoemYpICE9IHRoaXMpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3VuZCBvbmUgbGF5ZXIuIE5vIG5lZWQgdG8gc2VlayBtb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHJhdyA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignY2hlY2sgcmVkcmF3IDEnKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZHJhdykgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIHRoZSB0aWxlIGlzIHdpdGhpbiB0aGUgdmlldywgdGhhdCBpcyBpdHMgZ2VvIGVudmVsb3BlIGludGVyc2VjdHMgdGhlIHZpZXdlciBnZW8gZW52ZWxvcGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnYgPSB0aGlzLmFwcC51cGRhdGVFeHRlbnRHZW8oKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52VCA9IHRpbGVfLmV4dEdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudi54TWF4IDw9IGVudlQueE1pbikgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnhNaW4gPj0gZW52VC54TWF4KSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnYueU1heCA8PSBlbnZULnlNaW4pIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudi55TWluID49IGVudlQueU1heCkgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ2NoZWNrIHJlZHJhdyAyJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBUaWxlZEdyaWQgcGFyc2UgZW5kJylcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZHJhd0Z1bigpXG4gICAgICAgICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXG5cbiAgICAgICAgLy9jaGVjayBpZiBpbmZvIGhhcyBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuXG5cbiAgICAgICAgLy90aWxlcyB3aXRoaW4gdGhlIHNjb3BlXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHRiID0gdGhpcy5nZXRUaWxpbmdFbnZlbG9wZShleHRHZW8pXG4gICAgICAgIGlmICghdGIpIHJldHVyblxuXG4gICAgICAgIC8vZ3JpZCBib3VuZHNcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfSAqL1xuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcblxuICAgICAgICBmb3IgKGxldCB4VCA9IE1hdGgubWF4KHRiLnhNaW4sIGdiLnhNaW4pOyB4VCA8PSBNYXRoLm1pbih0Yi54TWF4LCBnYi54TWF4KTsgeFQrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgY29udGludWVcbiAgICAgICAgICAgIGZvciAobGV0IHlUID0gTWF0aC5tYXgodGIueU1pbiwgZ2IueU1pbik7IHlUIDw9IE1hdGgubWluKHRiLnlNYXgsIGdiLnlNYXgpOyB5VCsrKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgdGlsZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7R3JpZFRpbGV9ICovXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuY2FjaGVbeFRdW3lUXVxuICAgICAgICAgICAgICAgIGlmICghdGlsZSB8fCB0eXBlb2YgdGlsZSA9PT0gJ3N0cmluZycpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsc1xuICAgICAgICAgICAgICAgIC8vdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IHRoaXMuY2VsbHNWaWV3Q2FjaGUuY29uY2F0KHRpbGUuY2VsbHMpXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGlsZS5jZWxscykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoK2NlbGwueCArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby54TWluKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoK2NlbGwueSAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby55TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb2xvciBjYXRlZ3Jvcmllcy5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xvckNhdGVnb3J5TGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9jb2wvY2F0ZWdvcmllcyBhcnJheSwgaW4gZGlzcGxheSBvcmRlclxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxBcnJheS48c3RyaW5nPj59ICovXG4gICAgICAgIHRoaXMuY29sQ2F0ID0gb3B0cy5jb2xDYXQgfHwgW1snZ3JheScsICctJ11dXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcbiAgICAgICAgdGhpcy5kaW1lbnNpb24gPSBvcHRzLmRpbWVuc2lvbiB8fCB7IHI6IDggfVxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxuXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMudGl0bGVGb250V2VpZ2h0ID0gb3B0cy50aXRsZUZvbnRXZWlnaHQgfHwgJ2JvbGQnXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3R5bGUsIHI6IG51bWJlciwgemY6IG51bWJlciwgc1NpemU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB9fSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vYnVpbGRcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKVxuICAgICAgICAgICAgdGhpcy5kaXZcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ21hcmdpbi1ib3R0b20nLCAnN3B4JylcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuXG4gICAgICAgIC8vY2F0ZWdvcmllc1xuICAgICAgICBjb25zdCBuYiA9IHRoaXMuY29sQ2F0Lmxlbmd0aFxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvbENhdFtpXVxuXG4gICAgICAgICAgICAvL21ha2UgZGl2IGZvciBjYXRlZ29yeVxuICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xuICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXG5cbiAgICAgICAgICAgIGNvbnN0IHN3ID0gdGhpcy5zdHJva2VXaWR0aFxuXG4gICAgICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50OiBib3ggLyBjaXJjbGVcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmRpbWVuc2lvbi5oIHx8IDE1XG4gICAgICAgICAgICAgICAgY29uc3QgdyA9IHRoaXMuZGltZW5zaW9uLncgfHwgMjBcbiAgICAgICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG5cbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdyArIDIgKiBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGggKyAyICogc3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd4Jywgc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd5Jywgc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjYXRbMF0pXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmRpbWVuc2lvbi5yIHx8IDhcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gMiAqIHIgKyAyICogc3dcbiAgICAgICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG5cbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgaClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXG5cbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgciArIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgcilcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY2F0WzBdKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3dyaXRlIGxhYmVsIHRleHRcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgIC8vc2hvdyBvbiByaWdodCBvZiBncmFwaGljXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG5cbiAgICAgICAgICAgICAgICAvL2NlbnRlciB2ZXJ0aWNhbGx5XG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpLnN0eWxlKFwidG9wXCIsIFwiMFwiKS5zdHlsZShcImJvdHRvbVwiLCBcIjBcIilcblxuICAgICAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLnRleHQoY2F0WzFdKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgZGlzY3JldGUgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xvckRpc2NyZXRlTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEBwcml2YXRlIEB0eXBlIHtBcnJheS48QXJyYXkuPHN0cmluZz4+fSAqL1xuICAgICAgICB0aGlzLmNvbG9ycyA9IG9wdHMuY29sb3JzXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7QXJyYXkuPEFycmF5LjxzdHJpbmc+Pn0gKi9cbiAgICAgICAgdGhpcy5icmVha3NUZXh0ID0gb3B0cy5icmVha3NUZXh0XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgMTVcblxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxuICAgICAgICB0aGlzLnRpdGxlRm9udFNpemUgPSBvcHRzLnRpdGxlRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xuXG4gICAgICAgIHRoaXMudGlja1NpemUgPSBvcHRzLnRpY2tTaXplIHx8IDNcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IG9wdHMubGFiZWxGb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gb3B0cy5pbnZlcnRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3sgc3R5bGU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNTaXplOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0LCBzQ29sb3I6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQgfX0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL2J1aWxkXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICBpZiAodGhpcy50aXRsZSlcbiAgICAgICAgICAgIHRoaXMuZGl2XG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMudGl0bGVGb250U2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgdGhpcy50aXRsZUZvbnRXZWlnaHQpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzdweCcpXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcblxuICAgICAgICAvL2NsYXNzZXNcbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLmNvbG9ycy5sZW5ndGhcbiAgICAgICAgaWYgKG5iID09IDApIHJldHVyblxuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCAvIG5iXG5cbiAgICAgICAgLy9tYWtlIHN2ZyBlbGVtZW50XG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZGl2XG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdGhpcy53aWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmhlaWdodCArIHRoaXMudGlja1NpemUgKyAyICsgMTApXG5cbiAgICAgICAgLy9kcmF3IGdyYXBoaWMgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGkgKiB3KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmhlaWdodClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmNvbG9yc1tpXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGljayBsaW5lXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgdyAqIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCB0aGlzLmhlaWdodCArIHRoaXMudGlja1NpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9sYWJlbHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICAvL3ByZXBhcmUgbGFiZWxcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgaSA9PSAwID8gJ3N0YXJ0JyA6IGkgPT0gdGhpcy50aWNrcyAtIDEgPyAnZW5kJyA6ICdtaWRkbGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgICAgICAgIC50ZXh0KHRoaXMuYnJlYWtzVGV4dFtpIC0gMV0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL0xlZ2VuZC5qcydcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2QzLWZvcm1hdCdcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb250aW51b3VzIGNvbG9yIHN0eWxlLlxuICogSW5zcGlyYXRpb246IGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AZDMvY29sb3ItbGVnZW5kXG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICB0aGlzLmNvbG9yUmFtcCA9IG9wdHMuY29sb3JSYW1wXG5cbiAgICAgICAgLy9mdW5jdGlvbiAodFswLDFdLCByLCBzKSAtPiB2IChmb3IgbGFiZWwgdGV4dClcbiAgICAgICAgdGhpcy5mdW4gPSBvcHRzLmZ1blxuXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXG4gICAgICAgIHRoaXMudGlja1NpemUgPSBvcHRzLnRpY2tTaXplIHx8IDZcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgMTVcbiAgICAgICAgdGhpcy5tYXJnaW4gPSBvcHRzLm1hcmdpbiB8fCA1XG4gICAgICAgIHRoaXMudGlja3MgPSBvcHRzLnRpY2tzIHx8IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDUwKVxuICAgICAgICB0aGlzLnRpY2tGb3JtYXQgPSBvcHRzLnRpY2tGb3JtYXQgfHwgJywuMGYnXG4gICAgICAgIHRoaXMudGlja1VuaXQgPSBvcHRzLnRpY2tVbml0XG5cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdHlsZSwgcjogbnVtYmVyLCB6ZjogbnVtYmVyLCBzU2l6ZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0NvbG9yOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xuICAgICAgICBpZiAoIW9wdHMuc0NvbG9yKSByZXR1cm5cblxuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgY29uc3QgdGl0bGVIZWlnaHQgPSAxMlxuXG4gICAgICAgIGNvbnN0IHN2Z1cgPSB0aGlzLndpZHRoICsgMiAqIHRoaXMubWFyZ2luXG4gICAgICAgIGNvbnN0IHN2Z0ggPSB0aGlzLmhlaWdodCArIDMgKiB0aGlzLm1hcmdpbiArIHRpdGxlSGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDEwXG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZGl2LmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzdmdXKS5hdHRyKCdoZWlnaHQnLCBzdmdIKVxuICAgICAgICAvLyAgPHJlY3Qgd2lkdGg9XCIzMDBcIiBoZWlnaHQ9XCIxMDBcIiBzdHlsZT1cImZpbGw6cmdiKDAsMCwyNTUpO3N0cm9rZS13aWR0aDozO3N0cm9rZTpyZ2IoMCwwLDApXCIgLz5cblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCB0aGlzLm1hcmdpbilcbiAgICAgICAgICAgIC5hdHRyKCd5JywgdGhpcy5tYXJnaW4pXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcwLjhlbScpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKVxuICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcbiAgICAgICAgICAgIC5zdHlsZSgnZG9taW5hbnQtYmFzZWxpbmUnLCAnaGFuZ2luZycpXG4gICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcblxuICAgICAgICBjb25zdCBnID0gc3ZnXG4gICAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyB0aGlzLm1hcmdpbiArICcgJyArICgyICogdGhpcy5tYXJnaW4gKyB0aXRsZUhlaWdodCkgKyAnKScpXG5cbiAgICAgICAgLy9kcmF3IGNvbG9yIGJhclxuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCxcbiAgICAgICAgICAgIGggPSB0aGlzLmhlaWdodFxuICAgICAgICBjb25zdCBzdGVwID0gNVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHc7IGkgKz0gc3RlcCkge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHcgLSAxKVxuICAgICAgICAgICAgaWYgKHRoaXMuaW52ZXJ0KSB0ID0gMSAtIHRcbiAgICAgICAgICAgIGcuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHN0ZXApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5jb2xvclJhbXAodCkpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGlja3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxuXG4gICAgICAgICAgICAvL3RpY2sgbGluZVxuICAgICAgICAgICAgZy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiB0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgdyAqIHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgaCArIHRoaXMudGlja1NpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxuXG4gICAgICAgICAgICAvL3ByZXBhcmUgdGljayBsYWJlbFxuICAgICAgICAgICAgZy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogdClcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIGggKyB0aGlzLnRpY2tTaXplICsgMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgaSA9PSAwID8gJ3N0YXJ0JyA6IGkgPT0gdGhpcy50aWNrcyAtIDEgPyAnZW5kJyA6ICdtaWRkbGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgICAgLy8udGV4dChcIi1cIilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIHRpY2sgbGFiZWxzXG5cbiAgICAgICAgLy9sYWJlbCB0ZXh0IGZvcm1hdFxuICAgICAgICBjb25zdCBmID0gdGhpcy50aWNrRm9ybWF0ICYmIHRoaXMudGlja0Zvcm1hdCAhPSAndGV4dCcgPyBmb3JtYXQodGhpcy50aWNrRm9ybWF0KSA6ICh2KSA9PiB2XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50aWNrczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGkgLyAodGhpcy50aWNrcyAtIDEpXG5cbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLmZ1bih0LCBvcHRzLnIsIG9wdHMuc0NvbG9yKVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9ICh2ID8gZih2KSA6ICcwJykgKyAodGhpcy50aWNrVW5pdCA/IHRoaXMudGlja1VuaXQgOiAnJylcblxuICAgICAgICAgICAgLy90aWNrIGxhYmVsXG4gICAgICAgICAgICB0aGlzLmRpdi5zZWxlY3QoJyMnICsgJ3RpY2tsYWJlbF8nICsgaSkudGV4dCh0ZXh0KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3Igc2VnbWVudCBvcmllbnRhdGlvbi5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWdtZW50T3JpZW50YXRpb25MZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMudGl0bGVGb250V2VpZ2h0ID0gb3B0cy50aXRsZUZvbnRXZWlnaHQgfHwgJ2JvbGQnXG5cbiAgICAgICAgLy9leGFnZXJhdGlvblxuICAgICAgICB0aGlzLmV4YWdnZXJhdGlvbkZhY3RvciA9IG9wdHMuZXhhZ2dlcmF0aW9uRmFjdG9yIHx8IDAuNVxuXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgJ2dyYXknXG4gICAgICAgIC8vb3JpZW50YXRpb25cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxuICAgICAgICAvL3dpZHRoXG4gICAgICAgIHRoaXMud2lkdGhQaXggPSBvcHRzLndpZHRoUGl4IHx8IDNcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IG9wdHMubGFiZWxGb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMubGFiZWxVbml0VGV4dCA9IG9wdHMubGFiZWxVbml0VGV4dCB8fCAnJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vc3R5bGUvU2VnbWVudFN0eWxlXCIpLlNlZ21lbnRTdHlsZSwgcjogbnVtYmVyLCB6ZjogbnVtYmVyLCBzQ29sb3I6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNMZW5ndGg6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNXaWR0aDogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB9fSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jb3VsZCBoYXBwZW4gd2hlbiBkYXRhIGlzIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgaWYgKCFvcHRzLnNXaWR0aCkgcmV0dXJuXG5cbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICBpZiAodGhpcy50aXRsZSkge1xuICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMudGl0bGVGb250U2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgdGhpcy50aXRsZUZvbnRXZWlnaHQpXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IHdpZHRoIGFuZCBsZW5ndGgsIGluIHBpeFxuICAgICAgICBjb25zdCBzV2lkdGggPSB0aGlzLndpZHRoUGl4XG4gICAgICAgIGNvbnN0IHNMZW5ndGggPSAoMSAqIG9wdHMucikgLyBvcHRzLnpmXG5cbiAgICAgICAgLy9kcmF3IFNWRyBzZWdtZW50XG4gICAgICAgIGNvbnN0IHN2Z1MgPSBNYXRoLm1heChzTGVuZ3RoLCBzV2lkdGgpXG4gICAgICAgIGNvbnN0IHN2ZyA9IGQuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHN2Z1MpLmF0dHIoJ2hlaWdodCcsIHN2Z1MpLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcblxuICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcygoLXRoaXMub3JpZW50YXRpb24gKiBNYXRoLlBJKSAvIDE4MClcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oKC10aGlzLm9yaWVudGF0aW9uICogTWF0aC5QSSkgLyAxODApXG4gICAgICAgIGNvbnN0IGRjID0gc3ZnUyAqIDAuNSxcbiAgICAgICAgICAgIGwyID0gc0xlbmd0aCAqIDAuNVxuICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgIC5hdHRyKCd4MScsIGRjIC0gY29zICogbDIpXG4gICAgICAgICAgICAuYXR0cigneTEnLCBkYyAtIHNpbiAqIGwyKVxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgZGMgKyBjb3MgKiBsMilcbiAgICAgICAgICAgIC5hdHRyKCd5MicsIGRjICsgc2luICogbDIpXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY29sb3IpXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHNXaWR0aClcblxuICAgICAgICAvL3RleHQgbGFiZWxcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2Ygc3ZnXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxhYmVsVW5pdFRleHQpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkMy1mb3JtYXQnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3Igc2VnbWVudCB3aWR0aC5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWdtZW50V2lkdGhMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMudGl0bGVGb250V2VpZ2h0ID0gb3B0cy50aXRsZUZvbnRXZWlnaHQgfHwgJ2JvbGQnXG5cbiAgICAgICAgLy9leGFnZXJhdGlvblxuICAgICAgICB0aGlzLmV4YWdnZXJhdGlvbkZhY3RvciA9IG9wdHMuZXhhZ2dlcmF0aW9uRmFjdG9yIHx8IDAuNVxuXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgJ2dyYXknXG4gICAgICAgIC8vb3JpZW50YXRpb25cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TZWdtZW50U3R5bGVcIikuU2VnbWVudFN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0xlbmd0aDogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc1dpZHRoOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xuICAgICAgICBpZiAoIW9wdHMuc1dpZHRoKSByZXR1cm5cblxuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKSB7XG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9nZXQgbWF4IHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlXyA9IG9wdHMuc1dpZHRoLm1heCAqIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yXG5cbiAgICAgICAgLy90YWtlICduaWNlJyB2YWx1ZSAocG93ZXIgb2YgdGVuLCBvciBtdWx0aXBsZSlcbiAgICAgICAgbGV0IHBvdzEwID0gTWF0aC5sb2cxMCh2YWx1ZV8pXG4gICAgICAgIHBvdzEwID0gTWF0aC5mbG9vcihwb3cxMClcbiAgICAgICAgbGV0IHZhbHVlID0gTWF0aC5wb3coMTAsIHBvdzEwKVxuICAgICAgICBpZiAodmFsdWUgKiA4IDw9IHZhbHVlXykgdmFsdWUgKj0gOFxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDYgPD0gdmFsdWVfKSB2YWx1ZSAqPSA2XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICogNSA8PSB2YWx1ZV8pIHZhbHVlICo9IDVcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA0IDw9IHZhbHVlXykgdmFsdWUgKj0gNFxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDIuNSA8PSB2YWx1ZV8pIHZhbHVlICo9IDIuNVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDIgPD0gdmFsdWVfKSB2YWx1ZSAqPSAyXG5cbiAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgd2lkdGggYW5kIGxlbmd0aCwgaW4gcGl4XG4gICAgICAgIGNvbnN0IHNXaWR0aCA9IG9wdHMuc3R5bGUud2lkdGgodmFsdWUsIG9wdHMuciwgb3B0cy5zV2lkdGgsIG9wdHMuemYpIC8gb3B0cy56ZlxuICAgICAgICBjb25zdCBzTGVuZ3RoID0gKDEgKiBvcHRzLnIpIC8gb3B0cy56ZlxuXG4gICAgICAgIC8vVE9ETyB1c2Ugb3JpZW50YXRpb25cblxuICAgICAgICBjb25zdCBzdmcgPSBkLmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzTGVuZ3RoKS5hdHRyKCdoZWlnaHQnLCBzV2lkdGgpLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcblxuICAgICAgICAvLzxsaW5lIHgxPVwiMFwiIHkxPVwiMFwiIHgyPVwiMjAwXCIgeTI9XCIyMDBcIiBzdHlsZT1cInN0cm9rZTpyZ2IoMjU1LDAsMCk7c3Ryb2tlLXdpZHRoOjJcIiAvPlxuICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAgICAgICAuYXR0cigneTEnLCBzV2lkdGggLyAyKVxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgc0xlbmd0aClcbiAgICAgICAgICAgIC5hdHRyKCd5MicsIHNXaWR0aCAvIDIpXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY29sb3IpXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHNXaWR0aClcblxuICAgICAgICBjb25zdCB2YWx1ZVQgPSBmb3JtYXQoJywuMnInKSh2YWx1ZSlcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG4gICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxuICAgICAgICAgICAgLnRleHQodmFsdWVUICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL0xlZ2VuZC5qcydcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2QzLWZvcm1hdCdcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBwcm9wb3J0aW9uYWwgc3ltYm9scy5cbiAqXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXplTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9leGFnZXJhdGlvblxuICAgICAgICB0aGlzLmV4YWdnZXJhdGlvbkZhY3RvciA9IG9wdHMuZXhhZ2dlcmF0aW9uRmFjdG9yIHx8IDAuOFxuXG4gICAgICAgIC8vaWYgdmFsdWUgaXMgdG8gYmUgZm9yY2VkXG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRzLnZhbHVlIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy50aXRsZSA9IG9wdHMudGl0bGVcbiAgICAgICAgdGhpcy50aXRsZUZvbnRTaXplID0gb3B0cy50aXRsZUZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcblxuICAgICAgICAvL3N5bWJvbFxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4uL1N0eWxlXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yIHx8ICdub25lJ1xuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXG4gICAgICAgIHRoaXMubGFiZWxGb3JtYXQgPSBvcHRzLmxhYmVsRm9ybWF0IHx8ICcsLjJyJ1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vdGhpcy5kaXYuc3R5bGUoXCJ0ZXh0LWFsaWduXCIsIFwiY2VudGVyXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlXCIpLlNoYXBlQ29sb3JTaXplU3R5bGUsIHI6IG51bWJlciwgemY6IG51bWJlciwgc1NpemU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB9fSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jb3VsZCBoYXBwZW4gd2hlbiBkYXRhIGlzIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgaWYgKCFvcHRzLnNTaXplKSByZXR1cm5cblxuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy9nZXQgdmFsdWVcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZVxuICAgICAgICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL2NvbXB1dGUgJ25pY2UgdmFsdWVcblxuICAgICAgICAgICAgLy9nZXQgbWF4IHZhbHVlXG4gICAgICAgICAgICBjb25zdCB2YWx1ZV8gPSBvcHRzLnNTaXplLm1heCAqIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yXG5cbiAgICAgICAgICAgIC8vdGFrZSAnbmljZScgdmFsdWUgKHBvd2VyIG9mIHRlbiwgb3IgbXVsdGlwbGUpXG4gICAgICAgICAgICBsZXQgcG93MTAgPSBNYXRoLmxvZzEwKHZhbHVlXylcbiAgICAgICAgICAgIHBvdzEwID0gTWF0aC5mbG9vcihwb3cxMClcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5wb3coMTAsIHBvdzEwKVxuICAgICAgICAgICAgaWYgKHZhbHVlICogOCA8PSB2YWx1ZV8pIHZhbHVlICo9IDhcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICogNiA8PSB2YWx1ZV8pIHZhbHVlICo9IDZcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICogNSA8PSB2YWx1ZV8pIHZhbHVlICo9IDVcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICogNCA8PSB2YWx1ZV8pIHZhbHVlICo9IDRcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICogMi41IDw9IHZhbHVlXykgdmFsdWUgKj0gMi41XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDIgPD0gdmFsdWVfKSB2YWx1ZSAqPSAyXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm5cblxuICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxuICAgICAgICAvL3RvIGVuYWJsZSB2ZXJ0aWNhbCBjZW50ZXJpbmdcbiAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICBpZiAodGhpcy50aXRsZSkge1xuICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMudGl0bGVGb250U2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgdGhpcy50aXRsZUZvbnRXZWlnaHQpXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcHV0ZSBzaXplIG9mIHN5bWJvbCwgaW4gcGl4XG4gICAgICAgIGNvbnN0IHNpemUgPSBvcHRzLnN0eWxlLnNpemUodmFsdWUsIG9wdHMuciwgb3B0cy5zU2l6ZSwgb3B0cy56ZikgLyBvcHRzLnpmXG5cbiAgICAgICAgY29uc3Qgc3ZnID0gZFxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemUgKyB0aGlzLnN0cm9rZVdpZHRoICsgMilcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXG4gICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgc3ZnLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzaXplKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIHRoaXMuZmlsbENvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgICAgICAvL1RPRE8gdGVzdFxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAvLyA8Y2lyY2xlIGN4PVwiNTBcIiBjeT1cIjUwXCIgcj1cIjQwXCIgc3Ryb2tlPVwiYmxhY2tcIiBzdHJva2Utd2lkdGg9XCIzXCIgZmlsbD1cInJlZFwiIC8+XG4gICAgICAgICAgICBjb25zdCByID0gKHNpemUgKyB0aGlzLnN0cm9rZVdpZHRoKSAqIDAuNVxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWVUID0gZm9ybWF0KHRoaXMubGFiZWxGb3JtYXQpKHZhbHVlKVxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC8vc2hvdyBvbiByaWdodCBvZiBncmFwaGljXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcblxuICAgICAgICAgICAgLy9jZW50ZXIgdmVydGljYWxseVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpLnN0eWxlKFwidG9wXCIsIFwiMFwiKS5zdHlsZShcImJvdHRvbVwiLCBcIjBcIilcblxuICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgLnRleHQodmFsdWVUICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7XCJmbGFnXCJ8XCJwaWVjaGFydFwifFwicmluZ1wifFwic2VnbWVudFwifFwicmFkYXJcInxcImFnZXB5cmFtaWRcInxcImhhbGZ0b25lXCJ9IENvbXBvc2l0aW9uVHlwZSAqL1xuXG4vKipcbiAqIEEgc3R5bGUgc2hvd2luZyB0aGUgY29tcG9zaXRpb24gb2YgYSB0b3RhbCBpbiBkaWZmZXJlbnQgY2F0ZWdvcmllcywgd2l0aCBkaWZmZXJlbnQgY29sb3IgaHVlcy5cbiAqIEl0IGNvbnNpc3RzIG9mIGEgc3ltYm9sIHdpdGggZGlmZmVyZW50IHBhcnRzLCB3aG9zZSBzaXplIHJlZmxlY3QgdGhlIHByb3BvcnRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0ZWdvcnkuXG4gKiBGb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBzeW1ib2xzLCBAc2VlIENvbXBvc2l0aW9uVHlwZVxuICogVGhlIHN5bWJvbCBjYW4gYmUgc2NhbGVkIGRlcGVuZGluZyBvbiB0aGUgY2VsbCBpbXBvcnRhbmNlLlxuICpcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvclxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdHlwZSBvZiBkZWNvbXBvc2l0aW9uIHN5bWJvbCBvZiBhIGNlbGwsIEBzZWUgQ29tcG9zaXRpb25UeXBlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOkNvbXBvc2l0aW9uVHlwZX0gKi9cbiAgICAgICAgdGhpcy50eXBlID0gb3B0cy50eXBlXG5cbiAgICAgICAgLyoqIFRoZSBjb2x1bW4gd2hlcmUgdG8gZ2V0IHRoZSBzaXplIHZhbHVlcy5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaXplQ29sID0gb3B0cy5zaXplQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKHYsIHIsIHMsIHpmKSA9PiByKVxuXG4gICAgICAgIC8qKiBGb3Igc3R5bGUgdHlwZXMgd2l0aCBzdHJpcGVzIChmbGFnLCBzZWdtZW50KSwgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzdHJpcGVzICgwIGZvciBob3Jpem9udGFsLCBvdGhlciBmb3IgdmVydGljYWwpLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zdHJpcGVzT3JpZW50YXRpb24gPSBvcHRzLnN0cmlwZXNPcmllbnRhdGlvbiB8fCAoKCkgPT4gMCkgLy8oYyxyLHpmKSA9PiAuLi5cblxuICAgICAgICAvKiogVGhlIGZ1bmN0aW9uIHNwZWNpZnlpbmcgYW4gb2Zmc2V0IGFuZ2xlIGZvciBhIHJhZGFyLCBoYWxmdG9uZSBvciBwaWUgY2hhcnQgc3R5bGUuXG4gICAgICAgICAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlLiBUaGUgcm90YXRpb24gaXMgYW50aS1jbG9ja3dpc2UuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9mZnNldEFuZ2xlID0gb3B0cy5vZmZzZXRBbmdsZSB8fCAoKCkgPT4gMCkgLy8oY2VsbCxyLHpmKSA9PiAuLi5cblxuICAgICAgICAvKiogVGhlIGZ1bmN0aW9uIHNwZWNpZnlpbmcgdGhlIGhlaWdodCBvZiB0aGUgYWdlIHB5cmFtaWQsIGluIGdlbyB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0ID0gb3B0cy5hZ2VQeXJhbWlkSGVpZ2h0IHx8ICgoYywgciwgemYpID0+IHIpIC8vKGNlbGwscix6ZikgPT4gLi4uXG5cbiAgICAgICAgLyoqIEZvciBwaWUgY2hhcnQsIHRoaXMgaXMgcGFyYW1ldGVyIGZvciBpbnRlcm5hbCByYWRpdXMsIHNvIHRoYXQgdGhlIHBpZSBjaGFydCBsb29rcyBsaWtlIGEgZG9udXQuXG4gICAgICAgICAqIDAgZm9yIG5vcm1hbCBwaWUgY2hhcnRzLCAwLjUgdG8gZW1wdHkgaGFsZiBvZiB0aGUgcmFkaXVzLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IgPSBvcHRzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IgfHwgMFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcyBkZXBlbmRpbmcgb24gdGhlaXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICBsZXQgc3RhdFxuICAgICAgICBpZiAodGhpcy5zaXplQ29sKSB7XG4gICAgICAgICAgICAvL2lmIHNpemUgaXMgdXNlZCwgc29ydCBjZWxscyBieSBzaXplIHNvIHRoYXQgdGhlIGJpZ2dlc3QgYXJlIGRyYXduIGZpcnN0XG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMuc2l6ZUNvbF0gLSBjMVt0aGlzLnNpemVDb2xdKVxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0ID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5zaXplQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbmIgY2F0ZWdvcmllcyAtIHVzZWQgZm9yIHJhZGFyIGFuZCBhZ2VweXJhbWlkXG4gICAgICAgIGNvbnN0IG5iQ2F0ID0gT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikubGVuZ3RoXG5cbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xuICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vZHJhdyBjYWxsc1xuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL3NpemVcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgICAgIGxldCBzXyA9IHRoaXMuc2l6ZSB8fCAoKCkgPT4gcilcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlb1xuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICBjb25zdCBzRyA9IHNfKGNlbGxbdGhpcy5zaXplQ29sXSwgciwgc3RhdCwgemYpXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgemYpXG5cbiAgICAgICAgICAgIC8vZ2V0IHN5bWJvbCB0eXBlXG4gICAgICAgICAgICBjb25zdCB0eXBlXyA9IHRoaXMudHlwZSA/IHRoaXMudHlwZShjZWxsKSA6ICdmbGFnJ1xuXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VudGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCB4YyA9IGNlbGwueCArIG9mZnNldC5keCArICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnID8gMCA6IHIgKiAwLjUpXG4gICAgICAgICAgICBjb25zdCB5YyA9IGNlbGwueSArIG9mZnNldC5keSArICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnID8gMCA6IHIgKiAwLjUpXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBvZmZzZXQgYW5nbGUsIHdoZW4gcmVsZXZhbnRcbiAgICAgICAgICAgIGNvbnN0IG9mZkFuZyA9IHRoaXMub2Zmc2V0QW5nbGUgPyAodGhpcy5vZmZzZXRBbmdsZShjZWxsLCByLCB6ZikgKiBNYXRoLlBJKSAvIDE4MCA6IDBcblxuICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgfHwgdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZScpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsIGNhdGVnb3J5IG1heCB2YWx1ZVxuICAgICAgICAgICAgICAgIGxldCBtYXhWYWwgPSAtSW5maW5pdHlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2tleV1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPiBtYXhWYWwpIG1heFZhbCA9IHZcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2N1bXVsXG4gICAgICAgICAgICAgICAgbGV0IGN1bXVsID0gMFxuICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnICYmIHRoaXMuYWdlUHlyYW1pZEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgPSAociAtIHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByLCB6ZikpIC8gMlxuICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ3JhZGFyJyB8fCB0eXBlXyA9PT0gJ2hhbGZ0b25lJykgY3VtdWwgPSBNYXRoLlBJIC8gMiArIG9mZkFuZ1xuXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRoZSBpbmNyZW1lbnQsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgdGhlIGN1bXVsIGZvciBlYWNoIGNhdGVnb3J5XG4gICAgICAgICAgICAgICAgY29uc3QgaW5jciA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVfID09PSAnYWdlcHlyYW1pZCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuYWdlUHlyYW1pZEhlaWdodCA/IHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByLCB6ZikgOiByKSAvIG5iQ2F0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgyICogTWF0aC5QSSkgLyBuYkNhdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoaW5jciA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVnb3J5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IGxlbmd0aCAtIGluIGdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RyA9IChzRyAqIHZhbCkgLyBtYXhWYWxcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KHhjICsgKHIgLSB3RykgLyAyLCB5YyArIGN1bXVsLCB3RywgaW5jcilcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmFkYXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHJHID0gdGhpcy5yYWRpdXModmFsLCByLCBzdGF0LCBjZWxsU3RhdCwgemYpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IChzRyAvIDIpICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmFyYyh4YywgeWMsIHJHLCBjdW11bCAtIGluY3IsIGN1bXVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyh4YywgeWMpXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBhbmd1bGFyIHNlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAnaGFsZnRvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IHNHICogMC4zMzMgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMgKyByICogMC4yNSAqIE1hdGguY29zKGN1bXVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YyArIHIgKiAwLjI1ICogTWF0aC5zaW4oY3VtdWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIE1hdGguUElcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgdG90YWxcbiAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArY2VsbFtjb2x1bW5dXG4gICAgICAgICAgICAgICAgICAgIGlmICghdikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRvdGFsIHx8IGlzTmFOKHRvdGFsKSkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBkZWNvbXBvc2l0aW9uIHN5bWJvbFxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gciAqICgxIC0gc0cgLyByKSAqIDAuNVxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaSA9IHRoaXMuc3RyaXBlc09yaWVudGF0aW9uKGNlbGwsIHIsIHpmKVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZ2V0IHNoYXJlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlID0gY2VsbFtjb2x1bW5dIC8gdG90YWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGFyZSB8fCBpc05hTihzaGFyZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHN5bWJvbCBwYXJ0XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2ZsYWcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgZmxhZyBzdHJpcGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBkICsgY3VtdWwgKiBzRyArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgZCArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdwaWVjaGFydCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBwaWUgY2hhcnQgYW5ndWxhciBzZWN0b3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGFuZ2xlc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYTEgPSBjdW11bCAqIDIgKiBNYXRoLlBJXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMiA9IChjdW11bCArIHNoYXJlKSAqIDIgKiBNYXRoLlBJXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhd1xuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoeGMsIHljLCBzRyAqIDAuNSwgYTEgKyBvZmZBbmcsIGEyICsgb2ZmQW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYXJjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHICogMC41ICogdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMSArIG9mZkFuZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIgKyBvZmZBbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3JpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYXJjKHhjLCB5YywgTWF0aC5zcXJ0KDEgLSBjdW11bCkgKiBzRyAqIDAuNSwgMCwgMiAqIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdzZWdtZW50Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnQgc2VjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogc0cpIC8gclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIChyIC0gd0cpIC8gMiArIGN1bXVsICogd0cgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogd0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGN1bXVsICogciArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHIgLSB3RykgLyAyICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IHNoYXJlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzU2l6ZTogc3RhdCB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7e3g6bnVtYmVyLHk6bnVtYmVyLG9yOlwidlwifFwiaFwiLHZhbHVlOm51bWJlcn19IFNpZGUgKi9cblxuLyoqXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29udG91clN0eWxlIGV4dGVuZHMgU2lkZVN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIC8vb3B0cy5pbnRlcnZhbCA9IG9wdHMuaW50ZXJ2YWwgfHwgMTAwXG5cbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgb3B0cy5icmVha3MgPSBvcHRzLmJyZWFrcyB8fCBbMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAxMDAwMDAwXVxuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSxudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIG9wdHMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoKSA9PiAxKSAvLyhzLCByLCB6ZikgPT4gLi4uXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihTaWRlLG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgb3B0cy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRTdBOTM1JykgLy8ocywgciwgemYpID0+IC4uLlxuXG4gICAgICAgIC8vb3ZlcnJpZGUgbWV0aG9kIGZvciBjb250b3VyIGRyYXdpbmdcblxuICAgICAgICBjb25zdCBnZXRDbGFzcyA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICBpZiAodiA9PSB1bmRlZmluZWQpIHJldHVybiAwXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdHMuYnJlYWtzLmxlbmd0aDsgaSsrKSBpZiAodiA8IG9wdHMuYnJlYWtzW2ldKSByZXR1cm4gaVxuICAgICAgICAgICAgcmV0dXJuIG9wdHMuYnJlYWtzLmxlbmd0aFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWx1ZSA9ICh2MSwgdjIsIHIsIHMsIHpmKSA9PiB7XG4gICAgICAgICAgICAvL2lmICghdjEgfHwgIXYyKSByZXR1cm4gMFxuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKGdldENsYXNzKHYyKSAtIGdldENsYXNzKHYxKSlcblxuICAgICAgICAgICAgLy9jaGVjayBpZiB2MSAtIHYyIGNyb3NzIGEgY29udG91ciBsaW5lXG4gICAgICAgICAgICAvL2NvbnN0IHIxID0gTWF0aC5mbG9vcih2MSAvIG9wdHMuaW50ZXJ2YWwpO1xuICAgICAgICAgICAgLy9jb25zdCByMiA9IE1hdGguZmxvb3IodjIgLyBvcHRzLmludGVydmFsKTtcbiAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguYWJzKHIyIC0gcjEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9zYW1lIGNvbG9yIGZvciBhbGxcbiAgICAgICAgdGhpcy5jb2xvciA9IChzaWRlLCByLCBzLCB6ZikgPT4gKHNpZGUudmFsdWUgPyBvcHRzLmNvbG9yKHNpZGUsIHIsIHpmKSA6IHVuZGVmaW5lZClcblxuICAgICAgICAvL3dpZHRoOiBtdWx0aXBsZSBvZlxuICAgICAgICB0aGlzLndpZHRoID0gKHNpZGUsIHIsIHMsIHpmKSA9PiBzaWRlLnZhbHVlICogemYgKiBvcHRzLndpZHRoKHNpZGUsIHIsIHpmKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcbmltcG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJ2QzLXJhbmRvbSdcbmltcG9ydCB7IGNoZWNrV2ViR0xTdXBwb3J0LCBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZyB9IGZyb20gJy4uL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmcuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXG5cbi8qKlxuICpcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIERvdERlbnNpdHlTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBkb3QgbnVtYmVyLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLm5iQ29sID0gb3B0cy5uYkNvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGRvdHMgZm9yIGEgY2VsbCB2YWx1ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5uYiA9IG9wdHMubmIgfHwgKCh2LCByLCBzLCB6ZikgPT4gKCgoMC4zICogciAqIHIpIC8gKHpmICogemYpKSAqIHYpIC8gcy5tYXgpXG5cbiAgICAgICAgLyoqIFRoZSBjb2xvciBvZiB0aGUgZG90cy4gU2FtZSBjb2xvciBmb3IgYWxsIGRvdHMgd2l0aGluIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNGRjU3MzMnKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuZG90U2l6ZSA9IG9wdHMuZG90U2l6ZSAvL3x8ICgociwgemYpID0+IC4uLlxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2lnbWEgb2YgdGhlIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSByZXNvbHV0aW9uLCBpbiBnZW8gdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgLy98fCAoKHIsemYpID0+IC4uLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIERvdERlbnNpdHlTdHlsZSBkcmF3JylcblxuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgbGV0IHN0YXRcbiAgICAgICAgaWYgKHRoaXMubmJDb2wpIHN0YXQgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLm5iQ29sXSwgdHJ1ZSlcbiAgICAgICAgaWYgKCFzdGF0KSByZXR1cm5cblxuICAgICAgICAvL3NpemUgb2YgdGhlIGRvdHNcbiAgICAgICAgY29uc3Qgc0dlbyA9IHRoaXMuZG90U2l6ZSA/IHRoaXMuZG90U2l6ZShyLCB6ZikgOiAyICogemZcblxuICAgICAgICAvL21ha2UgcmFuZG9tIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuc2lnbWEgPyB0aGlzLnNpZ21hKHIsIHpmKSA6IHIgKiAwLjRcbiAgICAgICAgY29uc3QgcmFuZCA9IHJhbmRvbU5vcm1hbCgwLCBzaWcpXG5cbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIHByZXBhcmF0aW9uJylcblxuICAgICAgICBpZiAoY2hlY2tXZWJHTFN1cHBvcnQoKSkge1xuICAgICAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxuICAgICAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoY2cudyArICcnLCBjZy5oICsgJycpXG4gICAgICAgICAgICBpZiAoIWN2V0dMKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2NyZWF0ZSB3ZWJHTCBwcm9ncmFtXG4gICAgICAgICAgICBjb25zdCBwcm9nID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmcoY3ZXR0wuZ2wsIHNHZW8gLyB6ZilcblxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIHdlYmdsIGNyZWF0aW9uJylcblxuICAgICAgICAgICAgY29uc3QgcjIgPSByIC8gMlxuXG4gICAgICAgICAgICBsZXQgY29sLCBvZmZzZXQsIG5iLCBjeCwgY3ksIGNjXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb2wgPSB0aGlzLmNvbG9yKGMpXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcblxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcbiAgICAgICAgICAgICAgICBuYiA9IHRoaXMubmIoY1t0aGlzLm5iQ29sXSwgciwgc3RhdCwgemYpXG5cbiAgICAgICAgICAgICAgICAvL2NlbGwgY2VudGVyXG4gICAgICAgICAgICAgICAgY3ggPSBjLnggKyBvZmZzZXQuZHggKyByMlxuICAgICAgICAgICAgICAgIGN5ID0gYy55ICsgb2Zmc2V0LmR5ICsgcjJcblxuICAgICAgICAgICAgICAgIC8vY29udmVydCBjb2xvclxuICAgICAgICAgICAgICAgIGNjID0gY29sb3IoY29sKVxuICAgICAgICAgICAgICAgIGlmICghY2MpIHJldHVyblxuXG4gICAgICAgICAgICAgICAgLy9yYW5kb20gcG9pbnRzXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbmI7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgcHJvZy5hZGRQb2ludERhdGEyKGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIGRhdGEgcHJlcGFyYXRpb24nKVxuXG4gICAgICAgICAgICAvL2RyYXdcbiAgICAgICAgICAgIHByb2cuZHJhdyhjZy5nZXRXZWJHTFRyYW5zZm9ybSgpKVxuXG4gICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgd2ViZ2wgZHJhd2luZycpXG5cbiAgICAgICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXG4gICAgICAgICAgICBjZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGNnLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxuXG4gICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgY2FudmFzIGRyYXdpbmcnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcblxuICAgICAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xuICAgICAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihjKVxuICAgICAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgciwgemYpXG5cbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXG4gICAgICAgICAgICAgICAgY29uc3QgbmIgPSB0aGlzLm5iKGNbdGhpcy5uYkNvbF0sIHIsIHN0YXQsIHpmKVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IHJhbmRvbSBkb3RzXG4gICAgICAgICAgICAgICAgY29uc3QgY3ggPSBjLnggKyBvZmZzZXQuZHggKyByIC8gMixcbiAgICAgICAgICAgICAgICAgICAgY3kgPSBjLnkgKyBvZmZzZXQuZHkgKyByIC8gMlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG5iOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgc0dlbywgc0dlbylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogRG90RGVuc2l0eVN0eWxlIGVuZCBkcmF3JylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKlxuICpcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEpveVBsb3RTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBjZWxsIGNvbHVtbiB3aGVyZSB0byBnZXQgdGhlIHZhbHVlIHRvIHJlcHJlc2VudC5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5oZWlnaHRDb2wgPSBvcHRzLmhlaWdodENvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaGVpZ2h0IG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKCh2KSA9PiBNYXRoLnNxcnQodikpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5saW5lQ29sb3IgPSBvcHRzLmxpbmVDb2xvciB8fCAoKHksIHlzLCByLCB6ZikgPT4gJyNCQkInKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoeSwgeXMsIHIsIHpmKSA9PiB6ZilcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvciB8fCAoKHksIHlzLCByLCB6ZikgPT4gJyNjMDhjNTk2OCcpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzIGRlcGVuZGluZyBvbiB0aGVpciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICogKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIGNnLmN0eC5saW5lSm9pbiA9ICdyb3VuZCdcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIC8vY29tcHV0ZSBzdGF0aXN0aWNzXG4gICAgICAgIGNvbnN0IHN0YXQgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmhlaWdodENvbF0sIHRydWUpXG5cbiAgICAgICAgLy9pbmRleCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8qKiAgQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgY29uc3QgaW5kID0ge31cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gaW5kW2NlbGwueV1cbiAgICAgICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICAgICAgcm93ID0ge31cbiAgICAgICAgICAgICAgICBpbmRbY2VsbC55XSA9IHJvd1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93W2NlbGwueF0gPSB0aGlzLmhlaWdodChjZWxsW3RoaXMuaGVpZ2h0Q29sXSwgciwgc3RhdCwgemYpXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgZXh0ZW50XG4gICAgICAgIGNvbnN0IGUgPSBjZy5leHRHZW9cbiAgICAgICAgaWYgKCFlKSByZXR1cm5cbiAgICAgICAgY29uc3QgeE1pbiA9IE1hdGguZmxvb3IoZS54TWluIC8gcikgKiByXG4gICAgICAgIGNvbnN0IHhNYXggPSBNYXRoLmZsb29yKGUueE1heCAvIHIpICogclxuICAgICAgICBjb25zdCB5TWluID0gTWF0aC5mbG9vcihlLnlNaW4gLyByKSAqIHJcbiAgICAgICAgY29uc3QgeU1heCA9IE1hdGguZmxvb3IoZS55TWF4IC8gcikgKiByXG5cbiAgICAgICAgLyoqICBAdHlwZSB7e21pbjpudW1iZXIsIG1heDpudW1iZXJ9fSAqL1xuICAgICAgICBjb25zdCB5cyA9IHsgbWluOiB5TWluLCBtYXg6IHlNYXggfVxuXG4gICAgICAgIC8vZHJhdyBpbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAvL2RyYXcgbGluZXMsIHJvdyBieSByb3csIHN0YXRpbmcgZnJvbSB0aGUgdG9wXG4gICAgICAgIGZvciAobGV0IHkgPSB5TWF4OyB5ID49IHlNaW47IHkgLT0gcikge1xuICAgICAgICAgICAgLy9nZXQgcm93XG4gICAgICAgICAgICBjb25zdCByb3cgPSBpbmRbeV1cblxuICAgICAgICAgICAgLy9ubyByb3dcbiAgICAgICAgICAgIGlmICghcm93KSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3BsYWNlIGZpcnN0IHBvaW50XG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeE1pbiAtIHIgLyAyLCB5KVxuXG4gICAgICAgICAgICAvL3N0b3JlIHRoZSBwcmV2aW91cyBoZWlnaHRcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGxldCBoR19cblxuICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsaW5lIGNlbGxzXG4gICAgICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8PSB4TWF4OyB4ICs9IHIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjb2x1bW4gdmFsdWVcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICBsZXQgaEcgPSByb3dbeF1cbiAgICAgICAgICAgICAgICBpZiAoIWhHKSBoRyA9IDBcblxuICAgICAgICAgICAgICAgIGlmIChoRyB8fCBoR18pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGxpbmUgb25seSB3aGVuIGF0IGxlYXN0IG9uZSBvZiBib3RoIHZhbHVlcyBpcyBub24tbnVsbFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gdGVzdCBiZXppZXJDdXJ2ZVRvXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oeCArIHIgLyAyLCB5ICsgaEcpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9lbHNlIG1vdmUgdGhlIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeCArIHIgLyAyLCB5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3N0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgICAgICAgIGhHXyA9IGhHXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbGFzdCBwb2ludFxuICAgICAgICAgICAgaWYgKGhHXykgY2cuY3R4LmxpbmVUbyh4TWF4ICsgciAvIDIsIHkpXG5cbiAgICAgICAgICAgIC8vZHJhdyBmaWxsXG4gICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsbENvbG9yKHksIHlzLCByLCB6ZilcbiAgICAgICAgICAgIGlmIChmYyAmJiBmYyAhPSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gZmNcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICBjb25zdCBsYyA9IHRoaXMubGluZUNvbG9yKHksIHlzLCByLCB6ZilcbiAgICAgICAgICAgIGNvbnN0IGx3ID0gdGhpcy5saW5lV2lkdGgoeSwgeXMsIHIsIHpmKVxuICAgICAgICAgICAgaWYgKGxjICYmIGxjICE9ICdub25lJyAmJiBsdyA+IDApIHtcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBsY1xuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSBsd1xuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBUYW5ha2FTdHlsZSB9IGZyb20gJy4vVGFuYWthU3R5bGUuanMnXG5pbXBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vU3Ryb2tlU3R5bGUuanMnXG5pbXBvcnQgeyBTcXVhcmVDb2xvckNhdFdHTFN0eWxlIH0gZnJvbSAnLi9TcXVhcmVDb2xvckNhdFdHTFN0eWxlLmpzJ1xuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWdvU3R5bGUge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtBcnJheS48U3R5bGU+fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQoY29sLCBvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy90aGUgY29sb3JzXG4gICAgICAgIC8vaHR0cDovL3d3dy5qZW5ueXNjcmF5b25jb2xsZWN0aW9uLmNvbS8yMDIxLzA2L2FsbC1jdXJyZW50LWxlZ28tY29sb3JzLmh0bWxcbiAgICAgICAgLy9odHRwczovL2xlb25hd2ljei5naXRodWIuaW8vbGVnb2NvbG9ycy9yZWZlcmVuY2UvZmlndXJlcy9SRUFETUUtcGxvdC0xLnBuZ1xuICAgICAgICBvcHRzLmNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFtcbiAgICAgICAgICAgICcjMDA4NTJiJywgLy9kYXJrZXIgZ3JlZW5cbiAgICAgICAgICAgICcjYWZkMjQ2JywgLy9saWdodCBncmVlblxuICAgICAgICAgICAgJyNmYWM4MGEnLCAvL2RhcmsgeWVsbG93XG4gICAgICAgICAgICAnI2JiODA1YScsIC8vYnJvd25cbiAgICAgICAgICAgICcjZDY3OTIzJywgLy9tb3N0YXJkXG4gICAgICAgICAgICAnI2NiNGUyOScsIC8vcmVkaXNoXG4gICAgICAgICAgICAnI2I0MDAwMCcsIC8vcmVkXG4gICAgICAgICAgICAnIzcyMDAxMicsIC8vZGFyayByZWRcbiAgICAgICAgICAgIC8vXCJwdXJwbGVcIixcbiAgICAgICAgICAgIC8vXCIjZWVlXCIgLy93aGl0aGVcbiAgICAgICAgXVxuXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcbiAgICAgICAgb3B0cy53aWR0aEZhY3RvciA9IG9wdHMud2lkdGhGYWN0b3IgfHwgMC4xMlxuXG4gICAgICAgIC8vcmV1c2UgdGFuYWthIGFzIGJhc2lzXG4gICAgICAgIGNvbnN0IHRzID0gVGFuYWthU3R5bGUuZ2V0KGNvbCwgb3B0cylcbiAgICAgICAgLy9zdHlsZSB0byBzaG93IGxpbWl0cyBiZXR3ZWVuIHBpZWNlc1xuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoe1xuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2JyxcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAodiwgciwgcywgeikgPT4gMC4yICogeixcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRzWzBdLFxuICAgICAgICAgICAgc3N0LFxuICAgICAgICAgICAgdHNbMV0sXG4gICAgICAgICAgICBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0LCBmaWx0ZXI6IG9wdHMuZmlsdGVyIH0pLFxuICAgICAgICBdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOnN0cmluZ30gY29sXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPFN0eWxlPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0Q2F0KGNvbCwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCBzID0gbmV3IFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUoeyBjb2xvckNvbDogY29sLCBjb2xvcjogb3B0cy5jb2xvciB9KVxuICAgICAgICAvL3N0eWxlIHRvIHNob3cgbGltaXRzIGJldHdlZW4gcGllY2VzXG4gICAgICAgIGNvbnN0IHNzdCA9IG5ldyBTdHJva2VTdHlsZSh7IHN0cm9rZUNvbG9yOiAoKSA9PiAnIzY2NicsIHN0cm9rZVdpZHRoOiAodiwgciwgcywgeikgPT4gMC4yICogeiB9KVxuXG4gICAgICAgIHJldHVybiBbcywgc3N0LCBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0IH0pXVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIHN0eWxlIHRvIGRyYXcgdG9wIGNpcmNsZSBvZiBsZWdvIGJyaWNrcy5cbiAqL1xuY2xhc3MgTGVnb1RvcFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdHx1bmRlZmluZWR9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgICAgIHRoaXMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgdGhpcy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcbiAgICB9XG5cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSAwLjYgKiBjZy5nZXRaZigpXG5cbiAgICAgICAgLy9kYXJrIHBhcnRcbiAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xEYXJrXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY2cuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgdHJ1ZSlcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9icmlnaHQgcGFydFxuICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbEJyaWdodFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGNnLmN0eC5hcmMoYy54ICsgciAqIDAuNSwgYy55ICsgciAqIDAuNSwgciAqIDAuNTUgKiAwLjUsIE1hdGguUEkgLyA0LCAtTWF0aC5QSSAqICgzIC8gNCksIGZhbHNlKVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTW9zYWljU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJylcblxuICAgICAgICAvKiogVGhlIG1vc2FpYyBmYWN0b3IsIHdpdGhpbiBbMCwwLjVdLiBTZXQgdG8gMCBmb3Igbm8gbW9zYWljIGVmZmVjdC4gU2V0IHRvIDAuNSBmb3Igc3Ryb25nIG1vc2FpYyBlZmZlY3QuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubW9zYWljRmFjdG9yID0gb3B0cy5tb3NhaWNGYWN0b3IgfHwgMC4xNVxuXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIHNoYWRvdyBmYWN0b3IsIHdpdGhpbiBbMCwwLjVdLiBTZXQgdG8gMCBmb3Igbm8gbW9zYWljIHNoYWRvdy4gU2V0IHRvIDAuNSBmb3Igc3Ryb25nIG1vc2FpYyBzaGFkb3cuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2hhZG93RmFjdG9yID0gb3B0cy5zaGFkb3dGYWN0b3IgfHwgMC4yXG5cbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGNvbG9yLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0NvbG9yID0gb3B0cy5zaGFkb3dDb2xvciB8fCAnIzU1NSdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgcmVzb2x1dGlvbiwgY2cpIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIGxldCBzdGF0Q29sb3JcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vc2V0IHN0cm9rZSBzdHlsZSwgZm9yIHNoYWRvd1xuICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXG4gICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB0aGlzLnNoYWRvd0ZhY3RvciAqIHJlc29sdXRpb25cbiAgICAgICAgY2cuY3R4LmxpbmVKb2luID0gJ3JvdW5kJ1xuICAgICAgICBjZy5jdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XG4gICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogdGhpcy5tb3NhaWNGYWN0b3JcbiAgICAgICAgY29uc3QgbW9zYWljID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgeDogTWF0aC5yYW5kb20oKSAqIGQsIHk6IE1hdGgucmFuZG9tKCkgKiBkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzIGluIGdlbyBjb29yZGluYXRlc1xuICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vc2V0IGZpbGwgY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGxbdGhpcy5jb2xvckNvbF0sIHJlc29sdXRpb24sIHN0YXRDb2xvcikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHpmKVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxuICAgICAgICAgICAgY29uc3QgbGwgPSBtb3NhaWMoKSxcbiAgICAgICAgICAgICAgICB1bCA9IG1vc2FpYygpLFxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXG4gICAgICAgICAgICAgICAgdXIgPSBtb3NhaWMoKVxuXG4gICAgICAgICAgICAvL3N0cm9rZVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93RmFjdG9yID4gMCkge1xuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgbGwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbGwueSlcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSBsci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsci55KVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIHVyLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1ci55KVxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2ZpbGxcblxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjZy5jdHgubW92ZVRvKGNlbGwueCArIG9mZnNldC5keCArIGxsLngsIGNlbGwueSArIG9mZnNldC5keSArIGxsLnkpXG4gICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSBsci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsci55KVxuICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXG4gICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHVsLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1bC55KVxuICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogcmVzb2x1dGlvbiwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKlxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTmluamFTdGFyU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpIC8vKHYscixzLHpmKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3Igc2l6ZS5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaXplQ29sID0gb3B0cy5zaXplQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCwgd2l0aGluIFswLDFdOlxuICAgICAgICAgKiAgLSAwLCBub3RoaW5nIHNob3duXG4gICAgICAgICAqICAtIDEsIGVudGlyZSBzcXVhcmVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKCgpID0+ICdvJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIGxldCBzdGF0U2l6ZVxuICAgICAgICBpZiAodGhpcy5zaXplQ29sKSB7XG4gICAgICAgICAgICAvL2lmIHNpemUgaXMgdXNlZCwgc29ydCBjZWxscyBieSBzaXplIHNvIHRoYXQgdGhlIGJpZ2dlc3QgYXJlIGRyYXduIGZpcnN0XG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMuc2l6ZUNvbF0gLSBjMVt0aGlzLnNpemVDb2xdKVxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRTaXplID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5zaXplQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGF0Q29sb3JcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzXG4gICAgICAgIC8vaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgY29uc3QgcjIgPSByICogMC41XG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGxbdGhpcy5jb2xvckNvbF0sIHIsIHN0YXRDb2xvciwgemYpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjZWxsKSA6ICdvJ1xuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2l6ZVxuICAgICAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICAgICAgbGV0IHNfID0gdGhpcy5zaXplIHx8ICgoKSA9PiAwLjUpXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBnZW8gdW5pdFxuICAgICAgICAgICAgY29uc3Qgc0cyID0gc18oY2VsbFt0aGlzLnNpemVDb2xdLCByLCBzdGF0U2l6ZSwgemYpICogcjJcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAvL1RPRE8gdXNlXG4gICAgICAgICAgICAvL2NvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHIsIHpmKVxuXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByMlxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdwJykge1xuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5ICsgcjIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHIyLCBjeSlcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4LCBjeSAtIHIyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSBzRzIsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSByMiwgY3kpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ28nKSB7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjeCwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHIyLCBjeSArIHIyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyBzRzIsIGN5KVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4LCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4IC0gcjIsIGN5IC0gcjIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSArIHIyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHIsIHpmOiB6Ziwgc1NpemU6IHN0YXRTaXplLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBQaWxsYXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvL1RPRE8gbWFrZSBhIHdlYkdMIHZlcnNpb24gP1xuXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmhlaWdodENvbCA9IG9wdHMuaGVpZ2h0Q29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHRcblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI2MwOGM1OScpIC8vYmJcblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy53aWR0aENvbCA9IG9wdHMud2lkdGhDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHYsIHIpID0+IDAuNSAqIHIpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnNpbXBsZSA9IG9wdHMuc2ltcGxlICE9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgPSBvcHRzLnZpZXdIZWlnaHRGYWN0b3IgfHwgMS41XG4gICAgICAgIC8vMCwwIGlzIHRoZSBjZW50ZXJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld1NYID0gb3B0cy52aWV3U1ggPT0gdW5kZWZpbmVkID8gMCA6IG9wdHMudmlld1NYXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnZpZXdTWSA9IG9wdHMudmlld1NZID09IHVuZGVmaW5lZCA/IC0wLjUgOiBvcHRzLnZpZXdTWVxuXG4gICAgICAgIC8vVE9ETyByZXBsYWNlIHdpdGggc3VuIGxvY2F0aW9uID9cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2hhZG93RGlyZWN0aW9uID1cbiAgICAgICAgICAgIG9wdHMuc2hhZG93RGlyZWN0aW9uID09IHVuZGVmaW5lZCA/ICgtNDAuMyAqIE1hdGguUEkpIC8gMTgwLjAgOiBvcHRzLnNoYWRvd0RpcmVjdGlvblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjNcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBvcHRzLnNoYWRvd0NvbG9yIHx8ICcjMDAwMDAwMzMnXG5cbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMub3V0bGluZUNvbCA9IG9wdHMub3V0bGluZUNvbCB8fCAnI0ZGRkZGRidcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3V0bGluZVdpZHRoUGl4ID0gb3B0cy5vdXRsaW5lV2lkdGhQaXggPT0gdW5kZWZpbmVkID8gMC41IDogb3B0cy5vdXRsaW5lV2lkdGhQaXhcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgbGV0IHN0YXRIZWlnaHRcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0Q29sKSB7XG4gICAgICAgICAgICAvL2NvbXB1dGUgc2l6ZSB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0SGVpZ2h0ID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5oZWlnaHRDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRDb2xvclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRXaWR0aFxuICAgICAgICBpZiAodGhpcy53aWR0aENvbCkge1xuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRXaWR0aCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMud2lkdGhDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9nZXQgdmlldyBjZW50ZXIgZ2VvIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IGN2eCA9IGNnLmdldENlbnRlcigpLnggKyB0aGlzLnZpZXdTWCAqIGNnLncgKiB6ZlxuICAgICAgICBjb25zdCBjdnkgPSBjZy5nZXRDZW50ZXIoKS55ICsgdGhpcy52aWV3U1kgKiBjZy5oICogemZcbiAgICAgICAgLy9nZXQgdmlldyBoZWlnaHRcbiAgICAgICAgY29uc3QgSCA9IHRoaXMudmlld0hlaWdodEZhY3RvciAqIChjZy53ICsgY2cuaCkgKiAwLjUgKiB6ZlxuXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8vY29uc3QgZGlzdFRvVmlld0NlbnRlciA9IChjKSA9PiB7IGNvbnN0IGR4ID0gY3Z4IC0gYy54LCBkeSA9IGN2eSAtIGMueTsgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgfVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IDEwMDAwMDAwMCAqIChjMi55IC0gYzEueSkgKyBjMS54IC0gYzIueClcblxuICAgICAgICBjZy5jdHgubGluZUNhcCA9IHRoaXMuc2ltcGxlID8gJ2J1dHQnIDogJ3JvdW5kJ1xuXG4gICAgICAgIC8vZHJhdyBpbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAvL2RyYXcgc2hhZG93c1xuICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXG4gICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY1t0aGlzLndpZHRoQ29sXSwgciwgc3RhdFdpZHRoLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2hlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGNbdGhpcy5oZWlnaHRDb2xdLCByLCBzdGF0SGVpZ2h0LCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghaEcgfHwgaEcgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIC8vVE9ETyB1c2UgdGhhdFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgciwgemYpXG5cbiAgICAgICAgICAgIC8vc2V0IHdpZHRoXG4gICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd0dcblxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbGwgY2VudHJlIHBvc3RpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjLnggKyByIC8gMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjLnkgKyByIC8gMlxuICAgICAgICAgICAgY29uc3QgbHMgPSBoRyAqIHRoaXMuc2hhZG93RmFjdG9yXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGxzICogTWF0aC5jb3ModGhpcy5zaGFkb3dEaXJlY3Rpb24pLCBjeSArIGxzICogTWF0aC5zaW4odGhpcy5zaGFkb3dEaXJlY3Rpb24pKVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICBpZiAodGhpcy5zaW1wbGUpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgYmFzZSBjaXJjbGVcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyhcbiAgICAgICAgICAgICAgICAgICAgY3gsIGN5LFxuICAgICAgICAgICAgICAgICAgICB3RyAqIDAuNSxcbiAgICAgICAgICAgICAgICAgICAgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpO1xuICAgICAgICAgICAgfSovXG4gICAgICAgIH1cblxuICAgICAgICAvL2RyYXcgcGlsbGFyc1xuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcblxuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjW3RoaXMud2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vaGVpZ2h0XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY1t0aGlzLmhlaWdodENvbF0sIHIsIHN0YXRIZWlnaHQsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcblxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbGwgY2VudHJlIHBvc3RpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjLnggKyByIC8gMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjLnkgKyByIC8gMlxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gY3ggLSBjdngsXG4gICAgICAgICAgICAgICAgZHkgPSBjeSAtIGN2eVxuICAgICAgICAgICAgY29uc3QgYSA9IE1hdGguYXRhbjIoZHksIGR4KVxuICAgICAgICAgICAgY29uc3QgRCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSlcbiAgICAgICAgICAgIGNvbnN0IGQgPSAoRCAqIGhHKSAvIChIIC0gaEcpXG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNpbXBsZSkge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBiYWNrZ3JvdW5kIHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd0cgKyAyICogdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6ZlxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGN4LCBjeSlcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgIC8vZHJhdyB0b3AgY2lyY2xlXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5vdXRsaW5lQ29sXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbFN0eWxlID0gXCIjYzA4YzU5XCJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6ZlxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpLCB3RyAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIC8vY2cuY3R4LmZpbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vaW4gY2FzZS4uLlxuICAgICAgICBjZy5jdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHIsIHpmOiB6Ziwgc0NvbG9yOiBzdGF0Q29sb3IgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB3aGVyZSBlYWNoIGNlbGwgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZWdtZW50IHdob3NlIGxlbmd0aCwgd2lkdGgsIGNvbG9yIGFuZCBvcmllbnRhdGlvbiBjYW4gdmFyeSBhY2NvcmRpbmcgdG8gc3RhdGlzdGljYWwgdmFsdWVzLlxuICpcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNlZ21lbnRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBvcmllbnRhdGlvbiAoaW4gZGVncmVlcykgb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAoKCkgPT4gMClcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsIHNlZ21lbnQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubGVuZ3RoQ29sID0gb3B0cy5sZW5ndGhDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLndpZHRoQ29sID0gb3B0cy53aWR0aENvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzZWdtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIGxldCBzdGF0Q29sb3JcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGF0TGVuZ3RoXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aENvbCkge1xuICAgICAgICAgICAgLy9pZiBsZW5ndGggaXMgdXNlZCwgc29ydCBjZWxscyBieSBsZW5ndGggc28gdGhhdCB0aGUgbG9uZ2VzdHMgYXJlIGRyYXduIGZpcnN0XG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMubGVuZ3RoQ29sXSAtIGMxW3RoaXMubGVuZ3RoQ29sXSlcbiAgICAgICAgICAgIC8vYW5kIGNvbXB1dGUgc2l6ZSB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0TGVuZ3RoID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5sZW5ndGhDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRXaWR0aFxuICAgICAgICBpZiAodGhpcy53aWR0aENvbCkge1xuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRXaWR0aCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMud2lkdGhDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSAnYnV0dCdcblxuICAgICAgICAvL2NvbnZlcnNpb24gZmFjdG9yIGRlZ3JlZSAtPiByYWRpYW5cbiAgICAgICAgY29uc3QgZiA9IE1hdGguUEkgLyAxODBcblxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY1t0aGlzLmNvbG9yQ29sXSwgciwgc3RhdENvbG9yKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY1t0aGlzLndpZHRoQ29sXSwgciwgc3RhdFdpZHRoLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2xlbmd0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKGNbdGhpcy5sZW5ndGhDb2xdLCByLCBzdGF0TGVuZ3RoLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghbEcgfHwgbEcgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL29yaWVudGF0aW9uIChpbiByYWRpYW4pXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IG9yID0gdGhpcy5vcmllbnRhdGlvbihjKSAqIGZcbiAgICAgICAgICAgIGlmIChvciA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9yKSkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcblxuICAgICAgICAgICAgLy9zZXQgY29sb3IgYW5kIHdpZHRoXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcbiAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCBjZW50cmUgcG9zdGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGMueCArIHIgLyAyICsgb2Zmc2V0LmR4XG4gICAgICAgICAgICBjb25zdCBjeSA9IGMueSArIHIgLyAyICsgb2Zmc2V0LmR5XG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IGRpcmVjdGlvblxuICAgICAgICAgICAgY29uc3QgZHggPSAwLjUgKiBNYXRoLmNvcyhvcikgKiBsR1xuICAgICAgICAgICAgY29uc3QgZHkgPSAwLjUgKiBNYXRoLnNpbihvcikgKiBsR1xuXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjZy5jdHgubW92ZVRvKGN4IC0gZHgsIGN5IC0gZHkpXG4gICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgZHgsIGN5ICsgZHkpXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZCwgaWYgYW55XG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7XG4gICAgICAgICAgICBzdHlsZTogdGhpcyxcbiAgICAgICAgICAgIHI6IHIsXG4gICAgICAgICAgICB6ZjogemYsXG4gICAgICAgICAgICBzQ29sb3I6IHN0YXRDb2xvcixcbiAgICAgICAgICAgIHNMZW5ndGg6IHN0YXRMZW5ndGgsXG4gICAgICAgICAgICBzV2lkdGg6IHN0YXRXaWR0aCxcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKlxuICogQSB2ZXJ5IGdlbmVyaWMgc3R5bGUgdGhhdCBzaG93cyBncmlkIGNlbGxzIHdpdGggc3BlY2lmaWMgY29sb3IsIHNpemUgYW5kIHNoYXBlLlxuICogSXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB2YXJpYWJsZXMgYXMgY2VsbCBjb2xvcnMsIGNlbGwgc2l6ZSwgY2VsbCBzaGFwZSwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSB2aXN1YWwgdmFyaWFibGVzLlxuICpcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXBlQ29sb3JTaXplU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpIC8vKHYscixzLHpmKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3Igc2l6ZS5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaXplQ29sID0gb3B0cy5zaXplQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTppbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKCgpID0+ICdzcXVhcmUnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIGxldCBzdGF0U2l6ZVxuICAgICAgICBpZiAodGhpcy5zaXplQ29sKSB7XG4gICAgICAgICAgICAvL2lmIHNpemUgaXMgdXNlZCwgc29ydCBjZWxscyBieSBzaXplIHNvIHRoYXQgdGhlIGJpZ2dlc3QgYXJlIGRyYXduIGZpcnN0XG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMuc2l6ZUNvbF0gLSBjMVt0aGlzLnNpemVDb2xdKVxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRTaXplID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5zaXplQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGF0Q29sb3JcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzXG4gICAgICAgIC8vaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgY29uc3QgcjIgPSByICogMC41XG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGxbdGhpcy5jb2xvckNvbF0sIHIsIHN0YXRDb2xvciwgemYpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjZWxsKSA6ICdzcXVhcmUnXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9zaXplXG4gICAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgICAgICBsZXQgc18gPSB0aGlzLnNpemUgfHwgKCgpID0+IHIpXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBnZW8gdW5pdFxuICAgICAgICAgICAgY29uc3Qgc0cgPSBzXyhjZWxsW3RoaXMuc2l6ZUNvbF0sIHIsIHN0YXRTaXplLCB6ZilcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6ZilcblxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmVcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gciAqICgxIC0gc0cgLyByKSAqIDAuNVxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdChjZWxsLnggKyBkICsgb2Zmc2V0LmR4LCBjZWxsLnkgKyBkICsgb2Zmc2V0LmR5LCBzRywgc0cpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKGNlbGwueCArIHIyICsgb2Zmc2V0LmR4LCBjZWxsLnkgKyByMiArIG9mZnNldC5keSwgc0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGRvbnV0XG4gICAgICAgICAgICAgICAgY29uc3QgeGMgPSBjZWxsLnggKyByMiArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgeWMgPSBjZWxsLnkgKyByMiArIG9mZnNldC5keVxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoeGMsIHljLCByMiwgMCwgMiAqIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyh4YywgeWMsICgxIC0gc0cgLyByKSAqIHIyLCAwLCAyICogTWF0aC5QSSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICBjZy5jdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzMiA9IHNHICogMC41XG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjZWxsLnggKyByMiAtIHMyLCBjZWxsLnkgKyByMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMiArIHMyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIgKyBzMiwgY2VsbC55ICsgcjIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiwgY2VsbC55ICsgcjIgLSBzMilcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYsIHNTaXplOiBzdGF0U2l6ZSwgc0NvbG9yOiBzdGF0Q29sb3IgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7e3g6bnVtYmVyLHk6bnVtYmVyLG9yOlwidlwifFwiaFwiLHYxOnN0cmluZ3x1bmRlZmluZWQsdjI6c3RyaW5nfHVuZGVmaW5lZH19IFNpZGUgKi9cblxuLyoqXG4gKiBBIHN0eWxlIHRvIHNob3cgdGhlIHNpZGVzIG9mIGdyaWQgY2VsbHMgYmFzZWQgb24gdGhlaXIgZGlmZmVyZW50IGNhdGVnb3JpZXMuXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2lkZUNhdFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgY2F0ZWdvcmljYWwgdmFsdWUuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sID0gb3B0cy5jb2xcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIGEgY2VsbCBzaWRlIGxpbmUsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlLCByLCB6KSA9PiByICogMC4yKVxuXG4gICAgICAgIC8qKiBBIGZpbGwgY29sb3IgZm9yIHRoZSBjZWxscy5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIGlmICghY2VsbHMgfHwgY2VsbHMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPFNpZGU+fSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXG5cbiAgICAgICAgLy9tYWtlIGhvcml6b250YWwgc2lkZXNcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHggYW5kIHlcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAoYzIueCA9PSBjMS54ID8gYzEueSAtIGMyLnkgOiBjMS54IC0gYzIueCkpXG4gICAgICAgIGxldCBjMSA9IGNlbGxzWzBdXG4gICAgICAgIGxldCB2MSA9IGMxW3RoaXMuY29sXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuICAgICAgICAgICAgbGV0IHYyID0gYzJbdGhpcy5jb2xdXG5cbiAgICAgICAgICAgIGlmIChjMS55ICsgciA9PSBjMi55ICYmIGMxLnggPT0gYzIueCkge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSBjb2x1bW4gYW5kIHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxuICAgICAgICAgICAgICAgIGlmICh2MSAhPSB2Mikgc2lkZXMucHVzaCh7IHg6IGMxLngsIHk6IGMyLnksIG9yOiAnaCcsIHYxOiB2MSwgdjI6IHYyIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHRvcCBvbmUgZm9yIGMxLCBib3R0b20gZm9yIGMyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7IHg6IGMxLngsIHk6IGMxLnkgKyByLCBvcjogJ2gnLCB2MTogdjEsIHYyOiB1bmRlZmluZWQgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHsgeDogYzIueCwgeTogYzIueSwgb3I6ICdoJywgdjE6IHVuZGVmaW5lZCwgdjI6IHYyIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGMxID0gYzJcbiAgICAgICAgICAgIHYxID0gdjJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbWFrZSB2ZXJ0aWNhbCBzaWRlc1xuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeSBhbmQgeFxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi55ID09IGMxLnkgPyBjMS54IC0gYzIueCA6IGMxLnkgLSBjMi55KSlcbiAgICAgICAgYzEgPSBjZWxsc1swXVxuICAgICAgICB2MSA9IGMxW3RoaXMuY29sXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuICAgICAgICAgICAgbGV0IHYyID0gYzJbdGhpcy5jb2xdXG5cbiAgICAgICAgICAgIGlmIChjMS54ICsgciA9PSBjMi54ICYmIGMxLnkgPT0gYzIueSkge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBpZiAodjEgIT0gdjIpIHNpZGVzLnB1c2goeyB4OiBjMS54ICsgciwgeTogYzEueSwgb3I6ICd2JywgdjE6IHYxLCB2MjogdjIgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHJpZ2h0IG9uZSBmb3IgYzEsIGxlZnQgZm9yIGMyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7IHg6IGMxLnggKyByLCB5OiBjMS55LCBvcjogJ3YnLCB2MTogdjEsIHYyOiB1bmRlZmluZWQgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHsgeDogYzIueCwgeTogYzIueSwgb3I6ICd2JywgdjE6IHVuZGVmaW5lZCwgdjI6IHYyIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGMxID0gYzJcbiAgICAgICAgICAgIHYxID0gdjJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xuICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vZHJhdyBjZWxscywgaWYgZmlsbENvbG9yIHNwZWNpZmllZFxuICAgICAgICBpZiAodGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbGxDb2xvcihjKVxuICAgICAgICAgICAgICAgIGlmICghZmMgfHwgZmMgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdChjLngsIGMueSwgciwgcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvL2RyYXcgc2lkZXNcbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSAnYnV0dCdcbiAgICAgICAgZm9yIChsZXQgcyBvZiBzaWRlcykge1xuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzLCByLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPD0gMCkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IHcyID0gd0cgKiAwLjVcblxuICAgICAgICAgICAgLy9zZXQgY29sb3IgYW5kIHdpZHRoXG4gICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd0dcblxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnQgd2l0aCBjb3JyZWN0IG9yaWVudGF0aW9uXG4gICAgICAgICAgICBpZiAocy5vciA9PT0gJ2gnKSB7XG4gICAgICAgICAgICAgICAgLy90b3AgbGluZVxuICAgICAgICAgICAgICAgIGlmIChzLnYyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW3MudjJdXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8ocy54LCBzLnkgKyB3MilcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhzLnggKyByLCBzLnkgKyB3MilcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9ib3R0b20gbGluZVxuICAgICAgICAgICAgICAgIGlmIChzLnYxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW3MudjFdXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8ocy54LCBzLnkgLSB3MilcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhzLnggKyByLCBzLnkgLSB3MilcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3JpZ2h0IGxpbmVcbiAgICAgICAgICAgICAgICBpZiAocy52Mikge1xuICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltzLnYyXVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHMueCArIHcyLCBzLnkpXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8ocy54ICsgdzIsIHMueSArIHIpXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vbGVmdCBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKHMudjEpIHtcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3Jbcy52MV1cbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLnggLSB3Miwgcy55KVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKHMueCAtIHcyLCBzLnkgKyByKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7e3g6bnVtYmVyLHk6bnVtYmVyLG9yOlwidlwifFwiaFwiLHZhbHVlOm51bWJlcn19IFNpZGUgKi9cblxuLyoqXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2lkZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIHRoZSBjZWxsIHZhbHVlcy5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy52YWx1ZUNvbCA9IG9wdHMudmFsdWVDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHZhbHVlIG9mIGEgY2VsbCBzaWRlLiBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gdGhlIHR3byBhZGphY2VudCBjZWxsIHZhbHVlcy5cbiAgICAgICAgICogRm9yIGhvcml6b250YWwgc2lkZXMsIHYxIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY2VsbCBiZWxvdyBhbmQgdjIgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIGFib3ZlLlxuICAgICAgICAgKiBGb3IgdmVydGljYWwgc2lkZXMsIHYxIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY2VsbCBsZWZ0IGFuZCB2MiB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgcmlnaHQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXJ8dW5kZWZpbmVkLG51bWJlcnx1bmRlZmluZWQsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnZhbHVlID0gb3B0cy52YWx1ZSB8fCAoKHYxLCB2MiwgciwgcywgemYpID0+IDEpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiBhIGNlbGwgc2lkZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgYSBjZWxsIHNpZGUsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlLCByLCBzLCB6ZikgPT4gKHIgKiBzaWRlLnZhbHVlKSAvIDUpXG5cbiAgICAgICAgLyoqIG9yaWVudGF0aW9uLiBTZXQgdG8gOTAgdG8gc2hvdyBzaWRlcyBhcyBzbG9wZSBsaW5lcyBmb3IgZXhhbXBsZS5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxuXG4gICAgICAgIC8qKiBBIGZpbGwgY29sb3IgZm9yIHRoZSBjZWxscy5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vem9vbSBmYWN0b3JcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXG5cbiAgICAgICAgLy9jb21wdXRlIHN0YXRzIG9uIGNlbGwgdmFsdWVzXG4gICAgICAgIGxldCBzdGF0VmFsdWVcbiAgICAgICAgaWYgKHRoaXMudmFsdWVDb2wpIHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0VmFsdWUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnZhbHVlQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBbXVxuXG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSByICogMC4wMDFcblxuICAgICAgICAvL21ha2UgaG9yaXpvbnRhbCBzaWRlc1xuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeCBhbmQgeVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi54ID09IGMxLnggPyBjMS55IC0gYzIueSA6IGMxLnggLSBjMi54KSlcbiAgICAgICAgbGV0IGMxID0gY2VsbHNbMF1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMyID0gY2VsbHNbaV1cblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGMxLnkgKyByIC0gYzIueSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhjMS54IC0gYzIueCkgPD0gZXBzaWxvbilcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgY29sdW1uIGFuZCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSxcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUoYzFbdGhpcy52YWx1ZUNvbF0sIGMyW3RoaXMudmFsdWVDb2xdLCByLCBzdGF0VmFsdWUsIHpmKSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgaG9yaXpvbnRhbCBzaWRlXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogdG9wIG9uZSBmb3IgYzEsIGJvdHRvbSBmb3IgYzJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSArIHIsXG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlKGMxW3RoaXMudmFsdWVDb2xdLCB1bmRlZmluZWQsIHIsIHN0YXRWYWx1ZSwgemYpLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHg6IGMyLngsXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlKHVuZGVmaW5lZCwgYzJbdGhpcy52YWx1ZUNvbF0sIHIsIHN0YXRWYWx1ZSwgemYpLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGMxID0gYzJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbWFrZSB2ZXJ0aWNhbCBzaWRlc1xuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeSBhbmQgeFxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi55ID09IGMxLnkgPyBjMS54IC0gYzIueCA6IGMxLnkgLSBjMi55KSlcbiAgICAgICAgYzEgPSBjZWxsc1swXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoYzEueCArIHIgLSBjMi54KSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGMxLnkgLSBjMi55KSA8PSBlcHNpbG9uKVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHIsXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnksXG4gICAgICAgICAgICAgICAgICAgIG9yOiAndicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlKGMxW3RoaXMudmFsdWVDb2xdLCBjMlt0aGlzLnZhbHVlQ29sXSwgciwgc3RhdFZhbHVlLCB6ZiksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiByaWdodCBvbmUgZm9yIGMxLCBsZWZ0IGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSxcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUoYzFbdGhpcy52YWx1ZUNvbF0sIHVuZGVmaW5lZCwgciwgc3RhdFZhbHVlLCB6ZiksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSxcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUodW5kZWZpbmVkLCBjMlt0aGlzLnZhbHVlQ29sXSwgciwgc3RhdFZhbHVlLCB6ZiksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgICAgICAvL2NvbXB1dGUgc3RhdHMgb24gc2lkZXNcbiAgICAgICAgY29uc3Qgc3RhdFNpZGVzID0gU2lkZVN0eWxlLmdldFNpZGVTdGF0aXN0aWNzKHNpZGVzLCB0cnVlKVxuXG4gICAgICAgIC8vZHJhdyBpbiBnZW8gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAvL2RyYXcgY2VsbHMsIGlmIGZpbGxDb2xvciBzcGVjaWZpZWRcbiAgICAgICAgaWYgKHRoaXMuZmlsbENvbG9yKVxuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWxsQ29sb3IoYylcbiAgICAgICAgICAgICAgICBpZiAoIWZjIHx8IGZjID09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gZmNcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoYy54LCBjLnksIHIsIHIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHNpZGVzXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGNvbnN0IHIyID0gciAvIDJcbiAgICAgICAgZm9yIChsZXQgcyBvZiBzaWRlcykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3Iocywgciwgc3RhdFNpZGVzLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgocywgciwgc3RhdFNpZGVzLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPD0gMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9zZXQgY29sb3IgYW5kIHdpZHRoXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcbiAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT0gOTApIHtcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHMueCArIHIyLCBzLnkgKyByMilcbiAgICAgICAgICAgICAgICBpZiAocy5vciA9PT0gJ2gnKSBjZy5jdHgubGluZVRvKHMueCArIHIyLCBzLnkgLSByMilcbiAgICAgICAgICAgICAgICBlbHNlIGNnLmN0eC5saW5lVG8ocy54IC0gcjIsIHMueSArIHIyKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHMueCwgcy55KVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8ocy54ICsgKHMub3IgPT09ICdoJyA/IHIgOiAwKSwgcy55ICsgKHMub3IgPT09ICd2JyA/IHIgOiAwKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBzb21lIHN0YXRpc3RpY3Mgb24gYSB2YWx1ZSBvZiBzb21lIHNpZGVzLlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgaG93IHRvIGRyYXcgc3BlY2lmaWNhbGx5IHRoZSBzaWRlcyB3aXRoaW4gdGhlIHZpZXcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTaWRlPn0gc2lkZXNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVplcm9zXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQgfCB1bmRlZmluZWR9XG4gICAgICovXG4gICAgc3RhdGljIGdldFNpZGVTdGF0aXN0aWNzKHNpZGVzLCBpZ25vcmVaZXJvcykge1xuICAgICAgICBpZiAoIXNpZGVzIHx8IHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIGxldCBtaW4gPSBJbmZpbml0eVxuICAgICAgICBsZXQgbWF4ID0gLUluZmluaXR5XG4gICAgICAgIC8vbGV0IHN1bSA9IDBcbiAgICAgICAgLy9sZXQgbmIgPSAwXG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBzaWRlcykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHMudmFsdWVcbiAgICAgICAgICAgIGlmIChpZ25vcmVaZXJvcyAmJiAhdikgY29udGludWVcbiAgICAgICAgICAgIGlmICh2IDwgbWluKSBtaW4gPSB2XG4gICAgICAgICAgICBpZiAodiA+IG1heCkgbWF4ID0gdlxuICAgICAgICAgICAgLy9zdW0gKz0gdlxuICAgICAgICAgICAgLy9uYisrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWluOiBtaW4sIG1heDogbWF4IH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzJ1xuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXG5cbi8qKlxuICogU3R5bGUgYmFzZWQgb24gd2ViR0xcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCBmcm9tIGNhdGVnb3JpZXMuXG4gKiBBbGxzIHNxdWFyZXMgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JDYXRXR0xTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIGNhdGVnb3J5IG9mIHRoZSBjZWxsLCBmb3IgY29sb3JpbmcuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIG9wdHMuY29sb3IgPSBvcHRzLmNvbG9yIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdHMuY29sb3IpXG5cbiAgICAgICAgLyoqIEB0eXBlIHsgb2JqZWN0IH0gQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jYXRUb0kgPSB7fVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHRoaXMuY2F0VG9JW2tleXNbaV1dID0gaSArICcnXG5cbiAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPHN0cmluZz4gfSBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNvbG9ycyA9IFtdXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5jb2xvcnMucHVzaChvcHRzLmNvbG9yWycnICsga2V5c1tpXV0pXG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6ZikgPT4gLi4uXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHsgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIH0gKi9cbiAgICAgICAgdGhpcy53Z3AgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkKHRoaXMuY29sb3JzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgZHJhdycpXG5cbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb20gZmFjdG9yXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxuXG4gICAgICAgIC8vYWRkIHZlcnRpY2UgYW5kIGZyYWdtZW50IGRhdGFcbiAgICAgICAgY29uc3QgcjIgPSByIC8gMlxuICAgICAgICBsZXQgYyxcbiAgICAgICAgICAgIG5iID0gY2VsbHMubGVuZ3RoXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgY29uc3QgaUJ1ZmZlciA9IFtdXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgYyA9IGNlbGxzW2ldXG4gICAgICAgICAgICBjb25zdCBjYXQgPSBjW3RoaXMuY29sb3JDb2xdXG4gICAgICAgICAgICBpZiAoY2F0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5OiAnICsgY2F0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IGlfID0gdGhpcy5jYXRUb0lbY2F0XVxuICAgICAgICAgICAgaWYgKGlzTmFOKCtpXykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeSBpbmRleDogJyArIGNhdCArICcgJyArIGlfKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGMueCArIHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgIGlCdWZmZXIucHVzaCgraV8pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWJnbCBwcm9ncmFtIGlucHV0cyBwcmVwYXJhdGlvbicpXG5cbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxuICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhjZy53ICsgJycsIGNnLmggKyAnJylcbiAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViIEdMIGNhbnZhcyBjcmVhdGlvbicpXG5cbiAgICAgICAgLy9kcmF3XG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUociwgemYpIDogciArIDAuMiAqIHpmXG4gICAgICAgIHRoaXMud2dwLmRyYXcoY3ZXR0wuZ2wsIHZlcnRpY2VzQnVmZmVyLCBpQnVmZmVyLCBjZy5nZXRXZWJHTFRyYW5zZm9ybSgpLCBzaXplR2VvIC8gemYpXG5cbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViZ2wgZHJhd2luZycpXG5cbiAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIGNnLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxuXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIGNhbnZhcyBkcmF3aW5nJylcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogU3F1YXJlQ29sb3JDYXRXR0xTdHlsZSBlbmQgZHJhdycpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZCB9IGZyb20gJy4uL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZC5qcydcbmltcG9ydCB7IG1vbml0b3IsIG1vbml0b3JEdXJhdGlvbiB9IGZyb20gJy4uL3V0aWxzL1V0aWxzLmpzJ1xuXG4vKipcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXG4gKiBUbyBzaG93IGNlbGxzIGFzIGNvbG9yZWQgc3F1YXJlcywgd2l0aCBjb21wdXRhdGlvbiBvZiB0aGUgY29sb3JzIG9uIEdQVSBzaWRlIChmYXN0ZXIgdGhhbiBKYXZhU2NyaXB0IHNpZGUpLlxuICogQWxscyBzcXVhcmVzIHdpdGggdGhlIHNhbWUgc2l6ZVxuICpcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNxdWFyZUNvbG9yV0dMU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0IHZhbHVlICh3aXRoaW4gWzAsMV0pIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudEZ1biA9IG9wdHMudEZ1biB8fCAoKHYsIHIsIHMpID0+IHYgLyBzLm1heClcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzdHJpYnV0aW9uIHN0cmV0Y2hpbmcgbWV0aG9kLlxuICAgICAgICAgKiBUaGUgc3RyZXRjaGluZyBpcyBwZXJmb3JtZWQgb24gR1BVIHNpZGUgKGZyYWdtZW50IHNoYWRlcikuXG4gICAgICAgICAqIEB0eXBlIHt7IGZ1bjpzdHJpbmcsIGFscGhhOm51bWJlciB9fSAqL1xuICAgICAgICB0aGlzLnN0cmV0Y2hpbmcgPSBvcHRzLnN0cmV0Y2hpbmdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNhbXBsZSBvZiB0aGUgY29sb3IgcmFtcC5cbiAgICAgICAgICogVGhlIGNvbG9yIGlzIGNvbXB1dGVkIG9uIEdQVSBzaWRlIChmcmFnbWVudCBzaGFkZXIpIGJhc2VkIG9uIHRob3NlIHZhbHVlcyAobGluZWFyIGludGVycG9sYXRpb24pLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXG4gICAgICAgIHRoaXMuY29sb3JzID1cbiAgICAgICAgICAgIG9wdHMuY29sb3JzIHx8XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ3JnYigxNTgsIDEsIDY2KScsXG4gICAgICAgICAgICAgICAgJ3JnYigyNDgsIDE0MiwgODMpJyxcbiAgICAgICAgICAgICAgICAncmdiKDI1MSwgMjQ4LCAxNzYpJyxcbiAgICAgICAgICAgICAgICAncmdiKDEzNywgMjA3LCAxNjUpJyxcbiAgICAgICAgICAgICAgICAncmdiKDk0LCA3OSwgMTYyKScsXG4gICAgICAgICAgICBdLnJldmVyc2UoKVxuICAgICAgICBpZiAob3B0cy5jb2xvcilcbiAgICAgICAgICAgIHRoaXMuY29sb3JzID0gW1xuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMCksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjIpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMC40KSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNiksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjgpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMSksXG4gICAgICAgICAgICBdXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSB0aGUgb3BhY2l0eSBvZiB0aGUgc3R5bGUsIHdpdGhpbiBbMCwxXS5cbiAgICAgICAgICogSWYgdGhpcyBvcGFjaXR5IGlzIGRlZmluZWQsIHRoZSBpbmRpdmlkdWFsIGNvbG9yIG9wYWNpdHkgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcHRzLm9wYWNpdHkgLy8gKHIsemYpID0+IC4uLlxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgY2VsbHMsIGluIGdlb2dyYXBoaWNhbCB1bml0LiBBbGwgY2VsbHMgaGF2ZSB0aGUgc2FtZSBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgLy8gKHJlc29sdXRpb24sIHpmKSA9PiAuLi5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBTcXVhcmVDb2xvcldHTFN0eWxlIGRyYXcnKVxuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICBjb25zdCBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgY29sb3Igc3RhdHMgY29tcHV0YXRpb24nKVxuXG4gICAgICAgIGlmICghc3RhdENvbG9yKSByZXR1cm5cblxuICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgIC8vZm9yIG9wYWNpdHkgY29udHJvbCwgc2VlOiBodHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLWFuZC1hbHBoYS5odG1sXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKFxuICAgICAgICAgICAgY2cudyArICcnLFxuICAgICAgICAgICAgY2cuaCArICcnLFxuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ICE9IHVuZGVmaW5lZCA/IHsgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSB9IDogdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViIEdMIGNhbnZhcyBjcmVhdGlvbicpXG5cbiAgICAgICAgLy9hZGQgdmVydGljZSBhbmQgZnJhZ21lbnQgZGF0YVxuICAgICAgICBjb25zdCByMiA9IHIgLyAyXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgY29uc3QgdEJ1ZmZlciA9IFtdXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnRGdW4oY1t0aGlzLmNvbG9yQ29sXSwgciwgc3RhdENvbG9yKVxuICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCB8fCB0ID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goYy54ICsgcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgdEJ1ZmZlci5wdXNoKHQgPiAxID8gMSA6IHQgPCAwID8gMCA6IHQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWJnbCBkcmF3aW5nIGRhdGEgcHJlcGFyYXRpb24nKVxuXG4gICAgICAgIC8vY29tcHV0ZSBwaXhlbCBzaXplXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUociwgemYpIDogciArIDAuMiAqIHpmXG5cbiAgICAgICAgLy9jb21wdXRlIG9wYWNpdHlcbiAgICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wYWNpdHkgPyB0aGlzLm9wYWNpdHkociwgemYpIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3Qgd2dwID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZChjdldHTC5nbCwgdGhpcy5jb2xvcnMsIHRoaXMuc3RyZXRjaGluZywgc2l6ZUdlbyAvIHpmLCBvcClcblxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWJnbCBwcm9ncmFtIHByZXBhcmF0aW9uJylcblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgd2dwLmRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIGNnLmdldFdlYkdMVHJhbnNmb3JtKCkpXG5cbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViZ2wgZHJhd2luZycpXG5cbiAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIGNnLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxuXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIGNhbnZhcyBkcmF3aW5nJylcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYsIHNDb2xvcjogc3RhdENvbG9yIH0pXG5cbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIFNxdWFyZUNvbG9yV0dMU3R5bGUgZW5kIGRyYXcnKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcblxuLyoqXG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3Ryb2tlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3JDb2wgPSBvcHRzLnN0cm9rZUNvbG9yQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgc3Ryb2tlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAoKCkgPT4gJyM2NjYnKVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3Igc2l6ZS5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaXplQ29sID0gb3B0cy5zaXplQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxuXG4gICAgICAgIC8qKiBUaGUgc3Ryb2tlIGxpbmUgd2lkdGgsIGluIHBpeGVscy5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aENvbCA9IG9wdHMuc3Ryb2tlV2lkdGhDb2xcblxuICAgICAgICAvKiogVGhlIHN0cm9rZSBsaW5lIHdpZHRoIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggLy8gKHYscixzLHopPT4uLi5cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6aW1wb3J0KFwiLi4vU3R5bGVcIikuU2hhcGV9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICgoKSA9PiAnc3F1YXJlJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMsIHdpdGggdmFyaW91cyBjb2xvcnMgYW5kIHNpemUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICBsZXQgc3RhdENvbG9yXG4gICAgICAgIGlmICh0aGlzLnN0cm9rZUNvbG9yQ29sKSBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnN0cm9rZUNvbG9yQ29sXSwgdHJ1ZSlcblxuICAgICAgICBsZXQgc3RhdFNpemVcbiAgICAgICAgaWYgKHRoaXMuc2l6ZUNvbCkgc3RhdFNpemUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnNpemVDb2xdLCB0cnVlKVxuXG4gICAgICAgIGxldCBzdGF0V2lkdGhcbiAgICAgICAgaWYgKHRoaXMuc3Ryb2tlV2lkdGhDb2wpIHN0YXRXaWR0aCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuc3Ryb2tlV2lkdGhDb2xdLCB0cnVlKVxuXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzXG4gICAgICAgIC8vaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgY29uc3QgcjIgPSByICogMC41XG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuc3Ryb2tlQ29sb3JcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3Ryb2tlQ29sb3IoY2VsbFt0aGlzLnN0cm9rZUNvbG9yQ29sXSwgciwgc3RhdENvbG9yKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL3NpemVcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgICAgIGxldCBzXyA9IHRoaXMuc2l6ZSB8fCAoKCkgPT4gcilcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XG4gICAgICAgICAgICBjb25zdCBzRyA9IHNfKGNlbGxbdGhpcy5zaXplQ29sXSwgciwgc3RhdFNpemUsIHpmKVxuXG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICBjb25zdCB3aSA9IHRoaXMuc3Ryb2tlV2lkdGhcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3Ryb2tlV2lkdGgoY2VsbFt0aGlzLnN0cm9rZVdpZHRoQ29sXSwgciwgc3RhdFdpZHRoLCB6ZilcbiAgICAgICAgICAgICAgICA6IDEgKiB6ZlxuICAgICAgICAgICAgaWYgKCF3aSB8fCB3aSA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdpXG5cbiAgICAgICAgICAgIC8vc2hhcGVcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoY2VsbCkgOiAnc3F1YXJlJ1xuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgemYpXG5cbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHIgKiAoMSAtIHNHIC8gcikgKiAwLjVcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHgucmVjdChjZWxsLnggKyBkICsgb2Zmc2V0LmR4LCBjZWxsLnkgKyBkICsgb2Zmc2V0LmR5LCBzRywgc0cpXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKGNlbGwueCArIHIyICsgb2Zmc2V0LmR4LCBjZWxsLnkgKyByMiArIG9mZnNldC5keSwgc0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc0cgKiAwLjVcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGNlbGwueCArIHIyIC0gczIsIGNlbGwueSArIHIyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIsIGNlbGwueSArIHIyICsgczIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiArIHMyLCBjZWxsLnkgKyByMilcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMiAtIHMyKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIgLSBzMiwgY2VsbC55ICsgcjIpXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm90IGltcGxlbWVudGVkJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgLy90aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogcmVzb2x1dGlvbiwgemY6IHpmLCBzU2l6ZTogc3RhdFNpemUsIHNDb2xvcjogc3RhdENvbG9yIH0pO1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3F1YXJlQ29sb3JXR0xTdHlsZSB9IGZyb20gJy4vU3F1YXJlQ29sb3JXR0xTdHlsZS5qcydcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuXG4vKipcbiAqXG4gKiBAc2VlIGh0dHBzOi8vbWFuaWZvbGQubmV0L2RvYy9tZmQ5L2V4YW1wbGVfX3RhbmFrYV9jb250b3Vycy5odG1cbiAqXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUYW5ha2FTdHlsZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge0FycmF5LjxpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdHlsZT59XG4gICAgICovXG4gICAgc3RhdGljIGdldChjb2wsIG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2dldCBjb2xvcnMgZnJvbSBkMyByYW1wcywgaWYgJ25iJyBpcyBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdHMubmIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAob3B0cy5uYiA8IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjb2xvcnMgaW4gdGFuYWthICg8Mik6ICcgKyBvcHRzLm5iKVxuICAgICAgICAgICAgICAgIG9wdHMubmIgPSAyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdHMuY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdjb2xvciBmdW5jdGlvbiBub3QgZGVmaW5lZCBpbiB0YW5ha2EnKVxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IgPSAoKSA9PiAnZ3JheSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdHMuY29sb3JzID0gW11cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5uYjsgaSsrKSBvcHRzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3IoaSAvIChvcHRzLm5iIC0gMSkpKVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjb2xvcnMuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgb3B0cy5jb2xvcnMgPSBvcHRzLmNvbG9ycyB8fCBbJyNhOWJiOWUnLCAnI2M5ZGNhYScsICcjZmRlODlmJywgJyNmOWE1NzknLCAnI2ViNDQ0YiddXG4gICAgICAgIGNvbnN0IG5iID0gb3B0cy5jb2xvcnMubGVuZ3RoXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gdG8gY29tcHV0ZSAndCcgZnJvbSB0aGUgdmFsdWUgdlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0KTpudW1iZXJ9ICovXG4gICAgICAgIG9wdHMudEZ1biA9IG9wdHMudEZ1biB8fCAoKHYsIHIsIHMpID0+ICh2IC0gcy5taW4pIC8gKHMubWF4IC0gcy5taW4pKVxuXG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xuICAgICAgICBvcHRzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMxMTEnXG4gICAgICAgIG9wdHMuY29sQnJpZ2h0ID0gb3B0cy5jb2xCcmlnaHQgfHwgJyNkZGQnXG5cbiAgICAgICAgLy93aWR0aCBvZiB0aGUgc2VnbWVudCAoc2hhcmUgb2YgdGhlIHJlc29sdXRpb24pXG4gICAgICAgIG9wdHMud2lkdGhGYWN0b3IgPSBvcHRzLndpZHRoRmFjdG9yIHx8IDAuMDhcblxuICAgICAgICAvL3NoYWRpbmdcbiAgICAgICAgb3B0cy5uZXdTaGFkaW5nID0gb3B0cy5uZXdTaGFkaW5nXG4gICAgICAgIG9wdHMubmV3U2hhZGluZ1dpZHRoUGl4ID0gb3B0cy5uZXdTaGFkaW5nV2lkdGhQaXggfHwgMlxuICAgICAgICAvL3RyYW5zcGFyZW5jeSB2YWx1ZSwgd2l0aGluIFswLDFdXG4gICAgICAgIG9wdHMubmV3U2hhZGluZ1RyID1cbiAgICAgICAgICAgIG9wdHMubmV3U2hhZGluZ1RyIHx8XG4gICAgICAgICAgICAoKHNpZGVWYWx1ZSwgc2lkZVN0YXQpID0+XG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoc2lkZVZhbHVlKSAvIE1hdGgubWF4KE1hdGguYWJzKHNpZGVTdGF0Lm1pbiksIE1hdGguYWJzKHNpZGVTdGF0Lm1heCkpKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdCBBIGNlbGwgdCB2YWx1ZSwgd2l0aGluIFswLDFdLlxuICAgICAgICAgKiBAcmV0dXJucyB0aGUgY2xhc3MgbnVtYmVyIGZvciB0aGUgdmFsdWVcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGdldENsYXNzID0gKHQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc05hTih0KSB8fCB0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgdCB2YWx1ZSAxOiAnICsgdClcbiAgICAgICAgICAgICAgICByZXR1cm4gLTlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykgaWYgKHQgPD0gKGkgKyAxKSAvIG5iKSByZXR1cm4gaVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCB0IHZhbHVlIDI6ICcgKyB0KVxuICAgICAgICAgICAgcmV0dXJuIC05XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2xTdHlsZSA9IG5ldyBTcXVhcmVDb2xvcldHTFN0eWxlKHtcbiAgICAgICAgICAgIGNvbG9yQ29sOiBjb2wsXG4gICAgICAgICAgICBjb2xvcnM6IG9wdHMuY29sb3JzLFxuICAgICAgICAgICAgdEZ1bjogKHYsIHIsIHMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gb3B0cy50RnVuKHYsIHIsIHMpXG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGdldENsYXNzKHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGMgLyAobmIgLSAxKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vc3RyZXRjaGluZzogeyBmdW46IFwiZXhwUmV2XCIsIGFscGhhOiAtNyB9LFxuICAgICAgICAgICAgc2l6ZTogKHIsIHpmKSA9PiByICsgMC41ICogemYsIC8vdGhhdCBpcyB0byBlbnN1cmUgbm8gZ2FwIGJldHdlZW4gc2FtZSBjbGFzcyBjZWxscyBpcyB2aXNpYmxlXG4gICAgICAgICAgICBmaWx0ZXI6IG9wdHMuZmlsdGVyLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8qXG4gICAgICAgIGlmIG5vIHdlYiBnbDogICAgXG4gICAgICAgICAgICBjb25zdCBjb2xTdHlsZSA9IG5ldyBTaGFwZUNvbG9yU2l6ZVN0eWxlKHtcbiAgICAgICAgICAgICAgICBjb2xvckNvbDogY29sLFxuICAgICAgICAgICAgICAgIC8vdGhlIGNvbG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzXG4gICAgICAgICAgICAgICAgY29sb3I6ICh2LCByLCBzLCB6ZikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSAwICYmIG9wdHMudEZ1biAmJiBpc05hTihvcHRzLnRGdW4odiwgciwgcykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5jb2xvcnNbZ2V0Q2xhc3Mob3B0cy50RnVuID8gb3B0cy50RnVuKHYsIHIsIHMpIDogdildXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaGFwZTogKCkgPT4gXCJzcXVhcmVcIixcbiAgICAgICAgICAgICAgICBzaXplOiAodiwgciwgcywgemYpID0+IHIgKyAwLjUgKiB6ZiwgLy90aGF0IGlzIHRvIGVuc3VyZSBubyBnYXAgYmV0d2VlbiBzYW1lIGNsYXNzIGNlbGxzIGlzIHZpc2libGVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICovXG5cbiAgICAgICAgLyoqIFRoZSBzaWRlIHN0eWxlLCBmb3IgdGhlIHNoYWRvdyBlZmZlY3QgKi9cbiAgICAgICAgY29uc3Qgc2lkZVN0eWxlID0gbmV3IFNpZGVTdHlsZSh7XG4gICAgICAgICAgICB2YWx1ZUNvbDogY29sLFxuICAgICAgICAgICAgdmFsdWU6ICh2MSwgdjIsIHIsIHMsIHpmKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRoZSBudW1iZXIgb2YgY2xhc3NlcyBvZiBkaWZmZXJlbmNlXG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQgJiYgdjIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBvcHRzLnRGdW4odjEsIHIsIHMpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ID09IHVuZGVmaW5lZCB8fCBpc05hTih0KSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjEgKyAnIC0gJyArIHQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBnZXRDbGFzcyh0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyArIDFcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYxID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG9wdHMudEZ1bih2MiwgciwgcylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHQpKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdmFsdWU6ICcgKyB2MiArICcgLSAnICsgdClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGdldENsYXNzKHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtYyAtIDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdDEgPSBvcHRzLnRGdW4odjEsIHIsIHMpXG4gICAgICAgICAgICAgICAgaWYgKHQxID09IHVuZGVmaW5lZCB8fCBpc05hTih0MSkpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB2YWx1ZTogJyArIHYxICsgJyAtICcgKyB0MSlcbiAgICAgICAgICAgICAgICBjb25zdCB0MiA9IG9wdHMudEZ1bih2MiwgciwgcylcbiAgICAgICAgICAgICAgICBpZiAodDIgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHQyKSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjIgKyAnIC0gJyArIHQyKVxuICAgICAgICAgICAgICAgIGNvbnN0IGMxID0gZ2V0Q2xhc3ModDEpXG4gICAgICAgICAgICAgICAgY29uc3QgYzIgPSBnZXRDbGFzcyh0MilcbiAgICAgICAgICAgICAgICByZXR1cm4gLWMyICsgYzFcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNvbG9yOiBvcHRzLm5ld1NoYWRpbmdcbiAgICAgICAgICAgICAgICA/IC8vYmxhY2sgd2l0aCB0cmFuc3BhcmVuY3kgZGVwZW5kaW5nIG9uIGRpZmZlcmVuY2VcbiAgICAgICAgICAgICAgICAgIChzaWRlLCByLCBzLCB6KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHIgPSBvcHRzLm5ld1NoYWRpbmdUcihzaWRlLnZhbHVlLCBzKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2lkZS52YWx1ZSA+IDAgJiYgc2lkZS5vciA9PT0gJ2gnKSB8fCAoc2lkZS52YWx1ZSA8IDAgJiYgc2lkZS5vciA9PT0gJ3YnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZ2JhKDI1NSwyNTUsMTAwLCcgKyB0ciArICcpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdyZ2JhKDAsMCwwLCcgKyB0ciArICcpJ1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogLy93aGl0ZSBvciBibGFjaywgZGVwZW5kaW5nIG9uIG9yaWVudGF0aW9uIGFuZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgKHNpZGUsIHIsIHMsIHopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZS52YWx1ZSA9PT0gMCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gXCJncmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ3YnKSByZXR1cm4gc2lkZS52YWx1ZSA8IDAgPyBvcHRzLmNvbEJyaWdodCA6IG9wdHMuY29sRGFya1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWRlLnZhbHVlIDwgMCA/IG9wdHMuY29sRGFyayA6IG9wdHMuY29sQnJpZ2h0XG4gICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB3aWR0aDogb3B0cy5uZXdTaGFkaW5nXG4gICAgICAgICAgICAgICAgPyAvL2ZpbGwgc2l6ZVxuICAgICAgICAgICAgICAgICAgKHNpZGUsIHIsIHMsIHopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5uZXdTaGFkaW5nV2lkdGhQaXggKiB6XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiAvL3dpZHRoIGRlcGVuZHMgb24gdGhlIHZhbHVlLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgY2xhc3NlcyBvZiBkaWZmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAoc2lkZSwgciwgcywgeikgPT5cbiAgICAgICAgICAgICAgICAgICAgICBvcHRzLndpZHRoRmFjdG9yICogciAqIE1hdGguYWJzKHNpZGUudmFsdWUpICogKHNpZGUub3IgPT09ICd2JyA/IDAuNSA6IDEpLFxuXG4gICAgICAgICAgICBmaWx0ZXI6IG9wdHMuZmlsdGVyLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBbY29sU3R5bGUsIHNpZGVTdHlsZV1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXG5cbi8qKlxuICpcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciB0ZXh0LlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnRleHRDb2wgPSBvcHRzLnRleHRDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHRleHQgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy50ZXh0ID0gb3B0cy50ZXh0IHx8ICgodiwgciwgcywgeikgPT4gJ1gnKVxuXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpXG5cbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBmb250IHNpemUuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZm9udFNpemVDb2wgPSBvcHRzLmZvbnRTaXplQ29sXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBmb250IHNpemUgb2YgYSBjZWxsIGluIGdlbyB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgKCh2LCByLCBzLCB6KSA9PiByICogMC44KVxuXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mb250RmFtaWx5ID0gb3B0cy5mb250RmFtaWx5IHx8ICdBcmlhbCdcblxuICAgICAgICAvKiogVGhlIHRleHQgZm9udCB3ZWlnaHQuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAnYm9sZCdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICBsZXQgc3RhdFRleHRcbiAgICAgICAgaWYgKHRoaXMudGV4dENvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIHRleHQgdmFyaWFibGUgc3RhdGlzdGljc1xuICAgICAgICAgICAgc3RhdFRleHQgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnRleHRDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRDb2xvclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXRGb250U2l6ZVxuICAgICAgICBpZiAodGhpcy5mb250U2l6ZUNvbCkge1xuICAgICAgICAgICAgLy9pZiBzaXplIGlzIHVzZWQsIHNvcnQgY2VsbHMgYnkgc2l6ZSBzbyB0aGF0IHRoZSBiaWdnZXN0IGFyZSBkcmF3biBmaXJzdFxuICAgICAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiBjMlt0aGlzLmZvbnRTaXplQ29sXSAtIGMxW3RoaXMuZm9udFNpemVDb2xdKVxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRGb250U2l6ZSA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuZm9udFNpemVDb2xdLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcbiAgICAgICAgLy9pbiBzY3JlZW4gY29vcmRpbmF0ZXNcbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9nZXQgY2VsbCB0ZXh0XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0ID8gdGhpcy50ZXh0KGNlbGxbdGhpcy50ZXh0Q29sXSwgciwgc3RhdFRleHQsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkIHx8IHRleHQgPT0gbnVsbCB8fCB0ZXh0ICsgJycgPT09ICcnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG4gICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vZm9udCBzaXplXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XG4gICAgICAgICAgICBjb25zdCBmb250U2l6ZVBpeCA9IHRoaXMuZm9udFNpemUoY2VsbFt0aGlzLmZvbnRTaXplQ29sXSwgciwgc3RhdEZvbnRTaXplLCB6ZikgLyB6ZlxuXG4gICAgICAgICAgICAvL3NldCBmb250XG4gICAgICAgICAgICBjb25zdCBmb250RmFtaWx5ID0gdGhpcy5mb250RmFtaWx5IHx8ICdBcmlhbCdcbiAgICAgICAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgfHwgJ2JvbGQnXG4gICAgICAgICAgICBjZy5jdHguZm9udCA9IGZvbnRXZWlnaHQgKyAnICcgKyBmb250U2l6ZVBpeCArICdweCAnICsgZm9udEZhbWlseVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHIsIHpmKVxuXG4gICAgICAgICAgICAvL3RleHQgcG9zaXRpb25cbiAgICAgICAgICAgIGNnLmN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJ1xuICAgICAgICAgICAgY29uc3QgdHggPSBjZy5nZW9Ub1BpeFgoY2VsbC54ICsgciAqIDAuNSArIG9mZnNldC5keClcbiAgICAgICAgICAgIGNvbnN0IHR5ID0gY2cuZ2VvVG9QaXhZKGNlbGwueSArIHIgKiAwLjUgKyBvZmZzZXQuZHkpICsgZm9udFNpemVQaXggKiAwLjMgLy9pdCBzaG91bGQgYmUgMC41IGJ1dCAwLjMgc2VlbXMgdG8gd29yayBiZXR0ZXJcblxuICAgICAgICAgICAgLy9kcmF3IHRoZSB0ZXh0XG4gICAgICAgICAgICBjZy5jdHguZmlsbFRleHQodGV4dCwgdHgsIHR5KVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGEgZnVuY3Rpb24gWzAsMV0tPnN0cmluZyBmb3IgY2hhcmFjdGVycyBsZWdlbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNoYXJzXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDaGFyTGVnZW5kRnVuKGNoYXJzKSB7XG4gICAgICAgIGNvbnN0IG5iID0gY2hhcnMubGVuZ3RoXG4gICAgICAgIHJldHVybiAodCkgPT4gKHQgPT0gMCA/ICcnIDogdCA9PSAxID8gY2hhcnNbbmIgLSAxXSA6IGNoYXJzW01hdGguZmxvb3IodCAqIG5iKV0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wiZmlyc3RcInxcImJvdHRvbVwifFwiY2VudGVyXCJ8XCJ0b3BcInxcImxhc3RcIn0gQW5jaG9yTW9kZVlFbnVtICovXG5cbi8qKlxuICogU2hvdyBjZWxsIGFzIHRpbWVzZXJpZXMgY2hhcnRcbiAqIENhbiBiZSB1c2VkIGZvciBzcGFya2xpbmUgbWFwIG9mIGh0dHBzOi8vZGF0YWdpc3RpcHMuaHlwb3RoZXNlcy5vcmcvNDg4XG4gKlxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgVGltZVNlcmllc1N0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIGNvbHVtbnMgb2YgdGhlIHRpbWUgc2VyaWVzLCBvcmRlcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy50cyA9IG9wdHMudHNcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiBzcGVjaWZ5aW5nIHdoZW4gYSB2YWx1ZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBcIm5vIGRhdGFcIiBhbmQgdGh1cyBub3QgaWdub3JlZC4gVGhlIGxpbmUgd2lsbCBoYXZlIGEgYnJlYWsgYXQgdGhlc2UgdmFsdWVzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLm5vRGF0YSA9IG9wdHMubm9EYXRhIHx8ICgodikgPT4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT0gXCJcIiB8fCB2ID09PSBudWxsIHx8IGlzTmFOKCt2KSlcblxuICAgICAgICAvL3hcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9mZnNldFggPSBvcHRzLm9mZnNldFggfHwgKChjLCByLCB6ZikgPT4gMClcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGMsIHIsIHpmKSA9PiByKVxuXG4gICAgICAgIC8veVxuICAgICAgICAvKiogaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IG9wdHMub2Zmc2V0WSB8fCAoKGMsIHIsIHpmKSA9PiAwKVxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKChjLCByLCB6ZikgPT4gcilcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6QW5jaG9yTW9kZVlFbnVtfSAqL1xuICAgICAgICB0aGlzLmFuY2hvck1vZGVZID0gb3B0cy5hbmNob3JNb2RlWSB8fCAoKGMsIHIsIHpmKSA9PiBcImNlbnRlclwiKVxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubGluZVdpZHRoQ29sID0gb3B0cy5saW5lV2lkdGhDb2xcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZS5qc1wiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKHYsIHIsIHMsIHpmKSA9PiAxLjUgKiB6ZilcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yQ29sID0gb3B0cy5jb2xvckNvbFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlLmpzXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKHYsIHIsIHMsIHpmKSA9PiAnYmxhY2snKVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gY2dcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xuXG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tIGZhY3RvclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcblxuICAgICAgICBsZXQgc3RhdFdpZHRoXG4gICAgICAgIGlmICh0aGlzLmxpbmVXaWR0aENvbCkge1xuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcbiAgICAgICAgICAgIHN0YXRXaWR0aCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMubGluZVdpZHRoQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGF0Q29sb3JcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcHV0ZSBjZWxsIGFtcGxpdHVkZVxuICAgICAgICBjb25zdCBnZXRBbXBsaXR1ZGUgPSBjID0+IHtcbiAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIG1heCAtIG1pblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIG1heCBhbXBsaXR1ZGVcbiAgICAgICAgbGV0IGFtcE1heFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBhbXAgPSBnZXRBbXBsaXR1ZGUoYylcbiAgICAgICAgICAgIGlmIChhbXAgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGFtcE1heCA9PSB1bmRlZmluZWQgfHwgYW1wID4gYW1wTWF4KSBhbXBNYXggPSBhbXBcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFtcE1heCkgcmV0dXJuXG5cbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLnRzLmxlbmd0aFxuXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzXG4gICAgICAgIC8vaW4gZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSBcImJ1dHRcIlxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG5cbiAgICAgICAgICAgIC8vbGluZSB3aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLmxpbmVXaWR0aCA/IHRoaXMubGluZVdpZHRoKGNbdGhpcy5saW5lV2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGluZSBjb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY1t0aGlzLmNvbG9yQ29sXSwgciwgc3RhdENvbG9yLCB6ZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuXG5cbiAgICAgICAgICAgIC8veFxuICAgICAgICAgICAgY29uc3Qgb2ZmWCA9IHRoaXMub2Zmc2V0WCA/IHRoaXMub2Zmc2V0WChjLCByLCB6ZikgOiAwXG4gICAgICAgICAgICBpZiAob2ZmWCA9PSB1bmRlZmluZWQgfHwgaXNOYU4ob2ZmWCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoYywgciwgemYpIDogclxuICAgICAgICAgICAgaWYgKHcgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHcpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3lcbiAgICAgICAgICAgIGNvbnN0IG9mZlkgPSB0aGlzLm9mZnNldFkgPyB0aGlzLm9mZnNldFkoYywgciwgemYpIDogMFxuICAgICAgICAgICAgaWYgKG9mZlkgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9mZlkpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoYywgciwgemYpIDogclxuICAgICAgICAgICAgaWYgKGggPT0gdW5kZWZpbmVkIHx8IGlzTmFOKGgpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgYW5jaFkgPSB0aGlzLmFuY2hvck1vZGVZID8gdGhpcy5hbmNob3JNb2RlWShjLCByLCB6ZikgOiBcImNlbnRlclwiXG4gICAgICAgICAgICBpZiAoIWFuY2hZKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgYW5jaG9yIFkgZmlndXJlc1xuICAgICAgICAgICAgbGV0IHZhbDAsIHkwXG4gICAgICAgICAgICBpZiAoYW5jaFkgPT09IFwiZmlyc3RcIikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGZpcnN0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFsMCA9IGNbdGhpcy50c1swXV1cbiAgICAgICAgICAgICAgICB5MCA9IDBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwibGFzdFwiKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgbGFzdCB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhbDAgPSBjW3RoaXMudHNbdGhpcy50cy5sZW5ndGggLSAxXV1cbiAgICAgICAgICAgICAgICB5MCA9IDBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtaW5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gK2NbdF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsMCA9PSB1bmRlZmluZWQgfHwgdmFsIDwgdmFsMCkgdmFsMCA9IHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5MCA9IDBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwidG9wXCIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtYXhcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gK2NbdF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsMCA9PSB1bmRlZmluZWQgfHwgdmFsID4gdmFsMCkgdmFsMCA9IHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5MCA9IHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09IFwiY2VudGVyXCIpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtaW4gYW5kIG1heFxuICAgICAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjW3RdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiA9PSB1bmRlZmluZWQgfHwgdmFsIDwgbWluKSBtaW4gPSB2YWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA9PSB1bmRlZmluZWQgfHwgdmFsID4gbWF4KSBtYXggPSB2YWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsMCA9ICgrbWF4ICsgK21pbikgKiAwLjVcbiAgICAgICAgICAgICAgICB5MCA9IHIgLyAyXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5leHBlY3RlZCBhbmNob3JNb2RlWTogXCIgKyBhbmNoWSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyovZHJhdyBsaW5lXG4gICAgICAgICAgICBpZiAodmFsMCA9PSB1bmRlZmluZWQgfHwgaXNOYU4odmFsMCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGNvbnN0IHNYID0gdyAvIChuYiAtIDEpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjW3RoaXMudHNbaV1dXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQgfHwgaXNOYU4odmFsKSkgYnJlYWtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKHZhbCAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKHZhbCAtIHZhbDApICogaCAvIGFtcE1heCArIG9mZlkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlKCkqL1xuXG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lLCBzZWdtZW50IGJ5IHNlZ21lbnRcbiAgICAgICAgICAgIGNvbnN0IHNYID0gdyAvIChuYiAtIDEpXG5cbiAgICAgICAgICAgIC8vaGFuZGxlIGZpcnN0IHBvaW50XG4gICAgICAgICAgICBsZXQgdjAgPSBjW3RoaXMudHNbMF1dXG4gICAgICAgICAgICBpZiAoIXRoaXMubm9EYXRhKHYwKSkge1xuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oYy54ICsgb2ZmWCwgYy55ICsgeTAgKyAodjAgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh2MCwgaXNOYU4odjApKVxuXG4gICAgICAgICAgICBsZXQgdjFcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgICAgIHYxID0gY1t0aGlzLnRzW2ldXVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnQgZnJvbSB2MCB0byB2MVxuXG4gICAgICAgICAgICAgICAgLy9ib3RoIHBvaW50cyAnbm8gZGF0YSdcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub0RhdGEodjApICYmIHRoaXMubm9EYXRhKHYxKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vc2Vjb25kIHBvaW50ICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9maXJzdCBwb2ludCAnbm8gZGF0YSdcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiAhdGhpcy5ub0RhdGEodjEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKHYxIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcblxuICAgICAgICAgICAgICAgICAgICAvL2JvdGggcG9pbnRzIGhhdmUgZGF0YTogdHJhY2UgbGluZVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodjEgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxuICAgICAgICAgICAgICAgICAgICAvL2lmIGl0IGlzIHRoZSBsYXN0IHBvaW50LCBzdHJva2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gbmIgLSAxKSBjZy5jdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdjAgPSB2MVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH1cblxufVxuXG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogR2V0IHRoZSBjbGFzcyBpZCBmcm9tIGEgdmFsdWUgYW5kIGNsYXNzIGJyZWFrIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IHRoZSB2YWx1ZVxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYnJlYWtzIHRoZSBicmVha3NcbiAqIEByZXR1cm5zIFRoZSBjbGFzcyBpZCwgZnJvbSAwIHRvIGJyZWFrcy5sZW5ndGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsYXNzKHYsIGJyZWFrcykge1xuICAgIGlmICghYnJlYWtzKSByZXR1cm5cbiAgICBpZiAoYnJlYWtzLmxlbmd0aCA9PSAwKSByZXR1cm4gMFxuICAgIGlmICh2IDw9IGJyZWFrc1swXSkgcmV0dXJuIDBcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJyZWFrcy5sZW5ndGg7IGkrKykgaWYgKGJyZWFrc1tpIC0gMV0gPCB2ICYmIHYgPD0gYnJlYWtzW2ldKSByZXR1cm4gaVxuICAgIHJldHVybiBicmVha3MubGVuZ3RoXG59XG5cbmV4cG9ydCBsZXQgbW9uaXRvciA9IGZhbHNlXG5cbmxldCBwcmV2aW91c0RhdGVcbmV4cG9ydCBmdW5jdGlvbiBtb25pdG9yRHVyYXRpb24obWVzc2FnZSkge1xuICAgIGNvbnN0IG5vd0RhdGUgPSBEYXRlLm5vdygpXG5cbiAgICAvL2ZpcnN0IGNhbGxcbiAgICBpZiAoIXByZXZpb3VzRGF0ZSkge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgICAgIGNvbnNvbGUubG9nKHByZXZpb3VzRGF0ZSwgbWVzc2FnZSlcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZCA9IG5vd0RhdGUgLSBwcmV2aW91c0RhdGVcbiAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgY29uc29sZS5sb2coZCwgbWVzc2FnZSlcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGdsLCBzaXplUGl4KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbFxuICAgICAgICB0aGlzLnNpemVQaXggPSBzaXplUGl4IHx8IDEwLjBcblxuICAgICAgICB0aGlzLnByb2dyYW0gPSBpbml0U2hhZGVyUHJvZ3JhbShcbiAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgICAgIGdsLlZFUlRFWF9TSEFERVIsXG4gICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xuICAgICAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xuICAgICAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcbiAgICAgICAgICAgIGF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuICAgICAgICAgICAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xuICAgICAgICAgICAgICB2Q29sb3IgPSBjb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBgXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgICAgIGdsLkZSQUdNRU5UX1NIQURFUixcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2Q29sb3I7XG4gICAgICAgICAgICB2b2lkIG1haW4odm9pZCkge1xuICAgICAgICAgICAgICAgIHZlYzQgdkNvbG9yXyA9IHZDb2xvciAvIDI1NS4wO1xuICAgICAgICAgICAgICAgIHZDb2xvcl9bM10gPSAyNTUuMCAqIHZDb2xvcl9bM107XG4gICAgICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yXztcbiAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pXG5cbiAgICAgICAgLy9idWZmZXIgZGF0YVxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIgPSBbXVxuICAgIH1cblxuICAgIC8qKiBBZGQgZGF0YSB0byB2ZXJ0aWNlcy9zaXplL2NvbG9yIGJ1ZmZlcnMgZm9yIGNvbG9yIHNxdWFyZXMgZHJhd2luZyAqL1xuICAgIGFkZFBvaW50RGF0YSh4QywgeUMsIGNvbCkge1xuICAgICAgICAvL2NvbnZlcnQgY29sb3JcbiAgICAgICAgY29uc3QgY2MgPSBjb2xvcihjb2wpXG4gICAgICAgIC8vY29uc3QgY2MgPSB7cjo0NSxnOjg3LGI6OTgsb3BhY2l0eTowLjl9XG4gICAgICAgIGlmICghY2MpIHJldHVyblxuXG4gICAgICAgIC8vdmVydGljZXNcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlci5wdXNoKHhDLCB5QylcbiAgICAgICAgLy9jb2xvclxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlci5wdXNoKGNjLnIsIGNjLmcsIGNjLmIsIGNjLm9wYWNpdHkpXG4gICAgfVxuXG4gICAgYWRkUG9pbnREYXRhMih4QywgeUMsIHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgICAgICAgLy92ZXJ0aWNlc1xuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2gociwgZywgYiwgb3BhY2l0eSlcbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyh0cmFuc2ZvTWF0KSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbFxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy52ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vY29sb3IgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRoaXMuY29sb3JzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIHZhciBjb2xvciA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2NvbG9yJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihjb2xvciwgNCwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjb2xvcilcblxuICAgICAgICAvL3NpemVQaXhcbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHRoaXMuc2l6ZVBpeClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHRoaXMudmVydGljZXNCdWZmZXIubGVuZ3RoIC8gMilcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxuICogVGhlIGNvbG9yIGludGVycG9sYXRpb24gaXMgY29tcHV0ZWQgaW4gdGhlIGZyYWdtZW50IHNoYWRlciBwcm9ncmFtLCBieSB0aGUgR1BVLCB0aHVzIGl0IGlzIGxlc3MgZmxleGlibGUgYnV0IGZhc3Rlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZCB7XG4gICAgLy9zZWU6XG4gICAgLy9odHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL2ZyL3dlYmdsLXNoYWRlcnMtYW5kLWdsc2wuaHRtbCNsZXMtdW5pZm9ybXMtZGFucy1sZXMtc2hhZGVycy1kZS12ZXJ0ZXhcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvP3NlYXJjaD1taXhcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vMDYvXG4gICAgLy9odHRwczovL3RoZWJvb2tvZnNoYWRlcnMuY29tL2dsb3NzYXJ5L1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGdsXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gY29sb3JzXG4gICAgICogQHBhcmFtIHt7ZnVuOnN0cmluZyxhbHBoYTpudW1iZXJ9fSBzdHJldGNoaW5nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVQaXhcbiAgICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGdsb2JhbE9wYWNpdHlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihnbCwgY29sb3JzLCBzdHJldGNoaW5nLCBzaXplUGl4ID0gMTAsIGdsb2JhbE9wYWNpdHkgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9ICovXG4gICAgICAgIHRoaXMuZ2wgPSBnbFxuICAgICAgICAvL2dsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdHJ1ZSk7XG4gICAgICAgIC8vZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgICAgIC8vZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgdlNoYWRlciA9IGNyZWF0ZVNoYWRlcihcbiAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcbiAgICAgICAgICAgIGBcbiAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xuICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XG5cbiAgICAgICAgYXR0cmlidXRlIGZsb2F0IHQ7XG4gICAgICAgIHZhcnlpbmcgZmxvYXQgdnQ7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcbiAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xuICAgICAgICAgIHZ0ID0gdDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgICAgICApXG5cbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXG4gICAgICAgIC8vZGVjbGFyZSB0aGUgdW5pZm9ybSBhbmQgb3RoZXIgdmFyaWFibGVzXG4gICAgICAgIGxldCBmc2hTdHJpbmcgPVxuICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbicgK1xuICAgICAgICAgICAgJ3ZhcnlpbmcgZmxvYXQgdnQ7XFxuJyArXG4gICAgICAgICAgICAndW5pZm9ybSBmbG9hdCBhbHBoYTtcXG4nICtcbiAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0ID0gW11cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCBjJyArIGkgKyAnO1xcbicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dC5qb2luKCcnKVxuICAgICAgICAgICAgfSkoKSArXG4gICAgICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uLCBhcHBseSB0aGUgc3RyZXRjaGluZyBvZiB0XG4gICAgICAgICAgICAndm9pZCBtYWluKHZvaWQpIHtcXG4nXG5cbiAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHtcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93JylcbiAgICAgICAgICAgICAgICAvL3NQb3cgPSAodCwgYWxwaGEgPSAzKSA9PiBNYXRoLnBvdyh0LCBhbHBoYSk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gcG93KHZ0LCBhbHBoYSk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ3Bvd1JldicpXG4gICAgICAgICAgICAgICAgLy9zUG93UmV2ID0gKHQsIGFscGhhID0gMykgPT4gMSAtIE1hdGgucG93KDEgLSB0LCAxIC8gYWxwaGEpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IDEuMC1wb3coMS4wLXZ0LCAxLjAvYWxwaGEpO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdleHAnKVxuICAgICAgICAgICAgICAgIC8vc0V4cCA9ICh0LCBhbHBoYSA9IDMpID0+IGFscGhhID09IDAgPyB0IDogKE1hdGguZXhwKHQgKiBhbHBoYSkgLSAxKSAvIChNYXRoLmV4cChhbHBoYSkgLSAxKTtcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgc3RyZXRjaGluZy5hbHBoYSA9PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBmbG9hdCB0ID0gdnQ7YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnICAgZmxvYXQgdCA9IChleHAodnQgKiBhbHBoYSkgLSAxLjApIC8gKGV4cChhbHBoYSkgLSAxLjApO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdleHBSZXYnKVxuICAgICAgICAgICAgICAgIC8vc0V4cFJldiA9ICh0LCBhbHBoYSA9IDMpID0+IGFscGhhID09IDAgPyB0IDogMSAtICgxIC8gYWxwaGEpICogTWF0aC5sb2coTWF0aC5leHAoYWxwaGEpICogKDEgLSB0KSArIHQpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gMS4wIC0gKDEuMCAvIGFscGhhKSAqIGxvZyhleHAoYWxwaGEpICogKDEuMCAtIHZ0KSArIHZ0KTtcXG4nXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnY2lyY2xlTG93Jykge1xuICAgICAgICAgICAgICAgIGlmIChzdHJldGNoaW5nLmFscGhhID09IDApXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKGFscGhhID09IDApIHJldHVybiB0O1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAxKVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCgyICogdCAtIHQgKiB0KTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gc3FydCh2dCAqICgyLjAgLSB2dCkpO1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgdCAqICgyIC8gYSArIDIgLSB0KSkgLSAxIC8gYTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gc3FydCgxLjAgLyAoYSAqIGEpICsgdnQgKiAoIDIuMC9hICsgMi4wIC0gdnQgKSkgLSAxLjAgLyBhO1xcbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGVIaWdoJykge1xuICAgICAgICAgICAgICAgIC8vIDEgLSBzQ2lyY2xlTG93KDEgLSB0LCBhbHBoYSlcbiAgICAgICAgICAgICAgICBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGFscGhhID09IDEpIHJldHVybiBNYXRoLnNxcnQoMiAqIHQgLSB0ICogdCk7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IDEuMCAtIHNxcnQoKDEuMCAtIHZ0KSAqICgxLjAgKyB2dCkpO1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgKDIgKiB0KSAvIGEgKyAyICogdCAtIHQgKiB0KSAtIDEgLyBhO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IHQgPSAxLjAgLSBzcXJ0KDEuMCAvIChhICogYSkgKyAoMS4wLXZ0KSAqICggMi4wL2EgKyAxLjAgKyB2dCApKSArIDEuMCAvIGE7XFxuJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBzdHJldGNoaW5nIGZ1bmN0aW9uIGNvZGU6ICcgKyBzdHJldGNoaW5nLmZ1bilcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXG4gICAgICAgIH1cblxuICAgICAgICAvL2Nob29zZSBpbml0aWFsIGFuZCBmaW5hbCBjb2xvcnMsIGFuZCBhZGp1c3QgdCB2YWx1ZVxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMDtcXG4nXG4gICAgICAgIGVsc2UgaWYgKGNvbG9ycy5sZW5ndGggPT0gMikgZnNoU3RyaW5nICs9ICcgICB2ZWM0IGNJPWMwO1xcbiAgIHZlYzQgY0Y9YzE7XFxuJ1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5iID0gY29sb3JzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgIGNvbnN0IG5icyA9IG5iICsgJy4wJ1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICB2ZWM0IGNJO1xcbidcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjRjtcXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGlmKHQ8MS4wLycgKyBuYnMgKyAnKSB7IGNJPWMwOyBjRj1jMTsgdD10KicgKyBuYnMgKyAnOyB9XFxuJ1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBuYjsgaSsrKVxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICAnICAgZWxzZSBpZih0PCcgK1xuICAgICAgICAgICAgICAgICAgICBpICtcbiAgICAgICAgICAgICAgICAgICAgJy4wLycgK1xuICAgICAgICAgICAgICAgICAgICBuYnMgK1xuICAgICAgICAgICAgICAgICAgICAnKSB7IGNJPWMnICtcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXG4gICAgICAgICAgICAgICAgICAgICc7IGNGPWMnICtcbiAgICAgICAgICAgICAgICAgICAgaSArXG4gICAgICAgICAgICAgICAgICAgICc7IHQ9JyArXG4gICAgICAgICAgICAgICAgICAgIG5icyArXG4gICAgICAgICAgICAgICAgICAgICcqdC0nICtcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXG4gICAgICAgICAgICAgICAgICAgICcuMDsgfVxcbidcbiAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICcgICBlbHNlIHsgY0k9YycgKyAobmIgLSAxKSArICc7IGNGPWMnICsgbmIgKyAnOyB0PScgKyBuYnMgKyAnKnQtJyArIChuYiAtIDEpICsgJy4wOyB9XFxuJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy9vbmUgc2luZ2xlIGNvbG9yXG4gICAgICAgIGlmIChjb2xvcnMubGVuZ3RoID09IDEpIGZzaFN0cmluZyArPSAnICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjMFswXSwgYzBbMV0sIGMwWzJdLCBjMFszXSk7fVxcbidcbiAgICAgICAgLy9zZXQgaW50ZXJwb2xhdGVkIGNvbG9yLCBiZXR3ZWVuIGluaXRpYWwgYW5kIGZpbmFsIG9uZVxuICAgICAgICBlbHNlIGZzaFN0cmluZyArPSAnICAgZ2xfRnJhZ0NvbG9yID0gbWl4KGNJLCBjRiwgdCk7fVxcbidcblxuICAgICAgICAvL2NvbnNvbGUubG9nKGZzaFN0cmluZylcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZzaFN0cmluZylcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMUHJvZ3JhbX0gKi9cbiAgICAgICAgdGhpcy5wcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXG4gICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKVxuXG4gICAgICAgIC8vc2V0IHVuaWZvcm1zXG5cbiAgICAgICAgLy9zaXplUGl4XG4gICAgICAgIC8vVE9ETzogYnVnIGhlcmUuIFNlZW1zIHRvIGJlIGxpbWl0ZWQgdG8gc29tZSB0aHJlc2hvbGQgdmFsdWUgKGFyb3VuZCAyNTApLlxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogc2l6ZVBpeClcblxuICAgICAgICAvL3N0cmV0Y2hpbmcgYWxwaGEgZmFjdG9yXG4gICAgICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnYWxwaGEnKSwgc3RyZXRjaGluZyA/IDEuMCAqIHN0cmV0Y2hpbmcuYWxwaGEgOiAwLjApXG5cbiAgICAgICAgLy9jb2xvcnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjb2xvcihjb2xvcnNbaV0pXG5cbiAgICAgICAgICAgIGxldCBvcGFjaXR5ID0gYy5vcGFjaXR5XG4gICAgICAgICAgICBpZiAoYy5vcGFjaXR5ID09IDEgJiYgZ2xvYmFsT3BhY2l0eSAhPSB1bmRlZmluZWQpIG9wYWNpdHkgPSBnbG9iYWxPcGFjaXR5XG5cbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2MnICsgaSksIFtcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2MuZyAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArb3BhY2l0eSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyh2ZXJ0aWNlc0J1ZmZlciwgdEJ1ZmZlciwgdHJhbnNmb01hdCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2xcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMucHJvZ3JhbVxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy90IGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0QnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHQgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAndCcpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIodCwgMSwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcblxuLyoqXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cbiAqIENvbG9yIGJhc2VkIG9uIGNhdGVnb3JpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNvbG9yc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbG9ycykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xuICAgICAgICB0aGlzLmNvbG9ycyA9IGNvbG9yc1xuXG4gICAgICAgIC8qKiBWZWN0b3Igc2hhZGVyIHByb2dyYW1cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy52c2hTdHJpbmcgPSBgXG4gICAgICAgIGF0dHJpYnV0ZSB2ZWMyIHBvcztcbiAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xuICAgICAgICB1bmlmb3JtIG1hdDMgbWF0O1xuXG4gICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBpO1xuICAgICAgICB2YXJ5aW5nIGZsb2F0IHZpO1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XG4gICAgICAgICAgZ2xfUG9pbnRTaXplID0gc2l6ZVBpeDtcbiAgICAgICAgICB2aSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgYFxuXG4gICAgICAgIC8vcHJlcGFyZSBmcmFnbWVudCBzaGFkZXIgY29kZVxuICAgICAgICAvL2RlY2xhcmUgdGhlIHVuaWZvcm0gYW5kIG90aGVyIHZhcmlhYmxlc1xuICAgICAgICBjb25zdCBvdXQgPSBbXVxuICAgICAgICBvdXQucHVzaCgncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxudmFyeWluZyBmbG9hdCB2aTtcXG4nKVxuICAgICAgICAvL2FkZCBjb2xvciB1bmlmb3Jtc1xuICAgICAgICBvdXQucHVzaCgndW5pZm9ybSB2ZWM0JylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID4gMCkgb3V0LnB1c2goJywnKVxuICAgICAgICAgICAgb3V0LnB1c2goJyBjJyArIGkpXG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2goJztcXG4nKVxuICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uXG4gICAgICAgIG91dC5wdXNoKCd2b2lkIG1haW4odm9pZCkge1xcbicpXG4gICAgICAgIC8vY2hvb3NlIGNvbG9yIGlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID4gMCkgb3V0LnB1c2goJ2Vsc2UgJylcbiAgICAgICAgICAgIG91dC5wdXNoKCdpZih2aT09JylcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXG4gICAgICAgICAgICBvdXQucHVzaCgnLjApIGdsX0ZyYWdDb2xvciA9IHZlYzQoYycpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJ1swXSwgYycpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJ1sxXSwgYycpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJ1syXSwgYycpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJ1szXSk7XFxuJylcbiAgICAgICAgfVxuICAgICAgICBvdXQucHVzaCgnZWxzZSBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCk7XFxufScpXG4gICAgICAgIC8qKiBGcmFnbWVudCBzaGFkZXIgcHJvZ3JhbVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZzaFN0cmluZyA9IG91dC5qb2luKCcnKVxuICAgIH1cblxuICAgIC8qKiAgKi9cbiAgICBkcmF3KGdsLCB2ZXJ0aWNlc0J1ZmZlciwgaUJ1ZmZlciwgdHJhbnNmb01hdCwgc2l6ZVBpeCA9IDEwKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXG4gICAgICAgIGNvbnN0IHZTaGFkZXIgPSBjcmVhdGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHRoaXMudnNoU3RyaW5nKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXG4gICAgICAgIGNvbnN0IGZTaGFkZXIgPSBjcmVhdGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgdGhpcy5mc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW19ICovXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBpbml0U2hhZGVyUHJvZ3JhbShnbCwgdlNoYWRlciwgZlNoYWRlcilcbiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKVxuXG4gICAgICAgIC8vc2V0IHVuaWZvcm1zXG5cbiAgICAgICAgLy9zaXplUGl4XG4gICAgICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogc2l6ZVBpeClcblxuICAgICAgICAvL2NvbG9yc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IodGhpcy5jb2xvcnNbaV0pXG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAnYycgKyBpKSwgW1xuICAgICAgICAgICAgICAgICtjLnIgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5nIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2MuYiAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLm9wYWNpdHksXG4gICAgICAgICAgICBdKVxuICAgICAgICB9XG5cbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdwb3MnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcbiAgICAgICAgICAgIGdsLkZMT0FULCAvL3R5cGVcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcbiAgICAgICAgICAgIDAgLy9vZmZzZXRcbiAgICAgICAgKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcblxuICAgICAgICAvL2kgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KGlCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgaSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdpJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihpLCAxLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpXG5cbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAnbWF0JyksIGZhbHNlLCBuZXcgRmxvYXQzMkFycmF5KHRyYW5zZm9NYXQpKVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcblxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgdmVydGljZXNCdWZmZXIubGVuZ3RoIC8gMilcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogU29tZSBmdW5jdGlvbiBbMCwxXS0+WzAsMV0gdG8gc3RyZXRjaCByYW5nZSBvZiB2YWx1ZXMuXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2Jsb2IvbWFzdGVyL2RvY3MvcmVmZXJlbmNlLm1kI3N0cmV0Y2hpbmdcbiAqIEBzZWUgaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BqZ2FmZnVyaS9zdHJldGNoaW5nXG4gKi9cblxuLyoqXG4gKiBGdW5jdGlvbiBbMCwxXS0+WzAsMV0gdG8gc3RyZXRjaCByYW5nZSBvZiB2YWx1ZXMuXG4gKiBQb2x5bm9taWFsXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHQgVGhlIHZhbHVlIHRvIHN0cmV0Y2gsIHdpdGhpbiBbMCwxXVxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDE6IG5vIHN0cmV0Y2hpbmcuIDwxOiBzaG93IGxvdyB2YWx1ZXMuID4xOiBzaG93IGhpZ2ggdmFsdWVzLlxuICogQHJldHVybnMge251bWJlcn0gVGhlIHN0cmV0Y2hlZCB2YWx1ZSwgd2l0aGluIFswLDFdXG4gKi9cbmV4cG9ydCBjb25zdCBzUG93ID0gKHQsIGFscGhhID0gMykgPT4gTWF0aC5wb3codCwgYWxwaGEpXG5cbi8qKlxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogUG9seW5vbWlhbCAocmV2ZXJzZSlcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdCBUaGUgdmFsdWUgdG8gc3RyZXRjaCwgd2l0aGluIFswLDFdXG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgMTogbm8gc3RyZXRjaGluZy4gPDE6IHNob3cgbG93IHZhbHVlcy4gPjE6IHNob3cgaGlnaCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RyZXRjaGVkIHZhbHVlLCB3aXRoaW4gWzAsMV1cbiAqL1xuZXhwb3J0IGNvbnN0IHNQb3dSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIDEgLyBhbHBoYSlcblxuLyoqXG4gKiBGdW5jdGlvbiBbMCwxXS0+WzAsMV0gdG8gc3RyZXRjaCByYW5nZSBvZiB2YWx1ZXMuXG4gKiBFeHBvbmVudGlhbFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAwOiBubyBzdHJldGNoaW5nLiAtSW5mOiBzaG93IGxvdyB2YWx1ZXMuIEluZjogc2hvdyBoaWdoIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxuICovXG5leHBvcnQgY29uc3Qgc0V4cCA9ICh0LCBhbHBoYSA9IDMpID0+IChhbHBoYSA9PSAwID8gdCA6IChNYXRoLmV4cCh0ICogYWxwaGEpIC0gMSkgLyAoTWF0aC5leHAoYWxwaGEpIC0gMSkpXG5cbi8qKlxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogRXhwb25lbnRpYWwgKHJldmVyc2UpXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHQgVGhlIHZhbHVlIHRvIHN0cmV0Y2gsIHdpdGhpbiBbMCwxXVxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDA6IG5vIHN0cmV0Y2hpbmcuIC1JbmY6IHNob3cgbG93IHZhbHVlcy4gSW5mOiBzaG93IGhpZ2ggdmFsdWVzLlxuICogQHJldHVybnMge251bWJlcn0gVGhlIHN0cmV0Y2hlZCB2YWx1ZSwgd2l0aGluIFswLDFdXG4gKi9cbmV4cG9ydCBjb25zdCBzRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT5cbiAgICBhbHBoYSA9PSAwID8gdCA6IDEgLSAoMSAvIGFscGhhKSAqIE1hdGgubG9nKE1hdGguZXhwKGFscGhhKSAqICgxIC0gdCkgKyB0KVxuXG4vKipcbiAqIEZ1bmN0aW9uIFswLDFdLT5bMCwxXSB0byBzdHJldGNoIHJhbmdlIG9mIHZhbHVlcy5cbiAqIENpcmNsZSwgc2hvdyBsb3cgdmFsdWVzXG4gKiBOQjogc0NpcmNsZUhpZ2ggYW5kIHNDaXJjbGVMb3cgYXJlIGludmVyc2UgZnVuY3Rpb25zIG9mIGVhY2ggb3RoZXIuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHQgVGhlIHZhbHVlIHRvIHN0cmV0Y2gsIHdpdGhpbiBbMCwxXVxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDA6IG5vIHN0cmV0Y2hpbmcuIDE6IHBlcmZlY3QgY2lyY2xlIHNlY3Rpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxuICovXG5leHBvcnQgY29uc3Qgc0NpcmNsZUxvdyA9ICh0LCBhbHBoYSA9IDAuOCkgPT4ge1xuICAgIGlmIChhbHBoYSA9PSAwKSByZXR1cm4gdFxuICAgIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KHQgKiAoMiAtIHQpKVxuICAgIGNvbnN0IGEgPSBhbHBoYSAvICgxIC0gYWxwaGEpXG4gICAgcmV0dXJuIE1hdGguc3FydCgxIC8gKGEgKiBhKSArIHQgKiAoMiAvIGEgKyAyIC0gdCkpIC0gMSAvIGFcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBbMCwxXS0+WzAsMV0gdG8gc3RyZXRjaCByYW5nZSBvZiB2YWx1ZXMuXG4gKiBDaXJjbGUsIHNob3cgaGlnaCB2YWx1ZXNcbiAqIE5COiBzQ2lyY2xlSGlnaCBhbmQgc0NpcmNsZUxvdyBhcmUgaW52ZXJzZSBmdW5jdGlvbnMgb2YgZWFjaCBvdGhlci5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdCBUaGUgdmFsdWUgdG8gc3RyZXRjaCwgd2l0aGluIFswLDFdXG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgMDogbm8gc3RyZXRjaGluZy4gMTogcGVyZmVjdCBjaXJjbGUgc2VjdGlvblxuICogQHJldHVybnMge251bWJlcn0gVGhlIHN0cmV0Y2hlZCB2YWx1ZSwgd2l0aGluIFswLDFdXG4gKi9cbmV4cG9ydCBjb25zdCBzQ2lyY2xlSGlnaCA9ICh0LCBhbHBoYSA9IDAuOCkgPT4gMSAtIHNDaXJjbGVMb3coMSAtIHQsIGFscGhhKVxuXG4vKipcbiAqIEludmVyc2UgZnVuY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBJbnZlcnNlIGZ1bmN0aW9uIG9mIHNFeHBcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGFcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBzRXhwSW52ZXJzZSA9ICh5LCBhbHBoYSA9IDMpID0+XG4gICAgYWxwaGEgPT0gMCA/IHkgOiAoMSAvIGFscGhhKSAqIE1hdGgubG9nKDEgLSB5ICsgeSAqIE1hdGguZXhwKGFscGhhKSlcblxuLyoqXG4gKiBJbnZlcnNlIGZ1bmN0aW9uIG9mIHNFeHBSZXZcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGFcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBzRXhwUmV2SW52ZXJzZSA9ICh5LCBhbHBoYSA9IDMpID0+IChNYXRoLmV4cCgtYWxwaGEgKiB5KSAtIDEpIC8gKE1hdGguZXhwKC1hbHBoYSkgLSAxKVxuXG4vKipcbiAqIEludmVyc2UgZnVuY3Rpb24gb2Ygc1Bvd1xuICogQHBhcmFtIHtudW1iZXJ9IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuXG5leHBvcnQgY29uc3Qgc1Bvd0ludmVyc2UgPSAoeSwgYWxwaGEgPSAzKSA9PiBNYXRoLnBvdyh5LCAxIC8gYWxwaGEpXG5cbi8qKlxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzUG93UmV2XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3Qgc1Bvd1JldkludmVyc2UgPSAoeSwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHksIGFscGhhKVxuXG4vL3Rlc3QgY29kZVxuLypcbmZvciAobGV0IGkgPSAwOyBpIDw9IDE7IGkgKz0gMC4wMDEpIHtcbiAgLy9jb25zdCB2ID0gZ3Zpei5zRXhwKGd2aXouc0V4cEludmVyc2UoaSkpO1xuICAvL2NvbnN0IHYgPSBndml6LnNFeHBJbnZlcnNlKGd2aXouc0V4cChpKSk7XG4gIC8vY29uc3QgdiA9IGd2aXouc0V4cFJldihndml6LnNFeHBSZXZJbnZlcnNlKGkpKTtcbiAgLy9jb25zdCB2ID0gZ3Zpei5zRXhwUmV2SW52ZXJzZShndml6LnNFeHBSZXYoaSkpO1xuICAvL2NvbnN0IHYgPSBndml6LnNQb3coZ3Zpei5zUG93SW52ZXJzZShpKSk7XG4gIC8vY29uc3QgdiA9IGd2aXouc1Bvd0ludmVyc2UoZ3Zpei5zUG93KGkpKTtcbiAgLy9jb25zdCB2ID0gZ3Zpei5zUG93UmV2KGd2aXouc1Bvd1JldkludmVyc2UoaSkpO1xuICAvL2NvbnN0IHYgPSBndml6LnNQb3dSZXZJbnZlcnNlKGd2aXouc1Bvd1JldihpKSk7XG4gIC8vY29uc3QgdiA9IGd2aXouc0NpcmNsZUxvdyhndml6LnNDaXJjbGVIaWdoKGkpKTtcbiAgLy9jb25zdCB2ID0gZ3Zpei5zQ2lyY2xlSGlnaChndml6LnNDaXJjbGVMb3coaSkpO1xuICBjb25zb2xlLmxvZyhpIC0gdilcbn1cbiovXG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdpZHRoXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVpZ2h0XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHJldHVybnMge3tjYW52YXM6SFRNTENhbnZhc0VsZW1lbnQsIGdsOldlYkdMUmVuZGVyaW5nQ29udGV4dH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cykge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3aWR0aClcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQpXG4gICAgY29uc3QgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBvcHRzKVxuICAgIGlmICghZ2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gaW5pdGlhbGl6ZSBXZWJHTC4gWW91ciBicm93c2VyIG9yIG1hY2hpbmUgbWF5IG5vdCBzdXBwb3J0IGl0LicpXG4gICAgfVxuICAgIHJldHVybiB7IGNhbnZhczogY2FudmFzLCBnbDogZ2wgfVxufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBzaGFkZXIgcHJvZ3JhbSwgc28gV2ViR0wga25vd3MgaG93IHRvIGRyYXcgb3VyIGRhdGFcbiAqXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcbiAqIEBwYXJhbSAgey4uLldlYkdMU2hhZGVyfSBzaGFkZXJzXG4gKiBAcmV0dXJucyB7V2ViR0xQcm9ncmFtfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNoYWRlclByb2dyYW0oZ2wsIC4uLnNoYWRlcnMpIHtcbiAgICAvKiogQHR5cGUge1dlYkdMUHJvZ3JhbXxudWxsfSAqL1xuICAgIGNvbnN0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKClcbiAgICBpZiAocHJvZ3JhbSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgcHJvZ3JhbScpXG4gICAgZm9yIChjb25zdCBzaGFkZXIgb2Ygc2hhZGVycykgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHNoYWRlcilcbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKVxuICAgIGlmIChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkgcmV0dXJuIHByb2dyYW1cbiAgICB0aHJvdyBuZXcgRXJyb3IoZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkgfHwgJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgcHJvZ3JhbSAoMiknKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaGFkZXIgb2YgdGhlIGdpdmVuIHR5cGUsIHVwbG9hZHMgdGhlIHNvdXJjZSBhbmQgY29tcGlsZXMgaXQuXG4gKlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBzb3VyY2VzXG4gKiBAcmV0dXJucyB7V2ViR0xTaGFkZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaGFkZXIoZ2wsIHR5cGUsIC4uLnNvdXJjZXMpIHtcbiAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfG51bGx9ICovXG4gICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHR5cGUpXG4gICAgaWYgKHNoYWRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyJylcbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2VzLmpvaW4oJ1xcbicpKVxuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKVxuICAgIGlmIChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHJldHVybiBzaGFkZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpIHx8ICdDYW5ub3QgY3JlYXRlIHdlYkdMIHNoYWRlciAoMiknKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHdlYkdMIGlzIHN1cHBvcnRlZFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tXZWJHTFN1cHBvcnQoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgcmV0dXJuICEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJlxuICAgICAgICAgICAgKGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKSlcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiBmYWxzZVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLy8gdGhlIGFwcGxpY2F0aW9uXG5leHBvcnQgeyBBcHAgfSBmcm9tICcuL0FwcC5qcydcbmV4cG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vR2VvQ2FudmFzLmpzJ1xuZXhwb3J0IHsgU3R5bGUgfSBmcm9tICcuL1N0eWxlLmpzJ1xuZXhwb3J0IHsgTGF5ZXIgfSBmcm9tICcuL0xheWVyLmpzJ1xuZXhwb3J0IHsgRGF0YXNldCB9IGZyb20gJy4vRGF0YXNldC5qcydcbmV4cG9ydCB7IERhdGFzZXRDb21wb25lbnQgfSBmcm9tICcuL0RhdGFzZXRDb21wb25lbnQuanMnXG5cbi8vIGV4cG9ydCBkYXRhc2V0IHR5cGVzXG5leHBvcnQgeyBUaWxlZEdyaWQgfSBmcm9tICcuL2RhdGFzZXQvVGlsZWRHcmlkLmpzJ1xuZXhwb3J0IHsgR3JpZFRpbGUgfSBmcm9tICcuL2RhdGFzZXQvR3JpZFRpbGUuanMnXG5leHBvcnQgeyBDU1ZHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L0NTVkdyaWQuanMnXG4vL2V4cG9ydCB7IEdlb1RJRkYgfSBmcm9tIFwiLi9kYXRhc2V0L0dlb1RJRkZcIlxuXG4vLyBleHBvcnQgc3R5bGVzXG5leHBvcnQgeyBTaGFwZUNvbG9yU2l6ZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzJ1xuZXhwb3J0IHsgU3Ryb2tlU3R5bGUgfSBmcm9tICcuL3N0eWxlL1N0cm9rZVN0eWxlLmpzJ1xuZXhwb3J0IHsgSm95UGxvdFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Kb3lQbG90U3R5bGUuanMnXG5leHBvcnQgeyBDb21wb3NpdGlvblN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Db21wb3NpdGlvblN0eWxlLmpzJ1xuZXhwb3J0IHsgU2VnbWVudFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TZWdtZW50U3R5bGUuanMnXG5leHBvcnQgeyBUZXh0U3R5bGUgfSBmcm9tICcuL3N0eWxlL1RleHRTdHlsZS5qcydcbmV4cG9ydCB7IFBpbGxhclN0eWxlIH0gZnJvbSAnLi9zdHlsZS9QaWxsYXJTdHlsZS5qcydcbmV4cG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2lkZVN0eWxlLmpzJ1xuZXhwb3J0IHsgQ29udG91clN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Db250b3VyU3R5bGUuanMnXG5leHBvcnQgeyBTaWRlQ2F0U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVDYXRTdHlsZS5qcydcbmV4cG9ydCB7IERvdERlbnNpdHlTdHlsZSB9IGZyb20gJy4vc3R5bGUvRG90RGVuc2l0eVN0eWxlLmpzJ1xuZXhwb3J0IHsgVGFuYWthU3R5bGUgfSBmcm9tICcuL3N0eWxlL1RhbmFrYVN0eWxlLmpzJ1xuZXhwb3J0IHsgTGVnb1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9MZWdvU3R5bGUuanMnXG5leHBvcnQgeyBTcXVhcmVDb2xvcldHTFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TcXVhcmVDb2xvcldHTFN0eWxlLmpzJ1xuZXhwb3J0IHsgU3F1YXJlQ29sb3JDYXRXR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JDYXRXR0xTdHlsZS5qcydcbmV4cG9ydCB7IE1vc2FpY1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9Nb3NhaWNTdHlsZS5qcydcbmV4cG9ydCB7IE5pbmphU3RhclN0eWxlIH0gZnJvbSAnLi9zdHlsZS9OaW5qYVN0YXJTdHlsZS5qcydcbmV4cG9ydCB7IFRpbWVTZXJpZXNTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGltZVNlcmllc1N0eWxlLmpzJ1xuXG4vLyBleHBvcnQgYWRkaXRpb25hbCBsYXllcnNcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllciB9IGZyb20gJy4vQmFja2dyb3VuZExheWVyLmpzJ1xuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyV01TIH0gZnJvbSAnLi9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMnXG5leHBvcnQgeyBMYWJlbExheWVyIH0gZnJvbSAnLi9MYWJlbExheWVyLmpzJ1xuZXhwb3J0IHsgTGluZUxheWVyIGFzIEJvdW5kYXJ5TGF5ZXIgfSBmcm9tICcuL0xpbmVMYXllci5qcydcblxuLy8gZXhwb3J0IGxlZ2VuZHNcbmV4cG9ydCB7IENvbG9yTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JMZWdlbmQuanMnXG5leHBvcnQgeyBDb2xvckRpc2NyZXRlTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcydcbmV4cG9ydCB7IENvbG9yQ2F0ZWdvcnlMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzJ1xuZXhwb3J0IHsgU2l6ZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1NpemVMZWdlbmQuanMnXG5leHBvcnQgeyBTZWdtZW50V2lkdGhMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9TZWdtZW50V2lkdGhMZWdlbmQuanMnXG5leHBvcnQgeyBTZWdtZW50T3JpZW50YXRpb25MZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9TZWdtZW50T3JpZW50YXRpb25MZWdlbmQuanMnXG5cbi8vIGV4cG9ydCB7IGdvVG9TdHJhaWdodCwgem9vbVRvIH0gZnJvbSBcIi4vdXRpbHMvem9vbVV0aWxzXCJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc3RyZXRjaGluZy5qcydcblxuZXhwb3J0IHsgZ2V0Q2xhc3MgfSBmcm9tICcuL3V0aWxzL1V0aWxzLmpzJ1xuXG5cblxuXG5pbXBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL0dlb0NhbnZhcy5qcydcbmltcG9ydCB7IGdlb0F6aW11dGhhbEVxdWFsQXJlYSB9IGZyb20gJ2QzLWdlbydcblxuLyoqXG4gKiBSZXR1cm5zIGxhYmVsIGxheWVyIGZyb20gRXVyb3N0YXQsIGZvciBFVFJTODktTEFFQSBncmlkcy5cbiAqIEZyb20gRXVyb255bSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vZXVyb3N0YXQvZXVyb255bVxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFdXJvbnltZUxhYmVsTGF5ZXIgPSBmdW5jdGlvbiAoY2MgPSAnRVVSJywgcmVzID0gNTAsIG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fVxuICAgIGNvbnN0IGV4ID0gb3B0cy5leCB8fCAxLjJcbiAgICBjb25zdCBmb250RmFtaWx5ID0gb3B0cy5mb250RmFtaWx5IHx8ICdBcmlhbCdcbiAgICBjb25zdCBleFNpemUgPSBvcHRzLmV4U2l6ZSB8fCAxXG4gICAgb3B0cy5zdHlsZSA9XG4gICAgICAgIG9wdHMuc3R5bGUgfHxcbiAgICAgICAgKChsYiwgemYpID0+IHtcbiAgICAgICAgICAgIGlmIChsYi5ycyA8IGV4ICogemYpIHJldHVyblxuICAgICAgICAgICAgaWYgKGxiLnIxIDwgZXggKiB6ZikgcmV0dXJuIGV4U2l6ZSArICdlbSAnICsgZm9udEZhbWlseVxuICAgICAgICAgICAgcmV0dXJuIGV4U2l6ZSAqIDEuNSArICdlbSAnICsgZm9udEZhbWlseVxuICAgICAgICB9KVxuICAgIC8vRVRSUzg5LUxBRUEgcHJvamVjdGlvblxuICAgIG9wdHMucHJvaiA9XG4gICAgICAgIG9wdHMucHJvaiB8fFxuICAgICAgICBnZW9BemltdXRoYWxFcXVhbEFyZWEoKVxuICAgICAgICAgICAgLnJvdGF0ZShbLTEwLCAtNTJdKVxuICAgICAgICAgICAgLnJlZmxlY3RYKGZhbHNlKVxuICAgICAgICAgICAgLnJlZmxlY3RZKHRydWUpXG4gICAgICAgICAgICAuc2NhbGUoNjM3ODEzNylcbiAgICAgICAgICAgIC50cmFuc2xhdGUoWzQzMjEwMDAsIDMyMTAwMDBdKVxuICAgIG9wdHMucHJlcHJvY2VzcyA9IChsYikgPT4ge1xuICAgICAgICAvL2V4Y2x1ZGUgY291bnRyaWVzXG4gICAgICAgIC8vaWYob3B0cy5jY091dCAmJiBsYi5jYyAmJiBvcHRzLmNjT3V0LmluY2x1ZGVzKGxiLmNjKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAob3B0cy5jY0luICYmIGxiLmNjICYmICEob3B0cy5jY0luLmluZGV4T2YobGIuY2MpID49IDApKSByZXR1cm4gZmFsc2VcblxuICAgICAgICAvL3Byb2plY3QgZnJvbSBnZW8gY29vcmRpbmF0ZXMgdG8gRVRSUzg5LUxBRUFcbiAgICAgICAgY29uc3QgcCA9IG9wdHMucHJvaihbbGIubG9uLCBsYi5sYXRdKVxuICAgICAgICBsYi54ID0gcFswXVxuICAgICAgICBsYi55ID0gcFsxXVxuICAgICAgICBkZWxldGUgbGIubG9uXG4gICAgICAgIGRlbGV0ZSBsYi5sYXRcbiAgICB9XG4gICAgb3B0cy5iYXNlVVJMID0gb3B0cy5iYXNlVVJMIHx8ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZXVyb3N0YXQvZXVyb255bS9tYWluL3B1Yi92Mi9VVEYvJ1xuICAgIG9wdHMudXJsID0gb3B0cy5iYXNlVVJMICsgcmVzICsgJy8nICsgY2MgKyAnLmNzdidcbiAgICByZXR1cm4gb3B0c1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFdXJvc3RhdEJvdW5kYXJpZXNMYXllciA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICBjb25zdCBudXRzWWVhciA9IG9wdHMubnV0c1llYXIgfHwgJzIwMjEnXG4gICAgY29uc3QgY3JzID0gb3B0cy5jcnMgfHwgJzMwMzUnXG4gICAgY29uc3Qgc2NhbGUgPSBvcHRzLnNjYWxlIHx8ICcwM00nXG4gICAgY29uc3QgbnV0c0xldmVsID0gb3B0cy5udXRzTGV2ZWwgfHwgJzMnXG4gICAgY29uc3QgY29sID0gb3B0cy5jb2wgfHwgJyM4ODgnXG4gICAgY29uc3QgY29sS29zb3ZvID0gb3B0cy5jb2xLb3Nvdm8gfHwgJyNiY2JjYmMnXG4gICAgY29uc3Qgc2hvd090aCA9IG9wdHMuc2hvd090aCA9PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0cy5zaG93T3RoXG5cbiAgICBvcHRzLmNvbG9yID1cbiAgICAgICAgb3B0cy5jb2xvciB8fFxuICAgICAgICAoKGYsIHpmKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwID0gZi5wcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAoIXNob3dPdGggLyomJiBwLmNvID09IFwiRlwiKi8gJiYgcC5ldSAhPSAnVCcgJiYgcC5jYyAhPSAnVCcgJiYgcC5lZnRhICE9ICdUJyAmJiBwLm90aCA9PT0gJ1QnKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgaWYgKHAuaWQgPj0gMTAwMDAwKSByZXR1cm4gY29sS29zb3ZvXG4gICAgICAgICAgICBpZiAocC5jbyA9PT0gJ1QnKSByZXR1cm4gY29sXG4gICAgICAgICAgICBpZiAoemYgPCA0MDApIHJldHVybiBjb2xcbiAgICAgICAgICAgIGVsc2UgaWYgKHpmIDwgMTAwMCkgcmV0dXJuIHAubHZsID49IDMgPyAnJyA6IGNvbFxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAyMDAwKSByZXR1cm4gcC5sdmwgPj0gMiA/ICcnIDogY29sXG4gICAgICAgICAgICBlbHNlIHJldHVybiBwLmx2bCA+PSAxID8gJycgOiBjb2xcbiAgICAgICAgfSlcblxuICAgIG9wdHMud2lkdGggPVxuICAgICAgICBvcHRzLndpZHRoIHx8XG4gICAgICAgICgoZiwgemYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBmLnByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmIChwLmNvID09PSAnVCcpIHJldHVybiAwLjVcbiAgICAgICAgICAgIGlmICh6ZiA8IDQwMCkgcmV0dXJuIHAubHZsID09IDMgPyAyLjIgOiBwLmx2bCA9PSAyID8gMi4yIDogcC5sdmwgPT0gMSA/IDIuMiA6IDRcbiAgICAgICAgICAgIGVsc2UgaWYgKHpmIDwgMTAwMCkgcmV0dXJuIHAubHZsID09IDIgPyAxLjggOiBwLmx2bCA9PSAxID8gMS44IDogMi41XG4gICAgICAgICAgICBlbHNlIGlmICh6ZiA8IDIwMDApIHJldHVybiBwLmx2bCA9PSAxID8gMS44IDogMi41XG4gICAgICAgICAgICBlbHNlIHJldHVybiAxLjJcbiAgICAgICAgfSlcblxuICAgIG9wdHMubGluZURhc2ggPVxuICAgICAgICBvcHRzLmxpbmVEYXNoIHx8XG4gICAgICAgICgoZiwgemYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBmLnByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmIChwLmNvID09PSAnVCcpIHJldHVybiBbXVxuICAgICAgICAgICAgaWYgKHpmIDwgNDAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwLmx2bCA9PSAzXG4gICAgICAgICAgICAgICAgICAgID8gWzIgKiB6ZiwgMiAqIHpmXVxuICAgICAgICAgICAgICAgICAgICA6IHAubHZsID09IDJcbiAgICAgICAgICAgICAgICAgICAgPyBbNSAqIHpmLCAyICogemZdXG4gICAgICAgICAgICAgICAgICAgIDogcC5sdmwgPT0gMVxuICAgICAgICAgICAgICAgICAgICA/IFs1ICogemYsIDIgKiB6Zl1cbiAgICAgICAgICAgICAgICAgICAgOiBbMTAgKiB6ZiwgMyAqIHpmXVxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAxMDAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwLmx2bCA9PSAyID8gWzUgKiB6ZiwgMiAqIHpmXSA6IHAubHZsID09IDEgPyBbNSAqIHpmLCAyICogemZdIDogWzEwICogemYsIDMgKiB6Zl1cbiAgICAgICAgICAgIGVsc2UgaWYgKHpmIDwgMjAwMCkgcmV0dXJuIHAubHZsID09IDEgPyBbNSAqIHpmLCAyICogemZdIDogWzEwICogemYsIDMgKiB6Zl1cbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIFsxMCAqIHpmLCAzICogemZdXG4gICAgICAgIH0pXG5cbiAgICBvcHRzLmJhc2VVUkwgPSBvcHRzLmJhc2VVUkwgfHwgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ldXJvc3RhdC9OdXRzMmpzb24vbWFzdGVyL3B1Yi92Mi8nXG4gICAgb3B0cy51cmwgPSBvcHRzLmJhc2VVUkwgKyBudXRzWWVhciArICcvJyArIGNycyArICcvJyArIHNjYWxlICsgJy9udXRzYm5fJyArIG51dHNMZXZlbCArICcuanNvbidcbiAgICByZXR1cm4gb3B0c1xufVxuXG5leHBvcnQgY29uc3QgZ2V0UGFyYW1ldGVyQnlOYW1lID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZVxuXG4vLyBzZXQgZGVmYXVsdCBkMyBsb2NhbGVcbmltcG9ydCB7IGZvcm1hdERlZmF1bHRMb2NhbGUgfSBmcm9tICdkMy1mb3JtYXQnXG5mb3JtYXREZWZhdWx0TG9jYWxlKHtcbiAgICBkZWNpbWFsOiAnLicsXG4gICAgdGhvdXNhbmRzOiAnICcsXG4gICAgZ3JvdXBpbmc6IFszXSxcbiAgICBjdXJyZW5jeTogWycnLCAn4oKsJ10sXG59KVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|